@dile/ui 3.4.5 → 3.4.6

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 (163) hide show
  1. package/components/accordion/accordion-item.js +3 -1
  2. package/components/accordion/accordion.js +3 -1
  3. package/components/app-drawer/app-drawer.js +3 -1
  4. package/components/avatar/avatar.js +3 -1
  5. package/components/avatar/avatar.spec.js +25 -0
  6. package/components/box-selector/box-selector-item.js +3 -1
  7. package/components/box-selector/box-selector-item.spec.js +27 -0
  8. package/components/box-selector/box-selector.js +3 -1
  9. package/components/box-selector/box-selector.spec.js +27 -0
  10. package/components/breadcrumbs/breadcrumbs-item.js +3 -1
  11. package/components/breadcrumbs/breadcrumbs-item.spec.js +28 -0
  12. package/components/breadcrumbs/breadcrumbs.js +3 -1
  13. package/components/breadcrumbs/breadcrumbs.spec.js +33 -0
  14. package/components/button/button-icon.js +3 -1
  15. package/components/button/button.js +3 -1
  16. package/components/card/card-slide.js +3 -1
  17. package/components/card/card-slide.spec.js +30 -0
  18. package/components/card/card.js +3 -1
  19. package/components/card/card.spec.js +26 -0
  20. package/components/checkbox/checkbox.js +3 -1
  21. package/components/chip/chip.js +3 -1
  22. package/components/chip/chip.spec.js +31 -0
  23. package/components/color-picker/color-picker.js +3 -1
  24. package/components/confirm/confirm.js +3 -1
  25. package/components/confirm/confirm.spec.js +32 -0
  26. package/components/confirm-text/confirm-text.js +3 -1
  27. package/components/confirm-text/confirm-text.spec.js +29 -0
  28. package/components/copy-markdown-url/copy-markdown-url.spec.js +27 -0
  29. package/components/copy-markdown-url/index.js +3 -1
  30. package/components/copy-text/__screenshots__/copy-text.spec.js/dile-copy-text-dispatches-dile-text-copied-with-the-content-on-copy---1.png +0 -0
  31. package/components/copy-text/copy-text.spec.js +38 -0
  32. package/components/copy-text/index.js +3 -1
  33. package/components/drop-file/drop-file.js +3 -1
  34. package/components/drop-file/drop-file.spec.js +33 -0
  35. package/components/drop-file/file-preview.js +3 -1
  36. package/components/drop-file/file-preview.spec.js +35 -0
  37. package/components/floating-feedback/floating-feedback.spec.js +30 -0
  38. package/components/floating-feedback/index.js +3 -1
  39. package/components/floating-menu/floating-menu-item.js +3 -1
  40. package/components/floating-menu/floating-menu-item.spec.js +27 -0
  41. package/components/floating-menu/floating-menu.js +3 -1
  42. package/components/floating-menu/floating-menu.spec.js +31 -0
  43. package/components/form-separator/form-separator.js +3 -1
  44. package/components/form-separator/form-separator.spec.js +28 -0
  45. package/components/hamburger/hamburger.js +3 -1
  46. package/components/hamburger/hamburger.spec.js +28 -0
  47. package/components/icon/icon.js +3 -1
  48. package/components/icon/icon.spec.js +31 -0
  49. package/components/icon-switch/icon-switch-group.js +3 -1
  50. package/components/icon-switch/icon-switch-group.spec.js +46 -0
  51. package/components/icon-switch/icon-switch.js +3 -1
  52. package/components/icon-switch/icon-switch.spec.js +35 -0
  53. package/components/info-box/info-box.js +3 -1
  54. package/components/info-box/info-box.spec.js +38 -0
  55. package/components/inline-feedback/inline-feedback.js +3 -1
  56. package/components/inline-feedback/inline-feedback.spec.js +46 -0
  57. package/components/input/__screenshots__/input-number-mask.spec.js/dile-input-number-mask-masks-digit-keydowns-following-the-given-pattern-1.png +0 -0
  58. package/components/input/input-contact.js +3 -1
  59. package/components/input/input-contact.spec.js +32 -0
  60. package/components/input/input-integer.js +3 -1
  61. package/components/input/input-integer.spec.js +31 -0
  62. package/components/input/input-message.js +3 -1
  63. package/components/input/input-message.spec.js +27 -0
  64. package/components/input/input-money.js +3 -1
  65. package/components/input/input-money.spec.js +30 -0
  66. package/components/input/input-number-mask.js +3 -1
  67. package/components/input/input-number-mask.spec.js +32 -0
  68. package/components/input/input-percentage.js +3 -1
  69. package/components/input/input-percentage.spec.js +31 -0
  70. package/components/input/input-search.js +3 -1
  71. package/components/input/input-search.spec.js +39 -0
  72. package/components/input/input.js +3 -1
  73. package/components/input/input.spec.js +47 -0
  74. package/components/light-mode-switch/light-mode-switch.js +3 -1
  75. package/components/light-mode-switch/light-mode-switch.spec.js +34 -0
  76. package/components/menu-hamburger/menu-hamburger.js +3 -1
  77. package/components/menu-hamburger/menu-hamburger.spec.js +34 -0
  78. package/components/menu-overlay/menu-overlay.js +3 -1
  79. package/components/menu-overlay/menu-overlay.spec.js +44 -0
  80. package/components/message/message.js +3 -1
  81. package/components/message/message.spec.js +42 -0
  82. package/components/modal/__screenshots__/modal-help.spec.js/dile-modal-help-opens-the-inner-modal-on-open---1.png +0 -0
  83. package/components/modal/modal-help.js +3 -1
  84. package/components/modal/modal-help.spec.js +32 -0
  85. package/components/modal/modal.js +3 -1
  86. package/components/modal/modal.spec.js +46 -0
  87. package/components/nav/nav.js +3 -1
  88. package/components/nav/nav.spec.js +33 -0
  89. package/components/number-picker/number-picker-element.js +3 -1
  90. package/components/number-picker/number-picker-element.spec.js +30 -0
  91. package/components/number-picker/number-picker.js +3 -1
  92. package/components/number-picker/number-picker.spec.js +30 -0
  93. package/components/order-switch/order-switch.js +3 -1
  94. package/components/order-switch/order-switch.spec.js +31 -0
  95. package/components/otp-input/otp-input.js +3 -1
  96. package/components/otp-input/otp-input.spec.js +41 -0
  97. package/components/pages/pages.js +3 -1
  98. package/components/pages/pages.spec.js +44 -0
  99. package/components/password/password.js +3 -1
  100. package/components/password/password.spec.js +35 -0
  101. package/components/progress-bar/progress-bar.js +3 -1
  102. package/components/progress-bar/progress-bar.spec.js +28 -0
  103. package/components/radio-group/radio-group.js +3 -1
  104. package/components/radio-group/radio-group.spec.js +44 -0
  105. package/components/radio-group/radio.js +3 -1
  106. package/components/radio-group/radio.spec.js +32 -0
  107. package/components/range/range.js +3 -1
  108. package/components/range/range.spec.js +36 -0
  109. package/components/rating/rating.js +3 -1
  110. package/components/rating/rating.spec.js +34 -0
  111. package/components/rating/star.js +3 -1
  112. package/components/rating/star.spec.js +30 -0
  113. package/components/rating-scale-question/rating-scale-option.js +3 -1
  114. package/components/rating-scale-question/rating-scale-option.spec.js +32 -0
  115. package/components/rating-scale-question/rating-scale-question.js +3 -1
  116. package/components/rating-scale-question/rating-scale-question.spec.js +35 -0
  117. package/components/select/select-ajax.js +3 -1
  118. package/components/select/select-boolean.js +3 -1
  119. package/components/select/select.js +3 -1
  120. package/components/selector/selector-item.js +3 -1
  121. package/components/selector/selector-item.spec.js +40 -0
  122. package/components/selector/selector-overlay.js +3 -1
  123. package/components/selector/selector.js +3 -1
  124. package/components/selector/selector.spec.js +45 -0
  125. package/components/slide-menu/slide-menu.js +3 -1
  126. package/components/slide-menu/slide-menu.spec.js +38 -0
  127. package/components/slide-show/slide-show.js +3 -1
  128. package/components/slide-show/slide-show.spec.js +34 -0
  129. package/components/social-icon/social-icon.js +3 -1
  130. package/components/social-icon/social-icon.spec.js +26 -0
  131. package/components/spinner/spinner-bar.js +3 -1
  132. package/components/spinner/spinner-bar.spec.js +26 -0
  133. package/components/spinner/spinner-block.js +3 -1
  134. package/components/spinner/spinner-block.spec.js +21 -0
  135. package/components/spinner/spinner-horizontal.js +3 -1
  136. package/components/spinner/spinner-horizontal.spec.js +25 -0
  137. package/components/spinner/spinner-icon.js +3 -1
  138. package/components/spinner/spinner-icon.spec.js +25 -0
  139. package/components/spinner/spinner-modal.js +3 -1
  140. package/components/spinner/spinner-modal.spec.js +26 -0
  141. package/components/spinner/spinner.js +3 -1
  142. package/components/spinner/spinner.spec.js +26 -0
  143. package/components/switch/switch.js +3 -1
  144. package/components/switch/switch.spec.js +33 -0
  145. package/components/tabs/tab.js +3 -1
  146. package/components/tabs/tabs.js +3 -1
  147. package/components/tabs/tabs.spec.js +45 -0
  148. package/components/textarea/textarea.js +3 -1
  149. package/components/textarea/textarea.spec.js +39 -0
  150. package/components/time-picker/time-picker.js +3 -1
  151. package/components/time-picker/time-picker.spec.js +26 -0
  152. package/components/timer/timer.js +3 -1
  153. package/components/timer/timer.spec.js +31 -0
  154. package/components/toast/toast-item.js +3 -1
  155. package/components/toast/toast-persistent.js +3 -1
  156. package/components/toast/toast.js +3 -1
  157. package/components/tooltip/chip-tooltip.js +3 -1
  158. package/components/tooltip/chip-tooltip.spec.js +29 -0
  159. package/components/tooltip/tooltip.js +3 -1
  160. package/components/tooltip/tooltip.spec.js +32 -0
  161. package/components/web-visor/web-visor.js +3 -1
  162. package/components/web-visor/web-visor.spec.js +32 -0
  163. package/package.json +3 -3
