@brightspace-ui/core 2.180.7 → 2.180.9

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.
@@ -172,8 +172,8 @@ export const TagListItemMixin = superclass => class extends LocalizeCoreElement(
172
172
  }
173
173
 
174
174
  await this.updateComplete;
175
-
176
- container.focus();
175
+ // delay the focus to allow focusin to fire
176
+ setTimeout(() => container.focus());
177
177
  });
178
178
 
179
179
  this.addEventListener('keydown', this._handleKeydown);
@@ -1,10 +1,10 @@
1
1
  import '../button/button-subtle.js';
2
2
  import { css, html, LitElement } from 'lit';
3
+ import { getOffsetParent, isComposedAncestor } from '../../helpers/dom.js';
3
4
  import { announce } from '../../helpers/announce.js';
4
5
  import { ArrowKeysMixin } from '../../mixins/arrow-keys/arrow-keys-mixin.js';
5
6
  import { classMap } from 'lit/directives/class-map.js';
6
7
  import { getComposedActiveElement } from '../../helpers/focus.js';
7
- import { getOffsetParent } from '../../helpers/dom.js';
8
8
  import { InteractiveMixin } from '../../mixins/interactive/interactive-mixin.js';
9
9
  import { LocalizeCoreElement } from '../../helpers/localize-core-element.js';
10
10
  import ResizeObserver from 'resize-observer-polyfill/dist/ResizeObserver.es.js';
