@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.
Files changed (135) hide show
  1. package/lwc.config.json +18 -3
  2. package/package.json +18 -6
  3. package/src/assets/icons/salesforcebrand-sprite/svg/symbols.svg +492 -111
  4. package/src/assets/svg/big-moon.svg +1 -0
  5. package/src/assets/svg/blue-circle.svg +3 -0
  6. package/src/assets/svg/login-widget-bg.png +0 -0
  7. package/src/assets/svg/subscribe-background-left.svg +14 -0
  8. package/src/assets/svg/subscribe-background-right.svg +11 -0
  9. package/src/assets/svg/trial-left.svg +6 -0
  10. package/src/assets/svg/trial-right.svg +26 -0
  11. package/src/modules/dx/banner/banner (1).ts +12 -0
  12. package/src/modules/dx/banner/banner.ts +3 -5
  13. package/src/modules/dx/button/button.css +10 -9
  14. package/src/modules/dx/buttonToggle/buttonToggle.css +50 -0
  15. package/src/modules/dx/buttonToggle/buttonToggle.html +17 -0
  16. package/src/modules/dx/buttonToggle/buttonToggle.ts +75 -0
  17. package/src/modules/dx/cardCallout/cardCallout.ts +8 -4
  18. package/src/modules/dx/cardContent/cardContent.html +4 -1
  19. package/src/modules/dx/cardDocs/cardDocs.html +4 -1
  20. package/src/modules/dx/cardEvent/cardEvent.html +1 -2
  21. package/src/modules/dx/cardEvent/cardEvent.ts +1 -1
  22. package/src/modules/dx/cardExpanded/cardExpanded.html +1 -6
  23. package/src/modules/dx/cardExpanded/cardExpanded.ts +2 -2
  24. package/src/modules/dx/cardMinimal/cardMinimal.html +1 -6
  25. package/src/modules/dx/cardTrial/cardTrial.css +63 -4
  26. package/src/modules/dx/cardTrial/cardTrial.html +96 -12
  27. package/src/modules/dx/cardTrial/cardTrial.ts +70 -2
  28. package/src/modules/dx/cardTrialExpanded/cardTrialExpanded.css +149 -0
  29. package/src/modules/dx/cardTrialExpanded/cardTrialExpanded.html +85 -0
  30. package/src/modules/dx/cardTrialExpanded/cardTrialExpanded.ts +67 -0
  31. package/src/modules/dx/checkbox/checkbox.css +4 -0
  32. package/src/modules/dx/codeBlock/codeBlock.ts +5 -1
  33. package/src/modules/dx/dropdown/dropdown.html +5 -1
  34. package/src/modules/dx/dropdown/dropdown.ts +13 -3
  35. package/src/modules/dx/dropdownOption/dropdownOption.css +119 -1
  36. package/src/modules/dx/dropdownOption/dropdownOption.html +4 -0
  37. package/src/modules/dx/dropdownOption/dropdownOption.ts +20 -7
  38. package/src/modules/dx/feature/feature.ts +3 -3
  39. package/src/modules/dx/featuredContentHeader/featuredContentHeader.css +84 -18
  40. package/src/modules/dx/featuredContentHeader/featuredContentHeader.html +109 -99
  41. package/src/modules/dx/featuredContentHeader/featuredContentHeader.ts +27 -7
  42. package/src/modules/dx/featuresList/featuresList.css +1 -1
  43. package/src/modules/dx/filterMenu/filterMenu.css +26 -8
  44. package/src/modules/dx/filterMenu/filterMenu.html +24 -8
  45. package/src/modules/dx/filterMenu/filterMenu.ts +1 -0
  46. package/src/modules/dx/footer/footer.css +1 -1
  47. package/src/modules/dx/footer/footer.html +25 -20
  48. package/src/modules/dx/footer/footer.ts +19 -15
  49. package/src/modules/dx/footer/links.ts +115 -39
  50. package/src/modules/dx/formattedDateTime/formattedDateTime.ts +8 -3
  51. package/src/modules/dx/header/header.html +10 -3
  52. package/src/modules/dx/header/header.ts +4 -0
  53. package/src/modules/dx/headerMobileNavMenu/headerMobileNavMenu.css +1 -0
  54. package/src/modules/dx/headerSearch/headerSearch.html +0 -1
  55. package/src/modules/dx/hr/hr.css +2 -4
  56. package/src/modules/dx/iconBadge/iconBadge.css +12 -0
  57. package/src/modules/dx/iconBadge/iconBadge.html +2 -7
  58. package/src/modules/dx/iconBadge/iconBadge.ts +15 -5
  59. package/src/modules/dx/imageAndLabel/imageAndLabel.css +0 -1
  60. package/src/modules/dx/input/input.css +17 -1
  61. package/src/modules/dx/input/input.html +5 -1
  62. package/src/modules/dx/input/input.ts +8 -0
  63. package/src/modules/dx/interactiveImage/interactiveImage.css +59 -0
  64. package/src/modules/dx/interactiveImage/interactiveImage.html +32 -0
  65. package/src/modules/dx/interactiveImage/interactiveImage.ts +71 -0
  66. package/src/modules/dx/logo/logo.css +0 -1
  67. package/src/modules/dx/logo/logo.ts +1 -1
  68. package/src/modules/dx/metadataBadge/metadataBadge.css +41 -0
  69. package/src/modules/dx/metadataBadge/metadataBadge.html +5 -0
  70. package/src/modules/dx/metadataBadge/metadataBadge.ts +24 -0
  71. package/src/modules/dx/modal/modal.css +40 -0
  72. package/src/modules/dx/modal/modal.html +10 -0
  73. package/src/modules/dx/modal/modal.ts +50 -0
  74. package/src/modules/dx/modalDrawer/modalDrawer.html +2 -2
  75. package/src/modules/dx/modalDrawer/modalDrawer.ts +7 -1
  76. package/src/modules/dx/pagination/pagination.css +1 -2
  77. package/src/modules/dx/popover/popover.css +28 -3
  78. package/src/modules/dx/popover/popover.html +1 -0
  79. package/src/modules/dx/popover/popover.ts +83 -44
  80. package/src/modules/dx/searchResults/coveo.css +18989 -0
  81. package/src/modules/dx/searchResults/searchResults.css +387 -0
  82. package/src/modules/dx/searchResults/searchResults.html +104 -0
  83. package/src/modules/dx/searchResults/searchResults.ts +187 -0
  84. package/src/modules/dx/section/section.css +10 -1
  85. package/src/modules/dx/section/section.ts +1 -1
  86. package/src/modules/dx/select/select.css +7 -3
  87. package/src/modules/dx/sidebar/sidebar.css +1 -145
  88. package/src/modules/dx/sidebar/sidebar.ts +2 -0
  89. package/src/modules/dx/sidebarOld/sidebarOld.css +1 -145
  90. package/src/modules/dx/sidebarOld/sidebarOld.ts +2 -0
  91. package/src/modules/dx/sidebarSearch/sidebarSearch.ts +23 -3
  92. package/src/modules/dx/sidebarSearchResult/sidebarSearchResult.css +1 -1
  93. package/src/modules/dx/tab/tab.css +0 -4
  94. package/src/modules/dx/tabPanel/tabPanel.css +20 -0
  95. package/src/modules/dx/tabPanel/tabPanel.html +13 -0
  96. package/src/modules/dx/tabPanel/tabPanel.ts +27 -0
  97. package/src/modules/dx/tabPanelItem/tabPanelItem.css +39 -0
  98. package/src/modules/dx/tabPanelItem/tabPanelItem.html +15 -0
  99. package/src/modules/dx/tabPanelItem/tabPanelItem.ts +39 -0
  100. package/src/modules/dx/tabPanelList/tabPanelList.css +35 -0
  101. package/src/modules/dx/tabPanelList/tabPanelList.html +47 -0
  102. package/src/modules/dx/tabPanelList/tabPanelList.ts +164 -0
  103. package/src/modules/dx/tabPanelList/uniqueId.ts +6 -0
  104. package/src/modules/dx/tbidAvatarButton/tbidAvatarButton.css +33 -0
  105. package/src/modules/dx/tbidAvatarButton/tbidAvatarButton.html +53 -0
  106. package/src/modules/dx/tbidAvatarButton/tbidAvatarButton.ts +440 -0
  107. package/src/modules/dx/toc/toc.css +1 -0
  108. package/src/modules/dx/toc/toc.ts +13 -0
  109. package/src/modules/dx/treeItem/treeItem.html +2 -0
  110. package/src/modules/dx/treeItem/treeItem.ts +8 -6
  111. package/src/modules/dx/treeTile/treeTile.css +18 -18
  112. package/src/modules/dx/treeTile/treeTile.html +5 -4
  113. package/src/modules/dx/treeTile/treeTile.ts +17 -3
  114. package/src/modules/dx/typeBadge/typeBadge.css +15 -56
  115. package/src/modules/dx/typeBadge/typeBadge.html +6 -0
  116. package/src/modules/dx/typeBadge/typeBadge.ts +149 -46
  117. package/src/modules/dxBaseElements/archiveCard/archiveCard.ts +2 -6
  118. package/src/modules/dxBaseElements/headerBase/headerBase.ts +11 -1
  119. package/src/modules/dxConstants/brands/brands.ts +14 -0
  120. package/src/modules/dxConstants/colors/colors.ts +14 -0
  121. package/src/modules/dxConstants/contentTypes/contentTypes.ts +10 -0
  122. package/src/modules/dxHelpers/card/card.css +1 -1
  123. package/src/modules/dxHelpers/commonHeader/commonHeader.css +4 -3
  124. package/src/modules/dxHelpers/commonSidebar/commonSidebar.css +145 -0
  125. package/src/modules/dxHelpers/{sidebar/sidebar.css → commonTreeItem/commonTreeItem.css} +0 -0
  126. package/src/modules/dxUtils/async/async.ts +45 -0
  127. package/src/modules/dxUtils/constants/constants.ts +0 -13
  128. package/src/modules/dxUtils/css/css.ts +10 -0
  129. package/src/modules/dxUtils/lwc/lwc.ts +9 -0
  130. package/src/modules/dxUtils/prismjs/prismjs.ts +347 -9
  131. package/src/modules/dxUtils/queryCoordinator/queryCoordinator.ts +37 -11
  132. package/LICENSE +0 -12
  133. package/src/modules/dx/typeBadgeGroup/typeBadgeGroup.css +0 -12
  134. package/src/modules/dx/typeBadgeGroup/typeBadgeGroup.html +0 -11
  135. package/src/modules/dx/typeBadgeGroup/typeBadgeGroup.ts +0 -18
