@dile/ui 3.18.0 → 3.18.1

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 (113) hide show
  1. package/components/toast/src/DileToast.js +2 -1
  2. package/components/toast/src/DileToastPersistent.js +1 -1
  3. package/package.json +4 -4
  4. package/components/accordion/accordion.spec.js +0 -253
  5. package/components/app-drawer/app-drawer.spec.js +0 -262
  6. package/components/avatar/avatar.spec.js +0 -25
  7. package/components/bottom-nav/__screenshots__/bottom-nav.spec.js/dile-bottom-nav-places-the-sheet-and-the-overlay-above-the-bar-1.png +0 -0
  8. package/components/bottom-nav/bottom-nav.spec.js +0 -340
  9. package/components/box-selector/box-selector-item.spec.js +0 -27
  10. package/components/box-selector/box-selector.spec.js +0 -27
  11. package/components/breadcrumbs/breadcrumbs-item.spec.js +0 -28
  12. package/components/breadcrumbs/breadcrumbs.spec.js +0 -33
  13. package/components/button/button.spec.js +0 -234
  14. package/components/card/card-slide.spec.js +0 -30
  15. package/components/card/card.spec.js +0 -26
  16. package/components/checkbox/checkbox.spec.js +0 -235
  17. package/components/chip/chip.spec.js +0 -31
  18. package/components/color-picker/color-picker.spec.js +0 -133
  19. package/components/confirm/confirm.spec.js +0 -57
  20. package/components/confirm-text/confirm-text.spec.js +0 -29
  21. package/components/copy-markdown-url/copy-markdown-url.spec.js +0 -27
  22. package/components/copy-text/copy-text.spec.js +0 -38
  23. package/components/data-grid/__screenshots__/data-grid.spec.js/dile-data-grid-dispatches-item-checkbox-changed-and-dile-data-grid-item-selected-when-a-checkbox-is-toggled-1.png +0 -0
  24. package/components/data-grid/data-grid.spec.js +0 -421
  25. package/components/drop-file/drop-file.spec.js +0 -214
  26. package/components/drop-file/file-preview.spec.js +0 -35
  27. package/components/floating-feedback/floating-feedback.spec.js +0 -30
  28. package/components/floating-menu/floating-menu-item.spec.js +0 -27
  29. package/components/floating-menu/floating-menu.spec.js +0 -31
  30. package/components/form-separator/form-separator.spec.js +0 -28
  31. package/components/hamburger/hamburger.spec.js +0 -28
  32. package/components/icon/icon.spec.js +0 -31
  33. package/components/icon-switch/icon-switch-group.spec.js +0 -46
  34. package/components/icon-switch/icon-switch.spec.js +0 -35
  35. package/components/info-box/info-box.spec.js +0 -38
  36. package/components/inline-feedback/inline-feedback.spec.js +0 -46
  37. package/components/input/input-contact.spec.js +0 -32
  38. package/components/input/input-icon.spec.js +0 -166
  39. package/components/input/input-integer.spec.js +0 -31
  40. package/components/input/input-mask.spec.js +0 -314
  41. package/components/input/input-message.spec.js +0 -27
  42. package/components/input/input-money.spec.js +0 -30
  43. package/components/input/input-number-mask.spec.js +0 -48
  44. package/components/input/input-number.spec.js +0 -109
  45. package/components/input/input-percentage.spec.js +0 -31
  46. package/components/input/input-search.spec.js +0 -91
  47. package/components/input/input.spec.js +0 -47
  48. package/components/light-mode-switch/light-mode-switch.spec.js +0 -34
  49. package/components/menu-hamburger/menu-hamburger.spec.js +0 -34
  50. package/components/menu-overlay/menu-overlay.spec.js +0 -44
  51. package/components/message/message.spec.js +0 -42
  52. package/components/modal/__screenshots__/modal.spec.js/dile-modal-closes-only-the-topmost-modal-when-Esc-is-pressed-1.png +0 -0
  53. package/components/modal/__screenshots__/modal.spec.js/dile-modal-dispatches-dile-modal-closed-and-animates-when-the-opened-property-is-set-to-false-1.png +0 -0
  54. package/components/modal/__screenshots__/modal.spec.js/dile-modal-does-not-close-a-blocking-modal-when-Esc-is-pressed-1.png +0 -0
  55. package/components/modal/__screenshots__/modal.spec.js/dile-modal-does-not-close-the-modal-below-when-the-topmost-modal-is-blocking-1.png +0 -0
  56. package/components/modal/__screenshots__/modal.spec.js/dile-modal-ignores-transitionend-events-coming-from-inner-elements-1.png +0 -0
  57. package/components/modal/__screenshots__/modal.spec.js/dile-modal-keeps-the-focus-on-content-focused-by-the-user-when-opening-1.png +0 -0
  58. package/components/modal/__screenshots__/modal.spec.js/dile-modal-opens-and-closes-through-the-opened-attribute-1.png +0 -0
  59. package/components/modal/__screenshots__/modal.spec.js/dile-modal-reflects-the-opened-property-to-the-attribute-1.png +0 -0
  60. package/components/modal/__screenshots__/modal.spec.js/dile-modal-releases-the-background-layer-after-the-close-animation-even-without-transitionend-1.png +0 -0
  61. package/components/modal/__screenshots__/modal.spec.js/dile-modal-releases-the-background-layer-immediately-when-the-animation-duration-is-0s-1.png +0 -0
  62. package/components/modal/modal-help.spec.js +0 -32
  63. package/components/modal/modal.spec.js +0 -250
  64. package/components/nav/nav.spec.js +0 -33
  65. package/components/number-picker/number-picker-element.spec.js +0 -30
  66. package/components/number-picker/number-picker.spec.js +0 -30
  67. package/components/order-switch/__screenshots__/order-switch.spec.js/dile-order-switch-clicking-the-label-re-announces-the-current-value-without-toggling-when-not-selected-1.png +0 -0
  68. package/components/order-switch/__screenshots__/order-switch.spec.js/dile-order-switch-clicking-the-label-toggles-the-order-when-selected-1.png +0 -0
  69. package/components/order-switch/__screenshots__/order-switch.spec.js/dile-order-switch-defaults-to-ascending-order-1.png +0 -0
  70. package/components/order-switch/order-switch.spec.js +0 -57
  71. package/components/otp-input/otp-input.spec.js +0 -41
  72. package/components/pages/pages.spec.js +0 -44
  73. package/components/password/password.spec.js +0 -35
  74. package/components/progress-bar/progress-bar.spec.js +0 -28
  75. package/components/radio-group/__screenshots__/radio-group-dialog.spec.js/dile-radio-group-dialog-renders-dialog-items-with-labels-and-values-1.png +0 -0
  76. package/components/radio-group/__screenshots__/radio-group-dialog.spec.js/dile-radio-group-dialog-renders-items-with-optional-description-1.png +0 -0
  77. package/components/radio-group/__screenshots__/radio-group-dialog.spec.js/dile-radio-group-dialog-updates-value-when-an-option-is-selected-1.png +0 -0
  78. package/components/radio-group/radio-group-dialog.spec.js +0 -126
  79. package/components/radio-group/radio-group.spec.js +0 -128
  80. package/components/radio-group/radio.spec.js +0 -32
  81. package/components/range/range.spec.js +0 -36
  82. package/components/rating/rating.spec.js +0 -34
  83. package/components/rating/star.spec.js +0 -30
  84. package/components/rating-scale-question/rating-scale-option.spec.js +0 -32
  85. package/components/rating-scale-question/rating-scale-question.spec.js +0 -35
  86. package/components/select/__screenshots__/select-search.spec.js/dile-select-search-Value-API-uses-the-label-as-accessible-name-of-the-selected-field-1.png +0 -0
  87. package/components/select/select-ajax-overlay.spec.js +0 -469
  88. package/components/select/select-overlay.spec.js +0 -612
  89. package/components/select/select-search.spec.js +0 -318
  90. package/components/select/select.spec.js +0 -574
  91. package/components/selector/selector-item.spec.js +0 -40
  92. package/components/selector/selector-overlay.spec.js +0 -139
  93. package/components/selector/selector.spec.js +0 -45
  94. package/components/slide-menu/slide-menu.spec.js +0 -38
  95. package/components/slide-show/slide-show.spec.js +0 -34
  96. package/components/social-icon/social-icon.spec.js +0 -26
  97. package/components/spinner/spinner-bar.spec.js +0 -26
  98. package/components/spinner/spinner-block.spec.js +0 -21
  99. package/components/spinner/spinner-horizontal.spec.js +0 -25
  100. package/components/spinner/spinner-icon.spec.js +0 -25
  101. package/components/spinner/spinner-modal.spec.js +0 -26
  102. package/components/spinner/spinner.spec.js +0 -26
  103. package/components/steps/steps.spec.js +0 -84
  104. package/components/switch/switch.spec.js +0 -33
  105. package/components/tabs/tabs.spec.js +0 -85
  106. package/components/textarea/textarea.spec.js +0 -39
  107. package/components/time-picker/time-picker.spec.js +0 -26
  108. package/components/timer/timer.spec.js +0 -31
  109. package/components/toast/toast.spec.js +0 -86
  110. package/components/tooltip/chip-tooltip.spec.js +0 -29
  111. package/components/tooltip/tooltip.spec.js +0 -32
  112. package/components/web-visor/web-visor.spec.js +0 -32
  113. package/mixins/form/src/DileForm.spec.js +0 -29
