@patternfly/pfe-core 4.0.4 → 5.0.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.
@@ -1,9 +1,9 @@
1
1
  import type { ReactiveElement, ReactiveController } from 'lit';
2
2
  export declare class CssVariableController implements ReactiveController {
3
3
  host: ReactiveElement;
4
- style: CSSStyleDeclaration;
4
+ style?: CSSStyleDeclaration;
5
5
  constructor(host: ReactiveElement);
6
6
  private parseProperty;
7
7
  getVariable(name: string): string | null;
8
- hostConnected?(): void;
8
+ hostConnected(): void;
9
9
  }
@@ -1,13 +1,19 @@
1
1
  export class CssVariableController {
2
2
  constructor(host) {
3
3
  this.host = host;
4
- this.style = window.getComputedStyle(host);
4
+ if (this.host.isConnected) {
5
+ this.hostConnected();
6
+ }
5
7
  }
6
8
  parseProperty(name) {
7
9
  return name.substring(0, 2) !== '--' ? `--${name}` : name;
8
10
  }
9
11
  getVariable(name) {
10
- return this.style.getPropertyValue(this.parseProperty(name)).trim() || null;
12
+ return this.style?.getPropertyValue(this.parseProperty(name)).trim() || null;
11
13
  }
14
+ hostConnected() {
15
+ this.style = window.getComputedStyle(this.host);
16
+ }
17
+ ;
12
18
  }
13
19
  //# sourceMappingURL=css-variable-controller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"css-variable-controller.js","sourceRoot":"","sources":["css-variable-controller.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,qBAAqB;IAGhC,YAAmB,IAAqB;QAArB,SAAI,GAAJ,IAAI,CAAiB;QACtC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAEO,aAAa,CAAC,IAAY;QAChC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5D,CAAC;IAED,WAAW,CAAC,IAAY;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;IAC9E,CAAC;CAGF","sourcesContent":["import type { ReactiveElement, ReactiveController } from 'lit';\n\nexport class CssVariableController implements ReactiveController {\n style: CSSStyleDeclaration;\n\n constructor(public host: ReactiveElement) {\n this.style = window.getComputedStyle(host);\n }\n\n private parseProperty(name: string) {\n return name.substring(0, 2) !== '--' ? `--${name}` : name;\n }\n\n getVariable(name: string): string | null {\n return this.style.getPropertyValue(this.parseProperty(name)).trim() || null;\n }\n\n hostConnected?(): void;\n}\n"]}
