@brightspace-ui/core 2.97.0 → 2.98.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.
@@ -117,7 +117,6 @@ class ButtonIcon extends ThemeMixin(ButtonMixin(VisibleOnAncestorMixin(RtlMixin(
117
117
  --d2l-icon-fill-color: var(--d2l-button-icon-fill-color-hover, var(--d2l-color-tungsten));
118
118
  background-color: var(--d2l-button-icon-background-color-hover);
119
119
  }
120
- button.focus-visible,
121
120
  button:${unsafeCSS(getFocusPseudoClass())} {
122
121
  box-shadow: var(--d2l-button-icon-focus-box-shadow);
123
122
  }
@@ -22,7 +22,6 @@ export const buttonStyles = css`
22
22
  white-space: nowrap;
23
23
  width: auto;
24
24
  }
25
- button.focus-visible, /* still required for when forceFocusVisible is used programatically */
26
25
  button:${unsafeCSS(getFocusPseudoClass())} {
27
26
  box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px var(--d2l-color-celestine);
28
27
  }
@@ -25,8 +25,6 @@ class CountBadgeIcon extends FocusMixin(CountBadgeMixin(LitElement)) {
25
25
  static get styles() {
26
26
  return [super.styles, css`
27
27
  :host([focus-ring]) d2l-icon,
28
- :host(.focus-visible) d2l-icon,
29
- d2l-icon.focus-visible,
30
28
  :host(:${unsafeCSS(getFocusPseudoClass())}) d2l-icon,
31
29
  d2l-icon:${unsafeCSS(getFocusPseudoClass())} {
32
30
  box-shadow: 0 0 0 2px var(--d2l-color-celestine);
@@ -11,8 +11,6 @@ class CountBadge extends FocusMixin(CountBadgeMixin(LitElement)) {
11
11
  static get styles() {
12
12
  return [super.styles, css`
13
13
  :host([focus-ring]) .d2l-count-badge-wrapper,
14
- :host(.focus-visible) .d2l-count-badge-wrapper,
15
- .d2l-count-badge-wrapper.focus-visible,
16
14
  :host(:${unsafeCSS(getFocusPseudoClass())}) .d2l-count-badge-wrapper,
17
15
  .d2l-count-badge-wrapper:${unsafeCSS(getFocusPseudoClass())} {
18
16
  box-shadow: 0 0 0 2px var(--d2l-color-celestine);
@@ -1,7 +1,6 @@
1
1
  import { css, html, LitElement } from 'lit';
2
2
  import { DialogMixin } from './dialog-mixin.js';
3
3
  import { dialogStyles } from './dialog-styles.js';
4
- import { forceFocusVisible } from '../../helpers/focus.js';
5
4
  import { getUniqueId } from '../../helpers/uniqueId.js';
6
5
  import { heading3Styles } from '../typography/styles.js';
7
6
 
@@ -106,7 +105,7 @@ class DialogConfirm extends DialogMixin(LitElement) {
106
105
  const node = nodes[i];
107
106
  if (node.nodeType !== Node.ELEMENT_NODE) continue;
108
107
  if (!node.hasAttribute('primary')) {
109
- forceFocusVisible(node);
108
+ this._focusElemOrDescendant(node);
110
109
  return;
111
110
  }
112
111
  }
@@ -3,7 +3,7 @@ import '../../helpers/viewport-size.js';
3
3
  import { allowBodyScroll, preventBodyScroll } from '../backdrop/backdrop.js';
4
4
  import { clearDismissible, setDismissible } from '../../helpers/dismissible.js';
5
5
  import { findComposedAncestor, isComposedAncestor } from '../../helpers/dom.js';
6
- import { forceFocusVisible, getComposedActiveElement, getNextFocusable, isFocusVisibleApplied, tryApplyFocus } from '../../helpers/focus.js';
6
+ import { getComposedActiveElement, getFirstFocusableDescendant, getNextFocusable, isFocusable } from '../../helpers/focus.js';
7
7
  import { classMap } from 'lit/directives/class-map.js';
8
8
  import { getUniqueId } from '../../helpers/uniqueId.js';
9
9
  import { html } from 'lit';
@@ -201,13 +201,20 @@ export const DialogMixin = superclass => class extends RtlMixin(superclass) {
201
201
  return autofocusElement;
202
202
  }
203
203
 
204
+ _focusElemOrDescendant(elem) {
205
+ if (!isFocusable(elem, false, false)) {
206
+ elem = getFirstFocusableDescendant(elem);
207
+ }
208
+ if (elem) elem.focus();
209
+ }
210
+
204
211
  _focusFirst() {
205
212
  if (!this.shadowRoot) return;
206
213
  const content = this.shadowRoot.querySelector('.d2l-dialog-content');
207
214
  if (content) {
208
215
  const elementToFocus = this._findAutofocusElement(content) ?? getNextFocusable(content);
209
216
  if (isComposedAncestor(this.shadowRoot.querySelector('.d2l-dialog-inner'), elementToFocus)) {
210
- forceFocusVisible(elementToFocus, false);
217
+ this._focusElemOrDescendant(elementToFocus);
211
218
  return;
212
219
  }
213
220
  }
@@ -219,7 +226,7 @@ export const DialogMixin = superclass => class extends RtlMixin(superclass) {
219
226
  const header = this.shadowRoot.querySelector('.d2l-dialog-header');
220
227
  if (header) {
221
228
  const firstFocusable = getNextFocusable(header);
222
- if (firstFocusable) forceFocusVisible(firstFocusable);
229
+ if (firstFocusable) this._focusElemOrDescendant(firstFocusable);
223
230
  }
224
231
  }
225
232
 
@@ -231,7 +238,7 @@ export const DialogMixin = superclass => class extends RtlMixin(superclass) {
231
238
  if (this._opener && this._opener.focus) {
232
239
  // wait for inactive focus trap
233
240
  requestAnimationFrame(() => {
234
- tryApplyFocus(this._opener);
241
+ this._tryApplyFocus(this._opener);
235
242
  this._opener = null;
236
243
  });
237
244
  }
@@ -410,8 +417,7 @@ export const DialogMixin = superclass => class extends RtlMixin(superclass) {
410
417
  // edge case: no children were focused, try again after one redraw
411
418
  const activeElement = getComposedActiveElement();
412
419
  if (!activeElement
413
- || !isComposedAncestor(dialog, activeElement)
414
- || !isFocusVisibleApplied(activeElement)) {
420
+ || !isComposedAncestor(dialog, activeElement)) {
415
421
  // wait till the dialog is visible for Safari
416
422
  requestAnimationFrame(() => this._focusInitial());
417
423
  }
@@ -495,6 +501,17 @@ export const DialogMixin = superclass => class extends RtlMixin(superclass) {
495
501
 
496
502
  }
497
503
 
504
+ _tryApplyFocus(focusable) {
505
+ if (!isFocusable(focusable)) {
506
+ focusable = findComposedAncestor(focusable, (node) => (isFocusable(node) || getFirstFocusableDescendant(node) !== null));
507
+ if (focusable === null) return;
508
+ if (!isFocusable(focusable)) {
509
+ focusable = getFirstFocusableDescendant(focusable);
510
+ }
511
+ }
512
+ if (isFocusable(focusable)) focusable.focus();
513
+ }
514
+
498
515
  _updateOverflow() {
499
516
  if (!this.shadowRoot) return;
500
517
  const content = this.shadowRoot.querySelector('.d2l-dialog-content');
@@ -101,7 +101,6 @@ export const htmlBlockContentStyles = css`
101
101
  color: var(--d2l-color-celestine-minus-1, #004489);
102
102
  text-decoration: underline;
103
103
  }
104
- a.focus-visible,
105
104
  a:${unsafeCSS(getFocusPseudoClass())} {
106
105
  border-radius: 2px;
107
106
  outline: 2px solid var(--d2l-color-celestine, #006fbf);
@@ -213,7 +213,6 @@ class InputColor extends FocusMixin(FormElementMixin(LocalizeCoreElement(LitElem
213
213
  .readonly-wrapper:focus {
214
214
  outline: none;
215
215
  }
216
- .readonly-wrapper.focus-visible,
217
216
  .readonly-wrapper:${unsafeCSS(getFocusPseudoClass())} {
218
217
  box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px var(--d2l-color-celestine);
219
218
  }
@@ -14,7 +14,6 @@ import { getUniqueId } from '../../helpers/uniqueId.js';
14
14
  import { ifDefined } from 'lit/directives/if-defined.js';
15
15
  import { LabelledMixin } from '../../mixins/labelled-mixin.js';
16
16
  import { LocalizeCoreElement } from '../../helpers/localize-core-element.js';
17
- import ResizeObserver from 'resize-observer-polyfill/dist/ResizeObserver.es.js';
18
17
  import { SkeletonMixin } from '../skeleton/skeleton-mixin.js';
19
18
  import { styleMap } from 'lit/directives/style-map.js';
20
19
 
@@ -195,26 +194,36 @@ class InputDate extends FocusMixin(LabelledMixin(SkeletonMixin(FormElementMixin(
195
194
 
196
195
  this._textInput = this.shadowRoot.querySelector('d2l-input-text');
197
196
 
197
+ const hiddenContent = this.shadowRoot.querySelector('.d2l-input-date-hidden-text');
198
+ const tryUpdateHiddenContentWidth = () => {
199
+ const width = Math.ceil(parseFloat(getComputedStyle(hiddenContent).getPropertyValue('width')));
200
+ if (isNaN(width)) return false; // hidden elements will have "auto" width
201
+ this._hiddenContentWidth = `${width}px`;
202
+ return true;
203
+ };
204
+
198
205
  this.addEventListener('blur', this._handleBlur);
199
206
  this.addEventListener('d2l-localize-resources-change', () => {
200
207
  this._dateTimeDescriptor = getDateTimeDescriptorShared(true);
201
208
  this.requestUpdate();
202
- this.updateComplete.then(() => {
203
- const width = Math.ceil(parseFloat(getComputedStyle(this.shadowRoot.querySelector('.d2l-input-date-hidden-text')).getPropertyValue('width')));
204
- this._hiddenContentWidth = `${width}px`;
205
- });
209
+ this.updateComplete.then(() => tryUpdateHiddenContentWidth());
206
210
  });
207
211
 
208
212
  this._formattedValue = this.emptyText ? this.emptyText : '';
209
213
 
210
214
  await (document.fonts ? document.fonts.ready : Promise.resolve());
211
215
 
212
- const hiddenContent = this.shadowRoot.querySelector('.d2l-input-date-hidden-text');
213
- this._hiddenContentResizeObserver = new ResizeObserver(() => {
214
- const width = Math.ceil(parseFloat(getComputedStyle(hiddenContent).getPropertyValue('width')));
215
- this._hiddenContentWidth = `${width}px`;
216
- });
217
- this._hiddenContentResizeObserver.observe(hiddenContent);
216
+ // resize observer needed to handle case where it's initially hidden
217
+ if (!tryUpdateHiddenContentWidth()) {
218
+ this._hiddenContentResizeObserver = new ResizeObserver(() => {
219
+ if (tryUpdateHiddenContentWidth()) {
220
+ this._hiddenContentResizeObserver.disconnect();
221
+ this._hiddenContentResizeObserver = null;
222
+ }
223
+ });
224
+ this._hiddenContentResizeObserver.observe(hiddenContent);
225
+ }
226
+
218
227
  }
219
228
 
220
229
  render() {
@@ -15,7 +15,6 @@ import { inputLabelStyles } from './input-label-styles.js';
15
15
  import { inputStyles } from './input-styles.js';
16
16
  import { LabelledMixin } from '../../mixins/labelled-mixin.js';
17
17
  import { offscreenStyles } from '../offscreen/offscreen.js';
18
- import ResizeObserver from 'resize-observer-polyfill/dist/ResizeObserver.es.js';
19
18
  import { SkeletonMixin } from '../skeleton/skeleton-mixin.js';
20
19
 
21
20
  const MIDNIGHT = new Date(2020, 0, 1, 0, 0, 0);
@@ -271,18 +270,38 @@ class InputTime extends FocusMixin(LabelledMixin(SkeletonMixin(FormElementMixin(
271
270
  }
272
271
 
273
272
  const hiddenContent = this.shadowRoot.querySelector('.d2l-input-time-hidden-content');
273
+ const tryUpdateHiddenContentWidth = () => {
274
+ const width = Math.ceil(parseFloat(getComputedStyle(hiddenContent).getPropertyValue('width')));
275
+ if (isNaN(width)) return false; // hidden elements will have "auto" width
276
+ this._hiddenContentWidth = `${width}px`;
277
+ /** @ignore */
278
+ this.dispatchEvent(new CustomEvent(
279
+ 'd2l-input-time-hidden-content-width-change',
280
+ { bubbles: true, composed: false }
281
+ ));
282
+ return true;
283
+ };
284
+
274
285
  this.addEventListener('d2l-localize-resources-change', async() => {
275
286
  await this.updateComplete;
276
287
  this._formattedValue = formatTime(getDateFromISOTime(this.value));
277
288
  INTERVALS.clear();
278
289
  this.requestUpdate();
279
- this.updateComplete.then(() => this._onResize(hiddenContent));
290
+ this.updateComplete.then(() => tryUpdateHiddenContentWidth());
280
291
  });
281
292
 
282
293
  await (document.fonts ? document.fonts.ready : Promise.resolve());
283
294
 
284
- this._hiddenContentResizeObserver = new ResizeObserver(() => this._onResize(hiddenContent));
285
- this._hiddenContentResizeObserver.observe(hiddenContent);
295
+ // resize observer needed to handle case where it's initially hidden
296
+ if (!tryUpdateHiddenContentWidth()) {
297
+ this._hiddenContentResizeObserver = new ResizeObserver(() => {
298
+ if (tryUpdateHiddenContentWidth()) {
299
+ this._hiddenContentResizeObserver.disconnect();
300
+ this._hiddenContentResizeObserver = null;
301
+ }
302
+ });
303
+ this._hiddenContentResizeObserver.observe(hiddenContent);
304
+ }
286
305
 
287
306
  }
288
307
 
@@ -428,15 +447,5 @@ class InputTime extends FocusMixin(LabelledMixin(SkeletonMixin(FormElementMixin(
428
447
  }
429
448
  }
430
449
 
431
- _onResize(hiddenContent) {
432
- const width = Math.ceil(parseFloat(getComputedStyle(hiddenContent).getPropertyValue('width')));
433
- this._hiddenContentWidth = `${width}px`;
434
-
435
- /** @ignore */
436
- this.dispatchEvent(new CustomEvent(
437
- 'd2l-input-time-hidden-content-width-change',
438
- { bubbles: true, composed: false }
439
- ));
440
- }
441
450
  }
442
451
  customElements.define('d2l-input-time', InputTime);
@@ -20,7 +20,6 @@ export const linkStyles = css`
20
20
  color: var(--d2l-color-celestine-minus-1);
21
21
  text-decoration: underline;
22
22
  }
23
- .d2l-link.focus-visible,
24
23
  .d2l-link:${unsafeCSS(getFocusPseudoClass())} {
25
24
  border-radius: 2px;
26
25
  outline: 2px solid var(--d2l-color-celestine);
@@ -21,8 +21,6 @@ export const menuItemStyles = css`
21
21
  color: var(--d2l-menu-foreground-color-hover);
22
22
  }
23
23
 
24
- :host(.focus-visible),
25
- :host([first].focus-visible),
26
24
  :host(:${unsafeCSS(getFocusPseudoClass())}),
27
25
  :host([first]:${unsafeCSS(getFocusPseudoClass())}) {
28
26
  border-radius: 6px;
@@ -38,7 +36,6 @@ export const menuItemStyles = css`
38
36
  opacity: 0.75;
39
37
  }
40
38
 
41
- :host([disabled].focus-visible),
42
39
  :host([disabled]:${unsafeCSS(getFocusPseudoClass())}) {
43
40
  cursor: default;
44
41
  opacity: 0.75;
@@ -59,7 +59,6 @@ class ScrollWrapper extends RtlMixin(LitElement) {
59
59
  overflow-x: auto;
60
60
  overflow-y: var(--d2l-scroll-wrapper-overflow-y, visible);
61
61
  }
62
- .d2l-scroll-wrapper-container.focus-visible,
63
62
  .d2l-scroll-wrapper-container:${unsafeCSS(getFocusPseudoClass())} {
64
63
  box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px var(--d2l-color-celestine), 0 2px 12px 0 rgba(0, 0, 0, 0.15);
65
64
  }
@@ -59,7 +59,6 @@ export const SwitchMixin = superclass => class extends FocusMixin(RtlMixin(super
59
59
  padding: 0.1rem;
60
60
  vertical-align: middle;
61
61
  }
62
- .d2l-switch-container.focus-visible,
63
62
  .d2l-switch-container:${unsafeCSS(getFocusPseudoClass())} {
64
63
  border-color: var(--d2l-color-celestine);
65
64
  }
@@ -63,7 +63,6 @@ class Tab extends RtlMixin(LitElement) {
63
63
  margin-left: 0.6rem;
64
64
  margin-right: 0;
65
65
  }
66
- :host(.focus-visible) > .d2l-tab-text,
67
66
  :host(:${unsafeCSS(getFocusPseudoClass())}) > .d2l-tab-text {
68
67
  border-radius: 0.3rem;
69
68
  box-shadow: 0 0 0 2px var(--d2l-color-celestine);
@@ -182,16 +182,13 @@ class Tabs extends LocalizeCoreElement(ArrowKeysMixin(RtlMixin(LitElement))) {
182
182
  border: 0;
183
183
  }
184
184
  .d2l-tabs-scroll-button[disabled]:hover,
185
- .d2l-tabs-scroll-button[disabled].focus-visible,
186
185
  .d2l-tabs-scroll-button[disabled]:${unsafeCSS(getFocusPseudoClass())} {
187
186
  background-color: transparent;
188
187
  }
189
188
  .d2l-tabs-scroll-button:hover,
190
- .d2l-tabs-scroll-button.focus-visible,
191
189
  .d2l-tabs-scroll-button:${unsafeCSS(getFocusPseudoClass())} {
192
190
  background-color: var(--d2l-color-gypsum);
193
191
  }
194
- .d2l-tabs-scroll-button.focus-visible,
195
192
  .d2l-tabs-scroll-button:${unsafeCSS(getFocusPseudoClass())} {
196
193
  box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px var(--d2l-color-celestine);
197
194
  }
@@ -68,7 +68,7 @@
68
68
  <d2l-tag-list-item text="Example 9"></d2l-tag-list-item>
69
69
  </d2l-tag-list>
70
70
  <script type="module">
71
- import { forceFocusVisible, getNextFocusable } from '../../../helpers/focus.js';
71
+ import { getNextFocusable } from '../../../helpers/focus.js';
72
72
 
73
73
  document.addEventListener('d2l-tag-list-item-clear', (e) => {
74
74
  e.target.parentNode.removeChild(e.target);
@@ -82,7 +82,7 @@
82
82
  e.target.removeChild(tag);
83
83
  });
84
84
  // consumer must move focus someplace logical
85
- forceFocusVisible(nextFocusable);
85
+ nextFocusable?.focus();
86
86
  });
87
87
  </script>
88
88
  </d2l-demo-snippet>
@@ -60,7 +60,6 @@ class TooltipHelp extends SkeletonMixin(FocusMixin(LitElement)) {
60
60
  #d2l-tooltip-help-text:focus {
61
61
  outline-style: none;
62
62
  }
63
- #d2l-tooltip-help-text.focus-visible,
64
63
  #d2l-tooltip-help-text:${unsafeCSS(getFocusPseudoClass())} {
65
64
  border-radius: 0.05rem;
66
65
  outline: 2px solid var(--d2l-color-celestine);
@@ -1,5 +1,5 @@
1
1
  import { directive, PartType } from 'lit/directive.js';
2
- import { getComposedActiveElement, getNextFocusable, isFocusVisibleApplied } from '../../helpers/focus.js';
2
+ import { getComposedActiveElement, getNextFocusable, isFocusVisibleSupported } from '../../helpers/focus.js';
3
3
  import { AsyncDirective } from 'lit/async-directive.js';
4
4
  import { isComposedAncestor } from '../../helpers/dom.js';
5
5
  import { noChange } from 'lit';
@@ -10,6 +10,11 @@ const showTransitionDuration = 300;
10
10
  const hideTransitionDuration = 200;
11
11
  const moveYValue = 20;
12
12
 
13
+ function isFocusVisibleApplied(node) {
14
+ if (!node) return false;
15
+ return isFocusVisibleSupported() && node.parentNode?.querySelector(':focus-visible') === node;
16
+ }
17
+
13
18
  class AnimationState {
14
19
 
15
20
  constructor(partInfo) {
package/helpers/README.md CHANGED
@@ -120,9 +120,6 @@ Focus helper functions to easily select focusable DOM nodes
120
120
  ```js
121
121
  import { ... } from '@brightspace-ui/core/helpers/focus.js';
122
122
 
123
- // focuses on an element and forces a visible focus ring
124
- forceFocusVisible(node);
125
-
126
123
  // gets the active element, including shadow DOM active elements
127
124
  getComposedActiveElement()
128
125
 
@@ -130,9 +127,9 @@ getComposedActiveElement()
130
127
  getFirstFocusableDescendant(node, includeHidden, predicate, includeTabbablesOnly)
131
128
 
132
129
  // gets the focus pseudo-class to used in selectors (focus-visible if supported, or focus)
133
- // Always also include `.focus-visible` as a selector, to support `forceFocusVisible`. Usage:
130
+ // Usage:
134
131
  // css`
135
- // some-element.focus-visible, some-element:${unsafeCSS(getFocusPseudoClass())} { ... }
132
+ // some-element:${unsafeCSS(getFocusPseudoClass())} { ... }
136
133
  // `
137
134
  getFocusPseudoClass()
138
135
 
@@ -151,15 +148,8 @@ getPreviousFocusableAncestor(node, includeHidden, includeTabbablesOnly)
151
148
  // returns true/false whether the element is focusable
152
149
  isFocusable(node, includeHidden, includeTabbablesOnly, includeDisabled)
153
150
 
154
- // returns true/false whether the element has :focus-visible or .focus-visible applied
155
- isFocusVisibleApplied(node)
156
-
157
151
  // returns true/false whether the :focus-visible is supported
158
152
  isFocusVisibleSupported()
159
-
160
- // returns true and focuses on node or its nearest focusable ancestor;
161
- // or false if node and its ancestors are not focusable
162
- tryApplyFocus(node)
163
153
  ```
164
154
 
165
155
  ## Gesture - Swipe
package/helpers/focus.js CHANGED
@@ -1,4 +1,4 @@
1
- import { findComposedAncestor, getComposedChildren, getComposedParent, getNextAncestorSibling, getPreviousAncestorSibling, isVisible } from './dom.js';
1
+ import { getComposedChildren, getComposedParent, getNextAncestorSibling, getPreviousAncestorSibling, isVisible } from './dom.js';
2
2
 
3
3
  const focusableElements = {
4
4
  a: true,
@@ -13,18 +13,6 @@ const focusableElements = {
13
13
  textarea: true
14
14
  };
15
15
 
16
- export function forceFocusVisible(elem, includeTabbablesOnly) {
17
- if (!isFocusable(elem, false, includeTabbablesOnly)) {
18
- elem = getFirstFocusableDescendant(elem);
19
- }
20
- if (!elem) return;
21
- elem.addEventListener('blur', () => {
22
- elem.classList.remove('focus-visible');
23
- }, { once: true });
24
- elem.classList.add('focus-visible');
25
- elem.focus();
26
- }
27
-
28
16
  export function getComposedActiveElement() {
29
17
  let node = document.activeElement;
30
18
 
@@ -186,12 +174,6 @@ export function isFocusable(node, includeHidden, includeTabbablesOnly, includeDi
186
174
 
187
175
  }
188
176
 
189
- export function isFocusVisibleApplied(node) {
190
- if (!node) return false;
191
- if (node.classList.contains('focus-visible')) return true;
192
- return isFocusVisibleSupported() && node.parentNode?.querySelector(':focus-visible') === node;
193
- }
194
-
195
177
  let _isFocusVisibleSupported;
196
178
 
197
179
  export function isFocusVisibleSupported() {
@@ -210,16 +192,3 @@ export function isFocusVisibleSupported() {
210
192
 
211
193
  return _isFocusVisibleSupported;
212
194
  }
213
-
214
- export function tryApplyFocus(elem) {
215
- if (isFocusable(elem)) {
216
- forceFocusVisible(elem);
217
- return true;
218
- }
219
- const focusable = findComposedAncestor(elem, (node) => (isFocusable(node) || getFirstFocusableDescendant(node) !== null));
220
- if (focusable) {
221
- forceFocusVisible(focusable);
222
- return true;
223
- }
224
- return false;
225
- }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brightspace-ui/core",
3
- "version": "2.97.0",
3
+ "version": "2.98.1",
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",
@@ -742,8 +742,6 @@ class TemplatePrimarySecondary extends RtlMixin(LocalizeCoreElement(LitElement))
742
742
  display: inline-block;
743
743
  width: 0.1rem;
744
744
  }
745
- .d2l-template-primary-secondary-divider.focus-visible .d2l-template-primary-secondary-divider-handle-right,
746
- .d2l-template-primary-secondary-divider.focus-visible .d2l-template-primary-secondary-divider-handle-left,
747
745
  .d2l-template-primary-secondary-divider:${unsafeCSS(getFocusPseudoClass())} .d2l-template-primary-secondary-divider-handle-right,
748
746
  .d2l-template-primary-secondary-divider:${unsafeCSS(getFocusPseudoClass())} .d2l-template-primary-secondary-divider-handle-left {
749
747
  display: block;
@@ -777,8 +775,6 @@ class TemplatePrimarySecondary extends RtlMixin(LocalizeCoreElement(LitElement))
777
775
  background-color: var(--d2l-color-mica);
778
776
  box-shadow: none;
779
777
  }
780
- :host([resizable]) .d2l-template-primary-secondary-divider.focus-visible,
781
- :host([resizable][dir="rtl"]) .d2l-template-primary-secondary-divider.focus-visible,
782
778
  :host([resizable]) .d2l-template-primary-secondary-divider:${unsafeCSS(getFocusPseudoClass())},
783
779
  :host([resizable][dir="rtl"]) .d2l-template-primary-secondary-divider:${unsafeCSS(getFocusPseudoClass())} {
784
780
  background-color: var(--d2l-color-celestine);
@@ -789,8 +785,6 @@ class TemplatePrimarySecondary extends RtlMixin(LocalizeCoreElement(LitElement))
789
785
  .d2l-template-primary-secondary-divider:hover .d2l-template-primary-secondary-divider-handle-line::after {
790
786
  background-color: var(--d2l-color-ferrite);
791
787
  }
792
- .d2l-template-primary-secondary-divider.focus-visible .d2l-template-primary-secondary-divider-handle-line::before,
793
- .d2l-template-primary-secondary-divider.focus-visible .d2l-template-primary-secondary-divider-handle-line::after,
794
788
  .d2l-template-primary-secondary-divider:${unsafeCSS(getFocusPseudoClass())} .d2l-template-primary-secondary-divider-handle-line::before,
795
789
  .d2l-template-primary-secondary-divider:${unsafeCSS(getFocusPseudoClass())} .d2l-template-primary-secondary-divider-handle-line::after {
796
790
  background-color: white;
@@ -919,14 +913,12 @@ class TemplatePrimarySecondary extends RtlMixin(LocalizeCoreElement(LitElement))
919
913
  height: 1rem;
920
914
  width: 2.2rem;
921
915
  }
922
- .d2l-template-primary-secondary-divider.focus-visible .d2l-template-primary-secondary-divider-handle,
923
916
  .d2l-template-primary-secondary-divider:${unsafeCSS(getFocusPseudoClass())} .d2l-template-primary-secondary-divider-handle {
924
917
  box-shadow: none;
925
918
  height: 1.2rem;
926
919
  right: 17px;
927
920
  width: 2.6rem;
928
921
  }
929
- :host([dir="rtl"]) .d2l-template-primary-secondary-divider.focus-visible .d2l-template-primary-secondary-divider-handle,
930
922
  :host([dir="rtl"]) .d2l-template-primary-secondary-divider:${unsafeCSS(getFocusPseudoClass())} .d2l-template-primary-secondary-divider-handle {
931
923
  left: 17px;
932
924
  right: auto;
@@ -935,7 +927,6 @@ class TemplatePrimarySecondary extends RtlMixin(LocalizeCoreElement(LitElement))
935
927
  color: white;
936
928
  display: block;
937
929
  }
938
- .d2l-template-primary-secondary-divider.focus-visible .d2l-template-primary-secondary-divider-handle-mobile,
939
930
  .d2l-template-primary-secondary-divider:${unsafeCSS(getFocusPseudoClass())} .d2l-template-primary-secondary-divider-handle-mobile {
940
931
  box-shadow: 0 0 0 0.1rem white, 0 0 0 0.2rem var(--d2l-color-celestine);
941
932
  right: 0.2rem;