@twinmatrix/spatialverse-sdk-rn 0.2.1 → 0.2.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@twinmatrix/spatialverse-sdk-rn",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "SpatialVerse map engine SDK for React Native",
5
5
  "main": "lib/cjs/index.js",
6
6
  "module": "lib/esm/index.js",
@@ -29,7 +29,8 @@
29
29
  "build": "npm-run-all -l clean -p build:esm build:cjs declarations",
30
30
  "build:all": "npm-run-all -l clean -p build:esm build:cjs build:bundles declarations",
31
31
  "prepublishOnly": "npm run build",
32
- "test": "jest"
32
+ "test": "cross-env BABEL_ENV=test jest --config jest.config.cjs",
33
+ "test:live-multi-where": "cross-env BABEL_ENV=test jest --config jest.config.cjs src/meta-atlas-sdk-rn/MetaAtlasCore/__tests__/scenario/live-multi-where-nav.test.ts --testTimeout=180000"
33
34
  },
34
35
  "repository": {
35
36
  "type": "git",
@@ -81,27 +82,29 @@
81
82
  },
82
83
  "dependencies": {
83
84
  "@dagrejs/graphlib": "^2.2.4",
85
+ "@turf/along": "6.5.0",
84
86
  "@turf/area": "6.5.0",
87
+ "@turf/bbox": "6.5.0",
85
88
  "@turf/bearing": "6.5.0",
89
+ "@turf/boolean-disjoint": "6.5.0",
86
90
  "@turf/boolean-point-in-polygon": "6.5.0",
87
91
  "@turf/center": "6.5.0",
88
92
  "@turf/distance": "6.5.0",
89
93
  "@turf/helpers": "6.5.0",
90
94
  "@turf/invariant": "6.5.0",
91
95
  "@turf/length": "6.5.0",
96
+ "@turf/line-intersect": "6.5.0",
97
+ "@turf/line-slice": "6.5.0",
92
98
  "@turf/line-slice-along": "6.5.0",
93
99
  "@turf/meta": "6.5.0",
94
100
  "@turf/nearest-point-on-line": "6.5.0",
95
101
  "@turf/rhumb-bearing": "6.5.0",
96
102
  "@turf/transform-translate": "6.5.0",
97
- "@turf/boolean-disjoint": "6.5.0",
98
- "@turf/line-slice": "6.5.0",
99
- "@turf/line-intersect": "6.5.0",
100
- "@turf/bbox": "6.5.0",
101
103
  "@types/mapbox__mapbox-gl-draw": "^1.3.3",
102
104
  "base-64": "^1.0.0",
103
105
  "geojson": "^0.5.0",
104
106
  "geojson-path-finder": "^2.0.1",
107
+ "geojson-rbush": "^3.2.0",
105
108
  "lodash": "git+https://github.com/TwinMatrixOrg/lodash.git#4cf78bf2e3c982a3ad6f4236bf45a958210bb6ee",
106
109
  "ngraph.graph": "^20.0.1",
107
110
  "ngraph.path": "^1.3.1",
@@ -121,7 +124,9 @@
121
124
  "react-native-aes-crypto": "3.2.1",
122
125
  "@react-native-community/netinfo": "11.4.1",
123
126
  "react-native-geolocation-service": "5.3.1",
124
- "react-native-gesture-handler": "2.28.0"
127
+ "react-native-compass-heading": "2.0.2",
128
+ "react-native-gesture-handler": "2.28.0",
129
+ "expo-sensors": "15.0.8"
125
130
  },
