@brightspace-ui/core 3.155.9 → 3.156.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.
@@ -0,0 +1,23 @@
1
+ # Progress Bar
2
+ A progress bar communicates information relating to the progress of completion of a process or workflow.
3
+
4
+ ## Progress Bar [d2l-progress]
5
+
6
+ <!-- docs: demo code properties name:d2l-progress sandboxTitle:'Progress Bar' autoSize:false -->
7
+ ```html
8
+ <script type="module">
9
+ import '@brightspace-ui/core/components/progress/progress.js';
10
+ </script>
11
+
12
+ <d2l-progress label="Progress" value="8" max="10"></d2l-progress>
13
+ ```
14
+ <!-- docs: start hidden content -->
15
+ ### Properties
16
+
17
+ | Property | Type | Description |
18
+ |---|---|---|
19
+ | `max` | Number | The maximum value of the progress bar |
20
+ | `value` | Number | The current value of the progress bar |
21
+ | `label` | String | Label for the progress bar |
22
+ | `label-hidden` | Boolean | Hide the bar's label |
23
+ | `value-hidden` | Boolean | Hide the bar's value |
@@ -0,0 +1,87 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
5
+ <meta charset="UTF-8">
6
+ <link rel="stylesheet" href="../../demo/styles.css" type="text/css">
7
+ <script type="module">
8
+ import '../../demo/demo-page.js';
9
+
10
+ import '../progress.js';
11
+ </script>
12
+ </head>
13
+ <body unresolved>
14
+ <d2l-demo-page page-title="d2l-progress">
15
+
16
+ <h2>Basic</h2>
17
+
18
+ <d2l-demo-snippet>
19
+ <template>
20
+ <d2l-progress label="Progress" value="8" max="10"></d2l-progress>
21
+ </template>
22
+ </d2l-demo-snippet>
23
+
24
+ <h2>Small</h2>
25
+
26
+ <d2l-demo-snippet>
27
+ <template>
28
+ <d2l-progress small label="Progress(small)" value="8" max="10"></d2l-progress>
29
+ </template>
30
+ </d2l-demo-snippet>
31
+
32
+ <h2>Complete</h2>
33
+
34
+ <d2l-demo-snippet>
35
+ <template>
36
+ <d2l-progress label="Progress" value="10" max="10"></d2l-progress>
37
+ </template>
38
+ </d2l-demo-snippet>
39
+
40
+ <h2>Label Hidden</h2>
41
+
42
+ <d2l-demo-snippet>
43
+ <template>
44
+ <d2l-progress label="Progress" label-hidden value="50"></d2l-progress>
45
+ </template>
46
+ </d2l-demo-snippet>
47
+
48
+ <h2>Value Hidden</h2>
49
+
50
+ <d2l-demo-snippet>
51
+ <template>
52
+ <d2l-progress label="Progress" value-hidden value="50"></d2l-progress>
53
+ </template>
54
+ </d2l-demo-snippet>
55
+
56
+ <h2>Both Hidden</h2>
57
+
58
+ <d2l-demo-snippet>
59
+ <template>
60
+ <d2l-progress label="Progress" value-hidden label-hidden small value="50"></d2l-progress>
61
+ </template>
62
+ </d2l-demo-snippet>
63
+
64
+
65
+ <h2>Animation</h2>
66
+
67
+ <d2l-demo-snippet>
68
+ <template>
69
+ <button>Start Animation</button>
70
+ <d2l-progress label="Progress"></d2l-progress>
71
+ <script data-demo-hide>
72
+ (demo => {
73
+ const button = demo.querySelector('button');
74
+ const progress = demo.querySelector('d2l-progress');
75
+ button.addEventListener('click', () => {
76
+ for (let i = 0; i < 5; i++) {
77
+ setTimeout(() => progress.value = i * 25, i * 500);
78
+
79
+ }
80
+ });
81
+ })(document.currentScript.parentNode);
82
+ </script>
83
+ </template>
84
+ </d2l-demo-snippet>
85
+ </d2l-demo-page>
86
+ </body>
87
+ </html>
@@ -0,0 +1,126 @@
1
+ import '../../components/colors/colors.js';
2
+ import { bodyCompactStyles, bodySmallStyles } from '../typography/styles.js';
3
+ import { css, html, LitElement, unsafeCSS } from 'lit';
4
+ import { classMap } from 'lit/directives/class-map.js';
5
+ import { formatPercent } from '@brightspace-ui/intl';
6
+ import { getSeparator } from '@brightspace-ui/intl/lib/list.js';
7
+ import { ifDefined } from 'lit/directives/if-defined.js';
8
+
9
+ class Progress extends LitElement {
10
+
11
+ static get properties() {
12
+ return {
13
+ max: { type: Number, attribute: 'max' },
14
+ value: { type: Number },
15
+ label: { type: String },
16
+ labelHidden: { type: Boolean, attribute: 'label-hidden' },
17
+ valueHidden: { type: Boolean, attribute: 'value-hidden' },
18
+ small: { type: Boolean, reflect: true }
19
+ };
20
+ }
21
+
22
+ static get styles() {
23
+ return [bodySmallStyles, bodyCompactStyles, css`
24
+ :host {
25
+ display: block;
26
+ min-width: 6rem;
27
+ }
28
+ :host([hidden]) {
29
+ display: none;
30
+ }
31
+ .text {
32
+ display: flex;
33
+ justify-content: space-between;
34
+ }
35
+
36
+ progress {
37
+ --d2l-progress-color: var(--d2l-color-celestine);
38
+ -moz-appearance: none;
39
+ -webkit-appearance: none;
40
+ appearance: none;
41
+ background-color: var(--d2l-color-gypsum);
42
+ border: none;
43
+ border-radius: 0.9rem;
44
+ box-shadow: inset 0 2px var(--d2l-color-mica);
45
+ display: block;
46
+ height: 0.9rem;
47
+ width: 100%;
48
+ }
49
+ :host([small]) progress {
50
+ height: 0.6rem;
51
+ }
52
+
53
+ progress.complete {
54
+ --d2l-progress-color: var(--d2l-color-olivine);
55
+ }
56
+ /* this is necessary to avoid white bleed over rounded corners in chrome and safari */
57
+ progress::-webkit-progress-bar {
58
+ background-color: transparent;
59
+ }
60
+ `,
61
+ /* comma separating the selectors for these pseudo-elements causes them to break */
62
+ /* note: unable to get firefox to animate the width... seems animation is not implemented for progress in FF */
63
+ ...['-webkit-progress-value', '-moz-progress-bar'].map(selector => css`
64
+ progress::${unsafeCSS(selector)} {
65
+ background-color: var(--d2l-progress-color);
66
+ border: 1px solid transparent;
67
+ border-radius: 0.9rem;
68
+ transition: width 0.25s ease-out;
69
+ }
70
+ progress.complete::${unsafeCSS(selector)} {
71
+ transition: none;
72
+ }
73
+ /* these are necessary to avoid showing border when value is 0 */
74
+ progress[value="0"]::${unsafeCSS(selector)} {
75
+ border: none;
76
+ }
77
+ @media (prefers-reduced-motion: reduce) {
78
+ progress::${unsafeCSS(selector)} {
79
+ transition: none;
80
+ }
81
+ }
82
+ `)
83
+ ];
84
+ }
85
+
86
+ constructor() {
87
+ super();
88
+ this.labelHidden = false;
89
+ this.max = 100;
90
+ this.value = 0;
91
+ this.valueHidden = false;
92
+ }
93
+
94
+ render() {
95
+ const classes = {
96
+ 'complete': this.value === this.max
97
+ };
98
+ const textClasses = {
99
+ 'text': true,
100
+ 'd2l-body-small': this.small,
101
+ 'd2l-body-compact': !this.small
102
+ };
103
+
104
+ const percentage = Math.floor(100 * this.value / this.max) / 100;
105
+ const perecentageText = formatPercent(percentage);
106
+
107
+ return html`
108
+ <div class=${classMap(textClasses)} >
109
+ <span ?hidden=${this.labelHidden} id="label">${this.label}</span>
110
+ <span style="font-size: 0;">${getSeparator({ nonBreaking: true })}</span>
111
+ <span ?hidden=${this.valueHidden}>${perecentageText}</span>
112
+ </div>
113
+ <progress
114
+ aria-labelledby="${ifDefined(this.labelHidden ? undefined : 'label')}"
115
+ aria-label="${ifDefined(this.labelHidden ? this.label : undefined)}"
116
+ aria-valuetext="${perecentageText}"
117
+ class="${classMap(classes)}"
118
+ value="${this.value}"
119
+ max="${this.max}">
120
+ </progress>
121
+ `;
122
+ }
123
+
124
+ }
125
+
126
+ customElements.define('d2l-progress', Progress);
@@ -6,7 +6,6 @@ import { getComposedParent } from '../../helpers/dom.js';
6
6
  import { getFlag } from '../../helpers/flags.js';
