@brightspace-ui/core 3.233.0 → 3.234.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.
@@ -1,14 +1,17 @@
1
1
  import '../colors/colors.js';
2
2
  import '../loading-spinner/loading-spinner.js';
3
+ import '../offscreen/offscreen.js';
3
4
  import { css, html, LitElement, nothing } from 'lit';
4
5
  import { getComposedChildren, getComposedParent } from '../../helpers/dom.js';
6
+ import { LocalizeCoreElement } from '../../helpers/localize-core-element.js';
7
+ import { PropertyRequiredMixin } from '../../mixins/property-required/property-required-mixin.js';
5
8
  import { styleMap } from 'lit/directives/style-map.js';
6
9
 
7
10
  const BACKDROP_DELAY_MS = 800;
8
11
  const FADE_DURATION_MS = 500;
9
12
  const SPINNER_DELAY_MS = FADE_DURATION_MS;
13
+ const LOADING_ANNOUNCEMENT_DELAY = 1000;
10
14
 
11
- const LOADING_SPINNER_MINIMUM_BUFFER = 100;
12
15
  const LOADING_SPINNER_SIZE = 50;
13
16
 
14
17
  const reduceMotion = matchMedia('(prefers-reduced-motion: reduce)').matches;
@@ -16,7 +19,7 @@ const reduceMotion = matchMedia('(prefers-reduced-motion: reduce)').matches;
16
19
  /**
17
20
  * A component for displaying a semi-transparent backdrop and a loading spinner over the containing element
18
21
  */
