@salesforcedevs/dx-components 1.32.0-alpha.8 → 1.32.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/lwc.config.json +1 -1
- package/package.json +3 -3
- package/src/modules/dx/agentMiawUi/agentMiawUi.css +4 -0
- package/src/modules/dx/agentMiawUi/agentMiawUi.html +3 -0
- package/src/modules/dx/agentMiawUi/agentMiawUi.ts +167 -0
- package/src/modules/dx/codeBlock/codeBlock.css +7 -0
- package/src/modules/dx/dropdownOption/dropdownOption.css +8 -13
- package/src/modules/dx/footer/footer.ts +55 -32
- package/src/modules/dx/globalHeader/globalHeader.html +2 -2
- package/src/modules/dx/globalHeader/globalHeader.ts +40 -30
- package/src/modules/dx/searchResults/searchResults.css +6 -105
- package/src/modules/dx/searchResults/searchResults.html +91 -87
- package/src/modules/dx/searchResults/searchResults.ts +477 -174
- package/src/modules/dx/sidebar/sidebar.css +0 -1
- package/src/modules/dx/sidebar/sidebar.html +5 -1
- package/src/modules/dx/sidebar/sidebar.ts +29 -44
- package/src/modules/dx/sidebarSearch/sidebarSearch.ts +343 -159
- package/src/modules/dx/sidebarSearchResult/sidebarSearchResult.css +25 -43
- package/src/modules/dx/sidebarSearchResult/sidebarSearchResult.ts +4 -12
- package/src/modules/dx/tree/treeHandler.ts +2 -1
- package/src/modules/dx/treeTile/treeTile.css +4 -0
- package/src/modules/dx/treeTile/treeTile.html +10 -0
- package/src/modules/dx/treeTile/treeTile.ts +4 -0
- package/src/modules/dxUtils/async/async.ts +32 -0
- package/src/modules/dxUtils/data360Search/data360Search.ts +0 -168
package/lwc.config.json
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
],
|
|
7
7
|
"expose": [
|
|
8
8
|
"dx/agenda",
|
|
9
|
+
"dx/agentMiawUi",
|
|
9
10
|
"dx/alert",
|
|
10
11
|
"dx/audio",
|
|
11
12
|
"dx/banner",
|
|
@@ -128,7 +129,6 @@
|
|
|
128
129
|
"dxUtils/analytics",
|
|
129
130
|
"dxUtils/async",
|
|
130
131
|
"dxUtils/constants",
|
|
131
|
-
"dxUtils/data360Search",
|
|
132
132
|
"dxUtils/contentTypes",
|
|
133
133
|
"dxUtils/coveo",
|
|
134
134
|
"dxUtils/dates",
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@salesforcedevs/dx-components",
|
|
3
|
-
"version": "1.32.0
|
|
3
|
+
"version": "1.32.0",
|
|
4
4
|
"description": "DX Lightning web components",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"engines": {
|
|
7
|
-
"node": "
|
|
7
|
+
"node": "22.x"
|
|
8
8
|
},
|
|
9
9
|
"publishConfig": {
|
|
10
10
|
"access": "public"
|
|
@@ -44,5 +44,5 @@
|
|
|
44
44
|
"luxon": "3.4.4",
|
|
45
45
|
"msw": "^2.12.4"
|
|
46
46
|
},
|
|
47
|
-
"gitHead": "
|
|
47
|
+
"gitHead": "0dce435f5845187b50577dc005de80ddc3002b9d"
|
|
48
48
|
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/* eslint-disable @lwc/lwc/no-document-query */
|
|
2
|
+
import { LightningElement, api } from "lwc";
|
|
3
|
+
import { waitUntilResolved } from "dxUtils/async";
|
|
4
|
+
|
|
5
|
+
const HOSTED_MIAW_UI_TAG = "page-builder-miaw-ui";
|
|
6
|
+
const SCRIPT_SRC =
|
|
7
|
+
"https://a.sfdcstatic.com/digital/@sfdc-www-emu/page-builder-miaw-ui/v1-stable/page-builder-miaw-ui.js";
|
|
8
|
+
const DEFINE_TIMEOUT_MS = 60000;
|
|
9
|
+
const WHEN_DEFINED_TIMEOUT_MESSAGE =
|
|
10
|
+
`MIAW UI embed (${HOSTED_MIAW_UI_TAG}) did not register within ${
|
|
11
|
+
DEFINE_TIMEOUT_MS / 1000
|
|
12
|
+
}s. ` +
|
|
13
|
+
"Confirm the script loads (network tab), your origin is allowed, and CSP permits this script.";
|
|
14
|
+
|
|
15
|
+
let scriptLoaded: Promise<void> | null = null;
|
|
16
|
+
|
|
17
|
+
async function ensureMiawScriptAndDefinition(): Promise<void> {
|
|
18
|
+
if (customElements.get(HOSTED_MIAW_UI_TAG)) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
let script = document.querySelector(
|
|
23
|
+
`script[src="${SCRIPT_SRC}"]`
|
|
24
|
+
) as HTMLScriptElement | null;
|
|
25
|
+
|
|
26
|
+
if (!script) {
|
|
27
|
+
script = document.createElement("script");
|
|
28
|
+
script.type = "module";
|
|
29
|
+
script.src = SCRIPT_SRC;
|
|
30
|
+
await new Promise<void>((resolve, reject) => {
|
|
31
|
+
script!.addEventListener("load", () => resolve(), { once: true });
|
|
32
|
+
script!.addEventListener(
|
|
33
|
+
"error",
|
|
34
|
+
() =>
|
|
35
|
+
reject(
|
|
36
|
+
new Error(
|
|
37
|
+
`Failed to load MIAW UI embed script (${SCRIPT_SRC}). Check status code and referrer rules.`
|
|
38
|
+
)
|
|
39
|
+
),
|
|
40
|
+
{ once: true }
|
|
41
|
+
);
|
|
42
|
+
document.head.appendChild(script!);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
await waitUntilResolved(
|
|
46
|
+
customElements.whenDefined(HOSTED_MIAW_UI_TAG),
|
|
47
|
+
DEFINE_TIMEOUT_MS,
|
|
48
|
+
WHEN_DEFINED_TIMEOUT_MESSAGE
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Loads the MIAW UI script if it is not already loaded. This occurs only once per module instance. */
|
|
53
|
+
function loadMiawUiScript(): Promise<void> {
|
|
54
|
+
if (!scriptLoaded) {
|
|
55
|
+
scriptLoaded = ensureMiawScriptAndDefinition();
|
|
56
|
+
}
|
|
57
|
+
return scriptLoaded;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export default class AgentMiawUi extends LightningElement {
|
|
61
|
+
private static readonly SIDEBAR_OPEN_ATTR = "data-xsf-agent-sidebar-open";
|
|
62
|
+
private static readonly AGENT_ROOT_SELECTOR = '[data-testid="agent-root"]';
|
|
63
|
+
private static readonly SIDEBAR_OPEN_CLASS = "view-sidebar";
|
|
64
|
+
|
|
65
|
+
/** Salesforce org id (15- or 18-character Id). */
|
|
66
|
+
@api orgId!: string;
|
|
67
|
+
/** Messaging endpoint host URL (e.g. https://org62.my.salesforce-scrt.com). */
|
|
68
|
+
@api messagingUrl!: string;
|
|
69
|
+
@api deploymentDevName = "page_builder_miaw_ui";
|
|
70
|
+
@api richComponentVersion = "v1-stable";
|
|
71
|
+
@api isOnDigitalDomain = "true";
|
|
72
|
+
@api routingAttributes?: string;
|
|
73
|
+
/**
|
|
74
|
+
* JSON array of suggested prompt strings for the MIAW UI (e.g.
|
|
75
|
+
* `["Show me an Agentforce demo","Help me build a business case"]`); forwarded as `prompts` on the embed.
|
|
76
|
+
*/
|
|
77
|
+
@api prompts?: string;
|
|
78
|
+
/** When set, forwarded to the embed as `welcome-text` (greeting / headline copy). */
|
|
79
|
+
@api welcomeText?: string;
|
|
80
|
+
|
|
81
|
+
/** After first mount attempt is scheduled, we do not run it again for this instance. */
|
|
82
|
+
private hasRendered = false;
|
|
83
|
+
private sidebarStateObserver: MutationObserver | null = null;
|
|
84
|
+
private sidebarStateTargetSelector = "#main-content";
|
|
85
|
+
|
|
86
|
+
renderedCallback(): void {
|
|
87
|
+
if (!this.hasRendered) {
|
|
88
|
+
this.hasRendered = true;
|
|
89
|
+
this.mountMiawHost();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
disconnectedCallback(): void {
|
|
94
|
+
this.sidebarStateObserver?.disconnect();
|
|
95
|
+
this.sidebarStateObserver = null;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
private async mountMiawHost(): Promise<void> {
|
|
99
|
+
try {
|
|
100
|
+
await loadMiawUiScript();
|
|
101
|
+
const container = this.template.querySelector(".miaw-host");
|
|
102
|
+
if (!container) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const el = document.createElement(HOSTED_MIAW_UI_TAG);
|
|
106
|
+
el.setAttribute("org-id", this.orgId);
|
|
107
|
+
el.setAttribute("messaging-url", this.messagingUrl);
|
|
108
|
+
el.setAttribute("deployment-dev-name", this.deploymentDevName);
|
|
109
|
+
el.setAttribute("input-variant", "mini-sidebar");
|
|
110
|
+
el.setAttribute("is-on-digital-domain", this.isOnDigitalDomain);
|
|
111
|
+
el.setAttribute(
|
|
112
|
+
"rich-component-version",
|
|
113
|
+
this.richComponentVersion
|
|
114
|
+
);
|
|
115
|
+
if (this.routingAttributes) {
|
|
116
|
+
el.setAttribute(
|
|
117
|
+
"routing-attributes",
|
|
118
|
+
this.routingAttributes
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
if (this.prompts) {
|
|
122
|
+
el.setAttribute("prompts", this.prompts);
|
|
123
|
+
}
|
|
124
|
+
if (this.welcomeText) {
|
|
125
|
+
el.setAttribute("welcome-text", this.welcomeText);
|
|
126
|
+
}
|
|
127
|
+
container.appendChild(el);
|
|
128
|
+
this.bridgeSidebarState(el);
|
|
129
|
+
} catch (e) {
|
|
130
|
+
console.error(e);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
private setSidebarOpenState(isOpen: boolean): void {
|
|
135
|
+
const targets = document.querySelectorAll(this.sidebarStateTargetSelector);
|
|
136
|
+
targets.forEach((target) => {
|
|
137
|
+
target.setAttribute(
|
|
138
|
+
AgentMiawUi.SIDEBAR_OPEN_ATTR,
|
|
139
|
+
isOpen ? "true" : "false"
|
|
140
|
+
);
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
private bridgeSidebarState(el: Element): void {
|
|
145
|
+
const host = el as HTMLElement;
|
|
146
|
+
const root = host.shadowRoot?.querySelector(
|
|
147
|
+
AgentMiawUi.AGENT_ROOT_SELECTOR
|
|
148
|
+
) as HTMLElement | null;
|
|
149
|
+
if (!root) {
|
|
150
|
+
window.requestAnimationFrame(() => this.bridgeSidebarState(el));
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const isOpen = () =>
|
|
155
|
+
root.classList.contains(AgentMiawUi.SIDEBAR_OPEN_CLASS);
|
|
156
|
+
this.setSidebarOpenState(isOpen());
|
|
157
|
+
|
|
158
|
+
this.sidebarStateObserver?.disconnect();
|
|
159
|
+
this.sidebarStateObserver = new MutationObserver(() => {
|
|
160
|
+
this.setSidebarOpenState(isOpen());
|
|
161
|
+
});
|
|
162
|
+
this.sidebarStateObserver.observe(root, {
|
|
163
|
+
attributes: true,
|
|
164
|
+
attributeFilter: ["class"]
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
@@ -143,6 +143,13 @@ code[class*="shiki"] {
|
|
|
143
143
|
padding: 0 var(--dx-g-spacing-md) 0 var(--dx-g-spacing-sm);
|
|
144
144
|
text-align: right;
|
|
145
145
|
user-select: none;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.dx-theme-light .code-line-number {
|
|
149
|
+
color: var(--dx-g-gray-40);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.dx-theme-dark .code-line-number {
|
|
146
153
|
color: var(--dx-g-gray-60);
|
|
147
154
|
}
|
|
148
155
|
|
|
@@ -31,7 +31,14 @@
|
|
|
31
31
|
transition: var(--dx-g-transition-hue-1x);
|
|
32
32
|
align-items: center;
|
|
33
33
|
outline: none !important;
|
|
34
|
-
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.option:focus {
|
|
37
|
+
box-shadow: inset 0 0 0 1px var(--dx-g-blue-vibrant-50);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.option:active {
|
|
41
|
+
background: var(--dx-g-cloud-blue-vibrant-95) !important;
|
|
35
42
|
}
|
|
36
43
|
|
|
37
44
|
.option:not(.option-active):hover {
|
|
@@ -44,18 +51,6 @@
|
|
|
44
51
|
background: var(--dx-g-cloud-blue-vibrant-95);
|
|
45
52
|
}
|
|
46
53
|
|
|
47
|
-
.option:focus {
|
|
48
|
-
box-shadow: 0 0 0 2px var(--dx-g-blue-vibrant-50);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
.option-active:focus {
|
|
52
|
-
box-shadow: 0 0 0 2px var(--dx-g-blue-vibrant-50);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
.option:active {
|
|
56
|
-
background: var(--dx-g-cloud-blue-vibrant-95) !important;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
54
|
.option_details {
|
|
60
55
|
display: flex;
|
|
61
56
|
flex-direction: column;
|
|
@@ -8,7 +8,7 @@ class Footer extends LightningElement {
|
|
|
8
8
|
private _variant: FooterVariant = "small-signup";
|
|
9
9
|
private isSlotEmpty = true;
|
|
10
10
|
private signupUrl =
|
|
11
|
-
"https://www.salesforce.com/
|
|
11
|
+
"https://www.salesforce.com/company/newsletter-subscribe/?topics=Developer";
|
|
12
12
|
|
|
13
13
|
@api
|
|
14
14
|
mfeHomeHref: string = `/${window.location.host}`; // ugly hack: ideally this wouldn't be necessary, but the only way to remove the "See all ways to contact us" link from the footer MFE is to set this to a non-empty value other than "us"; and given the way that the footer works, the non-empty value needs to be something that can be appended to `/` and work correctly
|
|
@@ -151,7 +151,10 @@ function augmentWithNonMFEFooterFunctionality(FooterClass: typeof Footer) {
|
|
|
151
151
|
private buildFooterConfigLookupTables(config: any[]) {
|
|
152
152
|
config.forEach((item: any) => {
|
|
153
153
|
// attr_title is preferable to title because it is not language-specific
|
|
154
|
-
this.configItemTitleToItemLookup.set(
|
|
154
|
+
this.configItemTitleToItemLookup.set(
|
|
155
|
+
item.attr_title || item.title,
|
|
156
|
+
item
|
|
157
|
+
);
|
|
155
158
|
if (item.menu_item_parent) {
|
|
156
159
|
const parentId = parseInt(item.menu_item_parent, 10);
|
|
157
160
|
const children =
|
|
@@ -188,26 +191,26 @@ function augmentWithNonMFEFooterFunctionality(FooterClass: typeof Footer) {
|
|
|
188
191
|
return;
|
|
189
192
|
}
|
|
190
193
|
|
|
191
|
-
this.socialLinks =
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
194
|
+
this.socialLinks = socialLinksItems.map((child: any) => {
|
|
195
|
+
const childTitle: string =
|
|
196
|
+
child.attr_title || child.title || ""; // attr_title is preferable to title because it is not language-specific
|
|
197
|
+
const iconSymbol =
|
|
198
|
+
childTitle === "LinkedIn"
|
|
199
|
+
? "linked-in"
|
|
200
|
+
: childTitle.toLocaleLowerCase();
|
|
201
|
+
const iconUrlHash =
|
|
202
|
+
iconSymbol === "twitter"
|
|
203
|
+
? "#twitter-x"
|
|
204
|
+
: `#themed-${iconSymbol}`;
|
|
205
|
+
|
|
206
|
+
return {
|
|
207
|
+
href: child.url,
|
|
208
|
+
iconSprite: "brand",
|
|
209
|
+
iconURL: `${baseSocialIconUrl}${iconUrlHash}`,
|
|
210
|
+
label: child.title,
|
|
211
|
+
iconSymbol
|
|
212
|
+
};
|
|
213
|
+
});
|
|
211
214
|
}
|
|
212
215
|
|
|
213
216
|
private setGeneralLinks() {
|
|
@@ -234,10 +237,14 @@ function augmentWithNonMFEFooterFunctionality(FooterClass: typeof Footer) {
|
|
|
234
237
|
|
|
235
238
|
const generalLinks: any[] = [];
|
|
236
239
|
generalLinksHeadingsItems.forEach((item: any) => {
|
|
237
|
-
const childrenItems = this.configItemParentToChildrenLookup.get(
|
|
240
|
+
const childrenItems = this.configItemParentToChildrenLookup.get(
|
|
241
|
+
item.ID
|
|
242
|
+
);
|
|
238
243
|
|
|
239
244
|
if (!childrenItems) {
|
|
240
|
-
console.error(
|
|
245
|
+
console.error(
|
|
246
|
+
`General links children items not found for item with title "${item.title}"`
|
|
247
|
+
);
|
|
241
248
|
return;
|
|
242
249
|
}
|
|
243
250
|
|
|
@@ -260,16 +267,24 @@ function augmentWithNonMFEFooterFunctionality(FooterClass: typeof Footer) {
|
|
|
260
267
|
}
|
|
261
268
|
|
|
262
269
|
private setLegalFooter() {
|
|
263
|
-
const copyrightNoticeItem = this.configItemTitleToItemLookup.get(
|
|
270
|
+
const copyrightNoticeItem = this.configItemTitleToItemLookup.get(
|
|
271
|
+
"All rights reserved"
|
|
272
|
+
);
|
|
264
273
|
|
|
265
274
|
if (!copyrightNoticeItem) {
|
|
266
|
-
console.error(
|
|
275
|
+
console.error(
|
|
276
|
+
"All rights reserved item not found in footer config"
|
|
277
|
+
);
|
|
267
278
|
return;
|
|
268
279
|
}
|
|
269
280
|
|
|
270
281
|
const { url, description } = copyrightNoticeItem;
|
|
271
|
-
const copyrightNoticeInnerHtml = description.replace(
|
|
272
|
-
|
|
282
|
+
const copyrightNoticeInnerHtml = description.replace(
|
|
283
|
+
"{{All rights reserved}}",
|
|
284
|
+
`<a href="${url}">All rights reserved</a>`
|
|
285
|
+
);
|
|
286
|
+
const copyrightNoticeEl =
|
|
287
|
+
this.template.querySelector(".copyright-notice")!;
|
|
273
288
|
copyrightNoticeEl.innerHTML = copyrightNoticeInnerHtml;
|
|
274
289
|
const copyrightLink = copyrightNoticeEl.querySelector("a");
|
|
275
290
|
if (copyrightLink) {
|
|
@@ -278,10 +293,14 @@ function augmentWithNonMFEFooterFunctionality(FooterClass: typeof Footer) {
|
|
|
278
293
|
);
|
|
279
294
|
}
|
|
280
295
|
|
|
281
|
-
const legalLinksItems = this.configItemParentToChildrenLookup.get(
|
|
296
|
+
const legalLinksItems = this.configItemParentToChildrenLookup.get(
|
|
297
|
+
copyrightNoticeItem.ID
|
|
298
|
+
);
|
|
282
299
|
|
|
283
300
|
if (!legalLinksItems) {
|
|
284
|
-
console.error(
|
|
301
|
+
console.error(
|
|
302
|
+
"Legal links children items not found in footer config"
|
|
303
|
+
);
|
|
285
304
|
return;
|
|
286
305
|
}
|
|
287
306
|
|
|
@@ -298,7 +317,8 @@ function augmentWithNonMFEFooterFunctionality(FooterClass: typeof Footer) {
|
|
|
298
317
|
link.href = "#";
|
|
299
318
|
link.onclick = this.handleCookiePreferencesClick;
|
|
300
319
|
} else if (itemTitle === "Your Privacy Choices") {
|
|
301
|
-
link.img =
|
|
320
|
+
link.img =
|
|
321
|
+
"https://developer.salesforce.com/ns-assets/privacyoptions.svg";
|
|
302
322
|
}
|
|
303
323
|
|
|
304
324
|
return link;
|
|
@@ -306,7 +326,10 @@ function augmentWithNonMFEFooterFunctionality(FooterClass: typeof Footer) {
|
|
|
306
326
|
}
|
|
307
327
|
|
|
308
328
|
private openOneTrustInfoDisplay() {
|
|
309
|
-
if (
|
|
329
|
+
if (
|
|
330
|
+
(window as any).OneTrust &&
|
|
331
|
+
(window as any).OneTrust.ToggleInfoDisplay
|
|
332
|
+
) {
|
|
310
333
|
(window as any).OneTrust.ToggleInfoDisplay();
|
|
311
334
|
}
|
|
312
335
|
}
|
|
@@ -1,31 +1,59 @@
|
|
|
1
1
|
import kebabCase from "lodash.kebabcase";
|
|
2
2
|
import { LightningElement, api } from "lwc";
|
|
3
3
|
|
|
4
|
-
const defaultDomain = "
|
|
4
|
+
const defaultDomain = ""; // empty domain means the header settings will be loaded from the same domain as the current page
|
|
5
5
|
const defaultLocale = "en-us";
|
|
6
6
|
const defaultHeaderSettingsBasePath = "/c/public/header-settings";
|
|
7
|
-
const
|
|
7
|
+
const defaultPropertyTitle = "Developers";
|
|
8
|
+
const headerSettingsJsonKeys = [
|
|
9
|
+
"regionSelectorOverride",
|
|
10
|
+
"contactLinksOverride"
|
|
11
|
+
];
|
|
8
12
|
|
|
9
13
|
export default class DevExNavigation extends LightningElement {
|
|
14
|
+
static renderMode = "light"; // Light DOM currently required due to other elements reading from this element's DOM; we should fix that and use existing nav CSS variables in those other elements (TODO)
|
|
15
|
+
|
|
10
16
|
@api locale: string = defaultLocale;
|
|
11
17
|
@api path: string = defaultHeaderSettingsBasePath;
|
|
12
18
|
@api domain: string = defaultDomain;
|
|
19
|
+
@api propertyTitle: string = defaultPropertyTitle; // used only as a fallback in the "barebones" nav
|
|
20
|
+
|
|
21
|
+
// Fallback basic nav config used when the header settings are not available
|
|
22
|
+
private get barebonesNavConfig() {
|
|
23
|
+
return {
|
|
24
|
+
headerSettings: {
|
|
25
|
+
origin: "",
|
|
26
|
+
contextNavEnabled: "true"
|
|
27
|
+
},
|
|
28
|
+
navItems: {
|
|
29
|
+
variation: "static",
|
|
30
|
+
propertyTitle: {
|
|
31
|
+
label: this.propertyTitle,
|
|
32
|
+
url: "/"
|
|
33
|
+
},
|
|
34
|
+
menuGroup: {}
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
13
38
|
|
|
14
39
|
async connectedCallback(): Promise<void> {
|
|
40
|
+
let navConfig = null;
|
|
15
41
|
try {
|
|
16
|
-
const headerSettingsResponse = await fetch(
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
42
|
+
const headerSettingsResponse = await fetch(
|
|
43
|
+
`${this.domain}${this.path}/${this.locale}.json`,
|
|
44
|
+
{
|
|
45
|
+
headers: {
|
|
46
|
+
"Content-Type": "application/json"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
);
|
|
21
50
|
if (headerSettingsResponse.ok) {
|
|
22
|
-
|
|
23
|
-
} else {
|
|
24
|
-
this.createBarebonesNav();
|
|
51
|
+
navConfig = await headerSettingsResponse.json();
|
|
25
52
|
}
|
|
26
53
|
} catch (ex) {
|
|
27
|
-
console.error(`
|
|
28
|
-
|
|
54
|
+
console.error(`Header settings error: ${ex}`);
|
|
55
|
+
} finally {
|
|
56
|
+
this.createFullNav(navConfig || this.barebonesNavConfig);
|
|
29
57
|
}
|
|
30
58
|
}
|
|
31
59
|
|
|
@@ -55,22 +83,4 @@ export default class DevExNavigation extends LightningElement {
|
|
|
55
83
|
containerEl.appendChild(hgfNav);
|
|
56
84
|
containerEl.appendChild(hgfNavContext);
|
|
57
85
|
}
|
|
58
|
-
|
|
59
|
-
private createBarebonesNav(): void {
|
|
60
|
-
const hgfNav = this.createGlobalNav({
|
|
61
|
-
origin: "",
|
|
62
|
-
contextNavEnabled: "true",
|
|
63
|
-
});
|
|
64
|
-
const hgfNavContext = this.createContextNav({
|
|
65
|
-
variation: "static",
|
|
66
|
-
propertyTitle: {
|
|
67
|
-
label: "Developers",
|
|
68
|
-
url: "/",
|
|
69
|
-
},
|
|
70
|
-
menuGroup: {},
|
|
71
|
-
});
|
|
72
|
-
const containerEl = this.refs.globalNavContainer as Element;
|
|
73
|
-
containerEl.appendChild(hgfNav);
|
|
74
|
-
containerEl.appendChild(hgfNavContext);
|
|
75
|
-
}
|
|
76
86
|
}
|
|
@@ -248,7 +248,7 @@ li.coveo-dynamic-facet-breadcrumb-value-list-item {
|
|
|
248
248
|
|
|
249
249
|
.coveo-pager-list-item {
|
|
250
250
|
border: none;
|
|
251
|
-
border-radius:
|
|
251
|
+
border-radius: 16px;
|
|
252
252
|
display: inline-flex;
|
|
253
253
|
align-items: center;
|
|
254
254
|
justify-content: center;
|
|
@@ -282,62 +282,13 @@ li.coveo-dynamic-facet-breadcrumb-value-list-item {
|
|
|
282
282
|
border-right: none;
|
|
283
283
|
}
|
|
284
284
|
|
|
285
|
-
/* List item states: same padding in all states so text never moves. Ring 8px from text on sides, more on top/bottom. */
|
|
286
285
|
.dx-result {
|
|
287
|
-
--dx-result-inner-gap-x: var(
|
|
288
|
-
--dx-g-spacing-sm
|
|
289
|
-
); /* 8px between text and ring on sides */
|
|
290
|
-
|
|
291
|
-
--dx-result-inner-gap-y: var(
|
|
292
|
-
--dx-g-spacing-xs
|
|
293
|
-
); /* ring closer to card edge so more padding inside box top/bottom */
|
|
294
|
-
|
|
295
|
-
position: relative;
|
|
296
286
|
background: white;
|
|
297
|
-
border-radius:
|
|
287
|
+
border-radius: 16px;
|
|
298
288
|
border: 1px solid rgb(24 24 24 / 4%);
|
|
299
289
|
box-shadow: 0 0 2px 0 rgb(24 24 24 / 8%), 0 2px 4px 1px rgb(24 24 24 / 16%);
|
|
300
|
-
padding:
|
|
301
|
-
margin-bottom: var(--dx-g-spacing-
|
|
302
|
-
transition: background-color 0.1s ease;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
/* Hover: same shape as focus box, more padding top/bottom inside box; space between results unchanged */
|
|
306
|
-
.dx-result:hover::after {
|
|
307
|
-
content: "";
|
|
308
|
-
position: absolute;
|
|
309
|
-
top: var(--dx-result-inner-gap-y);
|
|
310
|
-
bottom: var(--dx-result-inner-gap-y);
|
|
311
|
-
left: var(--dx-result-inner-gap-x);
|
|
312
|
-
right: var(--dx-result-inner-gap-x);
|
|
313
|
-
background: var(--dx-g-gray-95);
|
|
314
|
-
border-radius: var(--dx-g-spacing-xs);
|
|
315
|
-
pointer-events: none;
|
|
316
|
-
z-index: 0;
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
.dx-result > * {
|
|
320
|
-
position: relative;
|
|
321
|
-
z-index: 1;
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
/* Focus: ring 8px from text via pseudo-element; no padding/layout change */
|
|
325
|
-
.dx-result:focus-within {
|
|
326
|
-
outline: none;
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
/* Pseudo: 8px from text on sides, more padding top/bottom inside ring (smaller inset y) */
|
|
330
|
-
.dx-result:focus-within::before {
|
|
331
|
-
content: "";
|
|
332
|
-
position: absolute;
|
|
333
|
-
top: var(--dx-result-inner-gap-y);
|
|
334
|
-
bottom: var(--dx-result-inner-gap-y);
|
|
335
|
-
left: var(--dx-result-inner-gap-x);
|
|
336
|
-
right: var(--dx-result-inner-gap-x);
|
|
337
|
-
border: 2px solid var(--dx-g-blue-vibrant-50);
|
|
338
|
-
border-radius: var(--dx-g-spacing-xs);
|
|
339
|
-
pointer-events: none;
|
|
340
|
-
z-index: 2;
|
|
290
|
+
padding: 20px;
|
|
291
|
+
margin-bottom: var(--dx-g-spacing-lg);
|
|
341
292
|
}
|
|
342
293
|
|
|
343
294
|
.dx-result-title {
|
|
@@ -371,59 +322,10 @@ li.coveo-dynamic-facet-breadcrumb-value-list-item {
|
|
|
371
322
|
color: white;
|
|
372
323
|
}
|
|
373
324
|
|
|
374
|
-
.dx-search-header + .
|
|
325
|
+
.dx-search-header + .coveo-main-section {
|
|
375
326
|
margin-top: var(--dx-g-spacing-2xl);
|
|
376
327
|
}
|
|
377
328
|
|
|
378
|
-
.dx-search-results {
|
|
379
|
-
font-family: var(--dx-g-font-sans);
|
|
380
|
-
background-color: #fafaf9;
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
.dx-search-main {
|
|
384
|
-
max-width: 1200px;
|
|
385
|
-
margin: 0 auto;
|
|
386
|
-
padding: 0 var(--dx-g-spacing-xl);
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
.dx-search-box-row {
|
|
390
|
-
margin-bottom: var(--dx-g-spacing-lg);
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
.dx-search-box-row .dx-search-box {
|
|
394
|
-
max-width: 400px;
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
.dx-search-loading {
|
|
398
|
-
padding: var(--dx-g-spacing-2xl);
|
|
399
|
-
text-align: center;
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
.dx-search-loading-image {
|
|
403
|
-
max-width: 200px;
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
.dx-search-no-results {
|
|
407
|
-
display: flex;
|
|
408
|
-
justify-content: center;
|
|
409
|
-
gap: 90px;
|
|
410
|
-
margin: 50px 34px 90px;
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
.dx-search-no-results-info {
|
|
414
|
-
text-align: left;
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
.dx-search-no-results-info > ul {
|
|
418
|
-
list-style-type: disc;
|
|
419
|
-
list-style-position: inside;
|
|
420
|
-
font-size: var(--dx-g-text-xs);
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
.dx-search-result-list {
|
|
424
|
-
padding-bottom: var(--dx-g-spacing-2xl);
|
|
425
|
-
}
|
|
426
|
-
|
|
427
329
|
.dx-search-header-container {
|
|
428
330
|
margin: 0 auto;
|
|
429
331
|
max-width: 1200px;
|
|
@@ -596,8 +498,7 @@ li.coveo-dynamic-facet-breadcrumb-value-list-item {
|
|
|
596
498
|
}
|
|
597
499
|
|
|
598
500
|
@media screen and (max-width: 768px) {
|
|
599
|
-
.no-results > img
|
|
600
|
-
.dx-search-no-results > img {
|
|
501
|
+
.no-results > img {
|
|
601
502
|
display: none;
|
|
602
503
|
}
|
|
603
504
|
}
|