@@ -109,6 +109,7 @@ class TagList extends LocalizeCoreElement(InteractiveMixin(ArrowKeysMixin(LitEle
109
109
  this._listContainerObserver = null;
110
110
  this._resizeObserver = null;
111
111
  this._showHiddenTags = false;
112
+ this._refocus = null;
112
113
  }
113
114
 
114
115
  disconnectedCallback() {
@@ -197,7 +198,7 @@ class TagList extends LocalizeCoreElement(InteractiveMixin(ArrowKeysMixin(LitEle
197
198
  aria-roledescription="${this.localize('components.tag-list.role-description')}"
198
199
  @d2l-tag-list-item-clear="${this._handleItemDeleted}"
199
200
  @d2l-tag-list-item-tooltip-show="${this._handleKeyboardTooltipShown}">
200
- <slot @slotchange="${this._handleSlotChange}"></slot>
201
+ <slot @slotchange="${this._handleSlotChange}" @focusout="${this._handleSlotFocusOut}" @focusin="${this._handleSlotFocusIn}"></slot>
201
202
  ${overflowButton}
202
203
  <d2l-button-subtle
203
204
  class="${classMap(clearableClasses)}"
@@ -219,9 +220,10 @@ class TagList extends LocalizeCoreElement(InteractiveMixin(ArrowKeysMixin(LitEle
219
220
  <d2l-button-subtle aria-hidden="true" slim text="${this.localize('components.tag-list.num-hidden', { count: '##' })}" class="d2l-tag-list-hidden-button"></d2l-button-subtle>
220
221
  ${this.arrowKeysContainer(list)}
221
222
  </div>
222
- `, this.localize('components.tag-list.interactive-label', { count: this._items ? this._items.length : 0 }),
223
+ `,
224
+ this.localize('components.tag-list.interactive-label', { count: this._items ? this._items.length : 0 }),
223
225
  () => {
224
- if (this._items && this._items.length > 0) this._items[0].focus();
226
+ this._items?.[0]?.focus?.();
225
227
  }
226
228
  );
227
229
  }
@@ -350,9 +352,11 @@ class TagList extends LocalizeCoreElement(InteractiveMixin(ArrowKeysMixin(LitEle
350
352
  const itemIndex = children.indexOf(rootTarget);
351
353
 
352
354
  if (children.length <= 1) return;
353
- const focusableElem = children[itemIndex - 1] || children[itemIndex + 1];
354
355
 
355
- setTimeout(() => focusableElem.focus(), this.clearFocusTimeout);
356
+ setTimeout(() => {
357
+ const focusableElem = children[itemIndex - 1] || (children[itemIndex] === e.target ? children[itemIndex + 1] : children[itemIndex]);
358
+ focusableElem.focus();
359
+ }, this.clearFocusTimeout);
356
360
  }
357
361
 
358
362
  _handleKeyboardTooltipShown() {
@@ -406,7 +410,22 @@ class TagList extends LocalizeCoreElement(InteractiveMixin(ArrowKeysMixin(LitEle
406
410
  this._items[0].setAttribute('keyboard-tooltip-item', true);
407
411
  if (this._hasShownKeyboardTooltip) this._items[0].setAttribute('keyboard-tooltip-shown', true);
408
412
  await this.updateComplete;
409
- refocus.focus?.();
413
+ if (this._refocus?.classList.contains('d2l-tag-list-button')) {
414
+ this._refocus = this.shadowRoot.querySelector('.d2l-tag-list-button');
415
+ }
416
+ await this._refocus?.updateComplete;
417
+ (this._refocus || refocus).focus?.();
418
+ this._refocus = null;
419
+ }
420
+
421
+ _handleSlotFocusIn() {
422
+ this._items[0].setAttribute('tabindex', '-1');
423
+ }
424
+
425
+ _handleSlotFocusOut(e) {
426
+ if (!isComposedAncestor(e.currentTarget, e.relatedTarget)) {
427
+ this._items[0].setAttribute('tabindex', '0');
428
+ }
410
429
  }
411
430
 
412
431
  async _toggleHiddenTagVisibility(e) {
@@ -417,10 +436,11 @@ class TagList extends LocalizeCoreElement(InteractiveMixin(ArrowKeysMixin(LitEle
417
436
  const isMoreButton = e.target.classList.contains('d2l-tag-list-button-show-more');
418
437
  await this.updateComplete;
419
438
  if (isMoreButton) {
420
- this._items[this._chompIndex].focus();
439
+ this._refocus = this._items[this._chompIndex];
421
440
  } else {
422
- this.shadowRoot.querySelector('.d2l-tag-list-button')?.focus();
441
+ this._refocus = this.shadowRoot.querySelector('.d2l-tag-list-button');
423
442
  }
443
+ this._refocus.focus();
424
444
  }
425
445
  }
426
446
 
@@ -582,18 +582,17 @@ class Tooltip extends RtlMixin(LitElement) {
582
582
  this._openDir = space.dir;
583
583
 
584
584
  // Compute the x and y position of the tooltip relative to its target
585
- let parentTop;
586
- let parentLeft;
585
+ let offsetTop, offsetLeft;
587
586
  if (offsetParent && offsetParent.tagName !== 'BODY') {
588
- const parentRect = offsetParent.getBoundingClientRect();
589
- parentTop = parentRect.top + offsetParent.clientTop;
590
- parentLeft = parentRect.left + offsetParent.clientLeft;
587
+ const offsetRect = offsetParent.getBoundingClientRect();
588
+ offsetTop = offsetRect.top + offsetParent.clientTop - offsetParent.scrollTop;
589
+ offsetLeft = offsetRect.left + offsetParent.clientLeft - offsetParent.scrollLeft;
591
590
  } else {
592
- parentTop = -document.documentElement.scrollTop;
593
- parentLeft = -document.documentElement.scrollLeft;
591
+ offsetTop = -document.documentElement.scrollTop;
592
+ offsetLeft = -document.documentElement.scrollLeft;
594
593
  }
595
- const top = targetRect.top - parentTop;
596
- const left = targetRect.left - parentLeft;
594
+ const top = targetRect.top - offsetTop;
595
+ const left = targetRect.left - offsetLeft;
597
596
 
598
597
  let positionRect;
599
598
  if (this._isAboveOrBelow()) {
@@ -699,18 +698,18 @@ class Tooltip extends RtlMixin(LitElement) {
699
698
  });
700
699
 
701
700
  if (this.boundary && offsetParent) {
702
- const parentRect = offsetParent.getBoundingClientRect();
701
+ const offsetRect = offsetParent.getBoundingClientRect();
703
702
  if (!isNaN(this.boundary.left)) {
704
- spaceAround.left = Math.min(targetRect.left - parentRect.left - this.boundary.left, spaceAround.left);
703
+ spaceAround.left = Math.min(targetRect.left - offsetRect.left - this.boundary.left, spaceAround.left);
705
704
  }
706
705
  if (!isNaN(this.boundary.right)) {
707
- spaceAround.right = Math.min(parentRect.right - targetRect.right - this.boundary.right, spaceAround.right);
706
+ spaceAround.right = Math.min(offsetRect.right - targetRect.right - this.boundary.right, spaceAround.right);
708
707
  }
709
708
  if (!isNaN(this.boundary.top)) {
710
- spaceAround.above = Math.min(targetRect.top - parentRect.top - this.boundary.top, spaceAround.above);
709
+ spaceAround.above = Math.min(targetRect.top - offsetRect.top - this.boundary.top, spaceAround.above);
711
710
  }
712
711
  if (!isNaN(this.boundary.bottom)) {
713
- spaceAround.below = Math.min(parentRect.bottom - targetRect.bottom - this.boundary.bottom, spaceAround.below);
712
+ spaceAround.below = Math.min(offsetRect.bottom - targetRect.bottom - this.boundary.bottom, spaceAround.below);
714
713
  }
715
714
  }
716
715
  const isRTL = this.getAttribute('dir') === 'rtl';
@@ -729,8 +728,9 @@ class Tooltip extends RtlMixin(LitElement) {
729
728
  if (this.for) {
730
729
  const targetSelector = `#${cssEscape(this.for)}`;
731
730
  target = ownerRoot.querySelector(targetSelector);
732
- target = target || (ownerRoot && ownerRoot.host && ownerRoot.host.querySelector(targetSelector));
731
+ target = target || ownerRoot?.host?.querySelector(targetSelector);
733
732
  } else {
733
+ console.warn('<d2l-tooltip>: missing required attribute "for"');
734
734
  const parentNode = this.parentNode;
735
735
  target = parentNode.nodeType === Node.DOCUMENT_FRAGMENT_NODE ? ownerRoot.host : parentNode;
736
736
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brightspace-ui/core",
3
- "version": "2.180.7",
3
+ "version": "2.180.9",
4
4
  "description": "A collection of accessible, free, open-source web components for building Brightspace applications",
5
5
  "type": "module",
6
6
  "repository": "https://github.com/BrightspaceUI/core.git",