lightning-base-components 1.18.1-alpha → 1.18.2-alpha

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 (215) hide show
  1. package/metadata/raptor.json +5 -0
  2. package/package.json +43 -1
  3. package/scopedImports/@salesforce-internal-core.appVersion.js +1 -1
  4. package/src/lightning/accordion/accordion.css +12 -0
  5. package/src/lightning/accordion/accordion.html +3 -1
  6. package/src/lightning/accordion/accordion.js +4 -2
  7. package/src/lightning/accordion/accordion.slds.css +671 -0
  8. package/src/lightning/accordionSection/accordion-section.slds.css +647 -0
  9. package/src/lightning/accordionSection/accordionSection.css +14 -0
  10. package/src/lightning/accordionSection/accordionSection.html +23 -19
  11. package/src/lightning/accordionSection/accordionSection.js +29 -2
  12. package/src/lightning/ariaObserver/__docs__/ariaObserver.md +21 -9
  13. package/src/lightning/ariaObserver/ariaObserver.js +185 -154
  14. package/src/lightning/ariaObserver/polyfill.js +639 -0
  15. package/src/lightning/avatar/avatar.css +2 -0
  16. package/src/lightning/avatar/avatar.html +2 -0
  17. package/src/lightning/avatar/avatar.js +18 -15
  18. package/src/lightning/avatar/avatar.slds.css +272 -0
  19. package/src/lightning/baseCombobox/base-combobox.slds.css +1585 -0
  20. package/src/lightning/baseCombobox/baseCombobox.css +11 -1
  21. package/src/lightning/baseCombobox/baseCombobox.html +154 -146
  22. package/src/lightning/baseCombobox/baseCombobox.js +82 -46
  23. package/src/lightning/baseCombobox/spinner.slds.css +438 -0
  24. package/src/lightning/baseComboboxItem/baseComboboxItem.js +4 -2
  25. package/src/lightning/baseComboboxItem/inline.css +2 -0
  26. package/src/lightning/breadcrumb/breadcrumb.css +2 -2
  27. package/src/lightning/breadcrumb/breadcrumb.js +4 -2
  28. package/src/lightning/breadcrumb/breadcrumb.slds.css +2 -7
  29. package/src/lightning/breadcrumbs/breadcrumbs.css +2 -2
  30. package/src/lightning/breadcrumbs/breadcrumbs.js +3 -2
  31. package/src/lightning/breadcrumbs/breadcrumbs.slds.css +7 -1
  32. package/src/lightning/button/__examples__/inverse/inverse.css +8 -0
  33. package/src/lightning/button/__examples__/inverse/inverse.html +3 -2
  34. package/src/lightning/button/button.css +2 -0
  35. package/src/lightning/button/button.html +4 -2
  36. package/src/lightning/button/button.js +21 -0
  37. package/src/lightning/button/button.slds.css +527 -0
  38. package/src/lightning/buttonGroup/buttonGroup.css +2 -2
  39. package/src/lightning/buttonGroup/buttonGroup.js +3 -2
  40. package/src/lightning/buttonIcon/button-icon.slds.css +215 -453
  41. package/src/lightning/buttonIcon/buttonIcon.css +2 -2
  42. package/src/lightning/buttonIcon/buttonIcon.js +4 -0
  43. package/src/lightning/buttonIconStateful/button-icon-stateful.slds.css +215 -453
  44. package/src/lightning/buttonIconStateful/buttonIconStateful.css +2 -2
  45. package/src/lightning/buttonMenu/{dropdown.slds.css → button-menu.slds.css} +853 -217
  46. package/src/lightning/buttonMenu/buttonMenu.css +2 -2
  47. package/src/lightning/buttonMenu/buttonMenu.html +2 -2
  48. package/src/lightning/buttonMenu/buttonMenu.js +10 -14
  49. package/src/lightning/buttonStateful/button-stateful.slds.css +225 -457
  50. package/src/lightning/buttonStateful/buttonStateful.css +2 -2
  51. package/src/lightning/buttonStateful/buttonStateful.js +3 -2
  52. package/src/lightning/calendar/__examples__/basic/basic.html +7 -0
  53. package/src/lightning/calendar/__examples__/basic/basic.js +3 -0
  54. package/src/lightning/calendar/calendar.css +3 -0
  55. package/src/lightning/calendar/calendar.html +12 -9
  56. package/src/lightning/calendar/calendar.js +15 -1
  57. package/src/lightning/calendar/calendar.slds.css +2048 -0
  58. package/src/lightning/card/card.css +2 -2
  59. package/src/lightning/card/card.js +3 -2
  60. package/src/lightning/card/card.slds.css +141 -88
  61. package/src/lightning/colorPickerCustom/colorPickerCustom.css +2 -2
  62. package/src/lightning/colorPickerCustom/colorPickerCustom.js +3 -2
  63. package/src/lightning/colorPickerPanel/color-picker-panel.slds.css +11 -38
  64. package/src/lightning/colorPickerPanel/colorPickerPanel.css +3 -2
  65. package/src/lightning/colorPickerPanel/colorPickerPanel.js +4 -2
  66. package/src/lightning/colorPickerPanel/popover.slds.css +121 -0
  67. package/src/lightning/combobox/combobox.css +4 -0
  68. package/src/lightning/combobox/combobox.html +31 -29
  69. package/src/lightning/combobox/combobox.js +21 -4
  70. package/src/lightning/combobox/combobox.slds.css +13 -0
  71. package/src/lightning/combobox/form-element.slds.css +281 -0
  72. package/src/lightning/configProvider/defaultConfig.js +2 -1
  73. package/src/lightning/datepicker/datepicker.css +3 -0
  74. package/src/lightning/datepicker/datepicker.html +7 -4
  75. package/src/lightning/datepicker/datepicker.js +73 -19
  76. package/src/lightning/datepicker/form-element.slds.css +281 -0
  77. package/src/lightning/datepicker/input-text.slds.css +398 -0
  78. package/src/lightning/datetimepicker/datetimepicker.css +3 -0
  79. package/src/lightning/datetimepicker/datetimepicker.html +9 -3
  80. package/src/lightning/datetimepicker/datetimepicker.js +39 -35
  81. package/src/lightning/datetimepicker/form-element.slds.css +281 -0
  82. package/src/lightning/datetimepicker/input-text.slds.css +398 -0
  83. package/src/lightning/dualListbox/dualListbox.css +2 -2
  84. package/src/lightning/dualListbox/dualListbox.html +3 -3
  85. package/src/lightning/dualListbox/dualListbox.js +31 -6
  86. package/src/lightning/dualListbox/form-element.slds.css +83 -34
  87. package/src/lightning/dualListbox/keyboard.js +20 -1
  88. package/src/lightning/dynamicIcon/dynamicIcon.js +3 -2
  89. package/src/lightning/dynamicIcon/ellie.css +1 -1
  90. package/src/lightning/dynamicIcon/eq.css +1 -1
  91. package/src/lightning/dynamicIcon/score.css +1 -1
  92. package/src/lightning/dynamicIcon/strength.css +1 -1
  93. package/src/lightning/dynamicIcon/trend.css +1 -1
  94. package/src/lightning/dynamicIcon/waffle.css +1 -1
  95. package/src/lightning/formattedRichText/linkify.js +2 -2
  96. package/src/lightning/helptext/form-element.slds.css +83 -34
  97. package/src/lightning/helptext/help-text.slds.css +215 -453
  98. package/src/lightning/helptext/helptext.css +2 -2
  99. package/src/lightning/helptext/helptext.js +3 -2
  100. package/src/lightning/i18nCldrOptions/README.md +5 -0
  101. package/src/lightning/i18nService/README.md +5 -0
  102. package/src/lightning/icon/icon.css +2 -2
  103. package/src/lightning/icon/icon.js +16 -2
  104. package/src/lightning/icon/icon.slds.css +29 -17
  105. package/src/lightning/icon/iconColors.js +1 -0
  106. package/src/lightning/input/__examples__/text/text.html +0 -1
  107. package/src/lightning/input/form-element.slds.css +281 -0
  108. package/src/lightning/input/input-checkbox.slds.css +3 -12
  109. package/src/lightning/input/input-text.slds.css +239 -128
  110. package/src/lightning/input/input.css +2 -1
  111. package/src/lightning/input/input.html +8 -8
  112. package/src/lightning/input/input.js +107 -73
  113. package/src/lightning/internationalizationLibrary/README.md +24 -0
  114. package/src/lightning/internationalizationLibrary/utils.js +4 -1
  115. package/src/lightning/layout/__docs__/layout.md +1 -1
  116. package/src/lightning/layout/__examples__/simple/simple.css +1 -1
  117. package/src/lightning/layout/layout.css +5 -1
  118. package/src/lightning/layout/layout.js +4 -2
  119. package/src/lightning/layoutItem/__examples__/alignmentBump/alignmentBump.css +1 -1
  120. package/src/lightning/layoutItem/__examples__/sizePerDevice/sizePerDevice.css +0 -1
  121. package/src/lightning/layoutItem/layoutItem.css +5 -0
  122. package/src/lightning/layoutItem/layoutItem.js +4 -2
  123. package/src/lightning/menuDivider/menu-divider.slds.css +15 -0
  124. package/src/lightning/menuDivider/menuDivider.css +3 -0
  125. package/src/lightning/menuDivider/menuDivider.html +1 -1
  126. package/src/lightning/menuDivider/menuDivider.js +4 -2
  127. package/src/lightning/menuItem/menu-item.slds.css +140 -0
  128. package/src/lightning/menuItem/menuItem.css +3 -0
  129. package/src/lightning/menuItem/menuItem.html +43 -41
  130. package/src/lightning/menuItem/menuItem.js +4 -4
  131. package/src/lightning/menuSubheader/menu-subheader.slds.css +22 -0
  132. package/src/lightning/menuSubheader/menuSubheader.css +3 -0
  133. package/src/lightning/menuSubheader/menuSubheader.html +3 -1
  134. package/src/lightning/menuSubheader/menuSubheader.js +4 -6
  135. package/src/lightning/modal/__docs__/modal.md +3 -1
  136. package/src/lightning/modal/__modalUtils__/modalContainerTestConstants.js +267 -0
  137. package/src/lightning/modal/__modalUtils__/modalContainerTestMethods.js +1165 -0
  138. package/src/lightning/modal/__modalUtils__/modalContainerTestMockData.js +131 -0
  139. package/src/lightning/modal/modal.js +1 -1
  140. package/src/lightning/pill/avatar.slds.css +272 -0
  141. package/src/lightning/pill/link.css +3 -0
  142. package/src/lightning/pill/link.html +1 -1
  143. package/src/lightning/pill/pill.js +29 -9
  144. package/src/lightning/pill/pill.slds.css +168 -0
  145. package/src/lightning/pill/plain.css +3 -0
  146. package/src/lightning/pill/plain.html +1 -1
  147. package/src/lightning/pill/plainLink.css +3 -0
  148. package/src/lightning/pill/plainLink.html +1 -1
  149. package/src/lightning/pillContainer/barePillContainer.css +3 -0
  150. package/src/lightning/pillContainer/barePillContainer.html +1 -2
  151. package/src/lightning/pillContainer/listbox.slds.css +267 -0
  152. package/src/lightning/pillContainer/pill-container.slds.css +22 -0
  153. package/src/lightning/pillContainer/pill.slds.css +168 -0
  154. package/src/lightning/pillContainer/pillContainer.js +7 -3
  155. package/src/lightning/pillContainer/standardPillContainer.css +4 -0
  156. package/src/lightning/pillContainer/standardPillContainer.html +2 -2
  157. package/src/lightning/popup/popover.slds.css +119 -119
  158. package/src/lightning/popup/popup.css +1 -2
  159. package/src/lightning/popup/popup.js +3 -2
  160. package/src/lightning/positionLibrary/elementProxy.js +7 -2
  161. package/src/lightning/positionLibrary/util.js +8 -0
  162. package/src/lightning/primitiveBubble/primitiveBubble.css +2 -2
  163. package/src/lightning/primitiveBubble/primitiveBubble.js +4 -2
  164. package/src/lightning/primitiveButton/primitiveButton.js +5 -4
  165. package/src/lightning/primitiveCellFactory/cellWithStandardLayout.html +29 -21
  166. package/src/lightning/primitiveCellFactory/primitiveCellFactory.js +4 -0
  167. package/src/lightning/primitiveColorpickerButton/color-picker-button.slds.css +31 -19
  168. package/src/lightning/primitiveColorpickerButton/primitiveColorpickerButton.css +2 -2
  169. package/src/lightning/primitiveColorpickerButton/primitiveColorpickerButton.js +5 -3
  170. package/src/lightning/primitiveIcon/icon.slds.css +209 -0
  171. package/src/lightning/primitiveIcon/primitiveIcon.css +2 -1
  172. package/src/lightning/primitiveIcon/primitiveIcon.html +1 -1
  173. package/src/lightning/primitiveIcon/primitiveIcon.js +18 -11
  174. package/src/lightning/progressStep/progressStep.js +10 -13
  175. package/src/lightning/radioGroup/radioGroup.css +2 -1
  176. package/src/lightning/radioGroup/radioGroup.js +4 -2
  177. package/src/lightning/select/form-element.slds.css +83 -34
  178. package/src/lightning/select/select.css +2 -2
  179. package/src/lightning/select/select.js +4 -2
  180. package/src/lightning/select/select.slds.css +86 -34
  181. package/src/lightning/sldsCommon/sldsCommon.css +135 -75
  182. package/src/lightning/spinner/spinner.css +2 -2
  183. package/src/lightning/spinner/spinner.js +4 -2
  184. package/src/lightning/tabBar/tab-bar.slds.css +334 -0
  185. package/src/lightning/tabBar/tabBar.css +2 -0
  186. package/src/lightning/tabBar/tabBar.html +4 -3
  187. package/src/lightning/tabBar/tabBar.js +30 -3
  188. package/src/lightning/tabset/tabset.html +5 -4
  189. package/src/lightning/tabset/tabset.js +29 -11
  190. package/src/lightning/timepicker/form-element.slds.css +281 -0
  191. package/src/lightning/timepicker/timepicker.css +3 -0
  192. package/src/lightning/timepicker/timepicker.html +5 -1
  193. package/src/lightning/timepicker/timepicker.js +18 -15
  194. package/src/lightning/timepicker/timepicker.slds.css +18 -0
  195. package/src/lightning/tooltipLibrary/tooltipLibrary.js +21 -19
  196. package/src/lightning/utilsPrivate/browser.js +5 -3
  197. package/src/lightning/utilsPrivate/os.js +6 -4
  198. package/src/lightning/utilsPrivate/ssr.js +4 -0
  199. package/src/lightning/utilsPrivate/utilsPrivate.js +2 -0
  200. package/src/lightning/verticalNavigation/verticalNavigation.css +2 -1
  201. package/src/lightning/verticalNavigation/verticalNavigation.js +3 -2
  202. package/src/lightning/verticalNavigationSection/verticalNavigationSection.css +2 -1
  203. package/src/lightning/verticalNavigationSection/verticalNavigationSection.js +3 -2
  204. package/src/lightning/accordion/__perf__DISABLED/accordion-perf-utils.js +0 -76
  205. package/src/lightning/accordion/__perf__DISABLED/accordion10Multiple25SectionEach.perf.js +0 -57
  206. package/src/lightning/accordion/__perf__DISABLED/accordion10Simple25SectionEach.perf.js +0 -37
  207. package/src/lightning/accordion/__perf__DISABLED/accordionMultiple50Section.perf.js +0 -45
  208. package/src/lightning/accordion/__perf__DISABLED/accordionSimple50Section.perf.js +0 -35
  209. package/src/lightning/accordion/__perf__DISABLED/container/container.html +0 -15
  210. package/src/lightning/accordion/__perf__DISABLED/container/container.js +0 -7
  211. package/src/lightning/positionLibrary/__component__/positionLibraryBounding.spec.js +0 -319
  212. package/src/lightning/positionLibrary/__component__/x/bounding/bounding.css +0 -16
  213. package/src/lightning/positionLibrary/__component__/x/bounding/bounding.html +0 -36
  214. package/src/lightning/positionLibrary/__component__/x/bounding/bounding.js +0 -122
  215. /package/src/lightning/{baseCombobox → baseComboboxItem}/listbox.slds.css +0 -0
