@theseam/ui-common 2.0.1-beta.101 → 2.0.1-beta.104

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.
@@ -0,0 +1,474 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Signal, TemplateRef, Type, InjectionToken, ElementRef, OnDestroy, EnvironmentProviders } from '@angular/core';
3
+ import { Observable } from 'rxjs';
4
+
5
+ type TheSeamGuideCloseReason = 'completed' | 'dismissed' | 'targetMissing' | 'superseded' | 'destroyed';
6
+ interface TheSeamGuideResult {
7
+ reason: TheSeamGuideCloseReason;
8
+ /** Index of the step that was active when the guide closed, or -1. */
9
+ lastIndex: number;
10
+ }
11
+ type TheSeamGuideEvent = {
12
+ type: 'started';
13
+ } | {
14
+ type: 'stepChanged';
15
+ index: number;
16
+ step: TheSeamGuideStep;
17
+ } | {
18
+ type: 'stepSkipped';
19
+ index: number;
20
+ step: TheSeamGuideStep;
21
+ } | {
22
+ type: 'targetLost';
23
+ index: number;
24
+ step: TheSeamGuideStep;
25
+ } | {
26
+ type: 'targetRecovered';
27
+ index: number;
28
+ step: TheSeamGuideStep;
29
+ } | {
30
+ type: 'closed';
31
+ result: TheSeamGuideResult;
32
+ };
33
+
34
+ /**
35
+ * The contract between a {@link TheSeamGuideRef} and the session backing it.
36
+ * `TheSeamGuideRef` delegates every member to an implementation of this
37
+ * interface, so it never depends on `TheSeamGuideSession` directly.
38
+ */
39
+ interface TheSeamGuideSessionController {
40
+ /**
41
+ * Replays every event emitted so far for this guide, from `started`
42
+ * onward, to each new subscriber — so attaching at any point yields the
43
+ * complete history rather than only future events.
44
+ */
45
+ readonly events$: Observable<TheSeamGuideEvent>;
46
+ readonly afterClosed$: Observable<TheSeamGuideResult>;
47
+ readonly activeIndex: Signal<number>;
48
+ readonly dismissible: boolean;
49
+ next(): void;
50
+ previous(): void;
51
+ moveTo(index: number): void;
52
+ refresh(): void;
53
+ close(reason: TheSeamGuideCloseReason): void;
54
+ }
55
+ /**
56
+ * Consumer-facing handle to a running guide.
57
+ *
58
+ * The caller owns this ref's lifetime. A guide is not closed automatically
59
+ * when the component that started it is destroyed — `TheSeamGuideService` is
60
+ * `providedIn: 'root'`, so its `ngOnDestroy` only fires when the root
61
+ * injector itself is destroyed, not on ordinary route/component teardown. A
62
+ * component that may be destroyed before its guide naturally ends should tie
63
+ * the ref to its own lifetime:
64
+ *
65
+ * ```ts
66
+ * const ref = this._guide.start(config)
67
+ * inject(DestroyRef).onDestroy(() => ref.close())
68
+ * ```
69
+ */
70
+ declare class TheSeamGuideRef {
71
+ private readonly _session;
72
+ constructor(_session: TheSeamGuideSessionController);
73
+ /**
74
+ * Replays every event emitted so far for this guide, from `started`
75
+ * onward — a subscriber attached at any point sees the complete history,
76
+ * not just events emitted after it subscribes. This is why subscribing
77
+ * immediately after `start()` returns still observes `started`: `start()`
78
+ * runs synchronously, but the event is not lost, it is replayed.
79
+ */
80
+ get events$(): Observable<TheSeamGuideEvent>;
81
+ get afterClosed$(): Observable<TheSeamGuideResult>;
82
+ get activeIndex(): Signal<number>;
83
+ /** Whether the user may dismiss this guide. Read by the service's concurrency rule. */
84
+ get dismissible(): boolean;
85
+ next(): void;
86
+ previous(): void;
87
+ moveTo(index: number): void;
88
+ refresh(): void;
89
+ /** Always works, including when `dismissible` is false. */
90
+ close(reason?: TheSeamGuideCloseReason): void;
91
+ }
92
+
93
+ /**
94
+ * Application-defined values handed to popover content.
95
+ *
96
+ * The library reserves **no keys** here. That is why `text` is a sibling field
97
+ * on the content spec rather than a well-known key in this bag: an application
98
+ * can name its data anything without colliding with the guide.
99
+ */
100
+ type TheSeamGuideContentData = Record<string, unknown>;
101
+ interface TheSeamGuideContentBase {
102
+ /** The slot's plain text. A bare string is sugar for this. Nearest-wins. */
103
+ text?: string;
104
+ /** Shallow-merged across provider -> session -> step. */
105
+ data?: TheSeamGuideContentData;
106
+ }
107
+ interface TheSeamGuideTemplateContent extends TheSeamGuideContentBase {
108
+ template: TemplateRef<TheSeamGuideContentContext>;
109
+ component?: never;
110
+ }
111
+ interface TheSeamGuideComponentContent extends TheSeamGuideContentBase {
112
+ component: Type<unknown>;
113
+ template?: never;
114
+ }
115
+ /** Text and/or data for whichever renderer an outer layer supplies. */
116
+ interface TheSeamGuideInheritedContent extends TheSeamGuideContentBase {
117
+ template?: never;
118
+ component?: never;
119
+ }
120
+ /**
121
+ * The `never` guards make `template` and `component` on one object a compile
122
+ * error, rather than a runtime precedence rule nobody remembers.
123
+ */
124
+ type TheSeamGuideContentSpec = TheSeamGuideTemplateContent | TheSeamGuideComponentContent | TheSeamGuideInheritedContent;
125
+ type TheSeamGuideContent = string | TheSeamGuideContentSpec;
126
+ /**
127
+ * What popover content receives. Templates get this as their context;
128
+ * components get it from {@link THE_SEAM_GUIDE_CONTENT}.
129
+ *
130
+ * `data` is never spread, so `let-index` is unambiguously the step index and
131
+ * never an application value.
132
+ */
133
+ interface TheSeamGuideContentContext {
134
+ /** `data`, so `let-d` in a template reads `d.icon`. */
135
+ $implicit: TheSeamGuideContentData;
136
+ data: TheSeamGuideContentData;
137
+ text: string | undefined;
138
+ step: TheSeamGuideStep;
139
+ index: number;
140
+ total: number;
141
+ guide: TheSeamGuideRef;
142
+ }
143
+ /** Injected by a component used as popover content. */
144
+ declare const THE_SEAM_GUIDE_CONTENT: InjectionToken<TheSeamGuideContentContext>;
145
+ /** One popover slot after its three layers are resolved. */
146
+ type TheSeamGuideResolvedSlot = {
147
+ kind: 'text';
148
+ text: string;
149
+ } | {
150
+ kind: 'template';
151
+ template: TemplateRef<TheSeamGuideContentContext>;
152
+ text: string | undefined;
153
+ data: TheSeamGuideContentData;
154
+ } | {
155
+ kind: 'component';
156
+ component: Type<unknown>;
157
+ text: string | undefined;
158
+ data: TheSeamGuideContentData;
159
+ };
160
+ /** A resolved slot that needs an Angular view. */
161
+ type TheSeamGuideViewSlot = Exclude<TheSeamGuideResolvedSlot, {
162
+ kind: 'text';
163
+ }>;
164
+ /** A rendered slot. Destroying it tears the view down. */
165
+ interface TheSeamGuideContentView {
166
+ destroy(): void;
167
+ }
168
+ /**
169
+ * Published so `testing/` can fake it, exactly as `TheSeamGuideAdapter` is.
170
+ * The DOM implementation itself is internal.
171
+ */
172
+ interface TheSeamGuideContentRenderer {
173
+ render(slot: TheSeamGuideViewSlot, context: TheSeamGuideContentContext, host: HTMLElement): TheSeamGuideContentView;
174
+ }
175
+
176
+ /** What to do when a step's target element cannot be resolved. */
177
+ type TheSeamGuideMissPolicy = 'skip' | 'elementless' | 'end';
178
+ interface TheSeamGuidePopover {
179
+ /**
180
+ * A string, a `TemplateRef`, or a standalone component.
181
+ *
182
+ * Omitting inherits from the guide and application layers. `null` opts this
183
+ * step out of a slot the guide layer supplies — omission cannot express
184
+ * that, because omission means "inherit".
185
+ */
186
+ title?: TheSeamGuideContent | null;
187
+ description?: TheSeamGuideContent | null;
188
+ side?: 'top' | 'right' | 'bottom' | 'left';
189
+ align?: 'start' | 'center' | 'end';
190
+ }
191
+ interface TheSeamGuideStep {
192
+ /**
193
+ * Target for this step. Omit for an elementless (centered) step.
194
+ *
195
+ * A string is resolved against the target registry first, then falls back to
196
+ * `document.querySelector`. Only registry-resolved targets get mid-step
197
+ * recovery.
198
+ */
199
+ element?: string | Element | ElementRef<Element>;
200
+ popover?: TheSeamGuidePopover;
201
+ /** Overrides the guide-level value for this step. */
202
+ targetTimeout?: number;
203
+ /** Overrides the guide-level policy. `'end'` marks this step required. */
204
+ onMissingTarget?: TheSeamGuideMissPolicy;
205
+ /** Overrides the guide-level mid-step loss policy. */
206
+ onTargetLost?: TheSeamGuideMissPolicy;
207
+ /**
208
+ * Runs before this step paints. An Observable result must **emit**, not
209
+ * merely complete — the transition waits for the first emission and an
210
+ * Observable that completes without ever emitting will hang it forever.
211
+ */
212
+ beforeStep?: () => void | Promise<void> | Observable<unknown>;
213
+ /**
214
+ * Runs after this step is left. An Observable result must **emit**, not
215
+ * merely complete — the transition waits for the first emission and an
216
+ * Observable that completes without ever emitting will hang it forever.
217
+ */
218
+ afterStep?: () => void | Promise<void> | Observable<unknown>;
219
+ }
220
+
221
+ interface TheSeamGuideConfig {
222
+ steps: TheSeamGuideStep[];
223
+ /** User may dismiss via Escape, overlay click, or close button. Default true. */
224
+ dismissible?: boolean;
225
+ /** Milliseconds to wait for a target before the miss policy applies. Default 3000. */
226
+ targetTimeout?: number;
227
+ /** Guide-level miss policy, applied at step entry. Default 'skip'. */
228
+ onMissingTarget?: TheSeamGuideMissPolicy;
229
+ /**
230
+ * Milliseconds to wait for a target to return after it disappears mid-step,
231
+ * before `onTargetLost` applies. Default 1000.
232
+ */
233
+ targetLostGrace?: number;
234
+ /** Policy for a target lost mid-step. Default 'elementless'. */
235
+ onTargetLost?: TheSeamGuideMissPolicy;
236
+ /**
237
+ * Popover defaults for every step in this guide — the middle content layer.
238
+ * Decorates slots a step supplies, and can supply a slot itself; a step
239
+ * opts out of one with `null`.
240
+ */
241
+ popover?: TheSeamGuidePopover;
242
+ }
243
+ type TheSeamGuideResolvedConfig = Required<Omit<TheSeamGuideConfig, 'steps' | 'popover'>>;
244
+ declare const THE_SEAM_GUIDE_DEFAULTS: TheSeamGuideResolvedConfig;
245
+
246
+ declare class TheSeamGuideBusyError extends Error {
247
+ constructor();
248
+ }
249
+ declare class TheSeamGuideTargetTimeoutError extends Error {
250
+ readonly targetName: string;
251
+ constructor(targetName: string);
252
+ }
253
+
254
+ /**
255
+ * Tracks elements registered by `[seamGuideTarget]` so a guide can await a
256
+ * target that does not exist yet, and notice one that disappears.
257
+ */
258
+ declare class TheSeamGuideTargetRegistry {
259
+ private readonly _targets;
260
+ private readonly _changes;
261
+ /** Emits the target name whenever its registrations change. */
262
+ readonly changes$: Observable<string>;
263
+ register(name: string, element: Element): void;
264
+ unregister(name: string, element: Element): void;
265
+ /** The most recently registered element for `name` that is still in the DOM. */
266
+ resolve(name: string): Element | null;
267
+ /** Emits as soon as `name` resolves. Errors with a timeout error otherwise. */
268
+ waitFor(name: string, timeoutMs: number): Observable<Element>;
269
+ static ɵfac: i0.ɵɵFactoryDeclaration<TheSeamGuideTargetRegistry, never>;
270
+ static ɵprov: i0.ɵɵInjectableDeclaration<TheSeamGuideTargetRegistry>;
271
+ }
272
+
273
+ /**
274
+ * Marks an element as a named guide target.
275
+ *
276
+ * Registering on init and unregistering on destroy is what lets a guide await a
277
+ * target that has not rendered yet, and recover when one is destroyed and
278
+ * recreated mid-step.
279
+ */
280
+ declare class TheSeamGuideTargetDirective implements OnDestroy {
281
+ private readonly _registry;
282
+ private readonly _elementRef;
283
+ readonly seamGuideTarget: i0.InputSignal<string>;
284
+ private _registeredName;
285
+ constructor();
286
+ ngOnDestroy(): void;
287
+ static ɵfac: i0.ɵɵFactoryDeclaration<TheSeamGuideTargetDirective, never>;
288
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TheSeamGuideTargetDirective, "[seamGuideTarget]", never, { "seamGuideTarget": { "alias": "seamGuideTarget"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
289
+ }
290
+
291
+ /**
292
+ * A popover as the presentation engine sees it.
293
+ *
294
+ * `HTMLElement` carries template and component content. The service creates,
295
+ * owns, and destroys that node; the adapter only places it, which is what
296
+ * keeps the adapter free of Angular.
297
+ *
298
+ * **An `HTMLElement` slot must be re-adopted on every re-render — never
299
+ * cloned, never wrapped in a fresh element, never rebuilt from its
300
+ * `outerHTML`.** The engine may tear down and rebuild its whole popover DOM
301
+ * on every render (driver.js does, including on the re-drive behind
302
+ * `refresh()`), but the identical node handed in here must end up back in
303
+ * the new DOM each time. Re-adoption of that exact node is what lets the
304
+ * Angular view living inside it survive untouched across a rebuild —
305
+ * preserving scroll position, a typed-in value, or an in-flight animation
306
+ * instead of resetting it.
307
+ */
308
+ interface TheSeamGuideAdapterPopover {
309
+ title?: string | HTMLElement;
310
+ description?: string | HTMLElement;
311
+ side?: 'top' | 'right' | 'bottom' | 'left';
312
+ align?: 'start' | 'center' | 'end';
313
+ }
314
+ /**
315
+ * A step as the presentation engine sees it.
316
+ *
317
+ * `element` is a resolver function, not an element, so the engine re-resolves
318
+ * at paint time. That is what makes mid-step recovery a `refresh()` rather than
319
+ * a step transition.
320
+ */
321
+ interface TheSeamGuideAdapterStep {
322
+ element?: () => Element | undefined;
323
+ popover?: TheSeamGuideAdapterPopover;
324
+ }
325
+ interface TheSeamGuideAdapterConfig {
326
+ steps: TheSeamGuideAdapterStep[];
327
+ /** When false, Escape, overlay click, and the close button must not dismiss. */
328
+ allowUserDismiss: boolean;
329
+ }
330
+ /** How the engine reports user intent. It never advances itself. */
331
+ interface TheSeamGuideAdapterCallbacks {
332
+ onNextRequested(): void;
333
+ onPreviousRequested(): void;
334
+ onCloseRequested(): void;
335
+ }
336
+ interface TheSeamGuideAdapter {
337
+ start(config: TheSeamGuideAdapterConfig, callbacks: TheSeamGuideAdapterCallbacks): void;
338
+ next(): void;
339
+ previous(): void;
340
+ moveTo(index: number): void;
341
+ /**
342
+ * Re-resolves and repositions the current step in place, without a step
343
+ * transition. This is the operation mid-step recovery depends on.
344
+ *
345
+ * **Must re-invoke the current step's element resolver** (the function on
346
+ * `TheSeamGuideAdapterStep.element`), not merely reposition around a
347
+ * previously-resolved element. An implementation that only repositions
348
+ * passes every session-layer spec — the session never observes the
349
+ * difference directly — but silently keeps highlighting a detached element
350
+ * during recovery while still reporting `targetRecovered`. driver.js's own
351
+ * `refresh()` has exactly this bug, which is why the driver.js adapter does
352
+ * not call it and instead re-drives the current index to force
353
+ * re-resolution.
354
+ */
355
+ refresh(): void;
356
+ destroy(): void;
357
+ isActive(): boolean;
358
+ }
359
+ declare const THE_SEAM_GUIDE_ADAPTER: InjectionToken<TheSeamGuideAdapter>;
360
+
361
+ declare class TheSeamGuideService implements OnDestroy {
362
+ private readonly _adapter;
363
+ private readonly _registry;
364
+ private readonly _popoverDefaults;
365
+ private readonly _contentRenderer;
366
+ private readonly _activeGuide;
367
+ /**
368
+ * The running guide, or null. Exposed so a caller can queue itself:
369
+ * `activeGuide()?.afterClosed$.subscribe(() => start(next))`.
370
+ */
371
+ readonly activeGuide: Signal<TheSeamGuideRef | null>;
372
+ /**
373
+ * Starts a guide. One runs at a time: a dismissible active guide is
374
+ * superseded, a non-dismissible one throws `TheSeamGuideBusyError`.
375
+ *
376
+ * The caller owns the returned ref's lifetime. A guide is **not** closed
377
+ * automatically when the component that started it is destroyed — only
378
+ * when the root injector is (this service is `providedIn: 'root'`), which
379
+ * does not happen on ordinary route/component teardown. A component that
380
+ * starts a guide and may be destroyed before it naturally ends should tie
381
+ * the ref to its own lifetime:
382
+ *
383
+ * ```ts
384
+ * const ref = this._guide.start(config)
385
+ * inject(DestroyRef).onDestroy(() => ref.close())
386
+ * ```
387
+ */
388
+ start(config: TheSeamGuideConfig): TheSeamGuideRef;
389
+ /**
390
+ * Highlights a single element. A one-step guide.
391
+ *
392
+ * As with {@link start}, the caller owns the returned ref's lifetime: it is
393
+ * not closed automatically when the component that requested it is
394
+ * destroyed. See {@link start}'s doc comment for the `DestroyRef` pattern.
395
+ */
396
+ highlight(step: TheSeamGuideStep): TheSeamGuideRef;
397
+ /**
398
+ * Closes any active guide when the owning injector is destroyed —
399
+ * otherwise driver.js's overlay is left in the DOM, and its
400
+ * `pointer-events: none` blocks every click on the page with no recovery
401
+ * short of a reload. `close` always works programmatically even when the
402
+ * guide is `dismissible: false`, which is exactly the case that must not
403
+ * be left behind.
404
+ */
405
+ ngOnDestroy(): void;
406
+ private _clearIfCurrent;
407
+ static ɵfac: i0.ɵɵFactoryDeclaration<TheSeamGuideService, never>;
408
+ static ɵprov: i0.ɵɵInjectableDeclaration<TheSeamGuideService>;
409
+ }
410
+
411
+ /**
412
+ * Application-wide popover defaults — the outermost of the three content
413
+ * layers. Always provided by {@link provideTheSeamGuide}, defaulting to `{}`.
414
+ */
415
+ declare const THE_SEAM_GUIDE_POPOVER_DEFAULTS: InjectionToken<TheSeamGuidePopover>;
416
+ interface TheSeamGuideProviderOptions {
417
+ /** Replace the presentation engine. Defaults to the driver.js adapter. */
418
+ adapter?: Type<TheSeamGuideAdapter>;
419
+ /**
420
+ * Popover defaults for every guide in the application. This layer decorates
421
+ * slots that a guide or a step supplies; it never creates one.
422
+ */
423
+ popover?: TheSeamGuidePopover;
424
+ }
425
+ /**
426
+ * Wires the guide's presentation engine.
427
+ *
428
+ * The engine is named only here — no consumer imports driver.js — so replacing
429
+ * it is a change to this call, not to application code.
430
+ */
431
+ declare function provideTheSeamGuide(options?: TheSeamGuideProviderOptions): EnvironmentProviders;
432
+
433
+ interface TheSeamFakeGuideContentRender {
434
+ slot: TheSeamGuideViewSlot;
435
+ context: TheSeamGuideContentContext;
436
+ host: HTMLElement;
437
+ destroyed: boolean;
438
+ }
439
+ /**
440
+ * Angular-free renderer for specs. Records what the session asked to render so
441
+ * a test can assert view lifetime without a `TestBed`.
442
+ */
443
+ declare class TheSeamFakeGuideContentRenderer implements TheSeamGuideContentRenderer {
444
+ readonly renders: TheSeamFakeGuideContentRender[];
445
+ render(slot: TheSeamGuideViewSlot, context: TheSeamGuideContentContext, host: HTMLElement): TheSeamGuideContentView;
446
+ /** Renders that have not been destroyed. */
447
+ get live(): TheSeamFakeGuideContentRender[];
448
+ }
449
+
450
+ /**
451
+ * Engine-free adapter for specs. Records what the service asked for and lets a
452
+ * test simulate user intent without a DOM.
453
+ */
454
+ declare class TheSeamFakeGuideAdapter implements TheSeamGuideAdapter {
455
+ readonly calls: string[];
456
+ startedConfig: TheSeamGuideAdapterConfig | null;
457
+ private _callbacks;
458
+ private _active;
459
+ start(config: TheSeamGuideAdapterConfig, callbacks: TheSeamGuideAdapterCallbacks): void;
460
+ next(): void;
461
+ previous(): void;
462
+ moveTo(index: number): void;
463
+ refresh(): void;
464
+ destroy(): void;
465
+ isActive(): boolean;
466
+ /** Resolves the element for a step, as the engine would at paint time. */
467
+ resolveStepElement(index: number): Element | undefined;
468
+ emitNext(): void;
469
+ emitPrevious(): void;
470
+ emitClose(): void;
471
+ }
472
+
473
+ export { THE_SEAM_GUIDE_ADAPTER, THE_SEAM_GUIDE_CONTENT, THE_SEAM_GUIDE_DEFAULTS, THE_SEAM_GUIDE_POPOVER_DEFAULTS, TheSeamFakeGuideAdapter, TheSeamFakeGuideContentRenderer, TheSeamGuideBusyError, TheSeamGuideRef, TheSeamGuideService, TheSeamGuideTargetDirective, TheSeamGuideTargetRegistry, TheSeamGuideTargetTimeoutError, provideTheSeamGuide };
474
+ export type { TheSeamFakeGuideContentRender, TheSeamGuideAdapter, TheSeamGuideAdapterCallbacks, TheSeamGuideAdapterConfig, TheSeamGuideAdapterPopover, TheSeamGuideAdapterStep, TheSeamGuideCloseReason, TheSeamGuideComponentContent, TheSeamGuideConfig, TheSeamGuideContent, TheSeamGuideContentBase, TheSeamGuideContentContext, TheSeamGuideContentData, TheSeamGuideContentRenderer, TheSeamGuideContentSpec, TheSeamGuideContentView, TheSeamGuideEvent, TheSeamGuideInheritedContent, TheSeamGuideMissPolicy, TheSeamGuidePopover, TheSeamGuideProviderOptions, TheSeamGuideResolvedConfig, TheSeamGuideResolvedSlot, TheSeamGuideResult, TheSeamGuideSessionController, TheSeamGuideStep, TheSeamGuideTemplateContent, TheSeamGuideViewSlot };
@@ -0,0 +1,3 @@
1
+ {
2
+ "module": "../fesm2022/theseam-ui-common-guide.mjs"
3
+ }
@@ -0,0 +1,4 @@
1
+ // Variables, functions, and mixins only. Must not emit CSS.
2
+ @import '../../styles/utilities';
3
+
4
+ @import './variables';
@@ -0,0 +1,6 @@
1
+ $seam-guide-popover-bg: $white !default;
2
+ $seam-guide-popover-color: $body-color !default;
3
+ $seam-guide-popover-border-radius: $border-radius !default;
4
+ $seam-guide-popover-max-width: 20rem !default;
5
+ $seam-guide-overlay-color: rgba(0, 0, 0, 0.6) !default;
6
+ $seam-guide-overlay-opacity: 0.7 !default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@theseam/ui-common",
3
- "version": "2.0.1-beta.101",
3
+ "version": "2.0.1-beta.104",
4
4
  "peerDependencies": {
5
5
  "@angular/cdk": "^20.2.3",
6
6
  "@angular/common": "^20.3.0",
@@ -8,6 +8,7 @@
8
8
  "@angular/forms": "^20.3.0",
9
9
  "@angular/animations": "^20.3.0",
10
10
  "@angular/router": "^20.3.0",
11
+ "@angular/google-maps": "^20.2.3",
11
12
  "rxjs": "~7.8.0",
12
13
  "@fortawesome/angular-fontawesome": "^0.13.0",
13
14
  "@fortawesome/fontawesome-svg-core": "^1.2.35",
@@ -24,6 +25,7 @@
24
25
  "@types/overlayscrollbars": "~1.7.0",
25
26
  "bootstrap": "~4.6.0",
26
27
  "css-element-queries": "^1.2.3",
28
+ "driver.js": "^1.8.0",
27
29
  "file-saver": "~2.0.2",
28
30
  "graphql": "^16.0.0",
29
31
  "ngx-toastr": "~16.1.0",
@@ -43,6 +45,8 @@
43
45
  "@turf/kinks": "^7.2.0",
44
46
  "shpjs": "^6.2.0",
45
47
  "@types/geojson": "^7946.0.8",
48
+ "terra-draw": "^1.31.2",
49
+ "terra-draw-google-maps-adapter": "^1.6.1",
46
50
  "tslib": "^2.3.0"
47
51
  },
48
52
  "repository": {
@@ -219,6 +223,10 @@
219
223
  "types": "./graphql/index.d.ts",
220
224
  "default": "./fesm2022/theseam-ui-common-graphql.mjs"
221
225
  },
226
+ "./guide": {
227
+ "types": "./guide/index.d.ts",
228
+ "default": "./fesm2022/theseam-ui-common-guide.mjs"
229
+ },
222
230
  "./icon": {
223
231
  "types": "./icon/index.d.ts",
224
232
  "default": "./fesm2022/theseam-ui-common-icon.mjs"