@coveo/atomic 3.32.4-pre.f33fb697dc → 3.32.4-pre.f345a65b79
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/dist/atomic/_atomic.esm.js +1 -1
- package/dist/atomic/components/analytics-config.js +1 -1
- package/dist/atomic/components/atomic-search-interface.js +3 -3
- package/dist/atomic/components/atomic-search-interface.js.map +1 -1
- package/dist/atomic/components/components/commerce/atomic-commerce-numeric-facet/atomic-commerce-numeric-facet.js +1 -1
- package/dist/atomic/components/components/commerce/atomic-product-link/atomic-product-link.js +1 -15
- package/dist/atomic/components/global/environment.js +1 -1
- package/dist/atomic/components/mixins/slots-for-no-shadow-dom-mixin.js +43 -99
- package/dist/atomic/components/slot-utils.js +11 -0
- package/dist/atomic/components/slot-utils.js.map +1 -1
- package/dist/atomic/components/utils/slot-utils.js +11 -0
- package/dist/atomic/{p-bbdbf7c5.entry.js → p-0c076058.entry.js} +2 -2
- package/dist/atomic/p-1891bbcf.js +2 -0
- package/dist/atomic/p-1891bbcf.js.map +1 -0
- package/dist/atomic/{p-324df3c7.entry.js → p-2a9ceb50.entry.js} +2 -2
- package/dist/atomic/{p-6a026ad5.entry.js → p-31fb4056.entry.js} +2 -2
- package/dist/atomic/{p-6a026ad5.entry.js.map → p-31fb4056.entry.js.map} +1 -1
- package/dist/atomic/{p-b79a7896.entry.js → p-421850f9.entry.js} +2 -2
- package/dist/atomic/{p-41547f55.js → p-4440570f.js} +2 -2
- package/dist/atomic/{p-57d5db65.entry.js → p-4cda93be.entry.js} +2 -2
- package/dist/atomic/{p-486ad8f3.js → p-5fca1435.js} +2 -2
- package/dist/atomic/{p-bafe62c3.entry.js → p-6b1ef223.entry.js} +2 -2
- package/dist/atomic/{p-efca37de.entry.js → p-a6be5ee3.entry.js} +2 -2
- package/dist/atomic/{p-4a6faf22.entry.js → p-ab55ee64.entry.js} +2 -2
- package/dist/atomic/{p-8ff9d07e.js → p-b309aadd.js} +2 -2
- package/dist/atomic/{p-11b9e476.entry.js → p-d3e1a9aa.entry.js} +2 -2
- package/dist/atomic/{p-6a33b860.entry.js → p-dc89e560.entry.js} +2 -2
- package/dist/atomic/{p-506d47e2.entry.js → p-e43fe680.entry.js} +2 -2
- package/dist/atomic/{p-a2e1fa2c.entry.js → p-ff653000.entry.js} +2 -2
- package/dist/cjs/{analytics-config-5b640ff8.js → analytics-config-973173ee.js} +2 -2
- package/dist/cjs/{analytics-config-5b640ff8.js.map → analytics-config-973173ee.js.map} +1 -1
- package/dist/cjs/atomic-generated-answer.cjs.entry.js +2 -2
- package/dist/cjs/atomic-insight-generated-answer.cjs.entry.js +2 -2
- package/dist/cjs/atomic-insight-interface.cjs.entry.js +1 -1
- package/dist/cjs/atomic-insight-smart-snippet-suggestions.cjs.entry.js +2 -2
- package/dist/cjs/atomic-insight-smart-snippet.cjs.entry.js +2 -2
- package/dist/cjs/atomic-ipx-result-link.cjs.entry.js +2 -2
- package/dist/cjs/atomic-recs-interface.cjs.entry.js +1 -1
- package/dist/cjs/atomic-result-link.cjs.entry.js +2 -2
- package/dist/cjs/atomic-result-printable-uri.cjs.entry.js +2 -2
- package/dist/cjs/atomic-search-interface.cjs.entry.js +4 -4
- package/dist/cjs/atomic-search-interface.cjs.entry.js.map +1 -1
- package/dist/cjs/atomic-smart-snippet-suggestions.cjs.entry.js +2 -2
- package/dist/cjs/atomic-smart-snippet.cjs.entry.js +2 -2
- package/dist/cjs/{attributes-slot-5799cb5b.js → attributes-slot-4e7d7a75.js} +2 -2
- package/dist/cjs/{attributes-slot-5799cb5b.js.map → attributes-slot-4e7d7a75.js.map} +1 -1
- package/dist/cjs/{generated-answer-common-e5cd257b.js → generated-answer-common-4cd4b7c6.js} +2 -2
- package/dist/cjs/{generated-answer-common-e5cd257b.js.map → generated-answer-common-4cd4b7c6.js.map} +1 -1
- package/dist/cjs/{slot-utils-948feedc.js → slot-utils-a30cb814.js} +12 -1
- package/dist/cjs/slot-utils-a30cb814.js.map +1 -0
- package/dist/cjs/version.cjs.js +2 -2
- package/dist/esm/{analytics-config-ce3e7d8b.js → analytics-config-45079336.js} +2 -2
- package/dist/esm/{analytics-config-ce3e7d8b.js.map → analytics-config-45079336.js.map} +1 -1
- package/dist/esm/atomic-generated-answer.entry.js +2 -2
- package/dist/esm/atomic-insight-generated-answer.entry.js +2 -2
- package/dist/esm/atomic-insight-interface.entry.js +1 -1
- package/dist/esm/atomic-insight-smart-snippet-suggestions.entry.js +2 -2
- package/dist/esm/atomic-insight-smart-snippet.entry.js +2 -2
- package/dist/esm/atomic-ipx-result-link.entry.js +2 -2
- package/dist/esm/atomic-recs-interface.entry.js +1 -1
- package/dist/esm/atomic-result-link.entry.js +2 -2
- package/dist/esm/atomic-result-printable-uri.entry.js +2 -2
- package/dist/esm/atomic-search-interface.entry.js +4 -4
- package/dist/esm/atomic-search-interface.entry.js.map +1 -1
- package/dist/esm/atomic-smart-snippet-suggestions.entry.js +2 -2
- package/dist/esm/atomic-smart-snippet.entry.js +2 -2
- package/dist/esm/{attributes-slot-0fb13fa2.js → attributes-slot-cb60f29b.js} +2 -2
- package/dist/esm/{attributes-slot-0fb13fa2.js.map → attributes-slot-cb60f29b.js.map} +1 -1
- package/dist/esm/{generated-answer-common-835787fa.js → generated-answer-common-06146290.js} +2 -2
- package/dist/esm/{generated-answer-common-835787fa.js.map → generated-answer-common-06146290.js.map} +1 -1
- package/dist/esm/{slot-utils-39a2fc43.js → slot-utils-dcf4fc27.js} +12 -1
- package/dist/esm/slot-utils-dcf4fc27.js.map +1 -0
- package/dist/esm/version.js +2 -2
- package/dist/types/components/commerce/atomic-product-link/atomic-product-link.d.ts +1 -2
- package/dist/types/components/search/atomic-search-interface/atomic-search-interface.d.ts +1 -1
- package/dist/types/components.d.ts +1 -1
- package/dist/types/mixins/slots-for-no-shadow-dom-mixin.d.ts +3 -8
- package/docs/atomic-docs.json +2 -2
- package/package.json +3 -3
- package/dist/atomic/p-634ca060.js +0 -2
- package/dist/atomic/p-634ca060.js.map +0 -1
- package/dist/cjs/slot-utils-948feedc.js.map +0 -1
- package/dist/esm/slot-utils-39a2fc43.js.map +0 -1
- /package/dist/atomic/{p-bbdbf7c5.entry.js.map → p-0c076058.entry.js.map} +0 -0
- /package/dist/atomic/{p-324df3c7.entry.js.map → p-2a9ceb50.entry.js.map} +0 -0
- /package/dist/atomic/{p-b79a7896.entry.js.map → p-421850f9.entry.js.map} +0 -0
- /package/dist/atomic/{p-41547f55.js.map → p-4440570f.js.map} +0 -0
- /package/dist/atomic/{p-57d5db65.entry.js.map → p-4cda93be.entry.js.map} +0 -0
- /package/dist/atomic/{p-486ad8f3.js.map → p-5fca1435.js.map} +0 -0
- /package/dist/atomic/{p-bafe62c3.entry.js.map → p-6b1ef223.entry.js.map} +0 -0
- /package/dist/atomic/{p-efca37de.entry.js.map → p-a6be5ee3.entry.js.map} +0 -0
- /package/dist/atomic/{p-4a6faf22.entry.js.map → p-ab55ee64.entry.js.map} +0 -0
- /package/dist/atomic/{p-8ff9d07e.js.map → p-b309aadd.js.map} +0 -0
- /package/dist/atomic/{p-11b9e476.entry.js.map → p-d3e1a9aa.entry.js.map} +0 -0
- /package/dist/atomic/{p-6a33b860.entry.js.map → p-dc89e560.entry.js.map} +0 -0
- /package/dist/atomic/{p-506d47e2.entry.js.map → p-e43fe680.entry.js.map} +0 -0
- /package/dist/atomic/{p-a2e1fa2c.entry.js.map → p-ff653000.entry.js.map} +0 -0
|
@@ -2,10 +2,7 @@
|
|
|
2
2
|
* A mixin class that provides slot functionality for LitElement components
|
|
3
3
|
* that render in the light DOM (no shadow DOM).
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* shadow DOM slots work, but operates in the light DOM. It provides
|
|
7
|
-
* methods to adopt children, map them to slots based on their `slot`
|
|
8
|
-
* attribute, and yield slot content during rendering.
|
|
5
|
+
* Provides the `renderDefaultSlotContent()` method, which returns the default slot’s content or a fallback if the slot is empty.
|
|
9
6
|
*
|
|
10
7
|
* @example
|
|
11
8
|
* ```typescript
|
|
@@ -27,136 +24,83 @@ export const SlotsForNoShadowDOMMixin = (superClass) => {
|
|
|
27
24
|
/**
|
|
28
25
|
* @internal
|
|
29
26
|
*/
|
|
30
|
-
this.
|
|
31
|
-
/**
|
|
32
|
-
* @internal
|
|
33
|
-
*/
|
|
34
|
-
this.slotsInitialized = false;
|
|
27
|
+
this.slotContent = {};
|
|
35
28
|
/**
|
|
36
29
|
* @internal
|
|
37
30
|
*/
|
|
38
31
|
this.slotPlaceholders = [];
|
|
39
|
-
/**
|
|
40
|
-
* @internal
|
|
41
|
-
*/
|
|
42
|
-
this.pendingSlotRelocation = false;
|
|
43
32
|
}
|
|
44
33
|
createRenderRoot() {
|
|
45
34
|
return this;
|
|
46
35
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
36
|
+
/**
|
|
37
|
+
* We adopt the children here once, just before the first render.
|
|
38
|
+
*/
|
|
51
39
|
willUpdate(changedProperties) {
|
|
52
40
|
super.willUpdate?.(changedProperties);
|
|
53
|
-
if (!this.hasUpdated
|
|
41
|
+
if (!this.hasUpdated) {
|
|
54
42
|
this.adoptChildren();
|
|
55
43
|
}
|
|
56
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* After Lit has rendered, we find our placeholders and swap them
|
|
47
|
+
* with the actual nodes from the slots.
|
|
48
|
+
*/
|
|
57
49
|
updated(changedProperties) {
|
|
58
50
|
super.updated?.(changedProperties);
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
for (const placeholderInfo of this.slotPlaceholders) {
|
|
64
|
-
this._relocateSingleSlot(placeholderInfo);
|
|
51
|
+
for (const { placeholder, nodes } of this.slotPlaceholders) {
|
|
52
|
+
placeholder.replaceWith(...nodes);
|
|
65
53
|
}
|
|
54
|
+
// Clear the list for the next render cycle.
|
|
66
55
|
this.slotPlaceholders = [];
|
|
67
|
-
this.pendingSlotRelocation = false;
|
|
68
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Reads the initial child nodes, sorts them into the `slots` map,
|
|
59
|
+
* and removes them from the DOM temporarily.
|
|
60
|
+
*/
|
|
69
61
|
adoptChildren() {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
return this._createSlotPlaceholder('');
|
|
79
|
-
}
|
|
80
|
-
return defaultContent ? [defaultContent] : [];
|
|
81
|
-
}
|
|
82
|
-
getSlotNameForChild(child) {
|
|
83
|
-
if (child instanceof Comment && child.nextSibling instanceof Element) {
|
|
84
|
-
return this.getSlotNameForChild(child.nextSibling);
|
|
85
|
-
}
|
|
86
|
-
if (child instanceof Element) {
|
|
87
|
-
return child.getAttribute('slot') || '';
|
|
62
|
+
const children = Array.from(this.childNodes);
|
|
63
|
+
for (const child of children) {
|
|
64
|
+
const slotName = child instanceof Element ? child.getAttribute('slot') || '' : '';
|
|
65
|
+
if (!this.slotContent[slotName]) {
|
|
66
|
+
this.slotContent[slotName] = [];
|
|
67
|
+
}
|
|
68
|
+
this.slotContent[slotName].push(child);
|
|
69
|
+
child.remove();
|
|
88
70
|
}
|
|
89
|
-
return '';
|
|
90
71
|
}
|
|
91
72
|
isTextNodeEmpty(node) {
|
|
92
73
|
return !node.textContent || !node.textContent.trim();
|
|
93
74
|
}
|
|
94
75
|
isSlotEmpty(slot) {
|
|
95
|
-
const content = this.
|
|
76
|
+
const content = this.slotContent[slot];
|
|
96
77
|
return (!content ||
|
|
97
78
|
content.every((child) => {
|
|
98
79
|
return (child instanceof Comment ||
|
|
99
80
|
(child instanceof Text && this.isTextNodeEmpty(child)));
|
|
100
81
|
}));
|
|
101
82
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
}
|
|
113
|
-
_hasDefaultSlotContent() {
|
|
114
|
-
return !this.isSlotEmpty('');
|
|
115
|
-
}
|
|
116
|
-
_mapChildrenToSlots() {
|
|
117
|
-
const children = Array.from(this.childNodes);
|
|
118
|
-
for (const child of children) {
|
|
119
|
-
const slotName = this.getSlotNameForChild(child);
|
|
120
|
-
this._addChildToSlot(child, slotName);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
_addChildToSlot(child, slotName) {
|
|
124
|
-
if (!this.slots[slotName]) {
|
|
125
|
-
this.slots[slotName] = [];
|
|
83
|
+
/**
|
|
84
|
+
* Returns the content for the default slot.
|
|
85
|
+
* If no nodes are assigned to the default slot, returns the provided fallback content.
|
|
86
|
+
*
|
|
87
|
+
* @param defaultContent - Optional content to render if the default slot is empty.
|
|
88
|
+
* @returns A `TemplateResult` representing the slot placeholder if nodes exist, otherwise an array containing the default content or an empty array.
|
|
89
|
+
*/
|
|
90
|
+
renderDefaultSlotContent(defaultContent) {
|
|
91
|
+
if (!this.isSlotEmpty('')) {
|
|
92
|
+
return this.createSlotPlaceholder(this.slotContent['']);
|
|
126
93
|
}
|
|
127
|
-
|
|
94
|
+
return defaultContent ? [defaultContent] : [];
|
|
128
95
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
this.slotPlaceholders.push({
|
|
136
|
-
slotName,
|
|
137
|
-
placeholder,
|
|
138
|
-
originalNodes: slotContent,
|
|
139
|
-
});
|
|
140
|
-
this.pendingSlotRelocation = true;
|
|
96
|
+
/**
|
|
97
|
+
* Creates a placeholder comment that will be replaced in `updated`.
|
|
98
|
+
*/
|
|
99
|
+
createSlotPlaceholder(nodes) {
|
|
100
|
+
const placeholder = document.createComment('slot');
|
|
101
|
+
this.slotPlaceholders.push({ placeholder, nodes });
|
|
141
102
|
return [placeholder];
|
|
142
103
|
}
|
|
143
|
-
_relocateSingleSlot(placeholderInfo) {
|
|
144
|
-
const { placeholder, originalNodes } = placeholderInfo;
|
|
145
|
-
const parent = placeholder.parentNode;
|
|
146
|
-
if (!parent) {
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
for (const node of originalNodes) {
|
|
150
|
-
this._moveNodeIfNeeded(node, parent, placeholder);
|
|
151
|
-
}
|
|
152
|
-
placeholder.remove();
|
|
153
|
-
}
|
|
154
|
-
_moveNodeIfNeeded(node, parent, placeholder) {
|
|
155
|
-
const needsMove = node.parentNode !== parent || node.nextSibling !== placeholder;
|
|
156
|
-
if (needsMove) {
|
|
157
|
-
parent.insertBefore(node, placeholder);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
104
|
}
|
|
161
105
|
return SlotsForNoShadowDOMClass;
|
|
162
106
|
};
|
|
@@ -1,4 +1,15 @@
|
|
|
1
|
+
function hasLightDOMSlotContent(element) {
|
|
2
|
+
return ('slotContent' in element &&
|
|
3
|
+
typeof element.slotContent === 'object');
|
|
4
|
+
}
|
|
1
5
|
function getNamedSlotFromHost(host, slotName) {
|
|
6
|
+
if (hasLightDOMSlotContent(host)) {
|
|
7
|
+
const targetLightDomSlotContent = host.slotContent[slotName];
|
|
8
|
+
if (!targetLightDomSlotContent) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
return targetLightDomSlotContent.find((node) => node instanceof Element);
|
|
12
|
+
}
|
|
2
13
|
const children = Array.from(host.children);
|
|
3
14
|
const targetSlot = children.filter((child) => child.getAttribute('slot') === slotName);
|
|
4
15
|
if (!targetSlot.length) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"slot-utils.js","mappings":"
|
|
1
|
+
{"file":"slot-utils.js","mappings":"AAEA,SAAS,sBAAsB,CAC7B,OAAoB;IAEpB,QACE,aAAa,IAAI,OAAO;QACxB,OAAQ,OAA2C,CAAC,WAAW,KAAK,QAAQ,EAC5E;AACJ,CAAC;SAEe,oBAAoB,CAAC,IAAiB,EAAE,QAAgB;IACtE,IAAI,sBAAsB,CAAC,IAAI,CAAC,EAAE;QAChC,MAAM,yBAAyB,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAE7D,IAAI,CAAC,yBAAyB,EAAE;YAC9B,OAAO;SACR;QAED,OAAO,yBAAyB,CAAC,IAAI,CACnC,CAAC,IAAe,KAAK,IAAI,YAAY,OAAO,CAC7C,CAAC;KACH;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAChC,CAAC,KAAK,KAAK,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,QAAQ,CACnD,CAAC;IAEF,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;QACtB,OAAO;KACR;IAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;QACzB,OAAO,CAAC,IAAI,CAAC,0CAA0C,QAAQ,IAAI,EAAE,IAAI,CAAC,CAAC;KAC5E;IAED,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;AACvB,CAAC;SAEe,sBAAsB,CAAC,IAAiB;IACtD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CACjC,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,CAC5E,CAAC;IAEF,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;QACvB,OAAO;KACR;IAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;QAC1B,OAAO,CAAC,IAAI,CAAC,0CAA0C,EAAE,IAAI,CAAC,CAAC;KAChE;IAED,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;AACxB;;;;","names":[],"sources":["src/utils/slot-utils.ts"],"sourcesContent":["import type {LightDOMWithSlots} from '@/src/mixins/slots-for-no-shadow-dom-mixin';\n\nfunction hasLightDOMSlotContent(\n element: HTMLElement\n): element is HTMLElement & LightDOMWithSlots {\n return (\n 'slotContent' in element &&\n typeof (element as HTMLElement & LightDOMWithSlots).slotContent === 'object'\n );\n}\n\nexport function getNamedSlotFromHost(host: HTMLElement, slotName: string) {\n if (hasLightDOMSlotContent(host)) {\n const targetLightDomSlotContent = host.slotContent[slotName];\n\n if (!targetLightDomSlotContent) {\n return;\n }\n\n return targetLightDomSlotContent.find(\n (node: ChildNode) => node instanceof Element\n );\n }\n\n const children = Array.from(host.children);\n const targetSlot = children.filter(\n (child) => child.getAttribute('slot') === slotName\n );\n\n if (!targetSlot.length) {\n return;\n }\n\n if (targetSlot.length > 1) {\n console.warn(`Element should only have 1 slot named \"${slotName}\".`, host);\n }\n\n return targetSlot[0];\n}\n\nexport function getDefaultSlotFromHost(host: HTMLElement) {\n const children = Array.from(host.children);\n const defaultSlot = children.filter(\n (child) => !child.hasAttribute('slot') || child.getAttribute('slot') === ''\n );\n\n if (!defaultSlot.length) {\n return;\n }\n\n if (defaultSlot.length > 1) {\n console.warn('Element should only have 1 default slot.', host);\n }\n\n return defaultSlot[0];\n}\n"],"version":3}
|
|
@@ -1,4 +1,15 @@
|
|
|
1
|
+
function hasLightDOMSlotContent(element) {
|
|
2
|
+
return ('slotContent' in element &&
|
|
3
|
+
typeof element.slotContent === 'object');
|
|
4
|
+
}
|
|
1
5
|
export function getNamedSlotFromHost(host, slotName) {
|
|
6
|
+
if (hasLightDOMSlotContent(host)) {
|
|
7
|
+
const targetLightDomSlotContent = host.slotContent[slotName];
|
|
8
|
+
if (!targetLightDomSlotContent) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
return targetLightDomSlotContent.find((node) => node instanceof Element);
|
|
12
|
+
}
|
|
2
13
|
const children = Array.from(host.children);
|
|
3
14
|
const targetSlot = children.filter((child) => child.getAttribute('slot') === slotName);
|
|
4
15
|
if (!targetSlot.length) {
|