@dile/ui 3.18.0 → 3.18.2

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 (115) hide show
  1. package/components/floating-menu/src/DileFloatingMenu.js +195 -61
  2. package/components/floating-menu/src/DileFloatingMenuItem.js +12 -5
  3. package/components/toast/src/DileToast.js +2 -1
  4. package/components/toast/src/DileToastPersistent.js +1 -1
  5. package/package.json +4 -4
  6. package/components/accordion/accordion.spec.js +0 -253
  7. package/components/app-drawer/app-drawer.spec.js +0 -262
  8. package/components/avatar/avatar.spec.js +0 -25
  9. 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
  10. package/components/bottom-nav/bottom-nav.spec.js +0 -340
  11. package/components/box-selector/box-selector-item.spec.js +0 -27
  12. package/components/box-selector/box-selector.spec.js +0 -27
  13. package/components/breadcrumbs/breadcrumbs-item.spec.js +0 -28
  14. package/components/breadcrumbs/breadcrumbs.spec.js +0 -33
  15. package/components/button/button.spec.js +0 -234
  16. package/components/card/card-slide.spec.js +0 -30
  17. package/components/card/card.spec.js +0 -26
  18. package/components/checkbox/checkbox.spec.js +0 -235
  19. package/components/chip/chip.spec.js +0 -31
  20. package/components/color-picker/color-picker.spec.js +0 -133
  21. package/components/confirm/confirm.spec.js +0 -57
  22. package/components/confirm-text/confirm-text.spec.js +0 -29
  23. package/components/copy-markdown-url/copy-markdown-url.spec.js +0 -27
  24. package/components/copy-text/copy-text.spec.js +0 -38
  25. 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
  26. package/components/data-grid/data-grid.spec.js +0 -421
  27. package/components/drop-file/drop-file.spec.js +0 -214
  28. package/components/drop-file/file-preview.spec.js +0 -35
  29. package/components/floating-feedback/floating-feedback.spec.js +0 -30
  30. package/components/floating-menu/floating-menu-item.spec.js +0 -27
  31. package/components/floating-menu/floating-menu.spec.js +0 -31
  32. package/components/form-separator/form-separator.spec.js +0 -28
  33. package/components/hamburger/hamburger.spec.js +0 -28
  34. package/components/icon/icon.spec.js +0 -31
  35. package/components/icon-switch/icon-switch-group.spec.js +0 -46
  36. package/components/icon-switch/icon-switch.spec.js +0 -35
  37. package/components/info-box/info-box.spec.js +0 -38
  38. package/components/inline-feedback/inline-feedback.spec.js +0 -46
  39. package/components/input/input-contact.spec.js +0 -32
  40. package/components/input/input-icon.spec.js +0 -166
  41. package/components/input/input-integer.spec.js +0 -31
  42. package/components/input/input-mask.spec.js +0 -314
  43. package/components/input/input-message.spec.js +0 -27
  44. package/components/input/input-money.spec.js +0 -30
  45. package/components/input/input-number-mask.spec.js +0 -48
  46. package/components/input/input-number.spec.js +0 -109
  47. package/components/input/input-percentage.spec.js +0 -31
  48. package/components/input/input-search.spec.js +0 -91
  49. package/components/input/input.spec.js +0 -47
  50. package/components/light-mode-switch/light-mode-switch.spec.js +0 -34
  51. package/components/menu-hamburger/menu-hamburger.spec.js +0 -34
  52. package/components/menu-overlay/menu-overlay.spec.js +0 -44
  53. package/components/message/message.spec.js +0 -42
  54. package/components/modal/__screenshots__/modal.spec.js/dile-modal-closes-only-the-topmost-modal-when-Esc-is-pressed-1.png +0 -0
  55. 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
  56. package/components/modal/__screenshots__/modal.spec.js/dile-modal-does-not-close-a-blocking-modal-when-Esc-is-pressed-1.png +0 -0
  57. 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
  58. package/components/modal/__screenshots__/modal.spec.js/dile-modal-ignores-transitionend-events-coming-from-inner-elements-1.png +0 -0
  59. package/components/modal/__screenshots__/modal.spec.js/dile-modal-keeps-the-focus-on-content-focused-by-the-user-when-opening-1.png +0 -0
  60. package/components/modal/__screenshots__/modal.spec.js/dile-modal-opens-and-closes-through-the-opened-attribute-1.png +0 -0
  61. package/components/modal/__screenshots__/modal.spec.js/dile-modal-reflects-the-opened-property-to-the-attribute-1.png +0 -0
  62. package/components/modal/__screenshots__/modal.spec.js/dile-modal-releases-the-background-layer-after-the-close-animation-even-without-transitionend-1.png +0 -0
  63. package/components/modal/__screenshots__/modal.spec.js/dile-modal-releases-the-background-layer-immediately-when-the-animation-duration-is-0s-1.png +0 -0
  64. package/components/modal/modal-help.spec.js +0 -32
  65. package/components/modal/modal.spec.js +0 -250
  66. package/components/nav/nav.spec.js +0 -33
  67. package/components/number-picker/number-picker-element.spec.js +0 -30
  68. package/components/number-picker/number-picker.spec.js +0 -30
  69. 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
  70. package/components/order-switch/__screenshots__/order-switch.spec.js/dile-order-switch-clicking-the-label-toggles-the-order-when-selected-1.png +0 -0
  71. package/components/order-switch/__screenshots__/order-switch.spec.js/dile-order-switch-defaults-to-ascending-order-1.png +0 -0
  72. package/components/order-switch/order-switch.spec.js +0 -57
  73. package/components/otp-input/otp-input.spec.js +0 -41
  74. package/components/pages/pages.spec.js +0 -44
  75. package/components/password/password.spec.js +0 -35
  76. package/components/progress-bar/progress-bar.spec.js +0 -28
  77. 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
  78. package/components/radio-group/__screenshots__/radio-group-dialog.spec.js/dile-radio-group-dialog-renders-items-with-optional-description-1.png +0 -0
  79. 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
  80. package/components/radio-group/radio-group-dialog.spec.js +0 -126
  81. package/components/radio-group/radio-group.spec.js +0 -128
  82. package/components/radio-group/radio.spec.js +0 -32
  83. package/components/range/range.spec.js +0 -36
  84. package/components/rating/rating.spec.js +0 -34
  85. package/components/rating/star.spec.js +0 -30
  86. package/components/rating-scale-question/rating-scale-option.spec.js +0 -32
  87. package/components/rating-scale-question/rating-scale-question.spec.js +0 -35
  88. 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
  89. package/components/select/select-ajax-overlay.spec.js +0 -469
  90. package/components/select/select-overlay.spec.js +0 -612
  91. package/components/select/select-search.spec.js +0 -318
  92. package/components/select/select.spec.js +0 -574
  93. package/components/selector/selector-item.spec.js +0 -40
  94. package/components/selector/selector-overlay.spec.js +0 -139
  95. package/components/selector/selector.spec.js +0 -45
  96. package/components/slide-menu/slide-menu.spec.js +0 -38
  97. package/components/slide-show/slide-show.spec.js +0 -34
  98. package/components/social-icon/social-icon.spec.js +0 -26
  99. package/components/spinner/spinner-bar.spec.js +0 -26
  100. package/components/spinner/spinner-block.spec.js +0 -21
  101. package/components/spinner/spinner-horizontal.spec.js +0 -25
  102. package/components/spinner/spinner-icon.spec.js +0 -25
  103. package/components/spinner/spinner-modal.spec.js +0 -26
  104. package/components/spinner/spinner.spec.js +0 -26
  105. package/components/steps/steps.spec.js +0 -84
  106. package/components/switch/switch.spec.js +0 -33
  107. package/components/tabs/tabs.spec.js +0 -85
  108. package/components/textarea/textarea.spec.js +0 -39
  109. package/components/time-picker/time-picker.spec.js +0 -26
  110. package/components/timer/timer.spec.js +0 -31
  111. package/components/toast/toast.spec.js +0 -86
  112. package/components/tooltip/chip-tooltip.spec.js +0 -29
  113. package/components/tooltip/tooltip.spec.js +0 -32
  114. package/components/web-visor/web-visor.spec.js +0 -32
  115. package/mixins/form/src/DileForm.spec.js +0 -29