@@ -0,0 +1,35 @@
1
+ import { describe, it, expect, afterEach } from 'vitest';
2
+ import './password.js';
3
+
4
+ describe('dile-password', () => {
5
+ afterEach(() => {
6
+ document.body.innerHTML = '';
7
+ });
8
+
9
+ async function renderPassword(html) {
10
+ document.body.innerHTML = html;
11
+ const el = document.body.querySelector('dile-password');
12
+ await el.updateComplete;
13
+ return el;
14
+ }
15
+
16
+ it('renders a password type input by default', async () => {
17
+ const el = await renderPassword('<dile-password name="pwd"></dile-password>');
18
+ const input = el.shadowRoot.querySelector('input');
19
+
20
+ expect(input).toBeTruthy();
21
+ expect(input.type).toBe('password');
22
+ });
23
+
24
+ it('toggles input type to text when the visibility toggle is shown and clicked', async () => {
25
+ const el = await renderPassword('<dile-password name="pwd" showPasswordToggle></dile-password>');
26
+ const toggle = el.shadowRoot.querySelector('.password-toggle-btn');
27
+ expect(toggle).toBeTruthy();
28
+
29
+ toggle.click();
30
+ await el.updateComplete;
31
+
32
+ expect(el.passwordVisible).toBe(true);
33
+ expect(el.shadowRoot.querySelector('input').type).toBe('text');
34
+ });
35
+ });
@@ -1,3 +1,5 @@
1
1
  import { DileProgressBar } from "./src/DileProgressBar.js";
