@patternfly/pfe-core 2.4.1 → 4.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.
Files changed (104) hide show
  1. package/README.md +0 -1
  2. package/controllers/activedescendant-controller.d.ts +99 -0
  3. package/controllers/activedescendant-controller.js +230 -0
  4. package/controllers/activedescendant-controller.js.map +1 -0
  5. package/controllers/at-focus-controller.d.ts +56 -0
  6. package/controllers/at-focus-controller.js +168 -0
  7. package/controllers/at-focus-controller.js.map +1 -0
  8. package/controllers/cascade-controller.d.ts +11 -0
  9. package/controllers/cascade-controller.js +10 -3
  10. package/controllers/cascade-controller.js.map +1 -1
  11. package/controllers/combobox-controller.d.ts +117 -0
  12. package/controllers/combobox-controller.js +611 -0
  13. package/controllers/combobox-controller.js.map +1 -0
  14. package/controllers/css-variable-controller.js +1 -1
  15. package/controllers/css-variable-controller.js.map +1 -1
  16. package/controllers/floating-dom-controller.d.ts +10 -3
  17. package/controllers/floating-dom-controller.js +93 -83
  18. package/controllers/floating-dom-controller.js.map +1 -1
  19. package/controllers/internals-controller.d.ts +104 -42
  20. package/controllers/internals-controller.js +354 -36
  21. package/controllers/internals-controller.js.map +1 -1
  22. package/controllers/light-dom-controller.js +2 -2
  23. package/controllers/light-dom-controller.js.map +1 -1
  24. package/controllers/listbox-controller.d.ts +143 -0
  25. package/controllers/listbox-controller.js +443 -0
  26. package/controllers/listbox-controller.js.map +1 -0
  27. package/controllers/logger.d.ts +33 -6
  28. package/controllers/logger.js +58 -13
  29. package/controllers/logger.js.map +1 -1
  30. package/controllers/overflow-controller.d.ts +10 -3
  31. package/controllers/overflow-controller.js +79 -44
  32. package/controllers/overflow-controller.js.map +1 -1
  33. package/controllers/perf-controller.js.map +1 -1
  34. package/controllers/property-observer-controller.d.ts +13 -16
  35. package/controllers/property-observer-controller.js +55 -27
  36. package/controllers/property-observer-controller.js.map +1 -1
  37. package/controllers/roving-tabindex-controller.d.ts +19 -50
  38. package/controllers/roving-tabindex-controller.js +64 -183
  39. package/controllers/roving-tabindex-controller.js.map +1 -1
  40. package/controllers/scroll-spy-controller.d.ts +4 -1
  41. package/controllers/scroll-spy-controller.js +94 -93
  42. package/controllers/scroll-spy-controller.js.map +1 -1
  43. package/controllers/slot-controller.d.ts +26 -19
  44. package/controllers/slot-controller.js +94 -83
  45. package/controllers/slot-controller.js.map +1 -1
  46. package/controllers/style-controller.js +3 -1
  47. package/controllers/style-controller.js.map +1 -1
  48. package/controllers/tabs-aria-controller.d.ts +31 -0
  49. package/controllers/tabs-aria-controller.js +97 -0
  50. package/controllers/tabs-aria-controller.js.map +1 -0
  51. package/controllers/test/combobox-controller.spec.d.ts +1 -0
  52. package/controllers/test/combobox-controller.spec.js +282 -0
  53. package/controllers/test/combobox-controller.spec.js.map +1 -0
  54. package/controllers/timestamp-controller.js +73 -70
  55. package/controllers/timestamp-controller.js.map +1 -1
  56. package/core.d.ts +3 -23
  57. package/core.js +1 -38
  58. package/core.js.map +1 -1
  59. package/custom-elements.json +7302 -2817
  60. package/decorators/bound.d.ts +3 -1
  61. package/decorators/bound.js +3 -1
  62. package/decorators/bound.js.map +1 -1
  63. package/decorators/cascades.d.ts +2 -0
  64. package/decorators/cascades.js +2 -0
  65. package/decorators/cascades.js.map +1 -1
  66. package/decorators/deprecation.d.ts +6 -5
  67. package/decorators/deprecation.js +6 -5
  68. package/decorators/deprecation.js.map +1 -1
  69. package/decorators/initializer.js.map +1 -1
  70. package/decorators/listen.d.ts +8 -0
  71. package/decorators/listen.js +22 -0
  72. package/decorators/listen.js.map +1 -0
  73. package/decorators/observed.d.ts +12 -16
  74. package/decorators/observed.js +39 -44
  75. package/decorators/observed.js.map +1 -1
  76. package/decorators/observes.d.ts +15 -0
  77. package/decorators/observes.js +30 -0
  78. package/decorators/observes.js.map +1 -0
  79. package/decorators/time.d.ts +1 -0
  80. package/decorators/time.js +6 -9
  81. package/decorators/time.js.map +1 -1
  82. package/decorators/trace.d.ts +4 -1
  83. package/decorators/trace.js +4 -1
  84. package/decorators/trace.js.map +1 -1
  85. package/decorators.d.ts +2 -0
  86. package/decorators.js +2 -0
  87. package/decorators.js.map +1 -1
  88. package/functions/arraysAreEquivalent.d.ts +9 -0
  89. package/functions/arraysAreEquivalent.js +28 -0
  90. package/functions/arraysAreEquivalent.js.map +1 -0
  91. package/functions/containsDeep.d.ts +8 -0
  92. package/functions/containsDeep.js +23 -0
  93. package/functions/containsDeep.js.map +1 -0
  94. package/functions/context.d.ts +8 -0
  95. package/functions/context.js +21 -0
  96. package/functions/context.js.map +1 -0
  97. package/functions/debounce.js.map +1 -1
  98. package/functions/isElementInView.d.ts +4 -6
  99. package/functions/isElementInView.js +9 -11
  100. package/functions/isElementInView.js.map +1 -1
  101. package/package.json +10 -4
  102. package/functions/deprecatedCustomEvent.d.ts +0 -5
  103. package/functions/deprecatedCustomEvent.js +0 -12
  104. package/functions/deprecatedCustomEvent.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"scroll-spy-controller.js","sourceRoot":"","sources":["scroll-spy-controller.ts"],"names":[],"mappings":"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","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 #rootNode: 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() {\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() {\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() {\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.#rootNode = options.rootNode ?? host.getRootNode();\n this.#getHash = options?.getHash ?? ((el: Element) => el.getAttribute('href'));\n }\n\n hostConnected() {\n this.#initIo();\n }\n\n #initIo() {\n const rootNode = this.#rootNode;\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 /** Explicitly set the active item */\n public async setActive(link: EventTarget | null) {\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 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"]}
