@fieldia/map 0.14.1 → 0.16.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 (108) hide show
  1. package/README.md +103 -10
  2. package/package.json +5 -4
  3. package/src/index.d.mts +5 -1
  4. package/src/index.d.ts +5 -1
  5. package/src/index.js +7 -1
  6. package/src/index.js.map +1 -1
  7. package/src/index.mjs +3 -0
  8. package/src/index.mjs.map +1 -1
  9. package/src/lib/answers.d.mts +17 -0
  10. package/src/lib/answers.d.ts +17 -0
  11. package/src/lib/answers.js +27 -0
  12. package/src/lib/answers.js.map +1 -0
  13. package/src/lib/answers.mjs +21 -0
  14. package/src/lib/answers.mjs.map +1 -0
  15. package/src/lib/area.js +29 -246
  16. package/src/lib/area.js.map +1 -1
  17. package/src/lib/area.mjs +29 -246
  18. package/src/lib/area.mjs.map +1 -1
  19. package/src/lib/card.d.mts +53 -0
  20. package/src/lib/card.d.ts +53 -0
  21. package/src/lib/card.js +98 -0
  22. package/src/lib/card.js.map +1 -0
  23. package/src/lib/card.mjs +94 -0
  24. package/src/lib/card.mjs.map +1 -0
  25. package/src/lib/cluster.d.mts +12 -0
  26. package/src/lib/cluster.d.ts +12 -0
  27. package/src/lib/cluster.js +60 -0
  28. package/src/lib/cluster.js.map +1 -0
  29. package/src/lib/cluster.mjs +57 -0
  30. package/src/lib/cluster.mjs.map +1 -0
  31. package/src/lib/drawing.d.mts +36 -0
  32. package/src/lib/drawing.d.ts +36 -0
  33. package/src/lib/drawing.js +267 -0
  34. package/src/lib/drawing.js.map +1 -0
  35. package/src/lib/drawing.mjs +263 -0
  36. package/src/lib/drawing.mjs.map +1 -0
  37. package/src/lib/form-map.d.mts +16 -0
  38. package/src/lib/form-map.d.ts +16 -0
  39. package/src/lib/form-map.js +525 -0
  40. package/src/lib/form-map.js.map +1 -0
  41. package/src/lib/form-map.mjs +522 -0
  42. package/src/lib/form-map.mjs.map +1 -0
  43. package/src/lib/kinds.js +9 -2
  44. package/src/lib/kinds.js.map +1 -1
  45. package/src/lib/kinds.mjs +9 -2
  46. package/src/lib/kinds.mjs.map +1 -1
  47. package/src/lib/labels.d.mts +41 -0
  48. package/src/lib/labels.d.ts +41 -0
  49. package/src/lib/labels.js +87 -1
  50. package/src/lib/labels.js.map +1 -1
  51. package/src/lib/labels.mjs +84 -0
  52. package/src/lib/labels.mjs.map +1 -1
  53. package/src/lib/list-view.d.mts +13 -0
  54. package/src/lib/list-view.d.ts +13 -0
  55. package/src/lib/list-view.js +464 -0
  56. package/src/lib/list-view.js.map +1 -0
  57. package/src/lib/list-view.mjs +461 -0
  58. package/src/lib/list-view.mjs.map +1 -0
  59. package/src/lib/map-core.d.mts +2 -2
  60. package/src/lib/map-core.d.ts +2 -2
  61. package/src/lib/map-core.js +23 -3
  62. package/src/lib/map-core.js.map +1 -1
  63. package/src/lib/map-core.mjs +23 -3
  64. package/src/lib/map-core.mjs.map +1 -1
  65. package/src/lib/map-icons.d.mts +8 -0
  66. package/src/lib/map-icons.d.ts +8 -0
  67. package/src/lib/map-icons.js +21 -0
  68. package/src/lib/map-icons.js.map +1 -0
  69. package/src/lib/map-icons.mjs +18 -0
  70. package/src/lib/map-icons.mjs.map +1 -0
  71. package/src/lib/marks.d.mts +34 -0
  72. package/src/lib/marks.d.ts +34 -0
  73. package/src/lib/marks.js +56 -0
  74. package/src/lib/marks.js.map +1 -0
  75. package/src/lib/marks.mjs +49 -0
  76. package/src/lib/marks.mjs.map +1 -0
  77. package/src/lib/pins.d.mts +58 -0
  78. package/src/lib/pins.d.ts +58 -0
  79. package/src/lib/pins.js +165 -0
  80. package/src/lib/pins.js.map +1 -0
  81. package/src/lib/pins.mjs +156 -0
  82. package/src/lib/pins.mjs.map +1 -0
  83. package/src/lib/providers.d.mts +27 -3
  84. package/src/lib/providers.d.ts +27 -3
  85. package/src/lib/providers.js +69 -67
  86. package/src/lib/providers.js.map +1 -1
  87. package/src/lib/providers.mjs +17 -15
  88. package/src/lib/providers.mjs.map +1 -1
  89. package/src/lib/route-line.d.mts +34 -0
  90. package/src/lib/route-line.d.ts +34 -0
  91. package/src/lib/route-line.js +53 -0
  92. package/src/lib/route-line.js.map +1 -0
  93. package/src/lib/route-line.mjs +47 -0
  94. package/src/lib/route-line.mjs.map +1 -0
  95. package/src/lib/routes.d.mts +28 -0
  96. package/src/lib/routes.d.ts +28 -0
  97. package/src/lib/routes.js +112 -0
  98. package/src/lib/routes.js.map +1 -0
  99. package/src/lib/routes.mjs +105 -0
  100. package/src/lib/routes.mjs.map +1 -0
  101. package/src/lib/settings.d.mts +8 -3
  102. package/src/lib/settings.d.ts +8 -3
  103. package/src/lib/styles.d.mts +16 -0
  104. package/src/lib/styles.d.ts +16 -0
  105. package/src/lib/styles.js +181 -1
  106. package/src/lib/styles.js.map +1 -1
  107. package/src/lib/styles.mjs +178 -0
  108. package/src/lib/styles.mjs.map +1 -1
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.comma = void 0;
4
+ exports.makePins = makePins;
5
+ exports.withCurrency = withCurrency;
6
+ exports.shown = shown;
7
+ exports.pinText = pinText;
8
+ exports.imageSource = imageSource;
9
+ const core_1 = require("@fieldia/core");
10
+ const widgets_1 = require("@fieldia/widgets");
11
+ const map_icons_1 = require("./map-icons");
12
+ /** The icons drawn as seen from above, facing north: they turn whole with a record's heading. */
13
+ const FROM_ABOVE = new Set(['car', 'arrow']);
14
+ 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>`;
15
+ function makePins(options) {
16
+ const { document: doc, page, locale, pin } = options;
17
+ const icons = { ...map_icons_1.MAP_ICONS, ...options.icons };
18
+ const look = pin.widget ? 'own' : (pin.look ?? (pin.label ? 'label' : pin.image ? 'photo' : pin.icon || pin.iconField ? 'icon' : 'pin'));
19
+ const drawer = pin.widget ? options.drawers?.[pin.widget] : undefined;
20
+ const tones = (pin.tones ?? []).map(({ tone, when }) => ({ tone, when: (0, core_1.compileModifier)(when) }));
21
+ const fields = [
22
+ ...new Set([options.title, pin.label, pin.iconField, pin.image, pin.turn, ...tones.flatMap((t) => t.when.fields)]
23
+ .filter((name) => !!name && name in page.fields)
24
+ .flatMap((name) => withCurrency(page, name))),
25
+ ];
26
+ const toneOf = (values) => {
27
+ if (!tones.length)
28
+ return undefined;
29
+ const context = (0, core_1.expressionContext)(values, page.fields);
30
+ return tones.find((t) => t.when.evaluate(context))?.tone;
31
+ };
32
+ const icon = (values) => {
33
+ const named = pin.iconField ? values[pin.iconField] : undefined;
34
+ const name = typeof named === 'string' && named ? named : pin.icon;
35
+ return (0, widgets_1.drawIcon)(doc, name, icons) ?? (0, widgets_1.drawIcon)(doc, pin.icon ?? 'pin', icons);
36
+ };
37
+ const span = (className, ...children) => {
38
+ const element = doc.createElement('span');
39
+ element.className = className;
40
+ element.append(...children);
41
+ return element;
42
+ };
43
+ function face(record) {
44
+ const { values } = record;
45
+ const element = doc.createElement('div');
46
+ element.className = 'fd-map-face';
47
+ element.dataset['look'] = look;
48
+ const tone = toneOf(values);
49
+ if (tone)
50
+ element.dataset['tone'] = tone;
51
+ const said = pin.label ? pinText(page, pin.label, values, locale) : '';
52
+ if (look === 'own') {
53
+ if (drawer)
54
+ element.append(drawer(record, { document: doc, locale, page }));
55
+ element.dataset['stands'] = 'middle';
56
+ return { element, stands: 'middle', height: 32 };
57
+ }
58
+ if (look === 'label' && said) {
59
+ element.append(span('fd-map-face-text', said));
60
+ element.dataset['stands'] = 'foot';
61
+ return { element, stands: 'foot', height: 34 };
62
+ }
63
+ if (look === 'pin') {
64
+ element.innerHTML = PIN;
65
+ const inside = pin.icon || pin.iconField ? icon(values) : null;
66
+ element.append(span('fd-map-face-icon', ...(inside ? [inside] : [])));
67
+ element.dataset['stands'] = 'foot';
68
+ return { element, stands: 'foot', height: 40 };
69
+ }
70
+ if (look === 'icon') {
71
+ const drawn = icon(values);
72
+ const glyph = span('fd-map-face-icon', ...(drawn ? [drawn] : []));
73
+ element.append(glyph);
74
+ const turn = pin.turn ? values[pin.turn] : null;
75
+ if (typeof turn === 'number' && Number.isFinite(turn)) {
76
+ // A car seen from above turns itself; a scooter seen from its side stays upright, a pointer on its edge showing the way.
77
+ if (FROM_ABOVE.has(drawn?.dataset['icon'] ?? ''))
78
+ glyph.style.transform = `rotate(${turn}deg)`;
79
+ else {
80
+ const pointer = span('fd-map-face-turn');
81
+ pointer.style.transform = `rotate(${turn}deg)`;
82
+ element.append(pointer);
83
+ }
84
+ }
85
+ element.dataset['stands'] = 'middle';
86
+ return { element, stands: 'middle', height: 34 };
87
+ }
88
+ if (look === 'photo') {
89
+ const source = pin.image ? imageSource(values[pin.image]) : '';
90
+ if (source) {
91
+ const img = doc.createElement('img');
92
+ img.className = 'fd-map-face-photo';
93
+ img.alt = '';
94
+ img.decoding = 'async';
95
+ img.src = source;
96
+ element.append(img);
97
+ }
98
+ else
99
+ element.append(span('fd-map-face-photo', ...[(0, widgets_1.drawIcon)(doc, 'user', icons)].filter((n) => !!n)));
100
+ if (said)
101
+ element.append(span('fd-map-face-text', said));
102
+ element.dataset['stands'] = 'middle';
103
+ return { element, stands: 'middle', height: 42 };
104
+ }
105
+ // A dot; and a label with nothing to say.
106
+ element.dataset['look'] = 'dot';
107
+ element.dataset['stands'] = 'middle';
108
+ return { element, stands: 'middle', height: 16 };
109
+ }
110
+ function name(record) {
111
+ const title = shown(page, options.title, record.values, locale);
112
+ const said = pin.label && pin.label !== options.title ? shown(page, pin.label, record.values, locale) : '';
113
+ return [title, said].filter(Boolean).join((0, exports.comma)(locale)) || String(record.id);
114
+ }
115
+ return { face, name, fields };
116
+ }
117
+ /** The comma between a name's parts, in the page's language. */
118
+ const comma = (locale) => (locale === 'ar' ? '، ' : ', ');
119
+ exports.comma = comma;
120
+ /** A field, and the field its amount's currency is in. */
121
+ function withCurrency(page, name) {
122
+ const def = page.fields[name];
123
+ return def?.type === 'monetary' && def.currencyField && !def.currencyField.startsWith('parent.') ? [name, def.currencyField] : [name];
124
+ }
125
+ /** A value as a person reads it in full: a card's line, a pin's name. */
126
+ function shown(page, name, values, locale) {
127
+ const def = page.fields[name];
128
+ const value = values[name];
129
+ if (value === null || value === undefined || value === '')
130
+ return '';
131
+ return def ? (0, widgets_1.displayValue)(def, value, values, locale) : String(value);
132
+ }
133
+ /**
134
+ * What a pin says, short enough for a pin: an amount or a number in the
135
+ * page's language, compact ("E£9.5M", "12K", "4.6"); anything else as a
136
+ * card would show it.
137
+ */
138
+ function pinText(page, name, values, locale) {
139
+ const def = page.fields[name];
140
+ const value = values[name];
141
+ if (def && typeof value === 'number' && Number.isFinite(value) && (def.type === 'monetary' || def.type === 'integer' || def.type === 'float')) {
142
+ const currency = (0, widgets_1.currencyOf)(def, values);
143
+ const plain = { notation: 'compact', numberingSystem: 'latn', maximumFractionDigits: 1 };
144
+ try {
145
+ if (currency)
146
+ return new Intl.NumberFormat(locale, { ...plain, style: 'currency', currency, currencyDisplay: 'narrowSymbol' }).format(value);
147
+ }
148
+ catch {
149
+ // A currency named by words that are no code: written before the amount, as it is.
150
+ return `${currency} ${new Intl.NumberFormat(locale, plain).format(value)}`;
151
+ }
152
+ return new Intl.NumberFormat(locale, plain).format(value);
153
+ }
154
+ return shown(page, name, values, locale);
155
+ }
156
+ /** An image field's picture as an address: its first file's data, or where it is kept. */
157
+ function imageSource(value) {
158
+ const file = (Array.isArray(value) ? value[0] : value);
159
+ if (!file)
160
+ return '';
161
+ if (typeof file === 'string')
162
+ return file;
163
+ return file.data ? `data:${file.type};base64,${file.data}` : (file.url ?? '');
164
+ }
165
+ //# sourceMappingURL=pins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pins.js","sourceRoot":"","sources":["../../../../../libs/map/src/lib/pins.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,156 @@
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(comma(locale)) || String(record.id);
106
+ }
107
+ return { face, name, fields };
108
+ }
109
+ /** The comma between a name's parts, in the page's language. */
110
+ export const comma = (locale) => (locale === 'ar' ? '، ' : ', ');
111
+ /** A field, and the field its amount's currency is in. */
112
+ export function withCurrency(page, name) {
113
+ const def = page.fields[name];
114
+ return def?.type === 'monetary' && def.currencyField && !def.currencyField.startsWith('parent.') ? [name, def.currencyField] : [name];
115
+ }
116
+ /** A value as a person reads it in full: a card's line, a pin's name. */
117
+ export function shown(page, name, values, locale) {
118
+ const def = page.fields[name];
119
+ const value = values[name];
120
+ if (value === null || value === undefined || value === '')
121
+ return '';
122
+ return def ? displayValue(def, value, values, locale) : String(value);
123
+ }
124
+ /**
125
+ * What a pin says, short enough for a pin: an amount or a number in the
126
+ * page's language, compact ("E£9.5M", "12K", "4.6"); anything else as a
127
+ * card would show it.
128
+ */
129
+ export function pinText(page, name, values, locale) {
130
+ const def = page.fields[name];
131
+ const value = values[name];
132
+ if (def && typeof value === 'number' && Number.isFinite(value) && (def.type === 'monetary' || def.type === 'integer' || def.type === 'float')) {
133
+ const currency = currencyOf(def, values);
134
+ const plain = { notation: 'compact', numberingSystem: 'latn', maximumFractionDigits: 1 };
135
+ try {
136
+ if (currency)
137
+ return new Intl.NumberFormat(locale, { ...plain, style: 'currency', currency, currencyDisplay: 'narrowSymbol' }).format(value);
138
+ }
139
+ catch {
140
+ // A currency named by words that are no code: written before the amount, as it is.
141
+ return `${currency} ${new Intl.NumberFormat(locale, plain).format(value)}`;
142
+ }
143
+ return new Intl.NumberFormat(locale, plain).format(value);
144
+ }
145
+ return shown(page, name, values, locale);
146
+ }
147
+ /** An image field's picture as an address: its first file's data, or where it is kept. */
148
+ export function imageSource(value) {
149
+ const file = (Array.isArray(value) ? value[0] : value);
150
+ if (!file)
151
+ return '';
152
+ if (typeof file === 'string')
153
+ return file;
154
+ return file.data ? `data:${file.type};base64,${file.data}` : (file.url ?? '');
155
+ }
156
+ //# 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,7 +1,8 @@
1
1
  import type { Locale } from '@fieldia/core';
2
+ import { type Fetch } from './answers.mjs';
2
3
  import type { Bounds, LatLng } from './geo.mjs';
3
4
  /**
4
- * Where a map's images, credits and address search come from. Every map in
5
+ * Where a map's images, credits, address search and routes come from. Every map in
5
6
  * the package draws through one of these, so an app changes provider in one
6
7
  * place and nothing else moves. Keys never live in Fieldia: the app passes
7
8
  * them, or a function that fetches a short-lived token from its own server.
@@ -53,6 +54,21 @@ export type ReverseSearch = (at: LatLng & {
53
54
  locale: Locale;
54
55
  signal?: AbortSignal;
55
56
  }) => Promise<string | null>;
57
+ export type TravelMode = 'car' | 'bike' | 'foot';
58
+ export interface RouteRequest {
59
+ /** Where it starts, the places it passes in order, and where it ends. */
60
+ points: LatLng[];
61
+ mode: TravelMode;
62
+ locale: Locale;
63
+ signal?: AbortSignal;
64
+ }
65
+ /** A route along the roads: its line, how long it is, and how long it takes. */
66
+ export interface RouteFound {
67
+ line: LatLng[];
68
+ metres: number;
69
+ seconds: number;
70
+ }
71
+ export type RouteFinder = (request: RouteRequest) => Promise<RouteFound>;
56
72
  export interface MapProvider {
57
73
  readonly id: string;
58
74
  /** The map images of a kind, or null when the provider has none of it. */
@@ -71,8 +87,9 @@ export interface MapProvider {
71
87
  readonly searchAsYouType?: boolean;
72
88
  /** Free for trying things out, not for an app in use: a warning says so once. */
73
89
  readonly demoOnly?: boolean;
90
+ /** A route along the roads, for a map's routes. */
91
+ readonly route?: RouteFinder;
74
92
  }
75
- type Fetch = typeof globalThis.fetch;
76
93
  export interface OpenStreetMapOptions {
77
94
  /**
78
95
  * Whose search: Photon (komoot's, on OpenStreetMap's data), which answers as
@@ -82,6 +99,12 @@ export interface OpenStreetMapOptions {
82
99
  search?: 'photon' | 'nominatim';
83
100
  /** Photon's address, for a copy of it the app runs: `https://photon.komoot.io` unless said. */
