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.
Files changed (77) hide show
  1. package/custom-elements.json +1605 -225
  2. package/dist/components/{kemet-accordion-panel.js → kemet-accordion/kemet-accordion-panel.js} +0 -0
  3. package/dist/components/{kemet-accordion.js → kemet-accordion/kemet-accordion.js} +0 -0
  4. package/dist/components/{kemet-badge.js → kemet-badge/kemet-badge.js} +0 -0
  5. package/dist/components/{kemet-button.js → kemet-button/kemet-button.js} +0 -0
  6. package/dist/components/kemet-carousel/kemet-carousel-current.js +36 -0
  7. package/dist/components/kemet-carousel/kemet-carousel-first.js +47 -0
  8. package/dist/components/kemet-carousel/kemet-carousel-last.js +47 -0
  9. package/dist/components/kemet-carousel/kemet-carousel-link.js +59 -0
  10. package/dist/components/kemet-carousel/kemet-carousel-next.js +47 -0
  11. package/dist/components/kemet-carousel/kemet-carousel-prev.js +47 -0
  12. package/dist/components/kemet-carousel/kemet-carousel-slide.js +51 -0
  13. package/dist/components/kemet-carousel/kemet-carousel-total.js +36 -0
  14. package/dist/components/kemet-carousel/kemet-carousel.js +492 -0
  15. package/dist/components/{kemet-checkbox.js → kemet-checkbox/kemet-checkbox.js} +0 -0
  16. package/dist/components/{kemet-combo.js → kemet-combo/kemet-combo.js} +0 -0
  17. package/dist/components/{kemet-count.js → kemet-count/kemet-count.js} +0 -0
  18. package/dist/components/{kemet-draggable.js → kemet-draggable/kemet-draggable.js} +0 -0
  19. package/dist/components/{kemet-drawer.js → kemet-drawer/kemet-drawer.js} +0 -0
  20. package/dist/components/{kemet-drawer.styles.js → kemet-drawer/kemet-drawer.styles.js} +0 -0
  21. package/dist/components/kemet-fab/kemet-fab.js +209 -0
  22. package/dist/components/{kemet-field.js → kemet-field/kemet-field.js} +0 -0
  23. package/dist/components/{kemet-flipcard-trigger.js → kemet-flipcard/kemet-flipcard-trigger.js} +0 -0
  24. package/dist/components/{kemet-flipcard.js → kemet-flipcard/kemet-flipcard.js} +0 -0
  25. package/dist/components/{kemet-icon.js → kemet-icon/kemet-icon.js} +0 -0
  26. package/dist/components/{kemet-input.js → kemet-input/kemet-input.js} +15 -4
  27. package/dist/components/{kemet-modal-close.js → kemet-modal/kemet-modal-close.js} +0 -0
  28. package/dist/components/{kemet-modal.js → kemet-modal/kemet-modal.js} +0 -0
  29. package/dist/components/{kemet-modal.styles.js → kemet-modal/kemet-modal.styles.js} +0 -0
  30. package/dist/components/kemet-password/kemet-password.js +278 -0
  31. package/dist/components/{kemet-popover-close.js → kemet-popover/kemet-popover-close.js} +0 -0
  32. package/dist/components/{kemet-popover.effects.styles.js → kemet-popover/kemet-popover.effects.styles.js} +0 -0
  33. package/dist/components/{kemet-popover.js → kemet-popover/kemet-popover.js} +0 -0
  34. package/dist/components/{kemet-popover.tooltip.styles.js → kemet-popover/kemet-popover.tooltip.styles.js} +0 -0
  35. package/dist/components/{kemet-radio.js → kemet-radio/kemet-radio.js} +0 -0
  36. package/dist/components/{kemet-radios.js → kemet-radio/kemet-radios.js} +0 -0
  37. package/dist/components/{kemet-rotator.js → kemet-rotator/kemet-rotator.js} +0 -0
  38. package/dist/components/{kemet-scroll-link.js → kemet-scroll-link/kemet-scroll-link.js} +0 -0
  39. package/dist/components/{kemet-scroll-nav.js → kemet-scroll-nav/kemet-scroll-nav.js} +0 -0
  40. package/dist/components/{kemet-scroll-snap-paginator.js → kemet-scroll-snap/kemet-scroll-snap-paginator.js} +0 -0
  41. package/dist/components/{kemet-scroll-snap-slide.js → kemet-scroll-snap/kemet-scroll-snap-slide.js} +0 -0
  42. package/dist/components/{kemet-scroll-snap.js → kemet-scroll-snap/kemet-scroll-snap.js} +0 -0
  43. package/dist/components/{kemet-option.js → kemet-select/kemet-option.js} +0 -0
  44. package/dist/components/{kemet-select.js → kemet-select/kemet-select.js} +0 -0
  45. package/dist/components/{kemet-svg.js → kemet-svgs/kemet-svg.js} +0 -0
  46. package/dist/components/{kemet-svgs.js → kemet-svgs/kemet-svgs.js} +0 -0
  47. package/dist/components/{kemet-tab-panel.js → kemet-tabs/kemet-tab-panel.js} +0 -0
  48. package/dist/components/{kemet-tab.js → kemet-tabs/kemet-tab.js} +0 -0
  49. package/dist/components/{kemet-tabs.js → kemet-tabs/kemet-tabs.js} +0 -0
  50. package/dist/components/{kemet-tabs.styles.js → kemet-tabs/kemet-tabs.styles.js} +0 -0
  51. package/dist/components/{kemet-textarea.js → kemet-textarea/kemet-textarea.js} +0 -0
  52. package/dist/components/{kemet-toggle.js → kemet-toggle/kemet-toggle.js} +0 -0
  53. package/dist/components/kemet-tracker/kemet-tracker-step.js +239 -0
  54. package/dist/components/kemet-tracker/kemet-tracker.js +76 -0
  55. package/dist/kemet-components.cjs +1809 -140
  56. package/dist/kemet-components.js +1805 -141
  57. package/dist/kemet-components.min.js +574 -87
  58. package/dist/styles/components/_config.scss +4 -0
  59. package/dist/styles/{scss/components → components}/accordion.scss +0 -0
  60. package/dist/styles/{scss/components → components}/drawer.scss +2 -2
  61. package/dist/styles/{scss/components → components}/modal.scss +0 -0
  62. package/dist/styles/{scss/components → components}/scrollsnap.scss +0 -0
  63. package/dist/styles/{scss/core → core}/_config.scss +22 -22
  64. package/dist/styles/{scss/core → core}/_helpers.scss +7 -3
  65. package/dist/styles/{scss/core → core}/attributes.scss +0 -0
  66. package/dist/styles/{scss/core → core}/base.scss +0 -0
  67. package/dist/styles/{scss/core → core}/layout.scss +0 -0
  68. package/dist/styles/kemet.components.css +1 -80
  69. package/dist/styles/kemet.components.css.map +1 -1
  70. package/dist/styles/{scss/kemet.components.scss → kemet.components.scss} +0 -1
  71. package/dist/styles/kemet.core.css +1 -1
  72. package/dist/styles/kemet.core.css.map +1 -1
  73. package/dist/styles/{scss/kemet.core.scss → kemet.core.scss} +0 -0
  74. package/dist/utilities/controllers/forms.js +123 -0
  75. package/package.json +5 -3
  76. package/dist/styles/scss/components/_config.scss +0 -4
  77. package/dist/styles/scss/components/carousel.scss +0 -64
@@ -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.hasFocus = true;
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.hasFocus = false;
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(e) {
541
- this.inputType = e.inputType;
552
+ handleInput() {
542
553
  this.value = this.input.value;
543
554
 
544
555
  /**
@@ -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);
@@ -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);