@progress/kendo-angular-layout 17.3.0-develop.1 → 18.0.0-develop.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.
package/esm2022/index.mjs CHANGED
@@ -11,6 +11,7 @@ export { PanelBarExpandMode } from './panelbar/panelbar-expand-mode';
11
11
  export * from './panelbar/events';
12
12
  export { SplitterComponent } from './splitter/splitter.component';
13
13
  export { SplitterPaneComponent } from './splitter/splitter-pane.component';
14
+ // TabStrip exports
14
15
  export { TabStripComponent } from './tabstrip/tabstrip.component';
15
16
  export { TabStripTabComponent } from './tabstrip/models/tabstrip-tab.component';
16
17
  export { TabContentDirective } from './tabstrip/directives/tab-content.directive';
@@ -9,7 +9,7 @@ export const packageMetadata = {
9
9
  name: '@progress/kendo-angular-layout',
10
10
  productName: 'Kendo UI for Angular',
11
11
  productCodes: ['KENDOUIANGULAR', 'KENDOUICOMPLETE'],
12
- publishDate: 1736179215,
13
- version: '17.3.0-develop.1',
12
+ publishDate: 1736249770,
13
+ version: '18.0.0-develop.1',
14
14
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/?utm_medium=product&utm_source=kendoangular&utm_campaign=kendo-ui-angular-purchase-license-keys-warning'
15
15
  };
@@ -6,12 +6,13 @@ import { BUTTON_SCROLL_SPEED, MOUSE_SCROLL_SPEED } from "../constants";
6
6
  /**
7
7
  * @hidden
8
8
  */
