@dile/ui 3.4.5 → 3.5.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 (181) 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/__screenshots__/select-ajax-overlay.spec.js/dile-select-ajax-overlay-Selecting-a-result-clearing-the-selection-returns-to-the-search-field-1.png +0 -0
  118. package/components/select/__screenshots__/select-ajax-overlay.spec.js/dile-select-ajax-overlay-Selecting-a-result-selecting-an-option-sets-value-selectedText--closes-the-popup-and-fires-events-1.png +0 -0
  119. package/components/select/__screenshots__/select-ajax-overlay.spec.js/dile-select-ajax-overlay-Selecting-a-result-shows-the-read-only-field-with-the-clear-icon-after-selecting-1.png +0 -0
  120. package/components/select/__screenshots__/select-ajax-overlay.spec.js/dile-select-ajax-overlay-static-mode-loads-all-data-on-init-and-renders-it-inline-without-requiring-a-search-1.png +0 -0
  121. package/components/select/__screenshots__/select-ajax-overlay.spec.js/dile-select-ajax-overlay-static-mode-shows-a-visible--clickable-trigger-instead-of-hiding-it--there-is-no-separate-search-field-to-compose-under--1.png +0 -0
  122. package/components/select/__screenshots__/select-overlay.spec.js/dile-select-overlay-Positioning-keeps-the-same-moveTop-tightened-gap-when-flipping-above-the-trigger-as-when-sitting-below-it-1.png +0 -0
  123. package/components/select/__screenshots__/select-overlay.spec.js/dile-select-overlay-Rendering-throws-when-no-select-element-is-slotted-1.png +0 -0
  124. package/components/select/__screenshots__/select-overlay.spec.js/dile-select-overlay-hideTrigger-handleExternalKeydown---drives-navigation-without-a-visible-trigger-1.png +0 -0
  125. package/components/select/__screenshots__/zzdebug2.spec.js/debug-static-debug-1.png +0 -0
  126. package/components/select/__screenshots__/zzdebug3.spec.js/debug-rapid-close-reopen-reproduces-blur-then-quick-refocus-1.png +0 -0
  127. package/components/select/index.js +3 -1
  128. package/components/select/select-ajax-overlay.js +6 -0
  129. package/components/select/select-ajax-overlay.spec.js +389 -0
  130. package/components/select/select-ajax.js +3 -1
  131. package/components/select/select-boolean.js +3 -1
  132. package/components/select/select-overlay.js +5 -0
  133. package/components/select/select-overlay.spec.js +507 -0
  134. package/components/select/select.js +3 -1
  135. package/components/select/src/DileSelectAjaxOverlay.js +521 -0
  136. package/components/select/src/DileSelectOverlay.js +511 -0
  137. package/components/selector/selector-item.js +3 -1
  138. package/components/selector/selector-item.spec.js +40 -0
  139. package/components/selector/selector-overlay.js +3 -1
  140. package/components/selector/selector.js +3 -1
  141. package/components/selector/selector.spec.js +45 -0
  142. package/components/slide-menu/slide-menu.js +3 -1
  143. package/components/slide-menu/slide-menu.spec.js +38 -0
  144. package/components/slide-show/slide-show.js +3 -1
  145. package/components/slide-show/slide-show.spec.js +34 -0
  146. package/components/social-icon/social-icon.js +3 -1
  147. package/components/social-icon/social-icon.spec.js +26 -0
  148. package/components/spinner/spinner-bar.js +3 -1
  149. package/components/spinner/spinner-bar.spec.js +26 -0
  150. package/components/spinner/spinner-block.js +3 -1
  151. package/components/spinner/spinner-block.spec.js +21 -0
  152. package/components/spinner/spinner-horizontal.js +3 -1
  153. package/components/spinner/spinner-horizontal.spec.js +25 -0
  154. package/components/spinner/spinner-icon.js +3 -1
  155. package/components/spinner/spinner-icon.spec.js +25 -0
  156. package/components/spinner/spinner-modal.js +3 -1
  157. package/components/spinner/spinner-modal.spec.js +26 -0
  158. package/components/spinner/spinner.js +3 -1
  159. package/components/spinner/spinner.spec.js +26 -0
  160. package/components/switch/switch.js +3 -1
  161. package/components/switch/switch.spec.js +33 -0
  162. package/components/tabs/tab.js +3 -1
  163. package/components/tabs/tabs.js +3 -1
  164. package/components/tabs/tabs.spec.js +45 -0
  165. package/components/textarea/textarea.js +3 -1
  166. package/components/textarea/textarea.spec.js +39 -0
  167. package/components/time-picker/time-picker.js +3 -1
  168. package/components/time-picker/time-picker.spec.js +26 -0
  169. package/components/timer/timer.js +3 -1
  170. package/components/timer/timer.spec.js +31 -0
  171. package/components/toast/toast-item.js +3 -1
  172. package/components/toast/toast-persistent.js +3 -1
  173. package/components/toast/toast.js +3 -1
  174. package/components/tooltip/chip-tooltip.js +3 -1
  175. package/components/tooltip/chip-tooltip.spec.js +29 -0
  176. package/components/tooltip/tooltip.js +3 -1
  177. package/components/tooltip/tooltip.spec.js +32 -0
  178. package/components/web-visor/web-visor.js +3 -1
  179. package/components/web-visor/web-visor.spec.js +32 -0
  180. package/mixins/overlay/src/DileOverlay.js +9 -6
  181. 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,3 +1,5 @@
1
1
  export { DileSelect } from './src/DileSelect.js';
2
2
  export { DileSelectAjax } from './src/DileSelectAjax.js';
3
- export { DileSelectBoolean } from './src/DileSelectBoolean.js';
3
+ export { DileSelectBoolean } from './src/DileSelectBoolean.js';
4
+ export { DileSelectOverlay } from './src/DileSelectOverlay.js';
5
+ export { DileSelectAjaxOverlay } from './src/DileSelectAjaxOverlay.js';
@@ -0,0 +1,6 @@
1
+ import './select-overlay.js'
2
+ import { DileSelectAjaxOverlay } from "./src/DileSelectAjaxOverlay.js";
3
+
4
+ if (!customElements.get("dile-select-ajax-overlay")) {
5
+ window.customElements.define("dile-select-ajax-overlay", DileSelectAjaxOverlay);
6
+ }