@geolibre/core 3.3.0 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -994,7 +994,11 @@ interface LayerStyle {
994
994
  markerShape: MarkerShape;
995
995
  markerColor: string;
996
996
  markerSize: number;
997
- /** Raw SVG markup (or a data URL) used when {@link markerShape} is `"custom"`. */
997
+ /**
998
+ * The custom marker image used when {@link markerShape} is `"custom"`: raw
999
+ * SVG markup, a `data:` URL (SVG or a raster PNG/JPEG/GIF), or an `http(s)`
1000
+ * URL. Only SVG sources take {@link markerColor}; raster images draw as-is.
1001
+ */
998
1002
  markerSvg: string;
999
1003
  /**
1000
1004
  * When true, per-feature [simplestyle-spec](https://github.com/mapbox/simplestyle-spec)
@@ -1228,6 +1232,15 @@ interface AttributeFormFieldConfig {
1228
1232
  required?: boolean;
1229
1233
  /** Dropdown entries for the `valueMap` widget. */
1230
1234
  valueMap?: AttributeFormValueMapEntry[];
1235
+ /**
1236
+ * Declared storage type of the field. When set, coercion follows it instead
1237
+ * of guessing from the value map (a text field whose codes are "1" and "2"
1238
+ * still stores strings), and validation rejects values of another type or,
1239
+ * for `integer`, fractional numbers. Service-derived configs (ArcGIS domains)
1240
+ * set it from the field's declared type; designer-authored configs leave it
1241
+ * unset.
1242
+ */
1243
+ valueType?: "string" | "number" | "integer";
1231
1244
  /** Lower bound for `number`/`range` widgets (inclusive). */
1232
1245
  min?: number;
1233
1246
  /** Upper bound for `number`/`range` widgets (inclusive). */
@@ -1973,6 +1986,11 @@ interface MapPreferences {
1973
1986
  showPointerElevation: boolean;
1974
1987
  /** Whether the built-in 3D terrain control and terrain surface are enabled. */
1975
1988
  terrainEnabled: boolean;
1989
+ /**
1990
+ * Optional Cesium Ion terrain asset used by the globe when terrain is enabled.
1991
+ * Ignored by 2D renderers; absent means the renderer's normal global source.
1992
+ */
1993
+ terrainIonAssetId?: number;
1976
1994
  /** Mapbox-only style. New projects use Streets; absent follows the shared basemap. */
1977
1995
  mapboxStyleUrl?: string;
1978
1996
  /**
@@ -1983,6 +2001,14 @@ interface MapPreferences {
1983
2001
  * basemap styles service requires one.
1984
2002
  */
1985
2003
  arcgisBasemap?: string;
2004
+ /**
2005
+ * ArcGIS-only projection of the flat map, as a WKID the ArcGIS Maps SDK
2006
+ * resolves (`54099` Spilhaus, `54030` Robinson, ...). Absent means Web
2007
+ * Mercator. Vector layers are reprojected on the client; tiled layers and
2008
+ * basemaps cannot be, so they do not draw in another projection. The globe
2009
+ * (a `SceneView`) ignores it. See `arcgis-projection.ts`.
2010
+ */
2011
+ arcgisWkid?: number;
1986
2012
  /** Cesium imagery override; absent follows the shared project basemap. */
1987
2013
  cesiumBasemap?: CesiumBasemapId;
1988
2014
  /**
@@ -2401,6 +2427,40 @@ type DashboardWidgetAggregation = "count" | "sum" | "mean";
2401
2427
  * keys are simply ignored, so the record stays flat and easy to hand-edit.
2402
2428
  * Saved in the project file so a dashboard reopens with its widgets intact.
2403
2429
  */
2430
+ /**
2431
+ * A saved map view in the Bookmarks panel. Mirrors `MapBookmark` from
2432
+ * maplibre-gl-components so the panel can load it unchanged.
2433
+ */
2434
+ interface ProjectBookmark {
2435
+ /** Unique within the project. */
2436
+ id: string;
2437
+ name: string;
2438
+ /** Camera center longitude, -180..180. */
2439
+ lng: number;
2440
+ /** Camera center latitude, -90..90. */
2441
+ lat: number;
2442
+ zoom: number;
2443
+ /** Camera tilt in degrees, 0..85. */
2444
+ pitch: number;
2445
+ /** Camera rotation in degrees. */
2446
+ bearing: number;
2447
+ /** Creation time, milliseconds since the epoch. */
2448
+ createdAt: number;
2449
+ /** The {@link ProjectBookmarkGroup} it belongs to; absent when ungrouped. */
2450
+ groupId?: string;
2451
+ /**
2452
+ * Host state captured with the view. GeoLibre stores `visibleLayerIds`
2453
+ * (the layers to show when the bookmark is opened).
2454
+ */
2455
+ extra?: Record<string, unknown>;
2456
+ }
2457
+ /** A folder in the Bookmarks panel. Folders do not nest. */
2458
+ interface ProjectBookmarkGroup {
2459
+ id: string;
2460
+ name: string;
2461
+ /** Whether the folder is collapsed in the panel. */
2462
+ collapsed: boolean;
2463
+ }
2404
2464
  interface DashboardWidget {
2405
2465
  /** Stable id, unique within the project (React key and store key). */
2406
2466
  id: string;
@@ -2579,8 +2639,23 @@ interface GeoLibreProject {
2579
2639
  models?: ProcessingModel[];
2580
2640
  /** Recorded processing tool runs (Processing History; issue #1292). */
2581
2641
  processingHistory?: ProcessingRun[];
2642
+ /**
2643
+ * Object-Based Analysis workbench state and run provenance (issue #3053):
2644
+ * settings, classes, and the tool calls, parameters, seeds and engine
2645
+ * versions behind the last segmentation, measurement and classification.
2646
+ * A versioned JSON object owned by the desktop app; omitted until the
2647
+ * workbench is used.
2648
+ */
2649
+ obia?: Record<string, unknown>;
2582
2650
  /** Saved Dashboard panel chart widgets (issue #401). */
2583
2651
  widgets?: DashboardWidget[];
2652
+ /**
2653
+ * Saved map views (the Bookmarks panel), in panel order. Omitted when there
2654
+ * are none. Before #2869 these lived only in the browser's localStorage.
2655
+ */
2656
+ bookmarks?: ProjectBookmark[];
2657
+ /** Folders the {@link bookmarks} are organized into. Omitted when none. */
2658
+ bookmarkGroups?: ProjectBookmarkGroup[];
2584
2659
  /** Number of columns in the Dashboard widget grid; omitted when default. */
2585
2660
  dashboardColumns?: number;
2586
2661
  /**
@@ -3214,5 +3289,515 @@ declare function cascadeLayerJoinRefresh(layers: GeoLibreLayer[], seedId: string
3214
3289
  */
3215
3290
  declare function reapplyLayerJoins(layers: GeoLibreLayer[]): GeoLibreLayer[];
3216
3291
  //#endregion
3217
- export { BLANK_BASEMAP as $, QuickFilterKind as $n, LayerPopupConfig as $t, PlanetaryBasemap as A, OPENFREEMAP_BASEMAPS as An, isDefaultPrintLayout as Ar, FieldVisibility as At, getEllipsoid as B, ProcessingModelGraph as Bn, Point as Br, LabelDedupe as Bt, ELLIPSOIDS as C, ModelGraphNode as Cn, styleValue as Cr, DashboardWidget as Ct, PLANETARY_BASEMAP_GROUPS as D, ModelToolProvider as Dn, PrintLayoutLegendEntry as Dr, DiagramSizeMode as Dt, PLANETARY_BASEMAPS as E, ModelPortKind as En, PrintLayoutCorner as Er, DiagramField as Et, earthLengthToBody as F, PopupDateFormat as Fn, Feature as Fr, GeometryGeneratorType as Ft, AddTileLayerOptions as G, ProcessingRunStatus as Gn, availableCesiumBasemap as Gr, LayerDescriptiveMetadata as Gt, getPlanetaryBasemapByStyleUrl as H, ProcessingRerunRequest as Hn, CESIUM_BASEMAPS as Hr, LabelTransform as Ht, getActiveBodyRadiusRatio as I, PopupFieldConfig as In, FeatureCollection as Ir, IndicatorAggregation as It, AppRole as J, ProjectPluginControlPosition as Jn, sameCesiumImagery as Jr, LayerJoinStats as Jt, AppCapabilities as K, ProjectComment as Kn, basemapToCesiumImagery as Kr, LayerGroup as Kt, getActiveEllipsoid as L, PopupFieldFormat as Ln, Geometry as Lr, LARGE_VECTOR_FEATURE_THRESHOLD as Lt, PlanetaryBasemapSectionId as M, PROTOMAPS_BASEMAPS as Mn, printLayoutConfigsEqual as Mr, GeoLibreLayer as Mt, bodyLengthToEarth as N, ParticipantIdentity as Nn, scrubPrintLayoutForLayers as Nr, GeoLibreProject as Nt, PLANETARY_BASEMAP_SENTINEL_PREFIX as O, NETCDF_IMAGE_SOURCE_KIND as On, PrintLayoutPageFilter as Or, DiagramType as Ot, earthAreaToBody as P, PointRenderer as Pn, scrubPrintLayoutForRemovedLayers as Pr, GeocodingPreferences as Pt, AttributeFormWidget as Q, QuickFilterDateKind as Qn, LayerMetadataTemporalExtent as Qt, getActiveMeanRadiusMeters as R, PopupFieldKind as Rn, LineString as Rr, LAYER_TYPES as Rt, EARTH_MEAN_RADIUS_METERS as S, ModelGraphEdge as Sn, shouldUseTiledRendering as Sr, DUCKDB_VECTOR_ROUTE_BYTES as St, EllipsoidId as T, ModelGraphPort as Tn, PrintLayoutConfig as Tr, DashboardWidgetType as Tt, meanRadiusMeters as U, ProcessingRun as Un, CesiumBasemapId as Ur, LayerCapabilities as Ut, getPlanetaryBasemapById as V, ProcessingModelStep as Vn, Polygon as Vr, LabelStyle as Vt, setActiveEllipsoidId as W, ProcessingRunKind as Wn, CesiumBasemapImagery as Wr, LayerConnection as Wt, AttributeFormFieldConfig as X, ProjectPreferences as Xn, LayerMetadataContact as Xt, AttributeFormConfig as Y, ProjectPluginState as Yn, LayerLibraryEntry as Yt, AttributeFormValueMapEntry as Z, ProjectTemplateEntry as Zn, LayerMetadataLink as Zt, unescapePolyline as _, MapProjection as _n, VectorRule as _r, DEFAULT_MAP_GRID_LAYOUT as _t, collectTransitiveJoinSourceIds as a, LegendCustomEntry as an, StoryActiveSlideMode as ar, CollaborationParticipant as at, transformGeojsonElevation as b, MapViewState as bn, detectNonGeographicCoordinates as br, DEFAULT_STORY_MAP as bt, stripJoinFields as c, LegendItemOverride as cn, StoryChapterAnimation as cr, CollaborationState as ct, batchDecodePolylines as d, MAX_DASHBOARD_COLUMNS as dn, StoryLayerOpacityChange as dr, CommentReply as dt, LayerQuickFilter as en, QuickFilterTextOperator as er, BLEND_MODES as et, decodePolyline as f, MAX_MAP_GRID_DIM as fn, StoryMap as fr, DEFAULT_BASEMAP as ft, polylineStrToGeoJSON as g, MapPreferences as gn, StyleLibraryEntryKind as gr, DEFAULT_LEGEND_CONFIG as gt, geoJSONToPolylineStr as h, MapGridLayout as hn, StyleLibraryEntry as hr, DEFAULT_LAYER_STYLE as ht, cascadeLayerJoinRefresh as i, LegendConfig as in, SecondaryMapView as ir, CollaborationMode as it, PlanetaryBasemapGroup as j, PROJECT_VERSION as jn, normalizePrintLayoutConfig as jr, FillPattern as jt, PLANET_SWITCHER_OPTIONS as k, NonGeographicCoordinates as kn, createDefaultPrintLayout as kr, EditorTrackingConfig as kt, PolylineBatchOptions as l, LegendPanelPosition as ln, StoryChapterLocation as lr, CommentAnchor as lt, encodePolyline as m, MIN_DASHBOARD_COLUMNS as mn, StrokeWidthUnit as mr, DEFAULT_DASHBOARD_COLUMNS as mt, applyJoinsToLayer as n, LayerType as nn, RuntimeEnvironmentVariable as nr, CollabInvite as nt, layerJoinKey as o, LegendCustomItem as on, StoryChapter as or, CollaborationPresence as ot, decodePolylineDetailed as p, MAX_PROCESSING_HISTORY as pn, StorySlideMode as pr, DEFAULT_BLEND_MODE as pt, AppPrivilege as q, ProjectInteraction as qn, normalizeCesiumBasemap as qr, LayerJoin as qt, applyLayerJoins as r, LayerVirtualField as rn, SQL_QUERY_SOURCE_KIND as rr, CollaborationChatMessage as rt, reapplyLayerJoins as s, LegendCustomShape as sn, StoryChapterAlignment as sr, CollaborationRole as st, ApplyLayerJoinsResult as t, LayerStyle as tn, RecentProjectEntry as tr, BlendMode as tt, PolylineDecodeResult as u, LineDecoration as un, StoryInsetPosition as ur, CommentAuthor as ut, geojsonHasZCoordinates as v, MapRendererKind as vn, VectorStyleMode as vr, DEFAULT_PRIMARY_RENDERER as vt, Ellipsoid as w, ModelGraphNodeKind as wn, DEFAULT_PRINT_LAYOUT as wr, DashboardWidgetAggregation as wt, DEFAULT_ELLIPSOID_ID as x, MarkerShape as xn, isDuckDBQueryLayer as xr, DUCKDB_VECTOR_FEATURE_WARN_COUNT as xt, horizontalBbox as y, MapScaleUnit as yn, VectorStyleStop as yr, DEFAULT_PROJECT_PREFERENCES as yt, getActiveSemiMajorAxisMeters as z, ProcessingModel as zn, MultiPolygon as zr, LabelAnchor as zt };
3218
- //# sourceMappingURL=joins-CRZZcLqX.d.mts.map
3292
+ //#region src/project.d.ts
3293
+ /** Placeholder name a project carries before the user names it. */
3294
+ declare const DEFAULT_PROJECT_NAME = "Untitled Project";
3295
+ interface CreateProjectOptions {
3296
+ basemapStyleUrl?: string;
3297
+ mapView?: MapViewState;
3298
+ /** Celestial body the project describes; defaults to Earth when omitted. */
3299
+ ellipsoidId?: string;
3300
+ }
3301
+ declare function normalizeBlankBackgroundColor(value: unknown): string | null;
3302
+ declare function createDefaultMapView(): MapViewState;
3303
+ declare function createEmptyProject(name?: string, options?: CreateProjectOptions): GeoLibreProject;
3304
+ /**
3305
+ * Serialize a project to `.geolibre.json` text: indented project structure with
3306
+ * compact (unindented) embedded GeoJSON. See {@link serializeProjectValue} for
3307
+ * why the two halves are formatted differently.
3308
+ *
3309
+ * @param project Project to serialize.
3310
+ * @returns The file contents to write.
3311
+ */
3312
+ declare function serializeProject(project: GeoLibreProject): string;
3313
+ /**
3314
+ * Per-layer serialized text kept across {@link serializeProjectWithLayerCache}
3315
+ * calls, keyed by the layer record each entry was built from. A `WeakMap`, so a
3316
+ * layer the store has replaced or removed drops its text with it.
3317
+ */
3318
+ type ProjectLayerSerializationCache = WeakMap<object, {
3319
+ index: number;
3320
+ text: string;
3321
+ }>;
3322
+ /** Create an empty {@link ProjectLayerSerializationCache}. */
3323
+ declare function createProjectLayerSerializationCache(): ProjectLayerSerializationCache;
3324
+ /**
3325
+ * Serialize a project exactly as {@link serializeProject} does, reusing the
3326
+ * text of every layer whose source record is unchanged since an earlier call.
3327
+ *
3328
+ * Feature data lives inside layer records, so re-stringifying every layer on
3329
+ * each autosave costs megabytes of main-thread work for a project with large
3330
+ * GeoJSON layers — even when only the camera moved (GeoLibre#2633). The store
3331
+ * replaces a layer object whenever it changes, so object identity is a sound
3332
+ * cache key: a camera move reuses every layer, and an edit to one layer
3333
+ * re-serializes only that one.
3334
+ *
3335
+ * `layerSources[i]` must be the record `project.layers[i]` was derived from
3336
+ * (e.g. the store's `layers`, before `projectFromStore` prepared them), and that
3337
+ * derivation must depend on the record alone — as `buildProjectSnapshot`'s does
3338
+ * — or a cached entry could outlive a change it should have reflected. When the
3339
+ * two arrays differ in length the cache is bypassed rather than trusted.
3340
+ *
3341
+ * @param project Project to serialize, as built from `layerSources`.
3342
+ * @param layerSources Immutable source record for each entry of
3343
+ * `project.layers`, in the same order, used as the cache key.
3344
+ * @param cache Cache shared between calls; see
3345
+ * {@link createProjectLayerSerializationCache}.
3346
+ * @returns The same text {@link serializeProject} returns for `project`.
3347
+ */
3348
+ declare function serializeProjectWithLayerCache(project: GeoLibreProject, layerSources: readonly object[], cache: ProjectLayerSerializationCache): string;
3349
+ /**
3350
+ * {@link serializeProjectWithLayerCache} that hands the main thread back
3351
+ * between layers, so autosave on a project with several large layers is many
3352
+ * short tasks instead of one 300-400 ms freeze (GeoLibre#2869).
3353
+ *
3354
+ * The cache makes a camera move free, so the cost lands on the first autosave
3355
+ * and on edits to a big layer: each layer that misses the cache is serialized
3356
+ * in its own slice, and the thread is released once a slice has run longer than
3357
+ * a few milliseconds. A single huge layer is still one slice. The result is
3358
+ * identical to the synchronous call. `project` and `layerSources` must not be
3359
+ * mutated while this runs; the store replaces records rather than editing them,
3360
+ * so a snapshot taken from it stays valid.
3361
+ *
3362
+ * @param project Project to serialize, as built from `layerSources`.
3363
+ * @param layerSources Immutable source record for each entry of
3364
+ * `project.layers`, in the same order, used as the cache key.
3365
+ * @param cache Cache shared between calls.
3366
+ * @param yieldFn Hands the thread back; replaced in tests.
3367
+ * @returns The same text {@link serializeProject} returns for `project`.
3368
+ */
3369
+ declare function serializeProjectWithLayerCacheAsync(project: GeoLibreProject, layerSources: readonly object[], cache: ProjectLayerSerializationCache, yieldFn?: () => Promise<void>): Promise<string>;
3370
+ declare function parseProject(json: string): GeoLibreProject;
3371
+ /**
3372
+ * Coerce an untrusted (possibly hand-edited) legend config into a valid
3373
+ * {@link LegendConfig}, dropping malformed entries. Returns undefined when no
3374
+ * usable config is present so the default is applied downstream.
3375
+ */
3376
+ declare function normalizeLegendConfig(legend: unknown): LegendConfig | undefined;
3377
+ /**
3378
+ * Validate and coerce a story map loaded from an untrusted project file.
3379
+ *
3380
+ * Returns null when the value carries no chapters so empty story maps stay out
3381
+ * of the saved project, mirroring how plugins are only persisted when present.
3382
+ *
3383
+ * @param storymap Raw value read from the project JSON.
3384
+ * @returns A normalized story map, or null when there is nothing to keep.
3385
+ */
3386
+ declare function normalizeStoryMap(storymap: unknown): StoryMap | null;
3387
+ /** Whether a story map carries chapters or any non-default setting. */
3388
+ declare function storyMapHasContent(story: StoryMap): boolean;
3389
+ /**
3390
+ * Coerce an untrusted (possibly hand-edited) `models` array into valid
3391
+ * {@link ProcessingModel} records. Drops models and steps without a usable id or
3392
+ * tool id, de-duplicates models by id, and keeps step `parameters` as a plain
3393
+ * object (the runner validates parameter values per tool at run time). Returns
3394
+ * `null` when there is nothing worth persisting, so a model-less project stays
3395
+ * free of the key.
3396
+ *
3397
+ * @param value Raw `models` value from the project JSON.
3398
+ * @returns Normalized models, or `null` when none survive.
3399
+ */
3400
+ declare function normalizeModels(value: unknown): ProcessingModel[] | null;
3401
+ /**
3402
+ * Coerce an untrusted `graph` value into a {@link ProcessingModelGraph}. Drops
3403
+ * nodes without a usable id or an unknown kind, de-duplicates node ids, and
3404
+ * drops edges that do not connect two surviving nodes or that name an empty
3405
+ * port. Self-edges are dropped too, since a node cannot feed itself.
3406
+ *
3407
+ * Structural validity beyond this (cycles, type mismatches, missing required
3408
+ * inputs) is the runner's job — those depend on the tool registries, which the
3409
+ * project layer deliberately does not import.
3410
+ *
3411
+ * @param value Raw `graph` value from the project JSON.
3412
+ * @returns The normalized graph, or `null` when it has no usable nodes.
3413
+ */
3414
+ declare function normalizeModelGraph(value: unknown): ProcessingModelGraph | null;
3415
+ /**
3416
+ * Coerce an untrusted (possibly hand-edited) `processingHistory` array into
3417
+ * valid {@link ProcessingRun} records. Drops entries without a usable id, tool
3418
+ * id, or known kind, de-duplicates by id, keeps `parameters` as a plain object,
3419
+ * and caps the list at {@link MAX_PROCESSING_HISTORY} (keeping the newest,
3420
+ * i.e. last, entries). Returns `null` when nothing survives, so a history-less
3421
+ * project stays free of the key.
3422
+ *
3423
+ * @param value Raw `processingHistory` value from the project JSON.
3424
+ * @returns Normalized runs, or `null` when none survive.
3425
+ */
3426
+ /**
3427
+ * Accept the Object-Based Analysis workbench blob (`obia`) only as a plain,
3428
+ * JSON-serializable object carrying a numeric `version`. Its fields are owned
3429
+ * and validated by the desktop app, which treats anything it does not
3430
+ * recognise as absent; core only guarantees the shape survives a round trip.
3431
+ *
3432
+ * @param value Raw `obia` value from the project JSON.
3433
+ * @returns A detached copy, or `null` when absent or malformed.
3434
+ */
3435
+ declare function normalizeObiaWorkbench(value: unknown): Record<string, unknown> | null;
3436
+ declare function normalizeProcessingHistory(value: unknown): ProcessingRun[] | null;
3437
+ /**
3438
+ * Coerce an untrusted (possibly hand-edited) camera object into a valid
3439
+ * {@link MapViewState}, falling back to the default view for missing parts.
3440
+ */
3441
+ declare function normalizeMapViewState(value: unknown): MapViewState;
3442
+ /**
3443
+ * Coerce an untrusted `mapLayout` into a valid {@link MapGridLayout}. Returns
3444
+ * null when absent or effectively single-pane so default projects stay
3445
+ * byte-identical (the field is only written when the grid is larger than 1x1).
3446
+ */
3447
+ declare function normalizeMapLayout(value: unknown): MapGridLayout | null;
3448
+ /**
3449
+ * Coerce an untrusted `primaryRenderer` into a known engine id (issue #2217).
3450
+ *
3451
+ * Returns null for the default 2D map — absent, unknown, or an explicit
3452
+ * `"maplibre"` — because the field is only written when it is not the default,
3453
+ * so a MapLibre project serializes byte-identically to before this existed.
3454
+ * The return type is narrowed to `"cesium" | "mapbox" | "arcgis" | null` rather
3455
+ * than the full {@link MapRendererKind} for that reason: `"maplibre"` is never a
3456
+ * result.
3457
+ */
3458
+ declare function normalizePrimaryRenderer(value: unknown): "cesium" | "mapbox" | "arcgis" | null;
3459
+ /**
3460
+ * Coerce an untrusted `secondaryMapViews` array into valid
3461
+ * {@link SecondaryMapView} records, dropping entries without a usable id and
3462
+ * de-duplicating by id. Returns null when none are valid.
3463
+ */
3464
+ declare function normalizeSecondaryMapViews(value: unknown): SecondaryMapView[] | null;
3465
+ /**
3466
+ * Reconcile a parsed grid layout with its secondary panes so the store invariant
3467
+ * holds: `secondaryMapViews.length === rows * cols - 1`. Surplus panes are
3468
+ * dropped; missing panes are filled by cloning the primary map. A null/absent
3469
+ * layout (or a 1x1 grid) collapses to the single-map default.
3470
+ */
3471
+ declare function resolveMapGrid(layout: MapGridLayout | null, secondaryViews: SecondaryMapView[] | null, primary: {
3472
+ mapView: MapViewState;
3473
+ }): {
3474
+ mapLayout: MapGridLayout;
3475
+ secondaryMapViews: SecondaryMapView[];
3476
+ };
3477
+ /** Bookmarks kept per project, as the panel's own default limit allows. */
3478
+ declare const MAX_PROJECT_BOOKMARKS = 500;
3479
+ /**
3480
+ * Coerce an untrusted `bookmarkGroups` array into valid folders: drops entries
3481
+ * without a string id and de-duplicates by id. A missing name becomes
3482
+ * "Folder"; `collapsed` defaults to false.
3483
+ *
3484
+ * @param value Raw `bookmarkGroups` value from the project JSON.
3485
+ * @returns The folders (possibly empty).
3486
+ */
3487
+ declare function normalizeBookmarkGroups(value: unknown): ProjectBookmarkGroup[];
3488
+ /**
3489
+ * Coerce an untrusted `bookmarks` array into valid saved views: drops entries
3490
+ * without a string id or a finite, in-range camera, de-duplicates by id, wraps
3491
+ * the bearing into 0-360, and drops a `groupId` that names no folder in
3492
+ * `groups`. Keeps at most {@link MAX_PROJECT_BOOKMARKS}.
3493
+ *
3494
+ * @param value Raw `bookmarks` value from the project JSON.
3495
+ * @param groups The project's (normalized) folders.
3496
+ * @returns The bookmarks (possibly empty).
3497
+ */
3498
+ declare function normalizeBookmarks(value: unknown, groups?: readonly ProjectBookmarkGroup[]): ProjectBookmark[];
3499
+ /**
3500
+ * Coerce an untrusted (possibly hand-edited) `widgets` array into valid
3501
+ * {@link DashboardWidget} records. Drops widgets without a usable id, layer id,
3502
+ * or recognized chart type, de-duplicates by id, and keeps only the optional
3503
+ * keys that are present and well-typed (the Dashboard panel falls back to
3504
+ * sensible defaults for anything missing). Returns `null` when there is nothing
3505
+ * worth persisting, so a widget-less project stays free of the key.
3506
+ *
3507
+ * @param value Raw `widgets` value from the project JSON.
3508
+ * @returns Normalized widgets, or `null` when none survive.
3509
+ */
3510
+ declare function normalizeWidgets(value: unknown): DashboardWidget[] | null;
3511
+ /**
3512
+ * Clamp an untrusted dashboard column count into the supported range, falling
3513
+ * back to the default for a missing or non-finite value.
3514
+ *
3515
+ * @param value Raw `dashboardColumns` value from the project JSON.
3516
+ * @returns An integer column count within [MIN, MAX].
3517
+ */
3518
+ declare function normalizeDashboardColumns(value: unknown): number;
3519
+ /**
3520
+ * Coerce an untrusted `interaction` block into a {@link ProjectInteraction}.
3521
+ *
3522
+ * Layer ids are kept even when no such layer exists: the block is replayed
3523
+ * against whatever layers the project has when it opens, and the loader drops
3524
+ * the ones it cannot find. Control names are kept as written for the same
3525
+ * reason; the app ignores names it does not know.
3526
+ *
3527
+ * @param value - Raw `interaction` value from the project JSON or the store.
3528
+ * @returns The normalized block, or null when it carries nothing to apply.
3529
+ */
3530
+ declare function normalizeProjectInteraction(value: unknown): ProjectInteraction | null;
3531
+ declare function isAllowedPluginManifestUrl(url: string): boolean;
3532
+ declare function normalizeProjectComments(rawComments: unknown): ProjectComment[];
3533
+ declare function projectFromStore(state: {
3534
+ projectName: string;
3535
+ mapView: MapViewState;
3536
+ basemapStyleUrl: string;
3537
+ basemapVisible: boolean;
3538
+ basemapOpacity: number;
3539
+ blankBackgroundColor?: string | null;
3540
+ layers: GeoLibreLayer[];
3541
+ selectedLayerId?: string | null;
3542
+ layerGroups?: LayerGroup[];
3543
+ preferences: ProjectPreferences;
3544
+ plugins?: ProjectPluginState | null;
3545
+ legend?: LegendConfig | null;
3546
+ printLayout?: PrintLayoutConfig | null;
3547
+ storymap?: StoryMap | null;
3548
+ models?: ProcessingModel[] | null;
3549
+ processingHistory?: ProcessingRun[] | null;
3550
+ obia?: Record<string, unknown> | null;
3551
+ widgets?: DashboardWidget[] | null;
3552
+ bookmarks?: ProjectBookmark[] | null;
3553
+ bookmarkGroups?: ProjectBookmarkGroup[] | null;
3554
+ dashboardColumns?: number;
3555
+ mapLayout?: MapGridLayout;
3556
+ secondaryMapViews?: SecondaryMapView[];
3557
+ primaryMapLabel?: string;
3558
+ primaryRenderer?: MapRendererKind;
3559
+ /** Project-scoped Style Manager entries (the store's `projectStyleLibrary`). */
3560
+ styleLibrary?: StyleLibraryEntry[] | null;
3561
+ comments?: ProjectComment[] | null;
3562
+ /** Startup interaction state loaded with the project, written back as-is. */
3563
+ interaction?: ProjectInteraction | null;
3564
+ metadata: Record<string, unknown>;
3565
+ }): GeoLibreProject;
3566
+ /**
3567
+ * Whether a layer lives only for the current session and is never written to a
3568
+ * project file. A plugin sets `metadata.sessionOnly` on a store row that mirrors
3569
+ * something it draws itself and cannot restore, such as a point cloud streamed
3570
+ * from a short-lived signed URL, so the row shows in the Layers panel while the
3571
+ * plugin runs but a reopened project carries no dead entry for it.
3572
+ *
3573
+ * @param layer - The layer to check.
3574
+ * @returns `true` when the layer must be left out of saved projects.
3575
+ */
3576
+ declare function isSessionOnlyLayer(layer: GeoLibreLayer): boolean;
3577
+ /**
3578
+ * The plain HTTP(S) WMS template inside the desktop app's `geolibre-wms://`
3579
+ * wrapper (its CORS-exempt native fetcher), or the tile unchanged when it is
3580
+ * not wrapped or the wrapped URL is not HTTP(S). Shared by project export and
3581
+ * the ArcGIS engine's story-export templates.
3582
+ *
3583
+ * @param tile - A tile template, wrapped or not.
3584
+ * @returns The unwrapped template, or `tile` itself.
3585
+ */
3586
+ declare function portableWmsTileUrl(tile: unknown): unknown;
3587
+ /**
3588
+ * The store form of one project layer: its style completed from
3589
+ * {@link DEFAULT_LAYER_STYLE} and the project's top-level `styles` entry.
3590
+ *
3591
+ * Legacy and externally-authored projects can carry a partial top-level style
3592
+ * alongside newer fields on the layer itself. Those layer fields are kept,
3593
+ * while the top-level copy stays authoritative where it explicitly supplies a
3594
+ * value.
3595
+ *
3596
+ * @param project - The project the layer belongs to (for its `styles` map).
3597
+ * @param layer - One of `project.layers`.
3598
+ * @returns A new layer record ready for the store.
3599
+ */
3600
+ declare function hydrateProjectLayer(project: Pick<GeoLibreProject, "styles">, layer: GeoLibreLayer): GeoLibreLayer;
3601
+ declare function applyProjectToStore(project: GeoLibreProject): {
3602
+ projectName: string;
3603
+ mapView: MapViewState;
3604
+ basemapStyleUrl: string;
3605
+ basemapVisible: boolean;
3606
+ basemapOpacity: number;
3607
+ blankBackgroundColor: string | null;
3608
+ layers: GeoLibreLayer[];
3609
+ layerGroups: LayerGroup[];
3610
+ preferences: ProjectPreferences;
3611
+ projectPlugins: ProjectPluginState | null;
3612
+ legend: LegendConfig;
3613
+ printLayout: PrintLayoutConfig;
3614
+ storymap: StoryMap | null;
3615
+ models: ProcessingModel[];
3616
+ processingHistory: ProcessingRun[];
3617
+ obiaWorkbench: Record<string, unknown> | null;
3618
+ widgets: DashboardWidget[];
3619
+ bookmarks: ProjectBookmark[];
3620
+ bookmarkGroups: ProjectBookmarkGroup[];
3621
+ dashboardColumns: number;
3622
+ mapLayout: MapGridLayout;
3623
+ secondaryMapViews: SecondaryMapView[];
3624
+ primaryMapLabel: string;
3625
+ primaryRenderer: MapRendererKind;
3626
+ projectStyleLibrary: StyleLibraryEntry[];
3627
+ comments: ProjectComment[];
3628
+ projectInteraction: ProjectInteraction | null;
3629
+ metadata: Record<string, unknown>;
3630
+ };
3631
+ /**
3632
+ * Create an unlinked copy of a project, suffixed with "(copy)" by default and
3633
+ * stripped of share-specific metadata (shareId, shareUrl, etc.).
3634
+ */
3635
+ declare function detachProjectCopy(project: GeoLibreProject, options?: {
3636
+ nameSuffix?: string;
3637
+ }): GeoLibreProject;
3638
+ /**
3639
+ * Create a template snapshot of a project. Optionally strips data layers while
3640
+ * keeping basemap, layer groups, styles, legend config, preferences, widgets, and
3641
+ * print layout.
3642
+ */
3643
+ declare function createProjectTemplate(project: GeoLibreProject, options?: {
3644
+ name?: string;
3645
+ stripDataLayers?: boolean;
3646
+ }): GeoLibreProject;
3647
+ //#endregion
3648
+ //#region src/project-diff.d.ts
3649
+ /** One changed value, with bounded human-readable previews of each side. */
3650
+ interface ProjectValueChange {
3651
+ /** Dotted key path relative to the section, e.g. `fillColor` or `labels.field`. */
3652
+ path: string;
3653
+ /** Preview of the earlier value; `undefined` when the key was absent. */
3654
+ before?: string;
3655
+ /** Preview of the later value; `undefined` when the key is now absent. */
3656
+ after?: string;
3657
+ }
3658
+ /** Counts of embedded GeoJSON feature changes in one layer. */
3659
+ interface FeatureChangeSummary {
3660
+ added: number;
3661
+ removed: number;
3662
+ modified: number;
3663
+ unchanged: number;
3664
+ /**
3665
+ * How features were matched: `"id"` when every feature carries a unique
3666
+ * `id`, `"geometry"` when none does (matched by geometry hash), `"mixed"`
3667
+ * otherwise.
3668
+ */
3669
+ matchedBy: "id" | "geometry" | "mixed";
3670
+ }
3671
+ /** Changes to one layer between the two projects. */
3672
+ interface LayerDiff {
3673
+ id: string;
3674
+ /** Layer name in the later project (or the earlier one when removed). */
3675
+ name: string;
3676
+ /** Layer type in the later project (or the earlier one when removed). */
3677
+ type: string;
3678
+ status: "added" | "removed" | "changed";
3679
+ /** Set when the layer was renamed. */
3680
+ renamed?: {
3681
+ before: string;
3682
+ after: string;
3683
+ };
3684
+ /**
3685
+ * Set when the layer changed position relative to the layers present in
3686
+ * both projects (bottom-to-top indexes in each project's `layers`).
3687
+ */
3688
+ moved?: {
3689
+ before: number;
3690
+ after: number;
3691
+ };
3692
+ visibility?: {
3693
+ before: boolean;
3694
+ after: boolean;
3695
+ };
3696
+ opacity?: {
3697
+ before: number;
3698
+ after: number;
3699
+ };
3700
+ /** Style keys other than labels. */
3701
+ style: ProjectValueChange[];
3702
+ /** Label style keys (`style.labels.*`), without the `labels.` prefix. */
3703
+ labels: ProjectValueChange[];
3704
+ /** `filterExpression` and `quickFilters`. */
3705
+ filter: ProjectValueChange[];
3706
+ /** `type`, `source.*` and `sourcePath`. */
3707
+ source: ProjectValueChange[];
3708
+ /** Any other persisted layer field (popup, joins, metadata.*, ...). */
3709
+ other: ProjectValueChange[];
3710
+ /** Embedded GeoJSON feature changes; absent when the data is unchanged. */
3711
+ features?: FeatureChangeSummary;
3712
+ /** Feature count for an added or removed layer with embedded GeoJSON. */
3713
+ featureCount?: number;
3714
+ }
3715
+ /** Changes to one plugin's project state. */
3716
+ interface PluginDiff {
3717
+ id: string;
3718
+ /** `added`/`removed` mean the plugin was activated/deactivated. */
3719
+ status: "added" | "removed" | "changed";
3720
+ changes: ProjectValueChange[];
3721
+ }
3722
+ /** The full structured difference between two projects. */
3723
+ interface ProjectDiff {
3724
+ layers: {
3725
+ added: LayerDiff[];
3726
+ removed: LayerDiff[];
3727
+ changed: LayerDiff[];
3728
+ /** True when any layer present in both projects changed position. */
3729
+ reordered: boolean;
3730
+ };
3731
+ camera: ProjectValueChange[];
3732
+ basemap: ProjectValueChange[];
3733
+ /** Map projection (`preferences.map.projection`). */
3734
+ projection: ProjectValueChange[];
3735
+ /** Other project preferences (`preferences.*` minus the projection). */
3736
+ preferences: ProjectValueChange[];
3737
+ plugins: PluginDiff[];
3738
+ /** Plugin manifest URLs added to or removed from the project. */
3739
+ pluginManifests: {
3740
+ added: string[];
3741
+ removed: string[];
3742
+ };
3743
+ /** Project name (`name`), `metadata.description` and other metadata keys. */
3744
+ metadata: ProjectValueChange[];
3745
+ /** Other top-level sections that changed (`legend`, `storymap`, ...). */
3746
+ sections: string[];
3747
+ /** Total number of reported changes; 0 means the projects are equivalent. */
3748
+ changeCount: number;
3749
+ }
3750
+ /** Options for {@link diffProjects}. */
3751
+ interface ProjectDiffOptions {
3752
+ /** Maximum characters of a before/after preview (default 80). */
3753
+ maxPreviewLength?: number;
3754
+ }
3755
+ /**
3756
+ * Deep structural equality for JSON-like values. A key whose value is
3757
+ * `undefined` is treated as absent, so an in-memory record compares equal to
3758
+ * its JSON round trip.
3759
+ *
3760
+ * @param a - First value.
3761
+ * @param b - Second value.
3762
+ * @returns True when the two values are structurally equal.
3763
+ */
3764
+ declare function jsonValuesEqual(a: unknown, b: unknown): boolean;
3765
+ /**
3766
+ * Render a bounded JSON-ish preview of a value without serializing more of it
3767
+ * than the preview can show, so a large array or object costs no more than
3768
+ * `maxLength` characters of work.
3769
+ *
3770
+ * @param value - The value to preview.
3771
+ * @param maxLength - Maximum preview length; longer output ends with `…`.
3772
+ * @returns The preview, or `undefined` for `undefined`.
3773
+ */
3774
+ declare function previewValue(value: unknown, maxLength?: number): string | undefined;
3775
+ /**
3776
+ * Count the features added, removed and modified between two feature
3777
+ * collections. Features are matched by `id` when they carry one; id-less
3778
+ * features are matched by geometry hash, so a feature whose properties
3779
+ * changed but whose geometry did not counts as modified, while a moved
3780
+ * id-less feature counts as one removal plus one addition.
3781
+ *
3782
+ * @param before - Earlier collection (absent counts as empty).
3783
+ * @param after - Later collection (absent counts as empty).
3784
+ * @returns The change counts.
3785
+ */
3786
+ declare function diffFeatureCollections(before: FeatureCollection | null | undefined, after: FeatureCollection | null | undefined): FeatureChangeSummary;
3787
+ /**
3788
+ * Compute a structured summary of what changed from `before` to `after`.
3789
+ *
3790
+ * Layers are matched by id. Embedded GeoJSON is compared per feature (by id,
3791
+ * falling back to geometry hash) and each feature is hashed once per object,
3792
+ * so diffing the same parsed project against several others reuses its
3793
+ * hashes; callers keep and pass the same parsed project objects to benefit.
3794
+ *
3795
+ * @param before - The earlier project (e.g. an autosave snapshot).
3796
+ * @param after - The later project (e.g. the current project).
3797
+ * @param options - Preview length and other tuning.
3798
+ * @returns The grouped change summary.
3799
+ */
3800
+ declare function diffProjects(before: GeoLibreProject, after: GeoLibreProject, options?: ProjectDiffOptions): ProjectDiff;
3801
+ //#endregion
3802
+ export { collectTransitiveJoinSourceIds as $, LegendCustomEntry as $n, SQL_QUERY_SOURCE_KIND as $r, CollaborationParticipant as $t, normalizeMapViewState as A, scrubPrintLayoutForRemovedLayers as Ai, IndicatorAggregation as An, PopupFieldConfig as Ar, getActiveBodyRadiusRatio as At, normalizeWidgets as B, CesiumBasemapImagery as Bi, LayerGroup as Bn, ProjectBookmark as Br, AppCapabilities as Bt, isSessionOnlyLayer as C, PrintLayoutLegendEntry as Ci, EditorTrackingConfig as Cn, NonGeographicCoordinates as Cr, PLANET_SWITCHER_OPTIONS as Ct, normalizeDashboardColumns as D, normalizePrintLayoutConfig as Di, GeoLibreProject as Dn, ParticipantIdentity as Dr, bodyLengthToEarth as Dt, normalizeBookmarks as E, isDefaultPrintLayout as Ei, GeoLibreLayer as En, PROTOMAPS_BASEMAPS as Er, PlanetaryBasemapSectionId as Et, normalizeProcessingHistory as F, MultiPolygon as Fi, LabelStyle as Fn, ProcessingModelStep as Fr, getPlanetaryBasemapById as Ft, serializeProject as G, LayerMetadataLink as Gn, ProjectPluginState as Gr, AttributeFormValueMapEntry as Gt, portableWmsTileUrl as H, basemapToCesiumImagery as Hi, LayerJoinStats as Hn, ProjectComment as Hr, AppRole as Ht, normalizeProjectComments as I, Point as Ii, LabelTransform as In, ProcessingRerunRequest as Ir, getPlanetaryBasemapByStyleUrl as It, storyMapHasContent as J, LayerQuickFilter as Jn, QuickFilterDateKind as Jr, BLEND_MODES as Jt, serializeProjectWithLayerCache as K, LayerMetadataTemporalExtent as Kn, ProjectPreferences as Kr, AttributeFormWidget as Kt, normalizeProjectInteraction as L, Polygon as Li, LayerCapabilities as Ln, ProcessingRun as Lr, meanRadiusMeters as Lt, normalizeModels as M, FeatureCollection as Mi, LAYER_TYPES as Mn, PopupFieldKind as Mr, getActiveMeanRadiusMeters as Mt, normalizeObiaWorkbench as N, Geometry as Ni, LabelAnchor as Nn, ProcessingModel as Nr, getActiveSemiMajorAxisMeters as Nt, normalizeLegendConfig as O, printLayoutConfigsEqual as Oi, GeocodingPreferences as On, PointRenderer as Or, earthAreaToBody as Ot, normalizePrimaryRenderer as P, LineString as Pi, LabelDedupe as Pn, ProcessingModelGraph as Pr, getEllipsoid as Pt, cascadeLayerJoinRefresh as Q, LegendConfig as Qn, RuntimeEnvironmentVariable as Qr, CollaborationMode as Qt, normalizeSecondaryMapViews as R, CESIUM_BASEMAPS as Ri, LayerConnection as Rn, ProcessingRunKind as Rr, setActiveEllipsoidId as Rt, isAllowedPluginManifestUrl as S, PrintLayoutCorner as Si, DiagramType as Sn, NETCDF_IMAGE_SOURCE_KIND as Sr, PLANETARY_BASEMAP_SENTINEL_PREFIX as St, normalizeBookmarkGroups as T, createDefaultPrintLayout as Ti, FillPattern as Tn, PROJECT_VERSION as Tr, PlanetaryBasemapGroup as Tt, projectFromStore as U, normalizeCesiumBasemap as Ui, LayerLibraryEntry as Un, ProjectInteraction as Ur, AttributeFormConfig as Ut, parseProject as V, availableCesiumBasemap as Vi, LayerJoin as Vn, ProjectBookmarkGroup as Vr, AppPrivilege as Vt, resolveMapGrid as W, sameCesiumImagery as Wi, LayerMetadataContact as Wn, ProjectPluginControlPosition as Wr, AttributeFormFieldConfig as Wt, applyJoinsToLayer as X, LayerType as Xn, QuickFilterTextOperator as Xr, CollabInvite as Xt, ApplyLayerJoinsResult as Y, LayerStyle as Yn, QuickFilterKind as Yr, BlendMode as Yt, applyLayerJoins as Z, LayerVirtualField as Zn, RecentProjectEntry as Zr, CollaborationChatMessage as Zt, createEmptyProject as _, isDuckDBQueryLayer as _i, DashboardWidget as _n, ModelGraphNode as _r, ELLIPSOIDS as _t, ProjectDiffOptions as a, StoryChapterLocation as ai, CommentReply as an, MAX_DASHBOARD_COLUMNS as ar, batchDecodePolylines as at, detachProjectCopy as b, DEFAULT_PRINT_LAYOUT as bi, DiagramField as bn, ModelPortKind as br, PLANETARY_BASEMAPS as bt, diffProjects as c, StoryMap as ci, DEFAULT_DASHBOARD_COLUMNS as cn, MIN_DASHBOARD_COLUMNS as cr, encodePolyline as ct, CreateProjectOptions as d, StyleLibraryEntry as di, DEFAULT_MAP_GRID_LAYOUT as dn, MapProjection as dr, unescapePolyline as dt, SecondaryMapView as ei, CollaborationPresence as en, LegendCustomItem as er, layerJoinKey as et, DEFAULT_PROJECT_NAME as f, StyleLibraryEntryKind as fi, DEFAULT_PRIMARY_RENDERER as fn, MapRendererKind as fr, geojsonHasZCoordinates as ft, createDefaultMapView as g, detectNonGeographicCoordinates as gi, DUCKDB_VECTOR_ROUTE_BYTES as gn, ModelGraphEdge as gr, EARTH_MEAN_RADIUS_METERS as gt, applyProjectToStore as h, VectorStyleStop as hi, DUCKDB_VECTOR_FEATURE_WARN_COUNT as hn, MarkerShape as hr, DEFAULT_ELLIPSOID_ID as ht, ProjectDiff as i, StoryChapterAnimation as ii, CommentAuthor as in, LineDecoration as ir, PolylineDecodeResult as it, normalizeModelGraph as j, Feature as ji, LARGE_VECTOR_FEATURE_THRESHOLD as jn, PopupFieldFormat as jr, getActiveEllipsoid as jt, normalizeMapLayout as k, scrubPrintLayoutForLayers as ki, GeometryGeneratorType as kn, PopupDateFormat as kr, earthLengthToBody as kt, jsonValuesEqual as l, StorySlideMode as li, DEFAULT_LAYER_STYLE as ln, MapGridLayout as lr, geoJSONToPolylineStr as lt, ProjectLayerSerializationCache as m, VectorStyleMode as mi, DEFAULT_STORY_MAP as mn, MapViewState as mr, transformGeojsonElevation as mt, LayerDiff as n, StoryChapter as ni, CollaborationState as nn, LegendItemOverride as nr, stripJoinFields as nt, ProjectValueChange as o, StoryInsetPosition as oi, DEFAULT_BASEMAP as on, MAX_MAP_GRID_DIM as or, decodePolyline as ot, MAX_PROJECT_BOOKMARKS as p, VectorRule as pi, DEFAULT_PROJECT_PREFERENCES as pn, MapScaleUnit as pr, horizontalBbox as pt, serializeProjectWithLayerCacheAsync as q, LayerPopupConfig as qn, ProjectTemplateEntry as qr, BLANK_BASEMAP as qt, PluginDiff as r, StoryChapterAlignment as ri, CommentAnchor as rn, LegendPanelPosition as rr, PolylineBatchOptions as rt, diffFeatureCollections as s, StoryLayerOpacityChange as si, DEFAULT_BLEND_MODE as sn, MAX_PROCESSING_HISTORY as sr, decodePolylineDetailed as st, FeatureChangeSummary as t, StoryActiveSlideMode as ti, CollaborationRole as tn, LegendCustomShape as tr, reapplyLayerJoins as tt, previewValue as u, StrokeWidthUnit as ui, DEFAULT_LEGEND_CONFIG as un, MapPreferences as ur, polylineStrToGeoJSON as ut, createProjectLayerSerializationCache as v, shouldUseTiledRendering as vi, DashboardWidgetAggregation as vn, ModelGraphNodeKind as vr, Ellipsoid as vt, normalizeBlankBackgroundColor as w, PrintLayoutPageFilter as wi, FieldVisibility as wn, OPENFREEMAP_BASEMAPS as wr, PlanetaryBasemap as wt, hydrateProjectLayer as x, PrintLayoutConfig as xi, DiagramSizeMode as xn, ModelToolProvider as xr, PLANETARY_BASEMAP_GROUPS as xt, createProjectTemplate as y, styleValue as yi, DashboardWidgetType as yn, ModelGraphPort as yr, EllipsoidId as yt, normalizeStoryMap as z, CesiumBasemapId as zi, LayerDescriptiveMetadata as zn, ProcessingRunStatus as zr, AddTileLayerOptions as zt };
3803
+ //# sourceMappingURL=project-diff-BD23T4xv.d.mts.map