@@ -28,37 +28,44 @@ export interface SlotsConfig {
28
28
  export declare class SlotController implements ReactiveController {
29
29
  #private;
30
30
  host: ReactiveElement;
31
+ static default: symbol;
32
+ /** @deprecated use `default` */
31
33
  static anonymous: symbol;
32
34
  constructor(host: ReactiveElement, ...config: ([SlotsConfig] | (string | null)[]));
33
35
  hostConnected(): Promise<void>;
34
36
  hostUpdated(): void;
35
37
  hostDisconnected(): void;
36
- /**
37
- * Returns a boolean statement of whether or not any of those slots exists in the light DOM.
38
- *
39
- * @param {String|Array} name The slot name.
40
- * @example this.hasSlotted("header");
41
- */
42
- hasSlotted(...names: string[]): boolean;
43
38
  /**
44
39
  * Given a slot name or slot names, returns elements assigned to the requested slots as an array.
45
40
  * If no value is provided, it returns all children not assigned to a slot (without a slot attribute).
46
- *
41
+ * @param slotNames slots to query
47
42
  * @example Get header-slotted elements
48
- * ```js
49
- * this.getSlotted('header')
50
- * ```
51
- *
43
+ * ```js
44
+ * this.getSlotted('header')
45
+ * ```
52
46
  * @example Get header- and footer-slotted elements
53
- * ```js
54
- * this.getSlotted('header', 'footer')
55
- * ```
56
- *
47
+ * ```js
48
+ * this.getSlotted('header', 'footer')
49
+ * ```
57
50
  * @example Get default-slotted elements
58
- * ```js
59
- * this.getSlotted();
60
- * ```
51
+ * ```js
52
+ * this.getSlotted();
53
+ * ```
61
54
  */
62
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;
63
70
  }
64
71
  export {};
@@ -1,3 +1,5 @@
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;
2
+ import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
1
3
  import { Logger } from './logger.js';
2
4
  function isObjectConfigSpread(config) {
3
5
  return config.length === 1 && typeof config[0] === 'object' && config[0] !== null;
@@ -5,129 +7,138 @@ function isObjectConfigSpread(config) {
5
7
  /**
6
8
  * If it's a named slot, return its children,
7
9
  * for the default slot, look for direct children not assigned to a slot
10
+ * @param n slot name
8
11
  */
9
- const isSlot = (n) => (child) => n === SlotController.anonymous ? !child.hasAttribute('slot')
12
+ const isSlot = (n) => (child) => n === SlotController.default ? !child.hasAttribute('slot')
10
13
  : child.getAttribute('slot') === n;
11
- class SlotController {
12
- static { this.anonymous = Symbol('anonymous slot'); }
13
- #nodes = new Map();
14
- #logger;
15
- #firstUpdated = false;
16
- #mo = new MutationObserver(records => this.#onMutation(records));
17
- #slotNames;
18
- #deprecations = {};
14
+ export class SlotController {
19
15
  constructor(host, ...config) {
16
+ _SlotController_instances.add(this);
20
17
  this.host = host;
21
- this.#logger = new Logger(this.host);
18
+ _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);
23
+ _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");
22
52
  if (isObjectConfigSpread(config)) {
23
53
  const [{ slots, deprecations }] = config;
24
- this.#slotNames = slots;
25
- this.#deprecations = deprecations ?? {};
54
+ __classPrivateFieldSet(this, _SlotController_slotNames, slots, "f");
55
+ __classPrivateFieldSet(this, _SlotController_deprecations, deprecations ?? {}, "f");
26
56
  }
27
57
  else if (config.length >= 1) {
28
- this.#slotNames = config;
29
- this.#deprecations = {};
58
+ __classPrivateFieldSet(this, _SlotController_slotNames, config, "f");
59
+ __classPrivateFieldSet(this, _SlotController_deprecations, {}, "f");
30
60
  }
31
61
  else {
32
- this.#slotNames = [null];
62
+ __classPrivateFieldSet(this, _SlotController_slotNames, [null], "f");
33
63
  }
34
64
  host.addController(this);
35
65
  }
36
66
  async hostConnected() {
37
- this.host.addEventListener('slotchange', this.#onSlotChange);
38
- this.#firstUpdated = false;
39
- this.#mo.observe(this.host, { childList: true });
67
+ this.host.addEventListener('slotchange', __classPrivateFieldGet(this, _SlotController_onSlotChange, "f"));
68
+ __classPrivateFieldSet(this, _SlotController_firstUpdated, false, "f");
69
+ __classPrivateFieldGet(this, _SlotController_mo, "f").observe(this.host, { childList: true });
40
70
  // Map the defined slots into an object that is easier to query
41
- this.#nodes.clear();
71
+ __classPrivateFieldGet(this, _SlotController_nodes, "f").clear();
42
72
  // Loop over the properties provided by the schema
43
- this.#slotNames.forEach(this.#initSlot);
44
- Object.values(this.#deprecations).forEach(this.#initSlot);
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"));
45
75
  this.host.requestUpdate();
46
76
  // insurance for framework integrations
47
77
  await this.host.updateComplete;
48
78
  this.host.requestUpdate();
49
79
  }
50
80
  hostUpdated() {
51
- if (!this.#firstUpdated) {
52
- this.#slotNames.forEach(this.#initSlot);
53
- this.#firstUpdated = true;
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");
54
84
  }
55
85
  }
56
86
  hostDisconnected() {
57
- this.#mo.disconnect();
58
- }
59
- /**
60
- * Returns a boolean statement of whether or not any of those slots exists in the light DOM.
61
- *
62
- * @param {String|Array} name The slot name.
63
- * @example this.hasSlotted("header");
64
- */
65
- hasSlotted(...names) {
66
- if (!names.length) {
67
- this.#logger.warn(`Please provide at least one slot name for which to search.`);
68
- return false;
69
- }
70
- else {
71
- return names.some(x => this.#nodes.get(x)?.hasContent ?? false);
72
- }
87
+ __classPrivateFieldGet(this, _SlotController_mo, "f").disconnect();
73
88
  }
74
89
  /**
75
90
  * Given a slot name or slot names, returns elements assigned to the requested slots as an array.
76
91
  * If no value is provided, it returns all children not assigned to a slot (without a slot attribute).
77
- *
92
+ * @param slotNames slots to query
78
93
  * @example Get header-slotted elements
79
- * ```js
80
- * this.getSlotted('header')
81
- * ```
82
- *
94
+ * ```js
95
+ * this.getSlotted('header')
96
+ * ```
83
97
  * @example Get header- and footer-slotted elements
84
- * ```js
85
- * this.getSlotted('header', 'footer')
86
- * ```
87
- *
98
+ * ```js
99
+ * this.getSlotted('header', 'footer')
100
+ * ```
88
101
  * @example Get default-slotted elements
89
- * ```js
90
- * this.getSlotted();
91
- * ```
102
+ * ```js
103
+ * this.getSlotted();
104
+ * ```
92
105
  */
93
106
  getSlotted(...slotNames) {
94
107
  if (!slotNames.length) {
95
- return (this.#nodes.get(SlotController.anonymous)?.elements ?? []);
108
+ return (__classPrivateFieldGet(this, _SlotController_nodes, "f").get(_a.default)?.elements ?? []);
96
109
  }
97
110
  else {
98
- return slotNames.flatMap(slotName => this.#nodes.get(slotName)?.elements ?? []);
111
+ return slotNames.flatMap(slotName => __classPrivateFieldGet(this, _SlotController_nodes, "f").get(slotName)?.elements ?? []);
99
112
  }
100
113
  }
101
- #onSlotChange = (event) => {
102
- const slotName = event.target.name;
103
- this.#initSlot(slotName);
104
- this.host.requestUpdate();
105
- };
106
- #onMutation = async (records) => {
107
- const changed = [];
108
- for (const { addedNodes, removedNodes } of records) {
109
- for (const node of [...addedNodes, ...removedNodes]) {
110
- if (node instanceof HTMLElement && node.slot) {
111
- this.#initSlot(node.slot);
112
- changed.push(node.slot);
113
- }
114
- }
114
+ /**
115
+ * Returns a boolean statement of whether or not any of those slots exists in the light DOM.
116
+ * @param names The slot names to check.
117
+ * @example this.hasSlotted('header');
118
+ */
119
+ hasSlotted(...names) {
120
+ const slotNames = Array.from(names, x => x == null ? _a.default : x);
121
+ if (!slotNames.length) {
122
+ slotNames.push(_a.default);
115
123
  }
116
- this.host.requestUpdate();
117
- };
118
- #getChildrenForSlot(name) {
119
- const children = Array.from(this.host.children);
120
- return children.filter(isSlot(name));
124
+ return slotNames.some(x => __classPrivateFieldGet(this, _SlotController_nodes, "f").get(x)?.hasContent ?? false);
125
+ }
126
+ /**
127
+ * Whether or not all the requested slots are empty.
128
+ * @param names The slot names to query. If no value is provided, it returns the default slot.
129
+ * @example this.isEmpty('header', 'footer');
130
+ * @example this.isEmpty();
131
+ * @returns
132
+ */
133
+ isEmpty(...names) {
134
+ return !this.hasSlotted(...names);
121
135
  }
122
- #initSlot = (slotName) => {
123
- const name = slotName || SlotController.anonymous;
124
- const elements = this.#nodes.get(name)?.slot?.assignedElements?.() ?? this.#getChildrenForSlot(name);
125
- const selector = slotName ? `slot[name="${slotName}"]` : 'slot:not([name])';
126
- const slot = this.host.shadowRoot?.querySelector?.(selector) ?? null;
127
- const hasContent = !!elements.length;
128
- this.#nodes.set(name, { elements, name: slotName ?? '', hasContent, slot });
129
- this.#logger.log(slotName, hasContent);
130
- };
131
136
  }
132
- export { SlotController };
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));
140
+ };
141
+ SlotController.default = Symbol('default slot');
142
+ /** @deprecated use `default` */
143
+ SlotController.anonymous = _a.default;
133
144
  //# sourceMappingURL=slot-controller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"slot-controller.js","sourceRoot":"","sources":["slot-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReactiveController, ReactiveElement } from 'lit';\n\nimport { Logger } from './logger.js';\n\ninterface AnonymousSlot {\n hasContent: boolean;\n elements: Element[];\n slot: HTMLSlotElement | null;\n}\n\ninterface NamedSlot extends AnonymousSlot {\n name: string;\n initialized: true;\n}\n\nexport type Slot = NamedSlot | AnonymousSlot;\n\nexport interface SlotsConfig {\n slots: (string | null)[];\n /**\n * Object mapping new slot name keys to deprecated slot name values\n * @example `pf-modal--header` is deprecated in favour of `header`\n * ```js\n * new SlotController(this, {\n * slots: ['header'],\n * deprecations: {\n * 'header': 'pf-modal--header'\n * }\n * })\n * ```\n */\n deprecations?: Record<string, string>;\n}\n\nfunction isObjectConfigSpread(config: ([SlotsConfig] | (string | null)[])): config is [SlotsConfig] {\n return config.length === 1 && typeof config[0] === 'object' && config[0] !== null;\n}\n\n/**\n * If it's a named slot, return its children,\n * for the default slot, look for direct children not assigned to a slot\n */\nconst isSlot =\n <T extends Element = Element>(n: string | typeof SlotController.anonymous) =>\n (child: Element): child is T =>\n n === SlotController.anonymous ? !child.hasAttribute('slot')\n : child.getAttribute('slot') === n;\n\nexport class SlotController implements ReactiveController {\n public static anonymous = Symbol('anonymous slot');\n\n #nodes = new Map<string | typeof SlotController.anonymous, Slot>();\n\n #logger: Logger;\n\n #firstUpdated = false;\n\n #mo = new MutationObserver(records => this.#onMutation(records));\n\n #slotNames: (string | null)[];\n\n #deprecations: Record<string, string> = {};\n\n constructor(public host: ReactiveElement, ...config: ([SlotsConfig] | (string | null)[])) {\n this.#logger = new Logger(this.host);\n\n if (isObjectConfigSpread(config)) {\n const [{ slots, deprecations }] = config;\n this.#slotNames = slots;\n this.#deprecations = deprecations ?? {};\n } else if (config.length >= 1) {\n this.#slotNames = config;\n this.#deprecations = {};\n } else {\n this.#slotNames = [null];\n }\n\n\n host.addController(this);\n }\n\n async hostConnected() {\n this.host.addEventListener('slotchange', this.#onSlotChange as EventListener);\n this.#firstUpdated = false;\n this.#mo.observe(this.host, { childList: true });\n // Map the defined slots into an object that is easier to query\n this.#nodes.clear();\n // Loop over the properties provided by the schema\n this.#slotNames.forEach(this.#initSlot);\n Object.values(this.#deprecations).forEach(this.#initSlot);\n this.host.requestUpdate();\n // insurance for framework integrations\n await this.host.updateComplete;\n this.host.requestUpdate();\n }\n\n hostUpdated() {\n if (!this.#firstUpdated) {\n this.#slotNames.forEach(this.#initSlot);\n this.#firstUpdated = true;\n }\n }\n\n hostDisconnected() {\n this.#mo.disconnect();\n }\n\n /**\n * Returns a boolean statement of whether or not any of those slots exists in the light DOM.\n *\n * @param {String|Array} name The slot name.\n * @example this.hasSlotted(\"header\");\n */\n hasSlotted(...names: string[]): boolean {\n if (!names.length) {\n this.#logger.warn(`Please provide at least one slot name for which to search.`);\n return false;\n } else {\n return names.some(x =>\n this.#nodes.get(x)?.hasContent ?? false);\n }\n }\n\n /**\n * Given a slot name or slot names, returns elements assigned to the requested slots as an array.\n * If no value is provided, it returns all children not assigned to a slot (without a slot attribute).\n *\n * @example Get header-slotted elements\n * ```js\n * this.getSlotted('header')\n * ```\n *\n * @example Get header- and footer-slotted elements\n * ```js\n * this.getSlotted('header', 'footer')\n * ```\n *\n * @example Get default-slotted elements\n * ```js\n * this.getSlotted();\n * ```\n */\n getSlotted<T extends Element = Element>(...slotNames: string[]): T[] {\n if (!slotNames.length) {\n return (this.#nodes.get(SlotController.anonymous)?.elements ?? []) as T[];\n } else {\n return slotNames.flatMap(slotName =>\n this.#nodes.get(slotName)?.elements ?? []) as T[];\n }\n }\n\n #onSlotChange = (event: Event & { target: HTMLSlotElement }) => {\n const slotName = event.target.name;\n this.#initSlot(slotName);\n this.host.requestUpdate();\n };\n\n #onMutation = async (records: MutationRecord[]) => {\n const changed = [];\n for (const { addedNodes, removedNodes } of records) {\n for (const node of [...addedNodes, ...removedNodes]) {\n if (node instanceof HTMLElement && node.slot) {\n this.#initSlot(node.slot);\n changed.push(node.slot);\n }\n }\n }\n this.host.requestUpdate();\n };\n\n #getChildrenForSlot<T extends Element = Element>(name: string | typeof SlotController.anonymous): T[] {\n const children = Array.from(this.host.children) as T[];\n return children.filter(isSlot(name));\n }\n\n #initSlot = (slotName: string | null) => {\n const name = slotName || SlotController.anonymous;\n const elements = this.#nodes.get(name)?.slot?.assignedElements?.() ?? this.#getChildrenForSlot(name);\n const selector = slotName ? `slot[name=\"${slotName}\"]` : 'slot:not([name])';\n const slot = this.host.shadowRoot?.querySelector?.<HTMLSlotElement>(selector) ?? null;\n const hasContent = !!elements.length;\n this.#nodes.set(name, { elements, name: slotName ?? '', hasContent, slot });\n this.#logger.log(slotName, hasContent);\n };\n}\n"]}
1
+ {"version":3,"file":"slot-controller.js","sourceRoot":"","sources":["slot-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReactiveController, ReactiveElement } from 'lit';\n\nimport { Logger } from './logger.js';\n\ninterface AnonymousSlot {\n hasContent: boolean;\n elements: Element[];\n slot: HTMLSlotElement | null;\n}\n\ninterface NamedSlot extends AnonymousSlot {\n name: string;\n initialized: true;\n}\n\nexport type Slot = NamedSlot | AnonymousSlot;\n\nexport interface SlotsConfig {\n slots: (string | null)[];\n /**\n * Object mapping new slot name keys to deprecated slot name values\n * @example `pf-modal--header` is deprecated in favour of `header`\n * ```js\n * new SlotController(this, {\n * slots: ['header'],\n * deprecations: {\n * 'header': 'pf-modal--header'\n * }\n * })\n * ```\n */\n deprecations?: Record<string, string>;\n}\n\nfunction isObjectConfigSpread(\n config: ([SlotsConfig] | (string | null)[]),\n): config is [SlotsConfig] {\n return config.length === 1 && typeof config[0] === 'object' && config[0] !== null;\n}\n\n/**\n * If it's a named slot, return its children,\n * for the default slot, look for direct children not assigned to a slot\n * @param n slot name\n */\nconst isSlot =\n <T extends Element = Element>(n: string | typeof SlotController.default) =>\n (child: Element): child is T =>\n n === SlotController.default ? !child.hasAttribute('slot')\n : child.getAttribute('slot') === n;\n\nexport class SlotController implements ReactiveController {\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 #nodes = new Map<string | typeof SlotController.default, Slot>();\n\n #logger: Logger;\n\n #firstUpdated = false;\n\n #mo = new MutationObserver(records => this.#onMutation(records));\n\n #slotNames: (string | null)[];\n\n #deprecations: Record<string, string> = {};\n\n constructor(public host: ReactiveElement, ...config: ([SlotsConfig] | (string | null)[])) {\n this.#logger = new Logger(this.host);\n\n if (isObjectConfigSpread(config)) {\n const [{ slots, deprecations }] = config;\n this.#slotNames = slots;\n this.#deprecations = deprecations ?? {};\n } else if (config.length >= 1) {\n this.#slotNames = config;\n this.#deprecations = {};\n } else {\n this.#slotNames = [null];\n }\n\n\n host.addController(this);\n }\n\n async hostConnected(): Promise<void> {\n this.host.addEventListener('slotchange', this.#onSlotChange as EventListener);\n this.#firstUpdated = false;\n this.#mo.observe(this.host, { childList: true });\n // Map the defined slots into an object that is easier to query\n this.#nodes.clear();\n // Loop over the properties provided by the schema\n this.#slotNames.forEach(this.#initSlot);\n Object.values(this.#deprecations).forEach(this.#initSlot);\n this.host.requestUpdate();\n // insurance for framework integrations\n await this.host.updateComplete;\n this.host.requestUpdate();\n }\n\n hostUpdated(): void {\n if (!this.#firstUpdated) {\n this.#slotNames.forEach(this.#initSlot);\n this.#firstUpdated = true;\n }\n }\n\n hostDisconnected(): void {\n this.#mo.disconnect();\n }\n\n /**\n * Given a slot name or slot names, returns elements assigned to the requested slots as an array.\n * If no value is provided, it returns all children not assigned to a slot (without a slot attribute).\n * @param slotNames slots to query\n * @example Get header-slotted elements\n * ```js\n * this.getSlotted('header')\n * ```\n * @example Get header- and footer-slotted elements\n * ```js\n * this.getSlotted('header', 'footer')\n * ```\n * @example Get default-slotted elements\n * ```js\n * this.getSlotted();\n * ```\n */\n getSlotted<T extends Element = Element>(...slotNames: string[]): T[] {\n if (!slotNames.length) {\n return (this.#nodes.get(SlotController.default)?.elements ?? []) as T[];\n } else {\n return slotNames.flatMap(slotName =>\n this.#nodes.get(slotName)?.elements ?? []) as T[];\n }\n }\n\n /**\n * Returns a boolean statement of whether or not any of those slots exists in the light DOM.\n * @param names The slot names to check.\n * @example this.hasSlotted('header');\n */\n hasSlotted(...names: (string | null | undefined)[]): boolean {\n const slotNames = Array.from(names, x => x == null ? SlotController.default : x);\n if (!slotNames.length) {\n slotNames.push(SlotController.default);\n }\n return slotNames.some(x => this.#nodes.get(x)?.hasContent ?? false);\n }\n\n /**\n * Whether or not all the requested slots are empty.\n * @param names The slot names to query. If no value is provided, it returns the default slot.\n * @example this.isEmpty('header', 'footer');\n * @example this.isEmpty();\n * @returns\n */\n isEmpty(...names: (string | null | undefined)[]): boolean {\n return !this.hasSlotted(...names);\n }\n\n #onSlotChange = (event: Event & { target: HTMLSlotElement }) => {\n const slotName = event.target.name;\n this.#initSlot(slotName);\n this.host.requestUpdate();\n };\n\n #onMutation = async (records: MutationRecord[]) => {\n const changed = [];\n for (const { addedNodes, removedNodes } of records) {\n for (const node of [...addedNodes, ...removedNodes]) {\n if (node instanceof HTMLElement && node.slot) {\n this.#initSlot(node.slot);\n changed.push(node.slot);\n }\n }\n }\n this.host.requestUpdate();\n };\n\n #getChildrenForSlot<T extends Element = Element>(\n name: string | typeof SlotController.default,\n ): T[] {\n const children = Array.from(this.host.children) as T[];\n return children.filter(isSlot(name));\n }\n\n #initSlot = (slotName: string | null) => {\n const name = slotName || SlotController.default;\n const elements = this.#nodes.get(name)?.slot?.assignedElements?.()\n ?? this.#getChildrenForSlot(name);\n const selector = slotName ? `slot[name=\"${slotName}\"]` : 'slot:not([name])';\n const slot = this.host.shadowRoot?.querySelector?.<HTMLSlotElement>(selector) ?? null;\n const hasContent = !!elements.length;\n this.#nodes.set(name, { elements, name: slotName ?? '', hasContent, slot });\n this.#logger.debug(slotName, hasContent);\n };\n}\n"]}
@@ -17,7 +17,9 @@ export class StyleController {
17
17
  if (this.stylesAdopted || !(this.host.renderRoot instanceof ShadowRoot)) {
18
18
  return;
19
19
  }
20
- const styles = [this.styles].flatMap(x => getCompatibleStyle(x)).filter(x => !!x);
20
+ const styles = [this.styles]
21
+ .flatMap(x => getCompatibleStyle(x))
22
+ .filter(x => !!x);
21
23
  if (supportsAdoptingStyleSheets) {
22
24
  this.host.renderRoot.adoptedStyleSheets = [
23
25
  ...styles.map(x => x instanceof CSSStyleSheet ? x : x.styleSheet),
@@ -1 +1 @@
1
- {"version":3,"file":"style-controller.js","sourceRoot":"","sources":["style-controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,KAAK,CAAC;AAQtE;;;;GAIG;AACH,MAAM,OAAO,eAAe;IAG1B,YACU,IAAqB;IAC7B,uDAAuD;IAC/C,MAAsB;QAFtB,SAAI,GAAJ,IAAI,CAAiB;QAErB,WAAM,GAAN,MAAM,CAAgB;QALxB,kBAAa,GAAG,KAAK,CAAC;QAO5B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,aAAa;QACX,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,YAAY,UAAU,CAAC,EAAE;YACvE,OAAO;SACR;QAED,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAsB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEvG,IAAI,2BAA2B,EAAE;YAC/B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,GAAG;gBACxC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAA2B,CAAC;gBAClF,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,IAAI,EAAE;aACjD,CAAC;SACH;aAAM;YACL,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBACjB,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;gBAC9C,8DAA8D;gBAC9D,MAAM,KAAK,GAAI,MAAc,CAAC,UAAU,CAAC,CAAC;gBAC1C,IAAI,KAAK,KAAK,SAAS,EAAE;oBACvB,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;iBACpC;gBACD,KAAK,CAAC,WAAW,GAAI,CAAe,CAAC,OAAO,CAAC;gBAC7C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;SACJ;QAED,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC5B,CAAC;CACF","sourcesContent":["import type { ReactiveController, ReactiveElement, CSSResultGroup, CSSResultOrNative, CSSResult } from 'lit';\nimport { getCompatibleStyle, supportsAdoptingStyleSheets } from 'lit';\n\ndeclare global {\n interface ShadowRoot {\n adoptedStyleSheets: CSSStyleSheet[];\n }\n}\n\n/**\n * Controller which adds styles to it's host element.\n * Like `static styles = []`, except a controller.\n * Should typically only be used within other controllers.\n */\nexport class StyleController implements ReactiveController {\n private stylesAdopted = false;\n\n constructor(\n private host: ReactiveElement,\n /** These styles will be applied to the host element */\n private styles: CSSResultGroup,\n ) {\n host.addController(this);\n }\n\n hostConnected(): void {\n if (this.stylesAdopted || !(this.host.renderRoot instanceof ShadowRoot)) {\n return;\n }\n\n const styles = [this.styles].flatMap(x => getCompatibleStyle(x as CSSResultOrNative)).filter(x => !!x);\n\n if (supportsAdoptingStyleSheets) {\n this.host.renderRoot.adoptedStyleSheets = [\n ...styles.map(x => x instanceof CSSStyleSheet ? x : x.styleSheet as CSSStyleSheet),\n ...this.host.renderRoot.adoptedStyleSheets ?? [],\n ];\n } else {\n styles.forEach(s => {\n const style = document.createElement('style');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const nonce = (window as any)['litNonce'];\n if (nonce !== undefined) {\n style.setAttribute('nonce', nonce);\n }\n style.textContent = (s as CSSResult).cssText;\n this.host.renderRoot.appendChild(style);\n });\n }\n\n this.stylesAdopted = true;\n }\n}\n"]}
1
+ {"version":3,"file":"style-controller.js","sourceRoot":"","sources":["style-controller.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,KAAK,CAAC;AAQtE;;;;GAIG;AACH,MAAM,OAAO,eAAe;IAG1B,YACU,IAAqB;IAC7B,uDAAuD;IAC/C,MAAsB;QAFtB,SAAI,GAAJ,IAAI,CAAiB;QAErB,WAAM,GAAN,MAAM,CAAgB;QALxB,kBAAa,GAAG,KAAK,CAAC;QAO5B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,aAAa;QACX,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,YAAY,UAAU,CAAC,EAAE,CAAC;YACxE,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;aACvB,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAsB,CAAC,CAAC;aACxD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEtB,IAAI,2BAA2B,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,GAAG;gBACxC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAA2B,CAAC;gBAClF,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,IAAI,EAAE;aACjD,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBACjB,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;gBAC9C,8DAA8D;gBAC9D,MAAM,KAAK,GAAI,MAAc,CAAC,UAAU,CAAC,CAAC;gBAC1C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACrC,CAAC;gBACD,KAAK,CAAC,WAAW,GAAI,CAAe,CAAC,OAAO,CAAC;gBAC7C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC5B,CAAC;CACF","sourcesContent":["import type {\n ReactiveController,\n ReactiveElement,\n CSSResultGroup,\n CSSResultOrNative,\n CSSResult,\n} from 'lit';\nimport { getCompatibleStyle, supportsAdoptingStyleSheets } from 'lit';\n\ndeclare global {\n interface ShadowRoot {\n adoptedStyleSheets: CSSStyleSheet[];\n }\n}\n\n/**\n * Controller which adds styles to it's host element.\n * Like `static styles = []`, except a controller.\n * Should typically only be used within other controllers.\n */\nexport class StyleController implements ReactiveController {\n private stylesAdopted = false;\n\n constructor(\n private host: ReactiveElement,\n /** These styles will be applied to the host element */\n private styles: CSSResultGroup,\n ) {\n host.addController(this);\n }\n\n hostConnected(): void {\n if (this.stylesAdopted || !(this.host.renderRoot instanceof ShadowRoot)) {\n return;\n }\n\n const styles = [this.styles]\n .flatMap(x => getCompatibleStyle(x as CSSResultOrNative))\n .filter(x => !!x);\n\n if (supportsAdoptingStyleSheets) {\n this.host.renderRoot.adoptedStyleSheets = [\n ...styles.map(x => x instanceof CSSStyleSheet ? x : x.styleSheet as CSSStyleSheet),\n ...this.host.renderRoot.adoptedStyleSheets ?? [],\n ];\n } else {\n styles.forEach(s => {\n const style = document.createElement('style');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const nonce = (window as any)['litNonce'];\n if (nonce !== undefined) {\n style.setAttribute('nonce', nonce);\n }\n style.textContent = (s as CSSResult).cssText;\n this.host.renderRoot.appendChild(style);\n });\n }\n\n this.stylesAdopted = true;\n }\n}\n"]}
@@ -0,0 +1,31 @@
1
+ import type { ReactiveController, ReactiveControllerHost } from 'lit';
2
+ export interface TabsAriaControllerOptions<Tab, Panel> {
3
+ /** Add an `isTab` predicate to ensure this tabs instance' state does not leak into parent tabs' state */
4
+ isTab: (node: unknown) => node is Tab;
5
+ isActiveTab: (tab: Tab) => boolean;
6
+ /** Add an `isPanel` predicate to ensure this tabs instance' state does not leak into parent tabs' state */
7
+ isPanel: (node: unknown) => node is Panel;
8
+ getHTMLElement?: () => HTMLElement;
9
+ }
10
+ export declare class TabsAriaController<Tab extends HTMLElement = HTMLElement, Panel extends HTMLElement = HTMLElement> implements ReactiveController {
11
+ #private;
12
+ get tabs(): Tab[];
13
+ get activeTab(): Tab | undefined;
14
+ /**
15
+ * @param host controller host
16
+ * @param options controller options
17
+ * @example Usage in PfTab
18
+ * ```ts
19
+ * new TabsController(this, {
20
+ * isTab: (x): x is PfTab => x instanceof PfTab,
21
+ * isPanel: (x): x is PfTabPanel => x instanceof PfTabPanel
22
+ * });
23
+ * ```
24
+ */
25
+ constructor(host: ReactiveControllerHost, options: TabsAriaControllerOptions<Tab, Panel>);
26
+ hostConnected(): void;
27
+ hostUpdated(): void;
28
+ hostDisconnected(): void;
29
+ panelFor(tab: Tab): Panel | undefined;
30
+ tabFor(panel: Panel): Tab | undefined;
31
+ }
@@ -0,0 +1,97 @@
1
+ var _TabsAriaController_instances, _TabsAriaController_logger, _TabsAriaController_host, _TabsAriaController_element, _TabsAriaController_tabPanelMap, _TabsAriaController_options, _TabsAriaController_mo, _TabsAriaController_onSlotchange;
2
+ import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
3
+ import { Logger } from '@patternfly/pfe-core/controllers/logger.js';
4
+ export class TabsAriaController {
5
+ get tabs() {
6
+ return [...__classPrivateFieldGet(this, _TabsAriaController_tabPanelMap, "f").keys()];
7
+ }
8
+ get activeTab() {
9
+ return this.tabs.find(x => __classPrivateFieldGet(this, _TabsAriaController_options, "f").isActiveTab(x));
10
+ }
11
+ /**
12
+ * @param host controller host
13
+ * @param options controller options
14
+ * @example Usage in PfTab
15
+ * ```ts
16
+ * new TabsController(this, {
17
+ * isTab: (x): x is PfTab => x instanceof PfTab,
18
+ * isPanel: (x): x is PfTabPanel => x instanceof PfTabPanel
19
+ * });
20
+ * ```
21
+ */
22
+ constructor(host, options) {
23
+ _TabsAriaController_instances.add(this);
24
+ _TabsAriaController_logger.set(this, void 0);
25
+ _TabsAriaController_host.set(this, void 0);
26
+ _TabsAriaController_element.set(this, void 0);
27
+ _TabsAriaController_tabPanelMap.set(this, new Map());
28
+ _TabsAriaController_options.set(this, void 0);
29
+ _TabsAriaController_mo.set(this, new MutationObserver(__classPrivateFieldGet(this, _TabsAriaController_instances, "m", _TabsAriaController_onSlotchange).bind(this)));
30
+ __classPrivateFieldSet(this, _TabsAriaController_options, options, "f");
31
+ __classPrivateFieldSet(this, _TabsAriaController_logger, new Logger(host), "f");
32
+ if (host instanceof HTMLElement) {
33
+ __classPrivateFieldSet(this, _TabsAriaController_element, host, "f");
34
+ }
35
+ else {
36
+ const element = options.getHTMLElement?.();
37
+ if (!element) {
38
+ throw new Error('TabsController must be instantiated with an HTMLElement or a `getHTMLElement()` option');
39
+ }
40
+ __classPrivateFieldSet(this, _TabsAriaController_element, element, "f");
41
+ }
42
+ (__classPrivateFieldSet(this, _TabsAriaController_host, host, "f")).addController(this);
43
+ __classPrivateFieldGet(this, _TabsAriaController_element, "f").addEventListener('slotchange', __classPrivateFieldGet(this, _TabsAriaController_instances, "m", _TabsAriaController_onSlotchange));
44
+ if (__classPrivateFieldGet(this, _TabsAriaController_element, "f").isConnected) {
45
+ this.hostConnected();
46
+ }
47
+ }
48
+ hostConnected() {
49
+ __classPrivateFieldGet(this, _TabsAriaController_mo, "f").observe(__classPrivateFieldGet(this, _TabsAriaController_element, "f"), { attributes: false, childList: true, subtree: false });
50
+ __classPrivateFieldGet(this, _TabsAriaController_instances, "m", _TabsAriaController_onSlotchange).call(this);
51
+ }
52
+ hostUpdated() {
53
+ for (const [tab, panel] of __classPrivateFieldGet(this, _TabsAriaController_tabPanelMap, "f")) {
54
+ panel.setAttribute('aria-labelledby', tab.id);
55
+ tab.setAttribute('aria-controls', panel.id);
56
+ }
57
+ }
58
+ hostDisconnected() {
59
+ __classPrivateFieldGet(this, _TabsAriaController_mo, "f").disconnect();
60
+ }
61
+ panelFor(tab) {
62
+ return __classPrivateFieldGet(this, _TabsAriaController_tabPanelMap, "f").get(tab);
63
+ }
64
+ tabFor(panel) {
65
+ for (const [tab, panelToCheck] of __classPrivateFieldGet(this, _TabsAriaController_tabPanelMap, "f")) {
66
+ if (panel === panelToCheck) {
67
+ return tab;
68
+ }
69
+ }
70
+ }
71
+ }
72
+ _TabsAriaController_logger = new WeakMap(), _TabsAriaController_host = new WeakMap(), _TabsAriaController_element = new WeakMap(), _TabsAriaController_tabPanelMap = new WeakMap(), _TabsAriaController_options = new WeakMap(), _TabsAriaController_mo = new WeakMap(), _TabsAriaController_instances = new WeakSet(), _TabsAriaController_onSlotchange = function _TabsAriaController_onSlotchange() {
73
+ __classPrivateFieldGet(this, _TabsAriaController_tabPanelMap, "f").clear();
74
+ const tabs = [];
75
+ const panels = [];
76
+ for (const child of __classPrivateFieldGet(this, _TabsAriaController_element, "f").children) {
77
+ if (__classPrivateFieldGet(this, _TabsAriaController_options, "f").isTab(child)) {
78
+ tabs.push(child);
79
+ child.role ?? (child.role = 'tab');
80
+ }
81
+ else if (__classPrivateFieldGet(this, _TabsAriaController_options, "f").isPanel(child)) {
82
+ panels.push(child);
83
+ child.role ?? (child.role = 'tabpanel');
84
+ }
85
+ }
86
+ if (tabs.length > panels.length) {
87
+ __classPrivateFieldGet(this, _TabsAriaController_logger, "f").warn('Too many tabs!');
88
+ }
89
+ else if (panels.length > tabs.length) {
90
+ __classPrivateFieldGet(this, _TabsAriaController_logger, "f").warn('Too many panels!');
91
+ }
92
+ while (tabs.length) {
93
+ __classPrivateFieldGet(this, _TabsAriaController_tabPanelMap, "f").set(tabs.shift(), panels.shift());
94
+ }
95
+ __classPrivateFieldGet(this, _TabsAriaController_host, "f").requestUpdate();
96
+ };
97
+ //# sourceMappingURL=tabs-aria-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs-aria-controller.js","sourceRoot":"","sources":["tabs-aria-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReactiveController, ReactiveControllerHost } from 'lit';\n\nimport { Logger } from '@patternfly/pfe-core/controllers/logger.js';\n\nexport interface TabsAriaControllerOptions<Tab, Panel> {\n /** Add an `isTab` predicate to ensure this tabs instance' state does not leak into parent tabs' state */\n isTab: (node: unknown) => node is Tab;\n isActiveTab: (tab: Tab) => boolean;\n /** Add an `isPanel` predicate to ensure this tabs instance' state does not leak into parent tabs' state */\n isPanel: (node: unknown) => node is Panel;\n getHTMLElement?: () => HTMLElement;\n}\n\nexport class TabsAriaController<\n Tab extends HTMLElement = HTMLElement,\n Panel extends HTMLElement = HTMLElement\n> implements ReactiveController {\n #logger: Logger;\n\n #host: ReactiveControllerHost;\n\n #element: HTMLElement;\n\n #tabPanelMap = new Map<Tab, Panel>();\n\n #options: TabsAriaControllerOptions<Tab, Panel>;\n\n #mo = new MutationObserver(this.#onSlotchange.bind(this));\n\n get tabs() {\n return [...this.#tabPanelMap.keys()] as Tab[];\n }\n\n get activeTab(): Tab | undefined {\n return this.tabs.find(x => this.#options.isActiveTab(x));\n }\n\n /**\n * @param host controller host\n * @param options controller options\n * @example Usage in PfTab\n * ```ts\n * new TabsController(this, {\n * isTab: (x): x is PfTab => x instanceof PfTab,\n * isPanel: (x): x is PfTabPanel => x instanceof PfTabPanel\n * });\n * ```\n */\n constructor(\n host: ReactiveControllerHost,\n options: TabsAriaControllerOptions<Tab, Panel>,\n ) {\n this.#options = options;\n this.#logger = new Logger(host);\n if (host instanceof HTMLElement) {\n this.#element = host;\n } else {\n const element = options.getHTMLElement?.();\n if (!element) {\n throw new Error(\n 'TabsController must be instantiated with an HTMLElement or a `getHTMLElement()` option',\n );\n }\n this.#element = element;\n }\n (this.#host = host).addController(this);\n this.#element.addEventListener('slotchange', this.#onSlotchange);\n if (this.#element.isConnected) {\n this.hostConnected();\n }\n }\n\n hostConnected(): void {\n this.#mo.observe(this.#element, { attributes: false, childList: true, subtree: false });\n this.#onSlotchange();\n }\n\n hostUpdated(): void {\n for (const [tab, panel] of this.#tabPanelMap) {\n panel.setAttribute('aria-labelledby', tab.id);\n tab.setAttribute('aria-controls', panel.id);\n }\n }\n\n hostDisconnected(): void {\n this.#mo.disconnect();\n }\n\n /**\n * zip the tabs and panels together into #tabPanelMap\n */\n #onSlotchange() {\n this.#tabPanelMap.clear();\n const tabs = [];\n const panels = [];\n for (const child of this.#element.children) {\n if (this.#options.isTab(child)) {\n tabs.push(child);\n child.role ??= 'tab';\n } else if (this.#options.isPanel(child)) {\n panels.push(child);\n child.role ??= 'tabpanel';\n }\n }\n if (tabs.length > panels.length) {\n this.#logger.warn('Too many tabs!');\n } else if (panels.length > tabs.length) {\n this.#logger.warn('Too many panels!');\n }\n while (tabs.length) {\n this.#tabPanelMap.set(tabs.shift()!, panels.shift()!);\n }\n this.#host.requestUpdate();\n }\n\n panelFor(tab: Tab): Panel | undefined {\n return this.#tabPanelMap.get(tab);\n }\n\n tabFor(panel: Panel): Tab | undefined {\n for (const [tab, panelToCheck] of this.#tabPanelMap) {\n if (panel === panelToCheck) {\n return tab;\n }\n }\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};