2
2
 
3
- window.customElements.define("dile-progress-bar", DileProgressBar);
3
+ if (!customElements.get("dile-progress-bar")) {
4
+ window.customElements.define("dile-progress-bar", DileProgressBar);
5
+ }
@@ -0,0 +1,28 @@
1
+ import { describe, it, expect, afterEach } from 'vitest';
2
+ import './progress-bar.js';
3
+
4
+ describe('dile-progress-bar', () => {
5
+ afterEach(() => {
6
+ document.body.innerHTML = '';
7
+ });
8
+
9
+ async function renderProgressBar(html) {
10
+ document.body.innerHTML = html;
11
+ const el = document.body.querySelector('dile-progress-bar');
12
+ await el.updateComplete;
13
+ return el;
14
+ }
15
+
16
+ it('renders the progress bar width and percentage from the value property', async () => {
17
+ const el = await renderProgressBar('<dile-progress-bar value="42"></dile-progress-bar>');
18
+ const bar = el.shadowRoot.querySelector('.progress-bar');
19
+
20
+ expect(bar.getAttribute('style')).toContain('width: 42%');
21
+ expect(bar.querySelector('span').textContent.trim()).toBe('42%');
22
+ });
23
+
24
+ it('renders the title when set', async () => {
25
+ const el = await renderProgressBar('<dile-progress-bar title="Loading"></dile-progress-bar>');
26
+ expect(el.shadowRoot.querySelector('.progress-bar-title').textContent.trim()).toBe('Loading');
27
+ });
28
+ });
@@ -1,4 +1,6 @@
1
1
  import './radio.js';
2
2
  import { DileRadioGroup } from "./src/DileRadioGroup.js";
3
3
 
