@salesforcedevs/dx-components 0.54.1 → 0.54.6-alpha-1

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 (146) hide show
  1. package/lwc.config.json +19 -19
  2. package/package.json +6 -5
  3. package/src/assets/svg/login-widget-bg.png +0 -0
  4. package/src/modules/dx/avatarButton/avatarButton.css +128 -0
  5. package/src/modules/dx/avatarButton/avatarButton.html +145 -0
  6. package/src/modules/dx/avatarButton/avatarButton.ts +78 -0
  7. package/src/modules/dx/banner/banner.css +3 -3
  8. package/src/modules/dx/breadcrumbs/breadcrumbs.css +2 -2
  9. package/src/modules/dx/breadcrumbs/breadcrumbs.ts +27 -26
  10. package/src/modules/dx/button/button.css +10 -1
  11. package/src/modules/dx/button/button.ts +1 -1
  12. package/src/modules/dx/cardBlogPost/cardBlogPost.css +1 -1
  13. package/src/modules/dx/cardCallout/cardCallout.css +3 -3
  14. package/src/modules/dx/cardCallout/cardCallout.ts +2 -2
  15. package/src/modules/dx/cardContent/cardContent.css +3 -3
  16. package/src/modules/dx/cardContent/cardContent.ts +2 -2
  17. package/src/modules/dx/cardDemo/cardDemo.css +1 -1
  18. package/src/modules/dx/cardDocs/cardDocs.css +3 -3
  19. package/src/modules/dx/cardDocs/cardDocs.ts +1 -1
  20. package/src/modules/dx/cardEvent/cardEvent.css +3 -3
  21. package/src/modules/dx/cardExpanded/cardExpanded.css +1 -1
  22. package/src/modules/dx/cardExpanded/cardExpanded.ts +1 -1
  23. package/src/modules/dx/cardMinimal/cardMinimal.css +2 -2
  24. package/src/modules/dx/cardMinimal/cardMinimal.ts +1 -1
  25. package/src/modules/dx/cardNews/cardNews.css +3 -3
  26. package/src/modules/dx/cardNews/cardNews.ts +2 -2
  27. package/src/modules/dx/cardPodcastEpisode/cardPodcastEpisode.css +3 -3
  28. package/src/modules/dx/cardSmall/cardSmall.css +3 -3
  29. package/src/modules/dx/cardSmall/cardSmall.ts +1 -1
  30. package/src/modules/dx/cardTitle/cardTitle.css +2 -2
  31. package/src/modules/dx/cardTrailheadModule/cardTrailheadModule.css +1 -1
  32. package/src/modules/dx/cardTrial/cardTrial.css +3 -3
  33. package/src/modules/dx/cardTrial/cardTrial.ts +1 -1
  34. package/src/modules/dx/cardVideoPreview/cardVideoPreview.css +1 -1
  35. package/src/modules/dx/checkbox/checkbox.css +2 -2
  36. package/src/modules/dx/checkboxGroup/checkboxGroup.css +1 -1
  37. package/src/modules/dx/checkboxGroup/checkboxGroup.ts +1 -1
  38. package/src/modules/dx/codeBlock/codeBlock.css +2 -2
  39. package/src/modules/dx/codeBlock/codeBlock.ts +2 -2
  40. package/src/modules/dx/dropdown/dropdown.css +1 -1
  41. package/src/modules/dx/dropdown/dropdown.ts +4 -4
  42. package/src/modules/dx/dropdownOption/dropdownOption.css +1 -1
  43. package/src/modules/dx/dropdownOption/dropdownOption.ts +3 -3
  44. package/src/modules/dx/emptyState/emptyState.css +2 -2
  45. package/src/modules/dx/feature/feature.css +2 -2
  46. package/src/modules/dx/featuredContentHeader/featuredContentHeader.css +4 -4
  47. package/src/modules/dx/featuredContentHeader/featuredContentHeader.ts +2 -2
  48. package/src/modules/dx/featuresList/featuresList.css +2 -2
  49. package/src/modules/dx/featuresList/featuresList.ts +1 -1
  50. package/src/modules/dx/filterMenu/filterMenu.css +1 -1
  51. package/src/modules/dx/footer/footer.css +2 -2
  52. package/src/modules/dx/footer/footer.ts +4 -4
  53. package/src/modules/dx/footerOption/footerOption.ts +1 -1
  54. package/src/modules/dx/formattedDateTime/formattedDateTime.ts +5 -0
  55. package/src/modules/dx/groupText/groupText.css +2 -2
  56. package/src/modules/dx/groupText/groupText.ts +3 -3
  57. package/src/modules/dx/header/header.css +1 -1
  58. package/src/modules/dx/header/header.html +1 -0
  59. package/src/modules/dx/header/header.ts +4 -4
  60. package/src/modules/dx/headerMobileNavMenu/headerMobileNavMenu.css +1 -1
  61. package/src/modules/dx/headerMobileNavMenu/headerMobileNavMenu.ts +5 -5
  62. package/src/modules/dx/headerMobileNavMenuOption/headerMobileNavMenuOption.ts +1 -1
  63. package/src/modules/dx/headerNav/headerNav.css +1 -1
  64. package/src/modules/dx/headerNav/headerNav.ts +5 -5
  65. package/src/modules/dx/headerSearch/headerSearch.css +1 -1
  66. package/src/modules/dx/headerSearch/headerSearch.ts +3 -3
  67. package/src/modules/dx/helmet/helmet.css +2 -2
  68. package/src/modules/dx/hr/hr.css +2 -2
  69. package/src/modules/dx/icon/icon.css +1 -1
  70. package/src/modules/dx/icon/icon.ts +1 -1
  71. package/src/modules/dx/iconBadge/iconBadge.css +1 -1
  72. package/src/modules/dx/iconBadge/iconBadge.ts +1 -1
  73. package/src/modules/dx/imageAndLabel/imageAndLabel.css +3 -3
  74. package/src/modules/dx/input/input.css +2 -2
  75. package/src/modules/dx/input/input.ts +1 -1
  76. package/src/modules/dx/logo/logo.css +2 -2
  77. package/src/modules/dx/logo/logo.ts +1 -1
  78. package/src/modules/dx/modalDrawer/modalDrawer.ts +1 -1
  79. package/src/modules/dx/pagination/pagination.css +1 -1
  80. package/src/modules/dx/pagination/pagination.ts +1 -1
  81. package/src/modules/dx/podcastHost/podcastHost.css +2 -2
  82. package/src/modules/dx/popover/popover.css +1 -1
  83. package/src/modules/dx/popover/popover.ts +1 -1
  84. package/src/modules/dx/radioGroup/radioGroup.css +1 -1
  85. package/src/modules/dx/radioGroup/radioGroup.ts +1 -1
  86. package/src/modules/dx/section/section.css +2 -2
  87. package/src/modules/dx/section/section.ts +1 -1
  88. package/src/modules/dx/select/select.css +181 -8
  89. package/src/modules/dx/select/select.html +51 -54
  90. package/src/modules/dx/select/select.ts +128 -10
  91. package/src/modules/dx/sidebar/sidebar.css +2 -2
  92. package/src/modules/dx/sidebar/sidebar.ts +4 -4
  93. package/src/modules/dx/sidebarOld/sidebarOld.css +2 -2
  94. package/src/modules/dx/sidebarOld/sidebarOld.ts +3 -3
  95. package/src/modules/dx/sidebarSearch/sidebarSearch.ts +3 -3
  96. package/src/modules/dx/sidebarSearchResult/sidebarSearchResult.css +3 -3
  97. package/src/modules/dx/skipNavLink/skipNavLink.css +1 -1
  98. package/src/modules/dx/socials/socials.ts +1 -1
  99. package/src/modules/dx/tab/tab.css +1 -1
  100. package/src/modules/dx/tab/tab.ts +2 -2
  101. package/src/modules/dx/toc/toc.css +2 -2
  102. package/src/modules/dx/toc/toc.ts +1 -1
  103. package/src/modules/dx/topics/topics.ts +1 -1
  104. package/src/modules/dx/tree/tree.css +1 -1
  105. package/src/modules/dx/tree/tree.ts +1 -1
  106. package/src/modules/dx/treeItem/treeItem.css +1 -1
  107. package/src/modules/dx/treeItem/treeItem.ts +2 -2
  108. package/src/modules/dx/treeTile/treeTile.css +2 -2
  109. package/src/modules/dx/typeBadge/typeBadge.css +1 -1
  110. package/src/modules/dx/typeBadge/typeBadge.ts +1 -1
  111. package/src/modules/dx/typeBadgeGroup/typeBadgeGroup.ts +1 -1
  112. package/src/modules/dx/vimeoPlayer/vimeoPlayer.css +1 -1
  113. package/src/modules/{base-elements → dxBaseElements}/archiveCard/archiveCard.ts +0 -0
  114. package/src/modules/{base-elements → dxBaseElements}/headerBase/headerBase.ts +5 -5
  115. package/src/modules/{base-elements → dxBaseElements}/matchMediaElement/matchMediaElement.ts +1 -1
  116. package/src/modules/{base-elements → dxBaseElements}/sidebarBase/sidebarBase.ts +0 -0
  117. package/src/modules/{helpers → dxHelpers}/animations/animations.css +0 -0
  118. package/src/modules/{helpers → dxHelpers}/button/button.css +0 -0
  119. package/src/modules/{helpers → dxHelpers}/card/card.css +1 -1
  120. package/src/modules/{helpers → dxHelpers}/code/code.css +0 -0
  121. package/src/modules/{helpers → dxHelpers}/commonHeader/commonHeader.css +2 -2
  122. package/src/modules/{helpers → dxHelpers}/reset/reset.css +0 -0
  123. package/src/modules/{helpers → dxHelpers}/sidebar/sidebar.css +0 -0
  124. package/src/modules/{helpers → dxHelpers}/table/table.css +0 -0
  125. package/src/modules/{helpers → dxHelpers}/text/text.css +0 -0
  126. package/src/modules/{utils → dxUtils}/analytics/analytics.ts +0 -0
  127. package/src/modules/{utils → dxUtils}/browser/browser.ts +0 -0
  128. package/src/modules/{utils → dxUtils}/constants/breakpoints.ts +0 -0
  129. package/src/modules/{utils → dxUtils}/constants/constants.ts +0 -0
  130. package/src/modules/{utils → dxUtils}/coveo/coveo.ts +0 -0
  131. package/src/modules/{utils → dxUtils}/css/css.ts +0 -0
  132. package/src/modules/{utils → dxUtils}/dates/dates.ts +0 -0
  133. package/src/modules/{utils → dxUtils}/devices/devices.ts +0 -0
  134. package/src/modules/{utils → dxUtils}/highlight/highlight.ts +1 -1
  135. package/src/modules/{utils → dxUtils}/normalizers/normalizers.ts +9 -21
  136. package/src/modules/{utils → dxUtils}/options/options.ts +13 -9
  137. package/src/modules/{utils → dxUtils}/prismjs/prismjs.html +0 -0
  138. package/src/modules/{utils → dxUtils}/prismjs/prismjs.ts +0 -0
  139. package/src/modules/{utils → dxUtils}/queryCoordinator/queryCoordinator.ts +0 -0
  140. package/src/modules/{utils → dxUtils}/recentSearches/recentSearches.ts +0 -0
  141. package/src/modules/{utils → dxUtils}/regexps/regexps.ts +0 -0
  142. package/src/modules/{utils → dxUtils}/seo/seo.ts +0 -0
  143. package/src/modules/{utils → dxUtils}/slot/slot.ts +0 -0
  144. package/src/modules/{utils → dxUtils}/wordpress/wordpress.ts +0 -0
  145. package/LICENSE +0 -12
  146. package/src/modules/helpers/slds/slds.css +0 -191
