@lion/ui 0.15.2 → 0.15.4

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 (169) hide show
  1. package/README.md +46 -11
  2. package/components/combobox/src/LionCombobox.js +4 -1
  3. package/components/combobox/test/lion-combobox-integrations.test.js +23 -0
  4. package/components/combobox/test/lion-combobox.test.js +20 -0
  5. package/components/core/src/ScopedStylesController.js +7 -10
  6. package/components/core/test-helpers/getCachedFixture.js +55 -0
  7. package/components/form-core/src/validate/LionValidationFeedback.js +2 -2
  8. package/components/form-core/src/validate/ValidateMixin.js +3 -3
  9. package/components/form-core/test/validate/lion-validation-feedback.test.js +2 -2
  10. package/components/form-core/test-suites/ValidateMixin.suite.js +23 -11
  11. package/components/form-core/translations/bg.js +4 -4
  12. package/components/form-core/translations/cs.js +4 -4
  13. package/components/form-core/translations/de.js +4 -4
  14. package/components/form-core/translations/en.js +4 -4
  15. package/components/form-core/translations/es.js +4 -4
  16. package/components/form-core/translations/fr.js +4 -4
  17. package/components/form-core/translations/hu.js +4 -4
  18. package/components/form-core/translations/it.js +4 -4
  19. package/components/form-core/translations/nl.js +4 -4
  20. package/components/form-core/translations/pl.js +4 -4
  21. package/components/form-core/translations/ro.js +4 -4
  22. package/components/form-core/translations/ru.js +4 -4
  23. package/components/form-core/translations/sk.js +4 -4
  24. package/components/form-core/translations/uk.js +4 -4
  25. package/components/form-core/translations/zh.js +4 -4
  26. package/components/input-amount/src/parsers.js +3 -2
  27. package/components/input-amount/test/parsers.test.js +6 -0
  28. package/components/input-amount-dropdown/src/currencyUtil.js +1 -1
  29. package/components/input-file/src/localizeNamespaceLoader.js +4 -0
  30. package/components/input-file/translations/bg.js +5 -0
  31. package/components/input-file/translations/cs.js +5 -0
  32. package/components/input-file/translations/es.js +5 -0
  33. package/components/input-file/translations/fr.js +5 -0
  34. package/components/input-file/translations/hu.js +5 -0
  35. package/components/input-file/translations/id-ID.js +5 -0
  36. package/components/input-file/translations/id.js +19 -0
  37. package/components/input-file/translations/it.js +5 -0
  38. package/components/input-file/translations/pl.js +5 -0
  39. package/components/input-file/translations/ro.js +5 -0
  40. package/components/input-file/translations/sk.js +5 -0
  41. package/components/input-file/translations/uk.js +5 -0
  42. package/components/input-file/translations/zh.js +5 -0
  43. package/components/input-stepper/src/LionInputStepper.js +48 -52
  44. package/components/input-stepper/test/lion-input-stepper-integrations.test.js +2 -19
  45. package/components/input-stepper/test/lion-input-stepper.test.js +2 -476
  46. package/components/input-stepper/test-suites/lion-input-stepper.integration.suite.js +19 -0
  47. package/components/input-stepper/test-suites/lion-input-stepper.suite.js +673 -0
  48. package/components/listbox/src/ListboxMixin.js +0 -1
  49. package/components/listbox/test-suites/ListboxMixin.suite.js +71 -2
  50. package/components/overlays/src/OverlayController.js +3 -0
  51. package/components/overlays/src/OverlaysManager.js +9 -2
  52. package/components/overlays/test/OverlayController.test.js +22 -9
  53. package/components/overlays/test/OverlaysManager.test.js +16 -0
  54. package/components/pagination/src/LionPagination.js +2 -1
  55. package/components/pagination/test/lion-pagination.test.js +41 -0
  56. package/components/validate-messages/translations/it.js +2 -2
  57. package/custom-elements.json +281 -179
  58. package/dist-types/components/combobox/src/LionCombobox.d.ts.map +1 -1
  59. package/dist-types/components/core/src/ScopedStylesController.d.ts +1 -2
  60. package/dist-types/components/core/src/ScopedStylesController.d.ts.map +1 -1
  61. package/dist-types/components/core/test-helpers/getCachedFixture.d.ts +14 -0
  62. package/dist-types/components/core/test-helpers/getCachedFixture.d.ts.map +1 -0
  63. package/dist-types/components/form-core/test-suites/ValidateMixin.suite.d.ts.map +1 -1
  64. package/dist-types/components/form-integrations/test/helpers/helpers.d.ts +3 -3
  65. package/dist-types/components/form-integrations/test/helpers/helpers.d.ts.map +1 -1
  66. package/dist-types/components/input-amount/src/parsers.d.ts.map +1 -1
  67. package/dist-types/components/input-file/src/localizeNamespaceLoader.d.ts +1 -1
  68. package/dist-types/components/input-file/src/localizeNamespaceLoader.d.ts.map +1 -1
  69. package/dist-types/components/input-file/translations/bg-BG.d.ts +5 -0
  70. package/dist-types/components/input-file/translations/bg.d.ts +5 -0
  71. package/dist-types/components/input-file/translations/cs-CZ.d.ts +5 -0
  72. package/dist-types/components/input-file/translations/cs.d.ts +5 -0
  73. package/dist-types/components/input-file/translations/es-ES.d.ts +5 -0
  74. package/dist-types/components/input-file/translations/es.d.ts +5 -0
  75. package/dist-types/components/input-file/translations/fr-BE.d.ts +5 -0
  76. package/dist-types/components/input-file/translations/fr-FR.d.ts +5 -0
  77. package/dist-types/components/input-file/translations/fr.d.ts +5 -0
  78. package/dist-types/components/input-file/translations/hu-HU.d.ts +5 -0
  79. package/dist-types/components/input-file/translations/hu.d.ts +5 -0
  80. package/dist-types/components/input-file/translations/id-ID.d.ts +20 -0
  81. package/dist-types/components/input-file/translations/id-ID.d.ts.map +1 -0
  82. package/dist-types/components/input-file/translations/id.d.ts +20 -0
  83. package/dist-types/components/input-file/translations/id.d.ts.map +1 -0
  84. package/dist-types/components/input-file/translations/it-IT.d.ts +5 -0
  85. package/dist-types/components/input-file/translations/it.d.ts +5 -0
  86. package/dist-types/components/input-file/translations/pl-PL.d.ts +5 -0
  87. package/dist-types/components/input-file/translations/pl.d.ts +5 -0
  88. package/dist-types/components/input-file/translations/ro-RO.d.ts +5 -0
  89. package/dist-types/components/input-file/translations/ro.d.ts +5 -0
  90. package/dist-types/components/input-file/translations/sk-SK.d.ts +5 -0
  91. package/dist-types/components/input-file/translations/sk.d.ts +5 -0
  92. package/dist-types/components/input-file/translations/uk-UA.d.ts +5 -0
  93. package/dist-types/components/input-file/translations/uk.d.ts +5 -0
  94. package/dist-types/components/input-file/translations/zh-CN.d.ts +5 -0
  95. package/dist-types/components/input-file/translations/zh.d.ts +5 -0
  96. package/dist-types/components/input-stepper/src/LionInputStepper.d.ts +4 -20
  97. package/dist-types/components/input-stepper/src/LionInputStepper.d.ts.map +1 -1
  98. package/dist-types/components/input-stepper/test/lion-input-stepper.test.d.ts +1 -2
  99. package/dist-types/components/input-stepper/test/lion-input-stepper.test.d.ts.map +1 -1
  100. package/dist-types/components/input-stepper/test-suites/lion-input-stepper.integration.suite.d.ts +3 -0
  101. package/dist-types/components/input-stepper/test-suites/lion-input-stepper.integration.suite.d.ts.map +1 -0
  102. package/dist-types/components/input-stepper/test-suites/lion-input-stepper.suite.d.ts +4 -0
  103. package/dist-types/components/input-stepper/test-suites/lion-input-stepper.suite.d.ts.map +1 -0
  104. package/dist-types/components/listbox/src/ListboxMixin.d.ts.map +1 -1
  105. package/dist-types/components/listbox/test-suites/ListboxMixin.suite.d.ts.map +1 -1
  106. package/dist-types/components/overlays/src/OverlayController.d.ts.map +1 -1
  107. package/dist-types/components/overlays/src/OverlaysManager.d.ts +4 -1
  108. package/dist-types/components/overlays/src/OverlaysManager.d.ts.map +1 -1
  109. package/dist-types/components/pagination/src/LionPagination.d.ts.map +1 -1
  110. package/dist-types/exports/input-stepper-suites.d.ts +6 -0
  111. package/dist-types/exports/input-stepper-suites.d.ts.map +1 -0
  112. package/dist-types/tsconfig.tsbuildinfo +1 -1
  113. package/docs/components/checkbox-group/overview.md +2 -2
  114. package/docs/components/checkbox-group/use-cases.md +3 -9
  115. package/docs/components/collapsible/overview.md +1 -1
  116. package/docs/components/combobox/overview.md +1 -1
  117. package/docs/components/combobox/use-cases.md +1 -1
  118. package/docs/components/dialog/overview.md +1 -1
  119. package/docs/components/fieldset/overview.md +5 -5
  120. package/docs/components/form/overview.md +3 -3
  121. package/docs/components/form/use-cases.md +2 -2
  122. package/docs/components/icon/use-cases.md +1 -1
  123. package/docs/components/input/overview.md +1 -1
  124. package/docs/components/input-amount/overview.md +3 -3
  125. package/docs/components/input-date/overview.md +3 -3
  126. package/docs/components/input-datepicker/overview.md +5 -5
  127. package/docs/components/input-email/overview.md +2 -2
  128. package/docs/components/input-file/overview.md +1 -1
  129. package/docs/components/input-iban/overview.md +2 -2
  130. package/docs/components/input-range/overview.md +2 -2
  131. package/docs/components/input-stepper/api-table.md +2 -3
  132. package/docs/components/input-stepper/overview.md +1 -1
  133. package/docs/components/input-tel/overview.md +1 -1
  134. package/docs/components/input-tel/use-cases.md +6 -6
  135. package/docs/components/input-tel-dropdown/overview.md +1 -1
  136. package/docs/components/listbox/use-cases.md +1 -1
  137. package/docs/components/radio-group/overview.md +3 -3
  138. package/docs/components/radio-group/use-cases.md +3 -9
  139. package/docs/components/select/overview.md +1 -1
  140. package/docs/components/select/use-cases.md +6 -6
  141. package/docs/components/select-rich/use-cases.md +2 -2
  142. package/docs/components/tabs/examples.md +1 -1
  143. package/docs/fundamentals/index.md +4 -4
  144. package/docs/fundamentals/node-tools/publish-docs/overview.md +3 -3
  145. package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/overview.md +2 -2
  146. package/docs/fundamentals/rationales/accessibility.md +1 -1
  147. package/docs/fundamentals/systems/core/SlotMixin.md +2 -2
  148. package/docs/fundamentals/systems/core/api-table.md +3 -4
  149. package/docs/fundamentals/systems/core/overview.md +1 -1
  150. package/docs/fundamentals/systems/form/formatting-and-parsing.md +4 -4
  151. package/docs/fundamentals/systems/form/model-value.md +1 -1
  152. package/docs/fundamentals/systems/form/overview.md +28 -28
  153. package/docs/fundamentals/systems/form/validate.md +38 -30
  154. package/docs/fundamentals/systems/localize/overview.md +4 -4
  155. package/docs/fundamentals/systems/overlays/api-table.md +1 -1
  156. package/docs/fundamentals/systems/overlays/configuration.md +2 -2
  157. package/docs/fundamentals/systems/overlays/overview.md +5 -5
  158. package/docs/fundamentals/systems/overlays/use-cases.md +2 -2
  159. package/docs/fundamentals/tools/helpers/overview.md +1 -1
  160. package/docs/fundamentals/tools/singleton-manager/overview.md +4 -4
  161. package/docs/guides/how-to/create-a-custom-field.md +5 -5
  162. package/docs/guides/how-to/create-a-form.md +4 -4
  163. package/docs/guides/how-to/extend-a-native-input.md +2 -2
  164. package/docs/guides/index.md +8 -8
  165. package/docs/guides/principles/index.md +5 -5
  166. package/docs/guides/principles/styling.md +1 -1
  167. package/exports/input-stepper-suites.js +11 -0
  168. package/input-stepper-suites.js +11 -0
  169. package/package.json +1 -1