@@ -1,30 +0,0 @@
1
- import { describe, it, expect, afterEach } from 'vitest';
2
- import './floating-feedback.js';
3
-
4
- describe('dile-floating-feedback', () => {
5
- afterEach(() => {
6
- document.body.innerHTML = '';
7
- const styles = document.getElementById('dile-floating-feedback-styles');
8
- if (styles) styles.remove();
9
- });
10
-
11
- async function renderFloatingFeedback(html) {
12
- document.body.innerHTML = html;
13
- const el = document.body.querySelector('dile-floating-feedback');
14
- await el.updateComplete;
15
- return el;
16
- }
17
-
18
- it('renders the slotted content', async () => {
19
- const el = await renderFloatingFeedback('<dile-floating-feedback feedback="Copied!"><button>Click</button></dile-floating-feedback>');
20
- expect(el.shadowRoot.querySelector('slot')).toBeTruthy();
21
- expect(el.textContent.trim()).toBe('Click');
22
- });
23
-
24
- it('creates a floating text element in the document body when shown', async () => {
25
- const el = await renderFloatingFeedback('<dile-floating-feedback feedback="Copied!"><button>Click</button></dile-floating-feedback>');
26
- el.show();
27
-
28
- expect(document.body.querySelector('.dile-floating-feedback-text')).toBeTruthy();
29
- });
30
- });
@@ -1,27 +0,0 @@
1
- import { describe, it, expect, afterEach } from 'vitest';
2
- import './floating-menu-item.js';
3
-
4
- describe('dile-floating-menu-item', () => {
5
- afterEach(() => {
6
- document.body.innerHTML = '';
7
- });
8
-
9
- async function renderItem(html) {
10
- document.body.innerHTML = html;
11
- const el = document.body.querySelector('dile-floating-menu-item');
12
- await el.updateComplete;
13
- return el;
14
- }
15
-
16
- it('renders the slotted content inside a link with the href property', async () => {
17
- const el = await renderItem('<dile-floating-menu-item href="/home">Home</dile-floating-menu-item>');
18
- const link = el.shadowRoot.querySelector('a');
19
- expect(link.getAttribute('href')).toBe('/home');
20
- expect(el.textContent.trim()).toBe('Home');
21
- });
22
-
23
- it('sets role listitem on the host', async () => {
24
- const el = await renderItem('<dile-floating-menu-item href="/home">Home</dile-floating-menu-item>');
25
- expect(el.getAttribute('role')).toBe('listitem');
26
- });
27
- });
@@ -1,31 +0,0 @@
1
- import { describe, it, expect, afterEach } from 'vitest';
2
- import './floating-menu.js';
3
-
4
- describe('dile-floating-menu', () => {
5
- afterEach(() => {
6
- document.body.innerHTML = '';
7
- });
8
-
9
- async function renderFloatingMenu(html) {
10
- document.body.innerHTML = html;
11
- const el = document.body.querySelector('dile-floating-menu');
12
- await el.updateComplete;
13
- return el;
14
- }
15
-
16
- it('renders closed by default', async () => {
17
- const el = await renderFloatingMenu('<dile-floating-menu></dile-floating-menu>');
18
- expect(el.opened).toBe(false);
19
- expect(el.shadowRoot.querySelector('button')).toBeTruthy();
20
- expect(el.shadowRoot.querySelector('.closed')).toBeTruthy();
21
- });
22
-
23
- it('toggles opened state when the button is clicked', async () => {
24
- const el = await renderFloatingMenu('<dile-floating-menu></dile-floating-menu>');
25
- el.shadowRoot.querySelector('button').click();
26
- await el.updateComplete;
27
-
28
- expect(el.opened).toBe(true);
29
- expect(el.shadowRoot.querySelector('.opened')).toBeTruthy();
30
- });
31
- });
@@ -1,28 +0,0 @@
1
- import { describe, it, expect, afterEach } from 'vitest';
2
- import './form-separator.js';
3
-
4
- describe('dile-form-separator', () => {
5
- afterEach(() => {
6
- document.body.innerHTML = '';
7
- });
8
-
9
- async function renderFormSeparator(html) {
10
- document.body.innerHTML = html;
11
- const el = document.body.querySelector('dile-form-separator');
12
- await el.updateComplete;
13
- return el;
14
- }
15
-
16
- it('renders without a heading when label is not set', async () => {
17
- const el = await renderFormSeparator('<dile-form-separator></dile-form-separator>');
18
- expect(el.shadowRoot.querySelector('div')).toBeTruthy();
19
- expect(el.shadowRoot.querySelector('h3')).toBeNull();
20
- });
21
-
22
- it('renders the label as a heading when set', async () => {
23
- const el = await renderFormSeparator('<dile-form-separator label="Section"></dile-form-separator>');
24
- const heading = el.shadowRoot.querySelector('h3');
25
- expect(heading).toBeTruthy();
26
- expect(heading.textContent.trim()).toBe('Section');
27
- });
28
- });
@@ -1,28 +0,0 @@
1
- import { describe, it, expect, afterEach } from 'vitest';
2
- import './hamburger.js';
3
-
4
- describe('dile-hamburger', () => {
5
- afterEach(() => {
6
- document.body.innerHTML = '';
7
- });
8
-
9
- async function renderHamburger(html) {
10
- document.body.innerHTML = html;
11
- const el = document.body.querySelector('dile-hamburger');
12
- await el.updateComplete;
13
- return el;
14
- }
15
-
16
- it('renders a button without the is-active class by default', async () => {
17
- const el = await renderHamburger('<dile-hamburger></dile-hamburger>');
18
- const button = el.shadowRoot.querySelector('button.hamburger');
19
- expect(button).toBeTruthy();
20
- expect(button.classList.contains('is-active')).toBe(false);
21
- });
22
-
23
- it('adds the is-active class when active is set', async () => {
24
- const el = await renderHamburger('<dile-hamburger active></dile-hamburger>');
25
- const button = el.shadowRoot.querySelector('button.hamburger');
26
- expect(button.classList.contains('is-active')).toBe(true);
27
- });
28
- });
@@ -1,31 +0,0 @@
1
- import { describe, it, expect, afterEach } from 'vitest';
2
- import { closeIcon } from '@dile/icons/index.js';
3
- import './icon.js';
4
-
5
- describe('dile-icon', () => {
6
- afterEach(() => {
7
- document.body.innerHTML = '';
8
- });
9
-
10
- async function renderIcon(html) {
11
- document.body.innerHTML = html;
12
- const el = document.body.querySelector('dile-icon');
13
- await el.updateComplete;
14
- return el;
15
- }
16
-
17
- it('renders the provided icon inside a span', async () => {
18
- const el = await renderIcon('<dile-icon></dile-icon>');
19
- el.icon = closeIcon;
20
- await el.updateComplete;
21
-
22
- const span = el.shadowRoot.querySelector('span');
23
- expect(span).toBeTruthy();
24
- expect(span.querySelector('svg')).toBeTruthy();
25
- });
26
-
27
- it('renders nothing extra when icon is not set', async () => {
28
- const el = await renderIcon('<dile-icon></dile-icon>');
29
- expect(el.shadowRoot.querySelector('span').querySelector('svg')).toBeNull();
30
- });
31
- });
@@ -1,46 +0,0 @@
1
- import { describe, it, expect, afterEach } from 'vitest';
2
- import { closeIcon } from '@dile/icons/index.js';
3
- import './icon-switch-group.js';
4
- import './icon-switch.js';
5
-
6
- describe('dile-icon-switch-group', () => {
7
- afterEach(() => {
8
- document.body.innerHTML = '';
9
- });
10
-
11
- async function renderGroup(html) {
12
- document.body.innerHTML = html;
13
- const el = document.body.querySelector('dile-icon-switch-group');
14
- const switches = el.querySelectorAll('dile-icon-switch');
15
- switches.forEach((s) => { s.icon = closeIcon; });
16
- await el.updateComplete;
17
- for (const s of switches) await s.updateComplete;
18
- return el;
19
- }
20
-
21
- it('renders the slotted dile-icon-switch children', async () => {
22
- const el = await renderGroup(`
23
- <dile-icon-switch-group>
24
- <dile-icon-switch name="one"></dile-icon-switch>
25
- <dile-icon-switch name="two"></dile-icon-switch>
26
- </dile-icon-switch-group>
27
- `);
28
- expect(el.querySelectorAll('dile-icon-switch').length).toBe(2);
29
- });
30
-
31
- it('deactivates the other switches when one becomes active', async () => {
32
- const el = await renderGroup(`
33
- <dile-icon-switch-group>
34
- <dile-icon-switch name="one" active></dile-icon-switch>
35
- <dile-icon-switch name="two"></dile-icon-switch>
36
- </dile-icon-switch-group>
37
- `);
38
- const [one, two] = el.querySelectorAll('dile-icon-switch');
39
-
40
- two.shadowRoot.querySelector('dile-icon').click();
41
- await el.updateComplete;
42
-
43
- expect(two.active).toBe(true);
44
- expect(one.active).toBe(false);
45
- });
46
- });
@@ -1,35 +0,0 @@
1
- import { describe, it, expect, afterEach } from 'vitest';
2
- import { closeIcon } from '@dile/icons/index.js';
3
- import './icon-switch.js';
4
-
5
- describe('dile-icon-switch', () => {
6
- afterEach(() => {
7
- document.body.innerHTML = '';
8
- });
9
-
10
- async function renderIconSwitch(html) {
11
- document.body.innerHTML = html;
12
- const el = document.body.querySelector('dile-icon-switch');
13
- el.icon = closeIcon;
14
- await el.updateComplete;
15
- return el;
16
- }
17
-
18
- it('starts inactive by default', async () => {
19
- const el = await renderIconSwitch('<dile-icon-switch name="one"></dile-icon-switch>');
20
- expect(el.active).toBeFalsy();
21
- expect(el.shadowRoot.querySelector('dile-icon')).toBeTruthy();
22
- });
23
-
24
- it('toggles active and dispatches dile-icon-switch-changed on click', async () => {
25
- const el = await renderIconSwitch('<dile-icon-switch name="one"></dile-icon-switch>');
26
- let detail = null;
27
- el.addEventListener('dile-icon-switch-changed', (e) => { detail = e.detail; });
28
-
29
- el.shadowRoot.querySelector('dile-icon').click();
30
- await el.updateComplete;
31
-
32
- expect(el.active).toBe(true);
33
- expect(detail).toEqual({ active: true, name: 'one' });
34
- });
35
- });
@@ -1,38 +0,0 @@
1
- import { describe, it, expect, afterEach } from 'vitest';
2
- import './info-box.js';
3
-
4
- describe('dile-info-box', () => {
5
- afterEach(() => {
6
- document.body.innerHTML = '';
7
- });
8
-
9
- async function renderInfoBox(html) {
10
- document.body.innerHTML = html;
11
- const el = document.body.querySelector('dile-info-box');
12
- await el.updateComplete;
13
- return el;
14
- }
15
-
16
- it('renders the slotted content and a default info icon', async () => {
17
- const el = await renderInfoBox('<dile-info-box>Some info</dile-info-box>');
18
- expect(el.textContent.trim()).toBe('Some info');
19
- expect(el.shadowRoot.querySelector('.info dile-icon, .info svg')).toBeTruthy();
20
- });
21
-
22
- it('renders the title when set', async () => {
23
- const el = await renderInfoBox('<dile-info-box title="Heads up">Some info</dile-info-box>');
24
- const title = el.shadowRoot.querySelector('.title');
25
- expect(title).toBeTruthy();
26
- expect(title.textContent.trim()).toBe('Heads up');
27
- });
28
-
29
- it('shows the close button only when showCloseButton is set', async () => {
30
- const el = await renderInfoBox('<dile-info-box>Some info</dile-info-box>');
31
- expect(el.shadowRoot.querySelector('.close')).toBeNull();
32
-
33
- el.showCloseButton = true;
34
- await el.updateComplete;
35
-
36
- expect(el.shadowRoot.querySelector('.close button')).toBeTruthy();
37
- });
38
- });
@@ -1,46 +0,0 @@
1
- import { describe, it, expect, afterEach } from 'vitest';
2
- import './inline-feedback.js';
3
-
4
- describe('dile-inline-feedback', () => {
5
- afterEach(() => {
6
- document.body.innerHTML = '';
7
- });
8
-
9
- async function renderInlineFeedback(html) {
10
- document.body.innerHTML = html;
11
- const el = document.body.querySelector('dile-inline-feedback');
12
- await el.updateComplete;
13
- return el;
14
- }
15
-
16
- it('renders an empty message section by default', async () => {
17
- const el = await renderInlineFeedback('<dile-inline-feedback></dile-inline-feedback>');
18
- const section = el.shadowRoot.querySelector('#msg');
19
- expect(section).toBeTruthy();
20
- expect(section.textContent.trim()).toBe('');
21
- });
22
-
23
- it('sets the message and status classes on positiveFeedback', async () => {
24
- const el = await renderInlineFeedback('<dile-inline-feedback></dile-inline-feedback>');
25
- el.positiveFeedback('Saved!');
26
- await el.updateComplete;
27
-
28
- expect(el.msg).toBe('Saved!');
29
- expect(el.status).toBe('success');
30
- expect(el.shadowRoot.querySelector('#msg').textContent.trim()).toBe('Saved!');
31
- expect(el.shadowRoot.querySelector('#msg').classList.contains('success')).toBe(true);
32
- });
33
-
34
- it('clears the message and status on clear()', async () => {
35
- const el = await renderInlineFeedback('<dile-inline-feedback></dile-inline-feedback>');
36
- el.negativeFeedback('Oops');
37
- await el.updateComplete;
38
-
39
- el.clear();
40
- await el.updateComplete;
41
-
42
- expect(el.msg).toBe('');
43
- expect(el.status).toBe('');
44
- expect(el.opened).toBe(false);
45
- });
46
- });
@@ -1,32 +0,0 @@
1
- import { describe, it, expect, afterEach } from 'vitest';
2
- import './input-contact.js';
3
-
4
- describe('dile-input-contact', () => {
5
- afterEach(() => {
6
- document.body.innerHTML = '';
7
- });
8
-
9
- async function renderInputContact(html) {
10
- document.body.innerHTML = html;
11
- const el = document.body.querySelector('dile-input-contact');
12
- await el.updateComplete;
13
- return el;
14
- }
15
-
16
- it('renders a native text input with the given value', async () => {
17
- const el = await renderInputContact('<dile-input-contact name="phone" value="123"></dile-input-contact>');
18
- const input = el.shadowRoot.querySelector('input');
19
- expect(input).toBeTruthy();
20
- expect(input.value).toBe('123');
21
- });
22
-
23
- it('marks invalid phone values as errored on blur', async () => {
24
- const el = await renderInputContact('<dile-input-contact name="phone" phone value="abc"></dile-input-contact>');
25
- const input = el.shadowRoot.querySelector('input');
26
- input.dispatchEvent(new Event('blur'));
27
- await el.updateComplete;
28
-
29
- expect(el.valid).toBe(false);
30
- expect(el.errored).toBe(true);
31
- });
32
- });
@@ -1,166 +0,0 @@
1
- import { describe, it, expect, afterEach, vi } from 'vitest';
2
- import './input-icon.js';
3
- import '@dile/iconlib/lucide-icons/dot.js';
4
-
5
- describe('dile-input-icon', () => {
6
- afterEach(() => {
7
- document.body.innerHTML = '';
8
- });
9
-
10
- async function renderInputIcon(html) {
11
- document.body.innerHTML = html;
12
- const el = document.body.querySelector('dile-input-icon');
13
- await el.updateComplete;
14
- return el;
15
- }
16
-
17
- it('renders a text input with the given value', async () => {
18
- const el = await renderInputIcon('<dile-input-icon name="test" value="hello"></dile-input-icon>');
19
- const input = el.shadowRoot.querySelector('input');
20
- expect(input).toBeTruthy();
21
- expect(input.value).toBe('hello');
22
- expect(input.type).toBe('text');
23
- });
24
-
25
- it('renders the label when set', async () => {
26
- const el = await renderInputIcon('<dile-input-icon label="Username"></dile-input-icon>');
27
- const label = el.shadowRoot.querySelector('label');
28
- expect(label).toBeTruthy();
29
- expect(label.textContent.trim()).toBe('Username');
30
- });
31
-
32
- it('does not render icon button when icon is not set', async () => {
33
- const el = await renderInputIcon('<dile-input-icon></dile-input-icon>');
34
- const button = el.shadowRoot.querySelector('.input-icon-btn');
35
- expect(button).toBeFalsy();
36
- });
37
-
38
- it('renders icon button when icon is set', async () => {
39
- const el = await renderInputIcon('<dile-input-icon icon="lucide.dot"></dile-input-icon>');
40
- await new Promise(resolve => setTimeout(resolve, 50)); // Small delay for icon registration
41
- const button = el.shadowRoot.querySelector('.input-icon-btn');
42
- expect(button).toBeTruthy();
43
- });
44
-
45
- it('disables the icon button when input is disabled', async () => {
46
- const el = await renderInputIcon('<dile-input-icon icon="lucide.dot" disabled></dile-input-icon>');
47
- const button = el.shadowRoot.querySelector('.input-icon-btn');
48
- expect(button).toBeTruthy();
49
- expect(button.disabled).toBe(true);
50
- });
51
-
52
- it('dispatches dile-input-icon-clicked event when icon button is clicked', async () => {
53
- const el = await renderInputIcon('<dile-input-icon icon="lucide.dot" value="test-value"></dile-input-icon>');
54
- const button = el.shadowRoot.querySelector('.input-icon-btn');
55
-
56
- let eventData = null;
57
- el.addEventListener('dile-input-icon-clicked', (e) => {
58
- eventData = e.detail;
59
- });
60
-
61
- button.click();
62
- await el.updateComplete;
63
-
64
- expect(eventData).toBeTruthy();
65
- expect(eventData.icon).toBe('lucide.dot');
66
- expect(eventData.value).toBe('test-value');
67
- });
68
-
69
- it('calls onIconClick callback when icon button is clicked', async () => {
70
- const callback = vi.fn();
71
- const el = await renderInputIcon('<dile-input-icon icon="lucide.dot" value="test"></dile-input-icon>');
72
-
73
- el.onIconClick = callback;
74
- const button = el.shadowRoot.querySelector('.input-icon-btn');
75
- button.click();
76
- await el.updateComplete;
77
-
78
- expect(callback).toHaveBeenCalledWith(el);
79
- expect(callback).toHaveBeenCalledTimes(1);
80
- });
81
-
82
- it('callback receives component instance with access to value property', async () => {
83
- const el = await renderInputIcon('<dile-input-icon icon="lucide.dot" value="secret"></dile-input-icon>');
84
-
85
- let receivedComponent = null;
86
- el.onIconClick = (component) => {
87
- receivedComponent = component;
88
- };
89
-
90
- const button = el.shadowRoot.querySelector('.input-icon-btn');
91
- button.click();
92
- await el.updateComplete;
93
-
94
- expect(receivedComponent).toBe(el);
95
- expect(receivedComponent.value).toBe('secret');
96
- });
97
-
98
- it('renders a message when set', async () => {
99
- const el = await renderInputIcon('<dile-input-icon></dile-input-icon>');
100
- el.message = 'Required field';
101
- await el.updateComplete;
102
-
103
- const message = el.shadowRoot.querySelector('.message span');
104
- expect(message).toBeTruthy();
105
- expect(message.textContent.trim()).toBe('Required field');
106
- });
107
-
108
- it('updates the value property on user input', async () => {
109
- const el = await renderInputIcon('<dile-input-icon name="test"></dile-input-icon>');
110
- const input = el.shadowRoot.querySelector('input');
111
- input.value = 'typed';
112
- input.dispatchEvent(new Event('input', { bubbles: true }));
113
- await el.updateComplete;
114
-
115
- expect(el.value).toBe('typed');
116
- });
117
-
118
- it('does not render tooltip wrapper when tooltip is not set', async () => {
119
- const el = await renderInputIcon('<dile-input-icon icon="lucide.dot"></dile-input-icon>');
120
- const tooltip = el.shadowRoot.querySelector('dile-tooltip');
121
- expect(tooltip).toBeFalsy();
122
- });
123
-
124
- it('renders dile-tooltip when tooltip property is set', async () => {
125
- const el = await renderInputIcon('<dile-input-icon icon="lucide.dot" tooltip="Help text"></dile-input-icon>');
126
- await el.updateComplete;
127
- const tooltip = el.shadowRoot.querySelector('dile-tooltip');
128
- expect(tooltip).toBeTruthy();
129
- expect(tooltip.getAttribute('tooltip')).toBe('Help text');
130
- });
131
-
132
- it('maps tooltipPosition to tooltip position attribute', async () => {
133
- const el = await renderInputIcon('<dile-input-icon icon="lucide.dot" tooltip="Help" tooltipPosition="bottom"></dile-input-icon>');
134
- await el.updateComplete;
135
- const tooltip = el.shadowRoot.querySelector('dile-tooltip');
136
- expect(tooltip.getAttribute('position')).toBe('bottom');
137
- });
138
-
139
- it('maps tooltipFadeIn to tooltip fadeIn attribute', async () => {
140
- const el = await renderInputIcon('<dile-input-icon icon="lucide.dot" tooltip="Help" tooltipFadeIn></dile-input-icon>');
141
- await el.updateComplete;
142
- const tooltip = el.shadowRoot.querySelector('dile-tooltip');
143
- expect(tooltip.getAttribute('fadeIn')).toBe('');
144
- });
145
-
146
- it('maps tooltipArrow to tooltip arrow attribute', async () => {
147
- const el = await renderInputIcon('<dile-input-icon icon="lucide.dot" tooltip="Help" tooltipArrow></dile-input-icon>');
148
- await el.updateComplete;
149
- const tooltip = el.shadowRoot.querySelector('dile-tooltip');
150
- expect(tooltip.getAttribute('arrow')).toBe('');
151
- });
152
-
153
- it('button is still clickable when wrapped in tooltip', async () => {
154
- const callback = vi.fn();
155
- const el = await renderInputIcon('<dile-input-icon icon="lucide.dot" tooltip="Help"></dile-input-icon>');
156
- el.onIconClick = callback;
157
- await el.updateComplete;
158
-
159
- const button = el.shadowRoot.querySelector('.input-icon-btn');
160
- expect(button).toBeTruthy();
161
- button.click();
162
- await el.updateComplete;
163
-
164
- expect(callback).toHaveBeenCalledTimes(1);
165
- });
166
- });
@@ -1,31 +0,0 @@
1
- import { describe, it, expect, afterEach } from 'vitest';
2
- import './input-integer.js';
3
-
4
- describe('dile-input-integer', () => {
5
- afterEach(() => {
6
- document.body.innerHTML = '';
7
- });
8
-
9
- async function renderInputInteger(html) {
10
- document.body.innerHTML = html;
11
- const el = document.body.querySelector('dile-input-integer');
12
- await el.updateComplete;
13
- return el;
14
- }
15
-
16
- it('renders a native text input with the given value', async () => {
17
- const el = await renderInputInteger('<dile-input-integer name="qty" value="5"></dile-input-integer>');
18
- const input = el.shadowRoot.querySelector('input');
19
- expect(input).toBeTruthy();
20
- expect(input.value).toBe('5');
21
- });
22
-
23
- it('formats the value to an integer on blur', async () => {
24
- const el = await renderInputInteger('<dile-input-integer name="qty" value="5.9"></dile-input-integer>');
25
- const input = el.shadowRoot.querySelector('input');
26
- input.value = '5.9';
27
- input.dispatchEvent(new Event('blur'));
28
-
29
- expect(el.value).toBe(5);
30
- });
31
- });