7
7
  import { PageableMixin } from '../paging/pageable-mixin.js';
8
8
  import ResizeObserver from 'resize-observer-polyfill/dist/ResizeObserver.es.js';
9
- import { RtlMixin } from '../../mixins/rtl/rtl-mixin.js';
10
9
  import { SelectionMixin } from '../selection/selection-mixin.js';
11
10
 
12
11
  const colSyncFix = getFlag('GAUD-8228-8186-improved-table-col-sync', true);
@@ -31,12 +30,9 @@ export const tableStyles = css`
31
30
  font-weight: inherit;
32
31
  height: var(--d2l-table-cell-height);
33
32
  padding: var(--d2l-table-cell-padding);
34
- text-align: left;
33
+ text-align: start;
35
34
  vertical-align: middle;
36
35
  }
37
- d2l-table-wrapper[dir="rtl"] .d2l-table > * > tr > * {
38
- text-align: right;
39
- }
40
36
  d2l-table-wrapper d2l-button-icon {
41
37
  --d2l-button-icon-min-height: calc(var(--d2l-table-cell-overall-height) - 2 * var(--d2l-table-cell-col-sort-button-size-offset));
42
38
  --d2l-button-icon-min-width: calc(var(--d2l-table-cell-overall-height) - 2 * var(--d2l-table-cell-col-sort-button-size-offset));
@@ -75,13 +71,11 @@ export const tableStyles = css`
75
71
  }
