@salesforcedevs/dx-components 0.56.1 → 0.56.2-example
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 +18 -3
- package/package.json +18 -6
- package/src/assets/icons/salesforcebrand-sprite/svg/symbols.svg +492 -111
- package/src/assets/svg/big-moon.svg +1 -0
- package/src/assets/svg/blue-circle.svg +3 -0
- package/src/assets/svg/login-widget-bg.png +0 -0
- package/src/assets/svg/subscribe-background-left.svg +14 -0
- package/src/assets/svg/subscribe-background-right.svg +11 -0
- package/src/assets/svg/trial-left.svg +6 -0
- package/src/assets/svg/trial-right.svg +26 -0
- package/src/modules/dx/banner/banner (1).ts +12 -0
- package/src/modules/dx/banner/banner.ts +3 -5
- package/src/modules/dx/button/button.css +10 -9
- package/src/modules/dx/buttonToggle/buttonToggle.css +50 -0
- package/src/modules/dx/buttonToggle/buttonToggle.html +17 -0
- package/src/modules/dx/buttonToggle/buttonToggle.ts +75 -0
- package/src/modules/dx/cardCallout/cardCallout.ts +8 -4
- package/src/modules/dx/cardContent/cardContent.html +4 -1
- package/src/modules/dx/cardDocs/cardDocs.html +4 -1
- package/src/modules/dx/cardEvent/cardEvent.html +1 -2
- package/src/modules/dx/cardEvent/cardEvent.ts +1 -1
- package/src/modules/dx/cardExpanded/cardExpanded.html +1 -6
- package/src/modules/dx/cardExpanded/cardExpanded.ts +2 -2
- package/src/modules/dx/cardMinimal/cardMinimal.html +1 -6
- package/src/modules/dx/cardTrial/cardTrial.css +63 -4
- package/src/modules/dx/cardTrial/cardTrial.html +96 -12
- package/src/modules/dx/cardTrial/cardTrial.ts +70 -2
- package/src/modules/dx/cardTrialExpanded/cardTrialExpanded.css +149 -0
- package/src/modules/dx/cardTrialExpanded/cardTrialExpanded.html +85 -0
- package/src/modules/dx/cardTrialExpanded/cardTrialExpanded.ts +67 -0
- package/src/modules/dx/checkbox/checkbox.css +4 -0
- package/src/modules/dx/codeBlock/codeBlock.ts +5 -1
- package/src/modules/dx/dropdown/dropdown.html +5 -1
- package/src/modules/dx/dropdown/dropdown.ts +13 -3
- package/src/modules/dx/dropdownOption/dropdownOption.css +119 -1
- package/src/modules/dx/dropdownOption/dropdownOption.html +4 -0
- package/src/modules/dx/dropdownOption/dropdownOption.ts +20 -7
- package/src/modules/dx/feature/feature.ts +3 -3
- package/src/modules/dx/featuredContentHeader/featuredContentHeader.css +84 -18
- package/src/modules/dx/featuredContentHeader/featuredContentHeader.html +109 -99
- package/src/modules/dx/featuredContentHeader/featuredContentHeader.ts +27 -7
- package/src/modules/dx/featuresList/featuresList.css +1 -1
- package/src/modules/dx/filterMenu/filterMenu.css +26 -8
- package/src/modules/dx/filterMenu/filterMenu.html +24 -8
- package/src/modules/dx/filterMenu/filterMenu.ts +1 -0
- package/src/modules/dx/footer/footer.css +1 -1
- package/src/modules/dx/footer/footer.html +25 -20
- package/src/modules/dx/footer/footer.ts +19 -15
- package/src/modules/dx/footer/links.ts +115 -39
- package/src/modules/dx/formattedDateTime/formattedDateTime.ts +8 -3
- package/src/modules/dx/header/header.html +10 -3
- package/src/modules/dx/header/header.ts +4 -0
- package/src/modules/dx/headerMobileNavMenu/headerMobileNavMenu.css +1 -0
- package/src/modules/dx/headerSearch/headerSearch.html +0 -1
- package/src/modules/dx/hr/hr.css +2 -4
- package/src/modules/dx/iconBadge/iconBadge.css +12 -0
- package/src/modules/dx/iconBadge/iconBadge.html +2 -7
- package/src/modules/dx/iconBadge/iconBadge.ts +15 -5
- package/src/modules/dx/imageAndLabel/imageAndLabel.css +0 -1
- package/src/modules/dx/input/input.css +17 -1
- package/src/modules/dx/input/input.html +5 -1
- package/src/modules/dx/input/input.ts +8 -0
- package/src/modules/dx/interactiveImage/interactiveImage.css +59 -0
- package/src/modules/dx/interactiveImage/interactiveImage.html +32 -0
- package/src/modules/dx/interactiveImage/interactiveImage.ts +71 -0
- package/src/modules/dx/logo/logo.css +0 -1
- package/src/modules/dx/logo/logo.ts +1 -1
- package/src/modules/dx/metadataBadge/metadataBadge.css +41 -0
- package/src/modules/dx/metadataBadge/metadataBadge.html +5 -0
- package/src/modules/dx/metadataBadge/metadataBadge.ts +24 -0
- package/src/modules/dx/modal/modal.css +40 -0
- package/src/modules/dx/modal/modal.html +10 -0
- package/src/modules/dx/modal/modal.ts +50 -0
- package/src/modules/dx/modalDrawer/modalDrawer.html +2 -2
- package/src/modules/dx/modalDrawer/modalDrawer.ts +7 -1
- package/src/modules/dx/pagination/pagination.css +1 -2
- package/src/modules/dx/popover/popover.css +28 -3
- package/src/modules/dx/popover/popover.html +1 -0
- package/src/modules/dx/popover/popover.ts +83 -44
- package/src/modules/dx/searchResults/coveo.css +18989 -0
- package/src/modules/dx/searchResults/searchResults.css +387 -0
- package/src/modules/dx/searchResults/searchResults.html +104 -0
- package/src/modules/dx/searchResults/searchResults.ts +187 -0
- package/src/modules/dx/section/section.css +10 -1
- package/src/modules/dx/section/section.ts +1 -1
- package/src/modules/dx/select/select.css +7 -3
- package/src/modules/dx/sidebar/sidebar.css +1 -145
- package/src/modules/dx/sidebar/sidebar.ts +2 -0
- package/src/modules/dx/sidebarOld/sidebarOld.css +1 -145
- package/src/modules/dx/sidebarOld/sidebarOld.ts +2 -0
- package/src/modules/dx/sidebarSearch/sidebarSearch.ts +23 -3
- package/src/modules/dx/sidebarSearchResult/sidebarSearchResult.css +1 -1
- package/src/modules/dx/tab/tab.css +0 -4
- package/src/modules/dx/tabPanel/tabPanel.css +20 -0
- package/src/modules/dx/tabPanel/tabPanel.html +13 -0
- package/src/modules/dx/tabPanel/tabPanel.ts +27 -0
- package/src/modules/dx/tabPanelItem/tabPanelItem.css +39 -0
- package/src/modules/dx/tabPanelItem/tabPanelItem.html +15 -0
- package/src/modules/dx/tabPanelItem/tabPanelItem.ts +39 -0
- package/src/modules/dx/tabPanelList/tabPanelList.css +35 -0
- package/src/modules/dx/tabPanelList/tabPanelList.html +47 -0
- package/src/modules/dx/tabPanelList/tabPanelList.ts +164 -0
- package/src/modules/dx/tabPanelList/uniqueId.ts +6 -0
- package/src/modules/dx/tbidAvatarButton/tbidAvatarButton.css +33 -0
- package/src/modules/dx/tbidAvatarButton/tbidAvatarButton.html +53 -0
- package/src/modules/dx/tbidAvatarButton/tbidAvatarButton.ts +440 -0
- package/src/modules/dx/toc/toc.css +1 -0
- package/src/modules/dx/toc/toc.ts +13 -0
- package/src/modules/dx/treeItem/treeItem.html +2 -0
- package/src/modules/dx/treeItem/treeItem.ts +8 -6
- package/src/modules/dx/treeTile/treeTile.css +18 -18
- package/src/modules/dx/treeTile/treeTile.html +5 -4
- package/src/modules/dx/treeTile/treeTile.ts +17 -3
- package/src/modules/dx/typeBadge/typeBadge.css +15 -56
- package/src/modules/dx/typeBadge/typeBadge.html +6 -0
- package/src/modules/dx/typeBadge/typeBadge.ts +149 -46
- package/src/modules/dxBaseElements/archiveCard/archiveCard.ts +2 -6
- package/src/modules/dxBaseElements/headerBase/headerBase.ts +11 -1
- package/src/modules/dxConstants/brands/brands.ts +14 -0
- package/src/modules/dxConstants/colors/colors.ts +14 -0
- package/src/modules/dxConstants/contentTypes/contentTypes.ts +10 -0
- package/src/modules/dxHelpers/card/card.css +1 -1
- package/src/modules/dxHelpers/commonHeader/commonHeader.css +4 -3
- package/src/modules/dxHelpers/commonSidebar/commonSidebar.css +145 -0
- package/src/modules/dxHelpers/{sidebar/sidebar.css → commonTreeItem/commonTreeItem.css} +0 -0
- package/src/modules/dxUtils/async/async.ts +45 -0
- package/src/modules/dxUtils/constants/constants.ts +0 -13
- package/src/modules/dxUtils/css/css.ts +10 -0
- package/src/modules/dxUtils/lwc/lwc.ts +9 -0
- package/src/modules/dxUtils/prismjs/prismjs.ts +347 -9
- package/src/modules/dxUtils/queryCoordinator/queryCoordinator.ts +37 -11
- package/LICENSE +0 -12
- package/src/modules/dx/typeBadgeGroup/typeBadgeGroup.css +0 -12
- package/src/modules/dx/typeBadgeGroup/typeBadgeGroup.html +0 -11
- package/src/modules/dx/typeBadgeGroup/typeBadgeGroup.ts +0 -18
package/src/modules/dx/hr/hr.css
CHANGED
|
@@ -13,7 +13,7 @@ h2 {
|
|
|
13
13
|
font-family: var(--dx-g-font-display);
|
|
14
14
|
font-size: var(--dx-g-text-sm);
|
|
15
15
|
color: var(--dx-g-blue-vibrant-20);
|
|
16
|
-
text-transform:
|
|
16
|
+
text-transform: capitalize;
|
|
17
17
|
letter-spacing: 0;
|
|
18
18
|
line-height: 18px;
|
|
19
19
|
}
|
|
@@ -22,7 +22,6 @@ p::before,
|
|
|
22
22
|
h2::before,
|
|
23
23
|
p::after,
|
|
24
24
|
h2::after {
|
|
25
|
-
transform: translateY(-2px); /* offset for display font ghost padding */
|
|
26
25
|
content: "";
|
|
27
26
|
flex: 1 1;
|
|
28
27
|
border-bottom: 2px solid var(--dx-g-gray-95);
|
|
@@ -42,7 +41,7 @@ h2::after {
|
|
|
42
41
|
dx-button {
|
|
43
42
|
display: flex;
|
|
44
43
|
width: 100%;
|
|
45
|
-
text-transform:
|
|
44
|
+
text-transform: capitalize;
|
|
46
45
|
padding: 0 var(--dx-c-hr-padding-horizontal);
|
|
47
46
|
}
|
|
48
47
|
|
|
@@ -50,7 +49,6 @@ dx-button::before {
|
|
|
50
49
|
content: "";
|
|
51
50
|
border-bottom: 2px solid var(--dx-g-gray-95);
|
|
52
51
|
flex: 1 1;
|
|
53
|
-
transform: translateY(-2px); /* offset for display font ghost padding */
|
|
54
52
|
margin: auto;
|
|
55
53
|
margin-right: var(--dx-g-spacing-md);
|
|
56
54
|
}
|
|
@@ -38,3 +38,15 @@ dx-icon {
|
|
|
38
38
|
.shape-square {
|
|
39
39
|
border-radius: var(--dx-g-spacing-sm);
|
|
40
40
|
}
|
|
41
|
+
|
|
42
|
+
.background-small {
|
|
43
|
+
--dx-c-icon-badge-size: var(--dx-g-spacing-lg);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.background-medium {
|
|
47
|
+
--dx-c-icon-badge-size: var(--dx-g-spacing-xl);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.background-large {
|
|
51
|
+
--dx-c-icon-badge-size: var(--dx-g-spacing-3xl);
|
|
52
|
+
}
|
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div class={className} style={style}>
|
|
3
|
-
<dx-icon
|
|
4
|
-
color={color}
|
|
5
|
-
symbol={symbol}
|
|
6
|
-
sprite={sprite}
|
|
7
|
-
size="override"
|
|
8
|
-
></dx-icon>
|
|
2
|
+
<div class={className} style={style} part="badge">
|
|
3
|
+
<dx-icon symbol={symbol} sprite={sprite} size={iconSize}></dx-icon>
|
|
9
4
|
</div>
|
|
10
5
|
</template>
|
|
@@ -10,6 +10,8 @@ export default class IconBadge extends LightningElement {
|
|
|
10
10
|
@api symbol!: IconSymbol;
|
|
11
11
|
@api color?: string | null = null;
|
|
12
12
|
@api backgroundColor?: string;
|
|
13
|
+
@api backgroundSize?: string;
|
|
14
|
+
@api iconSize?: string = "override";
|
|
13
15
|
|
|
14
16
|
_shape: IconBadgeShape = "circle";
|
|
15
17
|
@api
|
|
@@ -30,13 +32,21 @@ export default class IconBadge extends LightningElement {
|
|
|
30
32
|
}
|
|
31
33
|
|
|
32
34
|
get className() {
|
|
33
|
-
return cx(
|
|
35
|
+
return cx(
|
|
36
|
+
"icon-badge",
|
|
37
|
+
`shape-${this.shape}`,
|
|
38
|
+
this.backgroundSize && `background-${this.backgroundSize}`
|
|
39
|
+
);
|
|
34
40
|
}
|
|
35
41
|
|
|
36
42
|
get style() {
|
|
37
|
-
|
|
38
|
-
this.
|
|
39
|
-
|
|
40
|
-
|
|
43
|
+
const color = this.color
|
|
44
|
+
? `--dx-c-icon-badge-color: ${toDxColor(this.color)};`
|
|
45
|
+
: "";
|
|
46
|
+
const backgroundColor = this.backgroundColor
|
|
47
|
+
? `background-color: ${toDxColor(this.backgroundColor)};`
|
|
48
|
+
: "";
|
|
49
|
+
|
|
50
|
+
return `${color}${backgroundColor}`;
|
|
41
51
|
}
|
|
42
52
|
}
|
|
@@ -133,6 +133,22 @@ input::placeholder {
|
|
|
133
133
|
text-transform: uppercase;
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
+
.description {
|
|
137
|
+
margin-top: var(--dx-g-spacing-xs);
|
|
138
|
+
font-family: var(--dx-g-font-sans);
|
|
139
|
+
font-size: var(--dx-g-text-xs);
|
|
140
|
+
line-height: 18px;
|
|
141
|
+
color: var(--dx-g-gray-50);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.description.hide {
|
|
145
|
+
display: none;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.description a {
|
|
149
|
+
color: var(--dx-g-blue-vibrant-50);
|
|
150
|
+
}
|
|
151
|
+
|
|
136
152
|
.shortcut > img {
|
|
137
153
|
margin-right: var(--dx-g-spacing-2xs);
|
|
138
154
|
}
|
|
@@ -148,7 +164,7 @@ input::placeholder {
|
|
|
148
164
|
}
|
|
149
165
|
|
|
150
166
|
.error-message-box {
|
|
151
|
-
margin-top: var(--dx-g-spacing-
|
|
167
|
+
margin-top: var(--dx-g-spacing-xs);
|
|
152
168
|
display: block;
|
|
153
169
|
}
|
|
154
170
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<label if:true={label} for="input">
|
|
2
|
+
<label if:true={label} id="label" for="input" tabindex="-1">
|
|
3
3
|
{label}
|
|
4
4
|
<abbr if:true={required}>*</abbr>
|
|
5
5
|
</label>
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
placeholder={placeholder}
|
|
25
25
|
type={type}
|
|
26
26
|
value={value}
|
|
27
|
+
aria-labelledby="label description"
|
|
27
28
|
/>
|
|
28
29
|
<button
|
|
29
30
|
class="clear-button"
|
|
@@ -48,6 +49,9 @@
|
|
|
48
49
|
{submitLabel}
|
|
49
50
|
</dx-button>
|
|
50
51
|
</div>
|
|
52
|
+
<div id="description" class={descriptionClassName} tabindex="-1">
|
|
53
|
+
{description}
|
|
54
|
+
</div>
|
|
51
55
|
<div
|
|
52
56
|
if:true={errorMessage}
|
|
53
57
|
aria-live="assertive"
|
|
@@ -2,6 +2,7 @@ import { LightningElement, api } from "lwc";
|
|
|
2
2
|
import cx from "classnames";
|
|
3
3
|
import { IconSize, IconSymbol } from "typings/custom";
|
|
4
4
|
import { isMac } from "dxUtils/devices";
|
|
5
|
+
import { setContainerInnerHtml } from "dxUtils/lwc";
|
|
5
6
|
import { isValidEmail } from "./validators";
|
|
6
7
|
|
|
7
8
|
type ValidatorMap = {
|
|
@@ -25,6 +26,7 @@ export default class Input extends LightningElement {
|
|
|
25
26
|
@api iconSize: IconSize = "medium";
|
|
26
27
|
@api iconSymbol: IconSymbol | null = null;
|
|
27
28
|
@api label?: string;
|
|
29
|
+
@api descriptionMarkup?: string;
|
|
28
30
|
@api loading: boolean = false;
|
|
29
31
|
@api missingErrorMessage: string = "Complete this field";
|
|
30
32
|
@api formatErrorMessage?: string;
|
|
@@ -118,6 +120,10 @@ export default class Input extends LightningElement {
|
|
|
118
120
|
return cx("input-group", `size-${this.size}`);
|
|
119
121
|
}
|
|
120
122
|
|
|
123
|
+
private get descriptionClassName() {
|
|
124
|
+
return cx("description", !this.descriptionMarkup && "hide");
|
|
125
|
+
}
|
|
126
|
+
|
|
121
127
|
private get inputContainerClassName() {
|
|
122
128
|
return cx(
|
|
123
129
|
"input-container",
|
|
@@ -160,6 +166,8 @@ export default class Input extends LightningElement {
|
|
|
160
166
|
if (!this.input) {
|
|
161
167
|
this.input = <HTMLInputElement>this.template.querySelector("input");
|
|
162
168
|
}
|
|
169
|
+
const container = this.template.querySelector(".description");
|
|
170
|
+
setContainerInnerHtml(container, this.descriptionMarkup);
|
|
163
171
|
}
|
|
164
172
|
|
|
165
173
|
onClick() {
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
@import "dxHelpers/reset";
|
|
2
|
+
@import "dxHelpers/text";
|
|
3
|
+
|
|
4
|
+
article {
|
|
5
|
+
border: 1px solid var(--dx-g-gray-90);
|
|
6
|
+
border-radius: 0.3125rem;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
header {
|
|
10
|
+
display: flex;
|
|
11
|
+
align-items: flex-start;
|
|
12
|
+
justify-content: space-between;
|
|
13
|
+
border-radius: 0.3125rem 0.3125rem 0 0;
|
|
14
|
+
background-color: var(--dx-g-gray-95);
|
|
15
|
+
font-family: var(--dx-g-font-sans);
|
|
16
|
+
color: var(--dx-g-gray-10);
|
|
17
|
+
padding: var(--dx-g-spacing-sm);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
header span {
|
|
21
|
+
padding: var(--dx-g-spacing-sm) var(--dx-g-spacing-md);
|
|
22
|
+
font-size: var(--dx-g-text-sm);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
footer {
|
|
26
|
+
border-radius: 0 0 0.3125rem 0.3125rem;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.body {
|
|
30
|
+
margin: var(--dx-g-spacing-md);
|
|
31
|
+
overflow-x: auto;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.body img {
|
|
35
|
+
min-width: 650px;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.controls {
|
|
39
|
+
display: flex;
|
|
40
|
+
align-items: center;
|
|
41
|
+
justify-content: flex-end;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* Breakpoints for mobile */
|
|
45
|
+
|
|
46
|
+
@media screen and (max-width: 640px) {
|
|
47
|
+
header {
|
|
48
|
+
flex-direction: column;
|
|
49
|
+
align-items: flex-end;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
@media screen and (max-width: 320px) {
|
|
54
|
+
.controls,
|
|
55
|
+
.controls dx-dropdown,
|
|
56
|
+
.controls dx-button {
|
|
57
|
+
width: 100%;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<article>
|
|
3
|
+
<header>
|
|
4
|
+
<span>{title}</span>
|
|
5
|
+
<div class="controls">
|
|
6
|
+
<template if:true={isSingleDownload}>
|
|
7
|
+
<dx-button
|
|
8
|
+
icon-symbol="download"
|
|
9
|
+
href={singleDownloadHref}
|
|
10
|
+
download={singleDownloadFilename}
|
|
11
|
+
>
|
|
12
|
+
{downloadButtonLabel}
|
|
13
|
+
</dx-button>
|
|
14
|
+
</template>
|
|
15
|
+
<template if:false={isSingleDownload}>
|
|
16
|
+
<dx-dropdown
|
|
17
|
+
options={urls}
|
|
18
|
+
onchange={handleDownloadOptionChange}
|
|
19
|
+
placement="bottom-end"
|
|
20
|
+
>
|
|
21
|
+
<dx-button variant="primary" icon-symbol="chevrondown">
|
|
22
|
+
{downloadButtonLabel}
|
|
23
|
+
</dx-button>
|
|
24
|
+
</dx-dropdown>
|
|
25
|
+
</template>
|
|
26
|
+
</div>
|
|
27
|
+
</header>
|
|
28
|
+
<div class="body">
|
|
29
|
+
<img src={featuredSrc} alt={title} />
|
|
30
|
+
</div>
|
|
31
|
+
</article>
|
|
32
|
+
</template>
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { LightningElement, api } from "lwc";
|
|
2
|
+
|
|
3
|
+
// Extracts filename and extension from a file URL
|
|
4
|
+
const FILENAME_FROM_URL_REGEX = /(?=\w+\.\w{3,4}$).+/;
|
|
5
|
+
const EXTENSION_FROM_URL_REGEX = /\.([^.]*)$/;
|
|
6
|
+
|
|
7
|
+
export default class InteractiveImage extends LightningElement {
|
|
8
|
+
@api title!: string;
|
|
9
|
+
@api featuredSrc!: string;
|
|
10
|
+
|
|
11
|
+
@api
|
|
12
|
+
set downloadUrls(values: any) {
|
|
13
|
+
// Normalize input values
|
|
14
|
+
let urls;
|
|
15
|
+
if (typeof values === "string") {
|
|
16
|
+
if (values.startsWith("[")) {
|
|
17
|
+
urls = JSON.parse(values);
|
|
18
|
+
} else {
|
|
19
|
+
urls = [values];
|
|
20
|
+
}
|
|
21
|
+
} else {
|
|
22
|
+
urls = values;
|
|
23
|
+
}
|
|
24
|
+
// Ensure that we have some URLs
|
|
25
|
+
if (!urls || urls.length === 0) {
|
|
26
|
+
throw new Error(
|
|
27
|
+
`No download url found for interactive image with title "${this.title}"`
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
// Prepare download options with labels
|
|
31
|
+
this.urls = urls.map((url: string) => {
|
|
32
|
+
return {
|
|
33
|
+
label: this.getDownloadLabelFromUrl(url),
|
|
34
|
+
id: url
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
get downloadUrls() {
|
|
39
|
+
return this.urls;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
private urls: { label: string; id: string }[] = [];
|
|
43
|
+
|
|
44
|
+
private get isSingleDownload() {
|
|
45
|
+
return this.urls.length === 1;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
private get singleDownloadHref() {
|
|
49
|
+
return this.urls[0].id;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
private get singleDownloadFilename() {
|
|
53
|
+
const pathParts = this.urls[0].id.match(FILENAME_FROM_URL_REGEX);
|
|
54
|
+
return pathParts ? pathParts[0] : "";
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
private get downloadButtonLabel() {
|
|
58
|
+
return this.isSingleDownload ? this.urls[0].label : "Download as...";
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
private handleDownloadOptionChange(event: CustomEvent) {
|
|
62
|
+
window.open(event.detail, "_blank");
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
private getDownloadLabelFromUrl(url: string): string {
|
|
66
|
+
const urlParts = url.match(EXTENSION_FROM_URL_REGEX);
|
|
67
|
+
return urlParts
|
|
68
|
+
? `Download as ${urlParts[1].toUpperCase()}`
|
|
69
|
+
: "Download";
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -3,6 +3,6 @@ import { LightningElement, api } from "lwc";
|
|
|
3
3
|
export default class Logo extends LightningElement {
|
|
4
4
|
@api href: string = "/";
|
|
5
5
|
@api imgSrc: string = "/assets/svg/salesforce-cloud.svg";
|
|
6
|
-
@api imgAlt: string = "Salesforce
|
|
6
|
+
@api imgAlt: string = "Salesforce logo";
|
|
7
7
|
@api label!: string;
|
|
8
8
|
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
@import "dxHelpers/reset";
|
|
2
|
+
|
|
3
|
+
.badge {
|
|
4
|
+
--background: var(--dx-g-cloud-blue-natural-90);
|
|
5
|
+
--border-radius: var(--dx-g-spacing-xs);
|
|
6
|
+
--color: var(--dx-g-blue-vibrant-20);
|
|
7
|
+
--height: var(--dx-g-spacing-lg);
|
|
8
|
+
--horizontal-spacing: var(--dx-g-spacing-sm);
|
|
9
|
+
|
|
10
|
+
color: var(--dx-c-metadata-badge-color, var(--color));
|
|
11
|
+
background: var(--dx-c-metadata-badge-background, var(--background));
|
|
12
|
+
display: flex;
|
|
13
|
+
align-items: center;
|
|
14
|
+
justify-content: center;
|
|
15
|
+
height: var(--height);
|
|
16
|
+
width: min-content;
|
|
17
|
+
padding: 0 var(--horizontal-spacing);
|
|
18
|
+
border-radius: var(--border-radius);
|
|
19
|
+
font-family: var(--dx-g-font-display);
|
|
20
|
+
font-size: 10px;
|
|
21
|
+
text-align: center;
|
|
22
|
+
letter-spacing: 0.6px;
|
|
23
|
+
text-transform: uppercase;
|
|
24
|
+
white-space: nowrap;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.badge.size-small {
|
|
28
|
+
--height: var(--dx-g-spacing-md);
|
|
29
|
+
--horizontal-spacing: var(--dx-g-spacing-xs);
|
|
30
|
+
|
|
31
|
+
font-size: 8px;
|
|
32
|
+
letter-spacing: 0.5px;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@media screen and (max-width: 768px) {
|
|
36
|
+
.badge:not(.size-small) {
|
|
37
|
+
height: var(--dx-g-spacing-lg);
|
|
38
|
+
padding: 0 var(--dx-g-spacing-sm);
|
|
39
|
+
font-size: var(--dx-g-text-2xs);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { LightningElement, api } from "lwc";
|
|
2
|
+
import cx from "classnames";
|
|
3
|
+
import { Color, TypeBadgeSize } from "typings/custom";
|
|
4
|
+
import { colorToDxColors, buildStyleColorVariables } from "dxUtils/css";
|
|
5
|
+
|
|
6
|
+
export default class MetadataBadge extends LightningElement {
|
|
7
|
+
@api size: TypeBadgeSize = "default";
|
|
8
|
+
@api color?: Color;
|
|
9
|
+
@api value!: string;
|
|
10
|
+
|
|
11
|
+
private get className(): string {
|
|
12
|
+
return cx("badge", `size-${this.size}`);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
private get style(): string {
|
|
16
|
+
if (this.color) {
|
|
17
|
+
const variables = colorToDxColors(this.color as Color);
|
|
18
|
+
if (variables) {
|
|
19
|
+
return buildStyleColorVariables(variables);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return "";
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
:host {
|
|
2
|
+
--dx-c-modal-drawer-z-index: 5000;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
.modal-drawer_container {
|
|
6
|
+
display: none;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.modal-drawer_container.modal-drawer_active {
|
|
10
|
+
position: fixed;
|
|
11
|
+
top: 50%;
|
|
12
|
+
left: 50%;
|
|
13
|
+
transform: translate(-50%, -50%);
|
|
14
|
+
display: grid;
|
|
15
|
+
justify-content: center;
|
|
16
|
+
align-items: center;
|
|
17
|
+
z-index: var(--dx-c-modal-drawer-z-index);
|
|
18
|
+
height: 100%;
|
|
19
|
+
width: 100%;
|
|
20
|
+
pointer-events: none;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.modal-drawer_overlay {
|
|
24
|
+
background-color: #195594;
|
|
25
|
+
bottom: 0;
|
|
26
|
+
height: 100%;
|
|
27
|
+
left: 0;
|
|
28
|
+
opacity: 0.62;
|
|
29
|
+
position: fixed;
|
|
30
|
+
right: 0;
|
|
31
|
+
top: 0;
|
|
32
|
+
width: 100%;
|
|
33
|
+
z-index: calc(var(--dx-c-modal-drawer-z-index) - 1);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
@media screen and (max-width: 768px) {
|
|
37
|
+
.modal-drawer_container.modal-drawer_active {
|
|
38
|
+
pointer-events: all;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import cx from "classnames";
|
|
2
|
+
import { LightningElement, api } from "lwc";
|
|
3
|
+
import { normalizeBoolean } from "dxUtils/normalizers";
|
|
4
|
+
|
|
5
|
+
export default class Modal extends LightningElement {
|
|
6
|
+
private _open = false;
|
|
7
|
+
|
|
8
|
+
@api get open() {
|
|
9
|
+
return this._open;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
set open(value) {
|
|
13
|
+
this._open = normalizeBoolean(value);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
get containerClass(): string {
|
|
17
|
+
return cx(
|
|
18
|
+
"modal-drawer_container",
|
|
19
|
+
this._open && "modal-drawer_active"
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
renderedCallback(): void {
|
|
24
|
+
if (this._open) {
|
|
25
|
+
this.focusFirstElement();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
connectedCallback(): void {
|
|
30
|
+
this.template.addEventListener(
|
|
31
|
+
"keydown",
|
|
32
|
+
this.handleKeyDown.bind(this)
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
focusFirstElement(): void {
|
|
37
|
+
this.template.querySelector("div")!.focus();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
handleKeyDown(event: KeyboardEvent): void {
|
|
41
|
+
if (event.key === "Escape") {
|
|
42
|
+
this.handleToggleModal();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
handleToggleModal() {
|
|
47
|
+
this._open = !this._open;
|
|
48
|
+
this.dispatchEvent(new CustomEvent("togglemodal"));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div class={containerClass}>
|
|
3
3
|
<slot></slot>
|
|
4
|
-
<dx-button onclick={
|
|
4
|
+
<dx-button onclick={handleToggleModal}>Done</dx-button>
|
|
5
5
|
</div>
|
|
6
6
|
<div
|
|
7
7
|
if:true={open}
|
|
8
8
|
class="modal-drawer_overlay"
|
|
9
|
-
onclick={
|
|
9
|
+
onclick={handleToggleModal}
|
|
10
10
|
></div>
|
|
11
11
|
</template>
|
|
@@ -20,7 +20,13 @@ export default class ModalDrawer extends LightningElement {
|
|
|
20
20
|
);
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
handleKeyDown(event: KeyboardEvent): void {
|
|
24
|
+
if (event.key === "Escape") {
|
|
25
|
+
this.handleToggleModal();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
handleToggleModal() {
|
|
24
30
|
this._open = !this._open;
|
|
25
31
|
this.dispatchEvent(new CustomEvent("clickclose"));
|
|
26
32
|
}
|
|
@@ -27,8 +27,7 @@
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
.dx-pagination-pages button {
|
|
30
|
-
padding: var(--dx-g-spacing-
|
|
31
|
-
var(--dx-g-spacing-2xs) var(--dx-g-spacing-md);
|
|
30
|
+
padding: var(--dx-g-spacing-xs) var(--dx-g-spacing-md);
|
|
32
31
|
border-radius: var(--dx-g-spacing-lg);
|
|
33
32
|
font-family: var(--dx-g-font-display);
|
|
34
33
|
font-size: var(--dx-g-text-sm);
|
|
@@ -6,11 +6,14 @@
|
|
|
6
6
|
var(--dx-g-spacing-sm)
|
|
7
7
|
);
|
|
8
8
|
--popover-border: var(--dx-c-popover-border, 1px solid var(--dx-g-gray-90));
|
|
9
|
+
--popover-padding: var(--dx-g-spacing-sm);
|
|
9
10
|
}
|
|
10
11
|
|
|
11
12
|
.popover-container {
|
|
12
|
-
position:
|
|
13
|
-
|
|
13
|
+
position: absolute;
|
|
14
|
+
top: 0;
|
|
15
|
+
left: 0;
|
|
16
|
+
z-index: var(--dx-c-popover-z-index, var(--dx-g-z-index-max));
|
|
14
17
|
visibility: hidden;
|
|
15
18
|
pointer-events: none;
|
|
16
19
|
}
|
|
@@ -23,7 +26,7 @@
|
|
|
23
26
|
width: 168px;
|
|
24
27
|
max-width: calc(100vw - var(--dx-g-spacing-lg));
|
|
25
28
|
max-height: 65vh;
|
|
26
|
-
padding: var(--
|
|
29
|
+
padding: var(--popover-padding);
|
|
27
30
|
overflow-y: auto;
|
|
28
31
|
transition: opacity 0.2s linear, transform 0.2s linear;
|
|
29
32
|
transition-delay: 0.02s;
|
|
@@ -61,3 +64,25 @@
|
|
|
61
64
|
.popover-small {
|
|
62
65
|
width: 136px;
|
|
63
66
|
}
|
|
67
|
+
|
|
68
|
+
.popover-arrow {
|
|
69
|
+
position: absolute;
|
|
70
|
+
|
|
71
|
+
/* Weird spacing here to satisfy our linter */
|
|
72
|
+
background: linear-gradient(
|
|
73
|
+
315deg,
|
|
74
|
+
transparent 4px,
|
|
75
|
+
white 4px
|
|
76
|
+
); /* make only top half of rotated square visible */
|
|
77
|
+
|
|
78
|
+
width: 8px;
|
|
79
|
+
height: 8px;
|
|
80
|
+
transform: rotate(45deg);
|
|
81
|
+
border: var(--popover-border);
|
|
82
|
+
border-bottom: transparent;
|
|
83
|
+
border-right: transparent;
|
|
84
|
+
box-shadow: var(--dx-g-box-shadow-lg);
|
|
85
|
+
transition: opacity 0.2s linear, transform 0.2s linear;
|
|
86
|
+
transition-delay: 0.02s;
|
|
87
|
+
z-index: var(--dx-c-popover-z-index, var(--dx-g-z-index-max));
|
|
88
|
+
}
|