@patternfly/pfe-core 2.4.0 → 3.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.
- package/README.md +0 -1
- package/controllers/cascade-controller.d.ts +6 -0
- package/controllers/cascade-controller.js +5 -3
- package/controllers/cascade-controller.js.map +1 -1
- package/controllers/floating-dom-controller.d.ts +2 -2
- package/controllers/floating-dom-controller.js +84 -81
- package/controllers/floating-dom-controller.js.map +1 -1
- package/controllers/internals-controller.d.ts +86 -41
- package/controllers/internals-controller.js +322 -36
- package/controllers/internals-controller.js.map +1 -1
- package/controllers/light-dom-controller.js.map +1 -1
- package/controllers/listbox-controller.d.ts +58 -0
- package/controllers/listbox-controller.js +250 -0
- package/controllers/listbox-controller.js.map +1 -0
- package/controllers/logger.d.ts +27 -3
- package/controllers/logger.js +50 -9
- package/controllers/logger.js.map +1 -1
- package/controllers/overflow-controller.d.ts +10 -3
- package/controllers/overflow-controller.js +75 -44
- package/controllers/overflow-controller.js.map +1 -1
- package/controllers/perf-controller.js.map +1 -1
- package/controllers/property-observer-controller.js +2 -3
- package/controllers/property-observer-controller.js.map +1 -1
- package/controllers/roving-tabindex-controller.d.ts +42 -24
- package/controllers/roving-tabindex-controller.js +167 -140
- package/controllers/roving-tabindex-controller.js.map +1 -1
- package/controllers/scroll-spy-controller.js +91 -93
- package/controllers/scroll-spy-controller.js.map +1 -1
- package/controllers/slot-controller.d.ts +18 -20
- package/controllers/slot-controller.js +89 -91
- package/controllers/slot-controller.js.map +1 -1
- package/controllers/style-controller.js.map +1 -1
- package/controllers/tabs-aria-controller.d.ts +29 -0
- package/controllers/tabs-aria-controller.js +95 -0
- package/controllers/tabs-aria-controller.js.map +1 -0
- package/controllers/timestamp-controller.js +68 -70
- package/controllers/timestamp-controller.js.map +1 -1
- package/core.d.ts +3 -0
- package/core.js.map +1 -1
- package/custom-elements.json +3245 -1317
- package/decorators/bound.js.map +1 -1
- package/decorators/cascades.d.ts +1 -0
- package/decorators/cascades.js +1 -0
- package/decorators/cascades.js.map +1 -1
- package/decorators/deprecation.js.map +1 -1
- package/decorators/initializer.js.map +1 -1
- package/decorators/observed.js.map +1 -1
- package/decorators/time.js.map +1 -1
- package/decorators/trace.js.map +1 -1
- package/functions/containsDeep.d.ts +6 -0
- package/functions/containsDeep.js +21 -0
- package/functions/containsDeep.js.map +1 -0
- package/functions/context.d.ts +9 -0
- package/functions/context.js +17 -0
- package/functions/context.js.map +1 -0
- package/functions/debounce.js.map +1 -1
- package/functions/isElementInView.js.map +1 -1
- package/package.json +7 -4
- package/functions/deprecatedCustomEvent.d.ts +0 -5
- package/functions/deprecatedCustomEvent.js +0 -12
- 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":"AA2BA,MAAM,OAAO,mBAAmB;
|
|
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"]}
|
|
@@ -26,25 +26,15 @@ export interface SlotsConfig {
|
|
|
26
26
|
deprecations?: Record<string, string>;
|
|
27
27
|
}
|
|
28
28
|
export declare class SlotController implements ReactiveController {
|
|
29
|
+
#private;
|
|
29
30
|
host: ReactiveElement;
|
|
31
|
+
static default: symbol;
|
|
32
|
+
/** @deprecated use `default` */
|
|
30
33
|
static anonymous: symbol;
|
|
31
|
-
private nodes;
|
|
32
|
-
private logger;
|
|
33
|
-
private firstUpdated;
|
|
34
|
-
private mo;
|
|
35
|
-
private slotNames;
|
|
36
|
-
private deprecations;
|
|
37
34
|
constructor(host: ReactiveElement, ...config: ([SlotsConfig] | (string | null)[]));
|
|
38
|
-
hostConnected(): void
|
|
35
|
+
hostConnected(): Promise<void>;
|
|
39
36
|
hostUpdated(): void;
|
|
40
37
|
hostDisconnected(): void;
|
|
41
|
-
/**
|
|
42
|
-
* Returns a boolean statement of whether or not any of those slots exists in the light DOM.
|
|
43
|
-
*
|
|
44
|
-
* @param {String|Array} name The slot name.
|
|
45
|
-
* @example this.hasSlotted("header");
|
|
46
|
-
*/
|
|
47
|
-
hasSlotted(...names: string[]): boolean;
|
|
48
38
|
/**
|
|
49
39
|
* Given a slot name or slot names, returns elements assigned to the requested slots as an array.
|
|
50
40
|
* If no value is provided, it returns all children not assigned to a slot (without a slot attribute).
|
|
@@ -65,13 +55,21 @@ export declare class SlotController implements ReactiveController {
|
|
|
65
55
|
* ```
|
|
66
56
|
*/
|
|
67
57
|
getSlotted<T extends Element = Element>(...slotNames: string[]): T[];
|
|
68
|
-
private onSlotChange;
|
|
69
|
-
private onMutation;
|
|
70
|
-
private getChildrenForSlot;
|
|
71
|
-
private initSlot;
|
|
72
58
|
/**
|
|
73
|
-
*
|
|
59
|
+
* Returns a boolean statement of whether or not any of those slots exists in the light DOM.
|
|
60
|
+
*
|
|
61
|
+
* @param names The slot names to check.
|
|
62
|
+
* @example this.hasSlotted('header');
|
|
63
|
+
*/
|
|
64
|
+
hasSlotted(...names: (string | null | undefined)[]): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Whether or not all the requested slots are empty.
|
|
67
|
+
*
|
|
68
|
+
* @param slots The slot name. If no value is provided, it returns the default slot.
|
|
69
|
+
* @example this.isEmpty('header', 'footer');
|
|
70
|
+
* @example this.isEmpty();
|
|
71
|
+
* @returns {Boolean}
|
|
74
72
|
*/
|
|
75
|
-
|
|
73
|
+
isEmpty(...names: (string | null | undefined)[]): boolean;
|
|
76
74
|
}
|
|
77
75
|
export {};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
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";
|
|
3
3
|
import { Logger } from './logger.js';
|
|
4
4
|
function isObjectConfigSpread(config) {
|
|
5
5
|
return config.length === 1 && typeof config[0] === 'object' && config[0] !== null;
|
|
@@ -8,60 +8,81 @@ function isObjectConfigSpread(config) {
|
|
|
8
8
|
* If it's a named slot, return its children,
|
|
9
9
|
* for the default slot, look for direct children not assigned to a slot
|
|
10
10
|
*/
|
|
11
|
-
const isSlot = (n) => (child) => n === SlotController.
|
|
11
|
+
const isSlot = (n) => (child) => n === SlotController.default ? !child.hasAttribute('slot')
|
|
12
12
|
: child.getAttribute('slot') === n;
|
|
13
|
-
class SlotController {
|
|
14
|
-
static { this.anonymous = Symbol('anonymous slot'); }
|
|
13
|
+
export class SlotController {
|
|
15
14
|
constructor(host, ...config) {
|
|
15
|
+
_SlotController_instances.add(this);
|
|
16
16
|
this.host = host;
|
|
17
|
-
this
|
|
18
|
-
this
|
|
19
|
-
|
|
20
|
-
this.
|
|
21
|
-
this
|
|
17
|
+
_SlotController_nodes.set(this, new Map());
|
|
18
|
+
_SlotController_logger.set(this, void 0);
|
|
19
|
+
_SlotController_firstUpdated.set(this, false);
|
|
20
|
+
_SlotController_mo.set(this, new MutationObserver(records => __classPrivateFieldGet(this, _SlotController_onMutation, "f").call(this, records)));
|
|
21
|
+
_SlotController_slotNames.set(this, void 0);
|
|
22
|
+
_SlotController_deprecations.set(this, {});
|
|
23
|
+
_SlotController_onSlotChange.set(this, (event) => {
|
|
24
|
+
const slotName = event.target.name;
|
|
25
|
+
__classPrivateFieldGet(this, _SlotController_initSlot, "f").call(this, slotName);
|
|
26
|
+
this.host.requestUpdate();
|
|
27
|
+
});
|
|
28
|
+
_SlotController_onMutation.set(this, async (records) => {
|
|
29
|
+
const changed = [];
|
|
30
|
+
for (const { addedNodes, removedNodes } of records) {
|
|
31
|
+
for (const node of [...addedNodes, ...removedNodes]) {
|
|
32
|
+
if (node instanceof HTMLElement && node.slot) {
|
|
33
|
+
__classPrivateFieldGet(this, _SlotController_initSlot, "f").call(this, node.slot);
|
|
34
|
+
changed.push(node.slot);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
this.host.requestUpdate();
|
|
39
|
+
});
|
|
40
|
+
_SlotController_initSlot.set(this, (slotName) => {
|
|
41
|
+
const name = slotName || _a.default;
|
|
42
|
+
const elements = __classPrivateFieldGet(this, _SlotController_nodes, "f").get(name)?.slot?.assignedElements?.() ?? __classPrivateFieldGet(this, _SlotController_instances, "m", _SlotController_getChildrenForSlot).call(this, name);
|
|
43
|
+
const selector = slotName ? `slot[name="${slotName}"]` : 'slot:not([name])';
|
|
44
|
+
const slot = this.host.shadowRoot?.querySelector?.(selector) ?? null;
|
|
45
|
+
const hasContent = !!elements.length;
|
|
46
|
+
__classPrivateFieldGet(this, _SlotController_nodes, "f").set(name, { elements, name: slotName ?? '', hasContent, slot });
|
|
47
|
+
__classPrivateFieldGet(this, _SlotController_logger, "f").debug(slotName, hasContent);
|
|
48
|
+
});
|
|
49
|
+
__classPrivateFieldSet(this, _SlotController_logger, new Logger(this.host), "f");
|
|
22
50
|
if (isObjectConfigSpread(config)) {
|
|
23
51
|
const [{ slots, deprecations }] = config;
|
|
24
|
-
this
|
|
25
|
-
this
|
|
52
|
+
__classPrivateFieldSet(this, _SlotController_slotNames, slots, "f");
|
|
53
|
+
__classPrivateFieldSet(this, _SlotController_deprecations, deprecations ?? {}, "f");
|
|
26
54
|
}
|
|
27
55
|
else if (config.length >= 1) {
|
|
28
|
-
this
|
|
29
|
-
this
|
|
56
|
+
__classPrivateFieldSet(this, _SlotController_slotNames, config, "f");
|
|
57
|
+
__classPrivateFieldSet(this, _SlotController_deprecations, {}, "f");
|
|
30
58
|
}
|
|
31
59
|
else {
|
|
32
|
-
this
|
|
60
|
+
__classPrivateFieldSet(this, _SlotController_slotNames, [null], "f");
|
|
33
61
|
}
|
|
34
62
|
host.addController(this);
|
|
35
63
|
}
|
|
36
|
-
hostConnected() {
|
|
37
|
-
this.host.addEventListener('slotchange', this
|
|
38
|
-
this
|
|
39
|
-
this.
|
|
40
|
-
|
|
64
|
+
async hostConnected() {
|
|
65
|
+
this.host.addEventListener('slotchange', __classPrivateFieldGet(this, _SlotController_onSlotChange, "f"));
|
|
66
|
+
__classPrivateFieldSet(this, _SlotController_firstUpdated, false, "f");
|
|
67
|
+
__classPrivateFieldGet(this, _SlotController_mo, "f").observe(this.host, { childList: true });
|
|
68
|
+
// Map the defined slots into an object that is easier to query
|
|
69
|
+
__classPrivateFieldGet(this, _SlotController_nodes, "f").clear();
|
|
70
|
+
// Loop over the properties provided by the schema
|
|
71
|
+
__classPrivateFieldGet(this, _SlotController_slotNames, "f").forEach(__classPrivateFieldGet(this, _SlotController_initSlot, "f"));
|
|
72
|
+
Object.values(__classPrivateFieldGet(this, _SlotController_deprecations, "f")).forEach(__classPrivateFieldGet(this, _SlotController_initSlot, "f"));
|
|
73
|
+
this.host.requestUpdate();
|
|
74
|
+
// insurance for framework integrations
|
|
75
|
+
await this.host.updateComplete;
|
|
76
|
+
this.host.requestUpdate();
|
|
41
77
|
}
|
|
42
78
|
hostUpdated() {
|
|
43
|
-
if (!this
|
|
44
|
-
this.
|
|
45
|
-
this
|
|
79
|
+
if (!__classPrivateFieldGet(this, _SlotController_firstUpdated, "f")) {
|
|
80
|
+
__classPrivateFieldGet(this, _SlotController_slotNames, "f").forEach(__classPrivateFieldGet(this, _SlotController_initSlot, "f"));
|
|
81
|
+
__classPrivateFieldSet(this, _SlotController_firstUpdated, true, "f");
|
|
46
82
|
}
|
|
47
83
|
}
|
|
48
84
|
hostDisconnected() {
|
|
49
|
-
this.
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Returns a boolean statement of whether or not any of those slots exists in the light DOM.
|
|
53
|
-
*
|
|
54
|
-
* @param {String|Array} name The slot name.
|
|
55
|
-
* @example this.hasSlotted("header");
|
|
56
|
-
*/
|
|
57
|
-
hasSlotted(...names) {
|
|
58
|
-
if (!names.length) {
|
|
59
|
-
this.logger.warn(`Please provide at least one slot name for which to search.`);
|
|
60
|
-
return false;
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
return names.some(x => this.nodes.get(x)?.hasContent ?? false);
|
|
64
|
-
}
|
|
85
|
+
__classPrivateFieldGet(this, _SlotController_mo, "f").disconnect();
|
|
65
86
|
}
|
|
66
87
|
/**
|
|
67
88
|
* Given a slot name or slot names, returns elements assigned to the requested slots as an array.
|
|
@@ -84,66 +105,43 @@ class SlotController {
|
|
|
84
105
|
*/
|
|
85
106
|
getSlotted(...slotNames) {
|
|
86
107
|
if (!slotNames.length) {
|
|
87
|
-
return (this.
|
|
108
|
+
return (__classPrivateFieldGet(this, _SlotController_nodes, "f").get(_a.default)?.elements ?? []);
|
|
88
109
|
}
|
|
89
110
|
else {
|
|
90
|
-
return slotNames.flatMap(slotName => this.
|
|
111
|
+
return slotNames.flatMap(slotName => __classPrivateFieldGet(this, _SlotController_nodes, "f").get(slotName)?.elements ?? []);
|
|
91
112
|
}
|
|
92
113
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
changed.push(node.slot);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
if (changed.length) {
|
|
109
|
-
this.host.requestUpdate();
|
|
114
|
+
/**
|
|
115
|
+
* Returns a boolean statement of whether or not any of those slots exists in the light DOM.
|
|
116
|
+
*
|
|
117
|
+
* @param names The slot names to check.
|
|
118
|
+
* @example this.hasSlotted('header');
|
|
119
|
+
*/
|
|
120
|
+
hasSlotted(...names) {
|
|
121
|
+
const { anonymous } = _a;
|
|
122
|
+
const slotNames = Array.from(names, x => x == null ? anonymous : x);
|
|
123
|
+
if (!slotNames.length) {
|
|
124
|
+
slotNames.push(anonymous);
|
|
110
125
|
}
|
|
111
|
-
|
|
112
|
-
getChildrenForSlot(name) {
|
|
113
|
-
const children = Array.from(this.host.children);
|
|
114
|
-
return children.filter(isSlot(name));
|
|
115
|
-
}
|
|
116
|
-
initSlot(slotName) {
|
|
117
|
-
const name = slotName || SlotController.anonymous;
|
|
118
|
-
const elements = this.nodes.get(name)?.slot?.assignedElements?.() ?? this.getChildrenForSlot(name);
|
|
119
|
-
const selector = slotName ? `slot[name="${slotName}"]` : 'slot:not([name])';
|
|
120
|
-
const slot = this.host.shadowRoot?.querySelector?.(selector) ?? null;
|
|
121
|
-
const hasContent = !!elements.length;
|
|
122
|
-
this.nodes.set(name, { elements, name: slotName ?? '', hasContent, slot });
|
|
123
|
-
this.logger.log(slotName, hasContent);
|
|
126
|
+
return slotNames.some(x => __classPrivateFieldGet(this, _SlotController_nodes, "f").get(x)?.hasContent ?? false);
|
|
124
127
|
}
|
|
125
128
|
/**
|
|
126
|
-
*
|
|
129
|
+
* Whether or not all the requested slots are empty.
|
|
130
|
+
*
|
|
131
|
+
* @param slots The slot name. If no value is provided, it returns the default slot.
|
|
132
|
+
* @example this.isEmpty('header', 'footer');
|
|
133
|
+
* @example this.isEmpty();
|
|
134
|
+
* @returns {Boolean}
|
|
127
135
|
*/
|
|
128
|
-
|
|
129
|
-
this.
|
|
130
|
-
// Loop over the properties provided by the schema
|
|
131
|
-
this.slotNames.forEach(this.initSlot);
|
|
132
|
-
Object.values(this.deprecations).forEach(this.initSlot);
|
|
133
|
-
this.host.requestUpdate();
|
|
136
|
+
isEmpty(...names) {
|
|
137
|
+
return !this.hasSlotted(...names);
|
|
134
138
|
}
|
|
135
139
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
bound
|
|
144
|
-
], SlotController.prototype, "initSlot", null);
|
|
145
|
-
__decorate([
|
|
146
|
-
bound
|
|
147
|
-
], SlotController.prototype, "init", null);
|
|
148
|
-
export { SlotController };
|
|
140
|
+
_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) {
|
|
141
|
+
const children = Array.from(this.host.children);
|
|
142
|
+
return children.filter(isSlot(name));
|
|
143
|
+
};
|
|
144
|
+
SlotController.default = Symbol('default slot');
|
|
145
|
+
/** @deprecated use `default` */
|
|
146
|
+
SlotController.anonymous = _a.default;
|
|
149
147
|
//# sourceMappingURL=slot-controller.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slot-controller.js","sourceRoot":"","sources":["slot-controller.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAgCrC,SAAS,oBAAoB,CAAC,MAA2C;IACvE,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;AACpF,CAAC;AAED;;;GAGG;AACH,MAAM,MAAM,GACV,CAA8B,CAA2C,EAAE,EAAE,CAC3E,CAAC,KAAc,EAAc,EAAE,CAC3B,CAAC,KAAK,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC;IAC9D,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAEzC,MAAa,cAAc;aACX,cAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC,AAA3B,CAA4B;IAcnD,YAAmB,IAAqB,EAAE,GAAG,MAA2C;QAArE,SAAI,GAAJ,IAAI,CAAiB;QAZhC,UAAK,GAAG,IAAI,GAAG,EAAkD,CAAC;QAIlE,iBAAY,GAAG,KAAK,CAAC;QAErB,OAAE,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAI3C,iBAAY,GAA2B,EAAE,CAAC;QAGhD,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEpC,IAAI,oBAAoB,CAAC,MAAM,CAAC,EAAE;YAChC,MAAM,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,GAAG,MAAM,CAAC;YACzC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,YAAY,GAAG,YAAY,IAAI,EAAE,CAAC;SACxC;aAAM,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE;YAC7B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;YACxB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;SACxB;aAAM;YACL,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,CAAC;SACzB;QAGD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,aAAa;QACX,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,YAA6B,CAAC,CAAC;QAC7E,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,WAAW;QACT,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;SAC1B;IACH,CAAC;IAED,gBAAgB;QACd,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;IACvB,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,GAAG,KAAe;QAC3B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YACjB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;YAC/E,OAAO,KAAK,CAAC;SACd;aAAM;YACL,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACpB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,IAAI,KAAK,CAAC,CAAC;SAC3C;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,UAAU,CAA8B,GAAG,SAAmB;QAC5D,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;YACrB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,QAAQ,IAAI,EAAE,CAAQ,CAAC;SAC1E;aAAM;YACL,OAAO,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,QAAQ,IAAI,EAAE,CAAQ,CAAC;SACpD;IACH,CAAC;IAEc,YAAY,CAAC,KAA0C;QACpE,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;QACnC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IAC5B,CAAC;IAEoB,AAAN,KAAK,CAAC,UAAU,CAAC,OAAyB;QACvD,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,KAAK,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,OAAO,EAAE;YAClD,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,UAAU,EAAE,GAAG,YAAY,CAAC,EAAE;gBACnD,IAAI,IAAI,YAAY,WAAW,IAAI,IAAI,CAAC,IAAI,EAAE;oBAC5C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACzB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBACzB;aACF;SACF;QACD,IAAI,OAAO,CAAC,MAAM,EAAE;YAClB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;SAC3B;IACH,CAAC;IAEO,kBAAkB,CAA8B,IAA8C;QACpG,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAQ,CAAC;QACvD,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,CAAC;IAEc,QAAQ,CAAC,QAAuB;QAC7C,MAAM,IAAI,GAAG,QAAQ,IAAI,cAAc,CAAC,SAAS,CAAC;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACnG,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,cAAc,QAAQ,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC;QAC5E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,CAAkB,QAAQ,CAAC,IAAI,IAAI,CAAC;QACtF,MAAM,UAAU,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3E,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACY,IAAI;QACjB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,kDAAkD;QAClD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IAC5B,CAAC;;AA7Cc;IAAd,KAAK;kDAIL;AAEoB;IAApB,KAAK;gDAaL;AAOc;IAAd,KAAK;8CAQL;AAKc;IAAd,KAAK;0CAML;SA5IU,cAAc","sourcesContent":["import type { ReactiveController, ReactiveElement } from 'lit';\n\nimport { bound } from '../decorators/bound.js';\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 private nodes = new Map<string | typeof SlotController.anonymous, Slot>();\n\n private logger: Logger;\n\n private firstUpdated = false;\n\n private mo = new MutationObserver(this.onMutation);\n\n private slotNames: (string | null)[];\n\n private 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 hostConnected() {\n this.host.addEventListener('slotchange', this.onSlotChange as EventListener);\n this.firstUpdated = false;\n this.mo.observe(this.host, { childList: true });\n this.init();\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 @bound private onSlotChange(event: Event & { target: HTMLSlotElement }) {\n const slotName = event.target.name;\n this.initSlot(slotName);\n this.host.requestUpdate();\n }\n\n @bound private async onMutation(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 if (changed.length) {\n this.host.requestUpdate();\n }\n }\n\n private 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 @bound private 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 /**\n * Maps the defined slots into an object that is easier to query\n */\n @bound private init() {\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 }\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(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.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');\n /** @deprecated use `default` */\n public static anonymous = 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() {\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 * 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.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 *\n * @param names The slot names to check.\n * @example this.hasSlotted('header');\n */\n hasSlotted(...names: (string | null | undefined)[]): boolean {\n const { anonymous } = SlotController;\n const slotNames = Array.from(names, x => x == null ? anonymous : x);\n if (!slotNames.length) {\n slotNames.push(anonymous);\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 *\n * @param slots The slot name. If no value is provided, it returns the default slot.\n * @example this.isEmpty('header', 'footer');\n * @example this.isEmpty();\n * @returns {Boolean}\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>(name: string | typeof SlotController.default): 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?.() ?? 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"]}
|
|
@@ -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;
|
|
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,CAAC;YACxE,OAAO;QACT,CAAC;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,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 { 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"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
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
|
+
* @example Usage in PfTab
|
|
16
|
+
* ```ts
|
|
17
|
+
* new TabsController(this, {
|
|
18
|
+
* isTab: (x): x is PfTab => x instanceof PfTab,
|
|
19
|
+
* isPanel: (x): x is PfTabPanel => x instanceof PfTabPanel
|
|
20
|
+
* });
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
constructor(host: ReactiveControllerHost, options: TabsAriaControllerOptions<Tab, Panel>);
|
|
24
|
+
hostConnected(): void;
|
|
25
|
+
hostUpdated(): void;
|
|
26
|
+
hostDisconnected(): void;
|
|
27
|
+
panelFor(tab: Tab): Panel | undefined;
|
|
28
|
+
tabFor(panel: Panel): Tab | undefined;
|
|
29
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
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
|
+
* @example Usage in PfTab
|
|
13
|
+
* ```ts
|
|
14
|
+
* new TabsController(this, {
|
|
15
|
+
* isTab: (x): x is PfTab => x instanceof PfTab,
|
|
16
|
+
* isPanel: (x): x is PfTabPanel => x instanceof PfTabPanel
|
|
17
|
+
* });
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
constructor(host, options) {
|
|
21
|
+
_TabsAriaController_instances.add(this);
|
|
22
|
+
_TabsAriaController_logger.set(this, void 0);
|
|
23
|
+
_TabsAriaController_host.set(this, void 0);
|
|
24
|
+
_TabsAriaController_element.set(this, void 0);
|
|
25
|
+
_TabsAriaController_tabPanelMap.set(this, new Map());
|
|
26
|
+
_TabsAriaController_options.set(this, void 0);
|
|
27
|
+
_TabsAriaController_mo.set(this, new MutationObserver(__classPrivateFieldGet(this, _TabsAriaController_instances, "m", _TabsAriaController_onSlotchange).bind(this)));
|
|
28
|
+
__classPrivateFieldSet(this, _TabsAriaController_options, options, "f");
|
|
29
|
+
__classPrivateFieldSet(this, _TabsAriaController_logger, new Logger(host), "f");
|
|
30
|
+
if (host instanceof HTMLElement) {
|
|
31
|
+
__classPrivateFieldSet(this, _TabsAriaController_element, host, "f");
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
const element = options.getHTMLElement?.();
|
|
35
|
+
if (!element) {
|
|
36
|
+
throw new Error('TabsController must be instantiated with an HTMLElement or a `getHTMLElement()` option');
|
|
37
|
+
}
|
|
38
|
+
__classPrivateFieldSet(this, _TabsAriaController_element, element, "f");
|
|
39
|
+
}
|
|
40
|
+
(__classPrivateFieldSet(this, _TabsAriaController_host, host, "f")).addController(this);
|
|
41
|
+
__classPrivateFieldGet(this, _TabsAriaController_element, "f").addEventListener('slotchange', __classPrivateFieldGet(this, _TabsAriaController_instances, "m", _TabsAriaController_onSlotchange));
|
|
42
|
+
if (__classPrivateFieldGet(this, _TabsAriaController_element, "f").isConnected) {
|
|
43
|
+
this.hostConnected();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
hostConnected() {
|
|
47
|
+
__classPrivateFieldGet(this, _TabsAriaController_mo, "f").observe(__classPrivateFieldGet(this, _TabsAriaController_element, "f"), { attributes: false, childList: true, subtree: false });
|
|
48
|
+
__classPrivateFieldGet(this, _TabsAriaController_instances, "m", _TabsAriaController_onSlotchange).call(this);
|
|
49
|
+
}
|
|
50
|
+
hostUpdated() {
|
|
51
|
+
for (const [tab, panel] of __classPrivateFieldGet(this, _TabsAriaController_tabPanelMap, "f")) {
|
|
52
|
+
panel.setAttribute('aria-labelledby', tab.id);
|
|
53
|
+
tab.setAttribute('aria-controls', panel.id);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
hostDisconnected() {
|
|
57
|
+
__classPrivateFieldGet(this, _TabsAriaController_mo, "f").disconnect();
|
|
58
|
+
}
|
|
59
|
+
panelFor(tab) {
|
|
60
|
+
return __classPrivateFieldGet(this, _TabsAriaController_tabPanelMap, "f").get(tab);
|
|
61
|
+
}
|
|
62
|
+
tabFor(panel) {
|
|
63
|
+
for (const [tab, panelToCheck] of __classPrivateFieldGet(this, _TabsAriaController_tabPanelMap, "f")) {
|
|
64
|
+
if (panel === panelToCheck) {
|
|
65
|
+
return tab;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
_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() {
|
|
71
|
+
__classPrivateFieldGet(this, _TabsAriaController_tabPanelMap, "f").clear();
|
|
72
|
+
const tabs = [];
|
|
73
|
+
const panels = [];
|
|
74
|
+
for (const child of __classPrivateFieldGet(this, _TabsAriaController_element, "f").children) {
|
|
75
|
+
if (__classPrivateFieldGet(this, _TabsAriaController_options, "f").isTab(child)) {
|
|
76
|
+
tabs.push(child);
|
|
77
|
+
child.role ?? (child.role = 'tab');
|
|
78
|
+
}
|
|
79
|
+
else if (__classPrivateFieldGet(this, _TabsAriaController_options, "f").isPanel(child)) {
|
|
80
|
+
panels.push(child);
|
|
81
|
+
child.role ?? (child.role = 'tabpanel');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (tabs.length > panels.length) {
|
|
85
|
+
__classPrivateFieldGet(this, _TabsAriaController_logger, "f").warn('Too many tabs!');
|
|
86
|
+
}
|
|
87
|
+
else if (panels.length > tabs.length) {
|
|
88
|
+
__classPrivateFieldGet(this, _TabsAriaController_logger, "f").warn('Too many panels!');
|
|
89
|
+
}
|
|
90
|
+
while (tabs.length) {
|
|
91
|
+
__classPrivateFieldGet(this, _TabsAriaController_tabPanelMap, "f").set(tabs.shift(), panels.shift());
|
|
92
|
+
}
|
|
93
|
+
__classPrivateFieldGet(this, _TabsAriaController_host, "f").requestUpdate();
|
|
94
|
+
};
|
|
95
|
+
//# 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 * @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('TabsController must be instantiated with an HTMLElement or a `getHTMLElement()` option');\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() {\n this.#mo.observe(this.#element, { attributes: false, childList: true, subtree: false });\n this.#onSlotchange();\n }\n\n hostUpdated() {\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"]}
|