@ui5/webcomponents 2.20.0 → 2.21.0-rc.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 (157) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/Button.d.ts +6 -0
  4. package/dist/Button.js +11 -2
  5. package/dist/Button.js.map +1 -1
  6. package/dist/Carousel.d.ts +14 -13
  7. package/dist/Carousel.js +93 -177
  8. package/dist/Carousel.js.map +1 -1
  9. package/dist/CarouselTemplate.js +2 -2
  10. package/dist/CarouselTemplate.js.map +1 -1
  11. package/dist/ColorPaletteTemplate.js +1 -1
  12. package/dist/ColorPaletteTemplate.js.map +1 -1
  13. package/dist/DatePicker.js +2 -2
  14. package/dist/DatePicker.js.map +1 -1
  15. package/dist/DayPickerTemplate.js +1 -1
  16. package/dist/DayPickerTemplate.js.map +1 -1
  17. package/dist/Dialog.d.ts +0 -3
  18. package/dist/Dialog.js +3 -1
  19. package/dist/Dialog.js.map +1 -1
  20. package/dist/Icon.d.ts +1 -1
  21. package/dist/Icon.js +12 -4
  22. package/dist/Icon.js.map +1 -1
  23. package/dist/IconTemplate.js +1 -1
  24. package/dist/IconTemplate.js.map +1 -1
  25. package/dist/Input.d.ts +2 -1
  26. package/dist/Input.js +38 -16
  27. package/dist/Input.js.map +1 -1
  28. package/dist/Menu.js +6 -1
  29. package/dist/Menu.js.map +1 -1
  30. package/dist/MenuItem.d.ts +8 -0
  31. package/dist/MenuItem.js +29 -1
  32. package/dist/MenuItem.js.map +1 -1
  33. package/dist/MenuItemTemplate.js +2 -2
  34. package/dist/MenuItemTemplate.js.map +1 -1
  35. package/dist/MultiComboBox.js +5 -0
  36. package/dist/MultiComboBox.js.map +1 -1
  37. package/dist/MultiInput.js +4 -5
  38. package/dist/MultiInput.js.map +1 -1
  39. package/dist/StepInput.d.ts +5 -0
  40. package/dist/StepInput.js +26 -5
  41. package/dist/StepInput.js.map +1 -1
  42. package/dist/Switch.d.ts +8 -4
  43. package/dist/Switch.js +15 -11
  44. package/dist/Switch.js.map +1 -1
  45. package/dist/SwitchTemplate.js +1 -1
  46. package/dist/SwitchTemplate.js.map +1 -1
  47. package/dist/TimePicker.d.ts +55 -3
  48. package/dist/TimePicker.js +160 -26
  49. package/dist/TimePicker.js.map +1 -1
  50. package/dist/TimePickerTemplate.js +1 -1
  51. package/dist/TimePickerTemplate.js.map +1 -1
  52. package/dist/TimeSelectionClocks.js +8 -0
  53. package/dist/TimeSelectionClocks.js.map +1 -1
  54. package/dist/Token.js +2 -2
  55. package/dist/Token.js.map +1 -1
  56. package/dist/Tokenizer.js +2 -1
  57. package/dist/Tokenizer.js.map +1 -1
  58. package/dist/css/themes/Breadcrumbs.css +1 -1
  59. package/dist/css/themes/ColorPaletteItem.css +1 -1
  60. package/dist/css/themes/DatePickerPopover.css +1 -1
  61. package/dist/css/themes/MenuItem.css +1 -1
  62. package/dist/css/themes/PopupsCommon.css +1 -1
  63. package/dist/css/themes/sap_fiori_3/parameters-bundle.css +1 -1
  64. package/dist/css/themes/sap_fiori_3_dark/parameters-bundle.css +1 -1
  65. package/dist/css/themes/sap_fiori_3_hcb/parameters-bundle.css +1 -1
  66. package/dist/css/themes/sap_fiori_3_hcw/parameters-bundle.css +1 -1
  67. package/dist/css/themes/sap_horizon/parameters-bundle.css +1 -1
  68. package/dist/css/themes/sap_horizon_dark/parameters-bundle.css +1 -1
  69. package/dist/css/themes/sap_horizon_hcb/parameters-bundle.css +1 -1
  70. package/dist/css/themes/sap_horizon_hcw/parameters-bundle.css +1 -1
  71. package/dist/custom-elements-internal.json +69 -6
  72. package/dist/custom-elements.json +66 -6
  73. package/dist/features/InputSuggestions.js +2 -1
  74. package/dist/features/InputSuggestions.js.map +1 -1
  75. package/dist/generated/assets/i18n/messagebundle_en_US_saprigi.json +1 -1
  76. package/dist/generated/assets/themes/sap_fiori_3/parameters-bundle.css.json +1 -1
  77. package/dist/generated/assets/themes/sap_fiori_3_dark/parameters-bundle.css.json +1 -1
  78. package/dist/generated/assets/themes/sap_fiori_3_hcb/parameters-bundle.css.json +1 -1
  79. package/dist/generated/assets/themes/sap_fiori_3_hcw/parameters-bundle.css.json +1 -1
  80. package/dist/generated/assets/themes/sap_horizon/parameters-bundle.css.json +1 -1
  81. package/dist/generated/assets/themes/sap_horizon_dark/parameters-bundle.css.json +1 -1
  82. package/dist/generated/assets/themes/sap_horizon_hcb/parameters-bundle.css.json +1 -1
  83. package/dist/generated/assets/themes/sap_horizon_hcw/parameters-bundle.css.json +1 -1
  84. package/dist/generated/i18n/i18n-defaults.d.ts +7 -2
  85. package/dist/generated/i18n/i18n-defaults.js +7 -2
  86. package/dist/generated/i18n/i18n-defaults.js.map +1 -1
  87. package/dist/generated/themes/Breadcrumbs.css.d.ts +1 -1
  88. package/dist/generated/themes/Breadcrumbs.css.js +1 -1
  89. package/dist/generated/themes/Breadcrumbs.css.js.map +1 -1
  90. package/dist/generated/themes/ColorPaletteItem.css.d.ts +1 -1
  91. package/dist/generated/themes/ColorPaletteItem.css.js +1 -1
  92. package/dist/generated/themes/ColorPaletteItem.css.js.map +1 -1
  93. package/dist/generated/themes/DatePickerPopover.css.d.ts +1 -1
  94. package/dist/generated/themes/DatePickerPopover.css.js +1 -1
  95. package/dist/generated/themes/DatePickerPopover.css.js.map +1 -1
  96. package/dist/generated/themes/MenuItem.css.d.ts +1 -1
  97. package/dist/generated/themes/MenuItem.css.js +1 -1
  98. package/dist/generated/themes/MenuItem.css.js.map +1 -1
  99. package/dist/generated/themes/PopupsCommon.css.d.ts +1 -1
  100. package/dist/generated/themes/PopupsCommon.css.js +1 -1
  101. package/dist/generated/themes/PopupsCommon.css.js.map +1 -1
  102. package/dist/generated/themes/sap_fiori_3/parameters-bundle.css.d.ts +1 -1
  103. package/dist/generated/themes/sap_fiori_3/parameters-bundle.css.js +1 -1
  104. package/dist/generated/themes/sap_fiori_3/parameters-bundle.css.js.map +1 -1
  105. package/dist/generated/themes/sap_fiori_3_dark/parameters-bundle.css.d.ts +1 -1
  106. package/dist/generated/themes/sap_fiori_3_dark/parameters-bundle.css.js +1 -1
  107. package/dist/generated/themes/sap_fiori_3_dark/parameters-bundle.css.js.map +1 -1
  108. package/dist/generated/themes/sap_fiori_3_hcb/parameters-bundle.css.d.ts +1 -1
  109. package/dist/generated/themes/sap_fiori_3_hcb/parameters-bundle.css.js +1 -1
  110. package/dist/generated/themes/sap_fiori_3_hcb/parameters-bundle.css.js.map +1 -1
  111. package/dist/generated/themes/sap_fiori_3_hcw/parameters-bundle.css.d.ts +1 -1
  112. package/dist/generated/themes/sap_fiori_3_hcw/parameters-bundle.css.js +1 -1
  113. package/dist/generated/themes/sap_fiori_3_hcw/parameters-bundle.css.js.map +1 -1
  114. package/dist/generated/themes/sap_horizon/parameters-bundle.css.d.ts +1 -1
  115. package/dist/generated/themes/sap_horizon/parameters-bundle.css.js +1 -1
  116. package/dist/generated/themes/sap_horizon/parameters-bundle.css.js.map +1 -1
  117. package/dist/generated/themes/sap_horizon_dark/parameters-bundle.css.d.ts +1 -1
  118. package/dist/generated/themes/sap_horizon_dark/parameters-bundle.css.js +1 -1
  119. package/dist/generated/themes/sap_horizon_dark/parameters-bundle.css.js.map +1 -1
  120. package/dist/generated/themes/sap_horizon_hcb/parameters-bundle.css.d.ts +1 -1
  121. package/dist/generated/themes/sap_horizon_hcb/parameters-bundle.css.js +1 -1
  122. package/dist/generated/themes/sap_horizon_hcb/parameters-bundle.css.js.map +1 -1
  123. package/dist/generated/themes/sap_horizon_hcw/parameters-bundle.css.d.ts +1 -1
  124. package/dist/generated/themes/sap_horizon_hcw/parameters-bundle.css.js +1 -1
  125. package/dist/generated/themes/sap_horizon_hcw/parameters-bundle.css.js.map +1 -1
  126. package/dist/vscode.html-custom-data.json +13 -3
  127. package/dist/web-types.json +28 -8
  128. package/package.json +9 -9
  129. package/src/CarouselTemplate.tsx +3 -3
  130. package/src/ColorPaletteTemplate.tsx +2 -2
  131. package/src/DayPickerTemplate.tsx +1 -1
  132. package/src/IconTemplate.tsx +1 -0
  133. package/src/MenuItemTemplate.tsx +11 -1
  134. package/src/SwitchTemplate.tsx +2 -2
  135. package/src/TimePickerTemplate.tsx +1 -1
  136. package/src/i18n/messagebundle.properties +17 -2
  137. package/src/i18n/messagebundle_en_US_saprigi.properties +2 -0
  138. package/src/themes/Breadcrumbs.css +6 -2
  139. package/src/themes/ColorPaletteItem.css +14 -0
  140. package/src/themes/DatePickerPopover.css +5 -0
  141. package/src/themes/MenuItem.css +5 -0
  142. package/src/themes/PopupsCommon.css +7 -0
  143. package/src/themes/base/Bar-parameters.css +1 -0
  144. package/src/themes/base/Breadcrumbs-parameters.css +4 -0
  145. package/src/themes/sap_fiori_3/parameters-bundle.css +2 -1
  146. package/src/themes/sap_fiori_3_dark/parameters-bundle.css +2 -1
  147. package/src/themes/sap_fiori_3_hcb/parameters-bundle.css +2 -1
  148. package/src/themes/sap_fiori_3_hcw/parameters-bundle.css +2 -1
  149. package/src/themes/sap_horizon/Breadcrumbs-parameters.css +5 -1
  150. package/src/themes/sap_horizon/CalendarHeader-parameters.css +3 -3
  151. package/src/themes/sap_horizon/DayPicker-parameters.css +3 -3
  152. package/src/themes/sap_horizon_dark/Breadcrumbs-parameters.css +5 -1
  153. package/src/themes/sap_horizon_dark/CalendarHeader-parameters.css +2 -2
  154. package/src/themes/sap_horizon_hcb/Breadcrumbs-parameters.css +6 -0
  155. package/src/themes/sap_horizon_hcb/parameters-bundle.css +2 -1
  156. package/src/themes/sap_horizon_hcw/Breadcrumbs-parameters.css +6 -0
  157. package/src/themes/sap_horizon_hcw/parameters-bundle.css +2 -1
