@brightspace-ui/core 1.197.3 → 1.197.4

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.
@@ -117,6 +117,7 @@ If the dropdown is initially empty when it's opened, the dropdown pointer will n
117
117
  | `disabled` | Boolean, default: `false` | Disables the dropdown opener |
118
118
  | `no-auto-open` | Boolean, default: `false` | Prevents the dropdown from opening automatically on click or on key press |
119
119
  | `primary` | Boolean, default: `false` | Optionally render button as primary button |
120
+ | `open-on-hover` | Boolean, default: `false` | Optionally open dropdown on click or hover action |
120
121
  <!-- docs: end hidden content -->
121
122
 
122
123
  ## Opener: Button Subtle [d2l-dropdown-button-subtle]
@@ -160,6 +161,7 @@ If the dropdown is initially empty when it's opened, the dropdown pointer will n
160
161
  | `description` | String | A description to be added to the inner `button` opener for accessibility |
161
162
  | `disabled` | Boolean, default: `false` | Disables the dropdown opener |
162
163
  | `no-auto-open` | Boolean, default: `false` | Prevents the dropdown from automatically on click or on key press |
164
+ | `open-on-hover` | Boolean, default: `false` | Optionally open dropdown on click or hover action |
163
165
  <!-- docs: end hidden content -->
164
166
 
165
167
  ### Accessibility Properties
@@ -209,6 +211,7 @@ To make your `d2l-dropdown-button-subtle` accessible, use the following properti
209
211
  |---|---|---|
210
212
  | `disabled` | Boolean, default: `false` | Disables the dropdown opener |
211
213
  | `no-auto-open` | Boolean, default: `false` | Prevents the dropdown from opening automatically on click or on key press |
214
+ | `open-on-hover` | Boolean, default: `false` | Optionally open dropdown on click or hover action |
212
215
  | `text` | String | Used as `aria-label` for the button |
213
216
  | `translucent` | Boolean, default: `false` | Attribute for busy/rich backgrounds |
214
217
  | `visible-on-ancestor` | Boolean, default: `false` | See [visible-on-ancestor-mixin](../../mixins/visible-on-ancestor-mixin.md) for more details on configuring that behavior |
@@ -261,6 +264,7 @@ To make your usage of `d2l-dropdown-context-menu` accessible, use the following
261
264
  |---|---|---|
262
265
  | `disabled` | Boolean, default: `false` | Disables the dropdown opener |
263
266
  | `no-auto-open` | Boolean, default: `false` | Prevents the dropdown from opening automatically on click or key press |
267
+ | `open-on-hover` | Boolean, default: `false` | Optionally open dropdown on click or hover action |
264
268
  | `text` | String | Used as `aria-label` for the button |
265
269
  | `translucent` | Boolean, default: `false` | Attribute for busy/rich backgrounds |
266
270
  | `visible-on-ancestor` | Boolean, default: `false` | See [visible-on-ancestor-mixin](../../mixins/visible-on-ancestor-mixin.md) for more details on configuring that behavior |
@@ -65,6 +65,36 @@
65
65
  </template>
66
66
  </d2l-demo-snippet>
67
67
 