9
- const normalizeSettings = ({ enabled = true, scrollButtons = 'auto', mouseScroll = true, buttonScrollSpeed = BUTTON_SCROLL_SPEED, mouseScrollSpeed = MOUSE_SCROLL_SPEED, prevButtonIcon, nextButtonIcon, prevSVGButtonIcon, nextSVGButtonIcon }) => ({
9
+ const normalizeSettings = ({ enabled = true, scrollButtons = 'auto', mouseScroll = true, buttonScrollSpeed = BUTTON_SCROLL_SPEED, mouseScrollSpeed = MOUSE_SCROLL_SPEED, scrollButtonsPosition = 'split', prevButtonIcon, nextButtonIcon, prevSVGButtonIcon, nextSVGButtonIcon }) => ({
10
10
  enabled,
11
11
  scrollButtons,
12
12
  mouseScroll,
13
13
  buttonScrollSpeed,
14
14
  mouseScrollSpeed,
15
+ scrollButtonsPosition,
15
16
  prevButtonIcon,
16
17
  nextButtonIcon,
17
18
  prevSVGButtonIcon,
@@ -0,0 +1,5 @@
1
+ /**-----------------------------------------------------------------------------------------
2
+ * Copyright © 2025 Progress Software Corporation. All rights reserved.
3
+ * Licensed under commercial license. See LICENSE.md in the project root for more information
4
+ *-------------------------------------------------------------------------------------------*/
5
+ export {};
@@ -81,7 +81,7 @@ export class TabComponent {
81
81
  this.tabClose.emit(closeArgs);
82
82
  }
83
83
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TabComponent, deps: [{ token: i1.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
84
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TabComponent, isStandalone: true, selector: "[kendoTabStripTab]", inputs: { tab: "tab", index: "index", tabStripClosable: "tabStripClosable", tabStripCloseIcon: "tabStripCloseIcon", customTabstripCloseIcon: "customTabstripCloseIcon", closeSVGIcon: "closeSVGIcon" }, outputs: { tabClose: "tabClose" }, host: { properties: { "class.k-item": "this.hostClasses", "attr.aria-selected": "this.activeClass", "class.k-active": "this.activeClass", "attr.aria-disabled": "this.disabledClass", "class.k-disabled": "this.disabledClass", "class.k-focus": "this.focusedClass", "attr.tabindex": "this.tabIndex" } }, ngImport: i0, template: `
84
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TabComponent, isStandalone: true, selector: "[kendoTabStripTab]", inputs: { tab: "tab", index: "index", tabStripClosable: "tabStripClosable", tabStripCloseIcon: "tabStripCloseIcon", customTabstripCloseIcon: "customTabstripCloseIcon", closeSVGIcon: "closeSVGIcon" }, outputs: { tabClose: "tabClose" }, host: { properties: { "class.k-item": "this.hostClasses", "class.k-tabstrip-item": "this.hostClasses", "attr.aria-selected": "this.activeClass", "class.k-active": "this.activeClass", "attr.aria-disabled": "this.disabledClass", "class.k-disabled": "this.disabledClass", "class.k-focus": "this.focusedClass", "attr.tabindex": "this.tabIndex" } }, ngImport: i0, template: `
85
85
  <ng-container *ngIf="!tab.tabTemplate; else tabTemplate">
86
86
  <span class="k-link" *ngIf="!tab.tabTitle">
87
87
  <span class="k-link-text">{{ tab.title }}</span>
@@ -165,6 +165,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
165
165
  }], hostClasses: [{
166
166
  type: HostBinding,
167
167
  args: ['class.k-item']
168
+ }, {
169
+ type: HostBinding,
170
+ args: ['class.k-tabstrip-item']
168
171
  }], activeClass: [{
169
172
  type: HostBinding,
170
173
  args: ['attr.aria-selected']
@@ -37,16 +37,6 @@ export class ScrollService {
37
37
  get tabsOverflow() {
38
38
  return this.tablistOverflowSize > 0;
39
39
  }
40
- get scrollButtonsSize() {
41
- if (!this.owner.hasScrollButtons) {
42
- return 0;
43
- }
44
- const prevRect = this.owner.prevScrollButton.hostBoundingClientRect;
45
- const prevSize = isTablistHorizontal(this.owner.tabPosition) ? prevRect.width : prevRect.height;
46
- const nextRect = this.owner.nextScrollButton.hostBoundingClientRect;
47
- const nextSize = isTablistHorizontal(this.owner.tabPosition) ? nextRect.width : nextRect.height;
48
- return prevSize + nextSize;
49
- }
50
40
  constructor(ngZone) {
51
41
  this.ngZone = ngZone;
52
42
  }
@@ -58,7 +48,7 @@ export class ScrollService {
58
48
  const currentPrevButtonActive = !this.isDisabled('prev');
59
49
  const currentNextButtonActive = !this.isDisabled('next');
60
50
  const calculatedPrevButtonActive = this.position > 0 && this.tablistOverflowSize > 0;
61
- const calculatedNextButtonActive = this.position < this.tablistOverflowSize + this.scrollButtonsSize && this.tablistOverflowSize > 0;
51
+ const calculatedNextButtonActive = this.position < this.tablistOverflowSize && this.tablistOverflowSize > 0;
62
52
  if (calculatedPrevButtonActive !== currentPrevButtonActive) {
63
53
  this.ngZone.run(() => this.toggleButtonActiveState('prev', calculatedPrevButtonActive));
64
54
  }
@@ -137,6 +127,10 @@ export class ScrollService {
137
127
  }
138
128
  this.toggleScrollButtonsState();
139
129
  }
130
+ onScroll(e) {
131
+ this.position = isTablistHorizontal(this.owner.tabPosition) ? e.target.scrollLeft : e.target.scrollTop;
132
+ this.toggleScrollButtonsState();
133
+ }
140
134
  scrollTabs(direction) {
141
135
  this.calculateListPosition(direction, this.owner.scrollable.buttonScrollSpeed);
142
136
  if (isTablistHorizontal(this.owner.tabPosition) && this.tablistElement) {
@@ -148,13 +142,12 @@ export class ScrollService {
148
142
  this.toggleScrollButtonsState();
149
143
  }
150
144
  calculateListPosition(direction, scrollSpeed) {
151
- const adjustedMaxScroll = this.tablistOverflowSize + this.scrollButtonsSize;
152
145
  if (direction === 'prev' && this.position > 0) {
153
146
  this.position = this.position - scrollSpeed <= 0 ? 0 : this.position - scrollSpeed;
154
147
  }
155
- else if (direction === 'next' && this.position < adjustedMaxScroll) {
156
- if (this.position + scrollSpeed > adjustedMaxScroll) {
157
- this.position = adjustedMaxScroll;
148
+ else if (direction === 'next' && this.position < this.tablistOverflowSize) {
149
+ if (this.position + scrollSpeed > this.tablistOverflowSize) {
150
+ this.position = this.tablistOverflowSize;
158
151
  return;
159
152
  }
160
153
  this.position += scrollSpeed;
@@ -172,7 +165,7 @@ export class ScrollService {
172
165
  toggleButtonActiveState(buttonType, active) {
173
166
  this.scrollButtonActiveStateChange.next({ buttonType, active });
174
167
  }
175
- isDisabled = (buttonType) => this.owner[`${buttonType}ScrollButton`].host.nativeElement.classList.contains('k-disabled');
168
+ isDisabled = (buttonType) => this.owner[`${buttonType}ScrollButton`]?.host.nativeElement.classList.contains('k-disabled');
176
169
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ScrollService, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
177
170
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ScrollService });
178
171
  }
@@ -90,12 +90,52 @@ export class TabStripComponent {
90
90
  this._scrollableSettings = normalizeScrollableSettings(value);
91
91
  if (this.tablist) {
92
92
  this.toggleScrollButtons(this.scrollService.tabsOverflow);
93
- this.attachWheelHandler(this.tablist.nativeElement);
93
+ if (this.isScrollable && this.mouseScrollEnabled) {
94
+ this.attachWheelHandler(this.tablist.nativeElement);
95
+ }
94
96
  }
95
97
  }
96
98
  get scrollable() {
97
99
  return this._scrollableSettings;
98
100
  }
101
+ /**
102
+ * Specifies the size of the TabStrip.
103
+ * ([see example](slug:api_layout_tabstripcomponent#toc-size).
104
+ *
105
+ * The possible values are:
106
+ * * `small`
107
+ * * `medium` (Default)
108
+ * * `large`
109
+ * * `none`
110
+ */
111
+ set size(value) {
112
+ switch (value) {
113
+ case 'small':
114
+ this.renderer.removeClass(this.wrapper.nativeElement, 'k-tabstrip-md');
115
+ this.renderer.removeClass(this.wrapper.nativeElement, 'k-tabstrip-lg');
116
+ this.renderer.addClass(this.wrapper.nativeElement, 'k-tabstrip-sm');
117
+ break;
118
+ case 'medium':
119
+ this.renderer.removeClass(this.wrapper.nativeElement, 'k-tabstrip-sm');
120
+ this.renderer.removeClass(this.wrapper.nativeElement, 'k-tabstrip-lg');
121
+ this.renderer.addClass(this.wrapper.nativeElement, 'k-tabstrip-md');
122
+ break;
123
+ case 'large':
124
+ this.renderer.removeClass(this.wrapper.nativeElement, 'k-tabstrip-md');
125
+ this.renderer.removeClass(this.wrapper.nativeElement, 'k-tabstrip-sm');
126
+ this.renderer.addClass(this.wrapper.nativeElement, 'k-tabstrip-lg');
127
+ break;
128
+ case 'none':
129
+ this.renderer.removeClass(this.wrapper.nativeElement, 'k-tabstrip-md');
130
+ this.renderer.removeClass(this.wrapper.nativeElement, 'k-tabstrip-lg');
131
+ this.renderer.removeClass(this.wrapper.nativeElement, 'k-tabstrip-sm');
132
+ }
133
+ this._size = value;
134
+ this.ngZone.onStable.pipe(take(1)).subscribe(() => this.onResize());
135
+ }
136
+ get size() {
137
+ return this._size;
138
+ }
99
139
  /**
100
140
  * Defines the name for an existing font icon in the Kendo UI theme for the close icon.
101
141
  */
@@ -157,6 +197,11 @@ export class TabStripComponent {
157
197
  get tabStripScrollable() {
158
198
  return this._scrollableSettings.enabled;
159
199
  }
200
+ // To be released with a breaking change in Q2 2025
201
+ // @HostBinding('class.k-tabstrip-scrollable-overlay')
202
+ // public get tabStripScrollableOverlay(): boolean {
203
+ // return this._scrollableSettings.enabled && !this.hasScrollButtons.visible;
204
+ // }
160
205
  /**
161
206
  * A query list of all declared tabs.
162
207
  */
@@ -193,6 +238,7 @@ export class TabStripComponent {
193
238
  tabStripId = guid();
194
239
  tabsChangesSub;
195
240
  activeStateChangeSub;
241
+ _size = 'medium';
196
242
  constructor(localization, renderer, wrapper, tabstripService, scrollService, ngZone) {
197
243
  this.localization = localization;
198
244
  this.renderer = renderer;
@@ -205,7 +251,7 @@ export class TabStripComponent {
205
251
  this.tabstripService.owner = this;
206
252
  this.scrollService.owner = this;
207
253
  this.subscriptions.add(this.scrollService.scrollButtonActiveStateChange.subscribe((activeButtonSettings) => {
208
- if (this.hasScrollButtons) {
254
+ if (this.hasScrollButtons.visible) {
209
255
  const action = activeButtonSettings.active ? 'remove' : 'add';
210
256
  this.renderer[`${action}Class`](this[`${activeButtonSettings.buttonType}ScrollButton`].host.nativeElement, 'k-disabled');
211
257
  }
@@ -233,6 +279,8 @@ export class TabStripComponent {
233
279
  this.scrollService.toggleScrollButtonsState();
234
280
  });
235
281
  });
282
+ // To be released in Q2 2025
283
+ // this.isScrollable && !this.hasScrollButtons.visible && this.setScrollableOverlayClasses();
236
284
  }
237
285
  ngOnChanges(changes) {
238
286
  if (!isDocumentAvailable()) {
@@ -248,7 +296,7 @@ export class TabStripComponent {
248
296
  this.subscriptions = new Subscription();
249
297
  this.subscriptionsArePresent = false;
250
298
  this.activeStateChangeSub = this.scrollService.scrollButtonActiveStateChange.subscribe((activeButtonSettings) => {
251
- if (this.hasScrollButtons) {
299
+ if (this.hasScrollButtons.visible) {
252
300
  const action = activeButtonSettings.active ? 'remove' : 'add';
253
301
  this.renderer[`${action}Class`](this[`${activeButtonSettings.buttonType}ScrollButton`].host.nativeElement, 'k-disabled');
254
302
  }
@@ -379,6 +427,10 @@ export class TabStripComponent {
379
427
  if (this.isScrollable && this.mouseScrollEnabled) {
380
428
  this.attachWheelHandler(tablist);
381
429
  }
430
+ // To be released in Q2 2025
431
+ // if (this.isScrollable && !this.mouseScrollEnabled) {
432
+ // this.attachTablistScrollHandler(tablist);
433
+ // }
382
434
  this.subscriptionsArePresent = true;
383
435
  }
384
436
  toggleScrollButtons(tabsOverflow) {
@@ -398,7 +450,7 @@ export class TabStripComponent {
398
450
  this.prevScrollButton.toggle(true);
399
451
  this.nextScrollButton.toggle(true);
400
452
  }
401
- if (scrollButtonsArePresent && alwaysVisible) {
453
+ if (scrollButtonsArePresent) {
402
454
  this.ngZone.runOutsideAngular(() => {
403
455
  this.scrollService.toggleScrollButtonsState();
404
456
  });
@@ -420,8 +472,47 @@ export class TabStripComponent {
420
472
  }));
421
473
  });
422
474
  }
475
+ /* tslint:disable:no-unused-variable */
476
+ attachTablistScrollHandler(tablist) {
477
+ this.ngZone.runOutsideAngular(() => {
478
+ this.subscriptions.add(this.renderer.listen(tablist, 'scroll', (e) => {
479
+ const scrollEvent = new TabScrollEvent({
480
+ originalEvent: e
481
+ });
482
+ this.tabScroll.emit(scrollEvent);
483
+ const isTabStripScrollEventPrevented = scrollEvent.isDefaultPrevented();
484
+ if (isTabStripScrollEventPrevented || !this.scrollService.tabsOverflow) {
485
+ return;
486
+ }
487
+ if (!this.hasScrollButtons.visible) {
488
+ this.setScrollableOverlayClasses();
489
+ }
490
+ this.scrollService.onScroll(e);
491
+ }));
492
+ });
493
+ }
494
+ setScrollableOverlayClasses() {
495
+ const wrapper = this.wrapper.nativeElement;
496
+ const container = this.tablist?.nativeElement;
497
+ if (!container) {
498
+ return;
499
+ }
500
+ const scrollOffset = isTablistHorizontal(this.tabPosition) ? container.scrollLeft : container.scrollTop;
501
+ if (scrollOffset === 0) {
502
+ this.renderer.removeClass(wrapper, 'k-tabstrip-scrollable-end');
503
+ this.renderer.addClass(wrapper, 'k-tabstrip-scrollable-start');
504
+ }
505
+ else if (scrollOffset > 0 && scrollOffset < this.scrollService.tablistOverflowSize) {
506
+ this.renderer.removeClass(wrapper, 'k-tabstrip-scrollable-end');
507
+ this.renderer.removeClass(wrapper, 'k-tabstrip-scrollable-start');
508
+ }
509
+ else {
510
+ this.renderer.removeClass(wrapper, 'k-tabstrip-scrollable-start');
511
+ this.renderer.addClass(wrapper, 'k-tabstrip-scrollable-end');
512
+ }
513
+ }
423
514
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TabStripComponent, deps: [{ token: i1.LocalizationService }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i2.TabStripService }, { token: i3.ScrollService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
424
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TabStripComponent, isStandalone: true, selector: "kendo-tabstrip", inputs: { height: "height", animate: "animate", tabAlignment: "tabAlignment", tabPosition: "tabPosition", keepTabContent: "keepTabContent", closable: "closable", scrollable: "scrollable", closeIcon: "closeIcon", closeIconClass: "closeIconClass", closeSVGIcon: "closeSVGIcon", showContentArea: "showContentArea" }, outputs: { tabSelect: "tabSelect", tabClose: "tabClose", tabScroll: "tabScroll" }, host: { properties: { "class.k-tabstrip": "this.hostClasses", "class.k-header": "this.hostClasses", "class.k-tabstrip-top": "this.tabsAtTop", "class.k-tabstrip-right": "this.tabsAtRight", "class.k-tabstrip-bottom": "this.tabsAtBottom", "class.k-tabstrip-left": "this.tabsAtLeft", "attr.dir": "this.dir", "class.k-tabstrip-scrollable": "this.tabStripScrollable" } }, providers: [
515
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TabStripComponent, isStandalone: true, selector: "kendo-tabstrip", inputs: { height: "height", animate: "animate", tabAlignment: "tabAlignment", tabPosition: "tabPosition", keepTabContent: "keepTabContent", closable: "closable", scrollable: "scrollable", size: "size", closeIcon: "closeIcon", closeIconClass: "closeIconClass", closeSVGIcon: "closeSVGIcon", showContentArea: "showContentArea" }, outputs: { tabSelect: "tabSelect", tabClose: "tabClose", tabScroll: "tabScroll" }, host: { properties: { "class.k-tabstrip": "this.hostClasses", "class.k-tabstrip-md": "this.hostClasses", "class.k-tabstrip-top": "this.tabsAtTop", "class.k-tabstrip-right": "this.tabsAtRight", "class.k-tabstrip-bottom": "this.tabsAtBottom", "class.k-tabstrip-left": "this.tabsAtLeft", "attr.dir": "this.dir", "class.k-tabstrip-scrollable": "this.tabStripScrollable" } }, providers: [
425
516
  TabStripService,
426
517
  ScrollService,
427
518
  LocalizationService,
@@ -455,10 +546,10 @@ export class TabStripComponent {
455
546
  <ng-container *ngTemplateOutlet="heading"></ng-container>
456
547
  </ng-container>
457
548
  <ng-template #heading>
458
- <div class="k-tabstrip-items-wrapper" [ngClass]="itemsWrapperClass">
549
+ <div class="k-tabstrip-items-wrapper" [class.k-tabstrip-items-wrapper-scroll]="tabStripScrollable" [ngClass]="itemsWrapperClass">
459
550
  <span
460
551
  role="button"
461
- *ngIf="hasScrollButtons"
552
+ *ngIf="hasScrollButtons.visible && hasScrollButtons.position !== 'end'"
462
553
  #prevScrollButton
463
554
  kendoTabStripScrollableButton
464
555
  [scrollable]="scrollable"
@@ -466,9 +557,30 @@ export class TabStripComponent {
466
557
  [prev]="true"
467
558
  [title]="localization.get('previousTabButton')"
468
559
  (tabScroll)="tabScroll.emit($event)"
469
- class="k-icon-button k-button k-button-md k-button-flat k-button-flat-base"
470
- (onClick)="onScrollButtonClick($event)">
471
- </span>
560
+ class="k-icon-button k-button k-button-flat k-button-flat-base"
561
+ [ngClass]="{
562
+ 'k-button-sm': size === 'small',
563
+ 'k-button-md': size === 'medium' || !size,
564
+ 'k-button-lg': size === 'large'
565
+ }"
566
+ (onClick)="onScrollButtonClick($event)"></span>
567
+ <span
568
+ role="button"
569
+ *ngIf="hasScrollButtons.visible && hasScrollButtons.position === 'start'"
570
+ #nextScrollButton
571
+ kendoTabStripScrollableButton
572
+ [scrollable]="scrollable"
573
+ [tabPosition]="tabPosition"
574
+ [prev]="false"
575
+ [title]="localization.get('nextTabButton')"
576
+ (tabScroll)="tabScroll.emit($event)"
577
+ class="k-icon-button k-button k-button-flat k-button-flat-base"
578
+ [ngClass]="{
579
+ 'k-button-sm': size === 'small',
580
+ 'k-button-md': size === 'medium' || !size,
581
+ 'k-button-lg': size === 'large'
582
+ }"
583
+ (onClick)="onScrollButtonClick($event)"></span>
472
584
  <ul role="tablist" #tablist
473
585
  class="k-reset k-tabstrip-items"
474
586
  [ngClass]="{
@@ -476,7 +588,8 @@ export class TabStripComponent {
476
588
  'k-tabstrip-items-center': tabAlignment === 'center',
477
589
  'k-tabstrip-items-end': tabAlignment === 'end',
478
590
  'k-tabstrip-items-stretched': tabAlignment === 'stretched',
479
- 'k-tabstrip-items-justify': tabAlignment === 'justify'
591
+ 'k-tabstrip-items-justify': tabAlignment === 'justify',
592
+ 'k-tabstrip-items-scroll': false
480
593
  }"
481
594
  [attr.aria-orientation]="tabPosition === 'left' || tabPosition === 'right' ? 'vertical' : 'horizontal'"
482
595
  >
@@ -503,7 +616,24 @@ export class TabStripComponent {
503
616
  </ul>
504
617
  <span
505
618
  role="button"
506
- *ngIf="hasScrollButtons"
619
+ *ngIf="hasScrollButtons.visible && hasScrollButtons.position === 'end'"
620
+ #prevScrollButton
621
+ kendoTabStripScrollableButton
622
+ [scrollable]="scrollable"
623
+ [tabPosition]="tabPosition"
624
+ [prev]="true"
625
+ [title]="localization.get('previousTabButton')"
626
+ (tabScroll)="tabScroll.emit($event)"
627
+ class="k-icon-button k-button k-button-flat k-button-flat-base"
628
+ [ngClass]="{
629
+ 'k-button-sm': size === 'small',
630
+ 'k-button-md': size === 'medium' || !size,
631
+ 'k-button-lg': size === 'large'
632
+ }"
633
+ (onClick)="onScrollButtonClick($event)"></span>
634
+ <span
635
+ role="button"
636
+ *ngIf="hasScrollButtons.visible && hasScrollButtons.position !== 'start'"
507
637
  #nextScrollButton
508
638
  kendoTabStripScrollableButton
509
639
  [scrollable]="scrollable"
@@ -511,7 +641,12 @@ export class TabStripComponent {
511
641
  [prev]="false"
512
642
  [title]="localization.get('nextTabButton')"
513
643
  (tabScroll)="tabScroll.emit($event)"
514
- class="k-icon-button k-button k-button-md k-button-flat k-button-flat-base"
644
+ class="k-icon-button k-button k-button-flat k-button-flat-base"
645
+ [ngClass]="{
646
+ 'k-button-sm': size === 'small',
647
+ 'k-button-md': size === 'medium' || !size,
648
+ 'k-button-lg': size === 'large'
649
+ }"
515
650
  (onClick)="onScrollButtonClick($event)"></span>
516
651
  </div>
517
652
  </ng-template>
@@ -594,10 +729,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
594
729
  <ng-container *ngTemplateOutlet="heading"></ng-container>
595
730
  </ng-container>
596
731
  <ng-template #heading>
597
- <div class="k-tabstrip-items-wrapper" [ngClass]="itemsWrapperClass">
732
+ <div class="k-tabstrip-items-wrapper" [class.k-tabstrip-items-wrapper-scroll]="tabStripScrollable" [ngClass]="itemsWrapperClass">
598
733
  <span
599
734
  role="button"
600
- *ngIf="hasScrollButtons"
735
+ *ngIf="hasScrollButtons.visible && hasScrollButtons.position !== 'end'"
601
736
  #prevScrollButton
602
737
  kendoTabStripScrollableButton
603
738
  [scrollable]="scrollable"
@@ -605,9 +740,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
605
740
  [prev]="true"
606
741
  [title]="localization.get('previousTabButton')"
607
742
  (tabScroll)="tabScroll.emit($event)"
608
- class="k-icon-button k-button k-button-md k-button-flat k-button-flat-base"
609
- (onClick)="onScrollButtonClick($event)">
610
- </span>
743
+ class="k-icon-button k-button k-button-flat k-button-flat-base"
744
+ [ngClass]="{
745
+ 'k-button-sm': size === 'small',
746
+ 'k-button-md': size === 'medium' || !size,
747
+ 'k-button-lg': size === 'large'
748
+ }"
749
+ (onClick)="onScrollButtonClick($event)"></span>
750
+ <span
751
+ role="button"
752
+ *ngIf="hasScrollButtons.visible && hasScrollButtons.position === 'start'"
753
+ #nextScrollButton
754
+ kendoTabStripScrollableButton
755
+ [scrollable]="scrollable"
756
+ [tabPosition]="tabPosition"
757
+ [prev]="false"
758
+ [title]="localization.get('nextTabButton')"
759
+ (tabScroll)="tabScroll.emit($event)"
760
+ class="k-icon-button k-button k-button-flat k-button-flat-base"
761
+ [ngClass]="{
762
+ 'k-button-sm': size === 'small',
763
+ 'k-button-md': size === 'medium' || !size,
764
+ 'k-button-lg': size === 'large'
765
+ }"
766
+ (onClick)="onScrollButtonClick($event)"></span>
611
767
  <ul role="tablist" #tablist
612
768
  class="k-reset k-tabstrip-items"
613
769
  [ngClass]="{
@@ -615,7 +771,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
615
771
  'k-tabstrip-items-center': tabAlignment === 'center',
616
772
  'k-tabstrip-items-end': tabAlignment === 'end',
617
773
  'k-tabstrip-items-stretched': tabAlignment === 'stretched',
618
- 'k-tabstrip-items-justify': tabAlignment === 'justify'
774
+ 'k-tabstrip-items-justify': tabAlignment === 'justify',
775
+ 'k-tabstrip-items-scroll': false
619
776
  }"
620
777
  [attr.aria-orientation]="tabPosition === 'left' || tabPosition === 'right' ? 'vertical' : 'horizontal'"
621
778
  >
@@ -642,7 +799,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
642
799
  </ul>
643
800
  <span
644
801
  role="button"
645
- *ngIf="hasScrollButtons"
802
+ *ngIf="hasScrollButtons.visible && hasScrollButtons.position === 'end'"
803
+ #prevScrollButton
804
+ kendoTabStripScrollableButton
805
+ [scrollable]="scrollable"
806
+ [tabPosition]="tabPosition"
807
+ [prev]="true"
808
+ [title]="localization.get('previousTabButton')"
809
+ (tabScroll)="tabScroll.emit($event)"
810
+ class="k-icon-button k-button k-button-flat k-button-flat-base"
811
+ [ngClass]="{
812
+ 'k-button-sm': size === 'small',
813
+ 'k-button-md': size === 'medium' || !size,
814
+ 'k-button-lg': size === 'large'
815
+ }"
816
+ (onClick)="onScrollButtonClick($event)"></span>
817
+ <span
818
+ role="button"
819
+ *ngIf="hasScrollButtons.visible && hasScrollButtons.position !== 'start'"
646
820
  #nextScrollButton
647
821
  kendoTabStripScrollableButton
648
822
  [scrollable]="scrollable"
@@ -650,7 +824,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
650
824
  [prev]="false"
651
825
  [title]="localization.get('nextTabButton')"
652
826
  (tabScroll)="tabScroll.emit($event)"
653
- class="k-icon-button k-button k-button-md k-button-flat k-button-flat-base"
827
+ class="k-icon-button k-button k-button-flat k-button-flat-base"
828
+ [ngClass]="{
829
+ 'k-button-sm': size === 'small',
830
+ 'k-button-md': size === 'medium' || !size,
831
+ 'k-button-lg': size === 'large'
832
+ }"
654
833
  (onClick)="onScrollButtonClick($event)"></span>
655
834
  </div>
656
835
  </ng-template>
@@ -692,6 +871,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
692
871
  type: Input
693
872
  }], scrollable: [{
694
873
  type: Input
874
+ }], size: [{
875
+ type: Input
695
876
  }], closeIcon: [{
696
877
  type: Input
697
878
  }], closeIconClass: [{
@@ -711,7 +892,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
711
892
  args: ['class.k-tabstrip']
712
893
  }, {
713
894
  type: HostBinding,
714
- args: ['class.k-header']
895
+ args: ['class.k-tabstrip-md']
715
896
  }], tabsAtTop: [{
716
897
  type: HostBinding,
717
898
  args: ['class.k-tabstrip-top']
@@ -735,14 +916,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
735
916
  args: [TabStripTabComponent]
736
917
  }], tablist: [{
737
918
  type: ViewChild,
738
- args: ['tablist', { static: false }]
919
+ args: ['tablist']
739
920
  }], tabHeaderContainers: [{
740
921
  type: ViewChildren,
741
922
  args: ['tabHeaderContainer', { read: ElementRef }]
742
923
  }], prevScrollButton: [{
743
924
  type: ViewChild,
744
- args: ['prevScrollButton', { static: false }]
925
+ args: ['prevScrollButton']
745
926
  }], nextScrollButton: [{
746
927
  type: ViewChild,
747
- args: ['nextScrollButton', { static: false }]
928
+ args: ['nextScrollButton']
748
929
  }] } });
@@ -32,7 +32,12 @@ export const isTabClosable = (tab, tabStripClosable) => {
32
32
  * Checks if the TabStrip scroll buttons will be rendered. Depends on the value of the TabStrip scrollable settings.
33
33
  */
34
34
  export const tabStripHasScrollButtons = (scrollableSettings) => {
35
- return scrollableSettings.enabled && scrollableSettings.scrollButtons !== 'hidden';
35
+ const visible = scrollableSettings.enabled && scrollableSettings.scrollButtons !== 'hidden';
36
+ const position = scrollableSettings.scrollButtonsPosition;
37
+ return {
38
+ visible,
39
+ position
40
+ };
36
41
  };
37
42
  /**
38
43
  * @hidden
@@ -28,8 +28,8 @@ const packageMetadata = {
28
28
  name: '@progress/kendo-angular-layout',
29
29
  productName: 'Kendo UI for Angular',
30
30
  productCodes: ['KENDOUIANGULAR', 'KENDOUICOMPLETE'],
31
- publishDate: 1736179215,
32
- version: '17.3.0-develop.1',
31
+ publishDate: 1736249770,
32
+ version: '18.0.0-develop.1',
33
33
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/?utm_medium=product&utm_source=kendoangular&utm_campaign=kendo-ui-angular-purchase-license-keys-warning'
34
34
  };
35
35
 
@@ -3068,7 +3068,12 @@ const isTabClosable = (tab, tabStripClosable) => {
3068
3068
  * Checks if the TabStrip scroll buttons will be rendered. Depends on the value of the TabStrip scrollable settings.
3069
3069
  */
3070
3070
  const tabStripHasScrollButtons = (scrollableSettings) => {
3071
- return scrollableSettings.enabled && scrollableSettings.scrollButtons !== 'hidden';
3071
+ const visible = scrollableSettings.enabled && scrollableSettings.scrollButtons !== 'hidden';
3072
+ const position = scrollableSettings.scrollButtonsPosition;
3073
+ return {
3074
+ visible,
3075
+ position
3076
+ };
3072
3077
  };
3073
3078
  /**
3074
3079
  * @hidden
@@ -3352,16 +3357,6 @@ class ScrollService {
3352
3357
  get tabsOverflow() {
3353
3358
  return this.tablistOverflowSize > 0;
3354
3359
  }
3355
- get scrollButtonsSize() {
3356
- if (!this.owner.hasScrollButtons) {
3357
- return 0;
3358
- }
3359
- const prevRect = this.owner.prevScrollButton.hostBoundingClientRect;
3360
- const prevSize = isTablistHorizontal(this.owner.tabPosition) ? prevRect.width : prevRect.height;
3361
- const nextRect = this.owner.nextScrollButton.hostBoundingClientRect;
3362
- const nextSize = isTablistHorizontal(this.owner.tabPosition) ? nextRect.width : nextRect.height;
3363
- return prevSize + nextSize;
3364
- }
3365
3360
  constructor(ngZone) {
3366
3361
  this.ngZone = ngZone;
3367
3362
  }
@@ -3373,7 +3368,7 @@ class ScrollService {
3373
3368
  const currentPrevButtonActive = !this.isDisabled('prev');
3374
3369
  const currentNextButtonActive = !this.isDisabled('next');
3375
3370
  const calculatedPrevButtonActive = this.position > 0 && this.tablistOverflowSize > 0;
3376
- const calculatedNextButtonActive = this.position < this.tablistOverflowSize + this.scrollButtonsSize && this.tablistOverflowSize > 0;
3371
+ const calculatedNextButtonActive = this.position < this.tablistOverflowSize && this.tablistOverflowSize > 0;
3377
3372
  if (calculatedPrevButtonActive !== currentPrevButtonActive) {
3378
3373
  this.ngZone.run(() => this.toggleButtonActiveState('prev', calculatedPrevButtonActive));
3379
3374
  }
@@ -3452,6 +3447,10 @@ class ScrollService {
3452
3447
  }
3453
3448
  this.toggleScrollButtonsState();
3454
3449
  }
3450
+ onScroll(e) {
3451
+ this.position = isTablistHorizontal(this.owner.tabPosition) ? e.target.scrollLeft : e.target.scrollTop;
3452
+ this.toggleScrollButtonsState();
3453
+ }
3455
3454
  scrollTabs(direction) {
3456
3455
  this.calculateListPosition(direction, this.owner.scrollable.buttonScrollSpeed);
3457
3456
  if (isTablistHorizontal(this.owner.tabPosition) && this.tablistElement) {
@@ -3463,13 +3462,12 @@ class ScrollService {
3463
3462
  this.toggleScrollButtonsState();
3464
3463
  }
3465
3464
  calculateListPosition(direction, scrollSpeed) {
3466
- const adjustedMaxScroll = this.tablistOverflowSize + this.scrollButtonsSize;
3467
3465
  if (direction === 'prev' && this.position > 0) {
3468
3466
  this.position = this.position - scrollSpeed <= 0 ? 0 : this.position - scrollSpeed;
3469
3467
  }
3470
- else if (direction === 'next' && this.position < adjustedMaxScroll) {
3471
- if (this.position + scrollSpeed > adjustedMaxScroll) {
3472
- this.position = adjustedMaxScroll;
3468
+ else if (direction === 'next' && this.position < this.tablistOverflowSize) {
3469
+ if (this.position + scrollSpeed > this.tablistOverflowSize) {
3470
+ this.position = this.tablistOverflowSize;
3473
3471
  return;
3474
3472
  }
3475
3473
  this.position += scrollSpeed;
@@ -3487,7 +3485,7 @@ class ScrollService {
3487
3485
  toggleButtonActiveState(buttonType, active) {
3488
3486
  this.scrollButtonActiveStateChange.next({ buttonType, active });
3489
3487
  }
3490
- isDisabled = (buttonType) => this.owner[`${buttonType}ScrollButton`].host.nativeElement.classList.contains('k-disabled');
3488
+ isDisabled = (buttonType) => this.owner[`${buttonType}ScrollButton`]?.host.nativeElement.classList.contains('k-disabled');
3491
3489
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ScrollService, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
3492
3490
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ScrollService });
3493
3491
  }
@@ -3498,12 +3496,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
3498
3496
  /**
3499
3497
  * @hidden
3500
3498
  */
3501
- const normalizeSettings = ({ enabled = true, scrollButtons = 'auto', mouseScroll = true, buttonScrollSpeed = BUTTON_SCROLL_SPEED, mouseScrollSpeed = MOUSE_SCROLL_SPEED, prevButtonIcon, nextButtonIcon, prevSVGButtonIcon, nextSVGButtonIcon }) => ({
3499
+ const normalizeSettings = ({ enabled = true, scrollButtons = 'auto', mouseScroll = true, buttonScrollSpeed = BUTTON_SCROLL_SPEED, mouseScrollSpeed = MOUSE_SCROLL_SPEED, scrollButtonsPosition = 'split', prevButtonIcon, nextButtonIcon, prevSVGButtonIcon, nextSVGButtonIcon }) => ({
3502
3500
  enabled,
3503
3501
  scrollButtons,
3504
3502
  mouseScroll,
3505
3503
  buttonScrollSpeed,
3506
3504
  mouseScrollSpeed,
3505
+ scrollButtonsPosition,
3507
3506
  prevButtonIcon,
3508
3507
  nextButtonIcon,
3509
3508
  prevSVGButtonIcon,
@@ -3772,7 +3771,7 @@ class TabComponent {
3772
3771
  this.tabClose.emit(closeArgs);
3773
3772
  }
3774
3773
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TabComponent, deps: [{ token: i1.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
3775
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TabComponent, isStandalone: true, selector: "[kendoTabStripTab]", inputs: { tab: "tab", index: "index", tabStripClosable: "tabStripClosable", tabStripCloseIcon: "tabStripCloseIcon", customTabstripCloseIcon: "customTabstripCloseIcon", closeSVGIcon: "closeSVGIcon" }, outputs: { tabClose: "tabClose" }, host: { properties: { "class.k-item": "this.hostClasses", "attr.aria-selected": "this.activeClass", "class.k-active": "this.activeClass", "attr.aria-disabled": "this.disabledClass", "class.k-disabled": "this.disabledClass", "class.k-focus": "this.focusedClass", "attr.tabindex": "this.tabIndex" } }, ngImport: i0, template: `
3774
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TabComponent, isStandalone: true, selector: "[kendoTabStripTab]", inputs: { tab: "tab", index: "index", tabStripClosable: "tabStripClosable", tabStripCloseIcon: "tabStripCloseIcon", customTabstripCloseIcon: "customTabstripCloseIcon", closeSVGIcon: "closeSVGIcon" }, outputs: { tabClose: "tabClose" }, host: { properties: { "class.k-item": "this.hostClasses", "class.k-tabstrip-item": "this.hostClasses", "attr.aria-selected": "this.activeClass", "class.k-active": "this.activeClass", "attr.aria-disabled": "this.disabledClass", "class.k-disabled": "this.disabledClass", "class.k-focus": "this.focusedClass", "attr.tabindex": "this.tabIndex" } }, ngImport: i0, template: `
3776
3775
  <ng-container *ngIf="!tab.tabTemplate; else tabTemplate">
3777
3776
  <span class="k-link" *ngIf="!tab.tabTitle">
3778
3777
  <span class="k-link-text">{{ tab.title }}</span>
@@ -3856,6 +3855,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
3856
3855
  }], hostClasses: [{
3857
3856
  type: HostBinding,
3858
3857
  args: ['class.k-item']
3858
+ }, {
3859
+ type: HostBinding,
3860
+ args: ['class.k-tabstrip-item']
3859
3861
  }], activeClass: [{
3860
3862
  type: HostBinding,
3861
3863
  args: ['attr.aria-selected']
@@ -4004,12 +4006,52 @@ class TabStripComponent {
4004
4006
  this._scrollableSettings = normalizeScrollableSettings(value);
4005
4007
  if (this.tablist) {
4006
4008
  this.toggleScrollButtons(this.scrollService.tabsOverflow);
4007
- this.attachWheelHandler(this.tablist.nativeElement);
4009
+ if (this.isScrollable && this.mouseScrollEnabled) {
4010
+ this.attachWheelHandler(this.tablist.nativeElement);
4011
+ }
4008
4012
  }
4009
4013
  }
4010
4014
  get scrollable() {
4011
4015
  return this._scrollableSettings;
4012
4016
  }
4017
+ /**
4018
+ * Specifies the size of the TabStrip.
4019
+ * ([see example](slug:api_layout_tabstripcomponent#toc-size).
4020
+ *
4021
+ * The possible values are:
4022
+ * * `small`
4023
+ * * `medium` (Default)
4024
+ * * `large`
4025
+ * * `none`
4026
+ */
4027
+ set size(value) {
4028
+ switch (value) {
4029
+ case 'small':
4030
+ this.renderer.removeClass(this.wrapper.nativeElement, 'k-tabstrip-md');
4031
+ this.renderer.removeClass(this.wrapper.nativeElement, 'k-tabstrip-lg');
4032
+ this.renderer.addClass(this.wrapper.nativeElement, 'k-tabstrip-sm');
4033
+ break;
4034
+ case 'medium':
4035
+ this.renderer.removeClass(this.wrapper.nativeElement, 'k-tabstrip-sm');
4036
+ this.renderer.removeClass(this.wrapper.nativeElement, 'k-tabstrip-lg');
4037
+ this.renderer.addClass(this.wrapper.nativeElement, 'k-tabstrip-md');
4038
+ break;
4039
+ case 'large':
4040
+ this.renderer.removeClass(this.wrapper.nativeElement, 'k-tabstrip-md');
4041
+ this.renderer.removeClass(this.wrapper.nativeElement, 'k-tabstrip-sm');
4042
+ this.renderer.addClass(this.wrapper.nativeElement, 'k-tabstrip-lg');
4043
+ break;
4044
+ case 'none':
4045
+ this.renderer.removeClass(this.wrapper.nativeElement, 'k-tabstrip-md');
4046
+ this.renderer.removeClass(this.wrapper.nativeElement, 'k-tabstrip-lg');
4047
+ this.renderer.removeClass(this.wrapper.nativeElement, 'k-tabstrip-sm');
4048
+ }
4049
+ this._size = value;
4050
+ this.ngZone.onStable.pipe(take(1)).subscribe(() => this.onResize());
4051
+ }
4052
+ get size() {
4053
+ return this._size;
4054
+ }
4013
4055
  /**
4014
4056
  * Defines the name for an existing font icon in the Kendo UI theme for the close icon.
4015
4057
  */
@@ -4071,6 +4113,11 @@ class TabStripComponent {
4071
4113
  get tabStripScrollable() {
4072
4114
  return this._scrollableSettings.enabled;
4073
4115
  }
4116
+ // To be released with a breaking change in Q2 2025
4117
+ // @HostBinding('class.k-tabstrip-scrollable-overlay')
4118
+ // public get tabStripScrollableOverlay(): boolean {
4119
+ // return this._scrollableSettings.enabled && !this.hasScrollButtons.visible;
4120
+ // }
4074
4121
  /**
4075
4122
  * A query list of all declared tabs.
4076
4123
  */
@@ -4107,6 +4154,7 @@ class TabStripComponent {
4107
4154
  tabStripId = guid();
4108
4155
  tabsChangesSub;
4109
4156
  activeStateChangeSub;
4157
+ _size = 'medium';
4110
4158
  constructor(localization, renderer, wrapper, tabstripService, scrollService, ngZone) {
4111
4159
  this.localization = localization;
4112
4160
  this.renderer = renderer;
@@ -4119,7 +4167,7 @@ class TabStripComponent {
4119
4167
  this.tabstripService.owner = this;
4120
4168
  this.scrollService.owner = this;
4121
4169
  this.subscriptions.add(this.scrollService.scrollButtonActiveStateChange.subscribe((activeButtonSettings) => {
4122
- if (this.hasScrollButtons) {
4170
+ if (this.hasScrollButtons.visible) {
4123
4171
  const action = activeButtonSettings.active ? 'remove' : 'add';
4124
4172
  this.renderer[`${action}Class`](this[`${activeButtonSettings.buttonType}ScrollButton`].host.nativeElement, 'k-disabled');
4125
4173
  }
@@ -4147,6 +4195,8 @@ class TabStripComponent {
4147
4195
  this.scrollService.toggleScrollButtonsState();
4148
4196
  });
4149
4197
  });
4198
+ // To be released in Q2 2025
4199
+ // this.isScrollable && !this.hasScrollButtons.visible && this.setScrollableOverlayClasses();
4150
4200
  }
4151
4201
  ngOnChanges(changes) {
4152
4202
  if (!isDocumentAvailable()) {
@@ -4162,7 +4212,7 @@ class TabStripComponent {
4162
4212
  this.subscriptions = new Subscription();
4163
4213
  this.subscriptionsArePresent = false;
4164
4214
  this.activeStateChangeSub = this.scrollService.scrollButtonActiveStateChange.subscribe((activeButtonSettings) => {
4165
- if (this.hasScrollButtons) {
4215
+ if (this.hasScrollButtons.visible) {
4166
4216
  const action = activeButtonSettings.active ? 'remove' : 'add';
4167
4217
  this.renderer[`${action}Class`](this[`${activeButtonSettings.buttonType}ScrollButton`].host.nativeElement, 'k-disabled');
4168
4218
  }
@@ -4293,6 +4343,10 @@ class TabStripComponent {
4293
4343
  if (this.isScrollable && this.mouseScrollEnabled) {
4294
4344
  this.attachWheelHandler(tablist);
4295
4345
  }
4346
+ // To be released in Q2 2025
4347
+ // if (this.isScrollable && !this.mouseScrollEnabled) {
4348
+ // this.attachTablistScrollHandler(tablist);
4349
+ // }
4296
4350
  this.subscriptionsArePresent = true;
4297
4351
  }
4298
4352
  toggleScrollButtons(tabsOverflow) {
@@ -4312,7 +4366,7 @@ class TabStripComponent {
4312
4366
  this.prevScrollButton.toggle(true);
4313
4367
  this.nextScrollButton.toggle(true);
4314
4368
  }
4315
- if (scrollButtonsArePresent && alwaysVisible) {
4369
+ if (scrollButtonsArePresent) {
4316
4370
  this.ngZone.runOutsideAngular(() => {
4317
4371
  this.scrollService.toggleScrollButtonsState();
4318
4372
  });
@@ -4334,8 +4388,47 @@ class TabStripComponent {
4334
4388
  }));
4335
4389
  });
4336
4390
  }
4391
+ /* tslint:disable:no-unused-variable */
4392
+ attachTablistScrollHandler(tablist) {
4393
+ this.ngZone.runOutsideAngular(() => {
4394
+ this.subscriptions.add(this.renderer.listen(tablist, 'scroll', (e) => {
4395
+ const scrollEvent = new TabScrollEvent({
4396
+ originalEvent: e
4397
+ });
4398
+ this.tabScroll.emit(scrollEvent);
4399
+ const isTabStripScrollEventPrevented = scrollEvent.isDefaultPrevented();
4400
+ if (isTabStripScrollEventPrevented || !this.scrollService.tabsOverflow) {
4401
+ return;
4402
+ }
4403
+ if (!this.hasScrollButtons.visible) {
4404
+ this.setScrollableOverlayClasses();
4405
+ }
4406
+ this.scrollService.onScroll(e);
4407
+ }));
4408
+ });
4409
+ }
4410
+ setScrollableOverlayClasses() {
4411
+ const wrapper = this.wrapper.nativeElement;
4412
+ const container = this.tablist?.nativeElement;
4413
+ if (!container) {
4414
+ return;
4415
+ }
4416
+ const scrollOffset = isTablistHorizontal(this.tabPosition) ? container.scrollLeft : container.scrollTop;
4417
+ if (scrollOffset === 0) {
4418
+ this.renderer.removeClass(wrapper, 'k-tabstrip-scrollable-end');
4419
+ this.renderer.addClass(wrapper, 'k-tabstrip-scrollable-start');
4420
+ }
4421
+ else if (scrollOffset > 0 && scrollOffset < this.scrollService.tablistOverflowSize) {
4422
+ this.renderer.removeClass(wrapper, 'k-tabstrip-scrollable-end');
4423
+ this.renderer.removeClass(wrapper, 'k-tabstrip-scrollable-start');
4424
+ }
4425
+ else {
4426
+ this.renderer.removeClass(wrapper, 'k-tabstrip-scrollable-start');
4427
+ this.renderer.addClass(wrapper, 'k-tabstrip-scrollable-end');
4428
+ }
4429
+ }
4337
4430
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TabStripComponent, deps: [{ token: i1.LocalizationService }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: TabStripService }, { token: ScrollService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
4338
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TabStripComponent, isStandalone: true, selector: "kendo-tabstrip", inputs: { height: "height", animate: "animate", tabAlignment: "tabAlignment", tabPosition: "tabPosition", keepTabContent: "keepTabContent", closable: "closable", scrollable: "scrollable", closeIcon: "closeIcon", closeIconClass: "closeIconClass", closeSVGIcon: "closeSVGIcon", showContentArea: "showContentArea" }, outputs: { tabSelect: "tabSelect", tabClose: "tabClose", tabScroll: "tabScroll" }, host: { properties: { "class.k-tabstrip": "this.hostClasses", "class.k-header": "this.hostClasses", "class.k-tabstrip-top": "this.tabsAtTop", "class.k-tabstrip-right": "this.tabsAtRight", "class.k-tabstrip-bottom": "this.tabsAtBottom", "class.k-tabstrip-left": "this.tabsAtLeft", "attr.dir": "this.dir", "class.k-tabstrip-scrollable": "this.tabStripScrollable" } }, providers: [
4431
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TabStripComponent, isStandalone: true, selector: "kendo-tabstrip", inputs: { height: "height", animate: "animate", tabAlignment: "tabAlignment", tabPosition: "tabPosition", keepTabContent: "keepTabContent", closable: "closable", scrollable: "scrollable", size: "size", closeIcon: "closeIcon", closeIconClass: "closeIconClass", closeSVGIcon: "closeSVGIcon", showContentArea: "showContentArea" }, outputs: { tabSelect: "tabSelect", tabClose: "tabClose", tabScroll: "tabScroll" }, host: { properties: { "class.k-tabstrip": "this.hostClasses", "class.k-tabstrip-md": "this.hostClasses", "class.k-tabstrip-top": "this.tabsAtTop", "class.k-tabstrip-right": "this.tabsAtRight", "class.k-tabstrip-bottom": "this.tabsAtBottom", "class.k-tabstrip-left": "this.tabsAtLeft", "attr.dir": "this.dir", "class.k-tabstrip-scrollable": "this.tabStripScrollable" } }, providers: [
4339
4432
  TabStripService,
4340
4433
  ScrollService,
4341
4434
  LocalizationService,
@@ -4369,10 +4462,10 @@ class TabStripComponent {
4369
4462
  <ng-container *ngTemplateOutlet="heading"></ng-container>
4370
4463
  </ng-container>
4371
4464
  <ng-template #heading>
4372
- <div class="k-tabstrip-items-wrapper" [ngClass]="itemsWrapperClass">
4465
+ <div class="k-tabstrip-items-wrapper" [class.k-tabstrip-items-wrapper-scroll]="tabStripScrollable" [ngClass]="itemsWrapperClass">
4373
4466
  <span
4374
4467
  role="button"
4375
- *ngIf="hasScrollButtons"
4468
+ *ngIf="hasScrollButtons.visible && hasScrollButtons.position !== 'end'"
4376
4469
  #prevScrollButton
4377
4470
  kendoTabStripScrollableButton
4378
4471
  [scrollable]="scrollable"
@@ -4380,9 +4473,30 @@ class TabStripComponent {
4380
4473
  [prev]="true"
4381
4474
  [title]="localization.get('previousTabButton')"
4382
4475
  (tabScroll)="tabScroll.emit($event)"
4383
- class="k-icon-button k-button k-button-md k-button-flat k-button-flat-base"
4384
- (onClick)="onScrollButtonClick($event)">
4385
- </span>
4476
+ class="k-icon-button k-button k-button-flat k-button-flat-base"
4477
+ [ngClass]="{
4478
+ 'k-button-sm': size === 'small',
4479
+ 'k-button-md': size === 'medium' || !size,
4480
+ 'k-button-lg': size === 'large'
4481
+ }"
4482
+ (onClick)="onScrollButtonClick($event)"></span>
4483
+ <span
4484
+ role="button"
4485
+ *ngIf="hasScrollButtons.visible && hasScrollButtons.position === 'start'"
4486
+ #nextScrollButton
4487
+ kendoTabStripScrollableButton
4488
+ [scrollable]="scrollable"
4489
+ [tabPosition]="tabPosition"
4490
+ [prev]="false"
4491
+ [title]="localization.get('nextTabButton')"
4492
+ (tabScroll)="tabScroll.emit($event)"
4493
+ class="k-icon-button k-button k-button-flat k-button-flat-base"
4494
+ [ngClass]="{
4495
+ 'k-button-sm': size === 'small',
4496
+ 'k-button-md': size === 'medium' || !size,
4497
+ 'k-button-lg': size === 'large'
4498
+ }"
4499
+ (onClick)="onScrollButtonClick($event)"></span>
4386
4500
  <ul role="tablist" #tablist
4387
4501
  class="k-reset k-tabstrip-items"
4388
4502
  [ngClass]="{
@@ -4390,7 +4504,8 @@ class TabStripComponent {
4390
4504
  'k-tabstrip-items-center': tabAlignment === 'center',
4391
4505
  'k-tabstrip-items-end': tabAlignment === 'end',
4392
4506
  'k-tabstrip-items-stretched': tabAlignment === 'stretched',
4393
- 'k-tabstrip-items-justify': tabAlignment === 'justify'
4507
+ 'k-tabstrip-items-justify': tabAlignment === 'justify',
4508
+ 'k-tabstrip-items-scroll': false
4394
4509
  }"
4395
4510
  [attr.aria-orientation]="tabPosition === 'left' || tabPosition === 'right' ? 'vertical' : 'horizontal'"
4396
4511
  >
@@ -4417,7 +4532,24 @@ class TabStripComponent {
4417
4532
  </ul>
4418
4533
  <span
4419
4534
  role="button"
4420
- *ngIf="hasScrollButtons"
4535
+ *ngIf="hasScrollButtons.visible && hasScrollButtons.position === 'end'"
4536
+ #prevScrollButton
4537
+ kendoTabStripScrollableButton
4538
+ [scrollable]="scrollable"
4539
+ [tabPosition]="tabPosition"
4540
+ [prev]="true"
4541
+ [title]="localization.get('previousTabButton')"
4542
+ (tabScroll)="tabScroll.emit($event)"
4543
+ class="k-icon-button k-button k-button-flat k-button-flat-base"
4544
+ [ngClass]="{
4545
+ 'k-button-sm': size === 'small',
4546
+ 'k-button-md': size === 'medium' || !size,
4547
+ 'k-button-lg': size === 'large'
4548
+ }"
4549
+ (onClick)="onScrollButtonClick($event)"></span>
4550
+ <span
4551
+ role="button"
4552
+ *ngIf="hasScrollButtons.visible && hasScrollButtons.position !== 'start'"
4421
4553
  #nextScrollButton
4422
4554
  kendoTabStripScrollableButton
4423
4555
  [scrollable]="scrollable"
@@ -4425,7 +4557,12 @@ class TabStripComponent {
4425
4557
  [prev]="false"
4426
4558
  [title]="localization.get('nextTabButton')"
4427
4559
  (tabScroll)="tabScroll.emit($event)"
4428
- class="k-icon-button k-button k-button-md k-button-flat k-button-flat-base"
4560
+ class="k-icon-button k-button k-button-flat k-button-flat-base"
4561
+ [ngClass]="{
4562
+ 'k-button-sm': size === 'small',
4563
+ 'k-button-md': size === 'medium' || !size,
4564
+ 'k-button-lg': size === 'large'
4565
+ }"
4429
4566
  (onClick)="onScrollButtonClick($event)"></span>
4430
4567
  </div>
4431
4568
  </ng-template>
@@ -4508,10 +4645,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
4508
4645
  <ng-container *ngTemplateOutlet="heading"></ng-container>
4509
4646
  </ng-container>
4510
4647
  <ng-template #heading>
4511
- <div class="k-tabstrip-items-wrapper" [ngClass]="itemsWrapperClass">
4648
+ <div class="k-tabstrip-items-wrapper" [class.k-tabstrip-items-wrapper-scroll]="tabStripScrollable" [ngClass]="itemsWrapperClass">
4512
4649
  <span
4513
4650
  role="button"
4514
- *ngIf="hasScrollButtons"
4651
+ *ngIf="hasScrollButtons.visible && hasScrollButtons.position !== 'end'"
4515
4652
  #prevScrollButton
4516
4653
  kendoTabStripScrollableButton
4517
4654
  [scrollable]="scrollable"
@@ -4519,9 +4656,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
4519
4656
  [prev]="true"
4520
4657
  [title]="localization.get('previousTabButton')"
4521
4658
  (tabScroll)="tabScroll.emit($event)"
4522
- class="k-icon-button k-button k-button-md k-button-flat k-button-flat-base"
4523
- (onClick)="onScrollButtonClick($event)">
4524
- </span>
4659
+ class="k-icon-button k-button k-button-flat k-button-flat-base"
4660
+ [ngClass]="{
4661
+ 'k-button-sm': size === 'small',
4662
+ 'k-button-md': size === 'medium' || !size,
4663
+ 'k-button-lg': size === 'large'
4664
+ }"
4665
+ (onClick)="onScrollButtonClick($event)"></span>
4666
+ <span
4667
+ role="button"
4668
+ *ngIf="hasScrollButtons.visible && hasScrollButtons.position === 'start'"
4669
+ #nextScrollButton
4670
+ kendoTabStripScrollableButton
4671
+ [scrollable]="scrollable"
4672
+ [tabPosition]="tabPosition"
4673
+ [prev]="false"
4674
+ [title]="localization.get('nextTabButton')"
4675
+ (tabScroll)="tabScroll.emit($event)"
4676
+ class="k-icon-button k-button k-button-flat k-button-flat-base"
4677
+ [ngClass]="{
4678
+ 'k-button-sm': size === 'small',
4679
+ 'k-button-md': size === 'medium' || !size,
4680
+ 'k-button-lg': size === 'large'
4681
+ }"
4682
+ (onClick)="onScrollButtonClick($event)"></span>
4525
4683
  <ul role="tablist" #tablist
4526
4684
  class="k-reset k-tabstrip-items"
4527
4685
  [ngClass]="{
@@ -4529,7 +4687,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
4529
4687
  'k-tabstrip-items-center': tabAlignment === 'center',
4530
4688
  'k-tabstrip-items-end': tabAlignment === 'end',
4531
4689
  'k-tabstrip-items-stretched': tabAlignment === 'stretched',
4532
- 'k-tabstrip-items-justify': tabAlignment === 'justify'
4690
+ 'k-tabstrip-items-justify': tabAlignment === 'justify',
4691
+ 'k-tabstrip-items-scroll': false
4533
4692
  }"
4534
4693
  [attr.aria-orientation]="tabPosition === 'left' || tabPosition === 'right' ? 'vertical' : 'horizontal'"
4535
4694
  >
@@ -4556,7 +4715,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
4556
4715
  </ul>
4557
4716
  <span
4558
4717
  role="button"
4559
- *ngIf="hasScrollButtons"
4718
+ *ngIf="hasScrollButtons.visible && hasScrollButtons.position === 'end'"
4719
+ #prevScrollButton
4720
+ kendoTabStripScrollableButton
4721
+ [scrollable]="scrollable"
4722
+ [tabPosition]="tabPosition"
4723
+ [prev]="true"
4724
+ [title]="localization.get('previousTabButton')"
4725
+ (tabScroll)="tabScroll.emit($event)"
4726
+ class="k-icon-button k-button k-button-flat k-button-flat-base"
4727
+ [ngClass]="{
4728
+ 'k-button-sm': size === 'small',
4729
+ 'k-button-md': size === 'medium' || !size,
4730
+ 'k-button-lg': size === 'large'
4731
+ }"
4732
+ (onClick)="onScrollButtonClick($event)"></span>
4733
+ <span
4734
+ role="button"
4735
+ *ngIf="hasScrollButtons.visible && hasScrollButtons.position !== 'start'"
4560
4736
  #nextScrollButton
4561
4737
  kendoTabStripScrollableButton
4562
4738
  [scrollable]="scrollable"
@@ -4564,7 +4740,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
4564
4740
  [prev]="false"
4565
4741
  [title]="localization.get('nextTabButton')"
4566
4742
  (tabScroll)="tabScroll.emit($event)"
4567
- class="k-icon-button k-button k-button-md k-button-flat k-button-flat-base"
4743
+ class="k-icon-button k-button k-button-flat k-button-flat-base"
4744
+ [ngClass]="{
4745
+ 'k-button-sm': size === 'small',
4746
+ 'k-button-md': size === 'medium' || !size,
4747
+ 'k-button-lg': size === 'large'
4748
+ }"
4568
4749
  (onClick)="onScrollButtonClick($event)"></span>
4569
4750
  </div>
4570
4751
  </ng-template>
@@ -4606,6 +4787,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
4606
4787
  type: Input
4607
4788
  }], scrollable: [{
4608
4789
  type: Input
4790
+ }], size: [{
4791
+ type: Input
4609
4792
  }], closeIcon: [{
4610
4793
  type: Input
4611
4794
  }], closeIconClass: [{
@@ -4625,7 +4808,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
4625
4808
  args: ['class.k-tabstrip']
4626
4809
  }, {
4627
4810
  type: HostBinding,
4628
- args: ['class.k-header']
4811
+ args: ['class.k-tabstrip-md']
4629
4812
  }], tabsAtTop: [{
4630
4813
  type: HostBinding,
4631
4814
  args: ['class.k-tabstrip-top']
@@ -4649,16 +4832,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
4649
4832
  args: [TabStripTabComponent]
4650
4833
  }], tablist: [{
4651
4834
  type: ViewChild,
4652
- args: ['tablist', { static: false }]
4835
+ args: ['tablist']
4653
4836
  }], tabHeaderContainers: [{
4654
4837
  type: ViewChildren,
4655
4838
  args: ['tabHeaderContainer', { read: ElementRef }]
4656
4839
  }], prevScrollButton: [{
4657
4840
  type: ViewChild,
4658
- args: ['prevScrollButton', { static: false }]
4841
+ args: ['prevScrollButton']
4659
4842
  }], nextScrollButton: [{
4660
4843
  type: ViewChild,
4661
- args: ['nextScrollButton', { static: false }]
4844
+ args: ['nextScrollButton']
4662
4845
  }] } });
4663
4846
 
4664
4847
  /**
package/index.d.ts CHANGED
@@ -22,8 +22,9 @@ export { TabAlignment } from './tabstrip/models/tab-alignment';
22
22
  export { TabStripScrollButtonsVisibility } from './tabstrip/models/scroll-buttons-visibility';
23
23
  export { LocalizedTabStripMessagesDirective } from './tabstrip/localization/localized-messages.directive';
24
24
  export { TabStripCustomMessagesComponent } from './tabstrip/localization/custom-messages.component';
25
- export { TabStripScrollableSettings } from './tabstrip/models/scrollable-settings';
25
+ export { TabStripScrollableSettings, TabStripScrollButtonsPosition } from './tabstrip/models/scrollable-settings';
26
26
  export { TabTemplateDirective } from './tabstrip/directives/tab.directive';
27
+ export { TabStripSize } from './tabstrip/models/size';
27
28
  export * from './tabstrip/events';
28
29
  export { DrawerComponent } from './drawer/drawer.component';
29
30
  export { DrawerContainerComponent } from './drawer/drawer-container.component';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@progress/kendo-angular-layout",
3
- "version": "17.3.0-develop.1",
3
+ "version": "18.0.0-develop.1",
4
4
  "description": "Kendo UI for Angular Layout Package - a collection of components to create professional application layoyts",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "author": "Progress",
@@ -39,17 +39,17 @@
39
39
  "@angular/core": "16 - 19",
40
40
  "@angular/platform-browser": "16 - 19",
41
41
  "@progress/kendo-licensing": "^1.0.2",
42
- "@progress/kendo-angular-common": "17.3.0-develop.1",
43
- "@progress/kendo-angular-l10n": "17.3.0-develop.1",
44
- "@progress/kendo-angular-progressbar": "17.3.0-develop.1",
45
- "@progress/kendo-angular-icons": "17.3.0-develop.1",
46
- "@progress/kendo-angular-buttons": "17.3.0-develop.1",
47
- "@progress/kendo-angular-intl": "17.3.0-develop.1",
42
+ "@progress/kendo-angular-common": "18.0.0-develop.1",
43
+ "@progress/kendo-angular-l10n": "18.0.0-develop.1",
44
+ "@progress/kendo-angular-progressbar": "18.0.0-develop.1",
45
+ "@progress/kendo-angular-icons": "18.0.0-develop.1",
46
+ "@progress/kendo-angular-buttons": "18.0.0-develop.1",
47
+ "@progress/kendo-angular-intl": "18.0.0-develop.1",
48
48
  "rxjs": "^6.5.3 || ^7.0.0"
49
49
  },
50
50
  "dependencies": {
51
51
  "tslib": "^2.3.1",
52
- "@progress/kendo-angular-schematics": "17.3.0-develop.1",
52
+ "@progress/kendo-angular-schematics": "18.0.0-develop.1",
53
53
  "@progress/kendo-draggable": "^3.0.2"
54
54
  },
55
55
  "schematics": "./schematics/collection.json",
@@ -14,7 +14,7 @@ export interface TabStripScrollableSettings {
14
14
  */
15
15
  enabled?: boolean;
16
16
  /**
17
- * Determines whether the TabStrip scroll buttons visibility mode. The possible options are:
17
+ * Determines the TabStrip scroll buttons visibility mode. The possible options are:
18
18
  * - 'auto'(default) - The scroll buttons will be rendered only when the tabs list overflows its container.
19
19
  * - 'visible' - The scroll buttons will be always visible.
20
20
  * - 'hidden' - No scroll buttons will be rendered.
@@ -57,7 +57,18 @@ export interface TabStripScrollableSettings {
57
57
  * The input can take either an [existing Kendo SVG icon](slug:svgicon_list) or a custom one.
58
58
  */
59
59
  nextSVGButtonIcon?: SVGIcon;
60
+ /**
61
+ * Determines the TabStrip scroll buttons position. The possible options are:
62
+ * - 'start'&mdash;The scroll buttons will be rendered at the start before all tabs.
63
+ * - 'end'&mdash;The scroll buttons will be rendered at the end after all tabs.
64
+ * - 'split'(default)&mdash;The scroll buttons will be rendered at each side of the tabs.
65
+ */
66
+ scrollButtonsPosition?: TabStripScrollButtonsPosition;
60
67
  }
68
+ /**
69
+ * The available options for the `scrollButtonsPosition` option.
70
+ */
71
+ export type TabStripScrollButtonsPosition = 'start' | 'end' | 'split';
61
72
  /**
62
73
  * @hidden
63
74
  */
@@ -0,0 +1,8 @@
1
+ /**-----------------------------------------------------------------------------------------
2
+ * Copyright © 2025 Progress Software Corporation. All rights reserved.
3
+ * Licensed under commercial license. See LICENSE.md in the project root for more information
4
+ *-------------------------------------------------------------------------------------------*/
5
+ /**
6
+ * Specifies the possible sizes of the TabStrip ([see example](slug:sizing_tabstrip)).
7
+ */
8
+ export type TabStripSize = 'small' | 'medium' | 'large' | 'none';
@@ -19,12 +19,12 @@ export declare class ScrollService {
19
19
  get tabstripSize(): number;
20
20
  get tablistOverflowSize(): number;
21
21
  get tabsOverflow(): boolean;
22
- get scrollButtonsSize(): number;
23
22
  constructor(ngZone: NgZone);
24
23
  toggleScrollButtonsState(): void;
25
24
  scrollToSelectedTab(): void;
26
25
  getScrollOffset(activeIndex: number): number;
27
26
  onMouseScroll(event: any): void;
27
+ onScroll(e: Event): void;
28
28
  scrollTabs(direction: string): void;
29
29
  calculateListPosition(direction: string, scrollSpeed: number): void;
30
30
  restoreScrollPosition(): void;
@@ -11,11 +11,12 @@ import { ScrollService } from './tabstrip-scroll.service';
11
11
  import { TabPosition } from './models/tab-position';
12
12
  import { TabAlignment } from './models/tab-alignment';
13
13
  import { Subscription } from 'rxjs';
14
- import { TabStripScrollableSettings } from './models/scrollable-settings';
14
+ import { TabStripScrollableSettings, TabStripScrollButtonsPosition } from './models/scrollable-settings';
15
15
  import { TabScrollEvent } from './events/tabscroll-event';
16
16
  import { TabStripScrollableButtonComponent } from './scrollable-button.component';
17
17
  import { ScrollButtonType } from './models/scroll-button-type';
18
18
  import { SVGIcon } from '@progress/kendo-svg-icons';
19
+ import { TabStripSize } from './models/size';
19
20
  import * as i0 from "@angular/core";
20
21
  /**
21
22
  * Represents the [Kendo UI TabStrip component for Angular]({% slug overview_tabstrip %}).
@@ -74,6 +75,18 @@ export declare class TabStripComponent implements AfterViewInit, OnDestroy {
74
75
  */
75
76
  set scrollable(value: boolean | TabStripScrollableSettings);
76
77
  get scrollable(): boolean | TabStripScrollableSettings;
78
+ /**
79
+ * Specifies the size of the TabStrip.
80
+ * ([see example](slug:api_layout_tabstripcomponent#toc-size).
81
+ *
82
+ * The possible values are:
83
+ * * `small`
84
+ * * `medium` (Default)
85
+ * * `large`
86
+ * * `none`
87
+ */
88
+ set size(value: TabStripSize);
89
+ get size(): TabStripSize;
77
90
  /**
78
91
  * Defines the name for an existing font icon in the Kendo UI theme for the close icon.
79
92
  */
@@ -152,6 +165,7 @@ export declare class TabStripComponent implements AfterViewInit, OnDestroy {
152
165
  private tabStripId;
153
166
  private tabsChangesSub;
154
167
  private activeStateChangeSub;
168
+ private _size;
155
169
  constructor(localization: LocalizationService, renderer: Renderer2, wrapper: ElementRef, tabstripService: TabStripService, scrollService: ScrollService, ngZone: NgZone);
156
170
  ngAfterViewInit(): void;
157
171
  ngOnChanges(changes: SimpleChanges): void;
@@ -163,7 +177,10 @@ export declare class TabStripComponent implements AfterViewInit, OnDestroy {
163
177
  /**
164
178
  * @hidden
165
179
  */
166
- get hasScrollButtons(): boolean;
180
+ get hasScrollButtons(): {
181
+ visible: boolean;
182
+ position: TabStripScrollButtonsPosition;
183
+ };
167
184
  /**
168
185
  * @hidden
169
186
  */
@@ -204,6 +221,8 @@ export declare class TabStripComponent implements AfterViewInit, OnDestroy {
204
221
  private initDomEvents;
205
222
  private toggleScrollButtons;
206
223
  private attachWheelHandler;
224
+ private attachTablistScrollHandler;
225
+ private setScrollableOverlayClasses;
207
226
  static ɵfac: i0.ɵɵFactoryDeclaration<TabStripComponent, never>;
208
- static ɵcmp: i0.ɵɵComponentDeclaration<TabStripComponent, "kendo-tabstrip", ["kendoTabStrip"], { "height": { "alias": "height"; "required": false; }; "animate": { "alias": "animate"; "required": false; }; "tabAlignment": { "alias": "tabAlignment"; "required": false; }; "tabPosition": { "alias": "tabPosition"; "required": false; }; "keepTabContent": { "alias": "keepTabContent"; "required": false; }; "closable": { "alias": "closable"; "required": false; }; "scrollable": { "alias": "scrollable"; "required": false; }; "closeIcon": { "alias": "closeIcon"; "required": false; }; "closeIconClass": { "alias": "closeIconClass"; "required": false; }; "closeSVGIcon": { "alias": "closeSVGIcon"; "required": false; }; "showContentArea": { "alias": "showContentArea"; "required": false; }; }, { "tabSelect": "tabSelect"; "tabClose": "tabClose"; "tabScroll": "tabScroll"; }, ["tabs"], never, true, never>;
227
+ static ɵcmp: i0.ɵɵComponentDeclaration<TabStripComponent, "kendo-tabstrip", ["kendoTabStrip"], { "height": { "alias": "height"; "required": false; }; "animate": { "alias": "animate"; "required": false; }; "tabAlignment": { "alias": "tabAlignment"; "required": false; }; "tabPosition": { "alias": "tabPosition"; "required": false; }; "keepTabContent": { "alias": "keepTabContent"; "required": false; }; "closable": { "alias": "closable"; "required": false; }; "scrollable": { "alias": "scrollable"; "required": false; }; "size": { "alias": "size"; "required": false; }; "closeIcon": { "alias": "closeIcon"; "required": false; }; "closeIconClass": { "alias": "closeIconClass"; "required": false; }; "closeSVGIcon": { "alias": "closeSVGIcon"; "required": false; }; "showContentArea": { "alias": "showContentArea"; "required": false; }; }, { "tabSelect": "tabSelect"; "tabClose": "tabClose"; "tabScroll": "tabScroll"; }, ["tabs"], never, true, never>;
209
228
  }
@@ -3,7 +3,7 @@
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  import { ElementRef, QueryList } from "@angular/core";
6
- import { TabStripScrollableSettings } from './models/scrollable-settings';
6
+ import { TabStripScrollableSettings, TabStripScrollButtonsPosition } from './models/scrollable-settings';
7
7
  import { TabStripTabComponent } from "./models/tabstrip-tab.component";
8
8
  import { TabPosition } from './models/tab-position';
9
9
  /**
@@ -23,7 +23,10 @@ export declare const isTabClosable: (tab: TabStripTabComponent, tabStripClosable
23
23
  *
24
24
  * Checks if the TabStrip scroll buttons will be rendered. Depends on the value of the TabStrip scrollable settings.
25
25
  */
26
- export declare const tabStripHasScrollButtons: (scrollableSettings: TabStripScrollableSettings) => boolean;
26
+ export declare const tabStripHasScrollButtons: (scrollableSettings: TabStripScrollableSettings) => {
27
+ visible: boolean;
28
+ position: TabStripScrollButtonsPosition;
29
+ };
27
30
  /**
28
31
  * @hidden
29
32
  *