@@ -1,4 +1,5 @@
1
1
  import { LitElement } from 'lit';
2
+ import { ref } from 'lit/directives/ref.js';
2
3
  import { repeat } from 'lit/directives/repeat.js';
3
4
  import { Required } from '@lion/ui/form-core.js';
4
5
  import { LionOptions } from '@lion/ui/listbox.js';
@@ -17,6 +18,7 @@ import { sendKeys } from '@web/test-runner-commands';
17
18
  import sinon from 'sinon';
18
19
  import { getListboxMembers } from '../../../exports/listbox-test-helpers.js';
19
20
  import { browserDetection } from '../../core/src/browserDetection.js';
21
+ import { getCachedFixture } from '../../core/test-helpers/getCachedFixture.js';
20
22
 
21
23
  /**
22
24
  * @typedef {import('../src/LionListbox.js').LionListbox} LionListbox
@@ -589,6 +591,55 @@ export function runListboxMixinSuite(customConfig = {}) {
589
591
  el.reset();
590
592
  expect(el.activeIndex).to.equal(-1);
591
593
  });
594
+
595
+ it('clears modelValue on clear()', async () => {
596
+ const el = await fixture(html`
597
+ <${tag} has-no-default-selected>
598
+ <${optionTag} .choiceValue=${'10'}>Item 1</${optionTag}>
599
+ <${optionTag} .choiceValue=${'20'}>Item 2</${optionTag}>
600
+ </${tag}>
601
+ `);
602
+
603
+ el.setCheckedIndex(0);
604
+ await el.updateComplete;
605
+ expect(el.modelValue).to.deep.equal('10');
606
+
607
+ el.clear();
608
+ await el.updateComplete;
609
+ expect(el.modelValue).to.equal('');
610
+ });
611
+
612
+ it('clears modelValue on clear() when multiple-choice', async () => {
613
+ const el = await fixture(html`
614
+ <${tag} has-no-default-selected multiple-choice>
615
+ <${optionTag} .choiceValue=${'10'}>Item 1</${optionTag}>
616
+ <${optionTag} .choiceValue=${'20'}>Item 2</${optionTag}>
617
+ </${tag}>
618
+ `);
619
+ el.setCheckedIndex(0);
620
+ await el.updateComplete;
621
+ expect(el.modelValue).to.eql(['10']);
622
+
623
+ el.clear();
624
+ expect(el.modelValue).to.eql([]);
625
+ });
626
+
627
+ it('keeps interaction states on clear()', async () => {
628
+ const el = await fixture(html`
629
+ <${tag} has-no-default-selected>
630
+ <${optionTag} .choiceValue=${'10'}>Item 1</${optionTag}>
631
+ <${optionTag} .choiceValue=${'20'}>Item 2</${optionTag}>
632
+ </${tag}>
633
+ `);
634
+
635
+ el.setCheckedIndex(0);
636
+ await el.updateComplete;
637
+ expect(el.dirty).to.equal(true);
638
+
639
+ el.clear();
640
+ await el.updateComplete;
641
+ expect(el.dirty).to.equal(true);
642
+ });
592
643
  });
593
644
 
594
645
  describe('Interactions', () => {
@@ -1547,8 +1598,12 @@ export function runListboxMixinSuite(customConfig = {}) {
1547
1598
  expect(el.querySelector('[role=listbox]')).to.equal(_listboxNode);
1548
1599
 
1549
1600
  expect(el.formElements.length).to.equal(2);
1550
- expect(_listboxNode.children.length).to.equal(2);
1551
- expect(_listboxNode.children[0].tagName).to.equal(cfg.optionTagString.toUpperCase());
1601
+ // When we use ScopedStylesController, lisboxNode can have style tag along with options
1602
+ const childrenOtherThanStyle = Array.from(_listboxNode.children).filter(
1603
+ child => child.nodeName !== 'STYLE',
1604
+ );
1605
+ expect(childrenOtherThanStyle.length).to.equal(2);
1606
+ expect(childrenOtherThanStyle[0].tagName).to.equal(cfg.optionTagString.toUpperCase());
1552
1607
  });
1553
1608
  });
1554
1609
 
@@ -1735,6 +1790,20 @@ export function runListboxMixinSuite(customConfig = {}) {
1735
1790
  await el.updateComplete;
1736
1791
  expect(spy).to.have.been.calledTwice;
1737
1792
  });
1793
+
1794
+ it('does not calls "_onListboxContentChanged" during connect and disconnected', async () => {
1795
+ const renderEl = /** @param {import('lit/directives/ref.js').Ref<any>} refObj */ refObj =>
1796
+ html`<${wrappingTag} ${ref(refObj)}></${wrappingTag}>`;
1797
+ const { el, show, hide } = await getCachedFixture(renderEl);
1798
+ const typedEl = /** @type {MyEl} */ (el);
1799
+ await typedEl?.listbox.registrationComplete;
1800
+ // @ts-ignore [allow-protected] in test
1801
+ const spy = sinon.spy(typedEl.listbox, '_onListboxContentChanged');
1802
+ await hide();
1803
+ await show();
1804
+
1805
+ expect(spy).not.to.have.been.called;
1806
+ });
1738
1807
  });