4
- window.customElements.define("dile-radio-group", DileRadioGroup);
4
+ if (!customElements.get("dile-radio-group")) {
5
+ window.customElements.define("dile-radio-group", DileRadioGroup);
6
+ }
@@ -0,0 +1,44 @@
1
+ import { describe, it, expect, afterEach } from 'vitest';
2
+ import './radio-group.js';
3
+
4
+ describe('dile-radio-group', () => {
5
+ afterEach(() => {
6
+ document.body.innerHTML = '';
7
+ });
8
+
9
+ async function renderRadioGroup(html) {
10
+ document.body.innerHTML = html;
11
+ const el = document.body.querySelector('dile-radio-group');
12
+ await el.updateComplete;
13
+ return el;
14
+ }
15
+
16
+ it('renders the slotted radios and label', async () => {
17
+ const el = await renderRadioGroup(`
18
+ <dile-radio-group name="opt" label="Choose one">
19
+ <dile-radio value="a" label="A"></dile-radio>
20
+ <dile-radio value="b" label="B"></dile-radio>
21
+ </dile-radio-group>
22
+ `);
23
+
24
+ expect(el.shadowRoot.querySelector('.label').textContent.trim()).toBe('Choose one');
25
+ expect(el.querySelectorAll('dile-radio').length).toBe(2);
26
+ });
27
+
28
+ it('updates value and selection when a radio is clicked', async () => {
29
+ const el = await renderRadioGroup(`
30
+ <dile-radio-group name="opt">
31
+ <dile-radio value="a" label="A"></dile-radio>
32
+ <dile-radio value="b" label="B"></dile-radio>
33
+ </dile-radio-group>
34
+ `);
35
+
36
+ const radios = el.querySelectorAll('dile-radio');
37
+ radios[1].shadowRoot.querySelector('article').click();
38
+ await el.updateComplete;
39
+
40
+ expect(el.value).toBe('b');
41
+ expect(radios[1].selected).toBe(true);
42
+ expect(radios[0].selected).toBe(false);
43
+ });
44
+ });
@@ -1,3 +1,5 @@
1
1
  import { DileRadio } from "./src/DileRadio.js";
2
2
 
3
- window.customElements.define("dile-radio", DileRadio);
3
+ if (!customElements.get("dile-radio")) {
4
+ window.customElements.define("dile-radio", DileRadio);
5
+ }
@@ -0,0 +1,32 @@
1
+ import { describe, it, expect, afterEach } from 'vitest';
2
+ import './radio.js';
3
+
4
+ describe('dile-radio', () => {
5
+ afterEach(() => {
6
+ document.body.innerHTML = '';
7
+ });
8
+
9
+ async function renderRadio(html) {
10
+ document.body.innerHTML = html;
11
+ const el = document.body.querySelector('dile-radio');
12
+ await el.updateComplete;
13
+ return el;
14
+ }
15
+
16
+ it('renders the label and starts unselected', async () => {
17
+ const el = await renderRadio('<dile-radio value="a" label="Option A"></dile-radio>');
18
+
19
+ expect(el.selected).toBe(false);
20
+ expect(el.shadowRoot.querySelector('.label').textContent.trim()).toBe('Option A');
21
+ });
22
+
23
+ it('dispatches dile-radio-selected with value and label on click', async () => {
24
+ const el = await renderRadio('<dile-radio value="a" label="Option A"></dile-radio>');
25
+ let detail = null;
26
+ el.addEventListener('dile-radio-selected', (e) => { detail = e.detail; });
27
+
28
+ el.shadowRoot.querySelector('article').click();
29
+
30
+ expect(detail).toEqual({ value: 'a', label: 'Option A' });
31
+ });
32
+ });
@@ -1,3 +1,5 @@
1
1
  import { DileRange } from "./src/DileRange.js";
2
2
 
3
- window.customElements.define("dile-range", DileRange);
3
+ if (!customElements.get("dile-range")) {
4
+ window.customElements.define("dile-range", DileRange);
5
+ }
@@ -0,0 +1,36 @@
1
+ import { describe, it, expect, afterEach } from 'vitest';
2
+ import './range.js';
3
+
4
+ describe('dile-range', () => {
5
+ afterEach(() => {
6
+ document.body.innerHTML = '';
7
+ });
8
+
9
+ async function renderRange(html) {
10
+ document.body.innerHTML = html;
11
+ const el = document.body.querySelector('dile-range');
12
+ await el.updateComplete;
13
+ return el;
14
+ }
15
+
16
+ it('renders a native range input with min/max/value', async () => {
17
+ const el = await renderRange('<dile-range name="vol" min="0" max="20" value="5"></dile-range>');
18
+ const input = el.shadowRoot.querySelector('input[type="range"]');
19
+
20
+ expect(input).toBeTruthy();
21
+ expect(input.min).toBe('0');
22
+ expect(input.max).toBe('20');
23
+ expect(input.value).toBe('5');
24
+ });
25
+
26
+ it('updates the value property when the input changes', async () => {
27
+ const el = await renderRange('<dile-range name="vol"></dile-range>');
28
+ const input = el.shadowRoot.querySelector('input[type="range"]');
29
+
30
+ input.value = '7';
31
+ input.dispatchEvent(new Event('input'));
32
+ await el.updateComplete;
33
+
34
+ expect(el.value).toBe('7');
35
+ });
36
+ });
@@ -1,4 +1,6 @@
1
1
  import './star.js';
