@brightspace-ui/core 3.135.5 → 3.136.0

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,20 +1,21 @@
1
1
  import '../colors/colors.js';
2
2
  import '../icons/icon.js';
3
3
  import '../tooltip/tooltip.js';
4
- import { css, html, LitElement, nothing } from 'lit';
4
+ import { css, html, LitElement } from 'lit';
5
5
  import { VisibleOnAncestorMixin, visibleOnAncestorStyles } from '../../mixins/visible-on-ancestor/visible-on-ancestor-mixin.js';
6
6
  import { ButtonMixin } from './button-mixin.js';
7
7
  import { buttonStyles } from './button-styles.js';
8
8
  import { getUniqueId } from '../../helpers/uniqueId.js';
9
9
  import { ifDefined } from 'lit/directives/if-defined.js';
10
10
  import { PropertyRequiredMixin } from '../../mixins/property-required/property-required-mixin.js';
11
+ import { SlottedIconMixin } from '../icons/slotted-icon-mixin.js';
11
12
  import { ThemeMixin } from '../../mixins/theme/theme-mixin.js';
12
13
 
13
14
  /**
14
15
  * A button component that can be used just like the native button for instances where only an icon is displayed.
15
16
  * @slot icon - Optional slot for a custom icon
16
17
  */
17
- class ButtonIcon extends PropertyRequiredMixin(ThemeMixin(ButtonMixin(VisibleOnAncestorMixin(LitElement)))) {
18
+ class ButtonIcon extends SlottedIconMixin(PropertyRequiredMixin(ThemeMixin(ButtonMixin(VisibleOnAncestorMixin(LitElement))))) {
18
19
 
19
20
  static get properties() {
20
21
  return {
@@ -30,18 +31,6 @@ class ButtonIcon extends PropertyRequiredMixin(ThemeMixin(ButtonMixin(VisibleOnA
30
31
  */
31
32
  hAlign: { type: String, reflect: true, attribute: 'h-align' },
32
33
 
33
- /**
34
- * REQUIRED: Preset icon key (e.g. "tier1:gear")
35
- * @type {string}
36
- */
37
- icon: {
38
- type: String,
39
- reflect: true,
40
- required: {
41
- validator: (_value, elem, hasValue) => hasValue || elem._hasCustomIcon
42
- }
43
- },
44
-
45
34
  /**
46
35
  * ACCESSIBILITY: REQUIRED: Accessible text for the button
47
36
  * @type {string}
@@ -57,7 +46,7 @@ class ButtonIcon extends PropertyRequiredMixin(ThemeMixin(ButtonMixin(VisibleOnA
57
46
  }
58
47
 
59
48
  static get styles() {
60
- return [ buttonStyles, visibleOnAncestorStyles,
49
+ return [super.styles, buttonStyles, visibleOnAncestorStyles,
61
50
  css`
62
51
  :host {
63
52
  --d2l-button-icon-background-color: transparent;
@@ -118,18 +107,9 @@ class ButtonIcon extends PropertyRequiredMixin(ThemeMixin(ButtonMixin(VisibleOnA
118
107
  background-color: var(--d2l-button-icon-background-color-hover);
119
108
  }
120
109
 
121
- slot[name="icon"]::slotted(*) {
122
- display: none;
123
- }
124
- slot[name="icon"]::slotted(d2l-icon-custom) {
125
- display: inline-flex;
126
- }
127
-
128
110
  d2l-icon,
129
111
  slot[name="icon"]::slotted(d2l-icon-custom) {
130
112
  color: var(--d2l-button-icon-fill-color, var(--d2l-color-tungsten));
131
- height: 0.9rem;
132
- width: 0.9rem;
133
113
  }
134
114
 
135
115
  :host([translucent]) button {
@@ -162,12 +142,10 @@ class ButtonIcon extends PropertyRequiredMixin(ThemeMixin(ButtonMixin(VisibleOnA
162
142
  this._buttonId = getUniqueId();
163
143
  /** @internal */
164
144
  this._describedById = getUniqueId();
165
- /** @internal */
166
- this._hasCustomIcon = false;
145
+ this._iconRequired = true;
167
146
  }
168
147
 
169
148
  render() {
170
- const icon = this.icon ? html`<d2l-icon icon="${this.icon}"></d2l-icon>` : nothing;
171
149
  return html`
172
150
  <button
173
151
  aria-describedby="${ifDefined(this.description ? this._describedById : undefined)}"
@@ -187,19 +165,13 @@ class ButtonIcon extends PropertyRequiredMixin(ThemeMixin(ButtonMixin(VisibleOnA
187
165
  name="${ifDefined(this.name)}"
188
166
  title="${ifDefined(this.text)}"
189
167
  type="${this._getType()}">
190
- <slot name="icon" @slotchange="${this._handleSlotChange}">${icon}</slot>
168
+ ${this._renderIcon()}
191
169
  </button>
192
170
  ${this.description ? html`<span id="${this._describedById}" hidden>${this.description}</span>` : null}
193
171
  ${this.disabled && this.disabledTooltip ? html`<d2l-tooltip for="${this._buttonId}">${this.disabledTooltip}</d2l-tooltip>` : ''}
194
172
  `;
195
173
  }
196
174
 
197
- _handleSlotChange(e) {
198
- this._hasCustomIcon = e.target.assignedNodes().find(
199
- node => node.nodeType === 1 && node.tagName.toLowerCase() === 'd2l-icon-custom'
200
- ) !== undefined;
201
- }
202
-
203
175
  }
204
176
 
205
177
  customElements.define('d2l-button-icon', ButtonIcon);
@@ -1,19 +1,20 @@
1
1
  import '../icons/icon.js';
2
2
  import '../tooltip/tooltip.js';
3
- import { css, html, LitElement, nothing } from 'lit';
3
+ import { css, html, LitElement } from 'lit';
4
4
  import { ButtonMixin } from './button-mixin.js';
5
5
  import { buttonStyles } from './button-styles.js';
6
6
  import { classMap } from 'lit/directives/class-map.js';
7
7
  import { getUniqueId } from '../../helpers/uniqueId.js';
8
8
  import { ifDefined } from 'lit/directives/if-defined.js';
9
9
  import { labelStyles } from '../typography/styles.js';
10
+ import { SlottedIconMixin } from '../icons/slotted-icon-mixin.js';
10
11
 
11
12
  /**
12
13
  * A button component that can be used just like the native button, but for advanced or de-emphasized actions.
13
14
  * @slot - Default content placed inside of the button
14
15
  * @slot icon - Optional slot for a custom icon
15
16
  */
16
- class ButtonSubtle extends ButtonMixin(LitElement) {
17
+ class ButtonSubtle extends SlottedIconMixin(ButtonMixin(LitElement)) {
17
18
 
18
19
  static get properties() {
19
20
  return {
@@ -29,12 +30,6 @@ class ButtonSubtle extends ButtonMixin(LitElement) {
29
30
  */
30
31
  hAlign: { type: String, reflect: true, attribute: 'h-align' },
31
32
 
32
- /**
33
- * Preset icon key (e.g. "tier1:gear")
34
- * @type {string}
35
- */
36
- icon: { type: String, reflect: true },
37
-
38
33
  /**
39
34
  * Indicates that the icon should be rendered on right
40
35
  * @type {boolean}
@@ -51,13 +46,12 @@ class ButtonSubtle extends ButtonMixin(LitElement) {
51
46
  * ACCESSIBILITY: REQUIRED: Text for the button
52
47
  * @type {string}
53
48
  */
54
- text: { type: String, reflect: true },
55
- _hasCustomIcon: { state: true }
49
+ text: { type: String, reflect: true }
56
50
  };
57
51
  }
58
52
 
59
53
  static get styles() {
60
- return [ labelStyles, buttonStyles,
54
+ return [super.styles, labelStyles, buttonStyles,
61
55
  css`
62
56
  :host {
63
57
  --d2l-count-badge-background-color: var(--d2l-color-celestine);
@@ -72,8 +66,11 @@ class ButtonSubtle extends ButtonMixin(LitElement) {
72
66
  button {
73
67
  --d2l-button-subtle-padding-inline-start: 0.6rem;
74
68
  --d2l-button-subtle-padding-inline-end: 0.6rem;
69
+ align-items: center;
75
70
  background-color: transparent;
76
71
  border-color: transparent;
72
+ column-gap: 0.3rem;
73
+ display: inline-flex;
77
74
  font-family: inherit;
78
75
  padding-block-end: 0;
79
76
  padding-block-start: 0;
@@ -138,42 +135,23 @@ class ButtonSubtle extends ButtonMixin(LitElement) {
138
135
  --d2l-count-badge-background-color: var(--d2l-color-celestine-minus-1);
139
136
  }
140
137
 
141
-
142
- .d2l-button-subtle-has-icon .d2l-button-subtle-content-wrapper {
143
- padding-inline: 1.2rem 0;
144
- }
145
-
146
- :host([icon-right]) .d2l-button-subtle-has-icon .d2l-button-subtle-content-wrapper {
147
- padding-inline: 0 1.2rem;
148
- }
149
-
150
- slot[name="icon"]::slotted(*) {
151
- display: none;
152
- }
153
-
154
- d2l-icon.d2l-button-subtle-icon,
138
+ .property-icon,
155
139
  slot[name="icon"]::slotted(d2l-icon-custom) {
156
140
  color: var(--d2l-color-celestine);
157
- display: inline-block;
158
- height: 0.9rem;
159
- position: absolute;
160
- top: 50%;
161
- transform: translateY(-50%);
162
- width: 0.9rem;
163
141
  }
164
142
 
165
- button:hover:not([disabled]) d2l-icon.d2l-button-subtle-icon,
166
- button:focus:not([disabled]) d2l-icon.d2l-button-subtle-icon,
167
- :host([active]:not([disabled])) button d2l-icon.d2l-button-subtle-icon,
143
+ button:hover:not([disabled]) .property-icon,
144
+ button:focus:not([disabled]) .property-icon,
145
+ :host([active]:not([disabled])) button .property-icon,
168
146
  button:hover:not([disabled]) slot[name="icon"]::slotted(d2l-icon-custom),
169
147
  button:focus:not([disabled]) slot[name="icon"]::slotted(d2l-icon-custom),
170
148
  :host([active]:not([disabled])) slot[name="icon"]::slotted(d2l-icon-custom) {
171
149
  color: var(--d2l-color-celestine-minus-1);
172
150
  }
173
151
 
174
- :host([icon-right]) .d2l-button-subtle-has-icon d2l-icon.d2l-button-subtle-icon,
152
+ :host([icon-right]) .property-icon,
175
153
  :host([icon-right]) slot[name="icon"]::slotted(d2l-icon-custom) {
176
- inset-inline-end: var(--d2l-button-subtle-padding-inline-end);
154
+ order: 1;
177
155
  }
178
156
 
179
157
  :host([disabled]) button {
@@ -191,13 +169,11 @@ class ButtonSubtle extends ButtonMixin(LitElement) {
191
169
 
192
170
  this._buttonId = getUniqueId();
193
171
  this._describedById = getUniqueId();
194
- this._hasCustomIcon = false;
195
172
  }
196
173
 
197
174
  render() {
198
- const icon = this.icon ? html`<d2l-icon icon="${this.icon}" class="d2l-button-subtle-icon"></d2l-icon>` : nothing;
199
175
  const buttonClasses = {
200
- 'd2l-button-subtle-has-icon': this._hasCustomIcon || this.icon,
176
+ 'd2l-button-subtle-has-icon': this.hasIcon(),
201
177
  'd2l-label-text': true
202
178
  };
203
179
  return html`
@@ -219,7 +195,7 @@ class ButtonSubtle extends ButtonMixin(LitElement) {
219
195
  id="${this._buttonId}"
220
196
  name="${ifDefined(this.name)}"
221
197
  type="${this._getType()}">
222
- <slot name="icon" @slotchange="${this._handleIconSlotChange}">${icon}</slot>
198
+ ${this._renderIcon()}
223
199
  <span class="d2l-button-subtle-content-wrapper">
224
200
  <span class="d2l-button-subtle-content">${this.text}</span>
225
201
  <slot></slot>
@@ -230,13 +206,6 @@ class ButtonSubtle extends ButtonMixin(LitElement) {
230
206
  `;
231
207
  }
232
208
 
233
- _handleIconSlotChange(e) {
234
- const icon = e && e.target && e.target.assignedNodes({ flatten: true }).filter((node) => {
235
- return node.nodeType === Node.ELEMENT_NODE && node.tagName === 'D2L-ICON-CUSTOM';
236
- });
237
- this._hasCustomIcon = icon.length === 1;
238
- }
239
-
240
209
  }
241
210
 
242
211
  customElements.define('d2l-button-subtle', ButtonSubtle);
@@ -270,7 +270,7 @@ export const DialogMixin = superclass => class extends RtlMixin(superclass) {
270
270
  const availableHeight = this._ifrauContextInfo
271
271
  ? this._ifrauContextInfo.availableHeight - this._margin.top - this._margin.bottom
272
272
  : window.innerHeight - this._margin.top - this._margin.bottom;
273
- let preferredHeight = 2;
273
+ let preferredHeight = 3; // content height is off by 2px and we need an extra 1px to account for rounding when zoomed
274
274
 
275
275
  if (this.fullHeight) {
276
276
  preferredHeight = 2 * this._width;
@@ -550,8 +550,10 @@ export const DialogMixin = superclass => class extends RtlMixin(superclass) {
550
550
  _updateOverflow() {
551
551
  if (!this.shadowRoot) return;
552
552
  const content = this.shadowRoot.querySelector('.d2l-dialog-content');
553
+ // On Windows, browser zoom can cause scrollTop to be a fraction
554
+ const bottomOverflow = content.scrollHeight - (Math.ceil(content.scrollTop) + content.clientHeight);
553
555
  this._overflowTop = (content.scrollTop > 0);
554
- this._overflowBottom = (content.scrollHeight > content.scrollTop + content.clientHeight);
556
+ this._overflowBottom = (bottomOverflow > 0);
555
557
  }
556
558
 
557
559
  async _updateSize() {
@@ -0,0 +1,64 @@
1
+ import '../icons/icon.js';
2
+ import { css, html, nothing } from 'lit';
3
+
4
+ export const SlottedIconMixin = superclass => class extends superclass {
5
+
6
+ static get properties() {
7
+ return {
8
+
9
+ /**
10
+ * Preset icon key (e.g. "tier1:gear")
11
+ * @type {string}
12
+ */
13
+ icon: {
14
+ type: String,
15
+ reflect: true,
16
+ required: {
17
+ validator: (_value, elem, hasValue) => hasValue || elem._hasCustomIcon || !elem._iconRequired
18
+ }
19
+ },
20
+ _hasCustomIcon: { state: true }
21
+ };
22
+ }
23
+
24
+ static get styles() {
25
+ const styles = [ css`
26
+ slot[name="icon"]::slotted(*) {
27
+ display: none;
28
+ }
29
+ slot[name="icon"]::slotted(d2l-icon-custom) {
30
+ display: inline-flex;
31
+ }
32
+
33
+ d2l-icon.property-icon,
34
+ slot[name="icon"]::slotted(d2l-icon-custom) {
35
+ height: 0.9rem;
36
+ width: 0.9rem;
37
+ }
38
+ `];
39
+
40
+ super.styles && styles.unshift(super.styles);
41
+ return styles;
42
+ }
43
+
44
+ constructor() {
45
+ super();
46
+ /** @internal */
47
+ this._hasCustomIcon = false;
48
+ this._iconRequired = false;
49
+ }
50
+
51
+ hasIcon() {
52
+ return !!(this.icon || this._hasCustomIcon);
53
+ }
54
+
55
+ _renderIcon() {
56
+ const icon = this.icon ? html`<d2l-icon icon="${this.icon}" class="property-icon"></d2l-icon>` : nothing;
57
+ return html`<slot name="icon" @slotchange="${this.#handleIconSlotChange}">${icon}</slot>`;
58
+ }
59
+
60
+ #handleIconSlotChange(e) {
61
+ const icon = e.target.assignedElements({ flatten: true }).filter((node) => node.tagName === 'D2L-ICON-CUSTOM');
62
+ this._hasCustomIcon = icon.length === 1;
63
+ }
64
+ };
@@ -9,6 +9,7 @@
9
9
  import '../../button/button.js';
10
10
  import '../../colors/colors.js';
11
11
  import '../../demo/demo-page.js';
12
+ import '../../icons/icon-custom.js';
12
13
  import '../../inputs/input-text.js';
13
14
  import '../../link/link.js';
14
15
  import '../tooltip.js';
@@ -199,6 +200,22 @@
199
200
  This is some sample text.
200
201
  <d2l-tooltip-help text="Helpful label" inherit-font-style>Contents should elaborate on the label (be short and concise)</d2l-tooltip-help>
201
202
  </p>
203
+ <p class="d2l-body-compact">
204
+ Using an icon.
205
+ <d2l-tooltip-help icon="tier1:edit" text="Helpful label" inherit-font-style>Contents should elaborate on the label (be short and concise)</d2l-tooltip-help>
206
+ </p>
207
+ <p class="d2l-body-compact">
208
+ Using a custom icon.
209
+ <d2l-tooltip-help text="Helpful label" inherit-font-style>
210
+ Contents should elaborate on the label (be short and concise)
211
+ <d2l-icon-custom slot="icon">
212
+ <svg xmlns="http://www.w3.org/2000/svg" mirror-in-rtl="true">
213
+ <path fill="#494c4e" d="M18 12v5a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1v-5a1 1 0 0 1 2 0v4h14v-4a1 1 0 0 1 2 0z"/>
214
+ <path fill="#494c4e" d="M13.85 3.15l-2.99-3A.507.507 0 0 0 10.5 0H5.4A1.417 1.417 0 0 0 4 1.43v11.14A1.417 1.417 0 0 0 5.4 14h7.2a1.417 1.417 0 0 0 1.4-1.43V3.5a.47.47 0 0 0-.15-.35zM7 2h1a1 1 0 0 1 0 2H7a1 1 0 0 1 0-2zm4 10H7a1 1 0 0 1 0-2h4a1 1 0 0 1 0 2zm0-4H7a1 1 0 0 1 0-2h4a1 1 0 0 1 0 2z"/>
215
+ </svg>
216
+ </d2l-icon-custom>
217
+ </d2l-tooltip-help>
218
+ </p>
202
219
  </template>
203
220
  </d2l-demo-snippet>
204
221
 
@@ -7,12 +7,13 @@ import { FocusMixin } from '../../mixins/focus/focus-mixin.js';
7
7
  import { getFocusPseudoClass } from '../../helpers/focus.js';
8
8
  import { ifDefined } from 'lit/directives/if-defined.js';
9
9
  import { SkeletonMixin } from '../skeleton/skeleton-mixin.js';
10
+ import { SlottedIconMixin } from '../icons/slotted-icon-mixin.js';
10
11
 
11
12
  /**
12
13
  * A component used to display additional information when users focus or hover over some text.
13
14
  * @slot - Default content placed inside of the tooltip
14
15
  */
15
- class TooltipHelp extends SkeletonMixin(FocusMixin(LitElement)) {
16
+ class TooltipHelp extends SlottedIconMixin(SkeletonMixin(FocusMixin(LitElement))) {
16
17
 
17
18
  static get properties() {
18
19
  return {
@@ -47,9 +48,12 @@ class TooltipHelp extends SkeletonMixin(FocusMixin(LitElement)) {
47
48
  display: none;
48
49
  }
49
50
  #d2l-tooltip-help-text {
51
+ align-items: baseline;
50
52
  background: none;
51
53
  border: none;
54
+ column-gap: 0.3rem;
52
55
  cursor: inherit;
56
+ display: inline-flex;
53
57
  font-family: inherit;
54
58
  padding: 0;
55
59
  text-decoration-line: underline;
@@ -57,6 +61,11 @@ class TooltipHelp extends SkeletonMixin(FocusMixin(LitElement)) {
57
61
  text-decoration-thickness: 1px;
58
62
  text-underline-offset: 0.1rem;
59
63
  }
64
+ d2l-icon,
65
+ slot[name="icon"]::slotted(d2l-icon-custom) {
66
+ align-self: center;
67
+ }
68
+
60
69
  #d2l-tooltip-help-text:focus {
61
70
  outline-style: none;
62
71
  }
@@ -109,6 +118,7 @@ class TooltipHelp extends SkeletonMixin(FocusMixin(LitElement)) {
109
118
  };
110
119
  return html`
111
120
  <button id="d2l-tooltip-help-text" class="${classMap(classes)}" type="button">
121
+ ${this._renderIcon()}
112
122
  ${this.text}
113
123
  </button>
114
124
  ${!this.skeleton ? html`
@@ -410,11 +410,6 @@
410
410
  "description": "Aligns the leading edge of text if value is set to \"text\" for left-aligned layouts, the trailing edge of text if value is set to \"text-end\" for right-aligned layouts",
411
411
  "type": "'text'|'text-end'|''"
412
412
  },
413
- {
414
- "name": "icon",
415
- "description": "REQUIRED: Preset icon key (e.g. \"tier1:gear\")",
416
- "type": "string"
417
- },
418
413
  {
419
414
  "name": "text",
420
415
  "description": "ACCESSIBILITY: REQUIRED: Accessible text for the button",
@@ -426,6 +421,11 @@
426
421
  "type": "boolean",
427
422
  "default": "false"
428
423
  },
424
+ {
425
+ "name": "icon",
426
+ "description": "Preset icon key (e.g. \"tier1:gear\")",
427
+ "type": "string"
428
+ },
429
429
  {
430
430
  "name": "expanded",
431
431
  "description": "Wether the controlled element is expanded. Replaces 'aria-expanded'",
@@ -456,12 +456,6 @@
456
456
  "description": "Aligns the leading edge of text if value is set to \"text\" for left-aligned layouts, the trailing edge of text if value is set to \"text-end\" for right-aligned layouts",
457
457
  "type": "'text'|'text-end'|''"
458
458
  },
459
- {
460
- "name": "icon",
461
- "attribute": "icon",
462
- "description": "REQUIRED: Preset icon key (e.g. \"tier1:gear\")",
463
- "type": "string"
464
- },
465
459
  {
466
460
  "name": "text",
467
461
  "attribute": "text",
@@ -475,6 +469,12 @@
475
469
  "type": "boolean",
476
470
  "default": "false"
477
471
  },
472
+ {
473
+ "name": "icon",
474
+ "attribute": "icon",
475
+ "description": "Preset icon key (e.g. \"tier1:gear\")",
476
+ "type": "string"
477
+ },
478
478
  {
479
479
  "name": "expanded",
480
480
  "attribute": "expanded",
@@ -797,11 +797,6 @@
797
797
  "description": "Aligns the leading edge of text if value is set to \"text\" for left-aligned layouts, the trailing edge of text if value is set to \"text-end\" for right-aligned layouts",
798
798
  "type": "'text'|'text-end'|''"
799
799
  },
800
- {
801
- "name": "icon",
802
- "description": "Preset icon key (e.g. \"tier1:gear\")",
803
- "type": "string"
804
- },
805
800
  {
806
801
  "name": "text",
807
802
  "description": "ACCESSIBILITY: REQUIRED: Text for the button",
@@ -819,6 +814,11 @@
819
814
  "type": "boolean",
820
815
  "default": "false"
821
816
  },
817
+ {
818
+ "name": "icon",
819
+ "description": "Preset icon key (e.g. \"tier1:gear\")",
820
+ "type": "string"
821
+ },
822
822
  {
823
823
  "name": "expanded",
824
824
  "description": "Wether the controlled element is expanded. Replaces 'aria-expanded'",
@@ -849,12 +849,6 @@
849
849
  "description": "Aligns the leading edge of text if value is set to \"text\" for left-aligned layouts, the trailing edge of text if value is set to \"text-end\" for right-aligned layouts",
850
850
  "type": "'text'|'text-end'|''"
851
851
  },
852
- {
853
- "name": "icon",
854
- "attribute": "icon",
855
- "description": "Preset icon key (e.g. \"tier1:gear\")",
856
- "type": "string"
857
- },
858
852
  {
859
853
  "name": "text",
860
854
  "attribute": "text",
@@ -875,6 +869,12 @@
875
869
  "type": "boolean",
876
870
  "default": "false"
877
871
  },
872
+ {
873
+ "name": "icon",
874
+ "attribute": "icon",
875
+ "description": "Preset icon key (e.g. \"tier1:gear\")",
876
+ "type": "string"
877
+ },
878
878
  {
879
879
  "name": "expanded",
880
880
  "attribute": "expanded",
@@ -14068,6 +14068,11 @@
14068
14068
  "type": "boolean",
14069
14069
  "default": "false"
14070
14070
  },
14071
+ {
14072
+ "name": "icon",
14073
+ "description": "Preset icon key (e.g. \"tier1:gear\")",
14074
+ "type": "string"
14075
+ },
14071
14076
  {
14072
14077
  "name": "skeleton",
14073
14078
  "description": "Render the component as a [skeleton loader](https://github.com/BrightspaceUI/core/tree/main/components/skeleton).",
@@ -14099,6 +14104,12 @@
14099
14104
  "type": "boolean",
14100
14105
  "default": "false"
14101
14106
  },
14107
+ {
14108
+ "name": "icon",
14109
+ "attribute": "icon",
14110
+ "description": "Preset icon key (e.g. \"tier1:gear\")",
14111
+ "type": "string"
14112
+ },
14102
14113
  {
14103
14114
  "name": "skeleton",
14104
14115
  "attribute": "skeleton",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brightspace-ui/core",
3
- "version": "3.135.5",
3
+ "version": "3.136.0",
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",