@@ -1,13 +1,15 @@
1
1
  import labelRequired from '@salesforce/label/LightningControl.required';
2
2
  import labelPlaceholder from '@salesforce/label/LightningCombobox.placeholder';
3
3
  import labelHelpTextAlternativeText from '@salesforce/label/LightningInput.helptextAlternativeText';
4
- import { LightningElement, api, track } from 'lwc';
4
+ import { api, track } from 'lwc';
5
+ import LightningShadowBaseClass from 'lightning/shadowBaseClassPrivate';
5
6
  import { classSet, formatLabel } from 'lightning/utils';
6
7
  import {
7
- normalizeBoolean,
8
+ classListMutation,
8
9
  normalizeArray,
10
+ normalizeBoolean,
11
+ reflectAttribute,
9
12
  synchronizeAttrs,
10
- classListMutation,
11
13
  } from 'lightning/utilsPrivate';
12
14
  import {
13
15
  isEmptyString,
@@ -26,7 +28,7 @@ const i18n = {
26
28
  * A widget that provides an input field that is readonly,
27
29
  * accompanied by a dropdown list of selectable options.
28
30
  */
29
- export default class LightningCombobox extends LightningElement {
31
+ export default class LightningCombobox extends LightningShadowBaseClass {
30
32
  static delegatesFocus = true;
31
33
 
32
34
  @track _ariaLabelledBy = '';
@@ -93,6 +95,7 @@ export default class LightningCombobox extends LightningElement {
93
95
  }
94
96
 
95
97
  connectedCallback() {
98
+ super.connectedCallback();
96
99
  this.classList.add('slds-form-element');
97
100
  this.updateClassList();
98
101
  this.interactingState = new InteractingState();
@@ -181,6 +184,7 @@ export default class LightningCombobox extends LightningElement {
181
184
  set variant(value) {
182
185
  this._variant = normalizeVariant(value);
183
186
  this.updateClassList();
187
+ reflectAttribute(this, 'variant', this._variant);
184
188
  }
185
189
 
186
190
  /**
@@ -325,6 +329,15 @@ export default class LightningCombobox extends LightningElement {
325
329
  @api
326
330
  reportValidity() {
327
331
  return this._constraint.reportValidity((message) => {
332
+ // manage invalid attribute on the base combobox
333
+ // this is done to allow css to target invalid base-combobox state
334
+ // we may want to update the logic in base combobox to handle this
335
+ // more generally once more usages like grouped, lookupaddress etc. are migrated
336
+ reflectAttribute(
337
+ this.template.querySelector('lightning-base-combobox'),
338
+ 'invalid',
339
+ !this.checkValidity()
340
+ );
328
341
  this._helpMessage = message;
329
342
  });
330
343
  }
@@ -362,6 +375,10 @@ export default class LightningCombobox extends LightningElement {
362
375
  baseCombobox.inputDescribedByElements = this.computedAriaDescribedBy;
363
376
  }
364
377
 
378
+ get templateRootNode() {
379
+ return this.template.host.getRootNode();
380
+ }
381
+
365
382
  get i18n() {
366
383
  return i18n;
367
384
  }
@@ -0,0 +1,13 @@
1
+
2
+ /* Copyright (c) 2015-present, salesforce.com, inc. All rights reserved
3
+ Licensed under BSD 3-Clause - see LICENSE.txt or git.io/sfdc-license */
4
+
5
+ @supports (--styling-hooks: '') {
6
+ /**
7
+ * Invalid State
8
+ */
9
+ :host([data-render-mode="shadow"][invalid]) [part~='combobox'] {
10
+ --slds-c-inputtext-color-border: var(--sds-g-color-error-base-50, #ea001e);
11
+ --slds-c-inputtext-sizing-border: var(--sds-g-sizing-border-1, 1px);
12
+ }
13
+ }
@@ -0,0 +1,281 @@
1
+
2
+ /* Copyright (c) 2015-present, salesforce.com, inc. All rights reserved
3
+ Licensed under BSD 3-Clause - see LICENSE.txt or git.io/sfdc-license */
4
+ @supports (--styling-hooks: '') {
5
+ /* TODO: Swap with utility classes */
6
+ :host([data-render-mode="shadow"]) fieldset {
7
+ border: 0;
8
+ margin: 0;
9
+ padding: 0;
10
+ }
11
+
12
+ /* FORM ELEMENT: BASE */
13
+ :host([data-render-mode="shadow"]) .slds-form-element {
14
+ position: relative;
15
+ min-width: 0;
16
+ }
17
+
18
+ :host([data-render-mode="shadow"]) .slds-form-element__label {
19
+ overflow-wrap: break-word;
20
+ word-wrap: break-word;
21
+ hyphens: auto;
22
+ display: inline-block;
23
+ color: var(--sds-g-color-neutral-base-30, #444444);
24
+ font-size: var(--sds-g-font-scale-neg-3, 0.75rem);
25
+ padding-inline-end: var(--sds-g-spacing-2, 0.5rem);
26
+ padding-block-start: var(--sds-g-spacing-1, 0.25rem);
27
+ margin-block-end: calc(var(--sds-g-spacing-1, 0.25rem) / 2);
28
+ }
29
+
30
+ :host([data-render-mode="shadow"]) .slds-form-element__label:empty {
31
+ margin: 0;
32
+ }
33
+
34
+ :host([data-render-mode="shadow"]) .slds-form-element__control {
35
+ clear: left; /* NOTE: Ideally we want left to be inline-start but browser support is not ready for that value. We need to figure out better RTL support */
36
+ position: relative;
37
+ }
38
+
39
+ :host([data-render-mode="shadow"]) .slds-form-element__icon {
40
+ display: inline-block;
41
+ position: relative;
42
+ padding-block-start: var(--sds-g-spacing-1, 0.25rem);
43
+ vertical-align: top;
44
+ line-height: var(--sds-g-font-lineheight-1, 1);
45
+ z-index: 1;
46
+ }
47
+
48
+ :host([data-render-mode="shadow"]) .slds-form-element__icon .slds-button_icon {
49
+ position: relative;
50
+ }
51
+
52
+ :host([data-render-mode="shadow"]) .slds-form-element__help,:host([data-render-mode="shadow"])
53
+ .slds-form-element__helper {
54
+ font-size: var(--sds-g-font-scale-neg-3, 0.75rem);
55
+ margin-block-start: calc(var(--sds-g-spacing-1, 0.25rem) / 2);
56
+ display: block;
57
+ }
58
+
59
+ :host([data-render-mode="shadow"]) .slds-form-element_edit .slds-form-element__static {
60
+ width: calc(100% - var(--sds-g-sizing-7, 1.5rem));
61
+ }
62
+
63
+ :host([data-render-mode="shadow"]) .slds-form-element_readonly {
64
+ flex-basis: 0%;
65
+ border-bottom: var(--sds-g-sizing-border-1, 1px) solid var(--sds-g-color-neutral-base-90, #e5e5e5);
66
+ margin-block-end: 0;
67
+ }
68
+
69
+ :host([data-render-mode="shadow"]) .slds-form-element_readonly .slds-form-element__control {
70
+ padding-block-start: calc(var(--sds-g-spacing-1, 0.25rem) / 2);
71
+ padding-block-end: calc(var(--sds-g-spacing-1, 0.25rem) / 2);
72
+ }
73
+
74
+ :host([data-render-mode="shadow"]) .slds-form-element_readonly .slds-form-element__label {
75
+ margin-block-end: 0;
76
+ }
77
+
78
+ :host([data-render-mode="shadow"]) .slds-form-element__legend {
79
+ font-weight: var(--sds-g-font-weight-7, 700);
80
+ float: left;
81
+ }
82
+
83
+ :host([data-render-mode="shadow"]) .slds-form-element__addon {
84
+ display: inline-block;
85
+ margin-block-start: 0;
86
+ margin-block-end: 0;
87
+ margin-inline-start: var(--sds-g-spacing-2, 0.5rem);
88
+ margin-inline-end: var(--sds-g-spacing-2, 0.5rem);
89
+ align-self: center;
90
+ }
91
+
92
+ :host([data-render-mode="shadow"]) .slds-form-element__static {
93
+ overflow-wrap: break-word;
94
+ word-wrap: break-word;
95
+ word-break: break-word;
96
+ display: inline-block;
97
+ font-size: var(--sds-g-font-scale-neg-1, 0.875rem);
98
+ font-weight: var(--sds-g-font-weight-4, 400);
99
+ color: var(--sds-g-color-neutral-base-10, #181818);
100
+ width: 100%;
101
+ }
102
+
103
+ :host([data-render-mode="shadow"]) .slds-form-element__static.slds-text-longform *:last-child {
104
+ margin-block-end: 0;
105
+ }
106
+
107
+ :host([data-render-mode="shadow"]) .slds-form-element__static:empty {
108
+ min-height: calc(var(--sds-g-sizing-6, 1.25rem) + 1px);
109
+ vertical-align: bottom;
110
+ }
111
+
112
+ :host([data-render-mode="shadow"]) .slds-form-element__static--edit {
113
+ width: calc(100% - var(--sds-g-sizing-7, 1.5rem));
114
+ }
115
+
116
+ :host([data-render-mode="shadow"]) .slds-required {
117
+ color: var(--sds-g-color-error-base-50, #ea001e);
118
+ margin-block-start: 0;
119
+ margin-block-end: 0;
120
+ margin-inline-start: calc(var(--sds-g-spacing-1, 0.25rem) / 2);
121
+ margin-inline-end: calc(var(--sds-g-spacing-1, 0.25rem) / 2);
122
+ }
123
+
124
+ :host([data-render-mode="shadow"]) .slds-has-error .slds-form-element__help {
125
+ color: var(--sds-g-color-error-base-50, #ea001e);
126
+ }
127
+
128
+ :host([data-render-mode="shadow"][invalid]) .slds-form-element__help {
129
+ color: var(--sds-g-color-error-base-50, #ea001e);
130
+ }
131
+
132
+ /* --------------------------------------- */
133
+
134
+ /* FORM ELEMENT: STACKED */
135
+
136
+ :host([data-render-mode="shadow"][variant~='label-stacked']) {
137
+ display: block;
138
+ }
139
+
140
+ /* TODO: Using `:not` is currently not working, and it could break the build because of issues with the dist script */
141
+
142
+ /* :host([variant~='label-stacked']):not(.slds-form-element_readonly) {
143
+ margin-block-end: var(--sds-g-spacing-2);
144
+ }
145
+
146
+ :host([variant~='label-stacked']):not(.slds-is-editing) {
147
+ padding: 0 var(--sds-g-spacing-1);
148
+ } */
149
+
150
+ /* :host([variant~='label-stacked']):not([class*="slds-size"]) {
151
+ width: 100%;
152
+ flex-basis: 100%;
153
+ } */
154
+
155
+ :host([data-render-mode="shadow"][variant~='label-stacked']) .slds-form-element {
156
+ padding: 0;
157
+ margin-block-end: 0;
158
+ }
159
+
160
+ :host([data-render-mode="shadow"][variant~='label-stacked']) .slds-form-element__label,:host([data-render-mode="shadow"][variant~='label-stacked']) .slds-form-element__control {
161
+ border-bottom: 0; /* Remove border when using legacy version of slds-form-element */
162
+ padding-inline-start: 0;
163
+ }
164
+
165
+ :host([data-render-mode="shadow"][variant~='label-stacked']) .slds-form-element__control {
166
+ width: 100%;
167
+ flex-basis: 100%;
168
+ clear: left;
169
+ }
170
+
171
+ :host([data-render-mode="shadow"][variant~='label-stacked']) .slds-form-element__icon {
172
+ float: none;
173
+ padding-block-start: var(--sds-g-spacing-1, 0.25rem);
174
+ }
175
+
176
+ /* --------------------------------------- */
177
+
178
+ /* FORM ELEMENT: INLINE */
179
+
180
+ :host([data-render-mode="shadow"][variant~='label-inline']) {
181
+ display: block;
182
+ }
183
+
184
+ /*
185
+ we have to combine with slds class here to avoid duplication
186
+ of this rule in child elements who import this stylesheet
187
+ in lighting-input this slds class is synonymous with the variant
188
+ */
189
+
190
+ :host([data-render-mode="shadow"][variant~='label-inline'].slds-form-element_horizontal) {
191
+ padding: var(--sds-g-spacing-1, 0.25rem);
192
+ margin-block-end: var(--sds-g-spacing-2, 0.5rem);
193
+ }
194
+
195
+ /* TODO: Using `:not` is currently not working, and it could break the build because of issues with the dist script */
196
+
197
+ /* :host([variant~='label-inline']):not(.slds-form-element_readonly) {
198
+ margin-block-end: var(--sds-g-spacing-2);
199
+ }
200
+
201
+ :host([variant~='label-inline']):not([class*="slds-size"]) {
202
+ width: 100%;
203
+ flex-basis: 100%;
204
+ }
205
+
206
+ :host([variant~='label-inline']:not(.slds-is-editing)) {
207
+ padding: var(--sds-g-spacing-1);
208
+ } */
209
+
210
+ :host([data-render-mode="shadow"][variant~='label-inline']).slds-is-edited {
211
+ padding-block-start: var(--sds-g-sizing-6, 1.25rem)
212
+ }
213
+
214
+ @media (min-width: 48em) {
215
+ :host([data-render-mode="shadow"][variant~='label-inline']) .slds-form-element__label {
216
+ float: left;
217
+ max-width: calc(33% - var(--sds-g-sizing-6, 1.25rem)); /* Removing icon width for when the help-text icon is present */
218
+ flex-basis: calc(33% - var(--sds-g-sizing-6, 1.25rem)); /* Some form element controls are set to display:flex */
219
+ flex-grow: 1; /* For IE and Safari which didn't auto expand to the available space */
220
+ margin-block-end: 0;
221
+ position: relative;
222
+ z-index: 1;
223
+ }
224
+
225
+ :host([data-render-mode="shadow"][variant~='label-inline']) lightning-helptext {
226
+ float: left;
227
+ }
228
+
229
+ :host([data-render-mode="shadow"][variant~='label-inline']) .slds-form-element__control {
230
+ margin-inline-start: 33%;
231
+ clear: none; /* Reset clear: left when switching to horizontal form layout */
232
+ }
233
+
234
+ :host([data-render-mode="shadow"][variant~='label-inline']) .slds-form-element__control .slds-form-element__control {
235
+ padding-inline-start: 0; /* Remove left padding on nested form controls, due to issues related to lightning-form components */
236
+ }
237
+
238
+ :host([data-render-mode="shadow"][variant~='label-inline']) .slds-dueling-list__column .slds-form-element__label {
239
+ width: auto;
240
+ max-width: 100%;
241
+ -ms-flex-preferred-size: auto;
242
+ flex-basis: auto;
243
+ float: none;
244
+ position: relative;
245
+ padding-inline-start: 0;
246
+ margin-block-end: 0;
247
+ }
248
+
249
+ :host([data-render-mode="shadow"][variant~='label-inline']) .slds-form-element__help {
250
+ margin-inline-start: 33%;
251
+ }
252
+
253
+ :host([data-render-mode="shadow"][variant~='label-inline']) .slds-dueling-list {
254
+ clear: none;
255
+ }
256
+ }
257
+
258
+ /* --------------------------------------- */
259
+
260
+ /* FORM ELEMENT: COMPOUND */
261
+
262
+ :host([data-render-mode="shadow"]) .slds-form-element_compound .slds-form-element__row {
263
+ display: flex;
264
+ margin-bottom: var(--sds-g-spacing-1, 0.25rem);
265
+ margin-left: calc(var(--sds-g-spacing-1, 0.25rem) * -1);
266
+ margin-right: calc(var(--sds-g-spacing-1, 0.25rem) * -1);
267
+ }
268
+
269
+ :host([data-render-mode="shadow"]) .slds-form-element_compound .slds-form-element__row .slds-form-element__label {
270
+ padding-top: 0;
271
+ }
272
+
273
+ :host([data-render-mode="shadow"]) .slds-form-element_compound .slds-form-element {
274
+ padding-left: var(--sds-g-spacing-1, 0.25rem);
275
+ padding-right: var(--sds-g-spacing-1, 0.25rem);
276
+ }
277
+
278
+ :host([data-render-mode="shadow"]) .slds-form-element_address .slds-form-element__row {
279
+ align-items: flex-end;
280
+ }
281
+ }
@@ -1,4 +1,5 @@
1
1
  import localizationService from './defaultLocalizationConfig';
2
+ import { isCSR } from 'lightning/utilsPrivate';
2
3
 
3
4
  function getConfigFromAura($A) {
4
5
  return {
@@ -34,7 +35,7 @@ function createStandAloneConfig() {
34
35
  }
35
36
 
36
37
  export function getDefaultConfig() {
37
- return window.$A !== undefined && window.$A.localizationService
38
+ return isCSR && window.$A !== undefined && window.$A.localizationService
38
39
  ? getConfigFromAura(window.$A)
39
40
  : createStandAloneConfig();
40
41
  }
@@ -0,0 +1,3 @@
1
+ /* @import 'lightning/sldsCommon';
2
+ @import './input-text.slds.css';
3
+ @import './form-element.slds.css'; */
@@ -1,7 +1,7 @@
1
1
  <template>
2
- <div class="slds-dropdown-trigger slds-dropdown-trigger_click slds-size_1-of-1" role="group">
2
+ <div class="slds-dropdown-trigger slds-dropdown-trigger_click slds-size_1-of-1" role="group" part="input-text">
3
3
  <template if:false={hasExternalLabel}>
4
- <label class={computedLabelClass} for="input">
4
+ <label class={computedLabelClass} for="input" part="label">
5
5
  <template if:true={required}>
6
6
  <abbr class="slds-required" title={i18n.required}>*</abbr>
7
7
  </template>
@@ -12,8 +12,9 @@
12
12
  <template if:true={isRangeMessageVisible}>
13
13
  <span id="range-message" data-range-message class="slds-assistive-text">{rangeMessage}</span>
14
14
  </template>
15
- <div class="slds-form-element__control slds-input-has-icon slds-input-has-icon_right">
15
+ <div class="slds-form-element__control slds-input-has-icon slds-input-has-icon_right" part="input-container">
16
16
  <input type="text" id="input" class="slds-input"
17
+ part="input"
17
18
  name={name}
18
19
  value={displayValue}
19
20
  placeholder={placeholder}
@@ -55,7 +56,9 @@
55
56
  </div>
56
57
  </div>
57
58
 
58
-
59
+ <template if:true={errorMessage}>
59
60
  <div id="error-message" data-error-message class={computedClass} aria-live="assertive">{errorMessage}</div>
61
+ </template>
62
+
60
63
 
61
64
  </template>
@@ -7,7 +7,7 @@ import labelMinAndMaxRangeMessage from '@salesforce/label/LightningDateTimePicke
7
7
  import labelRequired from '@salesforce/label/LightningControl.required';
8
8
  import labelSelectDateFor from '@salesforce/label/LightningDateTimePicker.selectDateFor';
9
9
  import labelHelpTextAlternativeText from '@salesforce/label/LightningInput.helptextAlternativeText';
10
- import { LightningElement, track, api } from 'lwc';
10
+ import { LightningElement, api, track } from 'lwc';
11
11
  import {
12
12
  normalizeISODate,
13
13
  parseFormattedDate,
@@ -27,6 +27,7 @@ import {
27
27
  getRealDOMId,
28
28
  isIE11,
29
29
  computeAriaInvalid,
30
+ reflectAttribute,
30
31
  } from 'lightning/utilsPrivate';
31
32
  import {
32
33
  generateUniqueId,
@@ -37,6 +38,7 @@ import {
37
38
  handleKeyDownOnDatePickerIcon,
38
39
  handleBasicKeyDownBehaviour,
39
40
  } from './keyboard';
41
+ import AriaObserver from 'lightning/ariaObserver';
40
42
 
41
43
  const i18n = {
42
44
  invalidDate: labelInvalidDate,
@@ -94,6 +96,15 @@ export default class LightningDatePicker extends LightningElement {
94
96
 
95
97
  @api messageWhenValueMissing;
96
98
 
99
+ @api
100
+ get rootAriaNode() {
101
+ return this.ariaObserver.root;
102
+ }
103
+
104
+ set rootAriaNode(root) {
105
+ this.ariaObserver.root = root;
106
+ }
107
+
97
108
  @api
98
109
  get min() {
99
110
  return this._min;
@@ -181,7 +192,12 @@ export default class LightningDatePicker extends LightningElement {
181
192
 
182
193
  set ariaLabelledByElement(el) {
183
194
  this._ariaLabelledBy = el;
184
- this.synchronizeA11y();
195
+
196
+ this.ariaObserver.connect({
197
+ attribute: ARIA_LABELLEDBY,
198
+ targetSelector: 'input',
199
+ relatedNodeIds: getRealDOMId(this._ariaLabelledBy),
200
+ });
185
201
  }
186
202
 
187
203
  @api
@@ -191,7 +207,12 @@ export default class LightningDatePicker extends LightningElement {
191
207
 
192
208
  set ariaControlsElement(el) {
193
209
  this._ariaControls = el;
194
- this.synchronizeA11y();
210
+
211
+ this.ariaObserver.connect({
212
+ attribute: ARIA_CONTROLS,
213
+ targetSelector: 'input',
214
+ relatedNodeIds: getRealDOMId(this.ariaControlsElement),
215
+ });
195
216
  }
196
217
 
197
218
  @api
@@ -205,7 +226,7 @@ export default class LightningDatePicker extends LightningElement {
205
226
  } else {
206
227
  this._ariaDescribedBy = [el];
207
228
  }
208
- this.synchronizeA11y();
229
+ this.connectAriaDescribedBy();
209
230
  }
210
231
 
211
232
  @api
@@ -213,12 +234,14 @@ export default class LightningDatePicker extends LightningElement {
213
234
  return this._ariaDescribedBy;
214
235
  }
215
236
 
216
- get ariaLabelledbyId() {
217
- return getRealDOMId(this._ariaLabelledBy);
237
+ @api
238
+ get ariaErrorMessageElement() {
239
+ return this._ariaErrorMessageElement;
218
240
  }
219
241
 
220
- get ariaControlsId() {
221
- return getRealDOMId(this.ariaControlsElement);
242
+ set ariaErrorMessageElement(element) {
243
+ this._ariaErrorMessageElement = element;
244
+ this.connectAriaDescribedBy();
222
245
  }
223
246
 
224
247
  synchronizeA11y() {
@@ -228,9 +251,6 @@ export default class LightningDatePicker extends LightningElement {
228
251
  }
229
252
 
230
253
  synchronizeAttrs(input, {
231
- [ARIA_LABELLEDBY]: this.ariaLabelledbyId,
232
- [ARIA_DESCRIBEDBY]: this.computedAriaDescribedby,
233
- [ARIA_CONTROLS]: this.ariaControlsId,
234
254
  [ARIA_LABEL]: this._ariaLabel,
235
255
  [ARIA_INVALID]: this.computedAriaInvalid,
236
256
  });
@@ -242,6 +262,11 @@ export default class LightningDatePicker extends LightningElement {
242
262
  );
243
263
  calendarButton.ariaDescribedBy =
244
264
  this.computedDatepickerButtonAriaDescribedby;
265
+
266
+ if (this.isConnected) {
267
+ this.connectAriaDescribedBy();
268
+ this.ariaObserver.sync();
269
+ }
245
270
  }
246
271
 
247
272
  renderedCallback() {
@@ -265,6 +290,7 @@ export default class LightningDatePicker extends LightningElement {
265
290
  }
266
291
  set disabled(value) {
267
292
  this._disabled = normalizeBoolean(value);
293
+ reflectAttribute(this, 'disabled', this._disabled);
268
294
  }
269
295
 
270
296
  @api
@@ -273,6 +299,7 @@ export default class LightningDatePicker extends LightningElement {
273
299
  }
274
300
  set readOnly(value) {
275
301
  this._readonly = normalizeBoolean(value);
302
+ reflectAttribute(this, 'readonly', this._readonly);
276
303
  }
277
304
 
278
305
  @api
@@ -299,6 +326,7 @@ export default class LightningDatePicker extends LightningElement {
299
326
 
300
327
  set variant(value) {
301
328
  this._variant = normalizeVariant(value);
329
+ reflectAttribute(this, 'variant', value);
302
330
  }
303
331
 
304
332
  @api
@@ -349,6 +377,7 @@ export default class LightningDatePicker extends LightningElement {
349
377
  constructor() {
350
378
  super();
351
379
  this.uniqueId = generateUniqueId();
380
+ this.ariaObserver = new AriaObserver(this);
352
381
  }
353
382
 
354
383
  connectedCallback() {
@@ -359,6 +388,10 @@ export default class LightningDatePicker extends LightningElement {
359
388
 
360
389
  disconnectedCallback() {
361
390
  this.connected = false;
391
+ if (this.ariaObserver) {
392
+ this.ariaObserver.disconnect();
393
+ this.ariaObserver = undefined;
394
+ }
362
395
  }
363
396
 
364
397
  get i18n() {
@@ -375,9 +408,12 @@ export default class LightningDatePicker extends LightningElement {
375
408
  .toString();
376
409
  }
377
410
 
378
- get computedUniqueErrorMessageElementId() {
379
- const el = this.template.querySelector('[data-error-message]');
380
- return getRealDOMId(el);
411
+ get errorMessageElement() {
412
+ return this.template.querySelector('[data-error-message]');
413
+ }
414
+
415
+ get rangeMessageElement() {
416
+ return this.template.querySelector('[data-range-message]');
381
417
  }
382
418
 
383
419
  get computedUniqueRangeMessageElementId() {
@@ -410,18 +446,24 @@ export default class LightningDatePicker extends LightningElement {
410
446
  return this.disabled || this.readOnly;
411
447
  }
412
448
 
413
- get computedAriaDescribedby() {
414
- const ariaValues = [];
449
+ get ariaErrorMessageElements() {
450
+ const elements = [this.ariaErrorMessageElement];
415
451
 
416
452
  if (this.errorMessage) {
417
- ariaValues.push(this.computedUniqueErrorMessageElementId);
453
+ elements.push(this.errorMessageElement);
418
454
  }
419
455
 
420
456
  // To inform user of valid date ranges that are set via min/max attributes
421
457
  if (this.isRangeMessageVisible) {
422
- ariaValues.push(this.computedUniqueRangeMessageElementId);
458
+ elements.push(this.rangeMessageElement);
423
459
  }
424
460
 
461
+ return elements;
462
+ }
463
+
464
+ get computedAriaDescribedby() {
465
+ const ariaValues = [];
466
+
425
467
  this._ariaDescribedBy.forEach((item) => {
426
468
  const id = getRealDOMId(item);
427
469
  if (id) {
@@ -432,6 +474,15 @@ export default class LightningDatePicker extends LightningElement {
432
474
  return normalizeAriaAttribute(ariaValues);
433
475
  }
434
476
 
477
+ connectAriaDescribedBy() {
478
+ this.ariaObserver.connect({
479
+ attribute: ARIA_DESCRIBEDBY,
480
+ targetSelector: 'input',
481
+ relatedNodeIds: this.computedAriaDescribedby,
482
+ relatedNodes: this.ariaErrorMessageElements,
483
+ });
484
+ }
485
+
435
486
  get computedDatepickerButtonAriaDescribedby() {
436
487
  if (this.isRangeMessageVisible) {
437
488
  return this.computedUniqueRangeMessageElementId;
@@ -604,7 +655,10 @@ export default class LightningDatePicker extends LightningElement {
604
655
  startPositioning() {
605
656
  if (!this._relationship) {
606
657
  this._relationship = startPositioning(this, {
607
- target: () => this.template.querySelector('input'),
658
+ target: () =>
659
+ this.template.querySelector(
660
+ 'div.slds-form-element__control'
661
+ ),
608
662
  element: () =>
609
663
  this.template
610
664
  .querySelector('lightning-calendar')