2
2
  import { DileRating } from "./src/DileRating.js";
3
3
 
4
- window.customElements.define("dile-rating", DileRating);
4
+ if (!customElements.get("dile-rating")) {
5
+ window.customElements.define("dile-rating", DileRating);
6
+ }
@@ -0,0 +1,34 @@
1
+ import { describe, it, expect, afterEach } from 'vitest';
2
+ import './rating.js';
3
+
4
+ describe('dile-rating', () => {
5
+ afterEach(() => {
6
+ document.body.innerHTML = '';
7
+ });
8
+
9
+ async function renderRating(html) {
10
+ document.body.innerHTML = html;
11
+ const el = document.body.querySelector('dile-rating');
12
+ await el.updateComplete;
13
+ return el;
14
+ }
15
+
16
+ it('renders five dile-star elements', async () => {
17
+ const el = await renderRating('<dile-rating value="3"></dile-rating>');
18
+ expect(el.shadowRoot.querySelectorAll('dile-star').length).toBe(5);
19
+ expect(el.value).toBe(3);
20
+ });
21
+
22
+ it('updates value and dispatches dile-rating-selected when a star is selected', async () => {
23
+ const el = await renderRating('<dile-rating value="0"></dile-rating>');
24
+ let detail = null;
25
+ el.addEventListener('dile-rating-selected', (e) => { detail = e.detail; });
26
+
27
+ el.shadowRoot.querySelectorAll('dile-star')[2].dispatchEvent(new CustomEvent('dile-star-selected', {
28
+ detail: { index: 2 },
29
+ }));
30
+
31
+ expect(el.value).toBe(3);
32
+ expect(detail).toEqual({ value: 3 });
33
+ });
34
+ });
@@ -1,3 +1,5 @@
1
1
  import { DileStar } from "./src/DileStar.js";
2
2
 
3
- window.customElements.define("dile-star", DileStar);
3
+ if (!customElements.get("dile-star")) {
4
+ window.customElements.define("dile-star", DileStar);
5
+ }
@@ -0,0 +1,30 @@
1
+ import { describe, it, expect, afterEach } from 'vitest';
2
+ import './star.js';
3
+
4
+ describe('dile-star', () => {
5
+ afterEach(() => {
6
+ document.body.innerHTML = '';
7
+ });
8
+
9
+ async function renderStar(html) {
10
+ document.body.innerHTML = html;
11
+ const el = document.body.querySelector('dile-star');
12
+ await el.updateComplete;
13
+ return el;
14
+ }
15
+
16
+ it('renders an inner dile-icon', async () => {
17
+ const el = await renderStar('<dile-star value="1" index="0"></dile-star>');
18
+ expect(el.shadowRoot.querySelector('dile-icon')).toBeTruthy();
19
+ });
20
+
21
+ it('dispatches dile-star-selected with the index on click', async () => {
22
+ const el = await renderStar('<dile-star value="1" index="2"></dile-star>');
23
+ let detail = null;
24
+ el.addEventListener('dile-star-selected', (e) => { detail = e.detail; });
25
+
26
+ el.shadowRoot.querySelector('dile-icon').dispatchEvent(new Event('click'));
27
+
28
+ expect(detail).toEqual({ index: 2 });
29
+ });
30
+ });
@@ -1,3 +1,5 @@
1
1
  import { DileRatingScaleOption } from "./src/DileRatingScaleOption.js";
2
2
 
3
- window.customElements.define("dile-rating-scale-option", DileRatingScaleOption);
3
+ if (!customElements.get("dile-rating-scale-option")) {
4
+ window.customElements.define("dile-rating-scale-option", DileRatingScaleOption);
5
+ }
@@ -0,0 +1,32 @@
1
+ import { describe, it, expect, afterEach } from 'vitest';
2
+ import './rating-scale-option.js';
3
+
4
+ describe('dile-rating-scale-option', () => {
5
+ afterEach(() => {
6
+ document.body.innerHTML = '';
7
+ });
8
+
9
+ async function renderOption(html) {
10
+ document.body.innerHTML = html;
11
+ const el = document.body.querySelector('dile-rating-scale-option');
12
+ await el.updateComplete;
13
+ return el;
14
+ }
15
+
16
+ it('renders the label and starts unselected', async () => {
17
+ const el = await renderOption('<dile-rating-scale-option value="3" label="Agree"></dile-rating-scale-option>');
18
+
19
+ expect(el.selected).toBe(false);
20
+ expect(el.shadowRoot.querySelector('.radio_label').textContent.trim()).toBe('Agree');
21
+ });
22
+
23
+ it('dispatches dile-rating-scale-option-selected with the value on click', async () => {
24
+ const el = await renderOption('<dile-rating-scale-option value="3"></dile-rating-scale-option>');
25
+ let detail = null;
26
+ el.addEventListener('dile-rating-scale-option-selected', (e) => { detail = e.detail; });
27
+
28
+ el.shadowRoot.querySelector('span').click();
29
+
30
+ expect(detail).toEqual({ value: '3' });
31
+ });
32
+ });
@@ -1,4 +1,6 @@
1
1
  import './rating-scale-option.js';
