@salesforcedevs/docs-components 0.0.1 → 0.0.2-edit
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 +11 -2
- package/package.json +13 -12
- package/src/modules/doc/{amfReference/utils.ts → amfModelParser/amfModelParser.ts} +10 -5
- package/src/modules/doc/amfReference/amfReference.css +23 -3
- package/src/modules/doc/amfReference/amfReference.html +34 -21
- package/src/modules/doc/amfReference/amfReference.ts +225 -92
- package/src/modules/doc/amfReference/types.ts +3 -12
- package/src/modules/doc/amfTopic/amfTopic.css +20 -0
- package/src/modules/doc/amfTopic/amfTopic.ts +35 -18
- package/src/modules/doc/amfTopic/types.ts +15 -13
- package/src/modules/doc/amfTopic/utils.ts +12 -6
- package/src/modules/doc/breadcrumbItem/breadcrumbItem.ts +17 -10
- package/src/modules/doc/breadcrumbs/breadcrumbs.html +7 -9
- package/src/modules/doc/breadcrumbs/breadcrumbs.ts +30 -34
- package/src/modules/doc/chat/README.md +179 -0
- package/src/modules/doc/chat/chat.css +818 -0
- package/src/modules/doc/chat/chat.html +241 -0
- package/src/modules/doc/chat/chat.ts +586 -0
- package/src/modules/doc/componentPlayground/componentPlayground.css +22 -0
- package/src/modules/doc/componentPlayground/componentPlayground.html +20 -0
- package/src/modules/doc/componentPlayground/componentPlayground.ts +29 -0
- package/src/modules/doc/content/content.css +70 -76
- package/src/modules/doc/content/content.html +1 -0
- package/src/modules/doc/content/content.ts +24 -45
- package/src/modules/doc/contentCallout/contentCallout.css +10 -7
- package/src/modules/doc/contentCallout/contentCallout.html +11 -4
- package/src/modules/doc/contentCallout/contentCallout.ts +8 -1
- package/src/modules/doc/contentLayout/contentLayout.css +1 -98
- package/src/modules/doc/contentLayout/contentLayout.html +41 -19
- package/src/modules/doc/contentLayout/contentLayout.ts +298 -89
- package/src/modules/doc/doDont/doDont.css +47 -0
- package/src/modules/doc/doDont/doDont.html +27 -0
- package/src/modules/doc/doDont/doDont.ts +17 -0
- package/src/modules/doc/editFile/editFile.css +514 -0
- package/src/modules/doc/editFile/editFile.html +164 -0
- package/src/modules/doc/editFile/editFile.ts +213 -0
- package/src/modules/doc/header/header.css +65 -36
- package/src/modules/doc/header/header.html +41 -139
- package/src/modules/doc/header/header.ts +54 -76
- package/src/modules/doc/heading/heading.css +16 -37
- package/src/modules/doc/heading/heading.html +4 -4
- package/src/modules/doc/heading/heading.ts +12 -10
- package/src/modules/doc/headingAnchor/headingAnchor.css +2 -2
- package/src/modules/doc/headingAnchor/headingAnchor.ts +2 -2
- package/src/modules/doc/headingContent/headingContent.css +1 -1
- package/src/modules/doc/headingContent/headingContent.html +2 -2
- package/src/modules/doc/headingContent/headingContent.ts +2 -2
- package/src/modules/doc/lwcContentLayout/lwcContentLayout.css +1 -0
- package/src/modules/doc/lwcContentLayout/lwcContentLayout.html +68 -0
- package/src/modules/doc/lwcContentLayout/lwcContentLayout.ts +168 -0
- package/src/modules/doc/overview/overview.css +40 -0
- package/src/modules/doc/overview/overview.html +34 -0
- package/src/modules/doc/overview/overview.ts +12 -0
- package/src/modules/doc/phase/phase.css +18 -3
- package/src/modules/doc/phase/phase.html +12 -2
- package/src/modules/doc/phase/phase.ts +44 -8
- package/src/modules/doc/specificationContent/specificationContent.css +36 -0
- package/src/modules/doc/specificationContent/specificationContent.html +171 -0
- package/src/modules/doc/specificationContent/specificationContent.ts +127 -0
- package/src/modules/doc/sprigSurvey/sprigSurvey.html +20 -0
- package/src/modules/doc/sprigSurvey/sprigSurvey.scoped.css +16 -0
- package/src/modules/doc/sprigSurvey/sprigSurvey.ts +16 -0
- package/src/modules/doc/toc/toc.html +1 -3
- package/src/modules/doc/toc/toc.ts +1 -1
- package/src/modules/doc/toolbar/toolbar.ts +6 -6
- package/src/modules/doc/versionPicker/versionPicker.css +64 -0
- package/src/modules/doc/versionPicker/versionPicker.html +38 -0
- package/src/modules/doc/versionPicker/versionPicker.ts +65 -0
- package/src/modules/doc/xmlContent/types.ts +9 -3
- package/src/modules/doc/xmlContent/utils.ts +3 -1
- package/src/modules/doc/xmlContent/xmlContent.css +26 -4
- package/src/modules/doc/xmlContent/xmlContent.html +29 -17
- package/src/modules/doc/xmlContent/xmlContent.ts +212 -79
- package/src/modules/docHelpers/amfStyle/amfStyle.css +6 -6
- package/src/modules/docHelpers/contentLayoutStyle/contentLayoutStyle.css +131 -0
- package/src/modules/docHelpers/imgStyle/imgStyle.css +59 -0
- package/src/modules/docHelpers/status/status.css +1 -1
- package/src/modules/docUtils/{SearchSyncer/SearchSyncer.ts → searchSyncer/searchSyncer.ts} +1 -0
- package/src/modules/docUtils/utils/__mocks__/coveo.analytics.ts +16 -0
- package/src/modules/docUtils/utils/coveo.analytics.d.ts +10 -0
- package/src/modules/docUtils/utils/utils.ts +32 -0
- package/src/modules/docBaseElements/lightningElementWithState/lightningElementWithState.ts +0 -93
- package/src/modules/docHelpers/phaseContentLayout/phaseContentLayout.css +0 -39
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { LightningElement, api, track } from "lwc";
|
|
2
|
+
import cx from "classnames";
|
|
3
|
+
import { normalizeBoolean } from "dxUtils/normalizers";
|
|
4
|
+
|
|
5
|
+
interface ApiResponse {
|
|
6
|
+
success: boolean;
|
|
7
|
+
data?: string;
|
|
8
|
+
message?: string;
|
|
9
|
+
error?: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export default class EditFile extends LightningElement {
|
|
13
|
+
@api fileName: string = "";
|
|
14
|
+
@api apiEndpoint: string = "/api/edit-file";
|
|
15
|
+
@api title: string = "Edit File";
|
|
16
|
+
|
|
17
|
+
@api
|
|
18
|
+
get disabled() {
|
|
19
|
+
return this._disabled;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
set disabled(value) {
|
|
23
|
+
this._disabled = normalizeBoolean(value);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
@track isPopoverOpen: boolean = false;
|
|
27
|
+
@track isLoading: boolean = false;
|
|
28
|
+
@track isSaving: boolean = false;
|
|
29
|
+
@track fileContent: string = "";
|
|
30
|
+
@track originalContent: string = "";
|
|
31
|
+
@track errorMessage: string = "";
|
|
32
|
+
|
|
33
|
+
private _disabled: boolean = false;
|
|
34
|
+
|
|
35
|
+
// API Configuration
|
|
36
|
+
private static readonly FETCH_ENDPOINT = "/api/file/fetch";
|
|
37
|
+
private static readonly SAVE_ENDPOINT = "/api/file/save";
|
|
38
|
+
|
|
39
|
+
get popoverClass() {
|
|
40
|
+
return cx(
|
|
41
|
+
"edit-file-popover",
|
|
42
|
+
this.isPopoverOpen && "edit-file-popover_open"
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
get overlayClass() {
|
|
47
|
+
return cx(
|
|
48
|
+
"edit-file-overlay",
|
|
49
|
+
this.isPopoverOpen && "edit-file-overlay_open"
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
get saveButtonClass() {
|
|
54
|
+
return cx(
|
|
55
|
+
"edit-file-button",
|
|
56
|
+
"edit-file-button_primary",
|
|
57
|
+
(this.isSaving || this.isContentUnchanged) && "edit-file-button_disabled"
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
get isContentUnchanged() {
|
|
62
|
+
return this.fileContent === this.originalContent;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Open the edit file popover
|
|
66
|
+
async handleEditClick() {
|
|
67
|
+
if (this.disabled) return;
|
|
68
|
+
|
|
69
|
+
this.isPopoverOpen = true;
|
|
70
|
+
this.errorMessage = "";
|
|
71
|
+
await this.fetchFileContent();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Fetch file content from API
|
|
75
|
+
private async fetchFileContent() {
|
|
76
|
+
if (!this.fileName) {
|
|
77
|
+
this.errorMessage = "No file specified to edit";
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
this.isLoading = true;
|
|
82
|
+
|
|
83
|
+
try {
|
|
84
|
+
const response = await fetch(EditFile.FETCH_ENDPOINT, {
|
|
85
|
+
method: "POST",
|
|
86
|
+
headers: {
|
|
87
|
+
"Content-Type": "application/json",
|
|
88
|
+
},
|
|
89
|
+
body: JSON.stringify({
|
|
90
|
+
fileName: this.fileName,
|
|
91
|
+
action: "fetch"
|
|
92
|
+
})
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
if (!response.ok) {
|
|
96
|
+
throw new Error(`Failed to fetch file: ${response.status}`);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const data: ApiResponse = await response.json();
|
|
100
|
+
|
|
101
|
+
if (data.success && data.data !== undefined) {
|
|
102
|
+
this.fileContent = data.data;
|
|
103
|
+
this.originalContent = data.data;
|
|
104
|
+
this.errorMessage = "";
|
|
105
|
+
} else {
|
|
106
|
+
this.errorMessage = data.error || data.message || "Failed to load file content";
|
|
107
|
+
}
|
|
108
|
+
} catch (error) {
|
|
109
|
+
console.error("Error fetching file content:", error);
|
|
110
|
+
this.errorMessage = error instanceof Error ? error.message : "Failed to connect to server";
|
|
111
|
+
} finally {
|
|
112
|
+
this.isLoading = false;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Handle content change in textarea
|
|
117
|
+
handleContentChange(event: Event) {
|
|
118
|
+
const target = event.target as HTMLTextAreaElement;
|
|
119
|
+
this.fileContent = target.value;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Handle cancel action
|
|
123
|
+
handleCancel() {
|
|
124
|
+
this.isPopoverOpen = false;
|
|
125
|
+
this.fileContent = "";
|
|
126
|
+
this.originalContent = "";
|
|
127
|
+
this.errorMessage = "";
|
|
128
|
+
this.isLoading = false;
|
|
129
|
+
this.isSaving = false;
|
|
130
|
+
|
|
131
|
+
// Dispatch cancel event
|
|
132
|
+
this.dispatchEvent(
|
|
133
|
+
new CustomEvent("editcancel", {
|
|
134
|
+
detail: { fileName: this.fileName }
|
|
135
|
+
})
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Handle save action
|
|
140
|
+
async handleSave() {
|
|
141
|
+
if (this.isSaving || this.isContentUnchanged || this.disabled) return;
|
|
142
|
+
|
|
143
|
+
this.isSaving = true;
|
|
144
|
+
this.errorMessage = "";
|
|
145
|
+
|
|
146
|
+
try {
|
|
147
|
+
const response = await fetch(EditFile.SAVE_ENDPOINT, {
|
|
148
|
+
method: "POST",
|
|
149
|
+
headers: {
|
|
150
|
+
"Content-Type": "application/json",
|
|
151
|
+
},
|
|
152
|
+
body: JSON.stringify({
|
|
153
|
+
fileName: this.fileName,
|
|
154
|
+
content: this.fileContent,
|
|
155
|
+
action: "save"
|
|
156
|
+
})
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
if (!response.ok) {
|
|
160
|
+
throw new Error(`Failed to save file: ${response.status}`);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const data: ApiResponse = await response.json();
|
|
164
|
+
|
|
165
|
+
if (data.success) {
|
|
166
|
+
this.originalContent = this.fileContent;
|
|
167
|
+
this.isPopoverOpen = false;
|
|
168
|
+
|
|
169
|
+
// Dispatch success event
|
|
170
|
+
this.dispatchEvent(
|
|
171
|
+
new CustomEvent("editsuccess", {
|
|
172
|
+
detail: {
|
|
173
|
+
fileName: this.fileName,
|
|
174
|
+
content: this.fileContent,
|
|
175
|
+
message: data.message || "File saved successfully"
|
|
176
|
+
}
|
|
177
|
+
})
|
|
178
|
+
);
|
|
179
|
+
} else {
|
|
180
|
+
this.errorMessage = data.error || data.message || "Failed to save file";
|
|
181
|
+
}
|
|
182
|
+
} catch (error) {
|
|
183
|
+
console.error("Error saving file:", error);
|
|
184
|
+
this.errorMessage = error instanceof Error ? error.message : "Failed to connect to server";
|
|
185
|
+
} finally {
|
|
186
|
+
this.isSaving = false;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Handle overlay click to close popover
|
|
191
|
+
handleOverlayClick(event: Event) {
|
|
192
|
+
if (event.target === event.currentTarget) {
|
|
193
|
+
this.handleCancel();
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Handle escape key to close popover
|
|
198
|
+
handleKeyDown(event: KeyboardEvent) {
|
|
199
|
+
if (event.key === "Escape" && this.isPopoverOpen) {
|
|
200
|
+
this.handleCancel();
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
connectedCallback() {
|
|
205
|
+
// Add escape key listener
|
|
206
|
+
document.addEventListener("keydown", this.handleKeyDown.bind(this));
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
disconnectedCallback() {
|
|
210
|
+
// Remove escape key listener
|
|
211
|
+
document.removeEventListener("keydown", this.handleKeyDown.bind(this));
|
|
212
|
+
}
|
|
213
|
+
}
|
|
@@ -2,11 +2,39 @@
|
|
|
2
2
|
|
|
3
3
|
dx-logo {
|
|
4
4
|
min-width: fit-content;
|
|
5
|
-
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.dev-center-link {
|
|
8
|
+
display: inline-block;
|
|
9
|
+
padding: var(--dx-g-spacing-smd) var(--dx-g-spacing-lg) 0
|
|
10
|
+
var(--dx-g-global-header-padding-horizontal);
|
|
11
|
+
height: var(--dx-g-spacing-xl);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.dev-center-content {
|
|
15
|
+
display: flex;
|
|
16
|
+
align-items: center;
|
|
17
|
+
text-decoration: none;
|
|
18
|
+
color: inherit;
|
|
19
|
+
font-weight: var(--dx-g-font-bold);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
dx-icon {
|
|
23
|
+
--dx-c-icon-size: var(--dx-g-icon-size-xs);
|
|
24
|
+
--dx-c-icon-color: var(--dx-g-blue-vibrant-20);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.dev-center-content > * + * {
|
|
28
|
+
margin-left: 8px; /* Adjust this value to your desired spacing */
|
|
6
29
|
}
|
|
7
30
|
|
|
8
31
|
.header_l2 {
|
|
9
32
|
justify-content: space-between;
|
|
33
|
+
height: var(--dx-g-doc-header-main-nav-height);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.has-brand .header_l2 {
|
|
37
|
+
height: var(--dx-g-spacing-3xl);
|
|
10
38
|
}
|
|
11
39
|
|
|
12
40
|
.nav_menu-button {
|
|
@@ -16,50 +44,44 @@ dx-logo {
|
|
|
16
44
|
);
|
|
17
45
|
}
|
|
18
46
|
|
|
47
|
+
.has-brand.has-scoped-nav-items {
|
|
48
|
+
border-bottom: 1px solid var(--dx-g-gray-90);
|
|
49
|
+
border-top: 1px solid var(--dx-g-gray-90);
|
|
50
|
+
}
|
|
51
|
+
|
|
19
52
|
.nav_menu-ctas {
|
|
20
53
|
margin-right: var(--dx-g-spacing-sm);
|
|
21
54
|
}
|
|
22
55
|
|
|
23
56
|
header:not(.has-brand) > .header_l1 {
|
|
24
|
-
background:
|
|
57
|
+
background: white;
|
|
58
|
+
border-bottom: 1px solid var(--dx-g-gray-90);
|
|
25
59
|
}
|
|
26
60
|
|
|
27
61
|
header:not(.has-brand) > .header_l2 {
|
|
28
|
-
|
|
62
|
+
border-bottom: 1px solid var(--dx-g-gray-90);
|
|
63
|
+
border-top: 1px solid var(--dx-g-gray-90);
|
|
29
64
|
}
|
|
30
65
|
|
|
31
66
|
.header_l2_group.header_l2_group-right-ctas {
|
|
32
67
|
align-items: baseline;
|
|
33
68
|
}
|
|
34
69
|
|
|
35
|
-
.
|
|
36
|
-
--dx-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
.header_lang-dropdown {
|
|
42
|
-
--button-primary-color: var(--dx-g-blue-vibrant-50);
|
|
43
|
-
--button-primary-color-hover: var(--dx-g-blue-vibrant-40);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
.header_lang-dropdown > dx-button {
|
|
47
|
-
--dx-c-button-primary-color: var(--button-primary-color);
|
|
48
|
-
--dx-c-button-primary-color-hover: var(--button-primary-color-hover);
|
|
49
|
-
--dx-c-slot-empty-width: min-content;
|
|
50
|
-
--border-color: var(--button-primary-color);
|
|
51
|
-
|
|
52
|
-
border-bottom: 1px dashed var(--border-color);
|
|
70
|
+
.has-brand .header_l2_group-title {
|
|
71
|
+
padding: var(--dx-g-spacing-sm) var(--dx-g-spacing-xl)
|
|
72
|
+
calc(var(--dx-g-spacing-smd) - 1px) 0;
|
|
73
|
+
min-width: 320px;
|
|
53
74
|
}
|
|
54
75
|
|
|
55
|
-
.
|
|
56
|
-
|
|
76
|
+
.no-header-content {
|
|
77
|
+
border-top: 1px solid var(--dx-g-gray-90);
|
|
57
78
|
}
|
|
58
79
|
|
|
59
|
-
@media (max-width:
|
|
80
|
+
@media (max-width: 768px) {
|
|
60
81
|
.header_l2 {
|
|
61
82
|
padding: 0;
|
|
62
83
|
flex-wrap: wrap;
|
|
84
|
+
height: 100%;
|
|
63
85
|
}
|
|
64
86
|
|
|
65
87
|
.has-nav-items .header_l2 {
|
|
@@ -70,34 +92,41 @@ header:not(.has-brand) > .header_l2 {
|
|
|
70
92
|
width: 100%;
|
|
71
93
|
}
|
|
72
94
|
|
|
95
|
+
.header_l2_group-title {
|
|
96
|
+
margin-right: 0;
|
|
97
|
+
padding: var(--dx-g-spacing-sm) 0 2px
|
|
98
|
+
var(--dx-g-global-header-padding-horizontal);
|
|
99
|
+
min-height: var(--dx-g-doc-header-main-nav-height);
|
|
100
|
+
}
|
|
101
|
+
|
|
73
102
|
.header_l2_group-nav {
|
|
74
103
|
height: var(--dx-g-spacing-3xl);
|
|
75
104
|
padding: 0;
|
|
76
|
-
|
|
105
|
+
margin-top: calc(var(--dx-g-spacing-2xs) + 1px);
|
|
77
106
|
}
|
|
78
107
|
|
|
79
108
|
.header_l2_group-nav_overflow {
|
|
109
|
+
height: var(--dx-g-spacing-3xl);
|
|
80
110
|
margin-right: var(--dx-g-spacing-sm);
|
|
81
111
|
}
|
|
82
112
|
|
|
83
|
-
.
|
|
84
|
-
|
|
85
|
-
|
|
113
|
+
.subtitle {
|
|
114
|
+
font-weight: var(--dx-g-font-demi);
|
|
115
|
+
letter-spacing: -0.08px;
|
|
86
116
|
}
|
|
87
117
|
|
|
88
|
-
.
|
|
89
|
-
margin-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
.header_lang-dropdown > dx-button {
|
|
93
|
-
padding: var(--dx-g-spacing-2xs) 0;
|
|
118
|
+
.has-brand .header_l2_group-title {
|
|
119
|
+
margin-right: 0;
|
|
120
|
+
padding: var(--dx-g-spacing-sm) 0 var(--dx-g-spacing-2xs)
|
|
121
|
+
var(--dx-g-global-header-padding-horizontal);
|
|
94
122
|
}
|
|
95
123
|
|
|
96
124
|
.has-scoped-nav-items > .header_l2 {
|
|
97
125
|
height: unset;
|
|
98
126
|
}
|
|
99
127
|
|
|
100
|
-
.has-
|
|
101
|
-
|
|
128
|
+
header:not(.has-brand) > .header_l2 {
|
|
129
|
+
padding-bottom: 0;
|
|
130
|
+
border: 0;
|
|
102
131
|
}
|
|
103
132
|
}
|
|
@@ -1,153 +1,55 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<
|
|
3
|
-
<
|
|
4
|
-
<
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
<div if
|
|
11
|
-
<
|
|
12
|
-
|
|
13
|
-
class="nav_menu-button"
|
|
14
|
-
icon-size="large"
|
|
15
|
-
icon-symbol={mobileMenuIconSymbol}
|
|
16
|
-
variant="tertiary"
|
|
17
|
-
onclick={toggleMobileNavMenu}
|
|
18
|
-
></dx-button>
|
|
19
|
-
</div>
|
|
20
|
-
<dx-logo label={title}></dx-logo>
|
|
21
|
-
<dx-header-nav
|
|
22
|
-
if:true={showDesktopNavItems}
|
|
23
|
-
aria-label="Global Navigation Bar"
|
|
24
|
-
nav-items={navItems}
|
|
25
|
-
onrequestopennavmenu={onRequestOpenNavMenu}
|
|
26
|
-
pathname={pathname}
|
|
27
|
-
variant="small"
|
|
28
|
-
></dx-header-nav>
|
|
29
|
-
<div class="header-cta-container">
|
|
30
|
-
<dx-header-search
|
|
31
|
-
if:true={hasSearch}
|
|
32
|
-
coveo-organization-id={coveoOrganizationId}
|
|
33
|
-
coveo-public-access-token={coveoPublicAccessToken}
|
|
34
|
-
coveo-search-pipeline={coveoSearchPipeline}
|
|
35
|
-
coveo-search-hub={coveoSearchHub}
|
|
36
|
-
mobile={tablet}
|
|
37
|
-
onstatechange={handleStateChange}
|
|
38
|
-
></dx-header-search>
|
|
39
|
-
</div>
|
|
40
|
-
<div if:true={showSignup} class="header-login-signup">
|
|
41
|
-
<dx-button
|
|
42
|
-
aria-label="Sign Up For Salesforce Developer Edition"
|
|
43
|
-
size="small"
|
|
44
|
-
href={signupLink}
|
|
45
|
-
onclick={handleSignUpClick}
|
|
46
|
-
>
|
|
47
|
-
Sign Up
|
|
48
|
-
</dx-button>
|
|
49
|
-
</div>
|
|
50
|
-
<dx-header-mobile-nav-menu
|
|
51
|
-
if:true={hasNavItems}
|
|
52
|
-
nav-items={navItems}
|
|
53
|
-
open={showMobileNavMenu}
|
|
54
|
-
pathname={pathname}
|
|
55
|
-
value={mobileNavMenuValue}
|
|
56
|
-
onchange={onMobileNavMenuChange}
|
|
57
|
-
onrequestclose={closeMobileNavMenu}
|
|
58
|
-
>
|
|
59
|
-
<dx-button
|
|
60
|
-
aria-label={bailLabel}
|
|
61
|
-
if:true={hasBailLink}
|
|
62
|
-
href={bailHref}
|
|
63
|
-
variant="tertiary"
|
|
64
|
-
icon-symbol="new_window"
|
|
65
|
-
>
|
|
66
|
-
{bailLabel}
|
|
67
|
-
</dx-button>
|
|
68
|
-
</dx-header-mobile-nav-menu>
|
|
69
|
-
</div>
|
|
70
|
-
<div class="header_l2">
|
|
71
|
-
<div class="header_l2_group header_l2_group-title">
|
|
72
|
-
<a href={headerHref} class="home-link">
|
|
2
|
+
<template lwc:if={shouldRender}>
|
|
3
|
+
<dx-brand-theme-provider brand={brand}>
|
|
4
|
+
<header class={className}>
|
|
5
|
+
<dx-banner
|
|
6
|
+
lwc:if={showBanner}
|
|
7
|
+
banner-markup={bannerMarkup}
|
|
8
|
+
></dx-banner>
|
|
9
|
+
<!-- To-Do: Move the devCenter as a new component and use it here, as devCenter is also used in Sidebar now -->
|
|
10
|
+
<div lwc:if={devCenter} class="dev-center-link">
|
|
11
|
+
<a href={devCenter.link} class="dev-center-content">
|
|
12
|
+
<dx-icon symbol="back"></dx-icon>
|
|
73
13
|
<dx-icon
|
|
74
14
|
class="brand-icon"
|
|
75
|
-
if
|
|
15
|
+
lwc:if={devCenter.icon}
|
|
76
16
|
sprite="salesforcebrand"
|
|
77
17
|
symbol={brand}
|
|
78
|
-
size="
|
|
18
|
+
size="large"
|
|
79
19
|
></dx-icon>
|
|
80
|
-
<span class="subtitle dx-text-
|
|
81
|
-
{
|
|
20
|
+
<span class="subtitle dx-text-body-4">
|
|
21
|
+
{devCenter.title}
|
|
82
22
|
</span>
|
|
83
23
|
</a>
|
|
84
|
-
<dx-dropdown
|
|
85
|
-
if:true={showMobileLanguages}
|
|
86
|
-
class="header_lang-dropdown"
|
|
87
|
-
options={languages}
|
|
88
|
-
small
|
|
89
|
-
value={language}
|
|
90
|
-
value-path={langValuePath}
|
|
91
|
-
onchange={onLangChange}
|
|
92
|
-
>
|
|
93
|
-
<dx-button
|
|
94
|
-
aria-label="Select Language"
|
|
95
|
-
variant="inline"
|
|
96
|
-
icon-size="large"
|
|
97
|
-
icon-symbol="world"
|
|
98
|
-
></dx-button>
|
|
99
|
-
</dx-dropdown>
|
|
100
24
|
</div>
|
|
101
|
-
<div
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
>
|
|
109
|
-
<dx-header-nav
|
|
110
|
-
aria-label="Scoped Navigation Bar"
|
|
111
|
-
nav-items={scopedNavItems}
|
|
112
|
-
pathname={pathname}
|
|
113
|
-
></dx-header-nav>
|
|
25
|
+
<div class="header_l2">
|
|
26
|
+
<div class="header_l2_group header_l2_group-title">
|
|
27
|
+
<a href={headerHref} class="home-link">
|
|
28
|
+
<span class="subtitle dx-text-display-7">
|
|
29
|
+
{subtitle}
|
|
30
|
+
</span>
|
|
31
|
+
</a>
|
|
114
32
|
</div>
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
class="header_l2_group header_l2_group-right-ctas"
|
|
119
|
-
>
|
|
120
|
-
<dx-dropdown
|
|
121
|
-
if:true={hasLanguages}
|
|
122
|
-
class="header_lang-dropdown"
|
|
123
|
-
options={languages}
|
|
124
|
-
small
|
|
125
|
-
value-path={langValuePath}
|
|
126
|
-
value={language}
|
|
127
|
-
onchange={onLangChange}
|
|
33
|
+
<div
|
|
34
|
+
lwc:if={showScopedNavItems}
|
|
35
|
+
class="header_l2_group header_l2_group-nav"
|
|
128
36
|
>
|
|
129
|
-
<
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
icon-size="small"
|
|
133
|
-
icon-symbol="world"
|
|
37
|
+
<div
|
|
38
|
+
class="header_l2_group-nav_overflow"
|
|
39
|
+
onscroll={onNavScroll}
|
|
134
40
|
>
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
href={bailHref}
|
|
143
|
-
variant="tertiary"
|
|
144
|
-
icon-symbol="new_window"
|
|
145
|
-
target="_blank"
|
|
146
|
-
>
|
|
147
|
-
{bailLabel}
|
|
148
|
-
</dx-button>
|
|
41
|
+
<dx-header-nav
|
|
42
|
+
aria-label="Scoped Navigation Bar"
|
|
43
|
+
nav-items={scopedNavItems}
|
|
44
|
+
pathname={pathname}
|
|
45
|
+
></dx-header-nav>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
149
48
|
</div>
|
|
150
|
-
</
|
|
151
|
-
</
|
|
152
|
-
</
|
|
49
|
+
</header>
|
|
50
|
+
</dx-brand-theme-provider>
|
|
51
|
+
</template>
|
|
52
|
+
<template lwc:if={shouldHideHeader}>
|
|
53
|
+
<div class="no-header-content"></div>
|
|
54
|
+
</template>
|
|
153
55
|
</template>
|