126
131
  "overrides": {
127
132
  "chalk@2": {
@@ -1,68 +1,475 @@
1
- /**
2
- * Public TypeScript surface for `@twinmatrix/spatialverse-sdk-rn` package consumers (e.g. UI SDK).
3
- * Runtime entry is the built `lib/` output; types ship from this file.
4
- */
5
- import type { ReactNode, Ref } from 'react';
6
-
7
- export type StatusUpdateCallbackType = (loaded: boolean) => void;
8
- export type NetworkModeUpdateCallbackType = (mode: string) => void;
9
-
10
- export type FocusNode = {
11
- name: string;
12
- taxonomyPath: string;
13
- depth?: number;
14
- cameraConfigs?: unknown;
15
- bounds?: unknown;
16
- defaultFloorPath?: string;
17
- children?: FocusNode[];
18
- [key: string]: unknown;
19
- };
20
-
21
- export type FocusTree = Record<string, FocusNode>;
22
-
23
- export type MetaAtlasSDKProps = {
24
- ref?: Ref<any>;
25
- onPress?: (data: any) => void;
26
- onMoveStart?: (data: any) => void;
27
- onMove?: (data: any) => void;
28
- onMoveEnd?: (data: any) => void;
29
- onLoad?: () => void;
30
- onLoadFail?: (errorMessage: string) => void;
31
- onRoutingStatusUpdate?: StatusUpdateCallbackType;
32
- onSearchStatusUpdate?: StatusUpdateCallbackType;
33
- onNetworkModeUpdate?: NetworkModeUpdateCallbackType;
34
- onOfflineMapsStatusUpdate?: StatusUpdateCallbackType;
35
- tileserverRoleName: string;
36
- accessToken: string;
37
- secretKey: string;
38
- maxMapHeight?: number | string;
39
- isFullHeight?: boolean;
40
- children?: ReactNode;
41
- };
42
-
43
- /** Function component; return typed as `any` to avoid React 18/19 JSX element mismatches across peers. */
44
- export declare function MetaAtlasSDK(props: MetaAtlasSDKProps): any;
45
-
46
- export type MetaFeatureUiProperties = {
47
- imageUrl?: string;
48
- priceLabel?: string;
49
- badgeLabel?: string;
50
- address?: string;
51
- hoursLabel?: string;
52
- distanceLabel?: string;
53
- subtitle?: string;
54
- areaName?: string;
55
- [key: string]: unknown;
56
- };
57
-
58
- export type metaFeature = {
59
- mapObjectId?: string | number | null;
60
- name?: string | null;
61
- coordinates?: number[] | null;
62
- whereDimension?: string | null;
63
- whatDimension?: string | null;
64
- geometry?: { type?: string; coordinates?: unknown };
65
- properties?: MetaFeatureUiProperties & Record<string, unknown>;
66
- };
67
-
68
- export type MetaFeature = metaFeature;
1
+ /**
2
+ * Public TypeScript surface for `@twinmatrix/spatialverse-sdk-rn` package consumers (e.g. UI SDK).
3
+ * Runtime entry is the built `lib/` output; types ship from this file.
4
+ */
5
+ import type { ReactElement, ReactNode, Ref } from 'react';
6
+
7
+ export type StatusUpdateCallbackType = (loaded: boolean) => void;
8
+ export type NetworkModeUpdateCallbackType = (mode: string) => void;
9
+
10
+ export type FocusNode = {
11
+ name: string;
12
+ taxonomyPath: string;
13
+ depth?: number;
14
+ cameraConfigs?: unknown;
15
+ bounds?: unknown;
16
+ defaultFloorPath?: string;
17
+ children?: FocusNode[];
18
+ [key: string]: unknown;
19
+ };
20
+
21
+ export type FocusTree = Record<string, FocusNode>;
22
+
23
+ export type FocusNodeInfo = {
24
+ name: string;
25
+ whereTaxonomy: string;
26
+ depth: number;
27
+ hasChildren: boolean;
28
+ isLeaf: boolean;
29
+ };
30
+
31
+ export enum FilterType {
32
+ Name = 'title',
33
+ LocalRef = 'localRef',
34
+ WhatTaxonomy = 'dimension_what',
35
+ }
36
+
37
+ export enum LocationType {
38
+ MapObject = 'map-object',
39
+ Coordinate = 'coordinate',
40
+ }
41
+
42
+ export interface MapObjectLocation {
43
+ type: LocationType.MapObject;
44
+ mapObjectId: string;
45
+ }
46
+
47
+ export interface CoordinateLocation {
48
+ type: LocationType.Coordinate;
49
+ /** Public nav coordinates are `[lng, lat]`. */
50
+ coordinates: [number, number];
51
+ whereDimension: string;
52
+ }
53
+
54
+ export type MapLocation = MapObjectLocation | CoordinateLocation;
55
+
56
+ export enum RouteMode {
57
+ WithinTerminal = 'WithinTerminal',
58
+ ToTerminal = 'ToTerminal',
59
+ FromTerminal = 'FromTerminal',
60
+ Airside = 'Airside',
61
+ }
62
+
63
+ export type NavigationSensorKind = 'gps' | 'compass' | 'motion';
64
+
65
+ export declare const ROUTE_MODE_REQUIRED_SENSORS: Record<
66
+ RouteMode,
67
+ readonly NavigationSensorKind[]
68
+ >;
69
+
70
+ export declare function resolveRequiredSensors(
71
+ mode: RouteMode,
72
+ config?: Pick<BaseRouteConfig, 'requiredSensors'> | null,
73
+ ): readonly NavigationSensorKind[];
74
+
75
+ export interface BaseRouteConfig {
76
+ shouldAddOverviewSegment?: boolean;
77
+ shouldAddStartSegment?: boolean;
78
+ shouldAddEndSegment?: boolean;
79
+ /** When true, realtime navigation trims trailing edge-connector geometry (and its link cost) from path features. */
80
+ forRealtime?: boolean;
81
+ /**
82
+ * Sensors this live-nav session must request. When omitted, the SDK uses
83
+ * {@link ROUTE_MODE_REQUIRED_SENSORS} for the current {@link RouteMode}.
84
+ */
85
+ requiredSensors?: readonly NavigationSensorKind[];
86
+ }
87
+
88
+ export interface WithinTerminalConfig extends BaseRouteConfig {
89
+ wheelChairAccessible?: boolean;
90
+ }
91
+
92
+ export interface ToTerminalConfig extends BaseRouteConfig {
93
+ departureDate: string;
94
+ departureTime: string;
95
+ wheelChairAccessible?: boolean;
96
+ }
97
+
98
+ export interface FromTerminalConfig extends BaseRouteConfig {
99
+ departureDate: string;
100
+ departureTime: string;
101
+ wheelChairAccessible?: boolean;
102
+ }
103
+
104
+ export interface VehicleType {
105
+ id: string;
106
+ name: string;
107
+ navigationTemplateType: string;
108
+ allowedRoadwayCategories: string[];
109
+ customProperties: Record<string, string>;
110
+ defaults?: unknown;
111
+ }
112
+
113
+ export interface AirsideConfig extends BaseRouteConfig {
114
+ vehicleType: VehicleType;
115
+ distanceThreshold?: number;
116
+ }
117
+
118
+ export type RoutingConfig =
119
+ | WithinTerminalConfig
120
+ | ToTerminalConfig
121
+ | FromTerminalConfig
122
+ | AirsideConfig;
123
+
124
+ export interface RouteSegment {
125
+ maneuverType: string;
126
+ coordinates: number[][];
127
+ distance: number;
128
+ time: number;
129
+ [key: string]: unknown;
130
+ }
131
+
132
+ export interface Route {
133
+ segments: RouteSegment[];
134
+ walkingDistance: number;
135
+ transportDistance: number;
136
+ walkingTime: number;
137
+ transportTime: number;
138
+ distanceUnit: string;
139
+ speed: number;
140
+ }
141
+
142
+ export type NavigationLocMode = 'gps' | 'pdr';
143
+
144
+ export type NavigationUIHandlers = {
145
+ onSegmentIndexChange?: (index: number) => void;
146
+ onNavigationStart?: () => void;
147
+ onNavigationStop?: () => void;
148
+ onNavigationLocModeChange?: (mode: NavigationLocMode, deadZoneId?: string) => void;
149
+ onAnchorGpsBlendChange?: (active: boolean, blendW: number) => void;
150
+ onProgressUpdate?: (data: {
151
+ remainingTime: number;
152
+ remainingDistance: number;
153
+ segmentRemainingDistance?: number;
154
+ }) => void;
155
+ onBearingUpdate?: (bearing: number) => void;
156
+ onReroute?: (route: Route) => void;
157
+ onSnapStateChange?: (snapped: boolean) => void;
158
+ onNavigationComplete?: () => void;
159
+ };
160
+
161
+ export type RecenterCameraOptions = {
162
+ /** When true, reset to the default navigation camera zoom instead of the map's current zoom. */
163
+ useDefaultZoom?: boolean;
164
+ };
165
+
166
+ export type SdkMode = 'normal' | 'navigation';
167
+ export type CameraFollowOwner = 'gps' | 'navigation';
168
+
169
+ /** Mode-aware camera-follow state for UI. */
170
+ export type CameraFollowState = {
171
+ mode: SdkMode;
172
+ owner: CameraFollowOwner;
173
+ isFollowing: boolean;
174
+ /** Normal GPS mode only: map camera is rotating to device heading. */
175
+ followsHeading?: boolean;
176
+ };
177
+
178
+ export type NavigationStartErrorCode =
179
+ | 'UNSUPPORTED_ROUTE_MODE'
180
+ | 'MISSING_ROUTING_DATA'
181
+ | 'NOT_READY';
182
+
183
+ export declare class NavigationStartError extends Error {
184
+ readonly code: NavigationStartErrorCode;
185
+ readonly mode: RouteMode;
186
+ readonly missing: readonly string[];
187
+ constructor(
188
+ code: NavigationStartErrorCode,
189
+ mode: RouteMode,
190
+ message?: string,
191
+ missing?: readonly string[],
192
+ );
193
+ }
194
+
195
+ export type StartNavigationOptions = {
196
+ userWhereDimension: string;
197
+ useInternalGPS?: boolean;
198
+ /**
199
+ * Explicit `[lng, lat]` seed for start-anchor PDR. Wins over
200
+ * {@link useStartPositionAsAnchor}.
201
+ */
202
+ startAnchorLngLat?: [number, number];
203
+ /**
204
+ * When true and {@link startAnchorLngLat} is omitted, seed start-anchor PDR from the
205
+ * live GPS start fix. When false/omitted, start in GPS mode (no start-anchor PDR).
206
+ */
207
+ useStartPositionAsAnchor?: boolean;
208
+ };
209
+
210
+ export type StartNavigationFromCoordinatesOptions = {
211
+ startWhereDimension: string;
212
+ useInternalGPS?: boolean;
213
+ startAnchorLngLat?: [number, number];
214
+ /** Same semantics as {@link StartNavigationOptions.useStartPositionAsAnchor}. */
215
+ useStartPositionAsAnchor?: boolean;
216
+ };
217
+
218
+ export type GPSPosition = {
219
+ coordinates: [number, number];
220
+ accuracy: number;
221
+ timestamp: number;
222
+ heading?: number;
223
+ speed?: number;
224
+ altitude?: number;
225
+ altitudeAccuracy?: number;
226
+ };
227
+
228
+ export type WhereTaxonomyProposal =
229
+ | {
230
+ kind: 'altitude';
231
+ whereTaxonomyPath: string;
232
+ id: string;
233
+ autoAcceptCooldownMs: number;
234
+ }
235
+ | {
236
+ kind: 'portal';
237
+ whereTaxonomyPath: string;
238
+ id: string;
239
+ autoAcceptCooldownMs: number;
240
+ portal: {
241
+ segmentIndex?: number;
242
+ instructionLine?: string;
243
+ portalName?: string;
244
+ description?: string;
245
+ };
246
+ };
247
+
248
+ export type AutoFocusManager = {
249
+ start: () => void;
250
+ stop: () => void;
251
+ acceptProposal: (id: string) => void;
252
+ rejectProposal: (id: string) => void;
253
+ manualOverride: (id: string, whereTaxonomyPath: string) => void;
254
+ notifyManualFloorChange: (
255
+ whereTaxonomyPath: string,
256
+ shouldMoveCamera?: boolean,
257
+ ) => void;
258
+ resetPortalProposalSuppression: () => void;
259
+ proposeFromNavigation: (params: {
260
+ whereTaxonomyPath: string;
261
+ portalDedupeKey: string;
262
+ portal: {
263
+ segmentIndex?: number;
264
+ instructionLine?: string;
265
+ portalName?: string | null;
266
+ description?: string | null;
267
+ };
268
+ }) => boolean;
269
+ getLastAcceptedTaxonomyPath: () => string | null;
270
+ };
271
+
272
+ export type TaxonomyUpdatePortalMeta = Extract<
273
+ WhereTaxonomyProposal,
274
+ { kind: 'portal' }
275
+ >['portal'];
276
+
277
+ export type TaxonomyUpdateStoreState = {
278
+ pendingWhere: string;
279
+ proposalId: string | null;
280
+ proposalKind: 'altitude' | 'portal' | null;
281
+ portalMeta: TaxonomyUpdatePortalMeta | null;
282
+ isAwaitingDecision: boolean;
283
+ showTaxonomyUpdatePopup: boolean;
284
+ autoAcceptCooldownMs: number;
285
+ openProposal: (proposal: WhereTaxonomyProposal) => void;
286
+ clearProposal: () => void;
287
+ acceptProposal: () => void;
288
+ rejectProposal: () => void;
289
+ manualOverride: (whereTaxonomyPath: string) => void;
290
+ };
291
+
292
+ /** Vanilla Zustand store (`getState` / `subscribe` / `setState`). One per map instance. */
293
+ export type TaxonomyUpdateStore = {
294
+ getState: () => TaxonomyUpdateStoreState;
295
+ setState: (
296
+ partial:
297
+ | TaxonomyUpdateStoreState
298
+ | Partial<TaxonomyUpdateStoreState>
299
+ | ((
300
+ state: TaxonomyUpdateStoreState,
301
+ ) => TaxonomyUpdateStoreState | Partial<TaxonomyUpdateStoreState>),
302
+ replace?: boolean,
303
+ ) => void;
304
+ subscribe: (
305
+ listener: (
306
+ state: TaxonomyUpdateStoreState,
307
+ prevState: TaxonomyUpdateStoreState,
308
+ ) => void,
309
+ ) => () => void;
310
+ };
311
+
312
+ export type MetaAtlasSDKHandle = {
313
+ getZoom: () => Promise<number | null>;
314
+ getCenter: () => Promise<number[] | null>;
315
+ getBearing: () => Promise<number | null>;
316
+ moveTo: (coordinates: number[], animationDuration: number) => void;
317
+ zoomTo: (zoomLevel: number, animationDuration: number) => void;
318
+ /** Focus a where-taxonomy. Pass `moveCamera: false` to filter layers without a camera move. */
319
+ focusTo: (dimensionWhere: string, moveCamera?: boolean) => void;
320
+ /**
321
+ * Focus the building currently in the viewport. Keys are building taxonomyPath or
322
+ * name; values are the default floor where-taxonomy to commit without moving the camera.
323
+ */
324
+ changeTerminalInFocusToUserViewpoint: (
325
+ defaultFloors?: Record<string, string>,
326
+ ) => Promise<void>;
327
+ subscribeToFocusChange: (
328
+ callback: (whereTaxonomyPath: string) => void,
329
+ ) => () => void;
330
+ flyTo: (
331
+ config: {
332
+ center: number[] | null;
333
+ zoomLevel?: number | null;
334
+ bearing?: number | null;
335
+ },
336
+ persistPins?: boolean,
337
+ ) => Promise<void>;
338
+ getFocusTree: () => FocusTree;
339
+ getWhatTaxonomies: () => string[];
340
+ getCurrentFocus: () => string;
341
+ getCurrentFocusBuilding: () => FocusNode | null;
342
+ getCurrentFocusFloor: () => FocusNode | null;
343
+ getLastClickedFeature: () => unknown;
344
+ getAllMapObjects: (...args: unknown[]) => unknown;
345
+ getMapObjectsByName: (...args: unknown[]) => unknown;
346
+ getMapObjectById: (...args: unknown[]) => unknown;
347
+ dropPin: (
348
+ feature: unknown,
349
+ element: ReactElement,
350
+ replaceLast?: boolean,
351
+ ) => Promise<string>;
352
+ clearPins: () => void;
353
+ enableGPS: (options?: unknown) => Promise<unknown> | unknown;
354
+ disableGPS: () => void;
355
+ isGPSEnabled: () => boolean | undefined;
356
+ /** Whether the camera is currently tracking the user. */
357
+ isFollowing: () => boolean | undefined;
358
+ getCameraFollowState: () => CameraFollowState;
359
+ setNormalModeHeadingCameraFollow: (enabled: boolean) => void;
360
+ isNormalModeHeadingCameraFollowEnabled: () => boolean;
361
+ isCompassEnabled: () => boolean | undefined;
362
+ triggerGPSUpdate: (position: GPSPosition) => void;
363
+
364
+ notifyManualFloorChange: (whereTaxonomyPath: string) => void;
365
+ isNavigating: () => boolean;
366
+ getTaxonomyUpdateStore: () => TaxonomyUpdateStore | null;
367
+
368
+ setRoutingMode: (mode: RouteMode) => void;
369
+ computeRoute: (
370
+ startMapObjectId: string,
371
+ endMapObjectId: string,
372
+ config: RoutingConfig,
373
+ ) => Promise<Route | undefined>;
374
+ computeRoutes: (
375
+ mapObjectIdentifiers: string[],
376
+ config: RoutingConfig,
377
+ ) => Promise<Route | undefined>;
378
+ computeRoutesFromLocation: (
379
+ startLngLat: [number, number],
380
+ startWhereDimension: string,
381
+ mapObjectIds: string[],
382
+ wheelChairAccessibleRouting?: boolean,
383
+ ) => Promise<Route | undefined>;
384
+ computeRouteFromCoordinates: (
385
+ startLngLat: [number, number],
386
+ endLngLat: [number, number],
387
+ config: AirsideConfig,
388
+ ) => Promise<Route | undefined>;
389
+
390
+ startNavigation: (
391
+ endMapObjectId: string,
392
+ config?: RoutingConfig,
393
+ handlers?: NavigationUIHandlers,
394
+ options: StartNavigationOptions,
395
+ ) => Promise<Route>;
396
+ startNavigationFromCoordinates: (
397
+ endLocation: CoordinateLocation,
398
+ config?: RoutingConfig,
399
+ handlers?: NavigationUIHandlers,
400
+ options: StartNavigationFromCoordinatesOptions,
401
+ ) => Promise<Route>;
402
+ stopNavigation: () => void;
403
+ recenter: (options?: RecenterCameraOptions) => Promise<void> | void;
404
+ /**
405
+ * Highlight a route segment for preview / live step focus.
406
+ * Requires an active route (e.g. after compute or navigation start).
407
+ */
408
+ highlightRouteSegment: (
409
+ segmentNumberToHighlight: number,
410
+ ) => Promise<void>;
411
+ /**
412
+ * Whether `[lng, lat]` is inside any focus-tree site bounds
413
+ * (SW/NE pair or polygon ring). Authoritative outside-venue check.
414
+ */
415
+ isPositionWithinBounds: (coordinates: [number, number]) => boolean;
416
+
417
+ getRootNodes: () => FocusNode[];
418
+ getChildNodes: (parentTaxonomyPath: string) => FocusNode[];
419
+ getNodesAtDepth: (
420
+ parentTaxonomyPath: string | null,
421
+ depth: number,
422
+ ) => FocusNode[];
423
+ getNodeDepth: (taxonomyPath: string) => number | null;
424
+ getSubtreeMaxRelativeDepth: (rootTaxonomyPath: string) => number;
425
+ getSelectorTierCount: (rootTaxonomyPath: string) => number;
426
+ findNodeByTaxonomy: (taxonomyPath: string) => FocusNode | null;
427
+ getAncestors: (taxonomyPath: string) => FocusNode[];
428
+ };
429
+
430
+ export type MetaAtlasSDKProps = {
431
+ ref?: Ref<MetaAtlasSDKHandle>;
432
+ onPress?: (data: any) => void;
433
+ onMoveStart?: (data: any) => void;
434
+ onMove?: (data: any) => void;
435
+ onMoveEnd?: (data: any) => void;
436
+ onLoad?: () => void;
437
+ onLoadFail?: (errorMessage: string) => void;
438
+ onRoutingStatusUpdate?: StatusUpdateCallbackType;
439
+ onSearchStatusUpdate?: StatusUpdateCallbackType;
440
+ onNetworkModeUpdate?: NetworkModeUpdateCallbackType;
441
+ onOfflineMapsStatusUpdate?: StatusUpdateCallbackType;
442
+ tileserverRoleName: string;
443
+ accessToken: string;
444
+ secretKey: string;
445
+ maxMapHeight?: number | string;
446
+ isFullHeight?: boolean;
447
+ children?: ReactNode;
448
+ };
449
+
450
+ /** Function component; return typed as `any` to avoid React 18/19 JSX element mismatches across peers. */
451
+ export declare function MetaAtlasSDK(props: MetaAtlasSDKProps): any;
452
+
453
+ export type MetaFeatureUiProperties = {
454
+ imageUrl?: string;
455
+ priceLabel?: string;
456
+ badgeLabel?: string;
457
+ address?: string;
458
+ hoursLabel?: string;
459
+ distanceLabel?: string;
460
+ subtitle?: string;
461
+ areaName?: string;
462
+ [key: string]: unknown;
463
+ };
464
+
465
+ export type metaFeature = {
466
+ mapObjectId?: string | number | null;
467
+ name?: string | null;
468
+ coordinates?: number[] | null;
469
+ whereDimension?: string | null;
470
+ whatDimension?: string | null;
471
+ geometry?: { type?: string; coordinates?: unknown };
472
+ properties?: MetaFeatureUiProperties & Record<string, unknown>;
473
+ };
474
+
475
+ export type MetaFeature = metaFeature;