2
2
  import { DileRatingScaleQuestion } from "./src/DileRatingScaleQuestion.js";
3
3
 
4
- window.customElements.define("dile-rating-scale-question", DileRatingScaleQuestion);
4
+ if (!customElements.get("dile-rating-scale-question")) {
5
+ window.customElements.define("dile-rating-scale-question", DileRatingScaleQuestion);
6
+ }
@@ -0,0 +1,35 @@
1
+ import { describe, it, expect, afterEach } from 'vitest';
2
+ import './rating-scale-question.js';
3
+
4
+ describe('dile-rating-scale-question', () => {
5
+ afterEach(() => {
6
+ document.body.innerHTML = '';
7
+ });
8
+
9
+ async function renderQuestion(html) {
10
+ document.body.innerHTML = html;
11
+ const el = document.body.querySelector('dile-rating-scale-question');
12
+ await el.updateComplete;
13
+ return el;
14
+ }
15
+
16
+ it('renders the label and default 7-point options', async () => {
17
+ const el = await renderQuestion('<dile-rating-scale-question name="q1" label="How satisfied are you?"></dile-rating-scale-question>');
18
+
19
+ expect(el.shadowRoot.querySelector('legend').textContent.trim()).toBe('How satisfied are you?');
20
+ expect(el.shadowRoot.querySelectorAll('dile-rating-scale-option').length).toBe(7);
21
+ });
22
+
23
+ it('updates value when an option is selected', async () => {
24
+ const el = await renderQuestion('<dile-rating-scale-question name="q1"></dile-rating-scale-question>');
25
+ const option = el.shadowRoot.querySelector('dile-rating-scale-option');
26
+ option.dispatchEvent(new CustomEvent('dile-rating-scale-option-selected', {
27
+ bubbles: true,
28
+ composed: true,
29
+ detail: { value: option.value },
30
+ }));
31
+ await el.updateComplete;
32
+
33
+ expect(el.value).toBe(option.value);
34
+ });
35
+ });
@@ -1,4 +1,6 @@
1
1
  import './select.js'
2
2
  import { DileSelectAjax } from "./src/DileSelectAjax.js";
3
3
 
4
- window.customElements.define("dile-select-ajax", DileSelectAjax);
4
+ if (!customElements.get("dile-select-ajax")) {
5
+ window.customElements.define("dile-select-ajax", DileSelectAjax);
6
+ }
@@ -1,3 +1,5 @@
1
1
  import { DileSelectBoolean } from "./src/DileSelectBoolean.js";
2
2
 
3
- window.customElements.define("dile-select-boolean", DileSelectBoolean);
3
+ if (!customElements.get("dile-select-boolean")) {
4
+ window.customElements.define("dile-select-boolean", DileSelectBoolean);
5
+ }
@@ -1,3 +1,5 @@
1
1
  import { DileSelect } from "./src/DileSelect.js";
2
2
 
3
- window.customElements.define("dile-select", DileSelect);
3
+ if (!customElements.get("dile-select")) {
4
+ window.customElements.define("dile-select", DileSelect);
5
+ }
@@ -1,3 +1,5 @@
1
1
  import { DileSelectorItem } from "./src/DileSelectorItem.js";
2
2
 