@@ -1,41 +0,0 @@
1
- import { describe, it, expect, afterEach } from 'vitest';
2
- import './otp-input.js';
3
-
4
- describe('dile-otp-input', () => {
5
- afterEach(() => {
6
- document.body.innerHTML = '';
7
- });
8
-
9
- async function renderOtpInput(html) {
10
- document.body.innerHTML = html;
11
- const el = document.body.querySelector('dile-otp-input');
12
- await el.updateComplete;
13
- return el;
14
- }
15
-
16
- it('renders one input box per digit', async () => {
17
- const el = await renderOtpInput('<dile-otp-input name="code" length="4"></dile-otp-input>');
18
-
19
- expect(el.shadowRoot.querySelectorAll('input').length).toBe(4);
20
- });
21
-
22
- it('renders the slotted-in value across the boxes', async () => {
23
- const el = await renderOtpInput('<dile-otp-input length="4" value="12"></dile-otp-input>');
24
- const boxes = el.shadowRoot.querySelectorAll('input');
25
-
26
- expect(boxes[0].value).toBe('1');
27
- expect(boxes[1].value).toBe('2');
28
- expect(boxes[2].value).toBe('');
29
- });
30
-
31
- it('dispatches dile-otp-input-completed when the last box is filled', async () => {
32
- const el = await renderOtpInput('<dile-otp-input name="code" length="2"></dile-otp-input>');
33
- let detail = null;
34
- el.addEventListener('dile-otp-input-completed', (e) => { detail = e.detail; });
35
-
36
- el.value = '12';
37
- await el.updateComplete;
38
-
39
- expect(detail).toEqual({ name: 'code', value: '12' });
40
- });
41
- });
@@ -1,44 +0,0 @@
1
- import { describe, it, expect, afterEach } from 'vitest';
2
- import './pages.js';
3
-
4
- describe('dile-pages', () => {
5
- afterEach(() => {
6
- document.body.innerHTML = '';
7
- });
8
-
9
- async function renderPages(html) {
10
- document.body.innerHTML = html;
11
- const el = document.body.querySelector('dile-pages');
12
- await el.updateComplete;
13
- return el;
14
- }
15
-
16
- it('shows only the selected page', async () => {
17
- const el = await renderPages(`
18
- <dile-pages selected="1">
19
- <div>Page 0</div>
20
- <div>Page 1</div>
21
- </dile-pages>
22
- `);
23
-
24
- const [page0, page1] = el.children;
25
- expect(page0.style.display).toBe('none');
26
- expect(page1.style.display).toBe('block');
27
- });
28
-
29
- it('hides the previous page and shows the new one when selected changes', async () => {
30
- const el = await renderPages(`
31
- <dile-pages selected="0">
32
- <div>Page 0</div>
33
- <div>Page 1</div>
34
- </dile-pages>
35
- `);
36
-
37
- el.selected = 1;
38
- await el.updateComplete;
39
-
40
- const [page0, page1] = el.children;
41
- expect(page0.style.display).toBe('none');
42
- expect(page1.style.display).toBe('block');
43
- });
44
- });
@@ -1,35 +0,0 @@
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,28 +0,0 @@
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,126 +0,0 @@
1
- import { describe, it, expect, afterEach } from 'vitest';
2
- import './radio-group-dialog.js';
3
-
4
- describe('dile-radio-group-dialog', () => {
5
- afterEach(() => {
6
- document.body.innerHTML = '';
7
- });
8
-
9
- async function renderRadioGroupDialog(attrs = '', dialogItems = []) {
10
- document.body.innerHTML = `<dile-radio-group-dialog ${attrs}></dile-radio-group-dialog>`;
11
- const el = document.body.querySelector('dile-radio-group-dialog');
12
- el.dialogItems = dialogItems;
13
- await el.updateComplete;
14
- return el;
15
- }
16
-
17
- it('renders the title and description', async () => {
18
- const el = await renderRadioGroupDialog('title="Select Option" description="Choose one option below"');
19
-
20
- expect(el.shadowRoot.querySelector('.dialog-title').textContent).toBe('Select Option');
21
- expect(el.shadowRoot.querySelector('.dialog-description').textContent).toBe('Choose one option below');
22
- });
23
-
24
- it('renders dialog items with labels and values', async () => {
25
- const dialogItems = [
26
- { value: 'a', label: 'Option A', description: 'First option' },
27
- { value: 'b', label: 'Option B', description: 'Second option' },
28
- ];
29
-
30
- const el = await renderRadioGroupDialog('title="Select Option"', dialogItems);
31
-
32
- const items = el.shadowRoot.querySelectorAll('.radio-item-wrapper');
33
- expect(items.length).toBe(2);
34
- });
35
-
36
- it('updates value when an option is clicked', async () => {
37
- const dialogItems = [
38
- { value: 'a', label: 'Option A' },
39
- { value: 'b', label: 'Option B' },
40
- ];
41
-
42
- const el = await renderRadioGroupDialog('', dialogItems);
43
-
44
- const wrappers = el.shadowRoot.querySelectorAll('.radio-item-wrapper');
45
- wrappers[1].click();
46
- await el.updateComplete;
47
-
48
- expect(el.value).toBe('b');
49
- });
50
-
51
- it('renders items with optional description', async () => {
52
- const dialogItems = [
53
- { value: 'a', label: 'Option A', description: 'Description for A' },
54
- { value: 'b', label: 'Option B' },
55
- ];
56
-
57
- const el = await renderRadioGroupDialog('', dialogItems);
58
-
59
- const descriptions = el.shadowRoot.querySelectorAll('.item-description');
60
- expect(descriptions.length).toBe(1);
61
- expect(descriptions[0].textContent).toBe('Description for A');
62
- });
63
-
64
- it('exposes radiogroup and radio roles with the accessible name wired up', async () => {
65
- const el = await renderRadioGroupDialog('title="Select Option"', [
66
- { value: 'a', label: 'Option A' },
67
- { value: 'b', label: 'Option B' },
68
- ]);
69
-
70
- const group = el.shadowRoot.querySelector('.radio-items');
71
- expect(group.getAttribute('role')).toBe('radiogroup');
72
- expect(group.getAttribute('aria-labelledby')).toBe(el.shadowRoot.querySelector('.dialog-title').id);
73
-
74
- const wrappers = el.shadowRoot.querySelectorAll('.radio-item-wrapper');
75
- wrappers.forEach(wrapper => {
76
- expect(wrapper.getAttribute('role')).toBe('radio');
77
- const labelId = wrapper.getAttribute('aria-labelledby');
78
- expect(el.shadowRoot.getElementById(labelId).textContent.trim()).not.toBe('');
79
- });
80
- });
81
-
82
- it('reflects the selected item via aria-checked and keeps a single tab stop', async () => {
83
- const el = await renderRadioGroupDialog('', [
84
- { value: 'a', label: 'Option A' },
85
- { value: 'b', label: 'Option B' },
86
- ]);
87
- el.value = 'b';
88
- await el.updateComplete;
89
-
90
- const wrappers = el.shadowRoot.querySelectorAll('.radio-item-wrapper');
91
- expect(wrappers[0].getAttribute('aria-checked')).toBe('false');
92
- expect(wrappers[1].getAttribute('aria-checked')).toBe('true');
93
- expect(wrappers[0].getAttribute('tabindex')).toBe('-1');
94
- expect(wrappers[1].getAttribute('tabindex')).toBe('0');
95
- });
96
-
97
- it('selects an option on Space/Enter and moves selection with arrow keys', async () => {
98
- const el = await renderRadioGroupDialog('', [
99
- { value: 'a', label: 'Option A' },
100
- { value: 'b', label: 'Option B' },
101
- { value: 'c', label: 'Option C' },
102
- ]);
103
-
104
- const wrappers = el.shadowRoot.querySelectorAll('.radio-item-wrapper');
105
- wrappers[0].dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true, composed: true }));
106
- await el.updateComplete;
107
- expect(el.value).toBe('a');
108
-
109
- el.shadowRoot.querySelector('.radio-item-wrapper[aria-checked="true"]')
110
- .dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true, composed: true }));
111
- await el.updateComplete;
112
- expect(el.value).toBe('b');
113
- });
114
-
115
- it('marks the group and items as disabled', async () => {
116
- const el = await renderRadioGroupDialog('disabled', [
117
- { value: 'a', label: 'Option A' },
118
- ]);
119
-
120
- const group = el.shadowRoot.querySelector('.radio-items');
121
- expect(group.getAttribute('aria-disabled')).toBe('true');
122
- const wrapper = el.shadowRoot.querySelector('.radio-item-wrapper');
123
- expect(wrapper.getAttribute('aria-disabled')).toBe('true');
124
- expect(wrapper.getAttribute('tabindex')).toBe('-1');
125
- });
126
- });
@@ -1,128 +0,0 @@
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
-
45
- it('exposes radiogroup role wired to the visible label', async () => {
46
- const el = await renderRadioGroup(`
47
- <dile-radio-group name="opt" label="Choose one">
48
- <dile-radio value="a" label="A"></dile-radio>
49
- <dile-radio value="b" label="B"></dile-radio>
50
- </dile-radio-group>
51
- `);
52
-
53
- const group = el.shadowRoot.querySelector('div');
54
- const labelId = el.shadowRoot.querySelector('.label').id;
55
- expect(group.getAttribute('role')).toBe('radiogroup');
56
- expect(group.getAttribute('aria-labelledby')).toBe(labelId);
57
- });
58
-
59
- it('gives each radio role=radio with aria-checked reflecting selection', async () => {
60
- const el = await renderRadioGroup(`
61
- <dile-radio-group name="opt" value="a">
62
- <dile-radio value="a" label="A"></dile-radio>
63
- <dile-radio value="b" label="B"></dile-radio>
64
- </dile-radio-group>
65
- `);
66
- await new Promise(resolve => setTimeout(resolve, 210));
67
- const radios = el.querySelectorAll('dile-radio');
68
- await Promise.all([...radios].map(r => r.updateComplete));
69
-
70
- const articles = [...radios].map(r => r.shadowRoot.querySelector('article'));
71
- expect(articles[0].getAttribute('role')).toBe('radio');
72
- expect(articles[0].getAttribute('aria-checked')).toBe('true');
73
- expect(articles[1].getAttribute('aria-checked')).toBe('false');
74
- });
75
-
76
- it('keeps a single roving tab stop that follows the selection', async () => {
77
- const el = await renderRadioGroup(`
78
- <dile-radio-group name="opt">
79
- <dile-radio value="a" label="A"></dile-radio>
80
- <dile-radio value="b" label="B"></dile-radio>
81
- </dile-radio-group>
82
- `);
83
- const radios = el.querySelectorAll('dile-radio');
84
- await Promise.all([...radios].map(r => r.updateComplete));
85
- let articles = [...radios].map(r => r.shadowRoot.querySelector('article'));
86
- expect(articles[0].getAttribute('tabindex')).toBe('0');
87
- expect(articles[1].getAttribute('tabindex')).toBe('-1');
88
-
89
- radios[1].shadowRoot.querySelector('article').click();
90
- await el.updateComplete;
91
- await Promise.all([...radios].map(r => r.updateComplete));
92
- articles = [...radios].map(r => r.shadowRoot.querySelector('article'));
93
- expect(articles[0].getAttribute('tabindex')).toBe('-1');
94
- expect(articles[1].getAttribute('tabindex')).toBe('0');
95
- });
96
-
97
- it('moves selection with arrow keys', async () => {
98
- const el = await renderRadioGroup(`
99
- <dile-radio-group name="opt" value="a">
100
- <dile-radio value="a" label="A"></dile-radio>
101
- <dile-radio value="b" label="B"></dile-radio>
102
- </dile-radio-group>
103
- `);
104
- await new Promise(resolve => setTimeout(resolve, 210));
105
-
106
- el.shadowRoot.querySelector('div').dispatchEvent(
107
- new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true, composed: true })
108
- );
109
- await el.updateComplete;
110
-
111
- expect(el.value).toBe('b');
112
- });
113
-
114
- it('propagates disabled state to the slotted radios', async () => {
115
- const el = await renderRadioGroup(`
116
- <dile-radio-group name="opt" disabled>
117
- <dile-radio value="a" label="A"></dile-radio>
118
- </dile-radio-group>
119
- `);
120
- const radio = el.querySelector('dile-radio');
121
- await radio.updateComplete;
122
-
123
- expect(radio.disabled).toBe(true);
124
- const article = radio.shadowRoot.querySelector('article');
125
- expect(article.getAttribute('tabindex')).toBe('-1');
126
- expect(article.getAttribute('aria-disabled')).toBe('true');
127
- });
128
- });
@@ -1,32 +0,0 @@
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,36 +0,0 @@
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,34 +0,0 @@
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,30 +0,0 @@
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,32 +0,0 @@
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,35 +0,0 @@
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
- });