package/dist/Carousel.js CHANGED
@@ -186,13 +186,12 @@ let Carousel = Carousel_1 = class Carousel extends UI5Element {
186
186
  */
187
187
  this._visibleItemsCount = 0;
188
188
  /**
189
- * Defines the current slide index, which contains the visible item in the viewport.
189
+ * Defines the current page index, which determines the first visible item.
190
190
  * @private
191
191
  * @since 2.16.0-r.c1
192
192
  */
193
- this._currentSlideIndex = 0;
193
+ this._currentPageIndex = 0;
194
194
  this._pageStep = 10;
195
- this._itemIndicator = 0;
196
195
  this._observableContent = [];
197
196
  this._contentItemsObserver = new MutationObserver(() => {
198
197
  const visibleItemsCount = this._visibleItems.length;
@@ -200,9 +199,9 @@ let Carousel = Carousel_1 = class Carousel extends UI5Element {
200
199
  return;
201
200
  }
202
201
  this._visibleItemsCount = visibleItemsCount;
203
- this._currentSlideIndex = clamp(this._currentSlideIndex, 0, Math.max(0, this.items.length - this.effectiveItemsPerPage));
204
- this._focusedItemIndex = clamp(this._focusedItemIndex, this._currentSlideIndex, this.items.length - 1);
205
- this._moveToItem(this._currentSlideIndex);
202
+ this._currentPageIndex = clamp(this._currentPageIndex, 0, Math.max(0, this.items.length - this.effectiveItemsPerPage));
203
+ this._focusedItemIndex = clamp(this._focusedItemIndex, this._currentPageIndex, this.items.length - 1);
204
+ this._changePageIndex(this._currentPageIndex, { fireEvent: false });
206
205
  });
207
206
  this._scrollEnablement = new ScrollEnablement(this);
208
207
  this._scrollEnablement.attachEvent("touchend", e => {
@@ -211,7 +210,7 @@ let Carousel = Carousel_1 = class Carousel extends UI5Element {
211
210
  this._onResizeBound = this._onResize.bind(this);
212
211
  this._resizing = false; // indicates if the carousel is in process of resizing
213
212
  this._lastFocusedElements = [];
214
- this._orderOfLastFocusedPages = [];
213
+ this._orderOfLastFocusedItems = [];
215
214
  this._visibleItemsIndexes = [];
216
215
  }
217
216
  onBeforeRendering() {
@@ -219,7 +218,7 @@ let Carousel = Carousel_1 = class Carousel extends UI5Element {
219
218
  if (this.arrowsPlacement === CarouselArrowsPlacement.Navigation || !isDesktop()) {
220
219
  this._visibleNavigationArrows = true;
221
220
  }
222
- this.validateSelectedIndex();
221
+ this.validateFocusedIndex();
223
222
  }
224
223
  onAfterRendering() {
225
224
  this._scrollEnablement.scrollContainer = this.getDomRef();
@@ -236,7 +235,7 @@ let Carousel = Carousel_1 = class Carousel extends UI5Element {
236
235
  this._observableContent = [];
237
236
  ResizeHandler.deregister(this, this._onResizeBound);
238
237
  }
239
- validateSelectedIndex() {
238
+ validateFocusedIndex() {
240
239
  if (!this.isIndexInRange(this._focusedItemIndex)) {
241
240
  this._focusedItemIndex = 0;
242
241
  }
@@ -248,13 +247,13 @@ let Carousel = Carousel_1 = class Carousel extends UI5Element {
248
247
  // Change transitively effectiveItemsPerPage by modifying _width
249
248
  this._width = this.offsetWidth;
250
249
  this._itemWidth = Math.floor(this._width / this.effectiveItemsPerPage);
251
- this._updateVisibleItems(this._currentSlideIndex);
250
+ this._updateVisibleItems(this._currentPageIndex);
252
251
  // Items per page did not change or the current,
253
252
  // therefore page index does not need to be re-adjusted
254
253
  if (this.effectiveItemsPerPage === previousItemsPerPage) {
255
254
  return;
256
255
  }
257
- this._focusedItemIndex = clamp(this._focusedItemIndex, this._currentSlideIndex, this.items.length - this.effectiveItemsPerPage);
256
+ this._focusedItemIndex = clamp(this._focusedItemIndex, this._currentPageIndex, this.items.length - this.effectiveItemsPerPage);
258
257
  }
259
258
  _updateScrolling(e) {
260
259
  if (!e) {
@@ -298,25 +297,25 @@ let Carousel = Carousel_1 = class Carousel extends UI5Element {
298
297
  if (target === this.getDomRef()) {
299
298
  return;
300
299
  }
301
- let pageIndex = -1;
300
+ let itemIndex = -1;
302
301
  for (let i = 0; i < this._visibleItems.length; i++) {
303
302
  if (this._visibleItems[i].isEqualNode(target?.querySelector("slot")?.assignedNodes()[0])) {
304
- pageIndex = i;
303
+ itemIndex = i;
305
304
  break;
306
305
  }
307
306
  }
308
- if (pageIndex === -1) {
307
+ if (itemIndex === -1) {
309
308
  return;
310
309
  }
311
- this._focusedItemIndex = pageIndex;
312
- // Save reference of the last focused element for each page
313
- this._lastFocusedElements[pageIndex] = target;
314
- const sortedPageIndex = this._orderOfLastFocusedPages.indexOf(pageIndex);
315
- if (sortedPageIndex === -1) {
316
- this._orderOfLastFocusedPages.unshift(pageIndex);
310
+ this._focusedItemIndex = itemIndex;
311
+ // Save reference of the last focused element for each item
312
+ this._lastFocusedElements[itemIndex] = target;
313
+ const sortedItemIndex = this._orderOfLastFocusedItems.indexOf(itemIndex);
314
+ if (sortedItemIndex === -1) {
315
+ this._orderOfLastFocusedItems.unshift(itemIndex);
317
316
  }
318
317
  else {
319
- this._orderOfLastFocusedPages.splice(0, 0, this._orderOfLastFocusedPages.splice(sortedPageIndex, 1)[0]);
318
+ this._orderOfLastFocusedItems.splice(0, 0, this._orderOfLastFocusedItems.splice(sortedItemIndex, 1)[0]);
320
319
  }
321
320
  }
322
321
  _onmouseout() {
@@ -342,7 +341,7 @@ let Carousel = Carousel_1 = class Carousel extends UI5Element {
342
341
  }
343
342
  }
344
343
  async _handleF7Key(e) {
345
- const lastFocusedElement = this._lastFocusedElements[this._getLastFocusedActivePageIndex];
344
+ const lastFocusedElement = this._lastFocusedElements[this._getLastFocusedItemIndex];
346
345
  if (!this._lastInnerFocusedElement) {
347
346
  const firstFocusable = await getFirstFocusableElement(this.items[this._focusedItemIndex].item);
348
347
  firstFocusable?.focus();
@@ -382,175 +381,86 @@ let Carousel = Carousel_1 = class Carousel extends UI5Element {
382
381
  }
383
382
  async _handleHome(e) {
384
383
  e.preventDefault();
385
- this.navigateTo(0);
384
+ this._changePageIndex(0, { moveFocus: true });
386
385
  await renderFinished();
387
386
  this.focusItem();
388
387
  }
389
388
  async _handleEnd(e) {
390
389
  e.preventDefault();
391
- this.navigateTo(this.items.length - 1);
390
+ this._changePageIndex(this.items.length - 1, { moveFocus: true });
392
391
  await renderFinished();
393
392
  this.focusItem();
394
393
  }
395
394
  async _handlePageUp(e) {
396
395
  e.preventDefault();
397
- this.navigateTo(this._focusedItemIndex + this._pageStep < this.items.length ? this._focusedItemIndex + this._pageStep : this.items.length - 1);
396
+ this._changePageIndex(this._currentPageIndex + this._pageStep, { moveFocus: true });
398
397
  await renderFinished();
399
398
  this.focusItem();
400
399
  }
401
400
  async _handlePageDown(e) {
402
401
  e.preventDefault();
403
- this.navigateTo(this._focusedItemIndex - this._pageStep > 0 ? this._focusedItemIndex - this._pageStep : 0);
402
+ this._changePageIndex(this._currentPageIndex - this._pageStep, { moveFocus: true });
404
403
  await renderFinished();
405
404
  this.focusItem();
406
405
  }
407
406
  get _backgroundDesign() {
408
407
  return this.backgroundDesign.toLowerCase();
409
408
  }
410
- get _getLastFocusedActivePageIndex() {
411
- for (let i = 0; i < this._orderOfLastFocusedPages.length; i++) {
412
- const pageIndex = this._orderOfLastFocusedPages[i];
413
- if (this.isItemInViewport(pageIndex)) {
414
- return pageIndex;
409
+ get _getLastFocusedItemIndex() {
410
+ for (let i = 0; i < this._orderOfLastFocusedItems.length; i++) {
411
+ const itemIndex = this._orderOfLastFocusedItems[i];
412
+ if (this.isItemVisible(itemIndex)) {
413
+ return itemIndex;
415
414
  }
416
415
  }
417
416
  return this._focusedItemIndex;
418
417
  }
419
418
  async navigateLeft() {
420
- this._resizing = false;
421
- const previousSelectedIndex = this._focusedItemIndex;
422
- if (this._focusedItemIndex - 1 < 0) {
423
- if (this.cyclic && this._visibleItemsIndexes.length >= 1) {
424
- if (this._focusedItemIndex === 0 && this.effectiveItemsPerPage > 1) {
425
- this._focusedItemIndex = 0;
426
- }
427
- else {
428
- this._focusedItemIndex = this.items.length - 1;
429
- }
430
- }
431
- }
432
- else {
433
- --this._focusedItemIndex;
434
- }
435
- if (previousSelectedIndex !== this._focusedItemIndex) {
436
- this.skipToItem(this._focusedItemIndex, -1);
437
- await renderFinished();
438
- this.focusItem();
439
- this.fireDecoratorEvent("navigate", { selectedIndex: this._focusedItemIndex });
419
+ let newFocusedItemIndex = this._focusedItemIndex - 1;
420
+ if (this.cyclic && newFocusedItemIndex < 0) {
421
+ newFocusedItemIndex = this.items.length - 1;
440
422
  }
423
+ this._changeFocusIndex(newFocusedItemIndex);
424
+ await renderFinished();
425
+ this.focusItem();
441
426
  }
442
427
  async navigateRight() {
443
- this._resizing = false;
444
- const previousSelectedIndex = this._focusedItemIndex;
445
- if (this._focusedItemIndex + 1 > this.items.length - 1) {
446
- if (this.cyclic) {
447
- if (this._focusedItemIndex === this.items.length - 1 && this.effectiveItemsPerPage > 1) {
448
- this._focusedItemIndex = this.items.length - 1;
449
- }
450
- else {
451
- this._focusedItemIndex = 0;
452
- }
453
- }
454
- else {
455
- return;
456
- }
457
- }
458
- else {
459
- ++this._focusedItemIndex;
460
- }
461
- if (previousSelectedIndex !== this._focusedItemIndex) {
462
- this.skipToItem(this._focusedItemIndex, 1);
463
- await renderFinished();
464
- this.focusItem();
465
- this.fireDecoratorEvent("navigate", { selectedIndex: this._focusedItemIndex });
466
- }
467
- }
468
- navigateArrowRight() {
469
- if (this._focusedItemIndex === this._visibleItemsIndexes[0]) {
470
- this.navigateTo(this._focusedItemIndex + 1);
471
- this.focusItem();
472
- this._moveToItem(this._currentSlideIndex + 1);
473
- }
474
- else {
475
- this._moveToItem(this._currentSlideIndex + 1);
476
- this.navigateTo(this._focusedItemIndex);
477
- this.focusItem();
478
- }
479
- }
480
- navigateArrowLeft() {
481
- if (this._focusedItemIndex > 0 && this._focusedItemIndex === this._visibleItemsIndexes[this._visibleItemsIndexes.length - 1]) {
482
- this.navigateTo(this._focusedItemIndex - 1);
483
- this.focusItem();
484
- this._moveToItem(this._currentSlideIndex - 1);
485
- }
486
- else {
487
- this._moveToItem(this._currentSlideIndex === 0 ? this.pagesCount - 1 : this._currentSlideIndex - 1);
488
- this.navigateTo(this._focusedItemIndex === 0 ? this.items.length - 1 : this._focusedItemIndex);
489
- this.focusItem();
428
+ let newFocusedItemIndex = this._focusedItemIndex + 1;
429
+ if (this.cyclic && newFocusedItemIndex > this.items.length - 1) {
430
+ newFocusedItemIndex = 0;
490
431
  }
432
+ this._changeFocusIndex(newFocusedItemIndex);
433
+ await renderFinished();
434
+ this.focusItem();
491
435
  }
492
- _calculateItemSlideIndex(currentSlideIndex, itemStep) {
493
- if (this.isItemInViewport(this._focusedItemIndex)) {
494
- return 0;
495
- }
496
- const itemsPerPage = this.effectiveItemsPerPage;
497
- let slideIndex;
498
- if (itemsPerPage > 1) {
499
- if (currentSlideIndex === 0 && itemStep < 0) {
500
- return 0;
501
- }
502
- if (currentSlideIndex >= this.pagesCount && itemStep > 0) {
503
- return this.pagesCount - 1;
504
- }
505
- slideIndex = currentSlideIndex + itemStep;
436
+ async navigateArrowRight() {
437
+ let newCurrentPageIndex = this._currentPageIndex + 1;
438
+ if (this.cyclic && newCurrentPageIndex > this.items.length - this.effectiveItemsPerPage) {
439
+ newCurrentPageIndex = 0;
506
440
  }
507
- else {
508
- slideIndex = itemStep > 0 ? currentSlideIndex + 1 : currentSlideIndex - 1;
509
- if (this.cyclic) {
510
- if (currentSlideIndex === 0 && itemStep < 0) {
511
- return this.pagesCount - 1;
512
- }
513
- if (currentSlideIndex === this.items.length - 1 && itemStep > 0) {
514
- return 0;
515
- }
516
- }
517
- }
518
- return slideIndex;
441
+ this._changePageIndex(newCurrentPageIndex);
442
+ await renderFinished();
443
+ this.focusItem();
519
444
  }
520
- _moveToItem(slideIndex) {
521
- if (this.items.length === 0) {
522
- return;
445
+ async navigateArrowLeft() {
446
+ let newCurrentPageIndex = this._currentPageIndex - 1;
447
+ if (this.cyclic && newCurrentPageIndex < 0) {
448
+ newCurrentPageIndex = this.items.length - 1;
523
449
  }
524
- const itemsInViewportToShow = this.effectiveItemsPerPage, itemsCount = this.items.length, cyclic = this.cyclic;
525
- if (cyclic && itemsInViewportToShow !== 1 && (slideIndex < 0 || slideIndex > itemsCount - 1)) {
526
- return;
527
- }
528
- if (slideIndex + itemsInViewportToShow > itemsCount - 1) {
529
- slideIndex = itemsCount - itemsInViewportToShow;
530
- }
531
- this._updateVisibleItems(slideIndex);
532
- this._currentSlideIndex = slideIndex;
450
+ this._changePageIndex(newCurrentPageIndex);
451
+ await renderFinished();
452
+ this.focusItem();
533
453
  }
534
454
  focusItem() {
535
455
  this.carouselItemDomRef(this._focusedItemIndex)[0].focus({ preventScroll: true });
536
456
  }
537
457
  _navButtonClick(e) {
538
458
  const target = e.target;
539
- if (this._visibleItemsIndexes.length > 1) {
540
- if (target.hasAttribute("data-ui5-arrow-forward")) {
541
- this.navigateArrowRight();
542
- }
543
- else {
544
- this.navigateArrowLeft();
545
- }
459
+ if (target.hasAttribute("data-ui5-arrow-forward")) {
460
+ this.navigateArrowRight();
546
461
  }
547
- else if (this._visibleItemsIndexes.length <= 1) {
548
- if (target.hasAttribute("data-ui5-arrow-forward")) {
549
- this.navigateRight();
550
- }
551
- else {
552
- this.navigateLeft();
553
- }
462
+ else {
463
+ this.navigateArrowLeft();
554
464
  }
555
465
  }
556
466
  /**
@@ -560,29 +470,38 @@ let Carousel = Carousel_1 = class Carousel extends UI5Element {
560
470
  * @public
561
471
  */
562
472
  navigateTo(itemIndex) {
563
- if (!this.isIndexInRange(itemIndex)) {
473
+ this._changePageIndex(itemIndex, { fireEvent: false });
474
+ }
475
+ _changePageIndex(itemIndex, options = {}) {
476
+ const { fireEvent = true, moveFocus = false } = options;
477
+ const newPageIndex = clamp(itemIndex, 0, this.items.length - this.effectiveItemsPerPage);
478
+ if (moveFocus || (this._focusedItemIndex < newPageIndex || this._focusedItemIndex > newPageIndex + this.effectiveItemsPerPage - 1)) {
479
+ this._focusedItemIndex = clamp(itemIndex, 0, this.items.length - 1);
480
+ }
481
+ if (this._currentPageIndex === newPageIndex) {
564
482
  return;
565
483
  }
566
- if (this._focusedItemIndex < itemIndex) {
567
- this._itemIndicator = 1;
484
+ this._currentPageIndex = newPageIndex;
485
+ this._updateVisibleItems(newPageIndex);
486
+ if (fireEvent) {
487
+ this.fireDecoratorEvent("navigate", { selectedIndex: newPageIndex });
568
488
  }
569
- this._focusedItemIndex = itemIndex;
570
- this._currentSlideIndex = itemIndex - this._itemIndicator;
571
- if (this.isItemInViewport(itemIndex)) {
572
- this._currentSlideIndex = this._visibleItemsIndexes[0];
489
+ }
490
+ _changeFocusIndex(itemIndex) {
491
+ itemIndex = clamp(itemIndex, 0, this.items.length - 1);
492
+ let newPageIndex = this._currentPageIndex;
493
+ if (itemIndex < this._currentPageIndex) {
494
+ newPageIndex = itemIndex;
573
495
  }
574
- else {
575
- this.skipToItem(this._focusedItemIndex, 1);
496
+ else if (itemIndex > this._currentPageIndex + this.effectiveItemsPerPage - 1) {
497
+ newPageIndex = itemIndex - this.effectiveItemsPerPage + 1;
576
498
  }
577
- }
578
- skipToItem(focusIndex, offset) {
579
- if (!this.isItemInViewport(focusIndex)) {
580
- let slideIndex = this._calculateItemSlideIndex(this._currentSlideIndex, offset);
581
- if (focusIndex === 0) {
582
- slideIndex = 0;
583
- }
584
- this._moveToItem(slideIndex);
499
+ if (this._currentPageIndex !== newPageIndex) {
500
+ this._currentPageIndex = newPageIndex;
501
+ this._updateVisibleItems(newPageIndex);
502
+ this.fireDecoratorEvent("navigate", { selectedIndex: newPageIndex });
585
503
  }
504
+ this._focusedItemIndex = itemIndex;
586
505
  }
587
506
  /**
588
507
  * The indices of the currently visible items of the component.
@@ -602,10 +521,10 @@ let Carousel = Carousel_1 = class Carousel extends UI5Element {
602
521
  return {
603
522
  id: `${this._id}-carousel-item-${idx + 1}`,
604
523
  item,
605
- tabIndex: this.isItemInViewport(this._focusedItemIndex) ? 0 : -1,
524
+ tabIndex: this.isItemVisible(this._focusedItemIndex) ? 0 : -1,
606
525
  posinset: idx + 1,
607
526
  setsize: this._visibleItems.length,
608
- visible: this.isItemInViewport(idx),
527
+ visible: this.isItemVisible(idx),
609
528
  };
610
529
  });
611
530
  }
@@ -640,7 +559,7 @@ let Carousel = Carousel_1 = class Carousel extends UI5Element {
640
559
  }
641
560
  return itemsPerPageSizeXL;
642
561
  }
643
- isItemInViewport(index) {
562
+ isItemVisible(index) {
644
563
  return this._visibleItemsIndexes.includes(index);
645
564
  }
646
565
  _updateVisibleItems(index) {
@@ -715,7 +634,7 @@ let Carousel = Carousel_1 = class Carousel extends UI5Element {
715
634
  const pages = this.pagesCount;
716
635
  for (let index = 0; index < pages; index++) {
717
636
  dots.push({
718
- active: index === this._currentSlideIndex,
637
+ active: index === this._currentPageIndex,
719
638
  ariaLabel: Carousel_1.i18nBundle.getText(CAROUSEL_DOT_TEXT, index + 1, pages),
720
639
  });
721
640
  }
@@ -729,10 +648,10 @@ let Carousel = Carousel_1 = class Carousel extends UI5Element {
729
648
  };
730
649
  }
731
650
  get hasPrev() {
732
- return this.cyclic || (this._focusedItemIndex - 1 >= 0 && this._currentSlideIndex !== 0);
651
+ return this.cyclic || (this._focusedItemIndex - 1 >= 0 && this._currentPageIndex !== 0);
733
652
  }
734
653
  get hasNext() {
735
- return this.cyclic || (this._focusedItemIndex + 1 <= this._visibleItems.length - 1 && this._currentSlideIndex < this.pagesCount - 1);
654
+ return this.cyclic || (this._focusedItemIndex + 1 <= this._visibleItems.length - 1 && this._currentPageIndex < this.pagesCount - 1);
736
655
  }
737
656
  get suppressAnimation() {
738
657
  return this._resizing || getAnimationMode() === AnimationMode.None;
@@ -740,9 +659,6 @@ let Carousel = Carousel_1 = class Carousel extends UI5Element {
740
659
  get _isRTL() {
741
660
  return this.effectiveDir === "rtl";
742
661
  }
743
- get selectedIndexToShow() {
744
- return this._isRTL ? this.items.length - (this.items.length - this._focusedItemIndex) + 1 : this._focusedItemIndex + 1;
745
- }
746
662
  get ofText() {
747
663
  return Carousel_1.i18nBundle.getText(CAROUSEL_OF_TEXT);
748
664
  }
@@ -827,7 +743,7 @@ __decorate([
827
743
  ], Carousel.prototype, "_visibleItemsCount", void 0);
828
744
  __decorate([
829
745
  property({ type: Number, noAttribute: true })
830
- ], Carousel.prototype, "_currentSlideIndex", void 0);
746
+ ], Carousel.prototype, "_currentPageIndex", void 0);
831
747
  __decorate([
832
748
  slot({ "default": true, type: HTMLElement, individualSlots: true })
833
749
  ], Carousel.prototype, "content", void 0);