@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.
- package/fesm2022/theseam-ui-common-guide.mjs +1192 -0
- package/fesm2022/theseam-ui-common-guide.mjs.map +1 -0
- package/guide/guide-theme.scss +105 -0
- package/guide/index.d.ts +474 -0
- package/guide/package.json +3 -0
- package/guide/styles/_utilities.scss +4 -0
- package/guide/styles/_variables.scss +6 -0
- package/package.json +9 -1
package/guide/index.d.ts
ADDED
|
@@ -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,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.
|
|
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"
|