@theseam/ui-common 2.0.1-beta.114 → 2.0.1-beta.115

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.
@@ -101,7 +101,7 @@ declare class GoogleMapsService implements OnDestroy {
101
101
  * delay-free discriminator: a stale click's timestamp should predate the
102
102
  * moment the draw finished. It does not hold up empirically. Driving real
103
103
  * mouse draws against the live Storybook and logging both the map `click`
104
- * listener and `stopDrawing()` (see .superpowers/closing-click-report.md)
104
+ * listener and `stopDrawing()` (see docs/superpowers/reports/closing-click-report.md)
105
105
  * caught the echo repeatedly, and every single time its `domEvent.timeStamp`
106
106
  * was a few milliseconds AFTER `stopDrawing()`'s own timestamp, not before
107
107
  * — indistinguishable from a genuinely fresh click by timestamp alone.
@@ -127,6 +127,14 @@ declare class GoogleMapsService implements OnDestroy {
127
127
  private _labelProperty;
128
128
  private _labelsOverlay?;
129
129
  private _warnedAboutLabelDisagreement;
130
+ private _canDelete;
131
+ private readonly _deleteBlockedSubject;
132
+ /**
133
+ * A delete that was attempted and refused. Fires only from the three delete
134
+ * commands, never from their `canDelete*` queries — rendering a menu is not
135
+ * an attempt.
136
+ */
137
+ readonly deleteBlocked$: Observable<TheSeamMapGroupTarget>;
130
138
  private readonly _selectionSubject;
131
139
  /**
132
140
  * `distinctUntilChanged` collapses repeated `null`s. Several paths clear the
@@ -176,6 +184,70 @@ declare class GoogleMapsService implements OnDestroy {
176
184
  /**
177
185
  * Iterates the map's features and removes any that are selected.
178
186
  */
187
+ private _removeSelection;
188
+ /**
189
+ * The consumer's veto. Consulted for every delete on every path, and for
190
+ * whether to offer a delete at all.
191
+ */
192
+ setCanDelete(predicate: ((target: TheSeamMapGroupTarget) => boolean) | undefined | null): void;
193
+ /**
194
+ * Pair a set of features to remove with the target to consult `canDelete`
195
+ * with. `null` when there is nothing to delete — distinct from a refusal,
196
+ * and the reason no honest target exists to report.
197
+ *
198
+ * Builds `target.feature` itself rather than delegating the decision to
199
+ * `_targetFor`. There, `feature: null` means only "no particular feature";
200
+ * here it is a promise that the whole group is about to cease to exist.
201
+ * Conflating the two is what let a delete of ONE polygon be consulted as a
202
+ * group delete — see `ResolvedDeletion.unnamable`.
203
+ */
204
+ private _deletionOf;
205
+ /** Resolves the same features `_removeSelection()` would remove. */
206
+ private _selectionDeletion;
207
+ /** Resolves the same features `_removeFocusedFeature()` would remove. */
208
+ private _focusedFeatureDeletion;
209
+ /** Resolves the same features `_removeGroup(key)` would remove. */
210
+ private _groupDeletion;
211
+ /**
212
+ * Whether `removing` may be deleted: the feature-declared lock first, then
213
+ * the consumer's predicate.
214
+ *
215
+ * MUST stay pure. It also answers menu-render questions, which are not
216
+ * delete attempts — a side effect here would fire on every right-click.
217
+ */
218
+ private _mayDelete;
219
+ /**
220
+ * Whether a resolved deletion may proceed. The single gate every query and
221
+ * every command goes through.
222
+ *
223
+ * Wraps `_mayDelete` with the one refusal that cannot be phrased as a
224
+ * question about a target: an `unnamable` delete. Consulting the predicate
225
+ * there would mean LYING to it — handing it `feature: null`, which promises
226
+ * the whole group is about to cease to exist, for a delete that removes one
227
+ * polygon and leaves the rest standing. A consumer whose rule is "a field
228
+ * may be deleted, an individual polygon may not" answers `true` to that and
229
+ * loses a polygon it meant to keep. Fail closed exactly where a consumer's
230
+ * rule could be subverted.
231
+ *
232
+ * Only when a predicate is actually set. With none there is nobody to lie
233
+ * to, so there is nothing to protect — and refusing unconditionally would
234
+ * change 'legacy' mode's behaviour for unsupported-geometry features, which
235
+ * two applications depend on and this work must not drift.
236
+ *
237
+ * Pure, like `_mayDelete`: it also answers menu-render questions.
238
+ */
239
+ private _mayDeleteResolved;
240
+ /** Whether "Delete Polygon" (or the `Delete` key) may act. */
241
+ canDeleteFocusedFeature(): boolean;
242
+ /** Whether "Delete Field" may act on `key`. */
243
+ canDeleteGroup(key: string): boolean;
244
+ /** Whether the legacy "Delete" item (or the `Delete` key) may act. */
245
+ canDeleteSelection(): boolean;
246
+ /**
247
+ * Remove every selected feature, unless `canDelete` or a feature's own
248
+ * `editable: false` refuses. A refused delete emits on `deleteBlocked$` and
249
+ * changes nothing.
250
+ */
179
251
  deleteSelection(): void;
180
252
  /**
181
253
  * Delete every feature in `key`'s group. Backs the grouped "Delete Field"
@@ -190,6 +262,12 @@ declare class GoogleMapsService implements OnDestroy {
190
262
  * selected, a coincidence this design has already stopped being true once
191
263
  * before and could again.
192
264
  */
265
+ private _removeGroup;
266
+ /**
267
+ * Remove every feature in `key`'s group, unless `canDelete` or a feature's
268
+ * own `editable: false` refuses. A refused delete emits on `deleteBlocked$`
269
+ * and changes nothing.
270
+ */
193
271
  deleteGroup(key: string): void;
194
272
  /**
195
273
  * Whether polygon drawing mode is currently active.
@@ -281,6 +359,25 @@ declare class GoogleMapsService implements OnDestroy {
281
359
  * even constructed).
282
360
  */
283
361
  setLabelProperty(property: string | undefined): void;
362
+ /**
363
+ * Write `label` into `featureLabelProperty` on every feature in `key`'s
364
+ * group, without re-adding any data. Returns `false` when no feature
365
+ * carries `key`, or when no `featureLabelProperty` is configured — there is
366
+ * then no property to write the label into.
367
+ *
368
+ * Unlike a write through the map's `value`, this does NOT go through
369
+ * `setData()`, so the selection and the viewport are untouched. The
370
+ * repaint and the value update fall out of the data layer's own
371
+ * `setproperty` event, which `_initFeatureChangeListeners()` already turns
372
+ * into a `_labelsOverlay.refresh()` and a `MapValueSource.FeatureChange`
373
+ * emission.
374
+ *
375
+ * It DOES emit a value change, because the label is part of the GeoJSON and
376
+ * the value genuinely changed. Writing that emitted value straight back
377
+ * through the `value` input is inert: `MapValueManagerService.setValue`
378
+ * finds the serialized form identical and returns without emitting.
379
+ */
380
+ setGroupLabel(key: string, label: string): boolean;
284
381
  private _ensureLabelsOverlay;
285
382
  private _buildLabels;
286
383
  private _warnAboutLabelDisagreement;
@@ -328,6 +425,12 @@ declare class GoogleMapsService implements OnDestroy {
328
425
  * `feature` no longer exists — `_applySelection` naturally clears to null
329
426
  * when the group is now empty, via `groupWithSources`.
330
427
  */
428
+ private _removeFocusedFeature;
429
+ /**
430
+ * Remove the focused polygon — or, with nothing focused, the selection —
431
+ * unless `canDelete` or a feature's own `editable: false` refuses. A
432
+ * refused delete emits on `deleteBlocked$` and changes nothing.
433
+ */
331
434
  deleteFocusedFeature(): void;
332
435
  /** Escape cascades: cancel a draw, then clear selection, then leave edit mode. */
333
436
  handleEscape(): void;
@@ -375,7 +478,7 @@ declare class GoogleMapsService implements OnDestroy {
375
478
  * Arm `_suppressNextMapClick`, and guarantee it cannot linger forever if
376
479
  * the echo it exists for never arrives — confirmed to be the normal case
377
480
  * for most real closes, and true of every synthetic/`play()`-driven draw,
378
- * per .superpowers/closing-click-report.md. A `setTimeout` would "solve"
481
+ * per docs/superpowers/reports/closing-click-report.md. A `setTimeout` would "solve"
379
482
  * this by guessing a safe wall-clock delay, which is exactly the kind of
380
483
  * timing window this fix is trying to avoid introducing. Two
381
484
  * `requestAnimationFrame` callbacks bound the window instead: the observed
@@ -409,10 +512,38 @@ interface MapControlsService {
409
512
  declare const MAP_CONTROLS_SERVICE: InjectionToken<MapControlsService>;
410
513
  declare const MAP_CONTROL_DATA: InjectionToken<any>;
411
514
 
515
+ /** One entry in the map's feature context menu. */
412
516
  interface TheSeamMapContextMenuItem {
413
517
  label: string;
414
- action: (item: TheSeamMapContextMenuItem) => void;
518
+ action: () => void;
519
+ }
520
+ /**
521
+ * What the menu needs from the map service to decide what to offer.
522
+ *
523
+ * Narrowed to the query/command pairs so the decision stays a pure function
524
+ * and can be tested without a rendered map.
525
+ */
526
+ interface TheSeamMapDeleteMenuContext {
527
+ mode: TheSeamMapInteractionMode;
528
+ editingEnabled: boolean;
529
+ /** The group the menu is opening for, or null when nothing is targeted. */
530
+ target: TheSeamMapGroupTarget | null;
531
+ canDeleteFocusedFeature(): boolean;
532
+ canDeleteGroup(key: string): boolean;
533
+ canDeleteSelection(): boolean;
534
+ deleteFocusedFeature(): void;
535
+ deleteGroup(key: string): void;
536
+ deleteSelection(): void;
415
537
  }
538
+ /**
539
+ * The delete items the feature context menu offers.
540
+ *
541
+ * A refused item is not rendered at all. The caller is expected to hide the
542
+ * menu entirely for an empty list, so a consumer that refuses everything gets
543
+ * no menu rather than an empty one.
544
+ */
545
+ declare function buildDeleteMenuItems(context: TheSeamMapDeleteMenuContext): TheSeamMapContextMenuItem[];
546
+
416
547
  declare class TheSeamGoogleMapsComponentBase {
417
548
  _elementRef: ElementRef;
418
549
  constructor(_elementRef: ElementRef);
@@ -497,9 +628,37 @@ declare class TheSeamGoogleMapsComponent extends _TheSeamGoogleMapsMixinBase imp
497
628
  newGroupKeyFactory: (() => string) | undefined;
498
629
  /** Preselect a group. Applied on map-ready and after each external value write. */
499
630
  selectedGroupKey: string | null;
631
+ /**
632
+ * Vetoes a delete. Return `false` to refuse the target.
633
+ *
634
+ * `target.feature === null` means the whole group is about to cease to
635
+ * exist — every polygon of it is going, however the delete was asked for.
636
+ * A non-null `feature` means one polygon is being removed from a group that
637
+ * survives.
638
+ *
639
+ * **Consulted when no delete is happening.** It decides whether to render
640
+ * the context-menu items, so it runs on every context-menu open. A
641
+ * predicate that logs an attempt or flips state will do so on every
642
+ * right-click. It must also be deterministic for a given target, or the
643
+ * menu and the `Delete` key can disagree about the same target.
644
+ *
645
+ * That is a correctness warning, not a performance one. The context-menu
646
+ * target changes only on a right-click, a delete, and a value write, so
647
+ * this runs a handful of times per gesture.
648
+ *
649
+ * Passing nothing refuses nothing, which is the behaviour this component
650
+ * has always had.
651
+ */
652
+ canDelete: ((target: TheSeamMapGroupTarget) => boolean) | undefined;
500
653
  mapReady: EventEmitter<google.maps.Map | undefined>;
501
654
  selectionChange: EventEmitter<TheSeamMapGroupTarget | null>;
502
655
  featureHoverChange: EventEmitter<TheSeamMapGroupTarget | null>;
656
+ /**
657
+ * A delete was attempted and refused — in practice, the `Delete` key, since
658
+ * a refused menu item is never rendered. Emits the target that was refused
659
+ * so the consumer can explain why; only the consumer knows the reason.
660
+ */
661
+ deleteBlocked: EventEmitter<TheSeamMapGroupTarget>;
503
662
  featureContextMenu: MenuComponent;
504
663
  _options: {
505
664
  mapTypeControl: boolean;
@@ -525,7 +684,6 @@ declare class TheSeamGoogleMapsComponent extends _TheSeamGoogleMapsMixinBase imp
525
684
  focus(): void;
526
685
  private _getHostElement;
527
686
  _onMapReady(theMap: google.maps.Map): void;
528
- _onClickDeleteFeature(): void;
529
687
  /** Select a group by key. Returns false when no such group exists. */
530
688
  selectGroup(key: string): boolean;
531
689
  clearSelection(): void;
@@ -534,10 +692,18 @@ declare class TheSeamGoogleMapsComponent extends _TheSeamGoogleMapsMixinBase imp
534
692
  /** Pan to a group's centre. Returns false when no such group exists. */
535
693
  panToGroup(key: string): boolean;
536
694
  getGroups(): TheSeamMapFeatureGroup[];
695
+ /**
696
+ * Set a group's label text in place. Returns false when no such group
697
+ * exists, or when no `featureLabelProperty` is set.
698
+ *
699
+ * Does not clear the selection or re-fit the viewport, so it is safe to
700
+ * call while the user is renaming the very group being displayed.
701
+ */
702
+ setGroupLabel(key: string, label: string): boolean;
537
703
  setEditMode(enabled: boolean): void;
538
704
  isEditMode(): boolean;
539
705
  static ɵfac: i0.ɵɵFactoryDeclaration<TheSeamGoogleMapsComponent, never>;
540
- static ɵcmp: i0.ɵɵComponentDeclaration<TheSeamGoogleMapsComponent, "seam-google-maps", ["seamGoogleMaps"], { "disabled": { "alias": "disabled"; "required": false; }; "value": { "alias": "value"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "fileDropEnabled": { "alias": "fileDropEnabled"; "required": false; }; "fileUploadControlEnabled": { "alias": "fileUploadControlEnabled"; "required": false; }; "fullscreenControlEnabled": { "alias": "fullscreenControlEnabled"; "required": false; }; "reCenterControlEnabled": { "alias": "reCenterControlEnabled"; "required": false; }; "mapTypeControlEnabled": { "alias": "mapTypeControlEnabled"; "required": false; }; "streetViewControlEnabled": { "alias": "streetViewControlEnabled"; "required": false; }; "allowDrawingHoleInPolygon": { "alias": "allowDrawingHoleInPolygon"; "required": false; }; "editingEnabled": { "alias": "editingEnabled"; "required": false; }; "fileImportHandler": { "alias": "fileImportHandler"; "required": false; }; "zoom": { "alias": "zoom"; "required": false; }; "longitude": { "alias": "longitude"; "required": false; }; "latitude": { "alias": "latitude"; "required": false; }; "padding": { "alias": "padding"; "required": false; }; "interactionMode": { "alias": "interactionMode"; "required": false; }; "featureGroupProperty": { "alias": "featureGroupProperty"; "required": false; }; "featureLabelProperty": { "alias": "featureLabelProperty"; "required": false; }; "newGroupKeyFactory": { "alias": "newGroupKeyFactory"; "required": false; }; "selectedGroupKey": { "alias": "selectedGroupKey"; "required": false; }; }, { "mapReady": "mapReady"; "selectionChange": "selectionChange"; "featureHoverChange": "featureHoverChange"; }, never, never, false, never>;
706
+ static ɵcmp: i0.ɵɵComponentDeclaration<TheSeamGoogleMapsComponent, "seam-google-maps", ["seamGoogleMaps"], { "disabled": { "alias": "disabled"; "required": false; }; "value": { "alias": "value"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "fileDropEnabled": { "alias": "fileDropEnabled"; "required": false; }; "fileUploadControlEnabled": { "alias": "fileUploadControlEnabled"; "required": false; }; "fullscreenControlEnabled": { "alias": "fullscreenControlEnabled"; "required": false; }; "reCenterControlEnabled": { "alias": "reCenterControlEnabled"; "required": false; }; "mapTypeControlEnabled": { "alias": "mapTypeControlEnabled"; "required": false; }; "streetViewControlEnabled": { "alias": "streetViewControlEnabled"; "required": false; }; "allowDrawingHoleInPolygon": { "alias": "allowDrawingHoleInPolygon"; "required": false; }; "editingEnabled": { "alias": "editingEnabled"; "required": false; }; "fileImportHandler": { "alias": "fileImportHandler"; "required": false; }; "zoom": { "alias": "zoom"; "required": false; }; "longitude": { "alias": "longitude"; "required": false; }; "latitude": { "alias": "latitude"; "required": false; }; "padding": { "alias": "padding"; "required": false; }; "interactionMode": { "alias": "interactionMode"; "required": false; }; "featureGroupProperty": { "alias": "featureGroupProperty"; "required": false; }; "featureLabelProperty": { "alias": "featureLabelProperty"; "required": false; }; "newGroupKeyFactory": { "alias": "newGroupKeyFactory"; "required": false; }; "selectedGroupKey": { "alias": "selectedGroupKey"; "required": false; }; "canDelete": { "alias": "canDelete"; "required": false; }; }, { "mapReady": "mapReady"; "selectionChange": "selectionChange"; "featureHoverChange": "featureHoverChange"; "deleteBlocked": "deleteBlocked"; }, never, never, false, never>;
541
707
  }
542
708
 
543
709
  /**
@@ -933,6 +1099,21 @@ interface TheSeamMapFeatureStyleContext {
933
1099
  }
934
1100
  /** Merge only the supported subset of one options object into another. */
935
1101
  declare function mergeStyleOptions(target: google.maps.Data.StyleOptions, source: google.maps.Data.StyleOptions | undefined): google.maps.Data.StyleOptions;
1102
+ /**
1103
+ * Whether the feature declines to opt OUT of `option`.
1104
+ *
1105
+ * Resolved per key, not per object: a selected feature consults
1106
+ * `styleOptionsSelected` first and falls back to `styleOptions` only for a key
1107
+ * `styleOptionsSelected` does not itself mention. Otherwise a feature
1108
+ * declaring `styleOptionsSelected` for an unrelated reason, such as a
1109
+ * different selected fill colour, would silently lose an unrelated
1110
+ * `editable: false` from `styleOptions` the moment it is selected.
1111
+ *
1112
+ * Only an explicit `false` opts out. Shared by `computeFeatureStyle` and the
1113
+ * delete gate in `GoogleMapsService`, so the lock a consumer declares means
1114
+ * the same thing to both.
1115
+ */
1116
+ declare function featureAllows(feature: google.maps.Data.Feature, option: 'editable' | 'draggable' | 'clickable'): boolean;
936
1117
  /**
937
1118
  * The style for a feature, in a fixed precedence order:
938
1119
  *
@@ -960,10 +1141,10 @@ declare function mergeStyleOptions(target: google.maps.Data.StyleOptions, source
960
1141
  * feature that opts out of one opts out of the other. This implication runs
961
1142
  * only one way — `draggable: false` alone does not imply `editable: false`, so
962
1143
  * a feature may still opt out of dragging while remaining reshapeable via its
963
- * vertex handles. Resolved through the same per-key `wants()` lookup as
964
- * `editable` itself, so a feature that locks `editable: false` in
965
- * `styleOptions` cannot be dragged even if `styleOptionsSelected` declares
966
- * `draggable` for an unrelated reason (or not at all).
1144
+ * vertex handles. Resolved through `featureAllows`, which the delete gate
1145
+ * shares, so a feature that locks `editable: false` in `styleOptions` cannot
1146
+ * be dragged even if `styleOptionsSelected` declares `draggable` for an
1147
+ * unrelated reason (or not at all).
967
1148
  */
968
1149
  declare function computeFeatureStyle(feature: google.maps.Data.Feature, context: TheSeamMapFeatureStyleContext): google.maps.Data.StyleOptions;
969
1150
  /**
@@ -1078,5 +1259,5 @@ declare class TheSeamNoopGoogleMapsAPILoader extends TheSeamGoogleMapsApiLoader
1078
1259
  static ɵprov: i0.ɵɵInjectableDeclaration<TheSeamNoopGoogleMapsAPILoader>;
1079
1260
  }
1080
1261
 
1081
- export { AppFeaturePropertyName, FEATURE_STYLE_OPTIONS_DEFAULT, FEATURE_STYLE_OPTIONS_SELECTED, FEATURE_STYLE_OVERRIDE_OPTIONS_HOVERED, GoogleMapsContextMenu, GoogleMapsControlsService, GoogleMapsService, MAP_CONTROLS_SERVICE, MAP_CONTROL_DATA, MapControlRef, MapValueManagerService, MapValueSource, SEAM_GOOGLE_PLACES_AUTOCOMPLETE_DEFAULT_OPTIONS, SUPPORTED_PROPERTY_STYLE_OPTIONS, THESEAM_LAZY_MAPS_API_CONFIG, TheSeamGoogleMapsApiLoader, TheSeamGoogleMapsComponent, TheSeamGoogleMapsModule, TheSeamGoogleMapsPlacesAutoCompleteComponent, TheSeamGoogleMapsPlacesAutocompleteDirective, TheSeamGoogleMapsRecenterButtonControlComponent, TheSeamGoogleMapsUploadButtonControlComponent, TheSeamLazyMapsApiLoader, TheSeamMapFileDropComponent, TheSeamMapsControlComponent, TheSeamNoopGoogleMapsAPILoader, applyHoleToFeature, computeFeatureHoverStyle, computeFeatureStyle, createFeatureChangeObservable, dataMultiPolygonFromGeoJson, dataPolygonFromGeoJson, geoJsonFeatureFromDataFeature, geoJsonPolygonFromDataFeature, getBoundsWithAllFeatures, getFeatureBounds, getFeatureCenter, getFeaturesCount, getHoveredStyleOptionsDefinedByFeature, getSelectedStyleOptionsDefinedByFeature, getStyleOptionsDefinedByFeature, isAppFeatureProperty, isFeatureSelected, mergeStyleOptions, polygonCoordinates, polygonHasValidPathsLengths, polygonsFromDataFeature, removeAllFeatures, setFeatureSelected, stripAppFeaturePropertiesFromJson };
1082
- export type { GoogleMapsRecenterButtonControlData, GoogleMapsUploadButtonControlData, MapControl, MapControlsService, MapValue, MapValueChange, TheSeamLazyMapsApiLoaderConfig, TheSeamMapFeatureGroup, TheSeamMapFeatureStyleContext, TheSeamMapGroupTarget, TheSeamMapInteractionMode };
1262
+ export { AppFeaturePropertyName, FEATURE_STYLE_OPTIONS_DEFAULT, FEATURE_STYLE_OPTIONS_SELECTED, FEATURE_STYLE_OVERRIDE_OPTIONS_HOVERED, GoogleMapsContextMenu, GoogleMapsControlsService, GoogleMapsService, MAP_CONTROLS_SERVICE, MAP_CONTROL_DATA, MapControlRef, MapValueManagerService, MapValueSource, SEAM_GOOGLE_PLACES_AUTOCOMPLETE_DEFAULT_OPTIONS, SUPPORTED_PROPERTY_STYLE_OPTIONS, THESEAM_LAZY_MAPS_API_CONFIG, TheSeamGoogleMapsApiLoader, TheSeamGoogleMapsComponent, TheSeamGoogleMapsModule, TheSeamGoogleMapsPlacesAutoCompleteComponent, TheSeamGoogleMapsPlacesAutocompleteDirective, TheSeamGoogleMapsRecenterButtonControlComponent, TheSeamGoogleMapsUploadButtonControlComponent, TheSeamLazyMapsApiLoader, TheSeamMapFileDropComponent, TheSeamMapsControlComponent, TheSeamNoopGoogleMapsAPILoader, applyHoleToFeature, buildDeleteMenuItems, computeFeatureHoverStyle, computeFeatureStyle, createFeatureChangeObservable, dataMultiPolygonFromGeoJson, dataPolygonFromGeoJson, featureAllows, geoJsonFeatureFromDataFeature, geoJsonPolygonFromDataFeature, getBoundsWithAllFeatures, getFeatureBounds, getFeatureCenter, getFeaturesCount, getHoveredStyleOptionsDefinedByFeature, getSelectedStyleOptionsDefinedByFeature, getStyleOptionsDefinedByFeature, isAppFeatureProperty, isFeatureSelected, mergeStyleOptions, polygonCoordinates, polygonHasValidPathsLengths, polygonsFromDataFeature, removeAllFeatures, setFeatureSelected, stripAppFeaturePropertiesFromJson };
1263
+ export type { GoogleMapsRecenterButtonControlData, GoogleMapsUploadButtonControlData, MapControl, MapControlsService, MapValue, MapValueChange, TheSeamLazyMapsApiLoaderConfig, TheSeamMapContextMenuItem, TheSeamMapDeleteMenuContext, TheSeamMapFeatureGroup, TheSeamMapFeatureStyleContext, TheSeamMapGroupTarget, TheSeamMapInteractionMode };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@theseam/ui-common",
3
- "version": "2.0.1-beta.114",
3
+ "version": "2.0.1-beta.115",
4
4
  "peerDependencies": {
5
5
  "@angular/cdk": "^20.2.3",
6
6
  "@angular/common": "^20.3.0",