19
- class LoadingBackdrop extends LitElement {
22
+ class LoadingBackdrop extends PropertyRequiredMixin(LocalizeCoreElement(LitElement)) {
20
23
 
21
24
  static get properties() {
22
25
  return {
@@ -29,15 +32,16 @@ class LoadingBackdrop extends LitElement {
29
32
  * Used to identify content that the backdrop should make inert
30
33
  * @type {boolean}
31
34
  */
32
- for: { type: String },
35
+ for: { type: String, required: true },
33
36
  _state: { type: String, reflect: true },
34
- _spinnerTop: { state: true }
37
+ _spinnerTop: { state: true },
38
+ _ariaContent: { state: true }
35
39
  };
36
40
  }
37
41
 
38
42
  static get styles() {
39
43
  return css`
40
- :host {
44
+ #visible {
41
45
  display: none;
42
46
  height: 100%;
43
47
  justify-content: center;
@@ -46,9 +50,9 @@ class LoadingBackdrop extends LitElement {
46
50
  width: 100%;
47
51
  z-index: 999;
48
52
  }
49
- :host([_state="showing"]),
50
- :host([_state="shown"]),
51
- :host([_state="hiding"]) {
53
+ :host([_state="showing"]) #visible,
54
+ :host([_state="shown"]) #visible,
55
+ :host([_state="hiding"]) #visible {
52
56
  display: flex;
53
57
  }
54
58
 
@@ -58,20 +62,23 @@ class LoadingBackdrop extends LitElement {
58
62
  opacity: 0;
59
63
  position: absolute;
60
64
  top: 0;
61
- transition: opacity ${FADE_DURATION_MS}ms ease-in;
62
65
  width: 100%;
63
66
  }
64
67
  :host([_state="shown"]) .backdrop {
65
68
  opacity: 0.7;
69
+ transition: opacity ${FADE_DURATION_MS}ms ease-in;
70
+ }
71
+ :host([_state="hiding"]) .backdrop {
72
+ transition: opacity ${FADE_DURATION_MS}ms ease-out;
66
73
  }
67
74
 
68
75
  d2l-loading-spinner {
69
76
  opacity: 0;
70
77
  position: absolute;
71
- transition: opacity ${FADE_DURATION_MS}ms ease-in ${SPINNER_DELAY_MS}ms;
72
78
  }
73
79
  :host([_state="shown"]) d2l-loading-spinner {
74
80
  opacity: 1;
81
+ transition: opacity ${FADE_DURATION_MS}ms ease-in ${SPINNER_DELAY_MS}ms;
75
82
  }
76
83
 
77
84
  :host([_state="hiding"]) .d2l-backdrop,
@@ -89,14 +96,19 @@ class LoadingBackdrop extends LitElement {
89
96
  super();
90
97
  this.shown = false;
91
98
  this._state = 'hidden';
92
- this._spinnerTop = LOADING_SPINNER_MINIMUM_BUFFER;
99
+ this._spinnerTop = 0;
100
+ this._ariaContent = '';
93
101
  }
94
102
 
95
103
  render() {
96
- if (this._state === 'hidden') return nothing;
97
104
  return html`
98
- <div class="backdrop" @transitionend="${this.#handleTransitionEnd}" @transitioncancel="${this.#hide}"></div>
99
- <d2l-loading-spinner style=${styleMap({ top: `${this._spinnerTop}px` })} size="${LOADING_SPINNER_SIZE}"></d2l-loading-spinner>
105
+ ${this._state === 'hidden' ? nothing :
106
+ html`<div id="visible">
107
+ <div class="backdrop" @transitionend="${this.#handleTransitionEnd}" @transitioncancel="${this.#handleTransitionEnd}"></div>
108
+ <d2l-loading-spinner style=${styleMap({ top: `${this._spinnerTop}px` })} size="${LOADING_SPINNER_SIZE}"></d2l-loading-spinner>
109
+ </div>`
110
+ }
111
+ <d2l-offscreen aria-live="polite">${this._ariaContent}</d2l-offscreen>
100
112
  `;
101
113
  }
102
114
  updated(changedProperties) {
@@ -116,9 +128,12 @@ class LoadingBackdrop extends LitElement {
116
128
  }
117
129
  willUpdate(changedProperties) {
118
130
  if (changedProperties.has('shown')) {
131
+ this.#clearLiveArea();
119
132
  if (this.shown) {
133
+ this.#setLiveArea(this.localize('components.backdrop-loading.loadingAnnouncement'), { delay: LOADING_ANNOUNCEMENT_DELAY });
120
134
  this.#show();
121
135
  } else if (changedProperties.get('shown') !== undefined) {
136
+ this.#setLiveArea(this.localize('components.backdrop-loading.loadingCompleteAnnouncement'));
122
137
  this.#fade();
123
138
  }
124
139
  }
@@ -130,13 +145,13 @@ class LoadingBackdrop extends LitElement {
130
145
  const loadingSpinner = this.shadowRoot.querySelector('d2l-loading-spinner');
131
146
  if (!loadingSpinner) { return; }
132
147
 
133
- const boundingRect = this.getBoundingClientRect();
148
+ const boundingRect = this.shadowRoot.querySelector('#visible').getBoundingClientRect();
134
149
 
135
150
  // Calculate the centerpoint of the visible portion of the element
136
151
  const upperVisibleBound = Math.max(0, boundingRect.top);
137
152
  const lowerVisibleBound = Math.min(window.innerHeight, boundingRect.bottom);
138
153
  const visibleHeight = lowerVisibleBound - upperVisibleBound;
139
- const centeringOffset = visibleHeight / 2;
154
+ const centeringOffset = (visibleHeight / 4);
140
155
 
141
156
  // Calculate if an offset is required to move to the top of the viewport before centering
142
157
  const topOffset = Math.max(0, -boundingRect.top); // measures the distance below the top of the viewport, which is negative if the element starts above the viewport
@@ -144,8 +159,17 @@ class LoadingBackdrop extends LitElement {
144
159
  // Adjust for the size of the spinner
145
160
  const spinnerSizeOffset = LOADING_SPINNER_SIZE / 2;
146
161
 
147
- const newPosition = centeringOffset + topOffset - spinnerSizeOffset;
148
- this._spinnerTop = Math.max(LOADING_SPINNER_MINIMUM_BUFFER, newPosition);
162
+ this._spinnerTop = centeringOffset + topOffset - spinnerSizeOffset;
163
+ }
164
+
165
+ #clearLiveArea() {
166
+ this._ariaContent = '';
167
+
168
+ if (this.announcementTimeout) {
169
+ clearTimeout(this.announcementTimeout);
170
+ }
171
+
172
+ this.announcementTimeout = null;
149
173
  }
150
174
 
151
175
  #fade() {
@@ -164,15 +188,15 @@ class LoadingBackdrop extends LitElement {
164
188
  #getBackdropTarget() {
165
189
  const parent = getComposedParent(this);
166
190
 
167
- if (!this.for) { return parent; }
168
-
169
191
  const targetedChildren = getComposedChildren(
170
192
  parent,
171
193
  (elem) => elem.id === this.for,
172
194
  false
173
195
  );
174
196
 
175
- return targetedChildren.length === 0 ? parent : targetedChildren[0];
197
+ if (targetedChildren.length === 0) { throw new Error(`Backdrop cannot find sibling identified by 'for' property with value ${this.for}`);}
198
+
199
+ return targetedChildren[0];
176
200
  }
177
201
  #handleTransitionEnd() {
178
202
  if (this._state === 'hiding') {
@@ -186,6 +210,9 @@ class LoadingBackdrop extends LitElement {
186
210
 
187
211
  if (containingBlock.dataset.initiallyInert !== '1') containingBlock.removeAttribute('inert');
188
212
  }
213
+ #setLiveArea(content, { delay } = {}) {
214
+ this.announcementTimeout = setTimeout(() => this._ariaContent = content, delay || 0);
215
+ }
189
216
  #show() {
190
217
  this._state = reduceMotion ? 'shown' : 'showing';
191
218
 
@@ -217,6 +217,10 @@ function formatCSSVariable([key, value]) {
217
217
  else return `${key}: ${value};`;
218
218
  }
219
219
 
220
+ function isCustomPropertyDefined(rule, name) {
221
+ return rule.style.getPropertyValue(name).trim() !== '';
222
+ }
223
+
220
224
  function resolvePrimitive(variableName, variables) {
221
225
  const value = variables.get(variableName);
222
226
  if (!value) return;
@@ -248,9 +252,7 @@ if (globalThis.document !== undefined && !globalThis.document.head.querySelector
248
252
  /* primary accent */
249
253
  --d2l-color-primary-accent-action: var(--d2l-color-celestine);
250
254
  --d2l-color-primary-accent-indicator: var(--d2l-color-carnelian);
251
- }
252
255
 
253
- html {
254
256
  ${lightCSS}
255
257
  }
256
258
  html[data-color-mode="dark"] {
@@ -270,17 +272,22 @@ if (globalThis.document !== undefined && !globalThis.document.head.querySelector
270
272
  globalThis.document.head.appendChild(style);
271
273
  }
272
274
 
275
+ const lightRule = style.sheet.cssRules[0];
276
+ const darkRule = style.sheet.cssRules[1];
277
+ const osRule = style.sheet.cssRules[2].cssRules[0];
278
+
273
279
  export function registerSemanticVariableForSvgImageUrl(name, value) {
274
280
  if (!name || typeof value !== 'string') {
275
281
  throw new TypeError('registerSemanticVariableForSvgImageUrl requires both a name and value');
276
282
  }
283
+ if (isCustomPropertyDefined(lightRule, name)) {
284
+ console.warn(`registerSemanticVariableForSvgImageUrl called for ${name} but a custom property is already defined with this name`);
285
+ }
277
286
 
278
287
  const replacedLightValue = svgToCSS(replaceSemanticVariables(value, lightVariables));
279
- style.sheet.insertRule(`html { ${ name }: ${ replacedLightValue } }`, 0);
288
+ lightRule.style.setProperty(name, replacedLightValue);
280
289
 
281
290
  const replacedDarkValue = svgToCSS(replaceSemanticVariables(value, darkVariables));
282
- style.sheet.insertRule(`html[data-color-mode="dark"] { ${ name }: ${ replacedDarkValue } }`, 1);
283
- style.sheet.insertRule(`@media (prefers-color-scheme: dark) {
284
- html[data-color-mode="os"] { ${ name }: ${ replacedDarkValue } }
285
- }`, 2);
291
+ darkRule.style.setProperty(name, replacedDarkValue);
292
+ osRule.style.setProperty(name, replacedDarkValue);
286
293
  };
package/lang/ar.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export default {
2
2
  "components.alert.close": "إغلاق التنبيه",
3
+ "components.backdrop-loading.loadingAnnouncement": "Loading.",
4
+ "components.backdrop-loading.loadingCompleteAnnouncement": "Loading Complete.",
3
5
  "components.breadcrumbs.breadcrumb": "مسار التنقل",
4
6
  "components.button-add.addItem": "إضافة عنصر",
5
7
  "components.button-copy.copied": "تم النسخ!",
package/lang/cy.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export default {
2
2
  "components.alert.close": "Cau Hysbysiad",
3
+ "components.backdrop-loading.loadingAnnouncement": "Loading.",
4
+ "components.backdrop-loading.loadingCompleteAnnouncement": "Loading Complete.",
3
5
  "components.breadcrumbs.breadcrumb": "Briwsionyn Bara",
4
6
  "components.button-add.addItem": "Ychwanegu Eitem",
5
7
  "components.button-copy.copied": "Wedi’i gopïo!",
package/lang/da.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export default {
2
2
  "components.alert.close": "Luk besked",
3
+ "components.backdrop-loading.loadingAnnouncement": "Loading.",
4
+ "components.backdrop-loading.loadingCompleteAnnouncement": "Loading Complete.",
3
5
  "components.breadcrumbs.breadcrumb": "Brødkrumme",
4
6
  "components.button-add.addItem": "Tilføj element",
5
7
  "components.button-copy.copied": "Kopieret!",
package/lang/de.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export default {
2
2
  "components.alert.close": "Benachrichtigung schließen",
3
+ "components.backdrop-loading.loadingAnnouncement": "Loading.",
4
+ "components.backdrop-loading.loadingCompleteAnnouncement": "Loading Complete.",
3
5
  "components.breadcrumbs.breadcrumb": "Brotkrümelnavigation",
4
6
  "components.button-add.addItem": "Element hinzufügen",
5
7
  "components.button-copy.copied": "Kopiert.",
package/lang/en-gb.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export default {
2
2
  "components.alert.close": "Close Alert",
3
+ "components.backdrop-loading.loadingAnnouncement": "Loading.",
4
+ "components.backdrop-loading.loadingCompleteAnnouncement": "Loading Complete.",
3
5
  "components.breadcrumbs.breadcrumb": "Breadcrumb",
4
6
  "components.button-add.addItem": "Add Item",
5
7
  "components.button-copy.copied": "Copied!",
package/lang/en.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export default {
2
2
  "components.alert.close": "Close Alert",
3
+ "components.backdrop-loading.loadingAnnouncement": "Loading.",
4
+ "components.backdrop-loading.loadingCompleteAnnouncement": "Loading Complete.",
3
5
  "components.breadcrumbs.breadcrumb": "Breadcrumb",
4
6
  "components.button-add.addItem": "Add Item",
5
7
  "components.button-copy.copied": "Copied!",
package/lang/es-es.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export default {
2
2
  "components.alert.close": "Cerrar alerta",
3
+ "components.backdrop-loading.loadingAnnouncement": "Loading.",
4
+ "components.backdrop-loading.loadingCompleteAnnouncement": "Loading Complete.",
3
5
  "components.breadcrumbs.breadcrumb": "Ruta de navegación",
4
6
  "components.button-add.addItem": "Agregar elemento",
5
7
  "components.button-copy.copied": "¡Copiado!",
package/lang/es.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export default {
2
2
  "components.alert.close": "Cerrar alerta",
3
+ "components.backdrop-loading.loadingAnnouncement": "Loading.",
4
+ "components.backdrop-loading.loadingCompleteAnnouncement": "Loading Complete.",
3
5
  "components.breadcrumbs.breadcrumb": "Ruta de navegación",
4
6
  "components.button-add.addItem": "Agregar elemento",
5
7
  "components.button-copy.copied": "Copiado.",
package/lang/fr-fr.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export default {
2
2
  "components.alert.close": "Fermer l’alerte",
3
+ "components.backdrop-loading.loadingAnnouncement": "Loading.",
4
+ "components.backdrop-loading.loadingCompleteAnnouncement": "Loading Complete.",
3
5
  "components.breadcrumbs.breadcrumb": "Chemin de navigation",
4
6
  "components.button-add.addItem": "Ajouter un élément",
5
7
  "components.button-copy.copied": "Copie effectuée !",
package/lang/fr.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export default {
2
2
  "components.alert.close": "Fermer l’alerte",
3
+ "components.backdrop-loading.loadingAnnouncement": "Loading.",
4
+ "components.backdrop-loading.loadingCompleteAnnouncement": "Loading Complete.",
3
5
  "components.breadcrumbs.breadcrumb": "Chemin de navigation",
4
6
  "components.button-add.addItem": "Ajouter un élément",
5
7
  "components.button-copy.copied": "Copié!",
package/lang/haw.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export default {
2
2
  "components.alert.close": "Pani i ka makaʻala",
3
+ "components.backdrop-loading.loadingAnnouncement": "Loading.",
4
+ "components.backdrop-loading.loadingCompleteAnnouncement": "Loading Complete.",
3
5
  "components.breadcrumbs.breadcrumb": "Palapalapala",
4
6
  "components.button-add.addItem": "Pākuʻi Mea",
5
7
  "components.button-copy.copied": "Kope ʻia!",
package/lang/hi.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export default {
2
2
  "components.alert.close": "अलर्ट बंद करें",
3
+ "components.backdrop-loading.loadingAnnouncement": "Loading.",
4
+ "components.backdrop-loading.loadingCompleteAnnouncement": "Loading Complete.",
3
5
  "components.breadcrumbs.breadcrumb": "ब्रेडक्रंब",
4
6
  "components.button-add.addItem": "आइटम जोड़ें",
5
7
  "components.button-copy.copied": "कॉपी किया गया!",
package/lang/ja.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export default {
2
2
  "components.alert.close": "アラートを閉じる",
3
+ "components.backdrop-loading.loadingAnnouncement": "Loading.",
4
+ "components.backdrop-loading.loadingCompleteAnnouncement": "Loading Complete.",
3
5
  "components.breadcrumbs.breadcrumb": "階層",
4
6
  "components.button-add.addItem": "項目の追加",
5
7
  "components.button-copy.copied": "コピーできました。",
package/lang/ko.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export default {
2
2
  "components.alert.close": "경보 닫기",
3
+ "components.backdrop-loading.loadingAnnouncement": "Loading.",
4
+ "components.backdrop-loading.loadingCompleteAnnouncement": "Loading Complete.",
3
5
  "components.breadcrumbs.breadcrumb": "이동 경로",
4
6
  "components.button-add.addItem": "항목 추가",
5
7
  "components.button-copy.copied": "복사 완료!",
package/lang/mi.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export default {
2
2
  "components.alert.close": "Kati Matohi",
3
+ "components.backdrop-loading.loadingAnnouncement": "Loading.",
4
+ "components.backdrop-loading.loadingCompleteAnnouncement": "Loading Complete.",
3
5
  "components.breadcrumbs.breadcrumb": "Pānui",
4
6
  "components.button-add.addItem": "Tāpiri Tūemi",
5
7
  "components.button-copy.copied": "Kua tāruatia!",
package/lang/nl.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export default {
2
2
  "components.alert.close": "Waarschuwing sluiten",
3
+ "components.backdrop-loading.loadingAnnouncement": "Loading.",
4
+ "components.backdrop-loading.loadingCompleteAnnouncement": "Loading Complete.",
3
5
  "components.breadcrumbs.breadcrumb": "Kruimelpad",
4
6
  "components.button-add.addItem": "Item toevoegen",
5
7
  "components.button-copy.copied": "Gekopieerd!",
package/lang/pt.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export default {
2
2
  "components.alert.close": "Fechar alerta",
3
+ "components.backdrop-loading.loadingAnnouncement": "Loading.",
4
+ "components.backdrop-loading.loadingCompleteAnnouncement": "Loading Complete.",
3
5
  "components.breadcrumbs.breadcrumb": "Auxiliar de navegação",
4
6
  "components.button-add.addItem": "Adicionar item",
5
7
  "components.button-copy.copied": "Copiado!",
package/lang/sv.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export default {
2
2
  "components.alert.close": "Stängningsvarning",
3
+ "components.backdrop-loading.loadingAnnouncement": "Loading.",
4
+ "components.backdrop-loading.loadingCompleteAnnouncement": "Loading Complete.",
3
5
  "components.breadcrumbs.breadcrumb": "Sökväg",
4
6
  "components.button-add.addItem": "Lägg till objekt",
5
7
  "components.button-copy.copied": "Kopierat!",
package/lang/th.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export default {
2
2
  "components.alert.close": "ปิดการแจ้งเตือน",
3
+ "components.backdrop-loading.loadingAnnouncement": "Loading.",
4
+ "components.backdrop-loading.loadingCompleteAnnouncement": "Loading Complete.",
3
5
  "components.breadcrumbs.breadcrumb": "แถบนำทาง",
4
6
  "components.button-add.addItem": "เพิ่มรายการ",
5
7
  "components.button-copy.copied": "คัดลอกแล้ว!",
package/lang/tr.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export default {
2
2
  "components.alert.close": "Kapatma Uyarısı",
3
+ "components.backdrop-loading.loadingAnnouncement": "Loading.",
4
+ "components.backdrop-loading.loadingCompleteAnnouncement": "Loading Complete.",
3
5
  "components.breadcrumbs.breadcrumb": "İçerik Haritası",
4
6
  "components.button-add.addItem": "Öğe Ekle",
5
7
  "components.button-copy.copied": "Kopyalandı!",
package/lang/vi.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export default {
2
2
  "components.alert.close": "Đóng Cảnh Báo",
3
+ "components.backdrop-loading.loadingAnnouncement": "Loading.",
4
+ "components.backdrop-loading.loadingCompleteAnnouncement": "Loading Complete.",
3
5
  "components.breadcrumbs.breadcrumb": "Đường dẫn",
4
6
  "components.button-add.addItem": "Thêm mục",
5
7
  "components.button-copy.copied": "Đã sao chép!",
package/lang/zh-cn.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export default {
2
2
  "components.alert.close": "关闭提醒",
3
+ "components.backdrop-loading.loadingAnnouncement": "Loading.",
4
+ "components.backdrop-loading.loadingCompleteAnnouncement": "Loading Complete.",
3
5
  "components.breadcrumbs.breadcrumb": "痕迹导航",
4
6
  "components.button-add.addItem": "添加项目",
5
7
  "components.button-copy.copied": "已复制!",
package/lang/zh-tw.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export default {
2
2
  "components.alert.close": "關閉警示",
3
+ "components.backdrop-loading.loadingAnnouncement": "Loading.",
4
+ "components.backdrop-loading.loadingCompleteAnnouncement": "Loading Complete.",
3
5
  "components.breadcrumbs.breadcrumb": "導覽路徑",
4
6
  "components.button-add.addItem": "新增項目",
5
7
  "components.button-copy.copied": "複製成功!",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brightspace-ui/core",
3
- "version": "3.233.0",
3
+ "version": "3.234.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",