@konce-pt/angular 0.7.0 → 0.7.5
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.
- package/CHANGELOG.md +317 -1
- package/fesm2022/konce-pt-angular-map.mjs +4568 -0
- package/fesm2022/konce-pt-angular-map.mjs.map +1 -0
- package/fesm2022/konce-pt-angular.mjs +515 -77
- package/fesm2022/konce-pt-angular.mjs.map +1 -1
- package/map/src/lib/llms.txt +741 -0
- package/package.json +17 -4
- package/src/lib/app-shell/llms.txt +70 -10
- package/src/lib/breakpoint/llms.txt +45 -0
- package/src/lib/datepicker/llms.txt +3 -0
- package/src/lib/dialog/llms.txt +62 -21
- package/src/lib/form-field/llms.txt +19 -1
- package/src/lib/icon/llms.txt +2 -1
- package/src/lib/input/llms.txt +1 -1
- package/src/lib/select/llms.txt +9 -0
- package/src/lib/sidenav/llms.txt +29 -20
- package/src/lib/toolbar/llms.txt +31 -23
- package/types/konce-pt-angular-map.d.ts +1585 -0
- package/types/konce-pt-angular-map.d.ts.map +1 -0
- package/types/konce-pt-angular.d.ts +304 -20
- package/types/konce-pt-angular.d.ts.map +1 -1
|
@@ -0,0 +1,1585 @@
|
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
|
+
import { TemplateRef, InjectionToken, Provider, WritableSignal } from '@angular/core';
|
|
3
|
+
import { KptI18n, KptOption } from '@konce-pt/angular';
|
|
4
|
+
import { Observable } from 'rxjs';
|
|
5
|
+
import * as _angular_forms_signals from '@angular/forms/signals';
|
|
6
|
+
import { FormValueControl } from '@angular/forms/signals';
|
|
7
|
+
|
|
8
|
+
/** Punkt geograficzny w stopniach (WGS 84). */
|
|
9
|
+
interface KptLatLng {
|
|
10
|
+
lat: number;
|
|
11
|
+
lng: number;
|
|
12
|
+
}
|
|
13
|
+
/** Prostokąt geograficzny. `south < north`; `west`/`east` w stopniach. */
|
|
14
|
+
interface KptMapBounds {
|
|
15
|
+
south: number;
|
|
16
|
+
west: number;
|
|
17
|
+
north: number;
|
|
18
|
+
east: number;
|
|
19
|
+
}
|
|
20
|
+
/** Punkt w pikselach — kontenera mapy albo świata, zależnie od kontekstu. */
|
|
21
|
+
interface KptMapPoint {
|
|
22
|
+
x: number;
|
|
23
|
+
y: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Kolor znacznika: rola z warstwy semantycznej tokenów albo gotowe `var(--kpt-*)`.
|
|
27
|
+
* Literały (`#c00`, `rgb(...)`) są celowo niedozwolone — kontrakt repo wymaga tokenów.
|
|
28
|
+
*/
|
|
29
|
+
type KptMapColorRole = 'primary' | 'success' | 'warning' | 'danger' | 'info' | 'muted';
|
|
30
|
+
type KptMapColor = KptMapColorRole | `var(--kpt-${string})`;
|
|
31
|
+
/** Kształt znacznika. */
|
|
32
|
+
type KptMapMarkerShape = 'pin' | 'dot' | 'square';
|
|
33
|
+
/** Typ pola w schemie formularza „dodaj lokalizację". */
|
|
34
|
+
type KptMapFieldType = 'text' | 'textarea' | 'number' | 'date' | 'select' | 'multiselect' | 'checkbox' | 'tel' | 'email' | 'url'
|
|
35
|
+
/** Zdjęcie: wybór pliku (wartość jako `data:`) albo wklejony adres. */
|
|
36
|
+
| 'image'
|
|
37
|
+
/** Tygodniowy rozkład godzin otwarcia; wartość to `KptMapOpeningHours`. */
|
|
38
|
+
| 'hours';
|
|
39
|
+
/** Opcja listy wyboru w polu `select` / `multiselect`. */
|
|
40
|
+
interface KptMapFieldOption {
|
|
41
|
+
value: unknown;
|
|
42
|
+
label: string;
|
|
43
|
+
}
|
|
44
|
+
/** Definicja jednego pola formularza dodawania lokalizacji. */
|
|
45
|
+
interface KptMapFieldDef {
|
|
46
|
+
/** Klucz w obiekcie wartości formularza. */
|
|
47
|
+
key: string;
|
|
48
|
+
type: KptMapFieldType;
|
|
49
|
+
label: string;
|
|
50
|
+
required?: boolean;
|
|
51
|
+
placeholder?: string;
|
|
52
|
+
/** Tekst pomocniczy pod polem. */
|
|
53
|
+
hint?: string;
|
|
54
|
+
/** Wymagane dla `select` i `multiselect`. */
|
|
55
|
+
options?: KptMapFieldOption[];
|
|
56
|
+
/** Dolna granica dla `number`; dla `date` data w formacie ISO. */
|
|
57
|
+
min?: number | string;
|
|
58
|
+
/** Górna granica dla `number`; dla `date` data w formacie ISO. */
|
|
59
|
+
max?: number | string;
|
|
60
|
+
/** Wartość początkowa; bez niej pole startuje puste (`''`, `null`, `[]`, `false`). */
|
|
61
|
+
initial?: unknown;
|
|
62
|
+
/**
|
|
63
|
+
* Część adresu, którą wypełnić z geokodowania wstecznego współrzędnych kliknięcia.
|
|
64
|
+
* Działa tylko dla pól tekstowych i tylko gdy aplikacja poda port `KPT_MAP_GEOCODER`.
|
|
65
|
+
* Nigdy nie nadpisuje tego, co użytkownik już wpisał.
|
|
66
|
+
*/
|
|
67
|
+
autofill?: KptMapAddressPart;
|
|
68
|
+
}
|
|
69
|
+
/** Rozbiór adresu zwracany przez geokoder. Wszystko opcjonalne — źródła bywają dziurawe. */
|
|
70
|
+
interface KptMapAddress {
|
|
71
|
+
/** Nazwa ulicy bez numeru. */
|
|
72
|
+
street?: string;
|
|
73
|
+
houseNumber?: string;
|
|
74
|
+
/** Ulica z numerem, gotowa do jednego pola „Adres". */
|
|
75
|
+
address?: string;
|
|
76
|
+
city?: string;
|
|
77
|
+
postcode?: string;
|
|
78
|
+
/** Województwo / region. */
|
|
79
|
+
state?: string;
|
|
80
|
+
/** Powiat / hrabstwo. */
|
|
81
|
+
county?: string;
|
|
82
|
+
country?: string;
|
|
83
|
+
/** Kod ISO 3166-1 alpha-2, wielkimi literami. */
|
|
84
|
+
countryCode?: string;
|
|
85
|
+
/** Pełny adres jednym ciągiem, tak jak podał go geokoder. */
|
|
86
|
+
label?: string;
|
|
87
|
+
}
|
|
88
|
+
/** Pole `KptMapAddress`, którym można wypełnić kontrolkę formularza. */
|
|
89
|
+
type KptMapAddressPart = keyof KptMapAddress;
|
|
90
|
+
/**
|
|
91
|
+
* Podpowiedź z listy wyszukiwarki adresów (geokodowanie wprost: tekst → miejsce).
|
|
92
|
+
*
|
|
93
|
+
* Pochodzi z portu `KPT_MAP_GEOCODER`, więc kształt jest wspólny dla dowolnego
|
|
94
|
+
* dostawcy — Nominatim, instancji własnej i komercyjnej.
|
|
95
|
+
*/
|
|
96
|
+
interface KptMapSuggestion {
|
|
97
|
+
/** Stabilny w obrębie jednej odpowiedzi — służy za klucz `track` listy podpowiedzi. */
|
|
98
|
+
id: string;
|
|
99
|
+
/** Pełna nazwa jednym ciągiem; to widzi użytkownik na liście. */
|
|
100
|
+
label: string;
|
|
101
|
+
/**
|
|
102
|
+
* Współrzędne, **gdy dostawca podaje je już na liście** — tak robi każdy geokoder
|
|
103
|
+
* pytany wprost (Nominatim, Photon, Google Geocoding API).
|
|
104
|
+
*
|
|
105
|
+
* Brak wartości znaczy, że podpowiedź trzeba jeszcze uzupełnić metodą `resolve()`
|
|
106
|
+
* portu. Tak działa Google Places Autocomplete: zwraca `placeId` i tekst, a `lat`/`lng`
|
|
107
|
+
* dociąga się osobnym Place Details — jedno wywołanie na *wybór* użytkownika, a nie
|
|
108
|
+
* na każdy naciśnięty klawisz. Na tym stoi jego rozliczanie sesyjne, więc to nie jest
|
|
109
|
+
* dziwactwo jednego dostawcy, tylko wzorzec, który port musi umieć wyrazić.
|
|
110
|
+
*/
|
|
111
|
+
at?: KptLatLng;
|
|
112
|
+
/**
|
|
113
|
+
* Zasięg obiektu, gdy dostawca go podaje. Miasto trafia wtedy w kadr w całości,
|
|
114
|
+
* zamiast dostać punktowy zoom w środek rynku.
|
|
115
|
+
*/
|
|
116
|
+
bounds?: KptMapBounds;
|
|
117
|
+
/** Rozbiór adresu, gdy dostawca go podaje — ten sam typ, co przy geokodowaniu wstecznym. */
|
|
118
|
+
address?: KptMapAddress;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Wybrane miejsce — podpowiedź z **pewnymi** współrzędnymi.
|
|
122
|
+
*
|
|
123
|
+
* To ten typ wychodzi z `selected` pola wyszukiwania i z `searchSelect` mapy: zanim
|
|
124
|
+
* zdarzenie poleci, brakujące `at` zostaje dociągnięte przez `resolve()`. Aplikacja
|
|
125
|
+
* nigdy nie musi sprawdzać, czy współrzędne są.
|
|
126
|
+
*/
|
|
127
|
+
interface KptMapSearchResult extends KptMapSuggestion {
|
|
128
|
+
at: KptLatLng;
|
|
129
|
+
}
|
|
130
|
+
/** Kategoria obiektu — kolor, ikona i schema formularza. */
|
|
131
|
+
interface KptMapCategory {
|
|
132
|
+
id: string;
|
|
133
|
+
/** Etykieta w legendzie i domyślnym popupie. */
|
|
134
|
+
label: string;
|
|
135
|
+
color: KptMapColor;
|
|
136
|
+
/** Nazwa ikony z `KptIconRegistry`; bez niej znacznik nie ma glifu. */
|
|
137
|
+
icon?: string;
|
|
138
|
+
/** Domyślnie `'pin'`. */
|
|
139
|
+
shape?: KptMapMarkerShape;
|
|
140
|
+
/** Schema formularza „dodaj lokalizację" dla tej kategorii. */
|
|
141
|
+
fields?: KptMapFieldDef[];
|
|
142
|
+
/** Pokazać w legendzie. Domyślnie `true`. */
|
|
143
|
+
legend?: boolean;
|
|
144
|
+
}
|
|
145
|
+
/** Pojedyncza lokalizacja na mapie. */
|
|
146
|
+
interface KptMapLocation<T = unknown> {
|
|
147
|
+
id: string;
|
|
148
|
+
at: KptLatLng;
|
|
149
|
+
categoryId: string;
|
|
150
|
+
/** Tytuł w popupie oraz `aria-label` znacznika — bez niego znacznik jest niedostępny. */
|
|
151
|
+
title: string;
|
|
152
|
+
/** Dowolne dane aplikacji; trafiają do szablonu popupu jako `data`. */
|
|
153
|
+
data?: T;
|
|
154
|
+
}
|
|
155
|
+
/** Grupa lokalizacji zwinięta w jeden znacznik z licznikiem. */
|
|
156
|
+
interface KptMapCluster<T = unknown> {
|
|
157
|
+
/** Stabilny w obrębie zoomu: `c:{zoom}:{cellX}:{cellY}`. */
|
|
158
|
+
id: string;
|
|
159
|
+
/** Środek ciężkości grupy. */
|
|
160
|
+
at: KptLatLng;
|
|
161
|
+
count: number;
|
|
162
|
+
/** Najliczniejsza kategoria w grupie — źródło koloru przy `clusterColorBy: 'dominant'`. */
|
|
163
|
+
dominantCategoryId: string;
|
|
164
|
+
items: KptMapLocation<T>[];
|
|
165
|
+
/** Zasięg grupy — do `fitBounds` po kliknięciu. */
|
|
166
|
+
bounds: KptMapBounds;
|
|
167
|
+
}
|
|
168
|
+
/** Element wyniku grupowania: albo grupa, albo pojedyncza lokalizacja. */
|
|
169
|
+
type KptMapClusterEntry<T = unknown> = KptMapCluster<T> | KptMapLocation<T>;
|
|
170
|
+
/** Zawęża wynik `clusterLocations` do grupy. */
|
|
171
|
+
declare function isCluster<T>(entry: KptMapClusterEntry<T>): entry is KptMapCluster<T>;
|
|
172
|
+
/** Pozycja użytkownika z geolokalizacji. */
|
|
173
|
+
interface KptMapUserPosition {
|
|
174
|
+
at: KptLatLng;
|
|
175
|
+
/** Promień niepewności w metrach (`GeolocationCoordinates.accuracy`). */
|
|
176
|
+
accuracy: number;
|
|
177
|
+
/** Znacznik czasu odczytu. */
|
|
178
|
+
timestamp: number;
|
|
179
|
+
}
|
|
180
|
+
/** Powód niepowodzenia geolokalizacji. */
|
|
181
|
+
type KptMapGeolocationErrorKind = 'denied' | 'unavailable' | 'timeout' | 'unsupported';
|
|
182
|
+
interface KptMapGeolocationError {
|
|
183
|
+
kind: KptMapGeolocationErrorKind;
|
|
184
|
+
message: string;
|
|
185
|
+
}
|
|
186
|
+
/** Zdarzenie utworzenia lokalizacji przez formularz. */
|
|
187
|
+
interface KptMapCreateEvent {
|
|
188
|
+
at: KptLatLng;
|
|
189
|
+
categoryId: string;
|
|
190
|
+
/** Wartości pól wg schemy kategorii (albo z własnego szablonu formularza). */
|
|
191
|
+
value: Record<string, unknown>;
|
|
192
|
+
}
|
|
193
|
+
/** Widok mapy — środek i zoom. */
|
|
194
|
+
interface KptMapView {
|
|
195
|
+
center: KptLatLng;
|
|
196
|
+
zoom: number;
|
|
197
|
+
}
|
|
198
|
+
/** Dzień tygodnia wg ISO-8601: 1 = poniedziałek … 7 = niedziela. */
|
|
199
|
+
type KptMapWeekday = 1 | 2 | 3 | 4 | 5 | 6 | 7;
|
|
200
|
+
/**
|
|
201
|
+
* Przedział otwarcia w dobie, `HH:MM` w czasie lokalnym miejsca.
|
|
202
|
+
*
|
|
203
|
+
* `to` mniejsze albo równe `from` znaczy „przez północ" — przedział kończy się
|
|
204
|
+
* następnego dnia. `24:00` to prawidłowy koniec doby i nie jest przejściem przez północ.
|
|
205
|
+
*/
|
|
206
|
+
interface KptMapHoursRange {
|
|
207
|
+
from: string;
|
|
208
|
+
to: string;
|
|
209
|
+
}
|
|
210
|
+
/** Godziny jednego dnia tygodnia. */
|
|
211
|
+
interface KptMapDayHours {
|
|
212
|
+
day: KptMapWeekday;
|
|
213
|
+
/** Zamknięte przez całą dobę — `ranges` jest wtedy ignorowane. */
|
|
214
|
+
closed?: boolean;
|
|
215
|
+
ranges: KptMapHoursRange[];
|
|
216
|
+
}
|
|
217
|
+
/** Tygodniowy rozkład godzin. Brakujący dzień znaczy „zamknięte". */
|
|
218
|
+
type KptMapOpeningHours = KptMapDayHours[];
|
|
219
|
+
/** Wiersz „ikona + etykieta + wartość" w karcie miejsca. */
|
|
220
|
+
interface KptMapPoiFact {
|
|
221
|
+
/** Nazwa ikony z `KptIconRegistry`; bez niej wiersz jest bez glifu. */
|
|
222
|
+
icon?: string;
|
|
223
|
+
label: string;
|
|
224
|
+
value: string;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Dane karty miejsca (`kpt-map-poi-card`). Aplikacja mapuje na to swój
|
|
228
|
+
* `KptMapLocation.data` — biblioteka nie narzuca kształtu danych domenowych.
|
|
229
|
+
*/
|
|
230
|
+
interface KptMapPoi {
|
|
231
|
+
title: string;
|
|
232
|
+
/** Drugi wiersz nagłówka, obok dystansu. */
|
|
233
|
+
address?: string;
|
|
234
|
+
/** Adres zdjęcia albo `data:`; karta nie rozróżnia. Puste = zastępnik z ikoną. */
|
|
235
|
+
photo?: string;
|
|
236
|
+
photoAlt?: string;
|
|
237
|
+
hours?: KptMapOpeningHours;
|
|
238
|
+
phone?: string;
|
|
239
|
+
email?: string;
|
|
240
|
+
website?: string;
|
|
241
|
+
/** Wiersz współrzędnych; bez tego się nie renderuje. */
|
|
242
|
+
at?: KptLatLng;
|
|
243
|
+
/** Dodatkowe wiersze informacyjne, bez akcji. */
|
|
244
|
+
facts?: KptMapPoiFact[];
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
interface KptClusterOptions {
|
|
248
|
+
/** Aktualny zoom mapy — decyduje o gęstości siatki. */
|
|
249
|
+
zoom: number;
|
|
250
|
+
/** Bok komórki siatki w pikselach ekranu. Domyślnie 60. */
|
|
251
|
+
gridSize?: number;
|
|
252
|
+
/** Powyżej tego zoomu grupowanie jest wyłączone. Domyślnie 16. */
|
|
253
|
+
maxZoom?: number;
|
|
254
|
+
/** Ile punktów musi trafić do komórki, żeby powstała grupa. Domyślnie 2. */
|
|
255
|
+
minPoints?: number;
|
|
256
|
+
/**
|
|
257
|
+
* Kolejność kategorii — rozstrzyga remis przy wyborze kategorii dominującej.
|
|
258
|
+
* Bez niej remis rozstrzyga kolejność wystąpienia w danych.
|
|
259
|
+
*/
|
|
260
|
+
categoryOrder?: readonly string[];
|
|
261
|
+
}
|
|
262
|
+
declare const KPT_CLUSTER_DEFAULTS: {
|
|
263
|
+
readonly gridSize: 60;
|
|
264
|
+
readonly maxZoom: 16;
|
|
265
|
+
readonly minPoints: 2;
|
|
266
|
+
};
|
|
267
|
+
/**
|
|
268
|
+
* Zwija bliskie sobie lokalizacje w grupy. Zwraca listę mieszaną: grupy i pojedyncze punkty.
|
|
269
|
+
*
|
|
270
|
+
* Środek grupy uśredniamy w przestrzeni pikseli, nie w stopniach. Mercator rozciąga
|
|
271
|
+
* stopnie tym mocniej, im dalej od równika, więc średnia w stopniach wypada obok
|
|
272
|
+
* wizualnego środka kropek na ekranie — a to jego ma pilnować znacznik grupy.
|
|
273
|
+
*/
|
|
274
|
+
declare function clusterLocations<T>(locations: readonly KptMapLocation<T>[], options: KptClusterOptions): KptMapClusterEntry<T>[];
|
|
275
|
+
/**
|
|
276
|
+
* Najliczniejsza kategoria w grupie. Remis rozstrzyga `categoryOrder`, a bez niej
|
|
277
|
+
* kolejność pierwszego wystąpienia — w obu wypadkach wynik jest deterministyczny.
|
|
278
|
+
*/
|
|
279
|
+
declare function dominantCategory<T>(items: readonly KptMapLocation<T>[], categoryOrder?: readonly string[]): string;
|
|
280
|
+
/** Zlicza lokalizacje w rozbiciu na kategorie — licznik obok pozycji legendy. */
|
|
281
|
+
declare function countByCategory<T>(locations: readonly KptMapLocation<T>[]): Record<string, number>;
|
|
282
|
+
/**
|
|
283
|
+
* Czy grupa da się rozbić przybliżeniem. Punkty o tej samej współrzędnej zostaną razem
|
|
284
|
+
* na każdym zoomie — wtedy kliknięcie ma otworzyć listę zamiast zoomować w nieskończoność.
|
|
285
|
+
*/
|
|
286
|
+
declare function isSplittable<T>(cluster: KptMapCluster<T>): boolean;
|
|
287
|
+
|
|
288
|
+
/** Rodzaj silnika — trafia do `data-engine` na hoście, przydatne w testach i stylach. */
|
|
289
|
+
type KptMapEngineKind = 'leaflet' | 'google';
|
|
290
|
+
interface KptMapEngineInit {
|
|
291
|
+
center: KptLatLng;
|
|
292
|
+
zoom: number;
|
|
293
|
+
minZoom?: number;
|
|
294
|
+
maxZoom?: number;
|
|
295
|
+
/** Blokada panningu poza prostokąt. */
|
|
296
|
+
maxBounds?: KptMapBounds | null;
|
|
297
|
+
/** Szablon URL kafli, np. `https://tile.openstreetmap.org/{z}/{x}/{y}.png`. */
|
|
298
|
+
tileUrl: string;
|
|
299
|
+
/** Tekst atrybucji — wymagany licencyjnie przy OSM. */
|
|
300
|
+
attribution: string;
|
|
301
|
+
/** Silnik nie rysuje własnych kontrolek zoomu — robi to warstwa Angulara. */
|
|
302
|
+
interactive?: boolean;
|
|
303
|
+
}
|
|
304
|
+
/** Znacznik gotowy do narysowania — HTML pochodzi z `marker-html.ts`. */
|
|
305
|
+
interface KptMapRenderedMarker {
|
|
306
|
+
/** Stabilne id: `id` lokalizacji albo `id` grupy. */
|
|
307
|
+
id: string;
|
|
308
|
+
at: KptLatLng;
|
|
309
|
+
html: string;
|
|
310
|
+
/** Rozmiar ikony w pikselach — silnik potrzebuje go do zakotwiczenia. */
|
|
311
|
+
size: {
|
|
312
|
+
width: number;
|
|
313
|
+
height: number;
|
|
314
|
+
};
|
|
315
|
+
/** Punkt zakotwiczenia względem lewego górnego rogu ikony. */
|
|
316
|
+
anchor: KptMapPoint;
|
|
317
|
+
/** Kolejność rysowania — grupy nad pojedynczymi punktami. */
|
|
318
|
+
zIndex?: number;
|
|
319
|
+
}
|
|
320
|
+
interface KptMapPointerEvent {
|
|
321
|
+
at: KptLatLng;
|
|
322
|
+
/** Piksele względem kontenera mapy. */
|
|
323
|
+
point: KptMapPoint;
|
|
324
|
+
/** Zdarzenie źródłowe, gdy trzeba zatrzymać propagację. */
|
|
325
|
+
originalEvent?: Event;
|
|
326
|
+
}
|
|
327
|
+
interface KptMapEngineEvents {
|
|
328
|
+
/** Pan i zoom w toku — używane do przeliczania pozycji popupu. */
|
|
329
|
+
move: () => void;
|
|
330
|
+
/** Koniec ruchu — dopiero tu warto emitować `viewChange`. */
|
|
331
|
+
moveend: () => void;
|
|
332
|
+
zoomend: () => void;
|
|
333
|
+
click: (event: KptMapPointerEvent) => void;
|
|
334
|
+
contextmenu: (event: KptMapPointerEvent) => void;
|
|
335
|
+
/** Kliknięcie w znacznik; `id` jak w `KptMapRenderedMarker`. */
|
|
336
|
+
markerclick: (id: string, event: KptMapPointerEvent) => void;
|
|
337
|
+
}
|
|
338
|
+
interface KptMapEngine {
|
|
339
|
+
readonly kind: KptMapEngineKind;
|
|
340
|
+
/** Tworzy mapę w kontenerze. Wywoływane po pierwszym renderze, nigdy na SSR. */
|
|
341
|
+
init(host: HTMLElement, opts: KptMapEngineInit): Promise<void>;
|
|
342
|
+
destroy(): void;
|
|
343
|
+
setView(center: KptLatLng, zoom: number, animate?: boolean): void;
|
|
344
|
+
fitBounds(bounds: KptMapBounds, paddingPx?: number): void;
|
|
345
|
+
panBy(offset: KptMapPoint): void;
|
|
346
|
+
getCenter(): KptLatLng;
|
|
347
|
+
getZoom(): number;
|
|
348
|
+
getBounds(): KptMapBounds;
|
|
349
|
+
getSize(): {
|
|
350
|
+
width: number;
|
|
351
|
+
height: number;
|
|
352
|
+
};
|
|
353
|
+
/** Współrzędne → piksele WZGLĘDEM kontenera (pozycjonowanie popupu). */
|
|
354
|
+
project(at: KptLatLng): KptMapPoint;
|
|
355
|
+
unproject(point: KptMapPoint): KptLatLng;
|
|
356
|
+
/** Pełna wymiana zestawu znaczników; diff po `id` robi implementacja. */
|
|
357
|
+
setMarkers(markers: readonly KptMapRenderedMarker[]): void;
|
|
358
|
+
/** `null` chowa znacznik użytkownika i krąg dokładności. */
|
|
359
|
+
setUserPosition(position: KptMapUserPosition | null, html: string): void;
|
|
360
|
+
setTileSource(tileUrl: string, attribution: string): void;
|
|
361
|
+
setMaxBounds(bounds: KptMapBounds | null): void;
|
|
362
|
+
/** Kontener zmienił rozmiar — bez tego Leaflet zostawia szare pola. */
|
|
363
|
+
invalidateSize(): void;
|
|
364
|
+
on<K extends keyof KptMapEngineEvents>(event: K, handler: KptMapEngineEvents[K]): void;
|
|
365
|
+
}
|
|
366
|
+
/** Fabryka silnika — to ją dostarcza DI, żeby każda mapa miała własną instancję. */
|
|
367
|
+
type KptMapEngineFactory = () => KptMapEngine;
|
|
368
|
+
/** Domyślne źródło kafli. Do produkcji podstaw własny serwer — patrz llms.txt. */
|
|
369
|
+
declare const KPT_MAP_DEFAULT_TILE_URL = "https://tile.openstreetmap.org/{z}/{x}/{y}.png";
|
|
370
|
+
declare const KPT_MAP_DEFAULT_ATTRIBUTION = "© <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors";
|
|
371
|
+
|
|
372
|
+
/** Kontekst szablonu popupu — `$implicit` to lokalizacja. */
|
|
373
|
+
interface KptMapPopupContext<T = unknown> {
|
|
374
|
+
$implicit: KptMapLocation<T>;
|
|
375
|
+
/** Skrót do `location.data`, żeby nie pisać `loc.data.x` w każdym wierszu. */
|
|
376
|
+
data: T | undefined;
|
|
377
|
+
category: KptMapCategory | undefined;
|
|
378
|
+
/**
|
|
379
|
+
* Odległość punktu w metrach od `[distanceFrom]`, a bez niego od pozycji użytkownika.
|
|
380
|
+
* `null`, gdy nie ma punktu odniesienia — geolokalizacja jest wyłączona albo odmówiona.
|
|
381
|
+
*/
|
|
382
|
+
distance: number | null;
|
|
383
|
+
close: () => void;
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Szablon popupu szczegółów. Bez atrybutu `category` służy za wariant zapasowy
|
|
387
|
+
* dla kategorii, które własnego szablonu nie mają.
|
|
388
|
+
*
|
|
389
|
+
* Typ `data` domyślnie jest luźny (jak `let-row` w tabeli CDK), bo Angular nie potrafi
|
|
390
|
+
* przenieść generyka z `kpt-map` na dyrektywę osadzoną w jego treści. Kto chce pełnego
|
|
391
|
+
* wnioskowania, wiąże `[kptMapPopupTypeFor]` z tą samą tablicą, którą karmi mapę —
|
|
392
|
+
* wtedy `data` dostaje konkretny typ.
|
|
393
|
+
*
|
|
394
|
+
* @example
|
|
395
|
+
* <ng-template kptMapPopup category="closure" let-loc let-data="data" let-dist="distance">
|
|
396
|
+
* <strong>{{ loc.title }}</strong>
|
|
397
|
+
* <p>{{ data.address }}</p>
|
|
398
|
+
* </ng-template>
|
|
399
|
+
*
|
|
400
|
+
* @example
|
|
401
|
+
* // z wnioskowaniem typu
|
|
402
|
+
* <ng-template kptMapPopup [kptMapPopupTypeFor]="locations()" let-data="data">
|
|
403
|
+
* <p>{{ data.address }}</p>
|
|
404
|
+
* </ng-template>
|
|
405
|
+
*/
|
|
406
|
+
declare class KptMapPopupTemplate<T = any> {
|
|
407
|
+
/** Kategoria, do której szablon się stosuje; pusta wartość = szablon zapasowy. */
|
|
408
|
+
readonly category: _angular_core.InputSignal<string>;
|
|
409
|
+
/**
|
|
410
|
+
* Nośnik typu — w runtime nieużywany. Jedyne zadanie: pozwolić Angularowi wywnioskować
|
|
411
|
+
* `T` z tablicy lokalizacji, tak jak `ngFor` wnioskuje typ elementu z bindowanej kolekcji.
|
|
412
|
+
*/
|
|
413
|
+
readonly typeFor: _angular_core.InputSignal<readonly KptMapLocation<T>[] | undefined>;
|
|
414
|
+
readonly templateRef: TemplateRef<KptMapPopupContext<T>>;
|
|
415
|
+
/** Zawęża typ kontekstu w szablonie (`strictTemplates`). */
|
|
416
|
+
static ngTemplateContextGuard<T>(_dir: KptMapPopupTemplate<T>, _ctx: unknown): _ctx is KptMapPopupContext<T>;
|
|
417
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<KptMapPopupTemplate<any>, never>;
|
|
418
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KptMapPopupTemplate<any>, "ng-template[kptMapPopup]", never, { "category": { "alias": "category"; "required": false; "isSignal": true; }; "typeFor": { "alias": "kptMapPopupTypeFor"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
419
|
+
}
|
|
420
|
+
/** Kontekst szablonu formularza dodawania lokalizacji. */
|
|
421
|
+
interface KptMapCreateFormContext {
|
|
422
|
+
$implicit: KptMapCreateFormApi;
|
|
423
|
+
at: KptLatLng;
|
|
424
|
+
category: KptMapCategory | undefined;
|
|
425
|
+
}
|
|
426
|
+
interface KptMapCreateFormApi {
|
|
427
|
+
at: KptLatLng;
|
|
428
|
+
category: KptMapCategory | undefined;
|
|
429
|
+
/** Zamyka dialog bez zapisu. */
|
|
430
|
+
close: () => void;
|
|
431
|
+
/** Zamyka dialog i emituje `locationCreate` z podanymi wartościami. */
|
|
432
|
+
submit: (value: Record<string, unknown>) => void;
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Własny formularz „dodaj lokalizację". Jego obecność wyłącza formularz budowany
|
|
436
|
+
* ze schemy kategorii.
|
|
437
|
+
*
|
|
438
|
+
* @example
|
|
439
|
+
* <ng-template kptMapCreateForm let-api>
|
|
440
|
+
* <button (click)="api.submit({ title: 'Nowy punkt' })">Zapisz</button>
|
|
441
|
+
* </ng-template>
|
|
442
|
+
*/
|
|
443
|
+
declare class KptMapCreateFormTemplate {
|
|
444
|
+
readonly templateRef: TemplateRef<KptMapCreateFormContext>;
|
|
445
|
+
static ngTemplateContextGuard(_dir: KptMapCreateFormTemplate, _ctx: unknown): _ctx is KptMapCreateFormContext;
|
|
446
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<KptMapCreateFormTemplate, never>;
|
|
447
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KptMapCreateFormTemplate, "ng-template[kptMapCreateForm]", never, {}, {}, never, never, true, never>;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/**
|
|
451
|
+
* Geokodowanie wsteczne: współrzędne → adres. Port, a nie sztywne wywołanie usługi —
|
|
452
|
+
* biblioteka nie może po cichu odpytywać cudzego serwera, a aplikacje mają własnych dostawców.
|
|
453
|
+
*
|
|
454
|
+
* Nie jest rejestrowany domyślnie. Bez niego formularz „dodaj lokalizację" po prostu
|
|
455
|
+
* nie podpowiada adresu.
|
|
456
|
+
*/
|
|
457
|
+
interface KptMapSearchOptions {
|
|
458
|
+
/** Język odpowiedzi. Domyślnie to, co ustawi dostawca. */
|
|
459
|
+
language?: string;
|
|
460
|
+
signal?: AbortSignal;
|
|
461
|
+
/** Ile wyników najwyżej. Domyślnie 5 — to lista podpowiedzi, nie wyszukiwarka pełnotekstowa. */
|
|
462
|
+
limit?: number;
|
|
463
|
+
/**
|
|
464
|
+
* Preferuj wyniki z tego prostokąta. **Nie odcina** reszty świata — adres z zagranicy
|
|
465
|
+
* dalej da się znaleźć, tylko wypada niżej na liście.
|
|
466
|
+
*/
|
|
467
|
+
viewbox?: KptMapBounds;
|
|
468
|
+
/** Twarde zawężenie do krajów (ISO 3166-1 alpha-2). Wyniki spoza nich nie wrócą wcale. */
|
|
469
|
+
countryCodes?: readonly string[];
|
|
470
|
+
}
|
|
471
|
+
interface KptMapGeocoderPort {
|
|
472
|
+
/** `null` = nie udało się ustalić adresu. Strumień powinien dać jedną wartość i zakończyć się. */
|
|
473
|
+
reverse(at: KptLatLng, options?: {
|
|
474
|
+
language?: string;
|
|
475
|
+
signal?: AbortSignal;
|
|
476
|
+
}): Observable<KptMapAddress | null>;
|
|
477
|
+
/**
|
|
478
|
+
* Geokodowanie wprost: tekst → miejsca. Metoda jest **opcjonalna**, żeby porty napisane
|
|
479
|
+
* przed jej powstaniem dalej się kompilowały — bez niej `kpt-map` po prostu nie pokazuje
|
|
480
|
+
* wyszukiwarki. Strumień powinien dać jedną wartość i zakończyć się.
|
|
481
|
+
*
|
|
482
|
+
* Zwracać `KptMapSearchResult[]` (ze współrzędnymi) wolno i jest to najprostsza droga —
|
|
483
|
+
* `KptMapSuggestion` jest tylko szerszy o brak `at`. Jeśli Twój dostawca współrzędnych
|
|
484
|
+
* na liście nie podaje, **musisz** dopisać `resolve()`.
|
|
485
|
+
*/
|
|
486
|
+
search?(query: string, options?: KptMapSearchOptions): Observable<readonly KptMapSuggestion[]>;
|
|
487
|
+
/**
|
|
488
|
+
* Uzupełnia podpowiedź o współrzędne. Wołane **raz, po wybraniu pozycji z listy** —
|
|
489
|
+
* nigdy w trakcie pisania.
|
|
490
|
+
*
|
|
491
|
+
* Wymagane wyłącznie od dostawców, których `search()` nie zwraca `at` (Google Places:
|
|
492
|
+
* Autocomplete daje `placeId`, Place Details dokłada `lat`/`lng`). Kto zwraca współrzędne
|
|
493
|
+
* od razu, tej metody nie potrzebuje — pole wyszukiwania nawet jej nie zawoła.
|
|
494
|
+
*
|
|
495
|
+
* `null` = nie udało się ustalić miejsca. Strumień powinien dać jedną wartość i zakończyć się.
|
|
496
|
+
*/
|
|
497
|
+
resolve?(suggestion: KptMapSuggestion, options?: {
|
|
498
|
+
language?: string;
|
|
499
|
+
signal?: AbortSignal;
|
|
500
|
+
}): Observable<KptMapSearchResult | null>;
|
|
501
|
+
}
|
|
502
|
+
declare const KPT_MAP_GEOCODER: InjectionToken<KptMapGeocoderPort>;
|
|
503
|
+
interface KptNominatimOptions {
|
|
504
|
+
/**
|
|
505
|
+
* Adres instancji Nominatim. Domyślnie publiczna instancja OSM — patrz ostrzeżenie
|
|
506
|
+
* przy `provideKptNominatimGeocoder`.
|
|
507
|
+
*/
|
|
508
|
+
baseUrl?: string;
|
|
509
|
+
/** Język odpowiedzi (`Accept-Language`). Domyślnie język przeglądarki. */
|
|
510
|
+
language?: string;
|
|
511
|
+
/**
|
|
512
|
+
* Szczegółowość: 18 to poziom budynku, 16 ulicy, 10 miasta.
|
|
513
|
+
* Domyślnie 18 — potrzebujemy numeru domu.
|
|
514
|
+
*/
|
|
515
|
+
zoom?: number;
|
|
516
|
+
/**
|
|
517
|
+
* Najmniejszy odstęp między zapytaniami w milisekundach.
|
|
518
|
+
*
|
|
519
|
+
* Sekunda nie jest cechą Nominatima, tylko wymogiem regulaminu **publicznej instancji
|
|
520
|
+
* OSM** — dlatego domyślna zależy od `baseUrl`: bez niego 1000 ms, z własnym adresem 0.
|
|
521
|
+
* Na swoim serwerze nie ma czego respektować, a przy podpowiadaniu w trakcie pisania
|
|
522
|
+
* sekundowa zwłoka jest różnicą między „działa" a „zacina się".
|
|
523
|
+
*
|
|
524
|
+
* `0` zdejmuje też kolejkowanie — zapytania lecą równolegle. Podstawiając cudzą,
|
|
525
|
+
* współdzieloną instancję ustaw wartość jawnie.
|
|
526
|
+
*/
|
|
527
|
+
minIntervalMs?: number;
|
|
528
|
+
}
|
|
529
|
+
/**
|
|
530
|
+
* Adapter Nominatim (OpenStreetMap). Kolejkuje zapytania z odstępem sekundy, żeby
|
|
531
|
+
* nie łamać polityki użycia, i przerywa je, gdy subskrybent zniknie.
|
|
532
|
+
*/
|
|
533
|
+
declare class KptNominatimGeocoder implements KptMapGeocoderPort {
|
|
534
|
+
private readonly options;
|
|
535
|
+
/** Ogon kolejki — każde kolejne zapytanie czeka na swoją kolej. */
|
|
536
|
+
private next;
|
|
537
|
+
/** Kiedy wystrzeliło poprzednie zapytanie. `0` = jeszcze żadne. */
|
|
538
|
+
private lastAt;
|
|
539
|
+
/**
|
|
540
|
+
* Rozstrzygnięty odstęp między zapytaniami. Liczony raz, w konstruktorze: własny
|
|
541
|
+
* `baseUrl` nie dziedziczy regulaminu publicznej instancji OSM.
|
|
542
|
+
*/
|
|
543
|
+
private readonly minInterval;
|
|
544
|
+
constructor(options?: KptNominatimOptions);
|
|
545
|
+
/**
|
|
546
|
+
* Rezerwuje miejsce w kolejce: czeka na poprzednie zapytanie, a potem tylko tyle,
|
|
547
|
+
* ile brakuje do pełnego odstępu od jego wystrzału.
|
|
548
|
+
*
|
|
549
|
+
* Odstęp liczony od zegara, a nie stałym `delay()` przed każdym zapytaniem —
|
|
550
|
+
* inaczej pierwsza podpowiedź po minucie bezczynności też płaciłaby sekundę, a przy
|
|
551
|
+
* podpowiadaniu w trakcie pisania to jest różnica między „działa" a „zacina się".
|
|
552
|
+
* Górna granica jednego zapytania na sekundę zostaje nienaruszona.
|
|
553
|
+
*
|
|
554
|
+
* Bez odstępu nie ma czego kolejkować: łańcuch obietnic zostaje nietknięty, żeby
|
|
555
|
+
* podpowiedzi z własnej instancji nie ustawiały się jedna za drugą bez powodu.
|
|
556
|
+
*/
|
|
557
|
+
private slot;
|
|
558
|
+
reverse(at: KptLatLng, options?: {
|
|
559
|
+
language?: string;
|
|
560
|
+
signal?: AbortSignal;
|
|
561
|
+
}): Observable<KptMapAddress | null>;
|
|
562
|
+
/**
|
|
563
|
+
* Podpowiedzi adresowe. Wchodzi w **tę samą** kolejkę co `reverse()` — polityka Nominatim
|
|
564
|
+
* liczy jedno zapytanie na sekundę na całego klienta, a nie na metodę.
|
|
565
|
+
*/
|
|
566
|
+
search(query: string, options?: KptMapSearchOptions): Observable<readonly KptMapSearchResult[]>;
|
|
567
|
+
private fetchPlaces;
|
|
568
|
+
private fetchAddress;
|
|
569
|
+
}
|
|
570
|
+
/**
|
|
571
|
+
* Włącza podpowiadanie adresu z Nominatim (OpenStreetMap) w formularzu „dodaj lokalizację".
|
|
572
|
+
*
|
|
573
|
+
* **Polityka użycia.** Publiczna instancja `nominatim.openstreetmap.org` dopuszcza
|
|
574
|
+
* maksymalnie jedno zapytanie na sekundę, wymaga rozpoznawalnego `Referer`/`User-Agent`
|
|
575
|
+
* i zabrania masowego odpytywania; ruch może zostać zablokowany bez uprzedzenia,
|
|
576
|
+
* w szczególności komercyjny. Adapter sam trzyma odstęp sekundy, ale do produkcji
|
|
577
|
+
* podstaw własną instancję (`baseUrl`) albo komercyjnego dostawcę przez własny
|
|
578
|
+
* `KPT_MAP_GEOCODER`.
|
|
579
|
+
*
|
|
580
|
+
* Podanie `baseUrl` **zdejmuje sekundowy odstęp** (`minIntervalMs` domyślnie 0) — regulamin
|
|
581
|
+
* publicznej instancji nie obowiązuje na Twoim serwerze. Cudzą, współdzieloną instancję
|
|
582
|
+
* podstawiaj z jawnym `minIntervalMs`.
|
|
583
|
+
*
|
|
584
|
+
* @example
|
|
585
|
+
* providers: [provideKptLeafletMap(), provideKptNominatimGeocoder({ language: 'pl' })]
|
|
586
|
+
*
|
|
587
|
+
* @example
|
|
588
|
+
* // Własna instancja: bez odstępu, podpowiedzi lecą od razu.
|
|
589
|
+
* provideKptNominatimGeocoder({ baseUrl: 'https://geo.firma.local', language: 'pl' })
|
|
590
|
+
*/
|
|
591
|
+
declare function provideKptNominatimGeocoder(options?: KptNominatimOptions): Provider;
|
|
592
|
+
interface KptMapGeocoderStubOptions {
|
|
593
|
+
/**
|
|
594
|
+
* Udawaj dostawcę, który nie podaje współrzędnych na liście (Google Places Autocomplete):
|
|
595
|
+
* `search()` oddaje podpowiedzi bez `at`, a dopiero `resolve()` je dokłada.
|
|
596
|
+
*
|
|
597
|
+
* Bez tego ścieżki leniwej nie da się pokazać ani przejechać bez prawdziwego klucza API.
|
|
598
|
+
*/
|
|
599
|
+
deferCoordinates?: boolean;
|
|
600
|
+
}
|
|
601
|
+
/**
|
|
602
|
+
* Stały adres i stała lista podpowiedzi — Storybook i testy, bez ruchu sieciowego.
|
|
603
|
+
*
|
|
604
|
+
* Podpowiedzi filtruje po `label` bez znaków diakrytycznych, żeby „warszawa" trafiało
|
|
605
|
+
* w „Warszawa". Prawdziwy geokoder dopasowuje po swojemu — atrapa tylko udaje, że umie.
|
|
606
|
+
*/
|
|
607
|
+
declare class KptMapGeocoderStub implements KptMapGeocoderPort {
|
|
608
|
+
private readonly address;
|
|
609
|
+
private readonly results;
|
|
610
|
+
private readonly options;
|
|
611
|
+
constructor(address: KptMapAddress | null, results?: readonly KptMapSearchResult[], options?: KptMapGeocoderStubOptions);
|
|
612
|
+
reverse(): Observable<KptMapAddress | null>;
|
|
613
|
+
search(query: string, options?: KptMapSearchOptions): Observable<readonly KptMapSuggestion[]>;
|
|
614
|
+
resolve(suggestion: KptMapSuggestion): Observable<KptMapSearchResult | null>;
|
|
615
|
+
}
|
|
616
|
+
declare function provideKptMapGeocoderStub(address: KptMapAddress | null, results?: readonly KptMapSearchResult[], options?: KptMapGeocoderStubOptions): Provider;
|
|
617
|
+
|
|
618
|
+
interface PopupState<T> {
|
|
619
|
+
location: KptMapLocation<T>;
|
|
620
|
+
/** Grupa, z której popup został otwarty — lista nierozdzielalnych punktów. */
|
|
621
|
+
group: KptMapCluster<T> | null;
|
|
622
|
+
}
|
|
623
|
+
/**
|
|
624
|
+
* Mapa z konfigurowalnymi znacznikami: kategorie z kolorem i ikoną, grupowanie z licznikiem,
|
|
625
|
+
* popup szczegółów o szablonie zależnym od kategorii, legenda i dodawanie lokalizacji
|
|
626
|
+
* prawym przyciskiem myszy.
|
|
627
|
+
*
|
|
628
|
+
* Silnik (domyślnie Leaflet + OpenStreetMap) dostarcza `provideKptLeafletMap()`. Wymaga
|
|
629
|
+
* zainstalowanej paczki `leaflet` (zależność opcjonalna) i dołączonego `leaflet/dist/leaflet.css`.
|
|
630
|
+
*
|
|
631
|
+
* @example
|
|
632
|
+
* <kpt-map [locations]="locations()" [categories]="categories" allowCreate showUserLocation>
|
|
633
|
+
* <ng-template kptMapPopup category="closure" let-loc let-data="data">
|
|
634
|
+
* <strong>{{ loc.title }}</strong>
|
|
635
|
+
* <p>{{ data.address }}</p>
|
|
636
|
+
* </ng-template>
|
|
637
|
+
* </kpt-map>
|
|
638
|
+
*/
|
|
639
|
+
declare class KptMap<T = unknown> {
|
|
640
|
+
readonly locations: _angular_core.InputSignal<readonly KptMapLocation<T>[]>;
|
|
641
|
+
readonly categories: _angular_core.InputSignal<readonly KptMapCategory[]>;
|
|
642
|
+
/** Kod kraju z presetów (`PL`, `DE`, `EU`…). Nieznany kod cofa się do Polski. */
|
|
643
|
+
readonly country: _angular_core.InputSignal<string>;
|
|
644
|
+
/** Jawny widok startowy; nadpisuje `country`. */
|
|
645
|
+
readonly view: _angular_core.InputSignal<KptMapView | null>;
|
|
646
|
+
/** Blokuje przesuwanie poza zasięg kraju (albo `bounds`, gdy podane). */
|
|
647
|
+
readonly restrictToCountry: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
648
|
+
/** Jawny zasięg startowy; nadpisuje `country` i `view`. */
|
|
649
|
+
readonly bounds: _angular_core.InputSignal<KptMapBounds | null>;
|
|
650
|
+
readonly cluster: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
651
|
+
readonly clusterOptions: _angular_core.InputSignal<Partial<Omit<KptClusterOptions, "zoom">>>;
|
|
652
|
+
/** `dominant` barwi grupę kolorem najliczniejszej kategorii. */
|
|
653
|
+
readonly clusterColorBy: _angular_core.InputSignal<"dominant" | "none">;
|
|
654
|
+
/** Renderuje legendę pod mapą. Wyłącz, jeśli chcesz ją umieścić gdzie indziej. */
|
|
655
|
+
readonly legend: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
656
|
+
/** Identyfikatory ukrytych kategorii (dwukierunkowe) — legenda je przełącza. */
|
|
657
|
+
readonly hiddenCategories: _angular_core.ModelSignal<string[]>;
|
|
658
|
+
/** Pokazuje liczniki przy pozycjach legendy. */
|
|
659
|
+
readonly legendCounts: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
660
|
+
readonly showUserLocation: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
661
|
+
/** Przy każdej nowej pozycji centruje mapę na użytkowniku. */
|
|
662
|
+
readonly followUser: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
663
|
+
/** Włącza menu „Dodaj lokalizację" pod prawym przyciskiem myszy. */
|
|
664
|
+
readonly allowCreate: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
665
|
+
/**
|
|
666
|
+
* Pokazuje wyszukiwarkę adresów w rogu mapy. Wymaga portu `KPT_MAP_GEOCODER`
|
|
667
|
+
* **z metodą `search()`** — bez niego pole się nie renderuje, bo biblioteka nie
|
|
668
|
+
* odpytuje cudzego serwera bez zgody aplikacji.
|
|
669
|
+
*/
|
|
670
|
+
readonly search: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
671
|
+
/** Podpowiedź w pustym polu wyszukiwania. Pusta oddaje głos słownikowi. */
|
|
672
|
+
readonly searchPlaceholder: _angular_core.InputSignal<string>;
|
|
673
|
+
/** Strojenie wyszukiwarki. Domyślnie `3 / 300 ms / 5`. */
|
|
674
|
+
readonly searchOptions: _angular_core.InputSignal<{
|
|
675
|
+
minLength?: number;
|
|
676
|
+
debounce?: number;
|
|
677
|
+
limit?: number;
|
|
678
|
+
/** Twarde zawężenie do krajów (ISO 3166-1 alpha-2); nadpisuje regułę `restrictToCountry`. */
|
|
679
|
+
countryCodes?: readonly string[];
|
|
680
|
+
}>;
|
|
681
|
+
/**
|
|
682
|
+
* Zoom, na jaki mapa wchodzi po wybraniu wyniku bez własnego zasięgu (pojedynczy adres).
|
|
683
|
+
* Wynik z zasięgiem — miasto, region — dostaje `fitBounds` zamiast tego.
|
|
684
|
+
*/
|
|
685
|
+
readonly searchZoom: _angular_core.InputSignalWithTransform<number, unknown>;
|
|
686
|
+
/** Zostawia tymczasową pinezkę w znalezionym punkcie. */
|
|
687
|
+
readonly searchMarker: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
688
|
+
/**
|
|
689
|
+
* Wygląd popupu. `plain` to wąska ramka na treść tekstową (domyślna),
|
|
690
|
+
* `card` oddaje całą szerokość i wysokość karcie miejsca: bez paddingu,
|
|
691
|
+
* bez wbudowanego krzyżyka, z przewijaniem, gdy treść nie mieści się w mapie.
|
|
692
|
+
*/
|
|
693
|
+
readonly popupLayout: _angular_core.InputSignal<"plain" | "card">;
|
|
694
|
+
/**
|
|
695
|
+
* Punkt odniesienia dystansu podawanego szablonowi popupu jako `distance`.
|
|
696
|
+
* `null` znaczy „pozycja użytkownika z `KPT_MAP_GEOLOCATION`", więc domyślnie
|
|
697
|
+
* jest to odległość od miejsca, w którym stoi patrzący. Aplikacja może podstawić
|
|
698
|
+
* inny punkt — wyszukany adres, siedzibę firmy, stałą pozycję w demie.
|
|
699
|
+
*/
|
|
700
|
+
readonly distanceFrom: _angular_core.InputSignal<KptLatLng | null>;
|
|
701
|
+
readonly height: _angular_core.InputSignal<string>;
|
|
702
|
+
/** Bez znaczenia dla silnika Google — kafle i atrybucję dostarcza tam Google. */
|
|
703
|
+
readonly tileUrl: _angular_core.InputSignal<string | null>;
|
|
704
|
+
readonly attribution: _angular_core.InputSignal<string | null>;
|
|
705
|
+
/**
|
|
706
|
+
* Silnik **tej** mapy. Podany wygrywa nad `KPT_MAP_ENGINE` z DI, więc dwie mapy o różnych
|
|
707
|
+
* silnikach mieszczą się na jednej stronie bez komponentów-opakowań. Bez niego wszystko
|
|
708
|
+
* działa jak dotąd — silnik przychodzi z DI.
|
|
709
|
+
*
|
|
710
|
+
* Fabryka, a nie gotowa instancja: każda mapa potrzebuje własnego obiektu. Czytany raz,
|
|
711
|
+
* przy inicjalizacji — podmiana po starcie nie przeładowuje mapy.
|
|
712
|
+
*
|
|
713
|
+
* @example
|
|
714
|
+
* readonly google: KptMapEngineFactory = () => createGoogleEngine({ apiKey, mapId });
|
|
715
|
+
*/
|
|
716
|
+
readonly engine: _angular_core.InputSignal<KptMapEngineFactory | null>;
|
|
717
|
+
/**
|
|
718
|
+
* Geokoder **tej** mapy. Podany wygrywa nad `KPT_MAP_GEOCODER` z DI — tak samo jak
|
|
719
|
+
* `[engine]` nad `KPT_MAP_ENGINE` i z tego samego powodu: Service Specific Terms wiążą
|
|
720
|
+
* geokoder Google z **mapą** Google, a nie z aplikacją. Na stronie z dwoma silnikami
|
|
721
|
+
* globalny provider nie umiałby tej reguły dotrzymać; wejście umie.
|
|
722
|
+
*
|
|
723
|
+
* Trafia i do wyszukiwarki, i do formularza „dodaj lokalizację" — jeden port na oba kierunki.
|
|
724
|
+
*
|
|
725
|
+
* @example
|
|
726
|
+
* <kpt-map [engine]="google" [geocoder]="googleGeocoder" … />
|
|
727
|
+
*/
|
|
728
|
+
readonly geocoder: _angular_core.InputSignal<KptMapGeocoderPort | null>;
|
|
729
|
+
readonly locationClick: _angular_core.OutputEmitterRef<KptMapLocation<T>>;
|
|
730
|
+
readonly clusterClick: _angular_core.OutputEmitterRef<KptMapCluster<T>>;
|
|
731
|
+
readonly locationCreate: _angular_core.OutputEmitterRef<KptMapCreateEvent>;
|
|
732
|
+
/** Wybrano podpowiedź wyszukiwarki. Mapa sama przenosi na nią widok. */
|
|
733
|
+
readonly searchSelect: _angular_core.OutputEmitterRef<KptMapSearchResult>;
|
|
734
|
+
readonly viewChange: _angular_core.OutputEmitterRef<{
|
|
735
|
+
center: KptLatLng;
|
|
736
|
+
zoom: number;
|
|
737
|
+
bounds: KptMapBounds;
|
|
738
|
+
}>;
|
|
739
|
+
readonly userPositionChange: _angular_core.OutputEmitterRef<KptMapUserPosition | null>;
|
|
740
|
+
readonly userLocationError: _angular_core.OutputEmitterRef<KptMapGeolocationError>;
|
|
741
|
+
protected readonly i18n: KptI18n;
|
|
742
|
+
private readonly icons;
|
|
743
|
+
/** Opcjonalny, bo silnik może przyjść wejściem `[engine]` zamiast z DI. */
|
|
744
|
+
private readonly engineFactory;
|
|
745
|
+
private readonly geolocation;
|
|
746
|
+
/** Opcjonalny — wejście `[geocoder]` i tak ma nad nim pierwszeństwo. */
|
|
747
|
+
private readonly injectedGeocoder;
|
|
748
|
+
private readonly destroyRef;
|
|
749
|
+
private readonly injector;
|
|
750
|
+
/** Rozstrzygnięty port geokodera: wejście przed DI. Szablon podaje go dzieciom. */
|
|
751
|
+
protected readonly activeGeocoder: _angular_core.Signal<KptMapGeocoderPort | null>;
|
|
752
|
+
private readonly canvas;
|
|
753
|
+
private readonly popupEl;
|
|
754
|
+
private readonly popupTemplates;
|
|
755
|
+
protected readonly createFormTemplate: _angular_core.Signal<KptMapCreateFormTemplate | undefined>;
|
|
756
|
+
private mapEngine;
|
|
757
|
+
protected readonly engineKind: _angular_core.WritableSignal<string | null>;
|
|
758
|
+
protected readonly ready: _angular_core.WritableSignal<boolean>;
|
|
759
|
+
/** Zoom trzymamy w sygnale, bo od niego zależy wynik grupowania. */
|
|
760
|
+
private readonly zoom;
|
|
761
|
+
/** Rośnie przy każdym ruchu mapy — wymusza przeliczenie pozycji popupu. */
|
|
762
|
+
private readonly viewportTick;
|
|
763
|
+
protected readonly popup: _angular_core.WritableSignal<PopupState<T> | null>;
|
|
764
|
+
protected readonly contextTarget: _angular_core.WritableSignal<{
|
|
765
|
+
at: KptLatLng;
|
|
766
|
+
point: KptMapPoint;
|
|
767
|
+
} | null>;
|
|
768
|
+
protected readonly createFor: _angular_core.WritableSignal<{
|
|
769
|
+
at: KptLatLng;
|
|
770
|
+
category: KptMapCategory;
|
|
771
|
+
} | null>;
|
|
772
|
+
protected readonly createOpen: _angular_core.WritableSignal<boolean>;
|
|
773
|
+
protected readonly userPosition: _angular_core.WritableSignal<KptMapUserPosition | null>;
|
|
774
|
+
/** Ostatni wybrany wynik wyszukiwania — źródło tymczasowej pinezki. */
|
|
775
|
+
protected readonly searchPin: _angular_core.WritableSignal<KptMapSearchResult | null>;
|
|
776
|
+
protected readonly locationBlocked: _angular_core.WritableSignal<boolean>;
|
|
777
|
+
private readonly categoryById;
|
|
778
|
+
/** Lokalizacje po odfiltrowaniu kategorii ukrytych w legendzie. */
|
|
779
|
+
private readonly visibleLocations;
|
|
780
|
+
protected readonly counts: _angular_core.Signal<Record<string, number> | null>;
|
|
781
|
+
/** Wynik grupowania dla aktualnego zoomu — grupy i punkty pojedyncze. */
|
|
782
|
+
private readonly entries;
|
|
783
|
+
/** Znaczniki gotowe dla silnika. HTML powstaje w rdzeniu, poza Angularem. */
|
|
784
|
+
private readonly markers;
|
|
785
|
+
/** Szablon popupu dla kategorii; bez dopasowania — szablon zapasowy (bez `category`). */
|
|
786
|
+
private readonly popupTemplateFor;
|
|
787
|
+
protected readonly popupTemplate: _angular_core.Signal<KptMapPopupTemplate<T> | null>;
|
|
788
|
+
protected readonly popupCategory: _angular_core.Signal<KptMapCategory | undefined>;
|
|
789
|
+
/**
|
|
790
|
+
* Odległość otwartego punktu od `distanceFrom` (albo od użytkownika) w metrach.
|
|
791
|
+
* `null`, gdy nie ma od czego liczyć — szablon chowa wtedy wiersz dystansu,
|
|
792
|
+
* zamiast pokazywać zero.
|
|
793
|
+
*/
|
|
794
|
+
protected readonly popupDistance: _angular_core.Signal<number | null>;
|
|
795
|
+
/**
|
|
796
|
+
* Pozycja popupu w pikselach kontenera. Zależy od `viewportTick`, więc przelicza się
|
|
797
|
+
* przy każdym ruchu mapy — jeden sygnał zamiast nasłuchu w szablonie.
|
|
798
|
+
*/
|
|
799
|
+
protected readonly popupPosition: _angular_core.Signal<KptMapPoint | null>;
|
|
800
|
+
protected readonly contextPosition: _angular_core.Signal<KptMapPoint | null>;
|
|
801
|
+
/** Kategorie oferowane w menu „dodaj" — ukryte w legendzie odpadają. */
|
|
802
|
+
protected readonly creatableCategories: _angular_core.Signal<KptMapCategory[]>;
|
|
803
|
+
/** Czy jest czym szukać — port bez `search()` nie zasługuje na pole, które nic nie robi. */
|
|
804
|
+
protected readonly searchEnabled: _angular_core.Signal<boolean>;
|
|
805
|
+
/**
|
|
806
|
+
* Prostokąt preferowanych wyników. Bierzemy zasięg jawny, a bez niego preset kraju —
|
|
807
|
+
* „Kwiatowa" ma trafiać w tę pod nosem, nie w tę z drugiego końca świata. To sam bias:
|
|
808
|
+
* adresu z zagranicy dalej da się poszukać.
|
|
809
|
+
*/
|
|
810
|
+
protected readonly searchViewbox: _angular_core.Signal<KptMapBounds>;
|
|
811
|
+
/**
|
|
812
|
+
* Twarde zawężenie do krajów. Jawne `searchOptions.countryCodes` wygrywa; bez niego
|
|
813
|
+
* odcinamy zagranicę dopiero przy `restrictToCountry`, bo tam mapa i tak nie pozwoli
|
|
814
|
+
* przesunąć widoku poza kraj — znaleziony adres byłby nie do pokazania.
|
|
815
|
+
*/
|
|
816
|
+
protected readonly searchCountryCodes: _angular_core.Signal<readonly string[] | null>;
|
|
817
|
+
protected readonly createFormApi: _angular_core.Signal<KptMapCreateFormApi | null>;
|
|
818
|
+
constructor();
|
|
819
|
+
private restrictBounds;
|
|
820
|
+
private initEngine;
|
|
821
|
+
/** Bez tego Leaflet zostawia szare pola po każdej zmianie układu strony. */
|
|
822
|
+
private observeResize;
|
|
823
|
+
private watchGeolocation;
|
|
824
|
+
private emitViewChange;
|
|
825
|
+
private onMarkerClick;
|
|
826
|
+
private onContextMenu;
|
|
827
|
+
protected dismissOverlays(): void;
|
|
828
|
+
/** Kliknięcie w mapę zamyka nakładki i zdejmuje pinezkę wyniku wyszukiwania. */
|
|
829
|
+
protected onMapClick(): void;
|
|
830
|
+
protected clearSearchPin(): void;
|
|
831
|
+
protected closePopup(): void;
|
|
832
|
+
/** Zapas na strzałkę i cień popupu przy sprawdzaniu, czy mieści się w kontenerze. */
|
|
833
|
+
private static readonly POPUP_MARGIN;
|
|
834
|
+
/**
|
|
835
|
+
* Przesuwa mapę tak, żeby świeżo otwarty popup zmieścił się w kontenerze.
|
|
836
|
+
*
|
|
837
|
+
* Wymiarów popupu nie znamy przed renderem, więc mierzymy go po dograniu ramki.
|
|
838
|
+
* Bez tego znacznik przy górnej krawędzi otwiera popup poza widokiem.
|
|
839
|
+
*/
|
|
840
|
+
private autoPanToPopup;
|
|
841
|
+
/** Gotowa referencja dla kontekstu szablonu — szablon nie ma jak zrobić `bind`. */
|
|
842
|
+
protected readonly closePopupFn: () => void;
|
|
843
|
+
/** Pozycja z grupy nierozdzielalnej — przełącza popup bez ruszania mapy. */
|
|
844
|
+
protected selectFromGroup(location: KptMapLocation<T>): void;
|
|
845
|
+
protected startCreate(category: KptMapCategory): void;
|
|
846
|
+
protected closeCreate(): void;
|
|
847
|
+
protected emitCreate(value: Record<string, unknown>): void;
|
|
848
|
+
/**
|
|
849
|
+
* Przenosi widok na wybrany wynik. Zasięg (miasto, region) wpasowujemy w kadr,
|
|
850
|
+
* a pojedynczy punkt dostaje `[searchZoom]` — inaczej każdy adres lądowałby
|
|
851
|
+
* w innym przybliżeniu, zależnym od tego, jak dostawca obrysował budynek.
|
|
852
|
+
*/
|
|
853
|
+
protected onSearchSelect(result: KptMapSearchResult): void;
|
|
854
|
+
protected zoomBy(delta: number): void;
|
|
855
|
+
protected centreOnUser(): void;
|
|
856
|
+
/** Wraca do widoku startowego — po zabłądzeniu na drugim końcu świata. */
|
|
857
|
+
protected resetView(): void;
|
|
858
|
+
/** Zasięg wszystkich widocznych lokalizacji — `null`, gdy nie ma żadnej. */
|
|
859
|
+
protected readonly dataBounds: _angular_core.Signal<KptMapBounds | null>;
|
|
860
|
+
protected fitToData(): void;
|
|
861
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<KptMap<any>, never>;
|
|
862
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptMap<any>, "kpt-map", never, { "locations": { "alias": "locations"; "required": true; "isSignal": true; }; "categories": { "alias": "categories"; "required": true; "isSignal": true; }; "country": { "alias": "country"; "required": false; "isSignal": true; }; "view": { "alias": "view"; "required": false; "isSignal": true; }; "restrictToCountry": { "alias": "restrictToCountry"; "required": false; "isSignal": true; }; "bounds": { "alias": "bounds"; "required": false; "isSignal": true; }; "cluster": { "alias": "cluster"; "required": false; "isSignal": true; }; "clusterOptions": { "alias": "clusterOptions"; "required": false; "isSignal": true; }; "clusterColorBy": { "alias": "clusterColorBy"; "required": false; "isSignal": true; }; "legend": { "alias": "legend"; "required": false; "isSignal": true; }; "hiddenCategories": { "alias": "hiddenCategories"; "required": false; "isSignal": true; }; "legendCounts": { "alias": "legendCounts"; "required": false; "isSignal": true; }; "showUserLocation": { "alias": "showUserLocation"; "required": false; "isSignal": true; }; "followUser": { "alias": "followUser"; "required": false; "isSignal": true; }; "allowCreate": { "alias": "allowCreate"; "required": false; "isSignal": true; }; "search": { "alias": "search"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "searchOptions": { "alias": "searchOptions"; "required": false; "isSignal": true; }; "searchZoom": { "alias": "searchZoom"; "required": false; "isSignal": true; }; "searchMarker": { "alias": "searchMarker"; "required": false; "isSignal": true; }; "popupLayout": { "alias": "popupLayout"; "required": false; "isSignal": true; }; "distanceFrom": { "alias": "distanceFrom"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "tileUrl": { "alias": "tileUrl"; "required": false; "isSignal": true; }; "attribution": { "alias": "attribution"; "required": false; "isSignal": true; }; "engine": { "alias": "engine"; "required": false; "isSignal": true; }; "geocoder": { "alias": "geocoder"; "required": false; "isSignal": true; }; }, { "hiddenCategories": "hiddenCategoriesChange"; "locationClick": "locationClick"; "clusterClick": "clusterClick"; "locationCreate": "locationCreate"; "searchSelect": "searchSelect"; "viewChange": "viewChange"; "userPositionChange": "userPositionChange"; "userLocationError": "userLocationError"; }, ["popupTemplates", "createFormTemplate"], never, true, never>;
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
interface LegendEntry {
|
|
866
|
+
category: KptMapCategory;
|
|
867
|
+
colorVar: string;
|
|
868
|
+
/** Kolor glifu na tle `colorVar`. Zaszyta biel gubi się na jasnych rolach (`muted`). */
|
|
869
|
+
contrastVar: string;
|
|
870
|
+
hidden: boolean;
|
|
871
|
+
count: number | null;
|
|
872
|
+
}
|
|
873
|
+
/**
|
|
874
|
+
* Legenda mapy — lista kategorii ze znacznikiem koloru i ikoną. Pozycje są przyciskami:
|
|
875
|
+
* kliknięcie chowa i pokazuje kategorię (`hidden` dwukierunkowe).
|
|
876
|
+
*
|
|
877
|
+
* `kpt-map` renderuje ją sam pod mapą przy `[legend]="true"`; kto chce ją gdzie indziej,
|
|
878
|
+
* wyłącza tamto i wstawia ten komponent ręcznie.
|
|
879
|
+
*
|
|
880
|
+
* @example
|
|
881
|
+
* <kpt-map-legend [categories]="categories" [(hidden)]="hiddenCategories" [counts]="counts" />
|
|
882
|
+
*/
|
|
883
|
+
declare class KptMapLegend {
|
|
884
|
+
readonly categories: _angular_core.InputSignal<readonly KptMapCategory[]>;
|
|
885
|
+
/** Identyfikatory ukrytych kategorii (dwukierunkowe). */
|
|
886
|
+
readonly hidden: _angular_core.ModelSignal<string[]>;
|
|
887
|
+
/** Opcjonalne liczniki `{ categoryId: liczba }` — pokazywane przy etykiecie. */
|
|
888
|
+
readonly counts: _angular_core.InputSignal<Record<string, number> | null>;
|
|
889
|
+
readonly orientation: _angular_core.InputSignal<"horizontal" | "vertical">;
|
|
890
|
+
/** Wyłącza chowanie kategorii — legenda staje się czysto informacyjna. */
|
|
891
|
+
readonly interactive: _angular_core.InputSignal<boolean>;
|
|
892
|
+
protected readonly i18n: KptI18n;
|
|
893
|
+
protected readonly entries: _angular_core.Signal<LegendEntry[]>;
|
|
894
|
+
protected toggle(entry: LegendEntry): void;
|
|
895
|
+
protected label(entry: LegendEntry): string;
|
|
896
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<KptMapLegend, never>;
|
|
897
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptMapLegend, "kpt-map-legend", never, { "categories": { "alias": "categories"; "required": true; "isSignal": true; }; "hidden": { "alias": "hidden"; "required": false; "isSignal": true; }; "counts": { "alias": "counts"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; }, { "hidden": "hiddenChange"; }, never, never, true, never>;
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
/**
|
|
901
|
+
* Wyszukiwarka adresów: pole z podpowiedziami z geokodera. Wynik wyboru leci w `selected`,
|
|
902
|
+
* a co z nim zrobić — decyduje rodzic (`kpt-map` przenosi na niego widok).
|
|
903
|
+
*
|
|
904
|
+
* Wymaga portu `KPT_MAP_GEOCODER` **z metodą `search()`** — biblioteka nie odpytuje cudzego
|
|
905
|
+
* serwera bez zgody aplikacji. Bez portu pole renderuje się wyłączone, zamiast udawać, że
|
|
906
|
+
* coś znajdzie; `kpt-map` idzie dalej i w ogóle go wtedy nie pokazuje.
|
|
907
|
+
*
|
|
908
|
+
* Świadomie **nie** stoi na `kpt-autocomplete`: tamten filtruje opcje po stronie klienta
|
|
909
|
+
* (wyniki geokodera, tolerancyjne na literówki, wypadałyby z listy), jego wartością jest
|
|
910
|
+
* sam `string` (nie ma czym przewieźć współrzędnych) i wymaga CDK Overlay, którego mapa
|
|
911
|
+
* poza tym nie potrzebuje.
|
|
912
|
+
*
|
|
913
|
+
* @example
|
|
914
|
+
* <kpt-map-search [viewbox]="bounds" (selected)="goTo($event)" />
|
|
915
|
+
*/
|
|
916
|
+
declare class KptMapSearch {
|
|
917
|
+
/** Podpowiedź w pustym polu. Pusta oddaje głos słownikowi `map.search.placeholder`. */
|
|
918
|
+
readonly placeholder: _angular_core.InputSignal<string>;
|
|
919
|
+
/** Od ilu znaków pytać geokoder. Krótsze frazy zwracają pół świata. */
|
|
920
|
+
readonly minLength: _angular_core.InputSignalWithTransform<number, unknown>;
|
|
921
|
+
/** Ile milisekund ciszy przed zapytaniem. */
|
|
922
|
+
readonly debounce: _angular_core.InputSignalWithTransform<number, unknown>;
|
|
923
|
+
/** Ile podpowiedzi najwyżej. */
|
|
924
|
+
readonly limit: _angular_core.InputSignalWithTransform<number, unknown>;
|
|
925
|
+
/** Zawężenie twarde do krajów (ISO 3166-1 alpha-2) — wyniki spoza nich nie wrócą. */
|
|
926
|
+
readonly countryCodes: _angular_core.InputSignal<readonly string[] | null>;
|
|
927
|
+
/** Preferowany prostokąt wyników. Nie odcina reszty świata, tylko przesuwa ją niżej. */
|
|
928
|
+
readonly viewbox: _angular_core.InputSignal<KptMapBounds | null>;
|
|
929
|
+
readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
930
|
+
/**
|
|
931
|
+
* Geokoder tego pola. Podany wygrywa nad `KPT_MAP_GEOCODER` z DI — `kpt-map` podaje tędy
|
|
932
|
+
* port swojej mapy, bo geokoder jest per mapa, a nie per aplikacja. Bez niego wszystko
|
|
933
|
+
* działa jak dotąd: port przychodzi z DI.
|
|
934
|
+
*/
|
|
935
|
+
readonly geocoder: _angular_core.InputSignal<KptMapGeocoderPort | null>;
|
|
936
|
+
/**
|
|
937
|
+
* Wybrano miejsce. **Zawsze ze współrzędnymi**: podpowiedź, której dostawca ich nie podał,
|
|
938
|
+
* pole najpierw uzupełnia przez `resolve()` portu, a dopiero potem emituje.
|
|
939
|
+
*/
|
|
940
|
+
readonly selected: _angular_core.OutputEmitterRef<KptMapSearchResult>;
|
|
941
|
+
/** Pole wyczyszczone — rodzic sprząta po sobie (np. chowa tymczasową pinezkę). */
|
|
942
|
+
readonly cleared: _angular_core.OutputEmitterRef<void>;
|
|
943
|
+
protected readonly i18n: KptI18n;
|
|
944
|
+
private readonly injectedGeocoder;
|
|
945
|
+
/** Rozstrzygnięty port: wejście przed DI. Czytany reaktywnie, bo mapa może go podmienić. */
|
|
946
|
+
private readonly port;
|
|
947
|
+
protected readonly uid: string;
|
|
948
|
+
/** Tekst widoczny w polu. Wybór podpowiedzi wpisuje tu jej etykietę. */
|
|
949
|
+
protected readonly query: _angular_core.WritableSignal<string>;
|
|
950
|
+
/**
|
|
951
|
+
* Fraza do odpytania geokodera. Osobna od `query`, bo wybór podpowiedzi zmienia treść
|
|
952
|
+
* pola — a to nie może wywołać kolejnego zapytania o coś, co już znaleźliśmy.
|
|
953
|
+
*/
|
|
954
|
+
private readonly term;
|
|
955
|
+
protected readonly results: _angular_core.WritableSignal<readonly KptMapSuggestion[]>;
|
|
956
|
+
protected readonly loading: _angular_core.WritableSignal<boolean>;
|
|
957
|
+
/**
|
|
958
|
+
* Trwa dociąganie współrzędnych wybranej podpowiedzi (`resolve()` portu). Osobne od
|
|
959
|
+
* `loading`, bo to inny moment: tam czekamy na listę, tu na jedno konkretne miejsce.
|
|
960
|
+
*/
|
|
961
|
+
protected readonly resolving: _angular_core.WritableSignal<boolean>;
|
|
962
|
+
/** Subskrypcja `resolve()` w locie — kolejny wybór i czyszczenie pola ją przerywają. */
|
|
963
|
+
private pending;
|
|
964
|
+
/** Czy jakieś zapytanie już wróciło — bez tego „brak wyników" mignąłby przed pierwszym. */
|
|
965
|
+
protected readonly searched: _angular_core.WritableSignal<boolean>;
|
|
966
|
+
protected readonly open: _angular_core.WritableSignal<boolean>;
|
|
967
|
+
protected readonly activeIndex: _angular_core.WritableSignal<number>;
|
|
968
|
+
/** Fraza za krótka, ale niepusta — zamiast ciszy pokazujemy, ile znaków brakuje. */
|
|
969
|
+
protected readonly tooShort: _angular_core.Signal<boolean>;
|
|
970
|
+
protected readonly hasPanel: _angular_core.Signal<boolean>;
|
|
971
|
+
/** Cokolwiek leci do geokodera — lista albo pojedyncze miejsce. Jeden stan dla szablonu. */
|
|
972
|
+
protected readonly busy: _angular_core.Signal<boolean>;
|
|
973
|
+
protected readonly canSearch: _angular_core.Signal<boolean>;
|
|
974
|
+
/** Nie udało się ustalić miejsca wybranej podpowiedzi — komunikat zamiast cichej ciszy. */
|
|
975
|
+
private readonly unresolved;
|
|
976
|
+
/** Komunikat dla `aria-live` — czytnik dostaje stan, którego wzrokowo nie da się przegapić. */
|
|
977
|
+
protected readonly status: _angular_core.Signal<string>;
|
|
978
|
+
protected readonly placeholderText: _angular_core.Signal<string>;
|
|
979
|
+
constructor();
|
|
980
|
+
/**
|
|
981
|
+
* Odpytuje geokoder po odczekaniu `debounce` od ostatniego znaku.
|
|
982
|
+
*
|
|
983
|
+
* Debounce stoi na `setTimeout`, a nie na operatorach rxjs: porty tego pakietu używają
|
|
984
|
+
* wyłącznie `Observable`/`of`, a rxjs nie jest zadeklarowany jako `peerDependency`
|
|
985
|
+
* biblioteki (wchodzi tranzytywnie przez `@angular/core`). `onCleanup` kasuje zarówno
|
|
986
|
+
* niewystrzelony timer, jak i zapytanie w locie — adapter Nominatim przerywa wtedy
|
|
987
|
+
* `fetch` własnym `AbortController`.
|
|
988
|
+
*/
|
|
989
|
+
private watchTerm;
|
|
990
|
+
private applyResults;
|
|
991
|
+
protected optionId(index: number): string;
|
|
992
|
+
protected onInput(event: Event): void;
|
|
993
|
+
protected onFocus(): void;
|
|
994
|
+
protected onBlur(): void;
|
|
995
|
+
/**
|
|
996
|
+
* Wybór podpowiedzi. Dostawca, który podał współrzędne na liście, emituje natychmiast —
|
|
997
|
+
* dla Nominatima i każdego geokodera pytanego wprost nic się nie zmienia.
|
|
998
|
+
*
|
|
999
|
+
* Podpowiedź bez `at` (Google Places Autocomplete) trzeba najpierw uzupełnić: jedno
|
|
1000
|
+
* wywołanie `resolve()` na *wybór*, nigdy w trakcie pisania. Panel zostaje otwarty
|
|
1001
|
+
* z komunikatem „Szukam…", żeby czekanie nie wyglądało na zawieszenie pola.
|
|
1002
|
+
*/
|
|
1003
|
+
protected pick(suggestion: KptMapSuggestion): void;
|
|
1004
|
+
private applyResolved;
|
|
1005
|
+
protected clear(): void;
|
|
1006
|
+
protected onKeydown(event: KeyboardEvent): void;
|
|
1007
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<KptMapSearch, never>;
|
|
1008
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptMapSearch, "kpt-map-search", never, { "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "debounce": { "alias": "debounce"; "required": false; "isSignal": true; }; "limit": { "alias": "limit"; "required": false; "isSignal": true; }; "countryCodes": { "alias": "countryCodes"; "required": false; "isSignal": true; }; "viewbox": { "alias": "viewbox"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "geocoder": { "alias": "geocoder"; "required": false; "isSignal": true; }; }, { "selected": "selected"; "cleared": "cleared"; }, never, never, true, never>;
|
|
1009
|
+
}
|
|
1010
|
+
|
|
1011
|
+
/**
|
|
1012
|
+
* Treść dialogu „dodaj lokalizację" budowana ze schemy kategorii (`category.fields`).
|
|
1013
|
+
*
|
|
1014
|
+
* Przy dynamicznej schemie typowanie pól znika — model to `Record<string, unknown>`,
|
|
1015
|
+
* a ścieżki walidatorów trzeba rzutować. Reszta kontraktu Signal Forms zostaje bez zmian:
|
|
1016
|
+
* walidatory deklarujemy raz, a bramka „nie strasz czerwienią" siedzi w prezentacji.
|
|
1017
|
+
*/
|
|
1018
|
+
declare class KptMapCreateDialog {
|
|
1019
|
+
readonly category: _angular_core.InputSignal<KptMapCategory>;
|
|
1020
|
+
readonly at: _angular_core.InputSignal<KptLatLng>;
|
|
1021
|
+
/**
|
|
1022
|
+
* Geokoder tego formularza. Podany wygrywa nad `KPT_MAP_GEOCODER` z DI — `kpt-map` podaje
|
|
1023
|
+
* tędy port swojej mapy, bo geokoder jest per mapa, a nie per aplikacja.
|
|
1024
|
+
*/
|
|
1025
|
+
readonly geocoder: _angular_core.InputSignal<KptMapGeocoderPort | null>;
|
|
1026
|
+
readonly save: _angular_core.OutputEmitterRef<Record<string, unknown>>;
|
|
1027
|
+
readonly cancelled: _angular_core.OutputEmitterRef<void>;
|
|
1028
|
+
protected readonly i18n: KptI18n;
|
|
1029
|
+
private readonly injector;
|
|
1030
|
+
/** Opcjonalny — wejście `[geocoder]` i tak ma nad nim pierwszeństwo. */
|
|
1031
|
+
private readonly injectedGeocoder;
|
|
1032
|
+
/** Rozstrzygnięty port: wejście przed DI. Bez obu formularz po prostu nie podpowiada adresu. */
|
|
1033
|
+
private readonly port;
|
|
1034
|
+
/** Trwa zapytanie do geokodera — szablon pokazuje wtedy notkę zamiast ciszy. */
|
|
1035
|
+
protected readonly geocoding: WritableSignal<boolean>;
|
|
1036
|
+
/** Ostatnio ustalony adres; `label` bywa czytelniejszy niż suma pól. */
|
|
1037
|
+
protected readonly address: WritableSignal<KptMapAddress | null>;
|
|
1038
|
+
protected readonly fields: _angular_core.Signal<readonly KptMapFieldDef[]>;
|
|
1039
|
+
/** Czy kategoria ma pola do podpowiedzenia i jest czym je podpowiedzieć. */
|
|
1040
|
+
protected readonly hasAutofill: _angular_core.Signal<boolean>;
|
|
1041
|
+
/**
|
|
1042
|
+
* Model i formularz dla aktualnej kategorii. Budowane w efekcie, nie w `computed()`,
|
|
1043
|
+
* bo `form()` zakłada dwie rzeczy, których ciało `computed()` nie spełnia:
|
|
1044
|
+
*
|
|
1045
|
+
* - wstrzykuje sobie zależności → stąd `runInInjectionContext`;
|
|
1046
|
+
* - zakłada własny `effect()`, a tego nie wolno tworzyć w kontekście reaktywnym
|
|
1047
|
+
* (NG0602) → stąd `untracked`, które zdejmuje aktywnego konsumenta.
|
|
1048
|
+
*
|
|
1049
|
+
* Zależność od `fields()` zostaje śledzona na zewnątrz `untracked`, więc zmiana
|
|
1050
|
+
* kategorii przebudowuje formularz — inny zestaw pól to inny formularz, a Signal Forms
|
|
1051
|
+
* wiąże schemę tylko raz, przy tworzeniu.
|
|
1052
|
+
*/
|
|
1053
|
+
private readonly built;
|
|
1054
|
+
constructor();
|
|
1055
|
+
/**
|
|
1056
|
+
* Podpowiada adres z geokodowania wstecznego współrzędnych kliknięcia.
|
|
1057
|
+
*
|
|
1058
|
+
* Wypełnia wyłącznie pola z `autofill` i wyłącznie te, które są jeszcze puste —
|
|
1059
|
+
* podpowiedź nigdy nie kasuje tego, co użytkownik zdążył wpisać. Brak portu
|
|
1060
|
+
* `KPT_MAP_GEOCODER` albo nieudane zapytanie to nie błąd: pola zostają puste.
|
|
1061
|
+
*/
|
|
1062
|
+
private watchGeocoder;
|
|
1063
|
+
/** `null` tylko między utworzeniem komponentu a pierwszym przebiegiem efektu. */
|
|
1064
|
+
protected readonly formRoot: _angular_core.Signal<_angular_forms_signals.FieldTree<Record<string, unknown>, string | number, "writable"> | null>;
|
|
1065
|
+
protected readonly formInvalid: _angular_core.Signal<boolean>;
|
|
1066
|
+
/** Kontrolka pola po kluczu — szablon podaje ją do `[formField]`. */
|
|
1067
|
+
protected fieldOf(key: string): unknown;
|
|
1068
|
+
/** Komunikat pokazujemy dopiero po dotknięciu pola — bramka żyje w prezentacji. */
|
|
1069
|
+
protected errorOf(key: string): string | null;
|
|
1070
|
+
/**
|
|
1071
|
+
* Dzień otwarty musi mieć obie godziny i różne od siebie. Dzień oznaczony jako
|
|
1072
|
+
* zamknięty przechodzi bez zastrzeżeń — to prawidłowa odpowiedź, a nie brak danych.
|
|
1073
|
+
*/
|
|
1074
|
+
private hoursError;
|
|
1075
|
+
protected optionsOf(def: KptMapFieldDef): KptOption<unknown>[];
|
|
1076
|
+
protected controlId(def: KptMapFieldDef): string;
|
|
1077
|
+
/** Czy pole renderuje jeden `<input>`, na który może wskazać `label[for]`. */
|
|
1078
|
+
protected hasOwnInput(def: KptMapFieldDef): boolean;
|
|
1079
|
+
/** Współrzędne z prawego kliknięcia — pokazujemy je, ale nie pozwalamy edytować. */
|
|
1080
|
+
protected readonly coords: _angular_core.Signal<{
|
|
1081
|
+
lat: string;
|
|
1082
|
+
lng: string;
|
|
1083
|
+
}>;
|
|
1084
|
+
protected onSubmit(): Promise<void>;
|
|
1085
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<KptMapCreateDialog, never>;
|
|
1086
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptMapCreateDialog, "kpt-map-create-dialog", never, { "category": { "alias": "category"; "required": true; "isSignal": true; }; "at": { "alias": "at"; "required": true; "isSignal": true; }; "geocoder": { "alias": "geocoder"; "required": false; "isSignal": true; }; }, { "save": "save"; "cancelled": "cancelled"; }, never, never, true, never>;
|
|
1087
|
+
}
|
|
1088
|
+
|
|
1089
|
+
/** Minuta doby dla `HH:MM`; `24:00` to 1440. `null`, gdy zapis jest nieprawidłowy. */
|
|
1090
|
+
declare function parseTime(value: string): number | null;
|
|
1091
|
+
/** `HH:MM` z minuty doby. 1440 wraca jako `24:00`, nie `00:00`. */
|
|
1092
|
+
declare function formatTime(minutes: number): string;
|
|
1093
|
+
/** Dzień tygodnia wg ISO (1 = poniedziałek) z natywnej daty. */
|
|
1094
|
+
declare function isoWeekday(date: Date): KptMapWeekday;
|
|
1095
|
+
/**
|
|
1096
|
+
* Czy miejsce jest otwarte w danym momencie.
|
|
1097
|
+
*
|
|
1098
|
+
* Sprawdza dwa dni: bieżący oraz poprzedni, bo przedział przez północ
|
|
1099
|
+
* (`22:00 – 01:00`) obejmuje wczesne godziny dnia następnego.
|
|
1100
|
+
*/
|
|
1101
|
+
declare function isOpenAt(hours: KptMapOpeningHours | undefined, date: Date): boolean;
|
|
1102
|
+
/** Czy rozkład to pełna doba przez siedem dni — wtedy karta pisze po prostu „24/7". */
|
|
1103
|
+
declare function isAlwaysOpen(hours: KptMapOpeningHours | undefined): boolean;
|
|
1104
|
+
/** Najbliższa zmiana stanu otwarte/zamknięte albo `null`, gdy w ciągu tygodnia jej nie ma. */
|
|
1105
|
+
declare function nextChange(hours: KptMapOpeningHours | undefined, date: Date): {
|
|
1106
|
+
open: boolean;
|
|
1107
|
+
at: Date;
|
|
1108
|
+
} | null;
|
|
1109
|
+
/** Skrócona nazwa dnia z `Intl` — bez słownika, więc działa dla dowolnego locale. */
|
|
1110
|
+
declare function weekdayName(day: KptMapWeekday, locale: string): string;
|
|
1111
|
+
/** Wiersz rozkładu: jeden dzień albo sklejony zakres dni o identycznych godzinach. */
|
|
1112
|
+
interface KptMapHoursGroup {
|
|
1113
|
+
/** `pon.` albo `wt.–sob.`, wg locale. */
|
|
1114
|
+
label: string;
|
|
1115
|
+
days: KptMapWeekday[];
|
|
1116
|
+
closed: boolean;
|
|
1117
|
+
/** Sformatowane przedziały, np. `['11:00 – 24:00']`. Puste, gdy zamknięte. */
|
|
1118
|
+
ranges: string[];
|
|
1119
|
+
}
|
|
1120
|
+
/**
|
|
1121
|
+
* Rozkład tygodnia z sąsiadującymi dniami sklejonymi w jeden wiersz.
|
|
1122
|
+
*
|
|
1123
|
+
* Niedziela i poniedziałek się nie sklejają, choć w tablicy sąsiadują — tydzień
|
|
1124
|
+
* czyta się liniowo od poniedziałku i zawijanie byłoby mylące.
|
|
1125
|
+
*/
|
|
1126
|
+
declare function groupWeek(hours: KptMapOpeningHours | undefined, locale: string, separator?: string): KptMapHoursGroup[];
|
|
1127
|
+
/** Siedem dni oznaczonych jako zamknięte — wartość startowa pola `hours` w formularzu. */
|
|
1128
|
+
declare function emptyWeek(): KptMapOpeningHours;
|
|
1129
|
+
|
|
1130
|
+
/** Wiersz kontaktu: wartość, akcja właściwa i kopiowanie do schowka. */
|
|
1131
|
+
interface ContactRow {
|
|
1132
|
+
kind: 'phone' | 'email' | 'website' | 'coords';
|
|
1133
|
+
icon: string;
|
|
1134
|
+
/** Tekst pokazywany użytkownikowi. */
|
|
1135
|
+
text: string;
|
|
1136
|
+
/** Tekst kopiowany do schowka — dla współrzędnych inny niż wyświetlany. */
|
|
1137
|
+
copyValue: string;
|
|
1138
|
+
/** `href` akcji właściwej; `null` dla współrzędnych (nie ma dokąd prowadzić). */
|
|
1139
|
+
href: string | null;
|
|
1140
|
+
/** Otworzyć w nowej karcie. */
|
|
1141
|
+
external: boolean;
|
|
1142
|
+
actionIcon: string;
|
|
1143
|
+
actionLabel: string;
|
|
1144
|
+
}
|
|
1145
|
+
/**
|
|
1146
|
+
* Karta miejsca do popupu mapy — dystans od użytkownika, zdjęcie, akcje, kategoria,
|
|
1147
|
+
* rozwijane godziny otwarcia i wiersze kontaktowe z kopiowaniem.
|
|
1148
|
+
*
|
|
1149
|
+
* Komponent jest sterowany danymi: bierze `KptMapPoi`, a nie model domenowy aplikacji.
|
|
1150
|
+
* Mapowanie `KptMapLocation.data` → `KptMapPoi` robi aplikacja, dzięki czemu karta nie
|
|
1151
|
+
* wie nic o tym, czy pokazuje ładowarkę, restaurację, czy punkt serwisowy.
|
|
1152
|
+
*
|
|
1153
|
+
* Sam popup `kpt-map` trzeba przełączyć na `[popupLayout]="'card'"` — inaczej karta
|
|
1154
|
+
* dostanie 20 rem szerokości i padding przeznaczony dla treści tekstowej.
|
|
1155
|
+
*
|
|
1156
|
+
* @example
|
|
1157
|
+
* <kpt-map [locations]="places()" [categories]="categories" popupLayout="card">
|
|
1158
|
+
* <ng-template kptMapPopup let-loc let-d="data" let-dist="distance" let-close="close">
|
|
1159
|
+
* <kpt-map-poi-card
|
|
1160
|
+
* [poi]="poiOf(loc, d)"
|
|
1161
|
+
* [distance]="dist"
|
|
1162
|
+
* [category]="categoryOf(loc)"
|
|
1163
|
+
* primaryLabel="Wyznacz trasę"
|
|
1164
|
+
* (closed)="close()"
|
|
1165
|
+
* />
|
|
1166
|
+
* </ng-template>
|
|
1167
|
+
* </kpt-map>
|
|
1168
|
+
*/
|
|
1169
|
+
declare class KptMapPoiCard {
|
|
1170
|
+
readonly poi: _angular_core.InputSignal<KptMapPoi>;
|
|
1171
|
+
/** Odległość w metrach; `null` chowa wiersz dystansu. */
|
|
1172
|
+
readonly distance: _angular_core.InputSignal<number | null>;
|
|
1173
|
+
/** Źródło ikony, koloru i etykiety wiersza kategorii; `null` chowa ten wiersz. */
|
|
1174
|
+
readonly category: _angular_core.InputSignal<KptMapCategory | null>;
|
|
1175
|
+
/** Etykieta przycisku głównego; pusta chowa przycisk. */
|
|
1176
|
+
readonly primaryLabel: _angular_core.InputSignal<string>;
|
|
1177
|
+
readonly showShare: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1178
|
+
readonly showFavourite: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1179
|
+
readonly favourite: _angular_core.ModelSignal<boolean>;
|
|
1180
|
+
readonly closable: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1181
|
+
/** Rozwinąć godziny od razu. Domyślnie zwinięte, jak na karcie miejsca w mapach. */
|
|
1182
|
+
readonly hoursExpanded: _angular_core.ModelSignal<boolean>;
|
|
1183
|
+
readonly primaryAction: _angular_core.OutputEmitterRef<KptMapPoi>;
|
|
1184
|
+
readonly closed: _angular_core.OutputEmitterRef<void>;
|
|
1185
|
+
readonly shared: _angular_core.OutputEmitterRef<KptMapPoi>;
|
|
1186
|
+
protected readonly i18n: KptI18n;
|
|
1187
|
+
/** Identyfikator regionu godzin; kart na stronie bywa więcej niż jedna. */
|
|
1188
|
+
protected readonly hoursId: string;
|
|
1189
|
+
/** Rośnie przy każdym otwarciu karty i przy zmianie danych — odświeża status godzin. */
|
|
1190
|
+
private readonly now;
|
|
1191
|
+
/**
|
|
1192
|
+
* Ikona kategorii stoi wprost na powierzchni karty, bez własnego tła — stąd
|
|
1193
|
+
* `foregroundVarOf()`, a nie `colorVarOf()`: rola `muted` ma kolor tła, nie treści.
|
|
1194
|
+
*/
|
|
1195
|
+
protected readonly categoryColor: _angular_core.Signal<string | null>;
|
|
1196
|
+
protected readonly distanceLabel: _angular_core.Signal<string | null>;
|
|
1197
|
+
protected readonly hasHours: _angular_core.Signal<boolean>;
|
|
1198
|
+
protected readonly alwaysOpen: _angular_core.Signal<boolean>;
|
|
1199
|
+
protected readonly open: _angular_core.Signal<boolean>;
|
|
1200
|
+
protected readonly hoursGroups: _angular_core.Signal<KptMapHoursGroup[]>;
|
|
1201
|
+
protected readonly statusLabel: _angular_core.Signal<string>;
|
|
1202
|
+
/** Dopisek „otwarcie o 11:00" — nie ma go dla 24/7 ani gdy zmiana jest dalej niż doba. */
|
|
1203
|
+
protected readonly statusHint: _angular_core.Signal<string | null>;
|
|
1204
|
+
protected readonly rows: _angular_core.Signal<ContactRow[]>;
|
|
1205
|
+
/** Klucz wiersza, którego wartość właśnie skopiowano — przełącza ikonę na „check". */
|
|
1206
|
+
protected readonly justCopied: _angular_core.WritableSignal<string | null>;
|
|
1207
|
+
private copyTimer;
|
|
1208
|
+
/** Bez API schowka przycisk kopiowania w ogóle się nie renderuje. */
|
|
1209
|
+
protected readonly canCopy: boolean;
|
|
1210
|
+
protected readonly canShare: boolean;
|
|
1211
|
+
protected copy(row: ContactRow): Promise<void>;
|
|
1212
|
+
protected onPrimary(): void;
|
|
1213
|
+
protected onClose(): void;
|
|
1214
|
+
protected toggleFavourite(): void;
|
|
1215
|
+
protected toggleHours(): void;
|
|
1216
|
+
/**
|
|
1217
|
+
* Udostępnianie: natywny arkusz systemowy, gdy przeglądarka go ma, inaczej schowek.
|
|
1218
|
+
* W obu przypadkach leci `shared`, więc aplikacja może dołożyć własną telemetrię.
|
|
1219
|
+
*/
|
|
1220
|
+
protected share(): Promise<void>;
|
|
1221
|
+
protected favouriteLabel(): string;
|
|
1222
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<KptMapPoiCard, never>;
|
|
1223
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptMapPoiCard, "kpt-map-poi-card", never, { "poi": { "alias": "poi"; "required": true; "isSignal": true; }; "distance": { "alias": "distance"; "required": false; "isSignal": true; }; "category": { "alias": "category"; "required": false; "isSignal": true; }; "primaryLabel": { "alias": "primaryLabel"; "required": false; "isSignal": true; }; "showShare": { "alias": "showShare"; "required": false; "isSignal": true; }; "showFavourite": { "alias": "showFavourite"; "required": false; "isSignal": true; }; "favourite": { "alias": "favourite"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; "hoursExpanded": { "alias": "hoursExpanded"; "required": false; "isSignal": true; }; }, { "favourite": "favouriteChange"; "hoursExpanded": "hoursExpandedChange"; "primaryAction": "primaryAction"; "closed": "closed"; "shared": "shared"; }, never, never, true, never>;
|
|
1224
|
+
}
|
|
1225
|
+
|
|
1226
|
+
/** Wiersz edytora — dzień z nazwą i przedziałami dopełnionymi do pustych pól. */
|
|
1227
|
+
interface HoursRow {
|
|
1228
|
+
day: KptMapWeekday;
|
|
1229
|
+
name: string;
|
|
1230
|
+
closed: boolean;
|
|
1231
|
+
ranges: {
|
|
1232
|
+
from: string;
|
|
1233
|
+
to: string;
|
|
1234
|
+
}[];
|
|
1235
|
+
}
|
|
1236
|
+
/**
|
|
1237
|
+
* Pole „godziny otwarcia" formularza dodawania lokalizacji (`type: 'hours'` w schemie).
|
|
1238
|
+
*
|
|
1239
|
+
* Siedem wierszy od poniedziałku, każdy z parą godzin i znacznikiem „zamknięte".
|
|
1240
|
+
* Skrót „tak samo przez cały tydzień" kopiuje poniedziałek na pozostałe dni — to
|
|
1241
|
+
* najczęstszy przypadek, a bez niego wypełnienie formularza to czternaście pól.
|
|
1242
|
+
*
|
|
1243
|
+
* Nazwy dni idą z `Intl`, nie ze słownika `KptMessages`: rozkład tygodnia jest
|
|
1244
|
+
* uniwersalny, a tłumaczenie nazw dni przeglądarka ma już zrobione.
|
|
1245
|
+
*/
|
|
1246
|
+
declare class KptMapHoursField implements FormValueControl<KptMapOpeningHours> {
|
|
1247
|
+
readonly value: _angular_core.ModelSignal<KptMapOpeningHours>;
|
|
1248
|
+
readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1249
|
+
readonly readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1250
|
+
readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1251
|
+
readonly touched: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1252
|
+
readonly touch: _angular_core.OutputEmitterRef<void>;
|
|
1253
|
+
protected readonly i18n: KptI18n;
|
|
1254
|
+
protected readonly maxRanges = 2;
|
|
1255
|
+
protected readonly minuteStep = 5;
|
|
1256
|
+
/** Skrót „tak samo przez cały tydzień" — trzymany w modelu, nie w wartości. */
|
|
1257
|
+
readonly sameAllWeek: _angular_core.ModelSignal<boolean>;
|
|
1258
|
+
protected readonly rows: _angular_core.Signal<HoursRow[]>;
|
|
1259
|
+
/** Dni poza poniedziałkiem są zablokowane, gdy tydzień jest jednakowy. */
|
|
1260
|
+
protected locked(row: HoursRow): boolean;
|
|
1261
|
+
protected onSameAllWeek(same: boolean): void;
|
|
1262
|
+
protected setClosed(row: HoursRow, closed: boolean): void;
|
|
1263
|
+
protected setTime(row: HoursRow, index: number, edge: 'from' | 'to', time: string): void;
|
|
1264
|
+
protected addRange(row: HoursRow): void;
|
|
1265
|
+
protected removeRange(row: HoursRow, index: number): void;
|
|
1266
|
+
/** Zmiana jednego dnia; przy jednakowym tygodniu poniedziałek rozlewa się na resztę. */
|
|
1267
|
+
private patch;
|
|
1268
|
+
/** Zapis zawsze przez pełny, uporządkowany tydzień — model nie ma dziur. */
|
|
1269
|
+
private write;
|
|
1270
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<KptMapHoursField, never>;
|
|
1271
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptMapHoursField, "kpt-map-hours-field", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "sameAllWeek": { "alias": "sameAllWeek"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touch": "touch"; "sameAllWeek": "sameAllWeekChange"; }, never, never, true, never>;
|
|
1272
|
+
}
|
|
1273
|
+
|
|
1274
|
+
/**
|
|
1275
|
+
* Pole „zdjęcie" formularza dodawania lokalizacji (`type: 'image'` w schemie kategorii).
|
|
1276
|
+
*
|
|
1277
|
+
* Wartością jest zawsze **string**: albo `data:` z wybranego pliku, albo adres wklejony
|
|
1278
|
+
* przez użytkownika. Karta miejsca nie rozróżnia jednego od drugiego, więc formularz
|
|
1279
|
+
* nie musi decydować za aplikację, gdzie zdjęcia mieszkają.
|
|
1280
|
+
*
|
|
1281
|
+
* Plik czytamy w przeglądarce i nigdzie nie wysyłamy — biblioteka nie ma i nie chce
|
|
1282
|
+
* mieć wiedzy o storage'u aplikacji.
|
|
1283
|
+
*/
|
|
1284
|
+
declare class KptMapImageField implements FormValueControl<string> {
|
|
1285
|
+
readonly value: _angular_core.ModelSignal<string>;
|
|
1286
|
+
readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1287
|
+
readonly readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1288
|
+
readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1289
|
+
readonly touched: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
1290
|
+
/** Górny limit pliku w bajtach. */
|
|
1291
|
+
readonly maxBytes: _angular_core.InputSignal<number>;
|
|
1292
|
+
readonly touch: _angular_core.OutputEmitterRef<void>;
|
|
1293
|
+
protected readonly i18n: KptI18n;
|
|
1294
|
+
/** Pliki trzymane wyłącznie po to, żeby `kpt-file-upload` miał co pokazać. */
|
|
1295
|
+
protected readonly files: _angular_core.ModelSignal<File[]>;
|
|
1296
|
+
/** Komunikat o zbyt dużym pliku; walidacja rozmiaru nie ma sensu w schemie. */
|
|
1297
|
+
protected readonly sizeError: _angular_core.WritableSignal<string | null>;
|
|
1298
|
+
protected readonly urlValue: _angular_core.Signal<string>;
|
|
1299
|
+
protected readonly preview: _angular_core.Signal<string | null>;
|
|
1300
|
+
protected readonly maxLabel: _angular_core.Signal<string>;
|
|
1301
|
+
protected onFiles(files: File[]): void;
|
|
1302
|
+
protected onUrl(url: string): void;
|
|
1303
|
+
protected clear(): void;
|
|
1304
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<KptMapImageField, never>;
|
|
1305
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<KptMapImageField, "kpt-map-image-field", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "maxBytes": { "alias": "maxBytes"; "required": false; "isSignal": true; }; "files": { "alias": "files"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touch": "touch"; "files": "filesChange"; }, never, never, true, never>;
|
|
1306
|
+
}
|
|
1307
|
+
|
|
1308
|
+
/**
|
|
1309
|
+
* Namespace `google.maps`. Świadomie `any` — pełne typy przychodzą z opcjonalnego
|
|
1310
|
+
* `@types/google.maps`, a biblioteka nie może od nich zależeć przy kompilacji.
|
|
1311
|
+
*/
|
|
1312
|
+
type KptGoogleMapsApi = any;
|
|
1313
|
+
interface KptGoogleOptions {
|
|
1314
|
+
/** Klucz API z Google Cloud. Wymagany. */
|
|
1315
|
+
apiKey: string;
|
|
1316
|
+
/**
|
|
1317
|
+
* Identyfikator stylu mapy z konsoli Google (*Map management → Create Map ID*).
|
|
1318
|
+
*
|
|
1319
|
+
* **Wymagany.** Bez niego nie działa `AdvancedMarkerElement`, a znaczniki tej biblioteki
|
|
1320
|
+
* to gotowy HTML z `marker-html.ts` — starsze `Marker` nie umie go przyjąć.
|
|
1321
|
+
*/
|
|
1322
|
+
mapId: string;
|
|
1323
|
+
/** Wersja API. Domyślnie `weekly`. */
|
|
1324
|
+
version?: string;
|
|
1325
|
+
/** Język etykiet na mapie (kod ISO 639-1). Domyślnie język przeglądarki. */
|
|
1326
|
+
language?: string;
|
|
1327
|
+
/** Region wpływający na nazewnictwo i granice sporne (ISO 3166-1 alpha-2). */
|
|
1328
|
+
region?: string;
|
|
1329
|
+
/** Dolny limit zoomu. Domyślnie 2 — niżej świat powtarza się w poziomie. */
|
|
1330
|
+
minZoom?: number;
|
|
1331
|
+
/** Górny limit zoomu. Domyślnie 21. */
|
|
1332
|
+
maxZoom?: number;
|
|
1333
|
+
/** Zoom kółkiem myszy. Domyślnie włączony. */
|
|
1334
|
+
scrollWheelZoom?: boolean;
|
|
1335
|
+
}
|
|
1336
|
+
/**
|
|
1337
|
+
* Tyle z `KptGoogleOptions`, ile trzeba do wczytania samego API. Bez `mapId` — ten dotyczy
|
|
1338
|
+
* wyglądu mapy, a API potrzebują też usługi, które żadnej mapy nie rysują.
|
|
1339
|
+
*/
|
|
1340
|
+
type KptGoogleLoadOptions = Pick<KptGoogleOptions, 'apiKey' | 'version' | 'language' | 'region'>;
|
|
1341
|
+
/**
|
|
1342
|
+
* Ładuje Google Maps JavaScript API raz na aplikację. Gdy `google.maps` już istnieje — bo
|
|
1343
|
+
* aplikacja wstawiła skrypt sama albo stoi tu druga mapa — korzystamy z tego, co jest: drugie
|
|
1344
|
+
* wczytanie Google i tak odrzuca, wypisując ostrzeżenie do konsoli.
|
|
1345
|
+
*
|
|
1346
|
+
* Publiczne, bo silnik nie jest jedynym, kto tego API potrzebuje. Geokoder Google **musi**
|
|
1347
|
+
* iść przez SDK, a nie przez REST: web service `/maps/api/geocode/json` odrzuca klucze
|
|
1348
|
+
* z restrykcją `Referer` („API keys with referer restrictions cannot be used with this API"),
|
|
1349
|
+
* a to jedyna restrykcja, jaką da się sensownie nałożyć na klucz leżący w bundlu przeglądarki.
|
|
1350
|
+
* Wywołania z załadowanego SDK autoryzują się tak samo jak sama mapa.
|
|
1351
|
+
*
|
|
1352
|
+
* Adaptera geokodera biblioteka nadal nie dostarcza — tylko drogę do API, którą i tak
|
|
1353
|
+
* otwiera silnikowi. Powody stoją przy `provideKptGoogleMap` i w `llms.txt`.
|
|
1354
|
+
*/
|
|
1355
|
+
declare function loadGoogleMapsApi(options: KptGoogleLoadOptions): Promise<KptGoogleMapsApi>;
|
|
1356
|
+
/** Fabryka silnika — każda mapa dostaje własną instancję. */
|
|
1357
|
+
declare function createGoogleEngine(options: KptGoogleOptions): KptMapEngine;
|
|
1358
|
+
|
|
1359
|
+
interface KptLeafletOptions {
|
|
1360
|
+
/** Dolny limit zoomu. Domyślnie 2 — niżej świat powtarza się w poziomie. */
|
|
1361
|
+
minZoom?: number;
|
|
1362
|
+
/** Górny limit zoomu. Domyślnie 19 (tyle daje OSM). */
|
|
1363
|
+
maxZoom?: number;
|
|
1364
|
+
/** Bezwładność po przeciągnięciu. Domyślnie włączona. */
|
|
1365
|
+
inertia?: boolean;
|
|
1366
|
+
/** Zoom kółkiem myszy. Domyślnie włączony. */
|
|
1367
|
+
scrollWheelZoom?: boolean;
|
|
1368
|
+
}
|
|
1369
|
+
/** Fabryka silnika — każda mapa dostaje własną instancję. */
|
|
1370
|
+
declare function createLeafletEngine(options?: KptLeafletOptions): KptMapEngine;
|
|
1371
|
+
|
|
1372
|
+
/**
|
|
1373
|
+
* Fabryka silnika mapy. Fabryka, a nie gotowa instancja — każda mapa na stronie
|
|
1374
|
+
* potrzebuje własnego obiektu, a provider jest jeden.
|
|
1375
|
+
*/
|
|
1376
|
+
declare const KPT_MAP_ENGINE: InjectionToken<KptMapEngineFactory>;
|
|
1377
|
+
/**
|
|
1378
|
+
* Silnik Leaflet + OpenStreetMap. Wymaga zainstalowanej paczki `leaflet`
|
|
1379
|
+
* (zależność opcjonalna) i dołączonego `leaflet/dist/leaflet.css`.
|
|
1380
|
+
*
|
|
1381
|
+
* @example
|
|
1382
|
+
* // main.ts
|
|
1383
|
+
* bootstrapApplication(App, { providers: [provideKptLeafletMap()] });
|
|
1384
|
+
*/
|
|
1385
|
+
declare function provideKptLeafletMap(options?: KptLeafletOptions): Provider[];
|
|
1386
|
+
/**
|
|
1387
|
+
* Silnik Google Maps. Nie wymaga żadnej paczki npm — API dogrywa się skryptem przy pierwszej
|
|
1388
|
+
* mapie — ale wymaga klucza, konta rozliczeniowego i **`mapId`** z konsoli Google
|
|
1389
|
+
* (*Map management → Create Map ID*): bez niego znaczniki się nie pojawią.
|
|
1390
|
+
*
|
|
1391
|
+
* Różnice wobec Leafleta: `[tileUrl]` i `[attribution]` są bez znaczenia (kafle i atrybucję
|
|
1392
|
+
* dostarcza Google i nie wolno ich zasłonić), wczytanie mapy liczy się do SKU Dynamic Maps
|
|
1393
|
+
* (10 000 miesięcznie za darmo), a zoom bywa ułamkowy.
|
|
1394
|
+
*
|
|
1395
|
+
* **To jedyny silnik, z którym wolno użyć geokodera Google.** Service Specific Terms §6.2
|
|
1396
|
+
* i §14.2 zabraniają pokazywać wyniki Geocoding API i Places API razem z mapą nie-Google,
|
|
1397
|
+
* a więc także z domyślnym Leafletem tej biblioteki.
|
|
1398
|
+
*
|
|
1399
|
+
* @example
|
|
1400
|
+
* // main.ts
|
|
1401
|
+
* providers: [provideKptGoogleMap({ apiKey: env.googleMapsKey, mapId: env.googleMapId })]
|
|
1402
|
+
*/
|
|
1403
|
+
declare function provideKptGoogleMap(options: KptGoogleOptions): Provider[];
|
|
1404
|
+
|
|
1405
|
+
/**
|
|
1406
|
+
* Źródło pozycji użytkownika. Port, a nie bezpośrednie `navigator.geolocation` — dzięki
|
|
1407
|
+
* temu Storybook i testy podstawiają stałą pozycję zamiast pytać przeglądarkę o zgodę.
|
|
1408
|
+
*/
|
|
1409
|
+
interface KptMapGeolocationPort {
|
|
1410
|
+
/**
|
|
1411
|
+
* Strumień pozycji. `null` oznacza brak odczytu (brak zgody, wyłączony GPS, SSR).
|
|
1412
|
+
* Subskrypcja rozpoczyna nasłuch, a jej zamknięcie go kończy.
|
|
1413
|
+
*/
|
|
1414
|
+
watch(options?: PositionOptions): Observable<KptMapUserPosition | null>;
|
|
1415
|
+
}
|
|
1416
|
+
declare const KPT_MAP_GEOLOCATION: InjectionToken<KptMapGeolocationPort>;
|
|
1417
|
+
/** Błąd geolokalizacji rozpoznany po kodzie — rzucany strumieniem, nie wyjątkiem. */
|
|
1418
|
+
declare class KptMapGeolocationFailure extends Error {
|
|
1419
|
+
readonly detail: KptMapGeolocationError;
|
|
1420
|
+
constructor(detail: KptMapGeolocationError);
|
|
1421
|
+
}
|
|
1422
|
+
/**
|
|
1423
|
+
* Domyślna implementacja na `navigator.geolocation.watchPosition`.
|
|
1424
|
+
*
|
|
1425
|
+
* Uwaga: Geolocation API działa wyłącznie w bezpiecznym kontekście (HTTPS albo
|
|
1426
|
+
* `localhost`). Na `http://` z adresem IP przeglądarka odmówi — to nie jest błąd mapy.
|
|
1427
|
+
*/
|
|
1428
|
+
declare class KptBrowserGeolocation implements KptMapGeolocationPort {
|
|
1429
|
+
watch(options?: PositionOptions): Observable<KptMapUserPosition | null>;
|
|
1430
|
+
}
|
|
1431
|
+
/** Stała pozycja — Storybook, testy, demo bez pytania o zgodę. */
|
|
1432
|
+
declare class KptMapGeolocationStub implements KptMapGeolocationPort {
|
|
1433
|
+
private readonly at;
|
|
1434
|
+
private readonly accuracy;
|
|
1435
|
+
constructor(at: KptLatLng, accuracy?: number);
|
|
1436
|
+
watch(): Observable<KptMapUserPosition | null>;
|
|
1437
|
+
}
|
|
1438
|
+
/**
|
|
1439
|
+
* Podstawia stałą pozycję zamiast prawdziwej geolokalizacji.
|
|
1440
|
+
*
|
|
1441
|
+
* @example
|
|
1442
|
+
* providers: [provideKptMapGeolocationStub({ lat: 52.23, lng: 21.01 })]
|
|
1443
|
+
*/
|
|
1444
|
+
declare function provideKptMapGeolocationStub(at: KptLatLng, accuracy?: number): Provider;
|
|
1445
|
+
|
|
1446
|
+
interface KptMapCountryPreset {
|
|
1447
|
+
/** Kod ISO 3166-1 alpha-2 (albo `EU` dla całego kontynentu). */
|
|
1448
|
+
code: string;
|
|
1449
|
+
center: KptLatLng;
|
|
1450
|
+
/** Zoom, przy którym kraj mieści się na typowym kontenerze (~1000×600 px). */
|
|
1451
|
+
zoom: number;
|
|
1452
|
+
bounds: KptMapBounds;
|
|
1453
|
+
}
|
|
1454
|
+
/** Kod kraju użyty, gdy aplikacja nie poda żadnego. */
|
|
1455
|
+
declare const KPT_MAP_DEFAULT_COUNTRY = "PL";
|
|
1456
|
+
/**
|
|
1457
|
+
* Zasięgi lądowe (bez terytoriów zamorskich) zaokrąglone do dwóch miejsc —
|
|
1458
|
+
* to widok startowy, nie granica administracyjna.
|
|
1459
|
+
*/
|
|
1460
|
+
declare const KPT_MAP_COUNTRIES: Record<string, KptMapCountryPreset>;
|
|
1461
|
+
/** Preset kraju po kodzie (wielkość liter bez znaczenia); `undefined`, gdy nieznany. */
|
|
1462
|
+
declare function countryPreset(code: string): KptMapCountryPreset | undefined;
|
|
1463
|
+
/** Kody wszystkich presetów — do listy wyboru w aplikacji. */
|
|
1464
|
+
declare function countryCodes(): string[];
|
|
1465
|
+
/**
|
|
1466
|
+
* Widok startowy: preset kraju, a przy nieznanym kodzie preset domyślny.
|
|
1467
|
+
* Zawsze zwraca coś sensownego — mapa nigdy nie startuje na `[0, 0]`.
|
|
1468
|
+
*/
|
|
1469
|
+
declare function resolveCountryView(code: string | null | undefined): KptMapCountryPreset;
|
|
1470
|
+
/** Środek prostokąta kraju — pomocnicze przy własnych `bounds`. */
|
|
1471
|
+
declare function centerOfBounds(bounds: KptMapBounds): KptLatLng;
|
|
1472
|
+
|
|
1473
|
+
/** Bok kafla w pikselach — stała obu silników. */
|
|
1474
|
+
declare const KPT_TILE_SIZE = 256;
|
|
1475
|
+
/**
|
|
1476
|
+
* Granica szerokości w Mercatorze. Powyżej niej projekcja ucieka do nieskończoności,
|
|
1477
|
+
* więc obie biblioteki przycinają świat dokładnie w tym miejscu.
|
|
1478
|
+
*/
|
|
1479
|
+
declare const KPT_MAX_LATITUDE = 85.05112877980659;
|
|
1480
|
+
/** Promień Ziemi w metrach (sfera, jak w Leaflet `L.CRS.Earth`). */
|
|
1481
|
+
declare const KPT_EARTH_RADIUS = 6378137;
|
|
1482
|
+
/** Przycina szerokość do zakresu obsługiwanego przez Mercator. */
|
|
1483
|
+
declare function clampLat(lat: number): number;
|
|
1484
|
+
/**
|
|
1485
|
+
* Zawija długość geograficzną do zakresu [-180, 180].
|
|
1486
|
+
*
|
|
1487
|
+
* Wartości już w zakresie wracają nietknięte — także -180, bo w projekcji jest to
|
|
1488
|
+
* lewa krawędź świata (x = 0), a nie ta sama kolumna pikseli co +180. Zawijanie
|
|
1489
|
+
* dotyczy wyłącznie tego, co wychodzi poza zakres: 540° to ten sam południk co 180°.
|
|
1490
|
+
*/
|
|
1491
|
+
declare function normalizeLng(lng: number): number;
|
|
1492
|
+
/** Liczba pikseli świata na danym zoomie. */
|
|
1493
|
+
declare function worldSize(zoom: number): number;
|
|
1494
|
+
/** Współrzędne → piksele świata na danym zoomie (origin w lewym górnym rogu). */
|
|
1495
|
+
declare function project(at: KptLatLng, zoom: number): KptMapPoint;
|
|
1496
|
+
/** Piksele świata → współrzędne. Odwrotność `project`. */
|
|
1497
|
+
declare function unproject(point: KptMapPoint, zoom: number): KptLatLng;
|
|
1498
|
+
/** Najmniejszy prostokąt obejmujący wszystkie punkty. Pusta lista → `null`. */
|
|
1499
|
+
declare function boundsOf(points: readonly KptLatLng[]): KptMapBounds | null;
|
|
1500
|
+
/**
|
|
1501
|
+
* Najmniejszy zasięg w stopniach, przy którym `fitBounds` ma jeszcze sens (~100 m).
|
|
1502
|
+
*
|
|
1503
|
+
* Geokodery obrysowują pojedynczy adres prostokątem rzędu 0,0001°. Wpasowanie takiego
|
|
1504
|
+
* w kadr wjeżdża na górny limit zoomu, a wynik zależy od tego, jak dostawca obrysował
|
|
1505
|
+
* budynek — dwa sąsiednie adresy lądują w różnych przybliżeniach.
|
|
1506
|
+
*/
|
|
1507
|
+
declare const KPT_MIN_FIT_SPAN = 0.001;
|
|
1508
|
+
/**
|
|
1509
|
+
* Czy prostokąt warto wpasowywać w kadr, zamiast potraktować go jak punkt.
|
|
1510
|
+
*
|
|
1511
|
+
* `false` dla zasięgu zdegenerowanego albo ciaśniejszego niż `minSpan` w OBU osiach —
|
|
1512
|
+
* długa, wąska ulica ma jeden wymiar mikroskopijny i dalej zasługuje na `fitBounds`.
|
|
1513
|
+
*/
|
|
1514
|
+
declare function isFittableBounds(bounds: KptMapBounds, minSpan?: number): boolean;
|
|
1515
|
+
/** Środek prostokąta. */
|
|
1516
|
+
declare function boundsCenter(bounds: KptMapBounds): KptLatLng;
|
|
1517
|
+
/** Czy punkt leży w prostokącie (granice włącznie). */
|
|
1518
|
+
declare function boundsContain(bounds: KptMapBounds, at: KptLatLng): boolean;
|
|
1519
|
+
/** Rozszerza prostokąt o zadaną liczbę stopni w każdą stronę. */
|
|
1520
|
+
declare function padBounds(bounds: KptMapBounds, degrees: number): KptMapBounds;
|
|
1521
|
+
/** Odległość po wielkim kole w metrach. */
|
|
1522
|
+
declare function haversine(a: KptLatLng, b: KptLatLng): number;
|
|
1523
|
+
/**
|
|
1524
|
+
* Ile metrów przypada na piksel na danej szerokości i zoomie.
|
|
1525
|
+
* Potrzebne, żeby krąg dokładności geolokalizacji miał realny promień.
|
|
1526
|
+
*/
|
|
1527
|
+
declare function metersPerPixel(lat: number, zoom: number): number;
|
|
1528
|
+
/**
|
|
1529
|
+
* Największy zoom, przy którym `bounds` mieści się w kontenerze o zadanym rozmiarze.
|
|
1530
|
+
* Zwraca liczbę zmiennoprzecinkową — zaokrąglenie w dół zostawiamy wołającemu.
|
|
1531
|
+
*/
|
|
1532
|
+
declare function zoomForBounds(bounds: KptMapBounds, size: {
|
|
1533
|
+
width: number;
|
|
1534
|
+
height: number;
|
|
1535
|
+
}, paddingPx?: number): number;
|
|
1536
|
+
|
|
1537
|
+
/** Rola koloru → zmienna CSS. Gotowe `var(--kpt-*)` przechodzi bez zmian. */
|
|
1538
|
+
declare function colorVarOf(color: KptMapColor): string;
|
|
1539
|
+
/** Kolor treści na tle `color` — dla ról znany, dla własnych zmiennych fallback na biel tokenową. */
|
|
1540
|
+
declare function contrastVarOf(color: KptMapColor): string;
|
|
1541
|
+
declare function foregroundVarOf(color: KptMapColor): string;
|
|
1542
|
+
interface KptMarkerHtmlInput {
|
|
1543
|
+
shape?: KptMapMarkerShape;
|
|
1544
|
+
color: KptMapColor;
|
|
1545
|
+
/** Inner-SVG ikony (bez wrappera `<svg>`); bez niego znacznik nie ma glifu. */
|
|
1546
|
+
iconSvgInner?: string;
|
|
1547
|
+
/** Tekst dla czytnika ekranu — zwykle tytuł lokalizacji. */
|
|
1548
|
+
label: string;
|
|
1549
|
+
/** Znacznik wybrany (otwarty popup) — dostaje klasę modyfikującą. */
|
|
1550
|
+
selected?: boolean;
|
|
1551
|
+
}
|
|
1552
|
+
declare function renderMarkerHtml(input: KptMarkerHtmlInput): string;
|
|
1553
|
+
interface KptClusterHtmlInput {
|
|
1554
|
+
count: number;
|
|
1555
|
+
color: KptMapColor;
|
|
1556
|
+
/** Gotowy tekst dla czytnika (i18n rozwiązane po stronie Angulara). */
|
|
1557
|
+
label: string;
|
|
1558
|
+
}
|
|
1559
|
+
/** Koło z licznikiem; rozmiar rośnie schodkowo z liczebnością grupy. */
|
|
1560
|
+
declare function renderClusterHtml(input: KptClusterHtmlInput): string;
|
|
1561
|
+
/** Próg wielkości grupy — trzy stopnie wystarczą, żeby zobaczyć różnicę bez skalowania ciągłego. */
|
|
1562
|
+
declare function clusterTier(count: number): 'sm' | 'md' | 'lg';
|
|
1563
|
+
/** Znacznik pozycji użytkownika — ikona podawana z zewnątrz, jak przy zwykłym znaczniku. */
|
|
1564
|
+
declare function renderUserMarkerHtml(input: {
|
|
1565
|
+
label: string;
|
|
1566
|
+
iconSvgInner?: string;
|
|
1567
|
+
}): string;
|
|
1568
|
+
|
|
1569
|
+
/**
|
|
1570
|
+
* Dystans po ludzku: poniżej kilometra w metrach zaokrąglonych do dziesiątek,
|
|
1571
|
+
* wyżej w kilometrach z jednym miejscem po przecinku (`6,2 km` w `pl-PL`).
|
|
1572
|
+
*
|
|
1573
|
+
* Wartość ujemna albo nieskończona daje `null` — wołający chowa wtedy wiersz,
|
|
1574
|
+
* zamiast malować „NaN km".
|
|
1575
|
+
*/
|
|
1576
|
+
declare function formatDistance(metres: number | null | undefined, locale: string): string | null;
|
|
1577
|
+
/** Współrzędne do wiersza karty — pięć miejsc po przecinku to ok. metr. */
|
|
1578
|
+
declare function formatLatLng(at: {
|
|
1579
|
+
lat: number;
|
|
1580
|
+
lng: number;
|
|
1581
|
+
}, digits?: number): string;
|
|
1582
|
+
|
|
1583
|
+
export { KPT_CLUSTER_DEFAULTS, KPT_EARTH_RADIUS, KPT_MAP_COUNTRIES, KPT_MAP_DEFAULT_ATTRIBUTION, KPT_MAP_DEFAULT_COUNTRY, KPT_MAP_DEFAULT_TILE_URL, KPT_MAP_ENGINE, KPT_MAP_GEOCODER, KPT_MAP_GEOLOCATION, KPT_MAX_LATITUDE, KPT_MIN_FIT_SPAN, KPT_TILE_SIZE, KptBrowserGeolocation, KptMap, KptMapCreateDialog, KptMapCreateFormTemplate, KptMapGeocoderStub, KptMapGeolocationFailure, KptMapGeolocationStub, KptMapHoursField, KptMapImageField, KptMapLegend, KptMapPoiCard, KptMapPopupTemplate, KptMapSearch, KptNominatimGeocoder, boundsCenter, boundsContain, boundsOf, centerOfBounds, clampLat, clusterLocations, clusterTier, colorVarOf, contrastVarOf, countByCategory, countryCodes, countryPreset, createGoogleEngine, createLeafletEngine, dominantCategory, emptyWeek, foregroundVarOf, formatDistance, formatLatLng, formatTime, groupWeek, haversine, isAlwaysOpen, isCluster, isFittableBounds, isOpenAt, isSplittable, isoWeekday, loadGoogleMapsApi, metersPerPixel, nextChange, normalizeLng, padBounds, parseTime, project, provideKptGoogleMap, provideKptLeafletMap, provideKptMapGeocoderStub, provideKptMapGeolocationStub, provideKptNominatimGeocoder, renderClusterHtml, renderMarkerHtml, renderUserMarkerHtml, resolveCountryView, unproject, weekdayName, worldSize, zoomForBounds };
|
|
1584
|
+
export type { KptClusterOptions, KptGoogleLoadOptions, KptGoogleMapsApi, KptGoogleOptions, KptLatLng, KptLeafletOptions, KptMapAddress, KptMapAddressPart, KptMapBounds, KptMapCategory, KptMapCluster, KptMapClusterEntry, KptMapColor, KptMapColorRole, KptMapCountryPreset, KptMapCreateEvent, KptMapCreateFormApi, KptMapCreateFormContext, KptMapDayHours, KptMapEngine, KptMapEngineEvents, KptMapEngineFactory, KptMapEngineInit, KptMapEngineKind, KptMapFieldDef, KptMapFieldOption, KptMapFieldType, KptMapGeocoderPort, KptMapGeocoderStubOptions, KptMapGeolocationError, KptMapGeolocationErrorKind, KptMapGeolocationPort, KptMapHoursGroup, KptMapHoursRange, KptMapLocation, KptMapMarkerShape, KptMapOpeningHours, KptMapPoi, KptMapPoiFact, KptMapPoint, KptMapPointerEvent, KptMapPopupContext, KptMapRenderedMarker, KptMapSearchOptions, KptMapSearchResult, KptMapSuggestion, KptMapUserPosition, KptMapView, KptMapWeekday, KptNominatimOptions };
|
|
1585
|
+
//# sourceMappingURL=konce-pt-angular-map.d.ts.map
|