68
+ <h2>Dropdown Button Opener (open-on-hover Option)</h2>
69
+ <d2l-demo-snippet>
70
+ <template>
71
+ <d2l-dropdown-button text="Open!" open-on-hover>
72
+ <d2l-dropdown-content mobile-tray="right">
73
+ <div slot="header">
74
+ <h3>Scrolling is Fun</h3>
75
+ </div>
76
+ <a href="https://youtu.be/9ze87zQFSak">Google</a>
77
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
78
+ magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
79
+ commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
80
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
81
+ anim id est laborum.Vestibulum vel sem non orci pretium fringilla sed eget augue. Vestibulum malesuada tortor
82
+ vitae odio elementum eleifend. Quisque ligula quam, ornare id malesuada ut, malesuada eleifend sem. Nulla porta
83
+ in arcu quis gravida. Duis ac sagittis felis, in condimentum libero. In dolor risus, semper vel iaculis vitae,
84
+ pellentesque efficitur lorem. Nunc a lacus malesuada, rhoncus risus aliquam, sodales nulla. Sed in varius elit.
85
+ Duis sagittis, turpis ut vehicula elementum, velit mi tincidunt turpis, sit amet sagittis quam urna ut justo.
86
+ Nunc interdum urna augue, ac pretium dui pulvinar eu. Proin vehicula placerat est, sed venenatis purus viverra
87
+ eget. Suspendisse imperdiet nulla eget velit sodales, sit amet tempus metus dignissim. Sed ac luctus leo, a
88
+ ornare nisl. Proin non sapien eu orci gravida aliquam. Praesent placerat auctor lacus sit amet faucibus.
89
+ Suspendisse sit amet dui sed turpis vestibulum dignissim.</p>
90
+ <div slot="footer">
91
+ <a href="http://www.desire2learn.com">D2L</a>
92
+ </div>
93
+ </d2l-dropdown-content>
94
+ </d2l-dropdown-button>
95
+ </template>
96
+ </d2l-demo-snippet>
97
+
68
98
  </d2l-demo-page>
69
99
 
70
100
  </body>