1
+ {"version":3,"file":"css-variable-controller.js","sourceRoot":"","sources":["css-variable-controller.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,qBAAqB;IAGhC,YAAmB,IAAqB;QAArB,SAAI,GAAJ,IAAI,CAAiB;QACtC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1B,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,IAAY;QAChC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5D,CAAC;IAED,WAAW,CAAC,IAAY;QACtB,OAAO,IAAI,CAAC,KAAK,EAAE,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;IAC/E,CAAC;IAED,aAAa;QACX,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;IAAA,CAAC;CACH","sourcesContent":["import type { ReactiveElement, ReactiveController } from 'lit';\n\nexport class CssVariableController implements ReactiveController {\n style?: CSSStyleDeclaration;\n\n constructor(public host: ReactiveElement) {\n if (this.host.isConnected) {\n this.hostConnected();\n }\n }\n\n private parseProperty(name: string) {\n return name.substring(0, 2) !== '--' ? `--${name}` : name;\n }\n\n getVariable(name: string): string | null {\n return this.style?.getPropertyValue(this.parseProperty(name)).trim() || null;\n }\n\n hostConnected(): void {\n this.style = window.getComputedStyle(this.host);\n };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { ReactiveController, ReactiveElement } from 'lit';
1
+ import { type ReactiveController, type ReactiveElement } from 'lit';
2
2
  export interface Options {
3
3
  observe?: boolean | MutationObserverInit;
4
4
  emptyWarning?: string;
@@ -1,3 +1,4 @@
1
+ import { isServer } from 'lit';
1
2
  import { Logger } from './logger.js';
2
3
  export class LightDOMController {
3
4
  constructor(host, initializer, options) {
@@ -31,8 +32,13 @@ export class LightDOMController {
31
32
  * Returns a boolean statement of whether or not this component contains any light DOM.
32
33
  */
33
34
  hasLightDOM() {
34
- return !!(this.host.children.length > 0
35
- || (this.host.textContent ?? '').trim().length > 0);
35
+ if (isServer) {
36
+ return false;
37
+ }
38
+ else {
39
+ return !!(this.host.children.length > 0
40
+ || (this.host.textContent ?? '').trim().length > 0);
41
+ }
36
42
  }
37
43
  }
38
44
  //# sourceMappingURL=light-dom-controller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"light-dom-controller.js","sourceRoot":"","sources":["light-dom-controller.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAOrC,MAAM,OAAO,kBAAkB;IAK7B,YACU,IAAqB,EAC7B,WAAuB,EACf,OAA6B;QAF7B,SAAI,GAAJ,IAAI,CAAiB;QAErB,YAAO,GAAP,OAAO,CAAsB;QAErC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,aAAa;QACX,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED,gBAAgB;QACd,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;IACvB,CAAC;IAEO,YAAY;QAClB,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,CAAC;YAClC,8CAA8C;YAC9C,IAAI,CAAC,EAAE,CAAC,OAAO,CACb,IAAI,CAAC,IAAI,EACP,OAAO,IAAI,CAAC,OAAO,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;gBACjE,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,OAA+B,CAChD,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,CAAC,CAAC,CACP,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;eAC1B,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CACnD,CAAC;IACJ,CAAC;CACF","sourcesContent":["import type { ReactiveController, ReactiveElement } from 'lit';\n\nimport { Logger } from './logger.js';\n\nexport interface Options {\n observe?: boolean | MutationObserverInit;\n emptyWarning?: string;\n}\n\nexport class LightDOMController implements ReactiveController {\n private mo: MutationObserver;\n private logger: Logger;\n private initializer: () => void;\n\n constructor(\n private host: ReactiveElement,\n initializer: () => void,\n private options?: Options | undefined,\n ) {\n this.initializer = initializer.bind(host);\n this.mo = new MutationObserver(this.initializer);\n this.logger = new Logger(this.host);\n host.addController(this);\n }\n\n hostConnected(): void {\n if (this.hasLightDOM()) {\n this.initializer();\n } else if (this.options?.emptyWarning) {\n this.logger.warn(this.options?.emptyWarning);\n }\n\n this.initObserver();\n }\n\n hostDisconnected(): void {\n this.mo.disconnect();\n }\n\n private initObserver() {\n if (this.options?.observe ?? true) {\n // Use the provided options, or their defaults\n this.mo.observe(\n this.host,\n typeof this.options?.observe !== 'object' ? { childList: true }\n : this.options?.observe as MutationObserverInit\n );\n }\n }\n\n /**\n * Returns a boolean statement of whether or not this component contains any light DOM.\n */\n hasLightDOM(): boolean {\n return !!(\n this.host.children.length > 0\n || (this.host.textContent ?? '').trim().length > 0\n );\n }\n}\n"]}
1
+ {"version":3,"file":"light-dom-controller.js","sourceRoot":"","sources":["light-dom-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAiD,MAAM,KAAK,CAAC;AAE9E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAOrC,MAAM,OAAO,kBAAkB;IAK7B,YACU,IAAqB,EAC7B,WAAuB,EACf,OAA6B;QAF7B,SAAI,GAAJ,IAAI,CAAiB;QAErB,YAAO,GAAP,OAAO,CAAsB;QAErC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,aAAa;QACX,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED,gBAAgB;QACd,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;IACvB,CAAC;IAEO,YAAY;QAClB,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,CAAC;YAClC,8CAA8C;YAC9C,IAAI,CAAC,EAAE,CAAC,OAAO,CACb,IAAI,CAAC,IAAI,EACP,OAAO,IAAI,CAAC,OAAO,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;gBACjE,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,OAA+B,CAChD,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,WAAW;QACT,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,KAAK,CAAC;QACf,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,CAAC,CACP,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;mBAC1B,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CACnD,CAAC;QACJ,CAAC;IACH,CAAC;CACF","sourcesContent":["import { isServer, type ReactiveController, type ReactiveElement } from 'lit';\n\nimport { Logger } from './logger.js';\n\nexport interface Options {\n observe?: boolean | MutationObserverInit;\n emptyWarning?: string;\n}\n\nexport class LightDOMController implements ReactiveController {\n private mo: MutationObserver;\n private logger: Logger;\n private initializer: () => void;\n\n constructor(\n private host: ReactiveElement,\n initializer: () => void,\n private options?: Options | undefined,\n ) {\n this.initializer = initializer.bind(host);\n this.mo = new MutationObserver(this.initializer);\n this.logger = new Logger(this.host);\n host.addController(this);\n }\n\n hostConnected(): void {\n if (this.hasLightDOM()) {\n this.initializer();\n } else if (this.options?.emptyWarning) {\n this.logger.warn(this.options?.emptyWarning);\n }\n\n this.initObserver();\n }\n\n hostDisconnected(): void {\n this.mo.disconnect();\n }\n\n private initObserver() {\n if (this.options?.observe ?? true) {\n // Use the provided options, or their defaults\n this.mo.observe(\n this.host,\n typeof this.options?.observe !== 'object' ? { childList: true }\n : this.options?.observe as MutationObserverInit\n );\n }\n }\n\n /**\n * Returns a boolean statement of whether or not this component contains any light DOM.\n */\n hasLightDOM(): boolean {\n if (isServer) {\n return false;\n } else {\n return !!(\n this.host.children.length > 0\n || (this.host.textContent ?? '').trim().length > 0\n );\n }\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { ReactiveController, ReactiveControllerHost } from 'lit';
1
+ import { type ReactiveController, type ReactiveControllerHost } from 'lit';
2
2
  export interface ScrollSpyControllerOptions extends IntersectionObserverInit {
3
3
  /**
4
4
  * Tag names of legal link children.
@@ -20,6 +20,10 @@ export interface ScrollSpyControllerOptions extends IntersectionObserverInit {
20
20
  * @default el => el.getAttribute('href');
21
21
  */
22
22
  getHash?: (el: Element) => string | null;
23
+ /**
24
+ * Optional callback for when an intersection occurs
25
+ */
26
+ onIntersection?(): void;
23
27
  }
24
28
  export declare class ScrollSpyController implements ReactiveController {
25
29
  #private;
@@ -32,6 +36,7 @@ export declare class ScrollSpyController implements ReactiveController {
32
36
  set threshold(v: number | number[]);
33
37
  constructor(host: ReactiveControllerHost & HTMLElement, options: ScrollSpyControllerOptions);
34
38
  hostConnected(): void;
39
+ hostDisconnected(): void;
35
40
  /**
36
41
  * Explicitly set the active item
37
42
  * @param link usually an `<a>`
@@ -1,5 +1,6 @@
1
- var _ScrollSpyController_instances, _ScrollSpyController_tagNames, _ScrollSpyController_activeAttribute, _ScrollSpyController_io, _ScrollSpyController_passedLinks, _ScrollSpyController_force, _ScrollSpyController_intersected, _ScrollSpyController_root, _ScrollSpyController_rootMargin, _ScrollSpyController_threshold, _ScrollSpyController_getRootNode, _ScrollSpyController_getHash, _ScrollSpyController_linkChildren_get, _ScrollSpyController_initIo, _ScrollSpyController_markPassed, _ScrollSpyController_setActive, _ScrollSpyController_nextIntersection, _ScrollSpyController_onIo;
1
+ var _ScrollSpyController_instances, _a, _ScrollSpyController_instances_1, _ScrollSpyController_tagNames, _ScrollSpyController_activeAttribute, _ScrollSpyController_io, _ScrollSpyController_passedLinks, _ScrollSpyController_force, _ScrollSpyController_intersected, _ScrollSpyController_root, _ScrollSpyController_rootMargin, _ScrollSpyController_threshold, _ScrollSpyController_intersectingTargets, _ScrollSpyController_linkTargetMap, _ScrollSpyController_getRootNode, _ScrollSpyController_getHash, _ScrollSpyController_onIntersection, _ScrollSpyController_linkChildren_get, _ScrollSpyController_initializing, _ScrollSpyController_initIo, _ScrollSpyController_markPassed, _ScrollSpyController_setActive, _ScrollSpyController_activateHash, _ScrollSpyController_nextIntersection, _ScrollSpyController_onIo;
2
2
  import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
3
+ import { isServer } from 'lit';
3
4
  export class ScrollSpyController {
4
5
  get root() {
5
6
  return __classPrivateFieldGet(this, _ScrollSpyController_root, "f");
@@ -40,20 +41,30 @@ export class ScrollSpyController {
40
41
  _ScrollSpyController_root.set(this, void 0);
41
42
  _ScrollSpyController_rootMargin.set(this, void 0);
42
43
  _ScrollSpyController_threshold.set(this, void 0);
44
+ _ScrollSpyController_intersectingTargets.set(this, new Set());
45
+ _ScrollSpyController_linkTargetMap.set(this, new Map());
43
46
  _ScrollSpyController_getRootNode.set(this, void 0);
44
47
  _ScrollSpyController_getHash.set(this, void 0);
48
+ _ScrollSpyController_onIntersection.set(this, void 0);
49
+ _ScrollSpyController_initializing.set(this, true);
45
50
  host.addController(this);
46
51
  __classPrivateFieldSet(this, _ScrollSpyController_tagNames, options.tagNames, "f");
47
52
  __classPrivateFieldSet(this, _ScrollSpyController_root, options.root, "f");
48
53
  __classPrivateFieldSet(this, _ScrollSpyController_rootMargin, options.rootMargin, "f");
49
54
  __classPrivateFieldSet(this, _ScrollSpyController_activeAttribute, options.activeAttribute ?? 'active', "f");
50
55
  __classPrivateFieldSet(this, _ScrollSpyController_threshold, options.threshold ?? 0.85, "f");
51
- __classPrivateFieldSet(this, _ScrollSpyController_getRootNode, () => options.rootNode ?? host.getRootNode(), "f");
56
+ __classPrivateFieldSet(this, _ScrollSpyController_getRootNode, () => options.rootNode ?? host.getRootNode?.() ?? null, "f");
52
57
  __classPrivateFieldSet(this, _ScrollSpyController_getHash, options?.getHash ?? ((el) => el.getAttribute('href')), "f");
58
+ __classPrivateFieldSet(this, _ScrollSpyController_onIntersection, options?.onIntersection, "f");
53
59
  }
54
60
  hostConnected() {
61
+ __classPrivateFieldGet(_a, _a, "f", _ScrollSpyController_instances_1).add(this);
55
62
  __classPrivateFieldGet(this, _ScrollSpyController_instances, "m", _ScrollSpyController_initIo).call(this);
56
63
  }
64
+ hostDisconnected() {
65
+ __classPrivateFieldGet(_a, _a, "f", _ScrollSpyController_instances_1).delete(this);
66
+ __classPrivateFieldGet(this, _ScrollSpyController_io, "f")?.disconnect();
67
+ }
57
68
  /**
58
69
  * Explicitly set the active item
59
70
  * @param link usually an `<a>`
@@ -72,20 +83,29 @@ export class ScrollSpyController {
72
83
  __classPrivateFieldSet(this, _ScrollSpyController_force, false, "f");
73
84
  }
74
85
  }
75
- _ScrollSpyController_tagNames = new WeakMap(), _ScrollSpyController_activeAttribute = new WeakMap(), _ScrollSpyController_io = new WeakMap(), _ScrollSpyController_passedLinks = new WeakMap(), _ScrollSpyController_force = new WeakMap(), _ScrollSpyController_intersected = new WeakMap(), _ScrollSpyController_root = new WeakMap(), _ScrollSpyController_rootMargin = new WeakMap(), _ScrollSpyController_threshold = new WeakMap(), _ScrollSpyController_getRootNode = new WeakMap(), _ScrollSpyController_getHash = new WeakMap(), _ScrollSpyController_instances = new WeakSet(), _ScrollSpyController_linkChildren_get = function _ScrollSpyController_linkChildren_get() {
76
- return Array.from(this.host.querySelectorAll(__classPrivateFieldGet(this, _ScrollSpyController_tagNames, "f").join(',')))
77
- .filter(__classPrivateFieldGet(this, _ScrollSpyController_getHash, "f"));
78
- }, _ScrollSpyController_initIo = function _ScrollSpyController_initIo() {
86
+ _a = ScrollSpyController, _ScrollSpyController_tagNames = new WeakMap(), _ScrollSpyController_activeAttribute = new WeakMap(), _ScrollSpyController_io = new WeakMap(), _ScrollSpyController_passedLinks = new WeakMap(), _ScrollSpyController_force = new WeakMap(), _ScrollSpyController_intersected = new WeakMap(), _ScrollSpyController_root = new WeakMap(), _ScrollSpyController_rootMargin = new WeakMap(), _ScrollSpyController_threshold = new WeakMap(), _ScrollSpyController_intersectingTargets = new WeakMap(), _ScrollSpyController_linkTargetMap = new WeakMap(), _ScrollSpyController_getRootNode = new WeakMap(), _ScrollSpyController_getHash = new WeakMap(), _ScrollSpyController_onIntersection = new WeakMap(), _ScrollSpyController_initializing = new WeakMap(), _ScrollSpyController_instances = new WeakSet(), _ScrollSpyController_linkChildren_get = function _ScrollSpyController_linkChildren_get() {
87
+ if (isServer) {
88
+ return [];
89
+ }
90
+ else {
91
+ return Array.from(this.host.querySelectorAll(__classPrivateFieldGet(this, _ScrollSpyController_tagNames, "f").join(',')))
92
+ .filter(__classPrivateFieldGet(this, _ScrollSpyController_getHash, "f"));
93
+ }
94
+ }, _ScrollSpyController_initIo = async function _ScrollSpyController_initIo() {
79
95
  const rootNode = __classPrivateFieldGet(this, _ScrollSpyController_getRootNode, "f").call(this);
80
96
  if (rootNode instanceof Document || rootNode instanceof ShadowRoot) {
81
97
  const { rootMargin, threshold, root } = this;
82
98
  __classPrivateFieldSet(this, _ScrollSpyController_io, new IntersectionObserver(r => __classPrivateFieldGet(this, _ScrollSpyController_instances, "m", _ScrollSpyController_onIo).call(this, r), { root, rootMargin, threshold }), "f");
83
- __classPrivateFieldGet(this, _ScrollSpyController_instances, "a", _ScrollSpyController_linkChildren_get)
84
- .map(x => __classPrivateFieldGet(this, _ScrollSpyController_getHash, "f").call(this, x))
85
- .filter((x) => !!x)
86
- .map(x => rootNode.getElementById(x.replace('#', '')))
87
- .filter((x) => !!x)
88
- .forEach(target => __classPrivateFieldGet(this, _ScrollSpyController_io, "f")?.observe(target));
99
+ for (const link of __classPrivateFieldGet(this, _ScrollSpyController_instances, "a", _ScrollSpyController_linkChildren_get)) {
100
+ const id = __classPrivateFieldGet(this, _ScrollSpyController_getHash, "f").call(this, link)?.replace('#', '');
101
+ if (id) {
102
+ const target = document.getElementById(id);
103
+ if (target) {
104
+ __classPrivateFieldGet(this, _ScrollSpyController_io, "f")?.observe(target);
105
+ __classPrivateFieldGet(this, _ScrollSpyController_linkTargetMap, "f").set(link, target);
106
+ }
107
+ }
108
+ }
89
109
  }
90
110
  }, _ScrollSpyController_markPassed = function _ScrollSpyController_markPassed(link, force) {
91
111
  if (force) {
@@ -98,6 +118,16 @@ _ScrollSpyController_tagNames = new WeakMap(), _ScrollSpyController_activeAttrib
98
118
  for (const child of __classPrivateFieldGet(this, _ScrollSpyController_instances, "a", _ScrollSpyController_linkChildren_get)) {
99
119
  child.toggleAttribute(__classPrivateFieldGet(this, _ScrollSpyController_activeAttribute, "f"), child === link);
100
120
  }
121
+ }, _ScrollSpyController_activateHash = async function _ScrollSpyController_activateHash() {
122
+ const links = __classPrivateFieldGet(this, _ScrollSpyController_instances, "a", _ScrollSpyController_linkChildren_get);
123
+ const { hash } = location;
124
+ if (!hash) {
125
+ this.setActive(links.at(0) ?? null);
126
+ }
127
+ else {
128
+ await __classPrivateFieldGet(this, _ScrollSpyController_instances, "m", _ScrollSpyController_nextIntersection).call(this);
129
+ this.setActive(links.find(x => __classPrivateFieldGet(this, _ScrollSpyController_getHash, "f").call(this, x) === hash) ?? null);
130
+ }
101
131
  }, _ScrollSpyController_nextIntersection = async function _ScrollSpyController_nextIntersection() {
102
132
  __classPrivateFieldSet(this, _ScrollSpyController_intersected, false, "f");
103
133
  // safeguard the loop
@@ -119,5 +149,43 @@ _ScrollSpyController_tagNames = new WeakMap(), _ScrollSpyController_activeAttrib
119
149
  __classPrivateFieldGet(this, _ScrollSpyController_instances, "m", _ScrollSpyController_setActive).call(this, last ?? __classPrivateFieldGet(this, _ScrollSpyController_instances, "a", _ScrollSpyController_linkChildren_get).at(0));
120
150
  }
121
151
  __classPrivateFieldSet(this, _ScrollSpyController_intersected, true, "f");
152
+ __classPrivateFieldGet(this, _ScrollSpyController_intersectingTargets, "f").clear();
153
+ for (const entry of entries) {
154
+ if (entry.isIntersecting) {
155
+ __classPrivateFieldGet(this, _ScrollSpyController_intersectingTargets, "f").add(entry.target);
156
+ }
157
+ }
158
+ if (__classPrivateFieldGet(this, _ScrollSpyController_initializing, "f")) {
159
+ const ints = entries?.filter(x => x.isIntersecting) ?? [];
160
+ if (__classPrivateFieldGet(this, _ScrollSpyController_intersectingTargets, "f").size > 0) {
161
+ const [{ target = null } = {}] = ints;
162
+ const { id } = target ?? {};
163
+ if (id) {
164
+ const link = __classPrivateFieldGet(this, _ScrollSpyController_instances, "a", _ScrollSpyController_linkChildren_get).find(link => __classPrivateFieldGet(this, _ScrollSpyController_getHash, "f").call(this, link) === `#${id}`);
165
+ if (link) {
166
+ __classPrivateFieldGet(this, _ScrollSpyController_instances, "m", _ScrollSpyController_setActive).call(this, link);
167
+ }
168
+ }
169
+ }
170
+ __classPrivateFieldSet(this, _ScrollSpyController_initializing, false, "f");
171
+ }
172
+ __classPrivateFieldGet(this, _ScrollSpyController_onIntersection, "f")?.call(this);
122
173
  };
174
+ _ScrollSpyController_instances_1 = { value: new Set };
175
+ (() => {
176
+ if (!isServer) {
177
+ addEventListener('scroll', () => {
178
+ if (Math.round(window.innerHeight + window.scrollY) >= document.body.scrollHeight) {
179
+ __classPrivateFieldGet(_a, _a, "f", _ScrollSpyController_instances_1).forEach(ssc => {
180
+ __classPrivateFieldGet(ssc, _ScrollSpyController_instances, "m", _ScrollSpyController_setActive).call(ssc, __classPrivateFieldGet(ssc, _ScrollSpyController_instances, "a", _ScrollSpyController_linkChildren_get).at(-1));
181
+ });
182
+ }
183
+ }, { passive: true });
184
+ addEventListener('hashchange', () => {
185
+ __classPrivateFieldGet(_a, _a, "f", _ScrollSpyController_instances_1).forEach(ssc => {
186
+ __classPrivateFieldGet(ssc, _ScrollSpyController_instances, "m", _ScrollSpyController_activateHash).call(ssc);
187
+ });
188
+ });
189
+ }
190
+ })();
123
191
  //# sourceMappingURL=scroll-spy-controller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scroll-spy-controller.js","sourceRoot":"","sources":["scroll-spy-controller.ts"],"names":[],"mappings":";;AA2BA,MAAM,OAAO,mBAAmB;IA2B9B,IAAI,IAAI;QACN,OAAO,uBAAA,IAAI,iCAAM,CAAC;IACpB,CAAC;IAED,IAAI,IAAI,CAAC,CAAC;QACR,uBAAA,IAAI,6BAAS,CAAC,MAAA,CAAC;QACf,uBAAA,IAAI,+BAAI,EAAE,UAAU,EAAE,CAAC;QACvB,uBAAA,IAAI,mEAAQ,MAAZ,IAAI,CAAU,CAAC;IACjB,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,uBAAA,IAAI,uCAAY,CAAC;IAC1B,CAAC;IAED,IAAI,UAAU,CAAC,CAAC;QACd,uBAAA,IAAI,mCAAe,CAAC,MAAA,CAAC;QACrB,uBAAA,IAAI,+BAAI,EAAE,UAAU,EAAE,CAAC;QACvB,uBAAA,IAAI,mEAAQ,MAAZ,IAAI,CAAU,CAAC;IACjB,CAAC;IAED,IAAI,SAAS;QACX,OAAO,uBAAA,IAAI,sCAAW,CAAC;IACzB,CAAC;IAED,IAAI,SAAS,CAAC,CAAC;QACb,uBAAA,IAAI,kCAAc,CAAC,MAAA,CAAC;QACpB,uBAAA,IAAI,+BAAI,EAAE,UAAU,EAAE,CAAC;QACvB,uBAAA,IAAI,mEAAQ,MAAZ,IAAI,CAAU,CAAC;IACjB,CAAC;IAED,YACU,IAA0C,EAClD,OAAmC;;QAD3B,SAAI,GAAJ,IAAI,CAAsC;QAzDpD,gDAAoB;QACpB,uDAAyB;QAEzB,0CAA2B;QAE3B,uDAAuD;QACvD,2CAAe,IAAI,GAAG,EAAW,EAAC;QAElC,4BAA4B;QAC5B,qCAAS,KAAK,EAAC;QAEf,sDAAsD;QACtD,2CAAe,KAAK,EAAC;QAErB,4CAA0C;QAC1C,kDAAqB;QACrB,iDAA8B;QAE9B,mDAAyB;QACzB,+CAAyC;QAyCvC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACzB,uBAAA,IAAI,iCAAa,OAAO,CAAC,QAAQ,MAAA,CAAC;QAClC,uBAAA,IAAI,6BAAS,OAAO,CAAC,IAAI,MAAA,CAAC;QAC1B,uBAAA,IAAI,mCAAe,OAAO,CAAC,UAAU,MAAA,CAAC;QACtC,uBAAA,IAAI,wCAAoB,OAAO,CAAC,eAAe,IAAI,QAAQ,MAAA,CAAC;QAC5D,uBAAA,IAAI,kCAAc,OAAO,CAAC,SAAS,IAAI,IAAI,MAAA,CAAC;QAC5C,uBAAA,IAAI,oCAAgB,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE,MAAA,CAAC;QACjE,uBAAA,IAAI,gCAAY,OAAO,EAAE,OAAO,IAAI,CAAC,CAAC,EAAW,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,MAAA,CAAC;IACjF,CAAC;IAED,aAAa;QACX,uBAAA,IAAI,mEAAQ,MAAZ,IAAI,CAAU,CAAC;IACjB,CAAC;IAuDD;;;OAGG;IACI,KAAK,CAAC,SAAS,CAAC,IAAwB;QAC7C,uBAAA,IAAI,8BAAU,IAAI,MAAA,CAAC;QACnB,uBAAA,IAAI,sEAAW,MAAf,IAAI,EAAY,IAAI,CAAC,CAAC;QACtB,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,KAAK,MAAM,KAAK,IAAI,uBAAA,IAAI,6EAAc,EAAE,CAAC;YACvC,uBAAA,IAAI,uEAAY,MAAhB,IAAI,EAAa,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC;YACpC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;QACH,CAAC;QACD,MAAM,uBAAA,IAAI,6EAAkB,MAAtB,IAAI,CAAoB,CAAC;QAC/B,uBAAA,IAAI,8BAAU,KAAK,MAAA,CAAC;IACtB,CAAC;CACF;;IA1HG,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,uBAAA,IAAI,qCAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;SAClE,MAAM,CAAC,uBAAA,IAAI,oCAAS,CAAC,CAAC;AAC7B,CAAC;IAmDC,MAAM,QAAQ,GAAG,uBAAA,IAAI,wCAAa,MAAjB,IAAI,CAAe,CAAC;IACrC,IAAI,QAAQ,YAAY,QAAQ,IAAI,QAAQ,YAAY,UAAU,EAAE,CAAC;QACnE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;QAC7C,uBAAA,IAAI,2BAAO,IAAI,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,uBAAA,IAAI,iEAAM,MAAV,IAAI,EAAO,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,MAAA,CAAC;QACzF,uBAAA,IAAI,6EAAc;aACb,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,uBAAA,IAAI,oCAAS,MAAb,IAAI,EAAU,CAAC,CAAC,CAAC;aAC1B,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;aAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;aACrD,MAAM,CAAC,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;aACpC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,uBAAA,IAAI,+BAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACpD,CAAC;AACH,CAAC,6EAEW,IAAa,EAAE,KAAc;IACvC,IAAI,KAAK,EAAE,CAAC;QACV,uBAAA,IAAI,wCAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,uBAAA,IAAI,wCAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;AACH,CAAC,2EAEU,IAAyB;IAClC,KAAK,MAAM,KAAK,IAAI,uBAAA,IAAI,6EAAc,EAAE,CAAC;QACvC,KAAK,CAAC,eAAe,CAAC,uBAAA,IAAI,4CAAiB,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC,0CAED,KAAK;IACH,uBAAA,IAAI,oCAAgB,KAAK,MAAA,CAAC;IAC1B,qBAAqB;IACrB,UAAU,CAAC,GAAG,EAAE,CAAC,uBAAA,IAAI,oCAAgB,KAAK,MAAA,EAAE,IAAI,CAAC,CAAC;IAClD,OAAO,CAAC,uBAAA,IAAI,wCAAa,EAAE,CAAC;QAC1B,MAAM,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC,8BAED,KAAK,oCAAO,OAAoC;IAC9C,IAAI,CAAC,uBAAA,IAAI,kCAAO,EAAE,CAAC;QACjB,KAAK,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,IAAI,OAAO,EAAE,CAAC;YACvE,MAAM,QAAQ,GAAG,OAAO,uBAAA,IAAI,qCAAU,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,EAAE,IAAI,CAAC;YAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,IAAI,EAAE,CAAC;gBACT,uBAAA,IAAI,uEAAY,MAAhB,IAAI,EAAa,IAAI,EAAE,kBAAkB,CAAC,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,GAAG,uBAAA,IAAI,wCAAa,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzB,uBAAA,IAAI,sEAAW,MAAf,IAAI,EAAY,IAAI,IAAI,uBAAA,IAAI,6EAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,uBAAA,IAAI,oCAAgB,IAAI,MAAA,CAAC;AAC3B,CAAC","sourcesContent":["import type { ReactiveController, ReactiveControllerHost } from 'lit';\n\nexport interface ScrollSpyControllerOptions extends IntersectionObserverInit {\n /**\n * Tag names of legal link children.\n * Legal children must have an `href` property/attribute pair, like `<a>`.\n */\n tagNames: string[];\n\n /**\n * Attribute to set on the active link element.\n * @default 'active'\n */\n activeAttribute?: string;\n\n /**\n * The root node to query content for\n * @default the host's root node\n */\n rootNode?: Node;\n /**\n * function to call on link children to get their URL hash (i.e. id to scroll to)\n * @default el => el.getAttribute('href');\n */\n getHash?: (el: Element) => string | null;\n}\n\nexport class ScrollSpyController implements ReactiveController {\n #tagNames: string[];\n #activeAttribute: string;\n\n #io?: IntersectionObserver;\n\n /** Which link's targets have already scrolled past? */\n #passedLinks = new Set<Element>();\n\n /** Ignore intersections? */\n #force = false;\n\n /** Has the intersection observer found an element? */\n #intersected = false;\n\n #root: ScrollSpyControllerOptions['root'];\n #rootMargin?: string;\n #threshold: number | number[];\n\n #getRootNode: () => Node;\n #getHash: (el: Element) => string | null;\n\n get #linkChildren(): Element[] {\n return Array.from(this.host.querySelectorAll(this.#tagNames.join(',')))\n .filter(this.#getHash);\n }\n\n get root(): Element | Document | null | undefined {\n return this.#root;\n }\n\n set root(v) {\n this.#root = v;\n this.#io?.disconnect();\n this.#initIo();\n }\n\n get rootMargin(): string | undefined {\n return this.#rootMargin;\n }\n\n set rootMargin(v) {\n this.#rootMargin = v;\n this.#io?.disconnect();\n this.#initIo();\n }\n\n get threshold(): number | number[] {\n return this.#threshold;\n }\n\n set threshold(v) {\n this.#threshold = v;\n this.#io?.disconnect();\n this.#initIo();\n }\n\n constructor(\n private host: ReactiveControllerHost & HTMLElement,\n options: ScrollSpyControllerOptions,\n ) {\n host.addController(this);\n this.#tagNames = options.tagNames;\n this.#root = options.root;\n this.#rootMargin = options.rootMargin;\n this.#activeAttribute = options.activeAttribute ?? 'active';\n this.#threshold = options.threshold ?? 0.85;\n this.#getRootNode = () => options.rootNode ?? host.getRootNode();\n this.#getHash = options?.getHash ?? ((el: Element) => el.getAttribute('href'));\n }\n\n hostConnected(): void {\n this.#initIo();\n }\n\n #initIo() {\n const rootNode = this.#getRootNode();\n if (rootNode instanceof Document || rootNode instanceof ShadowRoot) {\n const { rootMargin, threshold, root } = this;\n this.#io = new IntersectionObserver(r => this.#onIo(r), { root, rootMargin, threshold });\n this.#linkChildren\n .map(x => this.#getHash(x))\n .filter((x): x is string => !!x)\n .map(x => rootNode.getElementById(x.replace('#', '')))\n .filter((x): x is HTMLElement => !!x)\n .forEach(target => this.#io?.observe(target));\n }\n }\n\n #markPassed(link: Element, force: boolean) {\n if (force) {\n this.#passedLinks.add(link);\n } else {\n this.#passedLinks.delete(link);\n }\n }\n\n #setActive(link?: EventTarget | null) {\n for (const child of this.#linkChildren) {\n child.toggleAttribute(this.#activeAttribute, child === link);\n }\n }\n\n async #nextIntersection() {\n this.#intersected = false;\n // safeguard the loop\n setTimeout(() => this.#intersected = false, 3000);\n while (!this.#intersected) {\n await new Promise(requestAnimationFrame);\n }\n }\n\n async #onIo(entries: IntersectionObserverEntry[]) {\n if (!this.#force) {\n for (const { target, boundingClientRect, intersectionRect } of entries) {\n const selector = `:is(${this.#tagNames.join(',')})[href=\"#${target.id}\"]`;\n const link = this.host.querySelector(selector);\n if (link) {\n this.#markPassed(link, boundingClientRect.top < intersectionRect.top);\n }\n }\n const link = [...this.#passedLinks];\n const last = link.at(-1);\n this.#setActive(last ?? this.#linkChildren.at(0));\n }\n this.#intersected = true;\n }\n\n /**\n * Explicitly set the active item\n * @param link usually an `<a>`\n */\n public async setActive(link: EventTarget | null): Promise<void> {\n this.#force = true;\n this.#setActive(link);\n let sawActive = false;\n for (const child of this.#linkChildren) {\n this.#markPassed(child, !sawActive);\n if (child === link) {\n sawActive = true;\n }\n }\n await this.#nextIntersection();\n this.#force = false;\n }\n}\n"]}
1
+ {"version":3,"file":"scroll-spy-controller.js","sourceRoot":"","sources":["scroll-spy-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { isServer, type ReactiveController, type ReactiveControllerHost } from 'lit';\n\nexport interface ScrollSpyControllerOptions extends IntersectionObserverInit {\n /**\n * Tag names of legal link children.\n * Legal children must have an `href` property/attribute pair, like `<a>`.\n */\n tagNames: string[];\n\n /**\n * Attribute to set on the active link element.\n * @default 'active'\n */\n activeAttribute?: string;\n\n /**\n * The root node to query content for\n * @default the host's root node\n */\n rootNode?: Node;\n\n /**\n * function to call on link children to get their URL hash (i.e. id to scroll to)\n * @default el => el.getAttribute('href');\n */\n getHash?: (el: Element) => string | null;\n\n /**\n * Optional callback for when an intersection occurs\n */\n onIntersection?(): void;\n}\n\nexport class ScrollSpyController implements ReactiveController {\n static #instances = new Set<ScrollSpyController>;\n\n static {\n if (!isServer) {\n addEventListener('scroll', () => {\n if (Math.round(window.innerHeight + window.scrollY) >= document.body.scrollHeight) {\n this.#instances.forEach(ssc => {\n ssc.#setActive(ssc.#linkChildren.at(-1));\n });\n }\n }, { passive: true });\n addEventListener('hashchange', () => {\n this.#instances.forEach(ssc => {\n ssc.#activateHash();\n });\n });\n }\n }\n\n #tagNames: string[];\n\n #activeAttribute: string;\n\n #io?: IntersectionObserver;\n\n /** Which link's targets have already scrolled past? */\n #passedLinks = new Set<Element>();\n\n /** Ignore intersections? */\n #force = false;\n\n /** Has the intersection observer found an element? */\n #intersected = false;\n\n #root: ScrollSpyControllerOptions['root'];\n\n #rootMargin?: string;\n\n #threshold: number | number[];\n\n #intersectingTargets = new Set<Element>();\n\n #linkTargetMap = new Map<Element, Element | null>();\n\n #getRootNode: () => Node | null;\n\n #getHash: (el: Element) => string | null;\n\n #onIntersection?: () => void;\n\n get #linkChildren(): Element[] {\n if (isServer) {\n return [];\n } else {\n return Array.from(this.host.querySelectorAll(this.#tagNames.join(',')))\n .filter(this.#getHash);\n }\n }\n\n get root(): Element | Document | null | undefined {\n return this.#root;\n }\n\n set root(v) {\n this.#root = v;\n this.#io?.disconnect();\n this.#initIo();\n }\n\n get rootMargin(): string | undefined {\n return this.#rootMargin;\n }\n\n set rootMargin(v) {\n this.#rootMargin = v;\n this.#io?.disconnect();\n this.#initIo();\n }\n\n get threshold(): number | number[] {\n return this.#threshold;\n }\n\n set threshold(v) {\n this.#threshold = v;\n this.#io?.disconnect();\n this.#initIo();\n }\n\n constructor(\n private host: ReactiveControllerHost & HTMLElement,\n options: ScrollSpyControllerOptions,\n ) {\n host.addController(this);\n this.#tagNames = options.tagNames;\n this.#root = options.root;\n this.#rootMargin = options.rootMargin;\n this.#activeAttribute = options.activeAttribute ?? 'active';\n this.#threshold = options.threshold ?? 0.85;\n this.#getRootNode = () => options.rootNode ?? host.getRootNode?.() ?? null;\n this.#getHash = options?.getHash ?? ((el: Element) => el.getAttribute('href'));\n this.#onIntersection = options?.onIntersection;\n }\n\n hostConnected(): void {\n ScrollSpyController.#instances.add(this);\n this.#initIo();\n }\n\n hostDisconnected(): void {\n ScrollSpyController.#instances.delete(this);\n this.#io?.disconnect();\n }\n\n #initializing = true;\n\n async #initIo() {\n const rootNode = this.#getRootNode();\n if (rootNode instanceof Document || rootNode instanceof ShadowRoot) {\n const { rootMargin, threshold, root } = this;\n this.#io = new IntersectionObserver(r => this.#onIo(r), { root, rootMargin, threshold });\n for (const link of this.#linkChildren) {\n const id = this.#getHash(link)?.replace('#', '');\n if (id) {\n const target = document.getElementById(id);\n if (target) {\n this.#io?.observe(target);\n this.#linkTargetMap.set(link, target);\n }\n }\n }\n }\n }\n\n #markPassed(link: Element, force: boolean) {\n if (force) {\n this.#passedLinks.add(link);\n } else {\n this.#passedLinks.delete(link);\n }\n }\n\n #setActive(link?: EventTarget | null) {\n for (const child of this.#linkChildren) {\n child.toggleAttribute(this.#activeAttribute, child === link);\n }\n }\n\n async #activateHash() {\n const links = this.#linkChildren;\n const { hash } = location;\n if (!hash) {\n this.setActive(links.at(0) ?? null);\n } else {\n await this.#nextIntersection();\n this.setActive(links.find(x => this.#getHash(x) === hash) ?? null);\n }\n }\n\n async #nextIntersection() {\n this.#intersected = false;\n // safeguard the loop\n setTimeout(() => this.#intersected = false, 3000);\n while (!this.#intersected) {\n await new Promise(requestAnimationFrame);\n }\n }\n\n async #onIo(entries: IntersectionObserverEntry[]) {\n if (!this.#force) {\n for (const { target, boundingClientRect, intersectionRect } of entries) {\n const selector = `:is(${this.#tagNames.join(',')})[href=\"#${target.id}\"]`;\n const link = this.host.querySelector(selector);\n if (link) {\n this.#markPassed(link, boundingClientRect.top < intersectionRect.top);\n }\n }\n const link = [...this.#passedLinks];\n const last = link.at(-1);\n this.#setActive(last ?? this.#linkChildren.at(0));\n }\n this.#intersected = true;\n this.#intersectingTargets.clear();\n for (const entry of entries) {\n if (entry.isIntersecting) {\n this.#intersectingTargets.add(entry.target);\n }\n }\n if (this.#initializing) {\n const ints = entries?.filter(x => x.isIntersecting) ?? [];\n if (this.#intersectingTargets.size > 0) {\n const [{ target = null } = {}] = ints;\n const { id } = target ?? {};\n if (id) {\n const link = this.#linkChildren.find(link => this.#getHash(link) === `#${id}`);\n if (link) {\n this.#setActive(link);\n }\n }\n }\n this.#initializing = false;\n }\n this.#onIntersection?.();\n }\n\n /**\n * Explicitly set the active item\n * @param link usually an `<a>`\n */\n public async setActive(link: EventTarget | null): Promise<void> {\n this.#force = true;\n this.#setActive(link);\n let sawActive = false;\n for (const child of this.#linkChildren) {\n this.#markPassed(child, !sawActive);\n if (child === link) {\n sawActive = true;\n }\n }\n await this.#nextIntersection();\n this.#force = false;\n }\n}\n"]}
@@ -0,0 +1,16 @@
1
+ import type { ReactiveElement } from 'lit';
2
+ import { type SlotControllerArgs, type SlotControllerPublicAPI } from './slot-controller.js';
3
+ export declare class SlotController implements SlotControllerPublicAPI {
4
+ host: ReactiveElement;
5
+ static default: symbol;
6
+ /** @deprecated use `default` */
7
+ static anonymous: symbol;
8
+ static attribute: "ssr-hint-has-slotted";
9
+ static anonymousAttribute: "ssr-hint-has-slotted-default";
10
+ constructor(host: ReactiveElement, ..._: SlotControllerArgs);
11
+ hostConnected?(): Promise<void>;
12
+ private fromAttribute;
13
+ getSlotted<T extends Element = Element>(..._: string[]): T[];
14
+ hasSlotted(...names: (string | null)[]): boolean;
15
+ isEmpty(...names: (string | null)[]): boolean;
16
+ }
@@ -0,0 +1,32 @@
1
+ var _a;
2
+ import {} from './slot-controller.js';
3
+ export class SlotController {
4
+ constructor(host, ..._) {
5
+ this.host = host;
6
+ host.addController(this);
7
+ }
8
+ fromAttribute(slots) {
9
+ return (slots ?? '')
10
+ .split(/[, ]/)
11
+ .map(x => x.trim());
12
+ }
13
+ getSlotted(..._) {
14
+ return [];
15
+ }
16
+ hasSlotted(...names) {
17
+ const attr = this.host.getAttribute(_a.attribute);
18
+ const anon = this.host.hasAttribute(_a.anonymousAttribute);
19
+ const hints = new Set(this.fromAttribute(attr));
20
+ return names.every(x => x === null ? anon : hints.has(x));
21
+ }
22
+ isEmpty(...names) {
23
+ return !this.hasSlotted(...names);
24
+ }
25
+ }
26
+ _a = SlotController;
27
+ SlotController.default = Symbol('default slot');
28
+ /** @deprecated use `default` */
29
+ SlotController.anonymous = _a.default;
30
+ SlotController.attribute = 'ssr-hint-has-slotted';
31
+ SlotController.anonymousAttribute = 'ssr-hint-has-slotted-default';
32
+ //# sourceMappingURL=slot-controller-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slot-controller-server.js","sourceRoot":"","sources":["slot-controller-server.ts"],"names":[],"mappings":";AACA,OAAO,EAGN,MAAM,sBAAsB,CAAC;AAE9B,MAAM,OAAO,cAAc;IAUzB,YAAmB,IAAqB,EAAE,GAAG,CAAqB;QAA/C,SAAI,GAAJ,IAAI,CAAiB;QACtC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAIO,aAAa,CAAC,KAAoB;QACxC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;aACf,KAAK,CAAC,MAAM,CAAC;aACb,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,UAAU,CAA8B,GAAG,CAAW;QACpD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,UAAU,CAAC,GAAG,KAAwB;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAc,CAAC,SAAS,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAc,CAAC,kBAAkB,CAAC,CAAC;QACvE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QAChD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,CAAC,GAAG,KAAwB;QACjC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,CAAC;IACpC,CAAC;;;AAlCa,sBAAO,GAAG,MAAM,CAAC,cAAc,CAA4B,AAApD,CAAqD;AAE1E,gCAAgC;AAClB,wBAAS,GAAW,EAAI,CAAC,OAAO,AAAvB,CAAwB;AAExC,wBAAS,GAAG,sBAA+B,AAAlC,CAAmC;AAE5C,iCAAkB,GAAG,8BAAuC,AAA1C,CAA2C","sourcesContent":["import type { ReactiveElement } from 'lit';\nimport {\n type SlotControllerArgs,\n type SlotControllerPublicAPI,\n} from './slot-controller.js';\n\nexport class SlotController implements SlotControllerPublicAPI {\n public static default = Symbol('default slot') satisfies symbol as symbol;\n\n /** @deprecated use `default` */\n public static anonymous: symbol = this.default;\n\n static attribute = 'ssr-hint-has-slotted' as const;\n\n static anonymousAttribute = 'ssr-hint-has-slotted-default' as const;\n\n constructor(public host: ReactiveElement, ..._: SlotControllerArgs) {\n host.addController(this);\n }\n\n hostConnected?(): Promise<void>;\n\n private fromAttribute(slots: string | null) {\n return (slots ?? '')\n .split(/[, ]/)\n .map(x => x.trim());\n }\n\n getSlotted<T extends Element = Element>(..._: string[]): T[] {\n return [];\n }\n\n hasSlotted(...names: (string | null)[]): boolean {\n const attr = this.host.getAttribute(SlotController.attribute);\n const anon = this.host.hasAttribute(SlotController.anonymousAttribute);\n const hints = new Set(this.fromAttribute(attr));\n return names.every(x => x === null ? anon : hints.has(x));\n }\n\n isEmpty(...names: (string | null)[]): boolean {\n return !this.hasSlotted(...names);\n }\n}\n"]}
@@ -9,8 +9,9 @@ interface NamedSlot extends AnonymousSlot {
9
9
  initialized: true;
10
10
  }
11
11
  export type Slot = NamedSlot | AnonymousSlot;
12
+ export type SlotName = string | null;
12
13
  export interface SlotsConfig {
13
- slots: (string | null)[];
14
+ slots: SlotName[];
14
15
  /**
15
16
  * Object mapping new slot name keys to deprecated slot name values
16
17
  * @example `pf-modal--header` is deprecated in favour of `header`
@@ -25,13 +26,55 @@ export interface SlotsConfig {
25
26
  */
26
27
  deprecations?: Record<string, string>;
27
28
  }
28
- export declare class SlotController implements ReactiveController {
29
+ export type SlotControllerArgs = [SlotsConfig] | SlotName[];
30
+ export declare function isObjectSpread(config: SlotControllerArgs): config is [SlotsConfig];
31
+ export declare class SlotControllerPublicAPI implements ReactiveController {
32
+ static default: symbol;
33
+ host: ReactiveElement;
34
+ constructor(host: ReactiveElement, ...args: SlotControllerArgs);
35
+ hostConnected?(): Promise<void>;
36
+ hostDisconnected?(): void;
37
+ hostUpdated?(): void;
38
+ /**
39
+ * Given a slot name or slot names, returns elements assigned to the requested slots as an array.
40
+ * If no value is provided, it returns all children not assigned to a slot (without a slot attribute).
41
+ * @param slotNames slots to query
42
+ * @example Get header-slotted elements
43
+ * ```js
44
+ * this.getSlotted('header')
45
+ * ```
46
+ * @example Get header- and footer-slotted elements
47
+ * ```js
48
+ * this.getSlotted('header', 'footer')
49
+ * ```
50
+ * @example Get default-slotted elements
51
+ * ```js
52
+ * this.getSlotted();
53
+ * ```
54
+ */
55
+ getSlotted<T extends Element = Element>(...slotNames: string[]): T[];
56
+ /**
57
+ * Returns a boolean statement of whether or not any of those slots exists in the light DOM.
58
+ * @param names The slot names to check.
59
+ * @example this.hasSlotted('header');
60
+ */
61
+ hasSlotted(...names: (string | null | undefined)[]): boolean;
62
+ /**
63
+ * Whether or not all the requested slots are empty.
64
+ * @param names The slot names to query. If no value is provided, it returns the default slot.
65
+ * @example this.isEmpty('header', 'footer');
66
+ * @example this.isEmpty();
67
+ * @returns
68
+ */
69
+ isEmpty(...names: (string | null | undefined)[]): boolean;
70
+ }
71
+ export declare class SlotController implements SlotControllerPublicAPI {
29
72
  #private;
30
73
  host: ReactiveElement;
31
74
  static default: symbol;
32
75
  /** @deprecated use `default` */
33
76
  static anonymous: symbol;
34
- constructor(host: ReactiveElement, ...config: ([SlotsConfig] | (string | null)[]));
77
+ constructor(host: ReactiveElement, ...args: SlotControllerArgs);
35
78
  hostConnected(): Promise<void>;
36
79
  hostUpdated(): void;
37
80
  hostDisconnected(): void;
@@ -1,7 +1,6 @@
1
- var _SlotController_instances, _a, _SlotController_nodes, _SlotController_logger, _SlotController_firstUpdated, _SlotController_mo, _SlotController_slotNames, _SlotController_deprecations, _SlotController_onSlotChange, _SlotController_onMutation, _SlotController_getChildrenForSlot, _SlotController_initSlot;
1
+ var _SlotController_instances, _a, _SlotController_nodes, _SlotController_slotMapInitialized, _SlotController_slotNames, _SlotController_deprecations, _SlotController_mo, _SlotController_initialize, _SlotController_initSlotMap, _SlotController_getSlotElement, _SlotController_getChildrenForSlot;
2
2
  import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
3
- import { Logger } from './logger.js';
4
- function isObjectConfigSpread(config) {
3
+ export function isObjectSpread(config) {
5
4
  return config.length === 1 && typeof config[0] === 'object' && config[0] !== null;
6
5
  }
7
6
  /**
@@ -12,75 +11,32 @@ function isObjectConfigSpread(config) {
12
11
  const isSlot = (n) => (child) => n === SlotController.default ? !child.hasAttribute('slot')
13
12
  : child.getAttribute('slot') === n;
14
13
  export class SlotController {
15
- constructor(host, ...config) {
14
+ constructor(host, ...args) {
16
15
  _SlotController_instances.add(this);
17
16
  this.host = host;
18
17
  _SlotController_nodes.set(this, new Map());
19
- _SlotController_logger.set(this, void 0);
20
- _SlotController_firstUpdated.set(this, false);
21
- _SlotController_mo.set(this, new MutationObserver(records => __classPrivateFieldGet(this, _SlotController_onMutation, "f").call(this, records)));
22
- _SlotController_slotNames.set(this, void 0);
18
+ _SlotController_slotMapInitialized.set(this, false);
19
+ _SlotController_slotNames.set(this, []);
23
20
  _SlotController_deprecations.set(this, {});
24
- _SlotController_onSlotChange.set(this, (event) => {
25
- const slotName = event.target.name;
26
- __classPrivateFieldGet(this, _SlotController_initSlot, "f").call(this, slotName);
27
- this.host.requestUpdate();
28
- });
29
- _SlotController_onMutation.set(this, async (records) => {
30
- const changed = [];
31
- for (const { addedNodes, removedNodes } of records) {
32
- for (const node of [...addedNodes, ...removedNodes]) {
33
- if (node instanceof HTMLElement && node.slot) {
34
- __classPrivateFieldGet(this, _SlotController_initSlot, "f").call(this, node.slot);
35
- changed.push(node.slot);
36
- }
37
- }
38
- }
39
- this.host.requestUpdate();
40
- });
41
- _SlotController_initSlot.set(this, (slotName) => {
42
- const name = slotName || _a.default;
43
- const elements = __classPrivateFieldGet(this, _SlotController_nodes, "f").get(name)?.slot?.assignedElements?.()
44
- ?? __classPrivateFieldGet(this, _SlotController_instances, "m", _SlotController_getChildrenForSlot).call(this, name);
45
- const selector = slotName ? `slot[name="${slotName}"]` : 'slot:not([name])';
46
- const slot = this.host.shadowRoot?.querySelector?.(selector) ?? null;
47
- const hasContent = !!elements.length;
48
- __classPrivateFieldGet(this, _SlotController_nodes, "f").set(name, { elements, name: slotName ?? '', hasContent, slot });
49
- __classPrivateFieldGet(this, _SlotController_logger, "f").debug(slotName, hasContent);
50
- });
51
- __classPrivateFieldSet(this, _SlotController_logger, new Logger(this.host), "f");
52
- if (isObjectConfigSpread(config)) {
53
- const [{ slots, deprecations }] = config;
54
- __classPrivateFieldSet(this, _SlotController_slotNames, slots, "f");
55
- __classPrivateFieldSet(this, _SlotController_deprecations, deprecations ?? {}, "f");
56
- }
57
- else if (config.length >= 1) {
58
- __classPrivateFieldSet(this, _SlotController_slotNames, config, "f");
59
- __classPrivateFieldSet(this, _SlotController_deprecations, {}, "f");
60
- }
61
- else {
21
+ _SlotController_mo.set(this, new MutationObserver(__classPrivateFieldGet(this, _SlotController_instances, "m", _SlotController_initSlotMap).bind(this)));
22
+ __classPrivateFieldGet(this, _SlotController_instances, "m", _SlotController_initialize).call(this, ...args);
23
+ host.addController(this);
24
+ if (!__classPrivateFieldGet(this, _SlotController_slotNames, "f").length) {
62
25
  __classPrivateFieldSet(this, _SlotController_slotNames, [null], "f");
63
26
  }
64
- host.addController(this);
65
27
  }
66
28
  async hostConnected() {
67
- this.host.addEventListener('slotchange', __classPrivateFieldGet(this, _SlotController_onSlotChange, "f"));
68
- __classPrivateFieldSet(this, _SlotController_firstUpdated, false, "f");
69
29
  __classPrivateFieldGet(this, _SlotController_mo, "f").observe(this.host, { childList: true });
70
30
  // Map the defined slots into an object that is easier to query
71
31
  __classPrivateFieldGet(this, _SlotController_nodes, "f").clear();
72
- // Loop over the properties provided by the schema
73
- __classPrivateFieldGet(this, _SlotController_slotNames, "f").forEach(__classPrivateFieldGet(this, _SlotController_initSlot, "f"));
74
- Object.values(__classPrivateFieldGet(this, _SlotController_deprecations, "f")).forEach(__classPrivateFieldGet(this, _SlotController_initSlot, "f"));
75
- this.host.requestUpdate();
32
+ __classPrivateFieldGet(this, _SlotController_instances, "m", _SlotController_initSlotMap).call(this);
76
33
  // insurance for framework integrations
77
34
  await this.host.updateComplete;
78
35
  this.host.requestUpdate();
79
36
  }
80
37
  hostUpdated() {
81
- if (!__classPrivateFieldGet(this, _SlotController_firstUpdated, "f")) {
82
- __classPrivateFieldGet(this, _SlotController_slotNames, "f").forEach(__classPrivateFieldGet(this, _SlotController_initSlot, "f"));
83
- __classPrivateFieldSet(this, _SlotController_firstUpdated, true, "f");
38
+ if (!__classPrivateFieldGet(this, _SlotController_slotMapInitialized, "f")) {
39
+ __classPrivateFieldGet(this, _SlotController_instances, "m", _SlotController_initSlotMap).call(this);
84
40
  }
85
41
  }
86
42
  hostDisconnected() {
@@ -134,9 +90,40 @@ export class SlotController {
134
90
  return !this.hasSlotted(...names);
135
91
  }
136
92
  }
137
- _a = SlotController, _SlotController_nodes = new WeakMap(), _SlotController_logger = new WeakMap(), _SlotController_firstUpdated = new WeakMap(), _SlotController_mo = new WeakMap(), _SlotController_slotNames = new WeakMap(), _SlotController_deprecations = new WeakMap(), _SlotController_onSlotChange = new WeakMap(), _SlotController_onMutation = new WeakMap(), _SlotController_initSlot = new WeakMap(), _SlotController_instances = new WeakSet(), _SlotController_getChildrenForSlot = function _SlotController_getChildrenForSlot(name) {
138
- const children = Array.from(this.host.children);
139
- return children.filter(isSlot(name));
93
+ _a = SlotController, _SlotController_nodes = new WeakMap(), _SlotController_slotMapInitialized = new WeakMap(), _SlotController_slotNames = new WeakMap(), _SlotController_deprecations = new WeakMap(), _SlotController_mo = new WeakMap(), _SlotController_instances = new WeakSet(), _SlotController_initialize = function _SlotController_initialize(...config) {
94
+ if (isObjectSpread(config)) {
95
+ const [{ slots, deprecations }] = config;
96
+ __classPrivateFieldSet(this, _SlotController_slotNames, slots, "f");
97
+ __classPrivateFieldSet(this, _SlotController_deprecations, deprecations ?? {}, "f");
98
+ }
99
+ else if (config.length >= 1) {
100
+ __classPrivateFieldSet(this, _SlotController_slotNames, config, "f");
101
+ __classPrivateFieldSet(this, _SlotController_deprecations, {}, "f");
102
+ }
103
+ }, _SlotController_initSlotMap = function _SlotController_initSlotMap() {
104
+ // Loop over the properties provided by the schema
105
+ for (const slotName of __classPrivateFieldGet(this, _SlotController_slotNames, "f")
106
+ .concat(Object.values(__classPrivateFieldGet(this, _SlotController_deprecations, "f")))) {
107
+ const slotId = slotName || _a.default;
108
+ const name = slotName ?? '';
109
+ const elements = __classPrivateFieldGet(this, _SlotController_instances, "m", _SlotController_getChildrenForSlot).call(this, slotId);
110
+ const slot = __classPrivateFieldGet(this, _SlotController_instances, "m", _SlotController_getSlotElement).call(this, slotId);
111
+ const hasContent = !!elements.length || !!slot?.assignedNodes?.()?.filter(x => x.textContent?.trim()).length;
112
+ __classPrivateFieldGet(this, _SlotController_nodes, "f").set(slotId, { elements, name, hasContent, slot });
113
+ }
114
+ this.host.requestUpdate();
115
+ __classPrivateFieldSet(this, _SlotController_slotMapInitialized, true, "f");
116
+ }, _SlotController_getSlotElement = function _SlotController_getSlotElement(slotId) {
117
+ const selector = slotId === _a.default ? 'slot:not([name])' : `slot[name="${slotId}"]`;
118
+ return this.host.shadowRoot?.querySelector?.(selector) ?? null;
119
+ }, _SlotController_getChildrenForSlot = function _SlotController_getChildrenForSlot(name) {
120
+ if (__classPrivateFieldGet(this, _SlotController_nodes, "f").has(name)) {
121
+ return (__classPrivateFieldGet(this, _SlotController_nodes, "f").get(name).slot?.assignedElements?.() ?? []);
122
+ }
123
+ else {
124
+ const children = Array.from(this.host.children);
125
+ return children.filter(isSlot(name));
126
+ }
140
127
  };
141
128
  SlotController.default = Symbol('default slot');
142
129
  /** @deprecated use `default` */