84
101
  photonUrl?: string;
102
+ /**
103
+ * OSRM's address, for routes: its public demo server unless said, which
104
+ * routes by car alone and is for trying things out. A copy the app runs
105
+ * routes by the profiles it was built with (`driving`, `cycling`, `walking`).
106
+ */
107
+ osrmUrl?: string;
85
108
  fetch?: Fetch;
86
109
  }
87
110
  /**
@@ -146,7 +169,8 @@ export interface TilesOptions {
146
169
  search?: AddressSearch;
147
170
  reverse?: ReverseSearch;
148
171
  searchAsYouType?: boolean;
172
+ /** The app's own routes. */
173
+ route?: RouteFinder;
149
174
  }
150
175
  /** Map images from any address, such as the app's own server, with their credit. */
151
176
  export declare function tiles(options: TilesOptions): MapProvider;
152
- export {};
@@ -1,7 +1,8 @@
1
1
  import type { Locale } from '@fieldia/core';
2
+ import { type Fetch } from './answers';
2
3
  import type { Bounds, LatLng } from './geo';
3
4
  /**
4
- * Where a map's images, credits and address search come from. Every map in
5
+ * Where a map's images, credits, address search and routes come from. Every map in
5
6
  * the package draws through one of these, so an app changes provider in one
6
7
  * place and nothing else moves. Keys never live in Fieldia: the app passes
7
8
  * them, or a function that fetches a short-lived token from its own server.
@@ -53,6 +54,21 @@ export type ReverseSearch = (at: LatLng & {
53
54
  locale: Locale;
54
55
  signal?: AbortSignal;
55
56
  }) => Promise<string | null>;
57
+ export type TravelMode = 'car' | 'bike' | 'foot';
58
+ export interface RouteRequest {
59
+ /** Where it starts, the places it passes in order, and where it ends. */
60
+ points: LatLng[];
61
+ mode: TravelMode;
62
+ locale: Locale;
63
+ signal?: AbortSignal;
64
+ }
65
+ /** A route along the roads: its line, how long it is, and how long it takes. */
66
+ export interface RouteFound {
67
+ line: LatLng[];
68
+ metres: number;
69
+ seconds: number;
70
+ }
71
+ export type RouteFinder = (request: RouteRequest) => Promise<RouteFound>;
56
72
  export interface MapProvider {
57
73
  readonly id: string;
58
74
  /** The map images of a kind, or null when the provider has none of it. */
@@ -71,8 +87,9 @@ export interface MapProvider {
71
87
  readonly searchAsYouType?: boolean;
72
88
  /** Free for trying things out, not for an app in use: a warning says so once. */
73
89
  readonly demoOnly?: boolean;
90
+ /** A route along the roads, for a map's routes. */
91
+ readonly route?: RouteFinder;
74
92
  }
75
- type Fetch = typeof globalThis.fetch;
76
93
  export interface OpenStreetMapOptions {
77
94
  /**
78
95
  * Whose search: Photon (komoot's, on OpenStreetMap's data), which answers as
@@ -82,6 +99,12 @@ export interface OpenStreetMapOptions {
82
99
  search?: 'photon' | 'nominatim';
83
100
  /** Photon's address, for a copy of it the app runs: `https://photon.komoot.io` unless said. */
84
101
  photonUrl?: string;
102
+ /**
103
+ * OSRM's address, for routes: its public demo server unless said, which
104
+ * routes by car alone and is for trying things out. A copy the app runs
105
+ * routes by the profiles it was built with (`driving`, `cycling`, `walking`).
106
+ */
107
+ osrmUrl?: string;
85
108
  fetch?: Fetch;
86
109
  }
87
110
  /**
@@ -146,7 +169,8 @@ export interface TilesOptions {
146
169
  search?: AddressSearch;
147
170
  reverse?: ReverseSearch;
148
171
  searchAsYouType?: boolean;
172
+ /** The app's own routes. */
173
+ route?: RouteFinder;
149
174
  }
150
175
  /** Map images from any address, such as the app's own server, with their credit. */
151
176
  export declare function tiles(options: TilesOptions): MapProvider;
152
- export {};