76
72
 
77
73
  /* default cells */
78
- d2l-table-wrapper[type="default"]:not([dir="rtl"]) .d2l-table > * > tr > *,
79
- d2l-table-wrapper[type="default"][dir="rtl"] .d2l-table > * > tr > .d2l-table-cell-first {
80
- border-right: var(--d2l-table-border);
74
+ d2l-table-wrapper[type="default"] .d2l-table > * > tr > * {
75
+ border-inline-end: var(--d2l-table-border);
81
76
  }
82
- d2l-table-wrapper[type="default"][dir="rtl"] .d2l-table > * > tr > *,
83
- d2l-table-wrapper[type="default"]:not([dir="rtl"]) .d2l-table > * > tr > .d2l-table-cell-first {
84
- border-left: var(--d2l-table-border);
77
+ d2l-table-wrapper[type="default"] .d2l-table > * > tr > .d2l-table-cell-first {
78
+ border-inline-start: var(--d2l-table-border);
85
79
  }
86
80
  d2l-table-wrapper[type="default"] .d2l-table-row-first > * {
87
81
  border-top: var(--d2l-table-border); /* add top border to default first row */
@@ -139,34 +133,28 @@ export const tableStyles = css`
139
133
  }
140
134
 
141
135
  /* border radiuses */
142
- d2l-table-wrapper[type="default"]:not([dir="rtl"]) .d2l-table-row-first > .d2l-table-cell-first,
143
- d2l-table-wrapper[type="default"][dir="rtl"] .d2l-table-row-first > .d2l-table-cell-last {
144
- border-top-left-radius: var(--d2l-table-border-radius);
136
+ d2l-table-wrapper[type="default"] .d2l-table-row-first > .d2l-table-cell-first {
137
+ border-start-start-radius: var(--d2l-table-border-radius);
145
138
  }
146
- d2l-table-wrapper[type="default"]:not([dir="rtl"]) .d2l-table-row-first > .d2l-table-cell-last,
147
- d2l-table-wrapper[type="default"][dir="rtl"] .d2l-table-row-first > .d2l-table-cell-first {
148
- border-top-right-radius: var(--d2l-table-border-radius);
139
+ d2l-table-wrapper[type="default"] .d2l-table-row-first > .d2l-table-cell-last {
140
+ border-start-end-radius: var(--d2l-table-border-radius);
149
141
  }
150
- d2l-table-wrapper[type="default"]:not([dir="rtl"]) .d2l-table-row-last > .d2l-table-cell-first,
151
- d2l-table-wrapper[type="default"][dir="rtl"] .d2l-table-row-last > .d2l-table-cell-last {
152
- border-bottom-left-radius: var(--d2l-table-border-radius);
142
+ d2l-table-wrapper[type="default"] .d2l-table-row-last > .d2l-table-cell-first {
143
+ border-end-start-radius: var(--d2l-table-border-radius);
153
144
  }
154
- d2l-table-wrapper[type="default"]:not([dir="rtl"]) .d2l-table-row-last > .d2l-table-cell-last,
155
- d2l-table-wrapper[type="default"][dir="rtl"] .d2l-table-row-last > .d2l-table-cell-first {
156
- border-bottom-right-radius: var(--d2l-table-border-radius);
145
+ d2l-table-wrapper[type="default"] .d2l-table-row-last > .d2l-table-cell-last {
146
+ border-end-end-radius: var(--d2l-table-border-radius);
157
147
  }
158
148
 
159
149
  /* selected rows */
160
150
  .d2l-table > tbody > tr[selected] {
161
151
  background-color: var(--d2l-table-row-background-color-selected);
162
152
  }
163
- d2l-table-wrapper[type="default"]:not([dir="rtl"]) .d2l-table > tbody > tr[selected] > .d2l-table-cell-last,
164
- d2l-table-wrapper[type="default"][dir="rtl"] .d2l-table > tbody > tr[selected] > .d2l-table-cell-first {
165
- border-right-color: var(--d2l-table-row-border-color-selected);
153
+ d2l-table-wrapper[type="default"] .d2l-table > tbody > tr[selected] > .d2l-table-cell-last {
154
+ border-inline-end-color: var(--d2l-table-row-border-color-selected);
166
155
  }
167
- d2l-table-wrapper[type="default"]:not([dir="rtl"]) .d2l-table > tbody > tr[selected] > .d2l-table-cell-first,
168
- d2l-table-wrapper[type="default"][dir="rtl"] .d2l-table > tbody > tr[selected] > .d2l-table-cell-last {
169
- border-left-color: var(--d2l-table-row-border-color-selected);
156
+ d2l-table-wrapper[type="default"] .d2l-table > tbody > tr[selected] > .d2l-table-cell-first {
157
+ border-inline-start-color: var(--d2l-table-row-border-color-selected);
170
158
  }
171
159
  .d2l-table > tbody > tr[selected] > *,
172
160
  .d2l-table > * > tr.d2l-table-selected-previous > * {
@@ -178,17 +166,11 @@ export const tableStyles = css`
178
166
  }
179
167
 
180
168
  /* no-column-border */
181
- d2l-table-wrapper[type="default"][no-column-border]:not([dir="rtl"]) .d2l-table > tbody > tr > *:not(.d2l-table-cell-last),
182
- d2l-table-wrapper[type="default"]:not([dir="rtl"]) .d2l-table[no-column-border] > tbody > tr > *:not(.d2l-table-cell-last),
183
- d2l-table-wrapper[type="default"][no-column-border]:not([dir="rtl"]) .d2l-table > thead > tr > *:not(.d2l-table-cell-last),
184
- d2l-table-wrapper[type="default"]:not([dir="rtl"]) .d2l-table[no-column-border] > thead > tr > *:not(.d2l-table-cell-last) {
185
- border-right: none;
186
- }
187
- d2l-table-wrapper[type="default"][no-column-border][dir="rtl"] .d2l-table > tbody > tr > *:not(.d2l-table-cell-last),
188
- d2l-table-wrapper[type="default"][dir="rtl"] .d2l-table[no-column-border] > tbody > tr > *:not(.d2l-table-cell-last),
189
- d2l-table-wrapper[type="default"][no-column-border][dir="rtl"] .d2l-table > thead > tr > *:not(.d2l-table-cell-last),
190
- d2l-table-wrapper[type="default"][dir="rtl"] .d2l-table[no-column-border] > thead > tr > *:not(.d2l-table-cell-last) {
191
- border-left: none;
169
+ d2l-table-wrapper[type="default"][no-column-border] .d2l-table > tbody > tr > *:not(.d2l-table-cell-last),
170
+ d2l-table-wrapper[type="default"] .d2l-table[no-column-border] > tbody > tr > *:not(.d2l-table-cell-last),
171
+ d2l-table-wrapper[type="default"][no-column-border] .d2l-table > thead > tr > *:not(.d2l-table-cell-last),
172
+ d2l-table-wrapper[type="default"] .d2l-table[no-column-border] > thead > tr > *:not(.d2l-table-cell-last) {
173
+ border-inline-end: none;
192
174
  }
193
175
 
194
176
  /* sticky-headers */
@@ -196,18 +178,11 @@ export const tableStyles = css`
196
178
  /* all sticky cells */
197
179
  d2l-table-wrapper[sticky-headers] .d2l-table > * > tr > .d2l-table-sticky-cell,
198
180
  d2l-table-wrapper[sticky-headers] .d2l-table > * > tr > [sticky] {
181
+ inset-inline-start: 0;
199
182
  position: -webkit-sticky;
200
183
  position: sticky;
201
184
  z-index: 1;
202
185
  }
203
- d2l-table-wrapper:not([dir="rtl"])[sticky-headers] .d2l-table > * > tr > .d2l-table-sticky-cell,
204
- d2l-table-wrapper:not([dir="rtl"])[sticky-headers] .d2l-table > * > tr > [sticky] {
205
- left: 0;
206
- }
207
- d2l-table-wrapper[dir="rtl"][sticky-headers] .d2l-table > * > tr > .d2l-table-sticky-cell,
208
- d2l-table-wrapper[dir="rtl"][sticky-headers] .d2l-table > * > tr > [sticky] {
209
- right: 0;
210
- }
211
186
 
212
187
  /* non-header sticky cells */
213
188
  d2l-table-wrapper[sticky-headers] .d2l-table > * > tr:not([selected]) {
@@ -241,13 +216,9 @@ export const tableStyles = css`
241
216
  }
242
217
 
243
218
  /* first column that's sticky: offset by size of border-radius so top/bottom border doesn't show through (default style only) */
244
- d2l-table-wrapper[sticky-headers][type="default"]:not([dir="rtl"]) .d2l-table > * > tr > .d2l-table-sticky-cell.d2l-table-cell-first,
245
- d2l-table-wrapper[sticky-headers][type="default"]:not([dir="rtl"]) .d2l-table > * > tr > [sticky].d2l-table-cell-first {
246
- left: var(--d2l-table-border-radius-sticky-offset, 0);
247
- }
248
- d2l-table-wrapper[sticky-headers][type="default"][dir="rtl"] .d2l-table > * > tr > .d2l-table-sticky-cell.d2l-table-cell-first,
249
- d2l-table-wrapper[sticky-headers][type="default"][dir="rtl"] .d2l-table > * > tr > [sticky].d2l-table-cell-first {
250
- right: var(--d2l-table-border-radius-sticky-offset, 0);
219
+ d2l-table-wrapper[sticky-headers][type="default"] .d2l-table > * > tr > .d2l-table-sticky-cell.d2l-table-cell-first,
220
+ d2l-table-wrapper[sticky-headers][type="default"] .d2l-table > * > tr > [sticky].d2l-table-cell-first {
221
+ inset-inline-start: var(--d2l-table-border-radius-sticky-offset, 0);
251
222
  }
252
223
 
253
224
  /* sticky + scroll-wrapper */
@@ -296,7 +267,7 @@ const SELECTORS = {
296
267
  * @slot controls - Slot for `d2l-table-controls` to be rendered above the table
297
268
  * @slot pager - Slot for `d2l-pager-load-more` to be rendered below the table
298
269
  */
299
- export class TableWrapper extends RtlMixin(PageableMixin(SelectionMixin(LitElement))) {
270
+ export class TableWrapper extends PageableMixin(SelectionMixin(LitElement)) {
300
271
 
301
272
  static get properties() {
302
273
  return {
@@ -11749,6 +11749,76 @@
11749
11749
  }
11750
11750
  ]
11751
11751
  },
11752
+ {
11753
+ "name": "d2l-progress",
11754
+ "path": "./components/progress/progress.js",
11755
+ "attributes": [
11756
+ {
11757
+ "name": "label",
11758
+ "type": "string"
11759
+ },
11760
+ {
11761
+ "name": "small",
11762
+ "type": "boolean"
11763
+ },
11764
+ {
11765
+ "name": "label-hidden",
11766
+ "type": "boolean",
11767
+ "default": "false"
11768
+ },
11769
+ {
11770
+ "name": "max",
11771
+ "type": "number",
11772
+ "default": "100"
11773
+ },
11774
+ {
11775
+ "name": "value",
11776
+ "type": "number",
11777
+ "default": "0"
11778
+ },
11779
+ {
11780
+ "name": "value-hidden",
11781
+ "type": "boolean",
11782
+ "default": "false"
11783
+ }
11784
+ ],
11785
+ "properties": [
11786
+ {
11787
+ "name": "label",
11788
+ "attribute": "label",
11789
+ "type": "string"
11790
+ },
11791
+ {
11792
+ "name": "small",
11793
+ "attribute": "small",
11794
+ "type": "boolean"
11795
+ },
11796
+ {
11797
+ "name": "labelHidden",
11798
+ "attribute": "label-hidden",
11799
+ "type": "boolean",
11800
+ "default": "false"
11801
+ },
11802
+ {
11803
+ "name": "max",
11804
+ "attribute": "max",
11805
+ "type": "number",
11806
+ "default": "100"
11807
+ },
11808
+ {
11809
+ "name": "value",
11810
+ "attribute": "value",
11811
+ "type": "number",
11812
+ "default": "0"
11813
+ },
11814
+ {
11815
+ "name": "valueHidden",
11816
+ "attribute": "value-hidden",
11817
+ "type": "boolean",
11818
+ "default": "false"
11819
+ }
11820
+ ]
11821
+ },
11752
11822
  {
11753
11823
  "name": "d2l-test-scroll-wrapper",
11754
11824
  "path": "./components/scroll-wrapper/demo/scroll-wrapper-test.js",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brightspace-ui/core",
3
- "version": "3.155.9",
3
+ "version": "3.156.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",