3
- window.customElements.define("dile-selector-item", DileSelectorItem);
3
+ if (!customElements.get("dile-selector-item")) {
4
+ window.customElements.define("dile-selector-item", DileSelectorItem);
5
+ }
@@ -0,0 +1,40 @@
1
+ import { describe, it, expect, afterEach } from 'vitest';
2
+ import './selector-item.js';
3
+
4
+ describe('dile-selector-item', () => {
5
+ afterEach(() => {
6
+ document.body.innerHTML = '';
7
+ });
8
+
9
+ async function renderSelectorItem(html) {
10
+ document.body.innerHTML = html;
11
+ const el = document.body.querySelector('dile-selector-item');
12
+ await el.updateComplete;
13
+ return el;
14
+ }
15
+
16
+ it('renders the slotted content and starts unselected', async () => {
17
+ const el = await renderSelectorItem('<dile-selector-item>Option A</dile-selector-item>');
18
+
19
+ expect(el.selected).toBe(false);
20
+ expect(el.textContent.trim()).toBe('Option A');
21
+ expect(el.shadowRoot.querySelector('article')).toBeTruthy();
22
+ });
23
+
24
+ it('dispatches dile-item-selected with itself when clicked', async () => {
25
+ const el = await renderSelectorItem('<dile-selector-item>Option A</dile-selector-item>');
26
+ let detail = null;
27
+ el.addEventListener('dile-item-selected', (e) => { detail = e.detail; });
28
+
29
+ el.shadowRoot.querySelector('article').click();
30
+
31
+ expect(detail).toBe(el);
32
+ });
33
+
34
+ it('wraps content in a link when href is set', async () => {
35
+ const el = await renderSelectorItem('<dile-selector-item href="/foo">Go</dile-selector-item>');
36
+ const link = el.shadowRoot.querySelector('a');
37
+ expect(link).toBeTruthy();
38
+ expect(link.getAttribute('href')).toBe('/foo');
39
+ });
40
+ });
@@ -1,3 +1,5 @@
1
1
  import { DileSelectorOverlay } from "./src/DileSelectorOverlay.js";
2
2
 
3
- window.customElements.define("dile-selector-overlay", DileSelectorOverlay);
3
+ if (!customElements.get("dile-selector-overlay")) {
4
+ window.customElements.define("dile-selector-overlay", DileSelectorOverlay);
5
+ }
@@ -1,3 +1,5 @@
1
1
  import { DileSelector } from "./src/DileSelector.js";
2
2
 
3
- window.customElements.define("dile-selector", DileSelector);
3
+ if (!customElements.get("dile-selector")) {
4
+ window.customElements.define("dile-selector", DileSelector);
5
+ }
@@ -0,0 +1,45 @@
1
+ import { describe, it, expect, afterEach } from 'vitest';
2
+ import './selector.js';
3
+ import './selector-item.js';
4
+
5
+ describe('dile-selector', () => {
6
+ afterEach(() => {
7
+ document.body.innerHTML = '';
8
+ });
9
+
10
+ async function renderSelector(html) {
11
+ document.body.innerHTML = html;
12
+ const el = document.body.querySelector('dile-selector');
13
+ await el.updateComplete;
14
+ return el;
15
+ }
16
+
17
+ it('renders a slot with the selector items', async () => {
18
+ const el = await renderSelector(`
19
+ <dile-selector>
20
+ <dile-selector-item>One</dile-selector-item>
21
+ <dile-selector-item>Two</dile-selector-item>
22
+ </dile-selector>
23
+ `);
24
+
25
+ expect(el.shadowRoot.querySelector('slot')).toBeTruthy();
26
+ expect(el.querySelectorAll('dile-selector-item').length).toBe(2);
27
+ });
28
+
29
+ it('selects an item by index when clicked, marking it selected', async () => {
30
+ const el = await renderSelector(`
31
+ <dile-selector>
32
+ <dile-selector-item>One</dile-selector-item>
33
+ <dile-selector-item>Two</dile-selector-item>
34
+ </dile-selector>
35
+ `);
36
+
37
+ const items = el.querySelectorAll('dile-selector-item');
38
+ items[1].shadowRoot.querySelector('article').click();
39
+ await el.updateComplete;
40
+
41
+ expect(el.selected).toBe(1);
42
+ expect(items[1].selected).toBe(true);
43
+ expect(items[0].selected).toBe(false);
44
+ });
45
+ });
@@ -1,3 +1,5 @@
1
1
  import { DileSlideMenu } from "./src/DileSlideMenu.js";
2
2
 