@@ -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
  }
@@ -1,6 +1,6 @@
1
1
  import cx from "classnames";
2
2
  import { LightningElement, api } from "lwc";
3
- import { normalizeBoolean } from "utils/normalizers";
3
+ import { normalizeBoolean } from "dxUtils/normalizers";
4
4
 
5
5
  export default class ModalDrawer extends LightningElement {
6
6
  private _open = false;
@@ -1,4 +1,4 @@
1
- @import "helpers/reset";
1
+ @import "dxHelpers/reset";
2
2
 
3
3
  .dx-pagination {
4
4
  display: flex;
@@ -1,6 +1,6 @@
1
1
  import classNames from "classnames";
2
2
  import { LightningElement, api } from "lwc";
3
- import { track } from "utils/analytics";
3
+ import { track } from "dxUtils/analytics";
4
4
 
5
5
  const ANALYTICS_INFO = {
6
6
  clickUrl: window.location.href,
@@ -1,5 +1,5 @@
1
- @import "helpers/reset";
2
- @import "helpers/text";
1
+ @import "dxHelpers/reset";
2
+ @import "dxHelpers/text";
3
3
 
4
4
  :host {
5
5
  --dx-c-host-img-width: 48px;
@@ -1,4 +1,4 @@
1
- @import "helpers/reset";
1
+ @import "dxHelpers/reset";
2
2
 
3
3
  :host {
4
4
  --popover-border-radius: var(
@@ -8,7 +8,7 @@ import {
8
8
  import { createPopper } from "@popperjs/core";
9
9
  import cx from "classnames";
10
10
  import debounce from "debounce";
11
- import { isPrerender } from "utils/seo";
11
+ import { isPrerender } from "dxUtils/seo";
12
12
 
13
13
  const isEventOutsideElements = (
14
14
  e: Event,
@@ -1,4 +1,4 @@
1
- @import "helpers/reset";
1
+ @import "dxHelpers/reset";
2
2
 
3
3
  fieldset {
4
4
  display: grid;
@@ -1,5 +1,5 @@
1
1
  import { LightningElement, api } from "lwc";
2
- import { toJson } from "utils/normalizers";
2
+ import { toJson } from "dxUtils/normalizers";
3
3
 
4
4
  type Option = {
5
5
  value: string;
@@ -1,5 +1,5 @@
1
- @import "helpers/reset";
2
- @import "helpers/text";
1
+ @import "dxHelpers/reset";
2
+ @import "dxHelpers/text";
3
3
 
4
4
  :host {
5
5
  --dx-c-section-padding-vertical: var(--dx-g-spacing-5xl);
@@ -1,6 +1,6 @@
1
1
  import { LightningElement, api } from "lwc";
2
2
  import cx from "classnames";
3
- import { toDxColor } from "utils/css";
3
+ import { toDxColor } from "dxUtils/css";
4
4
 
5
5
  export default class Section extends LightningElement {
6
6
  @api backgroundColor: string = "transparent";
@@ -1,5 +1,3 @@
1
- @import "helpers/slds";
2
-
3
1
  :host {
4
2
  display: block;
5
3
  }
@@ -8,7 +6,7 @@
8
6
  outline: none;
9
7
  }
10
8
 
11
- .slds-select_container::before {
9
+ .select_container::before {
12
10
  --icon-size: 0.5em;
13
11
 
14
12
  border-style: solid;
@@ -24,21 +22,196 @@
24
22
  width: var(--icon-size);
25
23
  }
26
24
 
27
- .placeholder {
25
+ .select-element_placeholder {
28
26
  color: var(--sds-g-gray-9);
29
27
  }
30
28
 
31
- select.slds-select:focus:not([disabled]),
32
- select.slds-select:active:not([disabled]) {
29
+ select.select-element:focus:not([disabled]),
30
+ select.select-element:active:not([disabled]) {
33
31
  border-width: 2px;
34
32
  border-color: var(--dx-g-blue-vibrant-50);
35
33
  box-shadow: none;
36
34
  -webkit-box-shadow: none;
37
35
  }
38
36
 
39
- :host(.slds-has-error) select.slds-select:focus,
40
- :host(.slds-has-error) select.slds-select:active {
37
+ .has-error select.select-element:focus,
38
+ .has-error select.select-element:active {
41
39
  border-color: #ea001e;
42
40
  box-shadow: 0 0 3px var(--dx-g-blue-vibrant-50);
43
41
  -webkit-box-shadow: 0 0 3px var(--dx-g-blue-vibrant-50);
44
42
  }
43
+
44
+ @media (min-width: 48em) {
45
+ .form-element_horizontal .form-element_control {
46
+ padding-left: 33%;
47
+ clear: none;
48
+ }
49
+ }
50
+
51
+ abbr[title] {
52
+ border-bottom: 1px dotted;
53
+ text-decoration: none;
54
+ cursor: help;
55
+ }
56
+
57
+ abbr[title]::after {
58
+ content: " (" attr(title) ")";
59
+ }
60
+
61
+ abbr[title],
62
+ fieldset,
63
+ hr {
64
+ border: 0;
65
+ }
66
+
67
+ button,
68
+ select {
69
+ text-transform: none;
70
+ }
71
+
72
+ .form-element_control {
73
+ clear: left;
74
+ position: relative;
75
+ }
76
+
77
+ .form-element_label {
78
+ overflow-wrap: break-word;
79
+ word-wrap: break-word;
80
+ -webkit-hyphens: auto;
81
+ -ms-hyphens: auto;
82
+ hyphens: auto;
83
+ display: inline-block;
84
+ color: #3e3e3c;
85
+ font-size: 0.75rem;
86
+ padding-right: 0.5rem;
87
+ padding-top: 0.25rem;
88
+ margin-bottom: 0.125rem;
89
+ }
90
+
91
+ .form-element_label:empty {
92
+ margin: 0;
93
+ }
94
+
95
+ .form-element_stacked .form-element_label,
96
+ .form-element_stacked .form-element_control {
97
+ border-bottom: 0;
98
+ padding-left: 0;
99
+ }
100
+
101
+ .form-element_stacked .form-element_control {
102
+ width: 100%;
103
+ -ms-flex-preferred-size: 100%;
104
+ flex-basis: 100%;
105
+ clear: left;
106
+ }
107
+
108
+ .assistive-text {
109
+ position: absolute !important;
110
+ margin: -1px !important;
111
+ border: 0 !important;
112
+ padding: 0 !important;
113
+ width: 1px !important;
114
+ height: 1px !important;
115
+ overflow: hidden !important;
116
+ clip: rect(0 0 0 0) !important;
117
+ text-transform: none !important;
118
+ white-space: nowrap !important;
119
+ }
120
+
121
+ .required-element {
122
+ color: #ea001e;
123
+ margin: 0 0.125rem;
124
+ }
125
+
126
+ .select-element {
127
+ height: calc(1.875rem + (1px * 2));
128
+ width: 100%;
129
+ border: 1px solid #dddbda;
130
+ border-radius: 0.25rem;
131
+ background-color: white;
132
+ -webkit-transition: border 0.1s linear, background-color 0.1s linear;
133
+ transition: border 0.1s linear, background-color 0.1s linear;
134
+ }
135
+
136
+ .select-element:focus,
137
+ .select-element:active {
138
+ outline: 0;
139
+ border-color: #1b96ff;
140
+ background-color:white;
141
+ -webkit-box-shadow: 0 0 3px #0176d3;
142
+ box-shadow: 0 0 3px #0176d3;
143
+ }
144
+
145
+ .select-element[disabled],
146
+ .select-element.slds-is-disabled {
147
+ background-color: #ecebea;
148
+ border-color: #c9c7c5;
149
+ color: #3e3e3c;
150
+ cursor: not-allowed;
151
+ -webkit-user-select: none;
152
+ -moz-user-select: none;
153
+ -ms-user-select: none;
154
+ user-select: none;
155
+ opacity: 1;
156
+ }
157
+
158
+ .select-element[disabled]:focus,
159
+ .select-element[disabled]:active,
160
+ .select-element.slds-is-disabled:focus,
161
+ .select-element.slds-is-disabled:active {
162
+ -webkit-box-shadow: none;
163
+ box-shadow: none;
164
+ }
165
+
166
+ .select-element[size] {
167
+ min-height: calc(1.875rem + (1px * 2));
168
+ height: inherit;
169
+ }
170
+
171
+ .select-element[size] option {
172
+ padding: 0.5rem;
173
+ }
174
+
175
+ .has-error .select-element {
176
+ border-color: #ea001e;
177
+ -webkit-box-shadow: #ea001e 0 0 0 1px inset;
178
+ box-shadow: #ea001e 0 0 0 1px inset;
179
+ background-clip: padding-box;
180
+ }
181
+
182
+ .select_container {
183
+ position: relative;
184
+ }
185
+
186
+ .select_container .select-element {
187
+ -moz-appearance: none;
188
+ -webkit-appearance: none;
189
+ padding-left: 0.5rem;
190
+ padding-right: 1.5rem;
191
+ }
192
+
193
+ .select_container .select-element::-ms-expand {
194
+ display: none;
195
+ }
196
+
197
+ .has-error .select-element:focus,
198
+ .has-error .select-element:active {
199
+ -webkit-box-shadow: #ea001e 0 0 0 1px inset, 0 0 3px #0176d3;
200
+ box-shadow: #ea001e 0 0 0 1px inset, 0 0 3px #0176d3;
201
+ }
202
+
203
+ .form-element:not(.has-error) .select-element:required {
204
+ -webkit-box-shadow: none;
205
+ box-shadow: none;
206
+ }
207
+
208
+ .form-element_help,
209
+ .form-element_helper {
210
+ font-size: 0.75rem;
211
+ margin-top: 0.125rem;
212
+ display: block;
213
+ }
214
+
215
+ .has-error .form-element_help {
216
+ color: #ea001e;
217
+ }
@@ -1,60 +1,57 @@
1
1
  <template>
2
- <label class={computedLabelClass} for="select">
3
- {label}
4
- <template if:true={required}>
5
- <abbr>*</abbr>
6
- </template>
7
- </label>
8
-
9
- <div class="slds-form-element__control">
10
- <div class="slds-select_container">
11
- <select
12
- autocomplete={autocomplete}
13
- class={selectClass}
14
- disabled={disabled}
15
- id="select"
16
- multiple={multiple}
17
- name={name}
18
- onblur={handleBlur}
19
- onchange={handleChange}
20
- onfocus={handleFocus}
21
- required={required}
22
- accesskey={accessKey}
23
- size={size}
24
- >
25
- <template if:true={placeholder}>
26
- <option if:false={value} value="" disabled>
27
- {placeholder}
28
- </option>
29
- </template>
30
- <template for:each={options} for:item="option">
31
- <template if:true={option.disabled}>
32
- <option
33
- disabled
34
- key={option.value}
35
- value={option.value}
36
- >
37
- {option.label}
38
- </option>
2
+ <div class={containerClass}>
3
+ <label class="form-element_label" for="select">
4
+ {label}
5
+ <template if:true={required}>
6
+ <abbr>*</abbr>
7
+ </template>
8
+ </label>
9
+ <div class="form-element_control">
10
+ <div class="select_container">
11
+ <select
12
+ autocomplete={autocomplete}
13
+ class={selectClass}
14
+ disabled={disabled}
15
+ id="select"
16
+ name={name}
17
+ onblur={handleBlur}
18
+ onchange={handleChange}
19
+ onfocus={handleFocus}
20
+ required={required}
21
+ accesskey={accessKey}
22
+ size={size}
23
+ >
24
+ <template if:true={placeholder}>
25
+ <option value="" disabled>{placeholder}</option>
39
26
  </template>
40
- <template if:false={option.disabled}>
41
- <option key={option.value} value={option.value}>
42
- {option.label}
43
- </option>
27
+ <template for:each={options} for:item="option">
28
+ <template if:true={option.disabled}>
29
+ <option
30
+ disabled
31
+ key={option.value}
32
+ value={option.value}
33
+ >
34
+ {option.label}
35
+ </option>
36
+ </template>
37
+ <template if:false={option.disabled}>
38
+ <option key={option.value} value={option.value}>
39
+ {option.label}
40
+ </option>
41
+ </template>
44
42
  </template>
45
- </template>
46
- </select>
43
+ </select>
44
+ </div>
47
45
  </div>
46
+ <template if:true={helpMessage}>
47
+ <div
48
+ aria-live="assertive"
49
+ class="form-element_help"
50
+ data-help-message
51
+ id="help-message"
52
+ >
53
+ {helpMessage}
54
+ </div>
55
+ </template>
48
56
  </div>
49
-
50
- <template if:true={_helpMessage}>
51
- <div
52
- aria-live="assertive"
53
- class="slds-form-element__help"
54
- data-help-message
55
- id="help-message"
56
- >
57
- {_helpMessage}
58
- </div>
59
- </template>
60
57
  </template>
@@ -1,23 +1,141 @@
1
1
  import cx from "classnames";
2
- import { api } from "lwc";
3
- import LightningSelect from "lightning/select";
4
- import { toJson } from "utils/normalizers";
2
+ import { LightningElement, api } from "lwc";
3
+ import { SelectOption } from "typings/custom";
4
+ import { toJson, normalizeBoolean } from "dxUtils/normalizers";
5
5
 
6
- export default class Select extends LightningSelect {
6
+ export const DEFAULT_MISSING_MESSAGE = "This field is required";
7
+
8
+ export default class Select extends LightningElement {
9
+ @api accessKey!: string;
10
+ @api autocomplete?: string;
11
+ @api label?: string;
12
+ @api messageWhenValueMissing: string = DEFAULT_MISSING_MESSAGE;
13
+ @api name?: string;
7
14
  @api placeholder?: string;
15
+ @api size?: string;
16
+
17
+ @api
18
+ get disabled() {
19
+ return this._disabled;
20
+ }
21
+
22
+ set disabled(value) {
23
+ this._disabled = normalizeBoolean(value);
24
+ }
25
+
26
+ @api
27
+ get options() {
28
+ return this._options;
29
+ }
30
+
31
+ set options(value) {
32
+ this._options = toJson(value);
33
+ }
8
34
 
9
35
  @api
10
- get jsonOptions() {
11
- return this.options;
36
+ get required() {
37
+ return this._required;
12
38
  }
13
39
 
14
- set jsonOptions(value) {
15
- this.options = toJson(value);
40
+ set required(value) {
41
+ this._required = normalizeBoolean(value);
42
+ }
43
+
44
+ @api
45
+ get value() {
46
+ return this._value;
47
+ }
48
+
49
+ set value(value) {
50
+ this._value = value;
51
+ this.updateSelectValue();
52
+ }
53
+
54
+ _disabled = false;
55
+ _size = "";
56
+ _required = false;
57
+ _options: Array<SelectOption> = [];
58
+ _value: string = "";
59
+ _selectElement: HTMLSelectElement | null = null;
60
+ helpMessage?: string = "";
61
+
62
+ renderedCallback(): void {
63
+ this.updateSelectValue();
64
+ }
65
+
66
+ get containerClass() {
67
+ return cx("form-element", this.hasError && "has-error");
68
+ }
69
+
70
+ get hasError(): boolean {
71
+ return !!this.helpMessage;
16
72
  }
17
73
 
18
74
  get selectClass() {
19
- return cx("slds-select", {
20
- placeholder: !this.value
75
+ return cx("select-element", {
76
+ "select-element_placeholder": this.placeholder && !this.value
21
77
  });
22
78
  }
79
+
80
+ get selectElement() {
81
+ if (!this._selectElement) {
82
+ this._selectElement =
83
+ this.template.querySelector<HTMLSelectElement>("select");
84
+ }
85
+ return this._selectElement;
86
+ }
87
+
88
+ @api
89
+ blur(): void {
90
+ if (this.selectElement) {
91
+ this.selectElement.blur();
92
+ }
93
+ }
94
+
95
+ @api
96
+ focus(): void {
97
+ if (this.selectElement) {
98
+ this.selectElement.focus();
99
+ }
100
+ }
101
+
102
+ @api
103
+ reportValidity(): boolean {
104
+ const isInvalid = this._required && !this._value;
105
+ this.helpMessage = isInvalid
106
+ ? this.messageWhenValueMissing || DEFAULT_MISSING_MESSAGE
107
+ : "";
108
+ return !isInvalid;
109
+ }
110
+
111
+ handleBlur(): void {
112
+ this.reportValidity();
113
+ this.dispatchEvent(new CustomEvent("blur"));
114
+ }
115
+
116
+ handleChange(event: Event & { target: HTMLSelectElement }): void {
117
+ const { value } = event.target;
118
+ this._value = value;
119
+ this.dispatchEvent(
120
+ new CustomEvent("change", {
121
+ detail: { value }
122
+ })
123
+ );
124
+ }
125
+
126
+ handleFocus(): void {
127
+ this.helpMessage = "";
128
+ this.dispatchEvent(new CustomEvent("focus"));
129
+ }
130
+
131
+ // We have to do it programmatically because value binding doesn't work apparently.
132
+ updateSelectValue(): void {
133
+ if (!this._value && !this.placeholder) {
134
+ return;
135
+ }
136
+
137
+ if (this.selectElement) {
138
+ this.selectElement.value = this._value;
139
+ }
140
+ }
23
141
  }
@@ -1,5 +1,5 @@
1
- @import "helpers/reset";
2
- @import "helpers/text";
1
+ @import "dxHelpers/reset";
2
+ @import "dxHelpers/text";
3
3
 
4
4
  :host {
5
5
  --dx-c-sidebar-width: 275px;
@@ -1,15 +1,15 @@
1
1
  import cx from "classnames";
2
- import { track as trackAnalytics } from "utils/analytics";
3
2
  import { api, track } from "lwc";
4
3
  import {
5
4
  TreeNode,
6
5
  SidebarGtmAction,
7
6
  SidebarSearchResult
8
7
  } from "typings/custom";
9
- import { getSidebarSearchParams } from "utils/coveo";
10
- import { toJson } from "utils/normalizers";
8
+ import { track as trackAnalytics } from "dxUtils/analytics";
9
+ import { getSidebarSearchParams } from "dxUtils/coveo";
10
+ import { toJson } from "dxUtils/normalizers";
11
11
  import SidebarSearch from "dx/sidebarSearch";
12
- import { SidebarBase } from "base-elements/sidebarBase";
12
+ import { SidebarBase } from "dxBaseElements/sidebarBase";
13
13
 
14
14
  const MOBILE_SIZE_MATCH = "768px";
15
15
  const TOGGLE_BUTTON_LABEL = "Toggle Sidebar";
@@ -1,5 +1,5 @@
1
- @import "helpers/reset";
2
- @import "helpers/text";
1
+ @import "dxHelpers/reset";
2
+ @import "dxHelpers/text";
3
3
 
4
4
  :host {
5
5
  --dx-c-sidebar-width: 275px;
@@ -1,10 +1,10 @@
1
1
  import cx from "classnames";
2
- import { track } from "utils/analytics";
2
+ import { track } from "dxUtils/analytics";
3
3
  import { api } from "lwc";
4
4
 
5
5
  import { TreeNode, SidebarGtmAction } from "typings/custom";
6
- import { toJson } from "utils/normalizers";
7
- import { SidebarBase } from "base-elements/sidebarBase";
6
+ import { toJson } from "dxUtils/normalizers";
7
+ import { SidebarBase } from "dxBaseElements/sidebarBase";
8
8
 
9
9
  const WAIT_TIME = 500;
10
10
  const MOBILE_SIZE_MATCH = "768px";
@@ -14,9 +14,9 @@ import {
14
14
  SearchAppState,
15
15
  loadQueryActions
16
16
  } from "@coveo/headless";
17
- import { buildSearchEngine, getSidebarSearchParams } from "utils/coveo";
18
- import { RecentSearches } from "utils/recentSearches";
19
- import { toJson } from "utils/normalizers";
17
+ import { buildSearchEngine, getSidebarSearchParams } from "dxUtils/coveo";
18
+ import { RecentSearches } from "dxUtils/recentSearches";
19
+ import { toJson } from "dxUtils/normalizers";
20
20
  import {
21
21
  Option,
22
22
  PopoverRequestCloseType,
@@ -1,6 +1,6 @@
1
- @import "helpers/reset";
2
- @import "helpers/text";
3
- @import "helpers/sidebar";
1
+ @import "dxHelpers/reset";
2
+ @import "dxHelpers/text";
3
+ @import "dxHelpers/sidebar";
4
4
 
5
5
  a {
6
6
  display: flex;
@@ -1,4 +1,4 @@
1
- @import "helpers/text";
1
+ @import "dxHelpers/text";
2
2
 
3
3
  a {
4
4
  left: 0;
@@ -1,5 +1,5 @@
1
1
  import { LightningElement, api } from "lwc";
2
- import { normalizeToArray } from "utils/normalizers";
2
+ import { normalizeToArray } from "dxUtils/normalizers";
3
3
 
4
4
  type Icon = { name: string; symbol: string; baseShareUrl: string };
5
5
 
@@ -1,4 +1,4 @@
1
- @import "helpers/reset";
1
+ @import "dxHelpers/reset";
2
2
 
3
3
  a {
4
4
  text-decoration: none;