(
selectors: Selector | readonly Selector[],
listener: ObserverListener<ExpectedElement>,
{signal, stopOnDomReady, once, ancestor}: Options = {},
)
| 27 | }); |
| 28 | |
| 29 | export default function observe< |
| 30 | Selector extends string, |
| 31 | ExpectedElement extends ParseSelector<Selector, HTMLElement | SVGElement>, |
| 32 | >( |
| 33 | selectors: Selector | readonly Selector[], |
| 34 | listener: ObserverListener<ExpectedElement>, |
| 35 | {signal, stopOnDomReady, once, ancestor}: Options = {}, |
| 36 | ): void { |
| 37 | if (signal?.aborted) { |
| 38 | return; |
| 39 | } |
| 40 | |
| 41 | if (stopOnDomReady) { |
| 42 | const delayedDomReady = signalFromPromise((async () => { |
| 43 | await domLoaded; |
| 44 | await delay(100); // Allow the animation and events to complete; Also adds support for ajaxed pages |
| 45 | })()); |
| 46 | |
| 47 | signal = mergeSignals(signal, delayedDomReady); |
| 48 | } |
| 49 | |
| 50 | let onceController: AbortController | undefined; |
| 51 | if (once) { |
| 52 | onceController = new AbortController(); |
| 53 | signal = mergeSignals(signal, onceController.signal); |
| 54 | } |
| 55 | |
| 56 | const selector = typeof selectors === 'string' ? selectors : selectors.join(',\n'); |
| 57 | const seenMark = 'rgh-seen-' + getCallerId(ancestor); |
| 58 | |
| 59 | registerAnimation(); |
| 60 | |
| 61 | const rule = document.createElement('style'); |
| 62 | // Enable when/if needed |
| 63 | // if (isDevelopmentVersion()) { |
| 64 | // // For debuggability |
| 65 | // rule.setAttribute('s', selector); |
| 66 | // } |
| 67 | |
| 68 | rule.textContent = css` |
| 69 | :where(${selector}):not(.${seenMark}) { |
| 70 | animation: 1ms ${animation}; |
| 71 | } |
| 72 | `; |
| 73 | document.body.prepend(rule); |
| 74 | signal?.addEventListener('abort', () => { |
| 75 | rule.remove(); |
| 76 | }); |
| 77 | |
| 78 | let wasCalled = false; |
| 79 | // Capture stack outside |
| 80 | const currentFeature = parseFeatureNameFromStack(); |
| 81 | (async () => { |
| 82 | const {logging} = await optionsStorage.getAll(); |
| 83 | if (!logging) { |
| 84 | return; |
| 85 | } |
| 86 |
no test coverage detected