@progress/kendo-angular-layout 17.3.0-develop.2 → 18.0.0-develop.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/index.mjs +1 -0
- package/esm2022/package-metadata.mjs +2 -2
- package/esm2022/tabstrip/models/scrollable-settings.mjs +2 -1
- package/esm2022/tabstrip/models/size.mjs +5 -0
- package/esm2022/tabstrip/rendering/tab.component.mjs +4 -1
- package/esm2022/tabstrip/tabstrip-scroll.service.mjs +9 -16
- package/esm2022/tabstrip/tabstrip.component.mjs +206 -25
- package/esm2022/tabstrip/util.mjs +6 -1
- package/fesm2022/progress-kendo-angular-layout.mjs +229 -46
- package/index.d.ts +2 -1
- package/package.json +8 -8
- package/tabstrip/models/scrollable-settings.d.ts +12 -1
- package/tabstrip/models/size.d.ts +8 -0
- package/tabstrip/tabstrip-scroll.service.d.ts +1 -1
- package/tabstrip/tabstrip.component.d.ts +22 -3
- package/tabstrip/util.d.ts +5 -2
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:
|
|
13
|
-
version: '
|
|
12
|
+
publishDate: 1736255983,
|
|
13
|
+
version: '18.0.0-develop.2',
|
|
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
|
|
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 <
|
|
156
|
-
if (this.position + scrollSpeed >
|
|
157
|
-
this.position =
|
|
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`]
|
|
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.
|
|
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
|
|
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-
|
|
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-
|
|
470
|
-
|
|
471
|
-
|
|
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-
|
|
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-
|
|
609
|
-
|
|
610
|
-
|
|
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-
|
|
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-
|
|
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'
|
|
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'
|
|
925
|
+
args: ['prevScrollButton']
|
|
745
926
|
}], nextScrollButton: [{
|
|
746
927
|
type: ViewChild,
|
|
747
|
-
args: ['nextScrollButton'
|
|
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
|
-
|
|
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:
|
|
32
|
-
version: '
|
|
31
|
+
publishDate: 1736255983,
|
|
32
|
+
version: '18.0.0-develop.2',
|
|
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
|
-
|
|
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
|
|
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 <
|
|
3471
|
-
if (this.position + scrollSpeed >
|
|
3472
|
-
this.position =
|
|
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`]
|
|
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.
|
|
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
|
|
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-
|
|
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-
|
|
4384
|
-
|
|
4385
|
-
|
|
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-
|
|
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-
|
|
4523
|
-
|
|
4524
|
-
|
|
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-
|
|
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-
|
|
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'
|
|
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'
|
|
4841
|
+
args: ['prevScrollButton']
|
|
4659
4842
|
}], nextScrollButton: [{
|
|
4660
4843
|
type: ViewChild,
|
|
4661
|
-
args: ['nextScrollButton'
|
|
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": "
|
|
3
|
+
"version": "18.0.0-develop.2",
|
|
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": "
|
|
43
|
-
"@progress/kendo-angular-l10n": "
|
|
44
|
-
"@progress/kendo-angular-progressbar": "
|
|
45
|
-
"@progress/kendo-angular-icons": "
|
|
46
|
-
"@progress/kendo-angular-buttons": "
|
|
47
|
-
"@progress/kendo-angular-intl": "
|
|
42
|
+
"@progress/kendo-angular-common": "18.0.0-develop.2",
|
|
43
|
+
"@progress/kendo-angular-l10n": "18.0.0-develop.2",
|
|
44
|
+
"@progress/kendo-angular-progressbar": "18.0.0-develop.2",
|
|
45
|
+
"@progress/kendo-angular-icons": "18.0.0-develop.2",
|
|
46
|
+
"@progress/kendo-angular-buttons": "18.0.0-develop.2",
|
|
47
|
+
"@progress/kendo-angular-intl": "18.0.0-develop.2",
|
|
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": "
|
|
52
|
+
"@progress/kendo-angular-schematics": "18.0.0-develop.2",
|
|
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
|
|
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'—The scroll buttons will be rendered at the start before all tabs.
|
|
63
|
+
* - 'end'—The scroll buttons will be rendered at the end after all tabs.
|
|
64
|
+
* - 'split'(default)—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():
|
|
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
|
}
|
package/tabstrip/util.d.ts
CHANGED
|
@@ -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) =>
|
|
26
|
+
export declare const tabStripHasScrollButtons: (scrollableSettings: TabStripScrollableSettings) => {
|
|
27
|
+
visible: boolean;
|
|
28
|
+
position: TabStripScrollButtonsPosition;
|
|
29
|
+
};
|
|
27
30
|
/**
|
|
28
31
|
* @hidden
|
|
29
32
|
*
|