1739
1808
  });
1740
1809
  }
@@ -1081,6 +1081,9 @@ export class OverlayController extends EventTarget {
1081
1081
  case 'hide':
1082
1082
  this.manager.requestToEnableScroll();
1083
1083
  break;
1084
+ case 'teardown':
1085
+ this.manager.requestToEnableScroll(this);
1086
+ break;
1084
1087
  /* no default */
1085
1088
  }
1086
1089
  }
@@ -184,8 +184,15 @@ export class OverlaysManager {
184
184
  }
185
185
  }
186
186
 
187
- requestToEnableScroll() {
188
- const hasOpenSiblingThatPreventsScroll = this.shownList.some(
187
+ /**
188
+ * @param {OverlayController} [currentController]
189
+ */
190
+ requestToEnableScroll(currentController) {
191
+ const openedSiblings = currentController
192
+ ? this.shownList.filter(ctrl => ctrl !== currentController)
193
+ : this.shownList;
194
+
195
+ const hasOpenSiblingThatPreventsScroll = openedSiblings.some(
189
196
  ctrl => ctrl.preventsScroll === true,
190
197
  );
191
198
  if (hasOpenSiblingThatPreventsScroll) {
@@ -353,14 +353,17 @@ describe('OverlayController', () => {
353
353
  normalizeOverlayContentWapper(ctrl.contentWrapperNode);
354
354
 
355
355
  // The total dom structure created...
356
- expect(el).shadowDom.to.equal(`
356
+ expect(el).shadowDom.to.equal(
357
+ `
357
358
  <dialog data-overlay-outer-wrapper="" open="" role="none" style="${wrappingDialogNodeStyle}">
358
359
  <div data-id="content-wrapper">
359
360
  <slot name="content">
360
361
  </slot>
361
362
  </div>
362
363
  </dialog>
363
- `);
364
+ `,
365
+ { ignoreAttributes: ['closedby'] },
366
+ );
364
367
 
365
368
  expect(el).lightDom.to.equal(`<div slot="content">projected</div>`);
366
369
  });
@@ -380,13 +383,16 @@ describe('OverlayController', () => {
380
383
  normalizeOverlayContentWapper(ctrl.contentWrapperNode);
381
384
 
382
385
  // The total dom structure created...
383
- expect(el).lightDom.to.equal(`
386
+ expect(el).lightDom.to.equal(
387
+ `
384
388
  <dialog data-overlay-outer-wrapper="" open="" role="none" style="${wrappingDialogNodeStyle}">
385
389
  <div data-id="content-wrapper">
386
390
  <div id="content">non projected</div>
387
391
  </div>
388
392
  </dialog>
389
- `);
393
+ `,
394
+ { ignoreAttributes: ['closedby'] },
395
+ );
390
396
  });
391
397
  });
392
398
 
@@ -421,13 +427,16 @@ describe('OverlayController', () => {
421
427
  normalizeOverlayContentWapper(ctrl.contentWrapperNode);
422
428
 
423
429
  // The total dom structure created...
424
- expect(el).shadowDom.to.equal(`
430
+ expect(el).shadowDom.to.equal(
431
+ `
425
432
  <dialog data-overlay-outer-wrapper="" open="" role="none" style="${wrappingDialogNodeStyle}">
426
433
  <div data-id="content-wrapper">
427
434
  <slot name="content"></slot>
428
435
  </div>
429
436
  </dialog>
430
- `);
437
+ `,
438
+ { ignoreAttributes: ['closedby'] },
439
+ );
431
440
  });
432
441
 
433
442
  it("uses the .contentWrapperNode as container for Popper's arrow", async () => {
@@ -464,14 +473,17 @@ describe('OverlayController', () => {
464
473
  normalizeOverlayContentWapper(ctrl.contentWrapperNode);
465
474
 
466
475
  // The total dom structure created...
467
- expect(el).shadowDom.to.equal(`
476
+ expect(el).shadowDom.to.equal(
477
+ `
468
478
  <dialog data-overlay-outer-wrapper="" open="" role="none" style="${wrappingDialogNodeStyle}">
469
479
  <div data-id="content-wrapper">
470
480
  <div id="arrow"></div>
471
481
  <slot name="content"></slot>
472
482
  </div>
473
483
  </dialog>
474
- `);
484
+ `,
485
+ { ignoreAttributes: ['closedby'] },
486
+ );
475
487
  });
476
488
  });
477
489
  });
