kemet-ui 1.0.0 → 1.2.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.
- package/custom-elements.json +1605 -225
- package/dist/components/{kemet-accordion-panel.js → kemet-accordion/kemet-accordion-panel.js} +0 -0
- package/dist/components/{kemet-accordion.js → kemet-accordion/kemet-accordion.js} +0 -0
- package/dist/components/{kemet-badge.js → kemet-badge/kemet-badge.js} +0 -0
- package/dist/components/{kemet-button.js → kemet-button/kemet-button.js} +0 -0
- package/dist/components/kemet-carousel/kemet-carousel-current.js +36 -0
- package/dist/components/kemet-carousel/kemet-carousel-first.js +47 -0
- package/dist/components/kemet-carousel/kemet-carousel-last.js +47 -0
- package/dist/components/kemet-carousel/kemet-carousel-link.js +59 -0
- package/dist/components/kemet-carousel/kemet-carousel-next.js +47 -0
- package/dist/components/kemet-carousel/kemet-carousel-prev.js +47 -0
- package/dist/components/kemet-carousel/kemet-carousel-slide.js +51 -0
- package/dist/components/kemet-carousel/kemet-carousel-total.js +36 -0
- package/dist/components/kemet-carousel/kemet-carousel.js +492 -0
- package/dist/components/{kemet-checkbox.js → kemet-checkbox/kemet-checkbox.js} +0 -0
- package/dist/components/{kemet-combo.js → kemet-combo/kemet-combo.js} +0 -0
- package/dist/components/{kemet-count.js → kemet-count/kemet-count.js} +0 -0
- package/dist/components/{kemet-draggable.js → kemet-draggable/kemet-draggable.js} +0 -0
- package/dist/components/{kemet-drawer.js → kemet-drawer/kemet-drawer.js} +0 -0
- package/dist/components/{kemet-drawer.styles.js → kemet-drawer/kemet-drawer.styles.js} +0 -0
- package/dist/components/kemet-fab/kemet-fab.js +209 -0
- package/dist/components/{kemet-field.js → kemet-field/kemet-field.js} +0 -0
- package/dist/components/{kemet-flipcard-trigger.js → kemet-flipcard/kemet-flipcard-trigger.js} +0 -0
- package/dist/components/{kemet-flipcard.js → kemet-flipcard/kemet-flipcard.js} +0 -0
- package/dist/components/{kemet-icon.js → kemet-icon/kemet-icon.js} +0 -0
- package/dist/components/{kemet-input.js → kemet-input/kemet-input.js} +15 -4
- package/dist/components/{kemet-modal-close.js → kemet-modal/kemet-modal-close.js} +0 -0
- package/dist/components/{kemet-modal.js → kemet-modal/kemet-modal.js} +0 -0
- package/dist/components/{kemet-modal.styles.js → kemet-modal/kemet-modal.styles.js} +0 -0
- package/dist/components/kemet-password/kemet-password.js +278 -0
- package/dist/components/{kemet-popover-close.js → kemet-popover/kemet-popover-close.js} +0 -0
- package/dist/components/{kemet-popover.effects.styles.js → kemet-popover/kemet-popover.effects.styles.js} +0 -0
- package/dist/components/{kemet-popover.js → kemet-popover/kemet-popover.js} +0 -0
- package/dist/components/{kemet-popover.tooltip.styles.js → kemet-popover/kemet-popover.tooltip.styles.js} +0 -0
- package/dist/components/{kemet-radio.js → kemet-radio/kemet-radio.js} +0 -0
- package/dist/components/{kemet-radios.js → kemet-radio/kemet-radios.js} +0 -0
- package/dist/components/{kemet-rotator.js → kemet-rotator/kemet-rotator.js} +0 -0
- package/dist/components/{kemet-scroll-link.js → kemet-scroll-link/kemet-scroll-link.js} +0 -0
- package/dist/components/{kemet-scroll-nav.js → kemet-scroll-nav/kemet-scroll-nav.js} +0 -0
- package/dist/components/{kemet-scroll-snap-paginator.js → kemet-scroll-snap/kemet-scroll-snap-paginator.js} +0 -0
- package/dist/components/{kemet-scroll-snap-slide.js → kemet-scroll-snap/kemet-scroll-snap-slide.js} +0 -0
- package/dist/components/{kemet-scroll-snap.js → kemet-scroll-snap/kemet-scroll-snap.js} +0 -0
- package/dist/components/{kemet-option.js → kemet-select/kemet-option.js} +0 -0
- package/dist/components/{kemet-select.js → kemet-select/kemet-select.js} +0 -0
- package/dist/components/{kemet-svg.js → kemet-svgs/kemet-svg.js} +0 -0
- package/dist/components/{kemet-svgs.js → kemet-svgs/kemet-svgs.js} +0 -0
- package/dist/components/{kemet-tab-panel.js → kemet-tabs/kemet-tab-panel.js} +0 -0
- package/dist/components/{kemet-tab.js → kemet-tabs/kemet-tab.js} +0 -0
- package/dist/components/{kemet-tabs.js → kemet-tabs/kemet-tabs.js} +0 -0
- package/dist/components/{kemet-tabs.styles.js → kemet-tabs/kemet-tabs.styles.js} +0 -0
- package/dist/components/{kemet-textarea.js → kemet-textarea/kemet-textarea.js} +0 -0
- package/dist/components/{kemet-toggle.js → kemet-toggle/kemet-toggle.js} +0 -0
- package/dist/components/kemet-tracker/kemet-tracker-step.js +239 -0
- package/dist/components/kemet-tracker/kemet-tracker.js +76 -0
- package/dist/kemet-components.cjs +1809 -140
- package/dist/kemet-components.js +1805 -141
- package/dist/kemet-components.min.js +574 -87
- package/dist/styles/components/_config.scss +4 -0
- package/dist/styles/{scss/components → components}/accordion.scss +0 -0
- package/dist/styles/{scss/components → components}/drawer.scss +2 -2
- package/dist/styles/{scss/components → components}/modal.scss +0 -0
- package/dist/styles/{scss/components → components}/scrollsnap.scss +0 -0
- package/dist/styles/{scss/core → core}/_config.scss +22 -22
- package/dist/styles/{scss/core → core}/_helpers.scss +7 -3
- package/dist/styles/{scss/core → core}/attributes.scss +0 -0
- package/dist/styles/{scss/core → core}/base.scss +0 -0
- package/dist/styles/{scss/core → core}/layout.scss +0 -0
- package/dist/styles/kemet.components.css +1 -80
- package/dist/styles/kemet.components.css.map +1 -1
- package/dist/styles/{scss/kemet.components.scss → kemet.components.scss} +0 -1
- package/dist/styles/kemet.core.css +1 -1
- package/dist/styles/kemet.core.css.map +1 -1
- package/dist/styles/{scss/kemet.core.scss → kemet.core.scss} +0 -0
- package/dist/utilities/controllers/forms.js +123 -0
- package/package.json +5 -3
- package/dist/styles/scss/components/_config.scss +0 -4
- package/dist/styles/scss/components/carousel.scss +0 -64
|
File without changes
|
|
@@ -322,6 +322,13 @@ export default class KemetInput extends LitElement {
|
|
|
322
322
|
inputType: {
|
|
323
323
|
type: String,
|
|
324
324
|
},
|
|
325
|
+
/**
|
|
326
|
+
* Determines if the input is focused
|
|
327
|
+
*/
|
|
328
|
+
focused: {
|
|
329
|
+
type: Boolean,
|
|
330
|
+
reflect: true,
|
|
331
|
+
},
|
|
325
332
|
};
|
|
326
333
|
}
|
|
327
334
|
|
|
@@ -336,6 +343,7 @@ export default class KemetInput extends LitElement {
|
|
|
336
343
|
this.iconSize = 20;
|
|
337
344
|
this.validateOnBlur = false;
|
|
338
345
|
this.isPasswordVisible = false;
|
|
346
|
+
this.focused = false;
|
|
339
347
|
|
|
340
348
|
/**
|
|
341
349
|
* Used only for form reactive controller
|
|
@@ -349,6 +357,10 @@ export default class KemetInput extends LitElement {
|
|
|
349
357
|
this.field = this.closest('kemet-field');
|
|
350
358
|
this.form = this.closest('form');
|
|
351
359
|
this.slug = this.field ? this.field.slug : 'input';
|
|
360
|
+
|
|
361
|
+
if (this.field) {
|
|
362
|
+
this.field.addEventListener('fmc-password-status', event => this.handleStatus(event));
|
|
363
|
+
}
|
|
352
364
|
}
|
|
353
365
|
|
|
354
366
|
render() {
|
|
@@ -463,7 +475,7 @@ export default class KemetInput extends LitElement {
|
|
|
463
475
|
* @private
|
|
464
476
|
*/
|
|
465
477
|
handleFocus() {
|
|
466
|
-
this.
|
|
478
|
+
this.focused = true;
|
|
467
479
|
|
|
468
480
|
/**
|
|
469
481
|
* Fires when the input receives and loses focus
|
|
@@ -487,7 +499,7 @@ export default class KemetInput extends LitElement {
|
|
|
487
499
|
this.validity = this.input.validity;
|
|
488
500
|
}
|
|
489
501
|
|
|
490
|
-
this.
|
|
502
|
+
this.focused = false;
|
|
491
503
|
|
|
492
504
|
/**
|
|
493
505
|
* Fires when the input receives and loses focus
|
|
@@ -537,8 +549,7 @@ export default class KemetInput extends LitElement {
|
|
|
537
549
|
* Handles when the input receives input
|
|
538
550
|
* @private
|
|
539
551
|
*/
|
|
540
|
-
handleInput(
|
|
541
|
-
this.inputType = e.inputType;
|
|
552
|
+
handleInput() {
|
|
542
553
|
this.value = this.input.value;
|
|
543
554
|
|
|
544
555
|
/**
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import { html, css, LitElement } from 'lit';
|
|
2
|
+
|
|
3
|
+
export default class KemetPassword extends LitElement {
|
|
4
|
+
static get styles() {
|
|
5
|
+
return [
|
|
6
|
+
css`
|
|
7
|
+
:host {
|
|
8
|
+
color: inherit;
|
|
9
|
+
display: none;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
:host([show]) {
|
|
13
|
+
display: block;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
p {
|
|
17
|
+
margin: 1.6rem 0;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.status {
|
|
21
|
+
display: grid;
|
|
22
|
+
align-items: center;
|
|
23
|
+
grid-template-columns: 1fr auto;
|
|
24
|
+
line-height: 1;
|
|
25
|
+
margin-top: 0.8rem;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.status > span {
|
|
29
|
+
text-transform: capitalize;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.status--weak,
|
|
33
|
+
.status--better {
|
|
34
|
+
color: var(--kemet-color-error);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.status--strong {
|
|
38
|
+
color: var(--kemet-color-success);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.indicator {
|
|
42
|
+
display: flex;
|
|
43
|
+
gap: 0.4rem;
|
|
44
|
+
margin: 0;
|
|
45
|
+
list-style: none;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.indicator li {
|
|
49
|
+
width: 1.6rem;
|
|
50
|
+
height: 0.2rem;
|
|
51
|
+
background-color: var(--fds-color--gray2);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.status--weak .indicator li:nth-child(1) {
|
|
55
|
+
background-color: var(--kemet-color-error);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.status--better .indicator li:nth-child(1),
|
|
59
|
+
.status--better .indicator li:nth-child(2) {
|
|
60
|
+
background-color: var(--kemet-color-error);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.status--strong .indicator li {
|
|
64
|
+
background-color: var(--kemet-color-success);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.rules {
|
|
68
|
+
color: var(--kemet-color-primary);
|
|
69
|
+
list-style: none;
|
|
70
|
+
font-size: 90%;
|
|
71
|
+
padding-left: 2rem;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.rules li {
|
|
75
|
+
position: relative;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.rules kemet-icon {
|
|
79
|
+
color: var(--kemet-color-success);
|
|
80
|
+
position: absolute;
|
|
81
|
+
left: -2.4rem;
|
|
82
|
+
}
|
|
83
|
+
`,
|
|
84
|
+
];
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
static get properties() {
|
|
88
|
+
return {
|
|
89
|
+
/**
|
|
90
|
+
* An array of objects containing the rules the password must meet
|
|
91
|
+
*/
|
|
92
|
+
rules: {
|
|
93
|
+
type: Array,
|
|
94
|
+
},
|
|
95
|
+
/**
|
|
96
|
+
* Controls the display of the component
|
|
97
|
+
*/
|
|
98
|
+
show: {
|
|
99
|
+
type: Boolean,
|
|
100
|
+
reflect: true,
|
|
101
|
+
},
|
|
102
|
+
/**
|
|
103
|
+
* The value of the input component
|
|
104
|
+
*/
|
|
105
|
+
value: {
|
|
106
|
+
type: String,
|
|
107
|
+
},
|
|
108
|
+
/**
|
|
109
|
+
* A message that is above the rules
|
|
110
|
+
*/
|
|
111
|
+
message: {
|
|
112
|
+
type: String,
|
|
113
|
+
},
|
|
114
|
+
/**
|
|
115
|
+
* The strength of the password. Weak | Better | Strong
|
|
116
|
+
*/
|
|
117
|
+
strength: {
|
|
118
|
+
type: String,
|
|
119
|
+
},
|
|
120
|
+
icon: {
|
|
121
|
+
type: String,
|
|
122
|
+
},
|
|
123
|
+
iconSize: {
|
|
124
|
+
type: Number,
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
constructor() {
|
|
130
|
+
super();
|
|
131
|
+
|
|
132
|
+
// managed properties
|
|
133
|
+
this.rules = [
|
|
134
|
+
{ pattern: '(?=.{8,}$)', message: 'At least 8 characters long' },
|
|
135
|
+
{ pattern: '(?=.*[a-z])(?=.*[A-Z])', message: 'Uppercase and lowercase' },
|
|
136
|
+
{ pattern: '(?=.*[0-9])', message: 'At least one number (0-9)' },
|
|
137
|
+
];
|
|
138
|
+
this.message = 'Please make sure you meet all the requirements.';
|
|
139
|
+
this.icon = 'check2';
|
|
140
|
+
this.iconSize = 16;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
firstUpdated() {
|
|
144
|
+
// standard properties
|
|
145
|
+
this.field = this.closest('kemet-field');
|
|
146
|
+
this.input = this.field.querySelector('[slot="input"]');
|
|
147
|
+
|
|
148
|
+
// managed properties
|
|
149
|
+
this.slug = this.field.slug;
|
|
150
|
+
|
|
151
|
+
// events listeners
|
|
152
|
+
this.input.addEventListener('kemet-input-input', this.handleInput.bind(this));
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
render() {
|
|
156
|
+
return html`
|
|
157
|
+
<div role="alert" aria-live="assertive">
|
|
158
|
+
<div class="status status--${this.strength}" part="status">
|
|
159
|
+
<span>${this.strength}</span>
|
|
160
|
+
<ul class="indicator" part="indicator">
|
|
161
|
+
<li></li>
|
|
162
|
+
<li></li>
|
|
163
|
+
<li></li>
|
|
164
|
+
</ul>
|
|
165
|
+
</div>
|
|
166
|
+
<p class="message" part="message">${this.message}</p>
|
|
167
|
+
<ul class="rules" part="rules">
|
|
168
|
+
${this.makeRules()}
|
|
169
|
+
</ul>
|
|
170
|
+
</div>
|
|
171
|
+
`;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Makes the list of rules
|
|
176
|
+
* @private
|
|
177
|
+
* @returns {templateResults} the criteria rules
|
|
178
|
+
*/
|
|
179
|
+
makeRules() {
|
|
180
|
+
if (this.input) {
|
|
181
|
+
const rules = this.rules.map((rule, index) => {
|
|
182
|
+
const regExp = new RegExp(rule.pattern);
|
|
183
|
+
const meetsCriteria = regExp.test(this.input.value);
|
|
184
|
+
this.rules[index].meetsCriteria = meetsCriteria;
|
|
185
|
+
return html`<li>${this.makeCheckIcon(meetsCriteria)} ${rule.message}</li>`;
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
return rules;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Makes the check icon if the criteria has been met
|
|
196
|
+
* @param {boolean} meetsCriteria
|
|
197
|
+
* @private
|
|
198
|
+
* @returns {templateResults} an icon component
|
|
199
|
+
*/
|
|
200
|
+
makeCheckIcon(meetsCriteria) {
|
|
201
|
+
if (meetsCriteria) {
|
|
202
|
+
return html`<kemet-icon icon=${this.icon} size=${this.iconSize}></kemet-icon>`;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Handles the kemet-input-input event
|
|
210
|
+
* @param {*} event
|
|
211
|
+
* @private
|
|
212
|
+
*/
|
|
213
|
+
handleInput(event) {
|
|
214
|
+
this.value = event.detail;
|
|
215
|
+
this.setStrength();
|
|
216
|
+
this.visibility();
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Determines the strength of the password
|
|
221
|
+
* @private
|
|
222
|
+
*/
|
|
223
|
+
setStrength() {
|
|
224
|
+
// We use a setTimeout here because makeRules adds the meetsCriteria
|
|
225
|
+
// property to the rules. We need that to be set by render() before
|
|
226
|
+
// setting the Strength because the percentage calc is based on it
|
|
227
|
+
setTimeout(() => {
|
|
228
|
+
const totalRules = this.rules.length;
|
|
229
|
+
const metRules = this.rules.filter(rule => rule.meetsCriteria).length;
|
|
230
|
+
const metRulesPercentage = Math.round((metRules / totalRules) * 100) / 100;
|
|
231
|
+
|
|
232
|
+
if (metRulesPercentage <= 0.33) {
|
|
233
|
+
this.strength = 'weak';
|
|
234
|
+
this.status = 'error';
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
if (metRulesPercentage > 0.33 && metRulesPercentage <= 0.67) {
|
|
238
|
+
this.strength = 'better';
|
|
239
|
+
this.status = 'error';
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if (metRulesPercentage > 0.67) {
|
|
243
|
+
this.strength = 'strong';
|
|
244
|
+
this.status = 'success';
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Fires when there's a change in status.
|
|
249
|
+
*/
|
|
250
|
+
this.dispatchEvent(
|
|
251
|
+
new CustomEvent('kemet-password-status', {
|
|
252
|
+
bubbles: true,
|
|
253
|
+
composed: true,
|
|
254
|
+
detail: {
|
|
255
|
+
status: this.status,
|
|
256
|
+
validity: { meetsPasswordCriteria: this.status === 'success' },
|
|
257
|
+
element: this,
|
|
258
|
+
},
|
|
259
|
+
}),
|
|
260
|
+
);
|
|
261
|
+
}, 1);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Determines whether to show or hide the component
|
|
266
|
+
* @private
|
|
267
|
+
*/
|
|
268
|
+
visibility() {
|
|
269
|
+
if (this.value.length > 0) {
|
|
270
|
+
this.show = true;
|
|
271
|
+
} else {
|
|
272
|
+
this.show = false;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// eslint-disable-next-line no-unused-expressions
|
|
278
|
+
customElements.get('kemet-password') || customElements.define('kemet-password', KemetPassword);
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/dist/components/{kemet-scroll-snap-slide.js → kemet-scroll-snap/kemet-scroll-snap-slide.js}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { html, css, LitElement } from 'lit';
|
|
2
|
+
|
|
3
|
+
export default class KemetTrackerStep extends LitElement {
|
|
4
|
+
static get styles() {
|
|
5
|
+
return [
|
|
6
|
+
css`
|
|
7
|
+
:host {
|
|
8
|
+
--kemet-tracker-step-dot-size: 50px;
|
|
9
|
+
--kemet-tracker-step-dot-size-mobile: 25px;
|
|
10
|
+
--kemet-tracker-step-dot-gap: 4px;
|
|
11
|
+
--kemet-tracker-step-standard-line-weight: 1px;
|
|
12
|
+
--kemet-tracker-step-completed-line-weight: 3px;
|
|
13
|
+
--kemet-tracker-step-dot-transition: all 300ms ease-in-out;
|
|
14
|
+
|
|
15
|
+
position: relative;
|
|
16
|
+
width: 100%;
|
|
17
|
+
text-align: center;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.dot {
|
|
21
|
+
font-size: var(--kemet-tracker-step-dot-font-size, 90%);
|
|
22
|
+
color: var(--kemet-tracker-step-dot-color, var(--kemet-color-primary));
|
|
23
|
+
display: flex;
|
|
24
|
+
align-items: center;
|
|
25
|
+
justify-content: center;
|
|
26
|
+
margin: 0 auto;
|
|
27
|
+
position: relative;
|
|
28
|
+
z-index: 1;
|
|
29
|
+
width: var(--kemet-tracker-step-dot-size);
|
|
30
|
+
height: var(--kemet-tracker-step-dot-size);
|
|
31
|
+
border-radius: 100%;
|
|
32
|
+
transition: var(--kemet-tracker-step-dot-transition);
|
|
33
|
+
background-color: var(--kemet-tracker-step-dot-background-color, var(--kemet-color-white));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.dot::after {
|
|
37
|
+
content: "";
|
|
38
|
+
width: unset;
|
|
39
|
+
height: unset;
|
|
40
|
+
position: absolute;
|
|
41
|
+
top: var(--kemet-tracker-step-dot-gap);
|
|
42
|
+
left: var(--kemet-tracker-step-dot-gap);
|
|
43
|
+
right: var(--kemet-tracker-step-dot-gap);
|
|
44
|
+
bottom: var(--kemet-tracker-step-dot-gap);
|
|
45
|
+
z-index: -1;
|
|
46
|
+
border-radius: 100%;
|
|
47
|
+
transition: var(--kemet-tracker-step-dot-transition);
|
|
48
|
+
border: var(--kemet-tracker-step-dot-border, 1px solid var(--kemet-color-primary));
|
|
49
|
+
background-color: var(--kemet-tracker-step-dot-fill-color, transparent);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
:host([completed]) .dot {
|
|
53
|
+
color: var(--kemet-tracker-step-completed-color, var(--kemet-color-white));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
:host([completed]) .dot::after {
|
|
57
|
+
border: 0;
|
|
58
|
+
background-color: var(--kemet-tracker-step-completed-fill-color, var(--kemet-color-success));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
:host([current]) .dot.animate {
|
|
62
|
+
color: var(--kemet-tracker-step-current-color, var(--kemet-color-white));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
:host([current]) .dot.animate::after {
|
|
66
|
+
border: 0;
|
|
67
|
+
background-color: var(--kemet-tracker-step-current-fill-color, var(--kemet-color-primary));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
:host([mobile]) .dot {
|
|
71
|
+
width: var(--kemet-tracker-step-dot-size-mobile);
|
|
72
|
+
height: var(--kemet-tracker-step-dot-size-mobile);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.line {
|
|
76
|
+
display: block;
|
|
77
|
+
position: absolute;
|
|
78
|
+
left: 50%;
|
|
79
|
+
right: 0;
|
|
80
|
+
bottom: 0;
|
|
81
|
+
width: 100%;
|
|
82
|
+
|
|
83
|
+
/* standard */
|
|
84
|
+
top: calc((var(--kemet-tracker-step-dot-size) - var(--kemet-tracker-step-standard-line-weight)) / 2);
|
|
85
|
+
height: var(--kemet-tracker-step-standard-line-weight);
|
|
86
|
+
background-color: var(--kemet-tracker-step-line-color, var(--kemet-color-primary));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.line.completed {
|
|
90
|
+
width: 100%;
|
|
91
|
+
transform: scaleX(0);
|
|
92
|
+
transform-origin: left center;
|
|
93
|
+
top: calc((var(--kemet-tracker-step-dot-size) - var(--kemet-tracker-step-completed-line-weight)) / 2);
|
|
94
|
+
height: var(--kemet-tracker-step-completed-line-weight);
|
|
95
|
+
background-color: var(--kemet-tracker-step-completed-line-color, var(--kemet-color-primary));
|
|
96
|
+
animation-name: grow;
|
|
97
|
+
animation-delay: 1s;
|
|
98
|
+
animation-duration: 600ms;
|
|
99
|
+
animation-fill-mode: forwards;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
:host([mobile]) .line {
|
|
103
|
+
top: calc((var(--kemet-tracker-step-dot-size-mobile) - var(--kemet-tracker-step-standard-line-weight)) / 2);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
:host([mobile]) .line.completed {
|
|
107
|
+
top: calc((var(--kemet-tracker-step-dot-size-mobile) - var(--kemet-tracker-step-completed-line-weight)) / 2);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
@keyframes grow {
|
|
111
|
+
from { transform: scaleX(0); }
|
|
112
|
+
to { transform: scaleX(1); }
|
|
113
|
+
}
|
|
114
|
+
`,
|
|
115
|
+
];
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
static get properties() {
|
|
119
|
+
return {
|
|
120
|
+
/**
|
|
121
|
+
* The current step number
|
|
122
|
+
*/
|
|
123
|
+
step: {
|
|
124
|
+
type: Number,
|
|
125
|
+
},
|
|
126
|
+
/**
|
|
127
|
+
* Determines whether or not a step renders as complete
|
|
128
|
+
*/
|
|
129
|
+
completed: {
|
|
130
|
+
type: Boolean,
|
|
131
|
+
reflect: true,
|
|
132
|
+
},
|
|
133
|
+
/**
|
|
134
|
+
* Determines whether or not a step renders as the current step
|
|
135
|
+
*/
|
|
136
|
+
current: {
|
|
137
|
+
type: Boolean,
|
|
138
|
+
reflect: true,
|
|
139
|
+
},
|
|
140
|
+
/**
|
|
141
|
+
* Is automatically added to the last step
|
|
142
|
+
*/
|
|
143
|
+
last: {
|
|
144
|
+
type: Boolean,
|
|
145
|
+
reflect: true,
|
|
146
|
+
},
|
|
147
|
+
/**
|
|
148
|
+
* Determines if a step should render as mobile
|
|
149
|
+
*/
|
|
150
|
+
mobile: {
|
|
151
|
+
type: Boolean,
|
|
152
|
+
reflect: true,
|
|
153
|
+
},
|
|
154
|
+
/**
|
|
155
|
+
* Hides the label inside of a dot
|
|
156
|
+
*/
|
|
157
|
+
hideDotContent: {
|
|
158
|
+
type: Boolean,
|
|
159
|
+
reflect: true,
|
|
160
|
+
attribute: 'hide-dot-content',
|
|
161
|
+
},
|
|
162
|
+
/**
|
|
163
|
+
* The icon size for the completed check mark
|
|
164
|
+
*/
|
|
165
|
+
completedSize: {
|
|
166
|
+
type: Number,
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
constructor() {
|
|
172
|
+
super();
|
|
173
|
+
this.completedSize = 16;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
firstUpdated() {
|
|
177
|
+
this.tracker = this.closest('kemet-tracker');
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
render() {
|
|
181
|
+
return html`
|
|
182
|
+
${this.makeLine()}
|
|
183
|
+
${this.makeCompletedLine()}
|
|
184
|
+
<div class="dot" part="dot">${this.makeDotContent()}</div>
|
|
185
|
+
${this.makeSlotContent()}
|
|
186
|
+
`;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
makeLine() {
|
|
190
|
+
if (!this.last) {
|
|
191
|
+
return html`<div class="line" part="line"></div>`;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
makeCompletedLine() {
|
|
198
|
+
if (this.completed && !this.last) {
|
|
199
|
+
return html`<div class="line completed" part="completed-line" @animationend=${() => this.handleCompletedLineEnd()}></div>`;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
makeDotContent() {
|
|
206
|
+
if (this.completed && !this.mobile && !this.hideDotContent) {
|
|
207
|
+
return html`
|
|
208
|
+
<kemet-icon icon="check2" size=${this.completedSize}></kemet-icon>
|
|
209
|
+
`;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
if (!this.mobile && !this.hideDotContent) {
|
|
213
|
+
return html`
|
|
214
|
+
<span>${this.step}/${this.tracker?.total}</span>
|
|
215
|
+
`;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
makeSlotContent() {
|
|
222
|
+
if (!this.mobile) {
|
|
223
|
+
return html`<slot></slot>`;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
handleCompletedLineEnd() {
|
|
230
|
+
const currentDot = this.tracker.querySelector('[current]').shadowRoot.querySelector('.dot');
|
|
231
|
+
|
|
232
|
+
if (currentDot) {
|
|
233
|
+
currentDot.classList.add('animate');
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// eslint-disable-next-line no-unused-expressions
|
|
239
|
+
customElements.get('kemet-tracker-step') || customElements.define('kemet-tracker-step', KemetTrackerStep);
|