@brightspace-ui/core 3.150.7 → 3.151.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.
- package/components/breadcrumbs/breadcrumb.js +3 -16
- package/components/breadcrumbs/breadcrumbs.js +5 -13
- package/components/link/README.md +1 -1
- package/components/link/link-mixin.js +76 -0
- package/components/menu/demo/menu.html +1 -0
- package/components/menu/menu-item-link.js +55 -8
- package/components/overflow-group/demo/demo-overflow-group.js +23 -0
- package/components/overflow-group/demo/overflow-group.html +9 -1
- package/custom-elements.json +4 -56
- package/mixins/loading-complete/README.md +1 -1
- package/mixins/loading-complete/loading-complete-mixin.js +12 -1
- package/package.json +1 -1
@@ -4,12 +4,11 @@ import { findComposedAncestor } from '../../helpers/dom.js';
|
|
4
4
|
import { FocusMixin } from '../../mixins/focus/focus-mixin.js';
|
5
5
|
import { ifDefined } from 'lit/directives/if-defined.js';
|
6
6
|
import { linkStyles } from '../link/link.js';
|
7
|
-
import { RtlMixin } from '../../mixins/rtl/rtl-mixin.js';
|
8
7
|
|
9
8
|
/**
|
10
9
|
* An entry within a <d2l-breadcrumbs> parent.
|
11
10
|
*/
|
12
|
-
class Breadcrumb extends
|
11
|
+
class Breadcrumb extends FocusMixin(LitElement) {
|
13
12
|
|
14
13
|
static get properties() {
|
15
14
|
return {
|
@@ -59,25 +58,13 @@ class Breadcrumb extends RtlMixin(FocusMixin(LitElement)) {
|
|
59
58
|
.d2l-link:focus {
|
60
59
|
outline-offset: -2px;
|
61
60
|
}
|
62
|
-
|
63
61
|
d2l-icon {
|
64
62
|
height: 8px;
|
65
|
-
padding-
|
66
|
-
padding-right: 3px;
|
63
|
+
padding-inline: 8px 3px;
|
67
64
|
width: 8px;
|
68
65
|
}
|
69
|
-
:host([dir="rtl"]) d2l-icon {
|
70
|
-
padding-left: 3px;
|
71
|
-
padding-right: 8px;
|
72
|
-
}
|
73
|
-
|
74
66
|
d2l-icon[icon="tier1:chevron-left"] {
|
75
|
-
padding-
|
76
|
-
padding-right: 8px;
|
77
|
-
}
|
78
|
-
:host([dir="rtl"]) d2l-icon[icon="tier1:chevron-left"] {
|
79
|
-
padding-left: 8px;
|
80
|
-
padding-right: 0;
|
67
|
+
padding-inline: 0 8px;
|
81
68
|
}
|
82
69
|
`];
|
83
70
|
}
|
@@ -3,7 +3,6 @@ import { css, html, LitElement } from 'lit';
|
|
3
3
|
import { getFlag } from '../../helpers/flags.js';
|
4
4
|
import { LocalizeCoreElement } from '../../helpers/localize-core-element.js';
|
5
5
|
import { overflowEllipsisDeclarations } from '../../helpers/overflow.js';
|
6
|
-
import { RtlMixin } from '../../mixins/rtl/rtl-mixin.js';
|
7
6
|
|
8
7
|
const overflowClipEnabled = getFlag('GAUD-7887-core-components-overflow-clipping', true);
|
9
8
|
|
@@ -11,7 +10,8 @@ const overflowClipEnabled = getFlag('GAUD-7887-core-components-overflow-clipping
|
|
11
10
|
* Help users understand where they are within the application, and provide useful clues about how the space is organized. They also provide a convenient navigation mechanism.
|
12
11
|
* @slot - Breadcrumb items
|
13
12
|
*/
|
14
|
-
class Breadcrumbs extends LocalizeCoreElement(
|
13
|
+
class Breadcrumbs extends LocalizeCoreElement(LitElement) {
|
14
|
+
|
15
15
|
static get properties() {
|
16
16
|
return {
|
17
17
|
/**
|
@@ -38,23 +38,15 @@ class Breadcrumbs extends LocalizeCoreElement(RtlMixin(LitElement)) {
|
|
38
38
|
:host([hidden]) {
|
39
39
|
display: none;
|
40
40
|
}
|
41
|
-
|
42
41
|
:host::after {
|
43
|
-
background: linear-gradient(to right, rgba(255, 255, 255, 0), rgb(251, 252, 252));
|
44
|
-
bottom: 0;
|
42
|
+
background: linear-gradient(to var(--d2l-inline-end, right), rgba(255, 255, 255, 0), rgb(251, 252, 252));
|
45
43
|
content: "";
|
44
|
+
inset-block: 0;
|
45
|
+
inset-inline-end: 0;
|
46
46
|
pointer-events: none;
|
47
47
|
position: absolute;
|
48
|
-
right: 0;
|
49
|
-
top: 0;
|
50
48
|
width: 10px;
|
51
49
|
}
|
52
|
-
:host([dir="rtl"])::after {
|
53
|
-
background: linear-gradient(to left, rgba(255, 255, 255, 0), rgb(251, 252, 252));
|
54
|
-
left: 0;
|
55
|
-
right: auto;
|
56
|
-
}
|
57
|
-
|
58
50
|
:host([compact]) ::slotted(d2l-breadcrumb:not(:last-of-type)),
|
59
51
|
:host([compact]) ::slotted(d2l-breadcrumb-current-page) {
|
60
52
|
display: none;
|
@@ -49,7 +49,7 @@ Import and use the `<d2l-link>` web component instead of the native `<a>` elemen
|
|
49
49
|
|--|--|--|
|
50
50
|
| `aria-label` | String | Label to provide more context for screen reader users when the link text is not enough |
|
51
51
|
| `href` | String, required | URL or URL fragment of the link |
|
52
|
-
| `download` |
|
52
|
+
| `download` | String | If the attribute is provided, it will prompt the user to download the resource instead of navigating to it. Additionally, if the attribute is provided with a value, that value will be used for the filename. |
|
53
53
|
| `main` | Boolean | Whether to apply the "main" link style |
|
54
54
|
| `lines` | Number | The number of lines to display before truncating text with an ellipsis. The text will not be truncated unless a value is specified. |
|
55
55
|
| `small` | Boolean | Whether to apply the "small" link style |
|
@@ -0,0 +1,76 @@
|
|
1
|
+
import '../icons/icon.js';
|
2
|
+
import { css, html, nothing } from 'lit';
|
3
|
+
import { classMap } from 'lit/directives/class-map.js';
|
4
|
+
import { ifDefined } from 'lit/directives/if-defined.js';
|
5
|
+
import { LocalizeCoreElement } from '../../helpers/localize-core-element.js';
|
6
|
+
import { offscreenStyles } from '../offscreen/offscreen.js';
|
7
|
+
|
8
|
+
export const LinkMixin = superclass => class extends LocalizeCoreElement(superclass) {
|
9
|
+
|
10
|
+
static get properties() {
|
11
|
+
return {
|
12
|
+
/**
|
13
|
+
* Prompts the user to save the linked URL instead of navigating to it.
|
14
|
+
* Must be to a resource on the same origin.
|
15
|
+
* Can be used with or without a value, when set the value becomes the filename.
|
16
|
+
* @type {string}
|
17
|
+
*/
|
18
|
+
download: { type: String },
|
19
|
+
/**
|
20
|
+
* REQUIRED: URL or URL fragment of the link
|
21
|
+
* @type {string}
|
22
|
+
*/
|
23
|
+
href: { type: String },
|
24
|
+
/**
|
25
|
+
* Where to display the linked URL
|
26
|
+
* @type {string}
|
27
|
+
*/
|
28
|
+
target: { type: String }
|
29
|
+
};
|
30
|
+
}
|
31
|
+
|
32
|
+
static get styles() {
|
33
|
+
return [offscreenStyles, css`
|
34
|
+
#new-window {
|
35
|
+
line-height: 0;
|
36
|
+
white-space: nowrap;
|
37
|
+
}
|
38
|
+
d2l-icon {
|
39
|
+
color: inherit;
|
40
|
+
height: calc(1em - 1px);
|
41
|
+
margin-inline-start: 0.315em;
|
42
|
+
transform: translateY(0.1em);
|
43
|
+
vertical-align: inherit;
|
44
|
+
width: calc(1em - 1px);
|
45
|
+
}
|
46
|
+
|
47
|
+
@media print {
|
48
|
+
d2l-icon {
|
49
|
+
display: none;
|
50
|
+
}
|
51
|
+
}
|
52
|
+
`];
|
53
|
+
}
|
54
|
+
|
55
|
+
_render(inner, { rel = undefined, ariaLabel = undefined, linkClasses = {}, tabindex = undefined } = {}) {
|
56
|
+
/*
|
57
|
+
* NOTICE:
|
58
|
+
* All html template whitespace within this component is critical to proper rendering and wrapping.
|
59
|
+
* Do not modify for readability!
|
60
|
+
*/
|
61
|
+
return html`<a
|
62
|
+
aria-label="${ifDefined(ariaLabel)}"
|
63
|
+
class="${classMap(linkClasses)}"
|
64
|
+
download="${this.download}"
|
65
|
+
href="${ifDefined(this.href)}"
|
66
|
+
target="${ifDefined(this.target)}"
|
67
|
+
rel="${ifDefined(rel)}"
|
68
|
+
tabindex="${ifDefined(tabindex)}"
|
69
|
+
>${inner}</a>`;
|
70
|
+
}
|
71
|
+
|
72
|
+
_renderNewWindowIcon() {
|
73
|
+
if (this.target !== '_blank') return nothing;
|
74
|
+
return html`<span id="new-window"><span style="font-size: 0;"> </span><d2l-icon icon="tier1:new-window"></d2l-icon></span><span class="d2l-offscreen">${this.localize('components.link.open-in-new-window')}</span>`;
|
75
|
+
}
|
76
|
+
};
|
@@ -80,6 +80,7 @@
|
|
80
80
|
<d2l-custom-menu-item text="The Solar System (Custom)"></d2l-custom-menu-item>
|
81
81
|
<d2l-menu-item text="Stars & Galaxies"></d2l-menu-item>
|
82
82
|
<d2l-menu-item text="The Night Sky"></d2l-menu-item>
|
83
|
+
<d2l-menu-item-link href="https://en.wikipedia.org/wiki/Interstellar_object" text="Interstellar Objects" target="_blank"></d2l-menu-item-link>
|
83
84
|
<d2l-menu-item-link href="https://en.wikipedia.org/wiki/Universe" text="The Universe (link)"></d2l-menu-item-link>
|
84
85
|
<d2l-menu-item-link href="https://en.wikipedia.org/wiki/Universe" text="Aliens, The Search Extraterrestrial Life, Unidentified Flying Objects, and Other Astronomical Phenomenon"></d2l-menu-item-link>
|
85
86
|
</d2l-menu>
|
@@ -1,16 +1,21 @@
|
|
1
1
|
import { css, html, LitElement } from 'lit';
|
2
|
+
import { getFlag } from '../../helpers/flags.js';
|
2
3
|
import { ifDefined } from 'lit/directives/if-defined.js';
|
4
|
+
import { LinkMixin } from '../link/link-mixin.js';
|
3
5
|
import { MenuItemMixin } from './menu-item-mixin.js';
|
4
6
|
import { menuItemStyles } from './menu-item-styles.js';
|
5
7
|
|
8
|
+
const newWindowIconEnabled = getFlag('GAUD-8295-menu-item-link-new-window-icon', true);
|
9
|
+
|
6
10
|
/**
|
7
11
|
* A menu item component used for navigating.
|
8
12
|
* @fires click - Dispatched when the link is clicked
|
9
13
|
* @slot supporting - Allows supporting information to be displayed on the right-most side of the menu item
|
10
14
|
*/
|
11
|
-
class MenuItemLink extends MenuItemMixin(LitElement) {
|
15
|
+
class MenuItemLink extends (newWindowIconEnabled ? LinkMixin(MenuItemMixin(LitElement)) : MenuItemMixin(LitElement)) {
|
12
16
|
|
13
17
|
static get properties() {
|
18
|
+
if (newWindowIconEnabled) return {};
|
14
19
|
return {
|
15
20
|
/**
|
16
21
|
* Prompts the user to save the linked URL instead of navigating to it.
|
@@ -33,7 +38,8 @@ class MenuItemLink extends MenuItemMixin(LitElement) {
|
|
33
38
|
}
|
34
39
|
|
35
40
|
static get styles() {
|
36
|
-
|
41
|
+
// remove this block when cleaning up GAUD-8295-menu-item-link-new-window-icon
|
42
|
+
if (!newWindowIconEnabled) return [ menuItemStyles,
|
37
43
|
css`
|
38
44
|
:host {
|
39
45
|
display: block;
|
@@ -52,6 +58,36 @@ class MenuItemLink extends MenuItemMixin(LitElement) {
|
|
52
58
|
}
|
53
59
|
`
|
54
60
|
];
|
61
|
+
|
62
|
+
return [ super.styles, menuItemStyles,
|
63
|
+
css`
|
64
|
+
:host {
|
65
|
+
display: block;
|
66
|
+
padding: 0;
|
67
|
+
}
|
68
|
+
|
69
|
+
:host > a {
|
70
|
+
align-items: center;
|
71
|
+
color: inherit;
|
72
|
+
display: flex;
|
73
|
+
line-height: 1rem;
|
74
|
+
outline: none;
|
75
|
+
overflow-x: hidden;
|
76
|
+
padding: 0.75rem 1rem;
|
77
|
+
text-decoration: none;
|
78
|
+
}
|
79
|
+
|
80
|
+
:host([target="_blank"]) .d2l-menu-item-text {
|
81
|
+
align-self: baseline;
|
82
|
+
flex: 0 1 auto;
|
83
|
+
}
|
84
|
+
|
85
|
+
#new-window {
|
86
|
+
align-self: baseline;
|
87
|
+
flex: auto;
|
88
|
+
}
|
89
|
+
`
|
90
|
+
];
|
55
91
|
}
|
56
92
|
|
57
93
|
firstUpdated() {
|
@@ -61,13 +97,24 @@ class MenuItemLink extends MenuItemMixin(LitElement) {
|
|
61
97
|
}
|
62
98
|
|
63
99
|
render() {
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
<
|
69
|
-
|
100
|
+
// remove this block when cleaning up GAUD-8295-menu-item-link-new-window-icon
|
101
|
+
if (!newWindowIconEnabled) {
|
102
|
+
const rel = this.target ? 'noreferrer noopener' : undefined;
|
103
|
+
return html`
|
104
|
+
<a download="${ifDefined(this.download)}" href="${ifDefined(this.href)}" rel="${ifDefined(rel)}" target="${ifDefined(this.target)}" tabindex="-1">
|
105
|
+
<div class="d2l-menu-item-text">${this.text}</div>
|
106
|
+
<div class="d2l-menu-item-supporting"><slot name="supporting"></slot></div>
|
107
|
+
</a>
|
108
|
+
`;
|
109
|
+
}
|
110
|
+
|
111
|
+
const inner = html`
|
112
|
+
<div class="d2l-menu-item-text">${this.text}</div>
|
113
|
+
${this._renderNewWindowIcon()}
|
114
|
+
<div class="d2l-menu-item-supporting"><slot name="supporting"></slot></div>
|
70
115
|
`;
|
116
|
+
return this._render(inner, { rel: this.target ? 'noreferrer noopener' : undefined, tabindex: -1 });
|
117
|
+
|
71
118
|
}
|
72
119
|
|
73
120
|
_getTarget() {
|
@@ -0,0 +1,23 @@
|
|
1
|
+
|
2
|
+
import '../../button/button.js';
|
3
|
+
import '../overflow-group.js';
|
4
|
+
import { html, LitElement } from 'lit';
|
5
|
+
import { LocalizeCoreElement } from '../../../helpers/localize-core-element.js';
|
6
|
+
|
7
|
+
class DemoOverflowGroup extends LocalizeCoreElement(LitElement) {
|
8
|
+
render() {
|
9
|
+
return html`
|
10
|
+
<d2l-overflow-group>
|
11
|
+
<d2l-button primary>${this.localize('components.more-less.more')}</d2l-button>
|
12
|
+
<d2l-button>${this.localize('components.more-less.less')}</d2l-button>
|
13
|
+
<d2l-button>${this.localize('components.more-less.more')}</d2l-button>
|
14
|
+
<d2l-button>${this.localize('components.more-less.less')}</d2l-button>
|
15
|
+
<d2l-button>${this.localize('components.more-less.more')}</d2l-button>
|
16
|
+
<d2l-button>${this.localize('components.more-less.less')}</d2l-button>
|
17
|
+
<d2l-button> ${this.localize('components.more-less.more')}</d2l-button>
|
18
|
+
<d2l-button> ${this.localize('components.more-less.less')}</d2l-button>
|
19
|
+
</d2l-overflow-group>
|
20
|
+
`;
|
21
|
+
}
|
22
|
+
}
|
23
|
+
customElements.define('d2l-demo-overflow-group', DemoOverflowGroup);
|
@@ -16,6 +16,7 @@
|
|
16
16
|
import '../../dropdown/dropdown-menu.js';
|
17
17
|
import '../../dropdown/dropdown.js';
|
18
18
|
import '../../link/link.js';
|
19
|
+
import './demo-overflow-group.js';
|
19
20
|
</script>
|
20
21
|
</head>
|
21
22
|
<body unresolved>
|
@@ -39,7 +40,7 @@
|
|
39
40
|
<d2l-demo-snippet>
|
40
41
|
<template>
|
41
42
|
<d2l-overflow-group auto-show>
|
42
|
-
<d2l-button
|
43
|
+
<d2l-button disabled primary>New</d2l-button>
|
43
44
|
<d2l-dropdown-button text="Explore Topics" class="d2l-button-group-show">
|
44
45
|
<d2l-dropdown-menu id="dropdown">
|
45
46
|
<d2l-menu label="Astronomy">
|
@@ -97,6 +98,13 @@
|
|
97
98
|
</d2l-overflow-group>
|
98
99
|
</template>
|
99
100
|
</d2l-demo-snippet>
|
101
|
+
|
102
|
+
<h2>Overflow Group with Localized Text and Spaces</h2>
|
103
|
+
<d2l-demo-snippet>
|
104
|
+
<template>
|
105
|
+
<d2l-demo-overflow-group></d2l-demo-overflow-group>
|
106
|
+
</template>
|
107
|
+
</d2l-demo-snippet>
|
100
108
|
</d2l-demo-page>
|
101
109
|
</body>
|
102
110
|
</html>
|
package/custom-elements.json
CHANGED
@@ -10498,28 +10498,6 @@
|
|
10498
10498
|
"name": "target",
|
10499
10499
|
"description": "Where to display the linked URL",
|
10500
10500
|
"type": "string"
|
10501
|
-
},
|
10502
|
-
{
|
10503
|
-
"name": "text",
|
10504
|
-
"description": "REQUIRED: Text displayed by the menu item",
|
10505
|
-
"type": "string"
|
10506
|
-
},
|
10507
|
-
{
|
10508
|
-
"name": "description",
|
10509
|
-
"description": "ACCESSIBILITY: A description of the menu item that will be used by screen readers for additional context",
|
10510
|
-
"type": "string"
|
10511
|
-
},
|
10512
|
-
{
|
10513
|
-
"name": "disabled",
|
10514
|
-
"description": "Disables the menu item",
|
10515
|
-
"type": "boolean",
|
10516
|
-
"default": "false"
|
10517
|
-
},
|
10518
|
-
{
|
10519
|
-
"name": "lines",
|
10520
|
-
"description": "The number of lines to display before truncating text with an ellipsis. Defaults to 2.",
|
10521
|
-
"type": "number",
|
10522
|
-
"default": "2"
|
10523
10501
|
}
|
10524
10502
|
],
|
10525
10503
|
"properties": [
|
@@ -10540,46 +10518,12 @@
|
|
10540
10518
|
"attribute": "target",
|
10541
10519
|
"description": "Where to display the linked URL",
|
10542
10520
|
"type": "string"
|
10543
|
-
},
|
10544
|
-
{
|
10545
|
-
"name": "text",
|
10546
|
-
"attribute": "text",
|
10547
|
-
"description": "REQUIRED: Text displayed by the menu item",
|
10548
|
-
"type": "string"
|
10549
|
-
},
|
10550
|
-
{
|
10551
|
-
"name": "description",
|
10552
|
-
"attribute": "description",
|
10553
|
-
"description": "ACCESSIBILITY: A description of the menu item that will be used by screen readers for additional context",
|
10554
|
-
"type": "string"
|
10555
|
-
},
|
10556
|
-
{
|
10557
|
-
"name": "disabled",
|
10558
|
-
"attribute": "disabled",
|
10559
|
-
"description": "Disables the menu item",
|
10560
|
-
"type": "boolean",
|
10561
|
-
"default": "false"
|
10562
|
-
},
|
10563
|
-
{
|
10564
|
-
"name": "lines",
|
10565
|
-
"attribute": "lines",
|
10566
|
-
"description": "The number of lines to display before truncating text with an ellipsis. Defaults to 2.",
|
10567
|
-
"type": "number",
|
10568
|
-
"default": "2"
|
10569
10521
|
}
|
10570
10522
|
],
|
10571
10523
|
"events": [
|
10572
10524
|
{
|
10573
10525
|
"name": "click",
|
10574
10526
|
"description": "Dispatched when the link is clicked"
|
10575
|
-
},
|
10576
|
-
{
|
10577
|
-
"name": "d2l-menu-item-select",
|
10578
|
-
"description": "Dispatched when the menu item is selected"
|
10579
|
-
},
|
10580
|
-
{
|
10581
|
-
"name": "d2l-menu-item-visibility-change",
|
10582
|
-
"description": "Dispatched when the visibility of the menu item changes"
|
10583
10527
|
}
|
10584
10528
|
],
|
10585
10529
|
"slots": [
|
@@ -11419,6 +11363,10 @@
|
|
11419
11363
|
"name": "d2l-screen-reader-pause",
|
11420
11364
|
"path": "./components/offscreen/screen-reader-pause.js"
|
11421
11365
|
},
|
11366
|
+
{
|
11367
|
+
"name": "d2l-demo-overflow-group",
|
11368
|
+
"path": "./components/overflow-group/demo/demo-overflow-group.js"
|
11369
|
+
},
|
11422
11370
|
{
|
11423
11371
|
"name": "d2l-overflow-group",
|
11424
11372
|
"path": "./components/overflow-group/overflow-group.js",
|
@@ -26,7 +26,7 @@ async removeSkeleton() {
|
|
26
26
|
}
|
27
27
|
```
|
28
28
|
|
29
|
-
If for any reason `resolveLoadingComplete` is never called, `loadingComplete` won't resolve and any consumers will hang.
|
29
|
+
If for any reason `resolveLoadingComplete` is never called, `loadingComplete` won't resolve and any consumers will hang. A warning will be thrown indicating that the component has entered a bad state.
|
30
30
|
|
31
31
|
### `getLoadingComplete`
|
32
32
|
|
@@ -1,5 +1,7 @@
|
|
1
1
|
import { dedupeMixin } from '@open-wc/dedupe-mixin';
|
2
2
|
|
3
|
+
const timeoutMs = 30000;
|
4
|
+
|
3
5
|
export const LoadingCompleteMixin = dedupeMixin((superclass) => class extends superclass {
|
4
6
|
get loadingComplete() {
|
5
7
|
return this.getLoadingComplete();
|
@@ -22,7 +24,16 @@ export const LoadingCompleteMixin = dedupeMixin((superclass) => class extends su
|
|
22
24
|
#loadingCompleteResolve;
|
23
25
|
|
24
26
|
#loadingCompletePromise = !Object.prototype.hasOwnProperty.call(this.constructor.prototype, 'getLoadingComplete')
|
25
|
-
? new Promise(resolve =>
|
27
|
+
? new Promise(resolve => {
|
28
|
+
const timeout = setTimeout(() => {
|
29
|
+
console.warn(`Failed to load ${this.localName} in ${timeoutMs}ms: resolveLoadingComplete was not called`);
|
30
|
+
}, timeoutMs);
|
31
|
+
|
32
|
+
this.#loadingCompleteResolve = () => {
|
33
|
+
clearTimeout(timeout);
|
34
|
+
resolve();
|
35
|
+
};
|
36
|
+
})
|
26
37
|
: Promise.resolve();
|
27
38
|
|
28
39
|
});
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@brightspace-ui/core",
|
3
|
-
"version": "3.
|
3
|
+
"version": "3.151.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",
|