3
- window.customElements.define("dile-slide-menu", DileSlideMenu);
3
+ if (!customElements.get("dile-slide-menu")) {
4
+ window.customElements.define("dile-slide-menu", DileSlideMenu);
5
+ }
@@ -0,0 +1,38 @@
1
+ import { describe, it, expect, afterEach } from 'vitest';
2
+ import './slide-menu.js';
3
+
4
+ describe('dile-slide-menu', () => {
5
+ afterEach(() => {
6
+ document.body.innerHTML = '';
7
+ });
8
+
9
+ async function renderSlideMenu(html) {
10
+ document.body.innerHTML = html;
11
+ const el = document.body.querySelector('dile-slide-menu');
12
+ await el.updateComplete;
13
+ return el;
14
+ }
15
+
16
+ it('renders closed by default with a nav control', async () => {
17
+ const el = await renderSlideMenu('<dile-slide-menu>Content</dile-slide-menu>');
18
+ expect(el.opened).toBe(false);
19
+
20
+ const nav = el.shadowRoot.querySelector('nav');
21
+ expect(nav).toBeTruthy();
22
+ expect(nav.getAttribute('aria-expanded')).toBe('false');
23
+ });
24
+
25
+ it('opens when toggled', async () => {
26
+ const el = await renderSlideMenu('<dile-slide-menu>Content</dile-slide-menu>');
27
+ el.toggle();
28
+ await el.updateComplete;
29
+
30
+ expect(el.opened).toBe(true);
31
+ expect(el.shadowRoot.querySelector('nav').getAttribute('aria-expanded')).toBe('true');
32
+ });
33
+
34
+ it('uses the label property in the nav control', async () => {
35
+ const el = await renderSlideMenu('<dile-slide-menu label="Options">Content</dile-slide-menu>');
36
+ expect(el.shadowRoot.querySelector('nav').getAttribute('aria-label')).toBe('Options');
37
+ });
38
+ });
@@ -1,3 +1,5 @@
1
1
  import { DileSlideShow } from "./src/DileSlideShow.js";
2
2
 
3
- window.customElements.define("dile-slide-show", DileSlideShow);
3
+ if (!customElements.get("dile-slide-show")) {
4
+ window.customElements.define("dile-slide-show", DileSlideShow);
5
+ }
@@ -0,0 +1,34 @@
1
+ import { describe, it, expect, afterEach } from 'vitest';
2
+ import './slide-show.js';
3
+
4
+ describe('dile-slide-show', () => {
5
+ afterEach(() => {
6
+ document.body.innerHTML = '';
7
+ });
8
+
9
+ async function renderSlideShow(html) {
10
+ document.body.innerHTML = html;
11
+ const el = document.body.querySelector('dile-slide-show');
12
+ await el.updateComplete;
13
+ return el;
14
+ }
15
+
16
+ it('renders closed by default with the showLabel text', async () => {
17
+ const el = await renderSlideShow('<dile-slide-show>Content</dile-slide-show>');
18
+ const link = el.shadowRoot.querySelector('a');
19
+
20
+ expect(link).toBeTruthy();
21
+ expect(link.textContent.trim()).toBe('Open');
22
+ expect(link.classList.contains('showmoreclose')).toBe(true);
23
+ });
24
+
25
+ it('opens and shows the hideLabel text', async () => {
26
+ const el = await renderSlideShow('<dile-slide-show hideLabel="Close it">Content</dile-slide-show>');
27
+ el.toggle();
28
+ await el.updateComplete;
29
+
30
+ const link = el.shadowRoot.querySelector('a');
31
+ expect(link.textContent.trim()).toBe('Close it');
32
+ expect(link.classList.contains('showmoreopen')).toBe(true);
33
+ });
34
+ });
@@ -1,3 +1,5 @@
1
1
  import { DileSocialIcon } from './src/DileSocialIcon.js';
2
2
 
3
- window.customElements.define('dile-social-icon', DileSocialIcon);
3
+ if (!customElements.get('dile-social-icon')) {
4
+ window.customElements.define('dile-social-icon', DileSocialIcon);
5
+ }
@@ -0,0 +1,26 @@
1
+ import { describe, it, expect, afterEach } from 'vitest';
2
+ import './social-icon.js';
3
+
4
+ describe('dile-social-icon', () => {
5
+ afterEach(() => {
6
+ document.body.innerHTML = '';
7
+ });
8
+
9
+ async function renderSocialIcon(html) {
10
+ document.body.innerHTML = html;
11
+ const el = document.body.querySelector('dile-social-icon');
12
+ await el.updateComplete;
13
+ return el;
14
+ }
15
+
16
+ it('defaults to the facebook icon and renders an svg', async () => {
17
+ const el = await renderSocialIcon('<dile-social-icon></dile-social-icon>');
18
+ expect(el.icon).toBe('facebook');
19
+ expect(el.shadowRoot.querySelector('svg')).toBeTruthy();
20
+ });
21
+
22
+ it('renders a different icon based on the icon property', async () => {
23
+ const el = await renderSocialIcon('<dile-social-icon icon="twitter"></dile-social-icon>');
24
+ expect(el.shadowRoot.querySelector('svg')).toBeTruthy();
25
+ });
26
+ });
@@ -1,3 +1,5 @@
1
1
  import { DileSpinnerBar } from "./src/DileSpinnerBar.js";
2
2
 
3
- window.customElements.define("dile-spinner-bar", DileSpinnerBar);
3
+ if (!customElements.get("dile-spinner-bar")) {
4
+ window.customElements.define("dile-spinner-bar", DileSpinnerBar);
5
+ }