@@ -540,6 +552,7 @@ describe('OverlayController', () => {
540
552
  </div>
541
553
  </dialog>
542
554
  `,
555
+ { ignoreAttributes: ['closedby'] },
543
556
  );
544
557
  });
545
558
  });
@@ -800,7 +813,7 @@ describe('OverlayController', () => {
800
813
  await mimicEscapePress(childOverlay.contentNode);
801
814
 
802
815
  // without this line, the test is unstable on FF sometimes
803
- await aTimeout(0);
816
+ await aTimeout(100);
804
817
 
805
818
  expect(parentOverlay.isShown).to.be.false;
806
819
  expect(childOverlay.isShown).to.be.true;
@@ -163,6 +163,22 @@ describe('OverlaysManager', () => {
163
163
  'overlays-scroll-lock-ios-fix',
164
164
  );
165
165
  });
166
+ it('remove class "overlays-scroll-lock-ios-fix" after teardown', async () => {
167
+ mockIOS();
168
+ const dialog = new OverlayController({ ...defaultOptions, preventsScroll: true }, mngr);
169
+ await dialog.show();
170
+
171
+ await dialog.teardown();
172
+
173
+ expect(
174
+ Array.from(document.body.classList).filter(cls =>
175
+ ['overlays-scroll-lock', 'overlays-scroll-lock-ios-fix'].includes(cls),
176
+ ),
177
+ ).to.be.empty;
178
+ expect(Array.from(document.documentElement.classList)).to.not.contain(
179
+ 'overlays-scroll-lock-ios-fix',
180
+ );
181
+ });
166
182
  });
167
183
  });
168
184
  });
@@ -196,7 +196,8 @@ export class LionPagination extends LocalizeMixin(LitElement) {
196
196
  const finish = this.count;
197
197
  // If there are more pages then we want to display we have to redo the list each time
198
198
  // Else we can just return the same list every time.
199
- if (this.count > this.__visiblePages) {
199
+ // Allow up to 2 extra pages without ellipsis (e.g., count=6 or count=7 when visiblePages=5)
200
+ if (this.count > this.__visiblePages + 2) {
200
201
  // Calculate left side of current page and right side
201
202
  const pos3 = this.current - 1;
202
203
  const pos4 = this.current;
@@ -164,4 +164,45 @@ describe('Pagination', () => {
164
164
  expect(buttons[3].getAttribute('aria-current')).to.equal('false');
165
165
  });
166
166
  });
167
+
168
+ describe('Ellipsis display', () => {
169
+ it('should not show ellipsis when count is visiblePages + 1 (count=6, visiblePages=5)', async () => {
170
+ const el = await fixture(html` <lion-pagination count="6" current="1"></lion-pagination> `);
171
+ const navItems = Array.from(/** @type {ShadowRoot} */ (el.shadowRoot).querySelectorAll('li'));
172
+ // Check that no ellipsis is rendered (no <span> elements with '...')
173
+ const spans = Array.from(
174
+ /** @type {ShadowRoot} */ (el.shadowRoot).querySelectorAll('li span'),
175
+ );
176
+ expect(spans.length).to.equal(0);
177
+
178
+ // There should be 8 nav items: previous button + 6 page buttons + next button
179
+ expect(navItems.length).to.equal(8);
180
+ });
181
+
182
+ it('should not show ellipsis when count is visiblePages + 2 (count=7, visiblePages=5)', async () => {
183
+ const el = await fixture(html` <lion-pagination count="7" current="1"></lion-pagination> `);
184
+ // Check that no ellipsis is rendered (no <span> elements with '...')
185
+ const spans = Array.from(
186
+ /** @type {ShadowRoot} */ (el.shadowRoot).querySelectorAll('li span'),
187
+ );
188
+ expect(spans.length).to.equal(0);
189
+
190
+ // There should be 9 nav items: previous button + 7 page buttons + next button
191
+ const navItems = Array.from(/** @type {ShadowRoot} */ (el.shadowRoot).querySelectorAll('li'));
192
+ expect(navItems.length).to.equal(9);
193
+ });
194
+
195
+ it('should show ellipsis when count is visiblePages + 3 (count=8, visiblePages=5)', async () => {
196
+ const el = await fixture(html` <lion-pagination count="8" current="1"></lion-pagination> `);
197
+ // Check that ellipsis is rendered (should have <span> elements with '...')
198
+ const spans = Array.from(
199
+ /** @type {ShadowRoot} */ (el.shadowRoot).querySelectorAll('li span'),
200
+ );
201
+ expect(spans.length).to.be.greaterThan(0);
202
+
203
+ // Verify the ellipsis contains '...'
204
+ const ellipsisText = Array.from(spans).map(span => span.textContent);
205
+ expect(ellipsisText).to.include('...');
206
+ });
207
+ });
167
208
  });
@@ -18,7 +18,7 @@ export default {
18
18
  MaxDate: 'Inserire un(a) {fieldName} prima di {params, date, YYYYMMDD}.',
19
19
  MinMaxDate:
20
20
  'Inserire un(a) {fieldName} tra {params.min, date, YYYYMMDD} e {params.max, date, YYYYMMDD}.',
21
- IsDateDisabled: "ТQuesta data non è disponibile, sceglierne un'altra.",
21
+ IsDateDisabled: "Questa data non è disponibile, sceglierne un'altra.",
22
22
  IsEmail: 'Inserire un valore valido per {fieldName} nel formato "name@example.com".',
23
23
  MatchesOption:
24
24
  'Nessun risultato corrispondente. Provare con una parola chiave o una categoria diversa.',
@@ -41,7 +41,7 @@ export default {
41
41
  MaxDate: 'Inserire un(a) {fieldName} prima di {params, date, YYYYMMDD}.',
42
42
  MinMaxDate:
43
43
  'Inserire un(a) {fieldName} tra {params.min, date, YYYYMMDD} e {params.max, date, YYYYMMDD}.',
44
- IsDateDisabled: "ТQuesta data non è disponibile, sceglierne un'altra.",
44
+ IsDateDisabled: "Questa data non è disponibile, sceglierne un'altra.",
45
45
  IsEmail: 'Inserire un valore valido per {fieldName} nel formato "name@example.com".',
46
46
  MatchesOption:
47
47
  'Nessun risultato corrispondente. Provare con una parola chiave o una categoria diversa.',