@@ -40,7 +40,6 @@
40
40
  <dx-dropdown
41
41
  options={suggestions}
42
42
  open={isDropdownOpen}
43
- placement="bottom-end"
44
43
  onrequestclose={onDropdownRequestClose}
45
44
  offset="small"
46
45
  full-width
@@ -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: uppercase;
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: uppercase;
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("icon-badge", `shape-${this.shape}`);
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
- return (
38
- this.backgroundColor &&
39
- `background-color: ${toDxColor(this.backgroundColor)}`
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
  }
@@ -17,7 +17,6 @@ img {
17
17
  }
18
18
 
19
19
  span {
20
- margin-top: 3px;
21
20
  white-space: nowrap;
22
21
  }
23
22
 
@@ -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-2xs);
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
+ }
@@ -23,7 +23,6 @@ a:hover {
23
23
  }
24
24
 
25
25
  .logo-link > span {
26
- margin-top: 3px;
27
26
  color: var(--dx-c-logo-label-color);
28
27
  }
29
28
 
@@ -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 log";
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,5 @@
1
+ <template>
2
+ <div class={className} style={style}>
3
+ <span>{value}</span>
4
+ </div>
5
+ </template>
@@ -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,10 @@
1
+ <template>
2
+ <div class={containerClass} tabindex="0" role="dialog">
3
+ <slot></slot>
4
+ </div>
5
+ <div
6
+ if:true={open}
7
+ class="modal-drawer_overlay"
8
+ onclick={handleToggleModal}
9
+ ></div>
10
+ </template>
@@ -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={handleCloseModal}>Done</dx-button>
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={handleCloseModal}
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
- handleCloseModal() {
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-sm) var(--dx-g-spacing-md)
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: fixed;
13
- z-index: var(--dx-g-z-index-max);
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(--dx-g-spacing-sm);
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
+ }
@@ -1,6 +1,7 @@
1
1
  <template>
2
2
  <slot name="control" onslotchange={onSlotChange}></slot>
3
3
  <div class={containerClassName}>
4
+ <div class="popover-arrow" if:true={showArrow}></div>
4
5
  <div
5
6
  class={className}
6
7
  style={style}