@@ -172,6 +172,19 @@ export const dropdownContentStyles = css`
172
172
  text-align: right;
173
173
  }
174
174
 
175
+ :host(.d2l-dropdown-content-fading) {
176
+ opacity: 0;
177
+ /* matches DropdownOpenerMixin _closeTimerStart function */
178
+ transition: opacity 0.4s ease-out 0.3s;
179
+ }
180
+
181
+ @media (prefers-reduced-motion: reduce) {
182
+ :host(.d2l-dropdown-content-fading) {
183
+ opacity: 1;
184
+ transition: none;
185
+ }
186
+ }
187
+
175
188
  @media (prefers-reduced-motion: reduce) {
176
189
  :host([opened]), :host([opened-above]) {
177
190
  animation: none !important;
@@ -1,3 +1,6 @@
1
+ import { getUniqueId } from '../../helpers/uniqueId.js';
2
+ import { isComposedAncestor } from '../../helpers/dom.js';
3
+
1
4
  export const DropdownOpenerMixin = superclass => class extends superclass {
2
5
 
3
6
  static get properties() {
@@ -27,6 +30,19 @@ export const DropdownOpenerMixin = superclass => class extends superclass {
27
30
  reflect: true,
28
31
  attribute: 'no-auto-open'
29
32
  },
33
+
34
+ /**
35
+ * Optionally open dropdown on click or hover action
36
+ * @type {boolean}
37
+ */
38
+ openOnHover: {
39
+ type: Boolean,
40
+ attribute: 'open-on-hover'
41
+ },
42
+ _isHovering: { type: Boolean },
43
+ _isOpen: { type: Boolean },
44
+ _isOpenedViaClick: { type: Boolean },
45
+ _isFading: { type: Boolean }
30
46
  };
31
47
  }
32
48
 
@@ -34,36 +50,52 @@ export const DropdownOpenerMixin = superclass => class extends superclass {
34
50
  super();
35
51
  this.dropdownOpener = true;
36
52
  this.noAutoOpen = false;
53
+ this.openOnHover = false;
37
54
  this.disabled = false;
38
55
 
39
- this.__onKeyPress = this.__onKeyPress.bind(this);
56
+ // hover option
57
+ this._dismissTimerId = getUniqueId();
58
+ this._isOpen = false;
59
+ this._isOpenedViaClick = false;
60
+ this._isHovering = false;
61
+ this._isFading = false;
62
+
63
+ this.__onWholeKeypress = this.__onKeypress.bind(this);
40
64
  this.__onMouseUp = this.__onMouseUp.bind(this);
65
+ this.__onMouseEnter = this.__onMouseEnter.bind(this);
66
+ this.__onMouseLeave = this.__onMouseLeave.bind(this);
67
+ this.__onTouchStart = this.__onTouchStart.bind(this);
68
+ this._contentRendered = null;
69
+ this._openerRendered = null;
41
70
  }
42
71
 
43
72
  connectedCallback() {
44
73
  super.connectedCallback();
45
74
 
46
- requestAnimationFrame(() => {
47
- const opener = this.getOpenerElement();
48
- const content = this.__getContentElement();
49
- if (!opener) {
50
- return;
51
- }
52
- opener.setAttribute('aria-haspopup', 'true');
53
- opener.addEventListener('keypress', this.__onKeyPress);
54
- opener.addEventListener('mouseup', this.__onMouseUp);
55
- opener.setAttribute('aria-expanded', (content && content.opened || false).toString());
56
- });
75
+ // listeners
76
+ this.addEventListener('keypress', this.__onKeypress);
77
+ this.addEventListener('mouseup', this.__onMouseUp);
78
+ this.addEventListener('mouseenter', this.__onMouseEnter);
79
+ this.addEventListener('mouseleave', this.__onMouseLeave);
80
+ this.addEventListener('touchstart', this.__onTouchStart);
81
+
82
+ if (this.openOnHover) {
83
+ document.body.addEventListener('mouseup', this._onOutsideClick);
84
+ }
57
85
  }
58
86
 
59
87
  disconnectedCallback() {
60
88
  super.disconnectedCallback();
61
- const opener = this.getOpenerElement();
62
- if (!opener) {
63
- return;
89
+
90
+ this.removeEventListener('keypress', this.__onKeypress);
91
+ this.removeEventListener('mouseup', this.__onMouseUp);
92
+ this.removeEventListener('mouseenter', this.__onMouseEnter);
93
+ this.removeEventListener('mouseleave', this.__onMouseLeave);
94
+ this.removeEventListener('touchstart', this.__onTouchStart);
95
+
96
+ if (this.openOnHover) {
97
+ document.body.removeEventListener('mouseup', this._onOutsideClick);
64
98
  }
65
- opener.removeEventListener('keypress', this.__onKeyPress);
66
- opener.removeEventListener('mouseup', this.__onMouseUp);
67
99
  }
68
100
 
69
101
  firstUpdated(changedProperties) {
@@ -71,6 +103,38 @@ export const DropdownOpenerMixin = superclass => class extends superclass {
71
103
 
72
104
  this.addEventListener('d2l-dropdown-open', this.__onOpened);
73
105
  this.addEventListener('d2l-dropdown-close', this.__onClosed);
106
+
107
+ const opener = this.getOpenerElement();
108
+ const content = this.__getContentElement();
109
+ if (!opener) {
110
+ return;
111
+ }
112
+ opener.setAttribute('aria-haspopup', 'true');
113
+ opener.setAttribute('aria-expanded', (content && content.opened || false).toString());
114
+ }
115
+
116
+ updated(changedProperties) {
117
+ super.updated(changedProperties);
118
+ if (!this.openOnHover || !changedProperties.has('_isFading')) return;
119
+
120
+ if (this._isFading) {
121
+ this.__getContentElement()?.classList.add('d2l-dropdown-content-fading');
122
+ } else {
123
+ this.__getContentElement()?.classList.remove('d2l-dropdown-content-fading');
124
+ }
125
+ }
126
+
127
+ /* used by open-on-hover option */
128
+ async closeDropdown(fadeOut) {
129
+ this._isOpen = false;
130
+ this._isHovering = false;
131
+ this._isOpenedViaClick = false;
132
+ if (fadeOut) {
133
+ this._closeTimerStart();
134
+ return;
135
+ }
136
+ const dropdownContent = this.__getContentElement();
137
+ await dropdownContent.close();
74
138
  }
75
139
 
76
140
  focus() {
@@ -89,6 +153,15 @@ export const DropdownOpenerMixin = superclass => class extends superclass {
89
153
  return this;
90
154
  }
91
155
 
156
+ /* used by open-on-hover option */
157
+ async openDropdown(applyFocus) {
158
+ this._isOpen = true;
159
+ const dropdownContent = this.__getContentElement();
160
+ if (!dropdownContent) return;
161
+ await dropdownContent.open(applyFocus);
162
+ await dropdownContent.updateComplete;
163
+ }
164
+
92
165
  toggleOpen(applyFocus) {
93
166
  if (this.disabled) {
94
167
  return;
@@ -113,17 +186,52 @@ export const DropdownOpenerMixin = superclass => class extends superclass {
113
186
  }
114
187
  opener.setAttribute('aria-expanded', 'false');
115
188
  opener.removeAttribute('active');
189
+ this._isOpen = false;
190
+ this._isOpenedViaClick = false;
116
191
  }
117
192
 
118
- __onKeyPress(e) {
119
- if (e.keyCode !== 13 && e.keyCode !== 32) return;
120
- if (this.noAutoOpen) return;
121
- this.toggleOpen(true);
193
+ /* used by open-on-hover option */
194
+ __onDropdownMouseEnter() {
195
+ this._isOpen = true;
196
+ this._isFading = false;
197
+ this._closeTimerStop();
122
198
  }
123
199
 
124
- __onMouseUp() {
125
- if (this.noAutoOpen) return;
126
- this.toggleOpen(false);
200
+ /* used by open-on-hover option */
201
+ __onDropdownMouseLeave(e) {
202
+ if (this.__getContentElement() !== e.target) return;
203
+ if (!this._isOpenedViaClick) this._isOpen = false;
204
+ this._closeTimerStart();
205
+ }
206
+
207
+ __onKeypress(e) {
208
+ if (isComposedAncestor(e.srcElement, this.getOpenerElement())) {
209
+ this.__onOpenerKeyPress(e);
210
+ }
211
+ }
212
+
213
+ __onMouseEnter(e) {
214
+ if (!this.openOnHover) return;
215
+ if (isComposedAncestor(e.srcElement, this.getOpenerElement())) {
216
+ this.__onOpenerMouseEnter(e);
217
+ } else if (isComposedAncestor(this.__getContentElement(), e.srcElement)) {
218
+ this.__onDropdownMouseEnter(e);
219
+ }
220
+ }
221
+
222
+ __onMouseLeave(e) {
223
+ if (!this.openOnHover) return;
224
+ if (isComposedAncestor(e.srcElement, this.getOpenerElement())) {
225
+ this.__onOpenerMouseLeave(e);
226
+ } else if (isComposedAncestor(this.__getContentElement(), e.srcElement)) {
227
+ this.__onDropdownMouseLeave(e);
228
+ }
229
+ }
230
+
231
+ __onMouseUp(e) {
232
+ if (isComposedAncestor(e.srcElement, this.getOpenerElement())) {
233
+ this.__onOpenerMouseUp(e);
234
+ }
127
235
  }
128
236
 
129
237
  __onOpened() {
@@ -133,6 +241,109 @@ export const DropdownOpenerMixin = superclass => class extends superclass {
133
241
  }
134
242
  opener.setAttribute('aria-expanded', 'true');
135
243
  opener.setAttribute('active', 'true');
244
+ this._isFading = false;
245
+ }
246
+
247
+ __onOpenerKeyPress(e) {
248
+ if (e.keyCode !== 13 && e.keyCode !== 32) return;
249
+ if (this.noAutoOpen) return;
250
+ if (!this.openOnHover) {
251
+ this.toggleOpen(true);
252
+ } else {
253
+ this._closeTimerStop();
254
+ e.preventDefault();
255
+ this._isOpenedViaClick = true;
256
+ this.openDropdown(true);
257
+ }
258
+ }
259
+
260
+ /* used by open-on-hover option */
261
+ async __onOpenerMouseEnter() {
262
+ // do not respond to hover events on mobile screens
263
+ const dropdownContent = this.__getContentElement();
264
+ if (dropdownContent._useMobileStyling) return;
265
+ clearTimeout(this._dismissTimerId);
266
+ if (!this._isOpen) await this.openDropdown(false);
267
+ this._closeTimerStop();
268
+ this._isHovering = true;
269
+ }
270
+
271
+ /* used by open-on-hover option */
272
+ async __onOpenerMouseLeave() {
273
+ // do not respond to hover events on mobile screens
274
+ const dropdownContent = this.__getContentElement();
275
+ if (dropdownContent._useMobileStyling) return;
276
+ this._isHovering = false;
277
+ if (this._isOpenedViaClick) return;
278
+ //Wait before closing so we don't lose hover when we jump from opener to card
279
+ clearTimeout(this._dismissTimerId);
280
+ await this.closeDropdown(true);
281
+ }
282
+
283
+ __onOpenerMouseUp(e) {
284
+ if (this.noAutoOpen) return;
285
+ if (this.openOnHover) {
286
+ // prevent propogation to window and triggering _onOutsideClick
287
+ e?.stopPropagation();
288
+ this._closeTimerStop();
289
+ if (this._isOpen && !this._isHovering) {
290
+ this.closeDropdown();
291
+ } else {
292
+ this._isOpenedViaClick = true;
293
+ this._isHovering = false;
294
+ this.openDropdown(true);
295
+ }
296
+ } else this.toggleOpen(false);
297
+ }
298
+
299
+ /* used by open-on-hover option */
300
+ __onOpenerTouch(e) {
301
+ //Prevents touch from triggering mouseover/hover behavior
302
+ e.preventDefault();
303
+ this._closeTimerStop();
304
+ if (this._isOpen) {
305
+ this.closeDropdown();
306
+ }
307
+ else {
308
+ this._isOpenedViaClick = true;
309
+ this.openDropdown(true);
310
+ }
136
311
  }
137
312
 
313
+ __onTouchStart(e) {
314
+ if (!this.openOnHover) return;
315
+ if (isComposedAncestor(e.srcElement, this.getOpenerElement())) {
316
+ this.__onOpenerTouch(e);
317
+ }
318
+ }
319
+
320
+ /* used by open-on-hover option */
321
+ _closeTimerStart() {
322
+ if (this._isOpen) return;
323
+ clearTimeout(this._setTimeoutId);
324
+ this._isFading = true;
325
+ this._setTimeoutId = setTimeout(() => {
326
+ this.closeDropdown(false);
327
+ this._isFading = false;
328
+ // matches dropdownContentStyles CSS
329
+ }, 700);
330
+ }
331
+
332
+ /* used by open-on-hover option */
333
+ _closeTimerStop() {
334
+ clearTimeout(this._setTimeoutId);
335
+ this._isFading = false;
336
+ }
337
+
338
+ /* used by open-on-hover option */
339
+ _onOutsideClick(e) {
340
+ if (!this._isOpen) return;
341
+ const isWithinDropdown = isComposedAncestor(this.__getContentElement(), e.composedPath()[0]);
342
+ const isBackdropClick = isWithinDropdown
343
+ && this.__getContentElement()._useMobileStyling
344
+ && e.composedPath().find(node => node.nodeName === 'D2L-BACKDROP');
345
+ if (!isWithinDropdown || isBackdropClick) {
346
+ this.closeDropdown();
347
+ }
348
+ }
138
349
  };
@@ -14,7 +14,7 @@ size:xlarge
14
14
  </script>
15
15
  <script>
16
16
  window.addEventListener('load', function () {
17
- const demoElem = document.querySelector('#demo-element');
17
+ var demoElem = document.querySelector('#demo-element');
18
18
  if (!demoElem.hasAttribute('data-first-load')) return;
19
19
 
20
20
  setTimeout(function() {
@@ -63,7 +63,7 @@ size:xlarge
63
63
  <!-- docs: start hidden content -->
64
64
  <script>
65
65
  window.addEventListener('load', function () {
66
- const demoElem = document.querySelector('#demo-element');
66
+ var demoElem = document.querySelector('#demo-element');
67
67
  if (!demoElem.hasAttribute('data-first-load')) return;
68
68
 
69
69
  setTimeout(function() {
@@ -131,7 +131,7 @@ size:xlarge
131
131
  <!-- docs: start hidden content -->
132
132
  <script>
133
133
  window.addEventListener('load', function () {
134
- const demoElem = document.querySelector('#demo-element');
134
+ var demoElem = document.querySelector('#demo-element');
135
135
  if (!demoElem.hasAttribute('data-first-load')) return;
136
136
 
137
137
  setTimeout(function() {
@@ -205,7 +205,7 @@ size:large
205
205
  <!-- docs: start hidden content -->
206
206
  <script>
207
207
  window.addEventListener('load', function () {
208
- const demoElem = document.querySelector('#demo-element');
208
+ var demoElem = document.querySelector('#demo-element');
209
209
  if (!demoElem.hasAttribute('data-first-load')) return;
210
210
 
211
211
  setTimeout(function() {
@@ -273,7 +273,7 @@ size:large
273
273
  <!-- docs: start hidden content -->
274
274
  <script>
275
275
  window.addEventListener('load', function () {
276
- const demoElem = document.querySelector('#demo-element');
276
+ var demoElem = document.querySelector('#demo-element');
277
277
  if (!demoElem.hasAttribute('data-first-load')) return;
278
278
 
279
279
  setTimeout(function() {
@@ -343,7 +343,7 @@ size:xlarge
343
343
  <!-- docs: start hidden content -->
344
344
  <script>
345
345
  window.addEventListener('load', function () {
346
- const demoElem = document.querySelector('#demo-element');
346
+ var demoElem = document.querySelector('#demo-element');
347
347
  if (!demoElem.hasAttribute('data-first-load')) return;
348
348
 
349
349
  setTimeout(function() {
@@ -412,7 +412,7 @@ size:xlarge
412
412
  <!-- docs: start hidden content -->
413
413
  <script>
414
414
  window.addEventListener('load', function () {
415
- const demoElem = document.querySelector('#demo-element');
415
+ var demoElem = document.querySelector('#demo-element');
416
416
  if (!demoElem.hasAttribute('data-first-load')) return;
417
417
 
418
418
  setTimeout(function() {
@@ -1686,6 +1686,12 @@
1686
1686
  "type": "boolean",
1687
1687
  "default": "false"
1688
1688
  },
1689
+ {
1690
+ "name": "open-on-hover",
1691
+ "description": "Optionally open dropdown on click or hover action",
1692
+ "type": "boolean",
1693
+ "default": "false"
1694
+ },
1689
1695
  {
1690
1696
  "name": "disabled",
1691
1697
  "description": "Disables the dropdown opener",
@@ -1718,6 +1724,13 @@
1718
1724
  "type": "boolean",
1719
1725
  "default": "false"
1720
1726
  },
1727
+ {
1728
+ "name": "openOnHover",
1729
+ "attribute": "open-on-hover",
1730
+ "description": "Optionally open dropdown on click or hover action",
1731
+ "type": "boolean",
1732
+ "default": "false"
1733
+ },
1721
1734
  {
1722
1735
  "name": "disabled",
1723
1736
  "attribute": "disabled",
@@ -1755,6 +1768,12 @@
1755
1768
  "type": "boolean",
1756
1769
  "default": "false"
1757
1770
  },
1771
+ {
1772
+ "name": "open-on-hover",
1773
+ "description": "Optionally open dropdown on click or hover action",
1774
+ "type": "boolean",
1775
+ "default": "false"
1776
+ },
1758
1777
  {
1759
1778
  "name": "disabled",
1760
1779
  "description": "Disables the dropdown opener",
@@ -1788,6 +1807,13 @@
1788
1807
  "type": "boolean",
1789
1808
  "default": "false"
1790
1809
  },
1810
+ {
1811
+ "name": "openOnHover",
1812
+ "attribute": "open-on-hover",
1813
+ "description": "Optionally open dropdown on click or hover action",
1814
+ "type": "boolean",
1815
+ "default": "false"
1816
+ },
1791
1817
  {
1792
1818
  "name": "disabled",
1793
1819
  "attribute": "disabled",
@@ -2087,6 +2113,12 @@
2087
2113
  "type": "boolean",
2088
2114
  "default": "false"
2089
2115
  },
2116
+ {
2117
+ "name": "open-on-hover",
2118
+ "description": "Optionally open dropdown on click or hover action",
2119
+ "type": "boolean",
2120
+ "default": "false"
2121
+ },
2090
2122
  {
2091
2123
  "name": "disabled",
2092
2124
  "description": "Disables the dropdown opener",
@@ -2120,6 +2152,13 @@
2120
2152
  "type": "boolean",
2121
2153
  "default": "false"
2122
2154
  },
2155
+ {
2156
+ "name": "openOnHover",
2157
+ "attribute": "open-on-hover",
2158
+ "description": "Optionally open dropdown on click or hover action",
2159
+ "type": "boolean",
2160
+ "default": "false"
2161
+ },
2123
2162
  {
2124
2163
  "name": "disabled",
2125
2164
  "attribute": "disabled",
@@ -2424,6 +2463,12 @@
2424
2463
  "type": "boolean",
2425
2464
  "default": "false"
2426
2465
  },
2466
+ {
2467
+ "name": "open-on-hover",
2468
+ "description": "Optionally open dropdown on click or hover action",
2469
+ "type": "boolean",
2470
+ "default": "false"
2471
+ },
2427
2472
  {
2428
2473
  "name": "disabled",
2429
2474
  "description": "Disables the dropdown opener",
@@ -2457,6 +2502,13 @@
2457
2502
  "type": "boolean",
2458
2503
  "default": "false"
2459
2504
  },
2505
+ {
2506
+ "name": "openOnHover",
2507
+ "attribute": "open-on-hover",
2508
+ "description": "Optionally open dropdown on click or hover action",
2509
+ "type": "boolean",
2510
+ "default": "false"
2511
+ },
2460
2512
  {
2461
2513
  "name": "disabled",
2462
2514
  "attribute": "disabled",
@@ -2750,6 +2802,12 @@
2750
2802
  "type": "boolean",
2751
2803
  "default": "false"
2752
2804
  },
2805
+ {
2806
+ "name": "open-on-hover",
2807
+ "description": "Optionally open dropdown on click or hover action",
2808
+ "type": "boolean",
2809
+ "default": "false"
2810
+ },
2753
2811
  {
2754
2812
  "name": "disabled",
2755
2813
  "description": "Disables the dropdown opener",
@@ -2770,6 +2828,13 @@
2770
2828
  "type": "boolean",
2771
2829
  "default": "false"
2772
2830
  },
2831
+ {
2832
+ "name": "openOnHover",
2833
+ "attribute": "open-on-hover",
2834
+ "description": "Optionally open dropdown on click or hover action",
2835
+ "type": "boolean",
2836
+ "default": "false"
2837
+ },
2773
2838
  {
2774
2839
  "name": "disabled",
2775
2840
  "attribute": "disabled",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brightspace-ui/core",
3
- "version": "1.197.3",
3
+ "version": "1.197.4",
4
4
  "description": "A collection of accessible, free, open-source web components for building Brightspace applications",
5
5
  "repository": "https://github.com/BrightspaceUI/core.git",
6
6
  "publishConfig": {