@skyux/tabs 5.5.0 → 5.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/bundles/skyux-tabs.umd.js +511 -511
  2. package/documentation.json +114 -240
  3. package/esm2015/lib/modules/sectioned-form/sectioned-form-section.component.js +2 -2
  4. package/esm2015/lib/modules/sectioned-form/sectioned-form-section.component.js.map +1 -1
  5. package/esm2015/lib/modules/sectioned-form/sectioned-form.component.js +3 -3
  6. package/esm2015/lib/modules/sectioned-form/sectioned-form.component.js.map +1 -1
  7. package/esm2015/lib/modules/sectioned-form/sectioned-form.module.js +4 -4
  8. package/esm2015/lib/modules/sectioned-form/sectioned-form.module.js.map +1 -1
  9. package/esm2015/lib/modules/shared/sky-tabs-resources.module.js +1 -1
  10. package/esm2015/lib/modules/shared/sky-tabs-resources.module.js.map +1 -1
  11. package/esm2015/lib/modules/tabs/tab.component.js.map +1 -1
  12. package/esm2015/lib/modules/tabs/tabs.module.js.map +1 -1
  13. package/esm2015/lib/modules/tabs/tabset-nav-button.component.js +4 -4
  14. package/esm2015/lib/modules/tabs/tabset-nav-button.component.js.map +1 -1
  15. package/esm2015/lib/modules/tabs/tabset-permalink.service.js +1 -1
  16. package/esm2015/lib/modules/tabs/tabset-permalink.service.js.map +1 -1
  17. package/esm2015/lib/modules/tabs/tabset.component.js +1 -1
  18. package/esm2015/lib/modules/tabs/tabset.component.js.map +1 -1
  19. package/esm2015/lib/modules/tabs/tabset.service.js.map +1 -1
  20. package/esm2015/lib/modules/vertical-tabset/vertical-tab-media-query.service.js.map +1 -1
  21. package/esm2015/lib/modules/vertical-tabset/vertical-tab.component.js +1 -1
  22. package/esm2015/lib/modules/vertical-tabset/vertical-tab.component.js.map +1 -1
  23. package/esm2015/lib/modules/vertical-tabset/vertical-tabset-adapter.service.js.map +1 -1
  24. package/esm2015/lib/modules/vertical-tabset/vertical-tabset-group.component.js +1 -1
  25. package/esm2015/lib/modules/vertical-tabset/vertical-tabset-group.component.js.map +1 -1
  26. package/esm2015/lib/modules/vertical-tabset/vertical-tabset.component.js +3 -3
  27. package/esm2015/lib/modules/vertical-tabset/vertical-tabset.component.js.map +1 -1
  28. package/esm2015/lib/modules/vertical-tabset/vertical-tabset.module.js +4 -4
  29. package/esm2015/lib/modules/vertical-tabset/vertical-tabset.module.js.map +1 -1
  30. package/esm2015/lib/modules/vertical-tabset/vertical-tabset.service.js +5 -5
  31. package/esm2015/lib/modules/vertical-tabset/vertical-tabset.service.js.map +1 -1
  32. package/esm2015/testing/tabs/tabset-fixture.js.map +1 -1
  33. package/fesm2015/skyux-tabs-testing.js.map +1 -1
  34. package/fesm2015/skyux-tabs.js +473 -473
  35. package/fesm2015/skyux-tabs.js.map +1 -1
  36. package/lib/modules/sectioned-form/sectioned-form-section.component.d.ts +2 -2
  37. package/lib/modules/sectioned-form/sectioned-form.component.d.ts +1 -1
  38. package/lib/modules/tabs/tabset.component.d.ts +2 -2
  39. package/lib/modules/vertical-tabset/vertical-tab.component.d.ts +1 -1
  40. package/lib/modules/vertical-tabset/vertical-tabset.component.d.ts +1 -1
  41. package/package.json +19 -16
@@ -1,25 +1,187 @@
1
- import * as i0 from '@angular/core';
2
- import { Injectable, EventEmitter, Component, ChangeDetectionStrategy, Input, Output, ViewChild, HostListener, NgModule, ContentChildren, ViewEncapsulation } from '@angular/core';
3
1
  import * as i2 from '@angular/common';
4
2
  import { CommonModule } from '@angular/common';
5
- import { trigger, transition, style, animate } from '@angular/animations';
6
- import { BehaviorSubject, Subject, combineLatest, race, forkJoin } from 'rxjs';
7
- import { takeUntil, take, distinctUntilChanged } from 'rxjs/operators';
3
+ import * as i0 from '@angular/core';
4
+ import { NgModule, Injectable, Component, ChangeDetectionStrategy, Input, ViewChild, HostListener, ContentChildren, EventEmitter, Output, ViewEncapsulation } from '@angular/core';
5
+ import { SkyCheckboxModule } from '@skyux/forms';
6
+ import * as i8 from '@skyux/theme';
7
+ import { SkyThemeModule } from '@skyux/theme';
8
8
  import * as i1 from '@skyux/core';
9
9
  import { SkyMediaBreakpoints, SkyMediaQueryService, SkyIdModule } from '@skyux/core';
10
10
  import * as i4 from '@skyux/indicators';
11
11
  import { SkyIconModule, SkyExpansionIndicatorModule, SkyStatusIndicatorModule } from '@skyux/indicators';
12
- import * as i8 from '@skyux/theme';
13
- import { SkyThemeModule } from '@skyux/theme';
14
12
  import * as i3 from '@skyux/i18n';
15
13
  import { getLibStringForLocale, SkyI18nModule, SKY_LIB_RESOURCES_PROVIDERS } from '@skyux/i18n';
14
+ import { BehaviorSubject, Subject, combineLatest, race, forkJoin } from 'rxjs';
15
+ import { takeUntil, take, distinctUntilChanged } from 'rxjs/operators';
16
16
  import { skyAnimationSlide } from '@skyux/animations';
17
- import { SkyCheckboxModule } from '@skyux/forms';
17
+ import { trigger, transition, style, animate } from '@angular/animations';
18
18
  import * as i1$1 from '@angular/router';
19
19
  import { RouterModule } from '@angular/router';
20
20
  import * as i4$1 from '@skyux/popovers';
21
21
  import { SkyDropdownModule } from '@skyux/popovers';
22
22
 
23
+ /**
24
+ * NOTICE: DO NOT MODIFY THIS FILE!
25
+ * The contents of this file were automatically generated by
26
+ * the 'ng generate @skyux/i18n:lib-resources-module modules/shared/sky-tabs' schematic.
27
+ * To update this file, simply rerun the command.
28
+ */
29
+ const RESOURCES = {
30
+ 'EN-US': {
31
+ skyux_tab_add: { message: 'Add tab' },
32
+ skyux_tab_close: { message: 'Close {0} tab' },
33
+ skyux_tabs_navigator_next: { message: 'Next' },
34
+ skyux_tabs_navigator_previous: { message: 'Previous' },
35
+ skyux_tab_open: { message: 'Open tab' },
36
+ skyux_vertical_tabs_show_tabs_text: { message: 'Tab list' },
37
+ },
38
+ };
39
+ class SkyTabsResourcesProvider {
40
+ getString(localeInfo, name) {
41
+ return getLibStringForLocale(RESOURCES, localeInfo.locale, name);
42
+ }
43
+ }
44
+ /**
45
+ * Import into any component library module that needs to use resource strings.
46
+ */
47
+ class SkyTabsResourcesModule {
48
+ }
49
+ SkyTabsResourcesModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyTabsResourcesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
50
+ SkyTabsResourcesModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyTabsResourcesModule, exports: [SkyI18nModule] });
51
+ SkyTabsResourcesModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyTabsResourcesModule, providers: [
52
+ {
53
+ provide: SKY_LIB_RESOURCES_PROVIDERS,
54
+ useClass: SkyTabsResourcesProvider,
55
+ multi: true,
56
+ },
57
+ ], imports: [SkyI18nModule] });
58
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyTabsResourcesModule, decorators: [{
59
+ type: NgModule,
60
+ args: [{
61
+ exports: [SkyI18nModule],
62
+ providers: [
63
+ {
64
+ provide: SKY_LIB_RESOURCES_PROVIDERS,
65
+ useClass: SkyTabsResourcesProvider,
66
+ multi: true,
67
+ },
68
+ ],
69
+ }]
70
+ }] });
71
+
72
+ /**
73
+ * @internal
74
+ */
75
+ class SkyVerticalTabMediaQueryService {
76
+ constructor() {
77
+ this.currentSubject = new BehaviorSubject(this.current);
78
+ this._current = SkyMediaBreakpoints.xs;
79
+ this.currentSubject.next(this._current);
80
+ }
81
+ get current() {
82
+ return this._current;
83
+ }
84
+ subscribe(listener) {
85
+ return this.currentSubject.subscribe({
86
+ next: (breakpoints) => {
87
+ listener(breakpoints);
88
+ },
89
+ });
90
+ }
91
+ setBreakpointForWidth(width) {
92
+ let breakpoint;
93
+ if (this.isWidthWithinBreakpiont(width, SkyMediaBreakpoints.xs)) {
94
+ breakpoint = SkyMediaBreakpoints.xs;
95
+ }
96
+ else if (this.isWidthWithinBreakpiont(width, SkyMediaBreakpoints.sm)) {
97
+ breakpoint = SkyMediaBreakpoints.sm;
98
+ }
99
+ else if (this.isWidthWithinBreakpiont(width, SkyMediaBreakpoints.md)) {
100
+ breakpoint = SkyMediaBreakpoints.md;
101
+ }
102
+ else {
103
+ breakpoint = SkyMediaBreakpoints.lg;
104
+ }
105
+ this._current = breakpoint;
106
+ this.currentSubject.next(this._current);
107
+ }
108
+ isWidthWithinBreakpiont(width, breakpoint) {
109
+ const xsBreakpointMaxPixels = 767;
110
+ const smBreakpointMinPixels = 768;
111
+ const smBreakpointMaxPixels = 991;
112
+ const mdBreakpointMinPixels = 992;
113
+ const mdBreakpointMaxPixels = 1199;
114
+ const lgBreakpointMinPixels = 1200;
115
+ switch (breakpoint) {
116
+ case SkyMediaBreakpoints.xs: {
117
+ return width <= xsBreakpointMaxPixels;
118
+ }
119
+ case SkyMediaBreakpoints.sm: {
120
+ return width >= smBreakpointMinPixels && width <= smBreakpointMaxPixels;
121
+ }
122
+ case SkyMediaBreakpoints.md: {
123
+ return width >= mdBreakpointMinPixels && width <= mdBreakpointMaxPixels;
124
+ }
125
+ default: {
126
+ return width >= lgBreakpointMinPixels;
127
+ }
128
+ }
129
+ }
130
+ destroy() {
131
+ this.currentSubject.complete();
132
+ }
133
+ }
134
+ SkyVerticalTabMediaQueryService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyVerticalTabMediaQueryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
135
+ SkyVerticalTabMediaQueryService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyVerticalTabMediaQueryService });
136
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyVerticalTabMediaQueryService, decorators: [{
137
+ type: Injectable
138
+ }], ctorParameters: function () { return []; } });
139
+
140
+ class SkyVerticalTabsetAdapterService {
141
+ constructor(rendererFactory) {
142
+ this.rendererFactory = rendererFactory;
143
+ this.renderer = this.rendererFactory.createRenderer(undefined, undefined);
144
+ }
145
+ getWidth(elementRef) {
146
+ return elementRef.nativeElement.clientWidth;
147
+ }
148
+ scrollToContentTop(element) {
149
+ element.nativeElement.scrollTop = 0;
150
+ }
151
+ setResponsiveClass(element, breakpoint) {
152
+ const nativeEl = element.nativeElement;
153
+ this.renderer.removeClass(nativeEl, 'sky-responsive-container-xs');
154
+ this.renderer.removeClass(nativeEl, 'sky-responsive-container-sm');
155
+ this.renderer.removeClass(nativeEl, 'sky-responsive-container-md');
156
+ this.renderer.removeClass(nativeEl, 'sky-responsive-container-lg');
157
+ let newClass;
158
+ switch (breakpoint) {
159
+ case SkyMediaBreakpoints.xs: {
160
+ newClass = 'sky-responsive-container-xs';
161
+ break;
162
+ }
163
+ case SkyMediaBreakpoints.sm: {
164
+ newClass = 'sky-responsive-container-sm';
165
+ break;
166
+ }
167
+ case SkyMediaBreakpoints.md: {
168
+ newClass = 'sky-responsive-container-md';
169
+ break;
170
+ }
171
+ default: {
172
+ newClass = 'sky-responsive-container-lg';
173
+ break;
174
+ }
175
+ }
176
+ this.renderer.addClass(nativeEl, newClass);
177
+ }
178
+ }
179
+ SkyVerticalTabsetAdapterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyVerticalTabsetAdapterService, deps: [{ token: i0.RendererFactory2 }], target: i0.ɵɵFactoryTarget.Injectable });
180
+ SkyVerticalTabsetAdapterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyVerticalTabsetAdapterService });
181
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyVerticalTabsetAdapterService, decorators: [{
182
+ type: Injectable
183
+ }], ctorParameters: function () { return [{ type: i0.RendererFactory2 }]; } });
184
+
23
185
  const VISIBLE_STATE = 'shown';
24
186
  const HIDDEN_STATE = 'void';
25
187
  /**
@@ -73,7 +235,7 @@ class SkyVerticalTabsetService {
73
235
  }
74
236
  destroyTab(tab) {
75
237
  var _a;
76
- let tabIndex = this.tabs.indexOf(tab);
238
+ const tabIndex = this.tabs.indexOf(tab);
77
239
  if (tabIndex === -1) {
78
240
  return;
79
241
  }
@@ -93,7 +255,7 @@ class SkyVerticalTabsetService {
93
255
  }
94
256
  // Try selecting the next tab first, and if there's no next tab then
95
257
  // try selecting the previous one.
96
- let newActiveTab = this.tabs[tabIndex] || this.tabs[tabIndex - 1];
258
+ const newActiveTab = this.tabs[tabIndex] || this.tabs[tabIndex - 1];
97
259
  /*istanbul ignore else */
98
260
  if (newActiveTab) {
99
261
  newActiveTab.activateTab();
@@ -102,7 +264,7 @@ class SkyVerticalTabsetService {
102
264
  }
103
265
  activateTab(tab) {
104
266
  // unactivate active tab
105
- let activeTab = this.tabs.find((t) => t.index === this.activeIndex);
267
+ const activeTab = this.tabs.find((t) => t.index === this.activeIndex);
106
268
  if (activeTab && activeTab.index !== tab.index) {
107
269
  activeTab.active = false;
108
270
  activeTab.tabDeactivated();
@@ -159,8 +321,8 @@ class SkyVerticalTabsetService {
159
321
  moveContent() {
160
322
  /* istanbul ignore else */
161
323
  if (this._content && !this._contentAdded) {
162
- let activeTab = this.activeTab();
163
- let activeContent = activeTab ? activeTab.tabContent : undefined;
324
+ const activeTab = this.activeTab();
325
+ const activeContent = activeTab ? activeTab.tabContent : undefined;
164
326
  if (activeContent && activeContent.nativeElement) {
165
327
  this._content.nativeElement.appendChild(activeContent.nativeElement);
166
328
  activeTab.contentRendered = true;
@@ -185,276 +347,55 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
185
347
  type: Injectable
186
348
  }], ctorParameters: function () { return [{ type: i1.SkyMediaQueryService }]; } });
187
349
 
188
- /**
189
- * Creates a container for the sectioned forms.
190
- */
191
- class SkySectionedFormComponent {
192
- constructor(tabService, changeRef) {
193
- this.tabService = tabService;
350
+ let nextId$2 = 0;
351
+ class SkyVerticalTabComponent {
352
+ constructor(adapterService, changeRef, tabsetService, verticalTabMediaQueryService) {
353
+ this.adapterService = adapterService;
194
354
  this.changeRef = changeRef;
355
+ this.tabsetService = tabsetService;
356
+ this.verticalTabMediaQueryService = verticalTabMediaQueryService;
195
357
  /**
196
- * Indicates whether the sectioned form loads section content during initialization so that it
197
- * displays content without moving around elements in the content container.
198
- * @default false
358
+ * Indicates whether the tab is active when the tabset loads.
199
359
  */
200
- this.maintainSectionContent = false;
360
+ this.active = false;
201
361
  /**
202
- * Fires when the active tab changes and emits the index of the active
203
- * section. The index is based on the section's position when the form loads.
362
+ * Indicates whether to disable the tab.
204
363
  */
205
- this.indexChanged = new EventEmitter();
364
+ this.disabled = false;
365
+ /**
366
+ * Indicates whether to indicate that the tab has an error.
367
+ * @internal This is used for sectioned forms and is not currently a supported design for pure vertical tabs.
368
+ */
369
+ this.errorIndicator = false;
370
+ /**
371
+ * Specifies an ID for the tab.
372
+ * @deprecated Now that the vertical tabs provide aria labels automatically, this input is no longer necessary.
373
+ */
374
+ this.tabId = `sky-vertical-tab-${++nextId$2}`;
206
375
  this.isMobile = false;
376
+ this._contentRendered = false;
377
+ this._mobileSubscription = new Subject();
207
378
  this._ngUnsubscribe = new Subject();
379
+ this._showTabRightArrow = false;
208
380
  }
381
+ /**
382
+ * Specifies an ARIA role for the vertical tab
383
+ * [to support accessibility](https://developer.blackbaud.com/skyux/learn/accessibility)
384
+ * by indicating how the tab functions and what it controls. For information about how
385
+ * an ARIA role indicates what an item represents on a web page, see the
386
+ * [WAI-ARIA roles model](https://www.w3.org/WAI/PF/aria/roles).
387
+ * @default "tab"
388
+ * @deprecated Any other value than `tab` could lead to a poor user experience for users with assistive technology.
389
+ * In the next major version, this property will be automatically set to `tab`.
390
+ */
209
391
  get ariaRole() {
210
- return this.isMobile ? undefined : 'tablist';
211
- }
212
- ngOnInit() {
213
- this.tabService.maintainTabContent = this.maintainSectionContent;
214
- this.tabService.indexChanged
215
- .pipe(takeUntil(this._ngUnsubscribe))
216
- .subscribe((index) => {
217
- this.indexChanged.emit(index);
218
- this.changeRef.markForCheck();
219
- });
220
- this.tabService.switchingMobile
221
- .pipe(takeUntil(this._ngUnsubscribe))
222
- .subscribe((mobile) => {
223
- this.isMobile = mobile;
224
- this.changeRef.markForCheck();
225
- });
226
- if (this.tabService.isMobile()) {
227
- this.isMobile = true;
228
- this.tabService.animationContentVisibleState = VISIBLE_STATE;
229
- this.changeRef.markForCheck();
392
+ if (this.isMobile) {
393
+ return undefined;
230
394
  }
395
+ return this._ariaRole || 'tab';
231
396
  }
232
- ngAfterViewChecked() {
233
- this.tabService.content = this.content;
234
- this.tabService.updateContent();
235
- }
236
- ngOnDestroy() {
237
- this._ngUnsubscribe.next();
238
- this._ngUnsubscribe.complete();
239
- }
240
- tabsVisible() {
241
- this.changeRef.markForCheck();
242
- return this.tabService.tabsVisible();
243
- }
244
- showTabs() {
245
- this.tabService.showTabs();
246
- this.changeRef.markForCheck();
247
- }
248
- }
249
- SkySectionedFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkySectionedFormComponent, deps: [{ token: SkyVerticalTabsetService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
250
- SkySectionedFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: SkySectionedFormComponent, selector: "sky-sectioned-form", inputs: { maintainSectionContent: "maintainSectionContent" }, outputs: { indexChanged: "indexChanged" }, providers: [SkyVerticalTabsetService], viewQueries: [{ propertyName: "content", first: true, predicate: ["skySectionSideContent"], descendants: true }], ngImport: i0, template: "<div\n aria-orientation=\"vertical\"\n class=\"sky-sectioned-form\"\n [attr.role]=\"ariaRole\"\n (window:resize)=\"tabService.updateContent()\"\n>\n <div\n *ngIf=\"maintainSectionContent || tabsVisible()\"\n class=\"sky-sectioned-form-tabs\"\n [ngClass]=\"{ 'sky-sectioned-form-tabs-hidden': !tabsVisible() }\"\n [@tabEnter]=\"tabService.animationTabsVisibleState\"\n >\n <ng-content></ng-content>\n </div>\n <div\n *ngIf=\"maintainSectionContent || tabService.contentVisible()\"\n class=\"sky-sectioned-form-content\"\n [ngClass]=\"{\n 'sky-sectioned-form-content-hidden': !tabService.contentVisible()\n }\"\n [@contentEnter]=\"tabService.animationContentVisibleState\"\n #skySectionSideContent\n ></div>\n</div>\n", styles: [":host .sky-sectioned-form{display:block;max-height:none}:host .sky-sectioned-form-content{flex-basis:auto;overflow-y:visible}:host .sky-sectioned-form-tabs{flex-basis:auto;overflow-y:visible;border-right:1px solid #e2e3e4}:host-context(.sky-responsive-container-xs) .sky-sectioned-form,:host-context(.sky-responsive-container-sm) .sky-sectioned-form,:host-context(.sky-responsive-container-md) .sky-sectioned-form,:host-context(.sky-responsive-container-lg) .sky-sectioned-form{display:block;max-height:none}:host-context(.sky-responsive-container-xs) .sky-sectioned-form-content,:host-context(.sky-responsive-container-sm) .sky-sectioned-form-content,:host-context(.sky-responsive-container-md) .sky-sectioned-form-content,:host-context(.sky-responsive-container-lg) .sky-sectioned-form-content{flex-basis:auto;overflow-y:visible}:host-context(.sky-responsive-container-xs) .sky-sectioned-form-tabs,:host-context(.sky-responsive-container-sm) .sky-sectioned-form-tabs,:host-context(.sky-responsive-container-md) .sky-sectioned-form-tabs,:host-context(.sky-responsive-container-lg) .sky-sectioned-form-tabs{flex-basis:auto;overflow-y:visible;border-right:1px solid #e2e3e4}@media (min-width: 768px){:host .sky-sectioned-form{display:flex;max-height:100%}:host .sky-sectioned-form-content{flex-basis:70%;margin:15px;overflow-y:auto}:host .sky-sectioned-form-tabs{flex-basis:30%;overflow-y:auto}}:host-context(.sky-responsive-container-sm) .sky-sectioned-form,:host-context(.sky-responsive-container-md) .sky-sectioned-form,:host-context(.sky-responsive-container-lg) .sky-sectioned-form{display:flex;max-height:100%}:host-context(.sky-responsive-container-sm) .sky-sectioned-form-content,:host-context(.sky-responsive-container-md) .sky-sectioned-form-content,:host-context(.sky-responsive-container-lg) .sky-sectioned-form-content{flex-basis:70%;margin:15px;overflow-y:auto}:host-context(.sky-responsive-container-sm) .sky-sectioned-form-tabs,:host-context(.sky-responsive-container-md) .sky-sectioned-form-tabs,:host-context(.sky-responsive-container-lg) .sky-sectioned-form-tabs{flex-basis:30%;overflow-y:auto}.sky-sectioned-form-tabs-hidden{display:none}.sky-sectioned-form-content-hidden{display:none}:host-context(.sky-theme-modern) .sky-sectioned-form-content{margin:15px}:host-context(.sky-theme-modern) .sky-sectioned-form-tabs{border-right:1px solid #d2d2d2}@media (min-width: 768px){:host-context(.sky-theme-modern) :host .sky-sectioned-form-content{margin:20px 30px}}:host-context(.sky-theme-modern) :host-context(.sky-responsive-container-sm) .sky-sectioned-form-content,:host-context(.sky-theme-modern) :host-context(.sky-responsive-container-md) .sky-sectioned-form-content,:host-context(.sky-theme-modern) :host-context(.sky-responsive-container-lg) .sky-sectioned-form-content{margin:20px 30px}.sky-theme-modern .sky-sectioned-form-content{margin:15px}.sky-theme-modern .sky-sectioned-form-tabs{border-right:1px solid #d2d2d2}@media (min-width: 768px){.sky-theme-modern :host .sky-sectioned-form-content{margin:20px 30px}}.sky-theme-modern :host-context(.sky-responsive-container-sm) .sky-sectioned-form-content,.sky-theme-modern :host-context(.sky-responsive-container-md) .sky-sectioned-form-content,.sky-theme-modern :host-context(.sky-responsive-container-lg) .sky-sectioned-form-content{margin:20px 30px}\n"], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], animations: [
251
- trigger('tabEnter', [
252
- transition(`${HIDDEN_STATE} => ${VISIBLE_STATE}`, [
253
- style({ transform: 'translate(-100%)' }),
254
- animate('150ms ease-in'),
255
- ]),
256
- ]),
257
- trigger('contentEnter', [
258
- transition(`${HIDDEN_STATE} => ${VISIBLE_STATE}`, [
259
- style({ transform: 'translate(100%)' }),
260
- animate('150ms ease-in'),
261
- ]),
262
- ]),
263
- ], changeDetection: i0.ChangeDetectionStrategy.OnPush });
264
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkySectionedFormComponent, decorators: [{
265
- type: Component,
266
- args: [{
267
- selector: 'sky-sectioned-form',
268
- templateUrl: './sectioned-form.component.html',
269
- styleUrls: ['./sectioned-form.component.scss'],
270
- providers: [SkyVerticalTabsetService],
271
- changeDetection: ChangeDetectionStrategy.OnPush,
272
- animations: [
273
- trigger('tabEnter', [
274
- transition(`${HIDDEN_STATE} => ${VISIBLE_STATE}`, [
275
- style({ transform: 'translate(-100%)' }),
276
- animate('150ms ease-in'),
277
- ]),
278
- ]),
279
- trigger('contentEnter', [
280
- transition(`${HIDDEN_STATE} => ${VISIBLE_STATE}`, [
281
- style({ transform: 'translate(100%)' }),
282
- animate('150ms ease-in'),
283
- ]),
284
- ]),
285
- ],
286
- }]
287
- }], ctorParameters: function () { return [{ type: SkyVerticalTabsetService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { maintainSectionContent: [{
288
- type: Input
289
- }], indexChanged: [{
290
- type: Output
291
- }], content: [{
292
- type: ViewChild,
293
- args: ['skySectionSideContent']
294
- }] } });
295
-
296
- /**
297
- * @internal
298
- */
299
- class SkyVerticalTabMediaQueryService {
300
- constructor() {
301
- this.currentSubject = new BehaviorSubject(this.current);
302
- this._current = SkyMediaBreakpoints.xs;
303
- this.currentSubject.next(this._current);
304
- }
305
- get current() {
306
- return this._current;
307
- }
308
- subscribe(listener) {
309
- return this.currentSubject.subscribe({
310
- next: (breakpoints) => {
311
- listener(breakpoints);
312
- },
313
- });
314
- }
315
- setBreakpointForWidth(width) {
316
- let breakpoint;
317
- if (this.isWidthWithinBreakpiont(width, SkyMediaBreakpoints.xs)) {
318
- breakpoint = SkyMediaBreakpoints.xs;
319
- }
320
- else if (this.isWidthWithinBreakpiont(width, SkyMediaBreakpoints.sm)) {
321
- breakpoint = SkyMediaBreakpoints.sm;
322
- }
323
- else if (this.isWidthWithinBreakpiont(width, SkyMediaBreakpoints.md)) {
324
- breakpoint = SkyMediaBreakpoints.md;
325
- }
326
- else {
327
- breakpoint = SkyMediaBreakpoints.lg;
328
- }
329
- this._current = breakpoint;
330
- this.currentSubject.next(this._current);
331
- }
332
- isWidthWithinBreakpiont(width, breakpoint) {
333
- const xsBreakpointMaxPixels = 767;
334
- const smBreakpointMinPixels = 768;
335
- const smBreakpointMaxPixels = 991;
336
- const mdBreakpointMinPixels = 992;
337
- const mdBreakpointMaxPixels = 1199;
338
- const lgBreakpointMinPixels = 1200;
339
- switch (breakpoint) {
340
- case SkyMediaBreakpoints.xs: {
341
- return width <= xsBreakpointMaxPixels;
342
- }
343
- case SkyMediaBreakpoints.sm: {
344
- return width >= smBreakpointMinPixels && width <= smBreakpointMaxPixels;
345
- }
346
- case SkyMediaBreakpoints.md: {
347
- return width >= mdBreakpointMinPixels && width <= mdBreakpointMaxPixels;
348
- }
349
- default: {
350
- return width >= lgBreakpointMinPixels;
351
- }
352
- }
353
- }
354
- destroy() {
355
- this.currentSubject.complete();
356
- }
357
- }
358
- SkyVerticalTabMediaQueryService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyVerticalTabMediaQueryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
359
- SkyVerticalTabMediaQueryService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyVerticalTabMediaQueryService });
360
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyVerticalTabMediaQueryService, decorators: [{
361
- type: Injectable
362
- }], ctorParameters: function () { return []; } });
363
-
364
- class SkyVerticalTabsetAdapterService {
365
- constructor(rendererFactory) {
366
- this.rendererFactory = rendererFactory;
367
- this.renderer = this.rendererFactory.createRenderer(undefined, undefined);
368
- }
369
- getWidth(elementRef) {
370
- return elementRef.nativeElement.clientWidth;
371
- }
372
- scrollToContentTop(element) {
373
- element.nativeElement.scrollTop = 0;
374
- }
375
- setResponsiveClass(element, breakpoint) {
376
- const nativeEl = element.nativeElement;
377
- this.renderer.removeClass(nativeEl, 'sky-responsive-container-xs');
378
- this.renderer.removeClass(nativeEl, 'sky-responsive-container-sm');
379
- this.renderer.removeClass(nativeEl, 'sky-responsive-container-md');
380
- this.renderer.removeClass(nativeEl, 'sky-responsive-container-lg');
381
- let newClass;
382
- switch (breakpoint) {
383
- case SkyMediaBreakpoints.xs: {
384
- newClass = 'sky-responsive-container-xs';
385
- break;
386
- }
387
- case SkyMediaBreakpoints.sm: {
388
- newClass = 'sky-responsive-container-sm';
389
- break;
390
- }
391
- case SkyMediaBreakpoints.md: {
392
- newClass = 'sky-responsive-container-md';
393
- break;
394
- }
395
- default: {
396
- newClass = 'sky-responsive-container-lg';
397
- break;
398
- }
399
- }
400
- this.renderer.addClass(nativeEl, newClass);
401
- }
402
- }
403
- SkyVerticalTabsetAdapterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyVerticalTabsetAdapterService, deps: [{ token: i0.RendererFactory2 }], target: i0.ɵɵFactoryTarget.Injectable });
404
- SkyVerticalTabsetAdapterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyVerticalTabsetAdapterService });
405
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyVerticalTabsetAdapterService, decorators: [{
406
- type: Injectable
407
- }], ctorParameters: function () { return [{ type: i0.RendererFactory2 }]; } });
408
-
409
- let nextId$2 = 0;
410
- class SkyVerticalTabComponent {
411
- constructor(adapterService, changeRef, tabsetService, verticalTabMediaQueryService) {
412
- this.adapterService = adapterService;
413
- this.changeRef = changeRef;
414
- this.tabsetService = tabsetService;
415
- this.verticalTabMediaQueryService = verticalTabMediaQueryService;
416
- /**
417
- * Indicates whether the tab is active when the tabset loads.
418
- */
419
- this.active = false;
420
- /**
421
- * Indicates whether to disable the tab.
422
- */
423
- this.disabled = false;
424
- /**
425
- * Indicates whether to indicate that the tab has an error.
426
- * @internal This is used for sectioned forms and is not currently a supported design for pure vertical tabs.
427
- */
428
- this.errorIndicator = false;
429
- /**
430
- * Specifies an ID for the tab.
431
- * @deprecated Now that the vertical tabs provide aria labels automatically, this input is no longer necessary.
432
- */
433
- this.tabId = `sky-vertical-tab-${++nextId$2}`;
434
- this.isMobile = false;
435
- this._contentRendered = false;
436
- this._mobileSubscription = new Subject();
437
- this._ngUnsubscribe = new Subject();
438
- this._showTabRightArrow = false;
439
- }
440
- /**
441
- * Specifies an ARIA role for the vertical tab
442
- * [to support accessibility](https://developer.blackbaud.com/skyux/learn/accessibility)
443
- * by indicating how the tab functions and what it controls. For information about how
444
- * an ARIA role indicates what an item represents on a web page, see the
445
- * [WAI-ARIA roles model](https://www.w3.org/WAI/PF/aria/roles).
446
- * @default "tab"
447
- * @deprecated Any other value than `tab` could lead to a poor user experience for users with assistive technology.
448
- * In the next major version, this property will be automatically set to `tab`.
449
- */
450
- get ariaRole() {
451
- if (this.isMobile) {
452
- return undefined;
453
- }
454
- return this._ariaRole || 'tab';
455
- }
456
- set ariaRole(value) {
457
- this._ariaRole = value;
397
+ set ariaRole(value) {
398
+ this._ariaRole = value;
458
399
  }
459
400
  /**
460
401
  * Indicates whether to display a chevron-right icon in the righthand side of the tab.
@@ -595,143 +536,84 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
595
536
  args: ['window:resize']
596
537
  }] } });
597
538
 
598
- class SkySectionedFormService {
599
- constructor() {
600
- /**
601
- * @internal
602
- */
603
- this.invalidChange = new BehaviorSubject(undefined);
604
- /**
605
- * @internal
606
- */
607
- this.requiredChange = new BehaviorSubject(undefined);
539
+ class SkyVerticalTabsetGroupComponent {
540
+ constructor(tabService, changeRef) {
541
+ this.tabService = tabService;
542
+ this.changeRef = changeRef;
543
+ this.ngUnsubscribe = new Subject();
544
+ this.openBeforeTabsHidden = false;
545
+ this._open = false;
546
+ this.tabClicked = () => {
547
+ this.changeRef.markForCheck();
548
+ };
549
+ this.tabsHidden = () => {
550
+ // this fixes an animation bug with ngIf when the parent component goes from visible to hidden
551
+ this.openBeforeTabsHidden = this.open;
552
+ this.open = false;
553
+ this.changeRef.markForCheck();
554
+ };
555
+ this.tabsShown = () => {
556
+ this.open = this.openBeforeTabsHidden;
557
+ this.changeRef.markForCheck();
558
+ };
608
559
  }
609
560
  /**
610
- * Sets the current section's invalid state based on the `isInvalid` parameter.
611
- * This method is used within a `sky-sectioned-form-section` element.
561
+ * Indicates whether the collapsible group is expanded.
562
+ * @default false
612
563
  */
613
- invalidFieldChanged(isInvalid) {
614
- this.invalidChange.next(isInvalid);
564
+ set open(value) {
565
+ this._open = value;
615
566
  }
616
- /**
617
- * Sets the current section's required state based on the `isRequired` parameter.
618
- * This method is used within a `sky-sectioned-form-section` element.
619
- */
620
- requiredFieldChanged(isRequired) {
621
- this.requiredChange.next(isRequired);
622
- }
623
- }
624
- SkySectionedFormService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkySectionedFormService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
625
- SkySectionedFormService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkySectionedFormService });
626
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkySectionedFormService, decorators: [{
627
- type: Injectable
628
- }] });
629
-
630
- let nextId$1 = 0;
631
- /**
632
- * Creates an individual form to display as a section within the sectioned form.
633
- */
634
- class SkySectionedFormSectionComponent {
635
- constructor(sectionedFormService, tabsetService, changeRef) {
636
- this.sectionedFormService = sectionedFormService;
637
- this.tabsetService = tabsetService;
638
- this.changeRef = changeRef;
639
- this.sectionTabId = `sky-sectioned-form-tab-${++nextId$1}`;
640
- this.sectionContentId = `sky-sectioned-form-section-${++nextId$1}`;
641
- /**
642
- * Indicates whether the section is active when the form loads.
643
- * @default false
644
- */
645
- this.active = false;
646
- this._ngUnsubscribe = new Subject();
567
+ get open() {
568
+ return !this.disabled && this._open;
647
569
  }
648
570
  ngOnInit() {
649
- this.changeRef.detectChanges();
650
- this.tabsetService.switchingMobile.subscribe((mobile) => {
651
- this.changeRef.detectChanges();
652
- });
653
- this.sectionedFormService.requiredChange
654
- .pipe(takeUntil(this._ngUnsubscribe))
655
- .subscribe((required) => (this.fieldRequired = required));
656
- this.sectionedFormService.invalidChange
657
- .pipe(takeUntil(this._ngUnsubscribe))
658
- .subscribe((invalid) => (this.fieldInvalid = invalid));
571
+ this.tabService.hidingTabs
572
+ .pipe(takeUntil(this.ngUnsubscribe))
573
+ .subscribe(this.tabsHidden);
574
+ this.tabService.showingTabs
575
+ .pipe(takeUntil(this.ngUnsubscribe))
576
+ .subscribe(this.tabsShown);
577
+ this.tabService.tabClicked
578
+ .pipe(takeUntil(this.ngUnsubscribe))
579
+ .subscribe(this.tabClicked);
659
580
  }
660
581
  ngOnDestroy() {
661
- this._ngUnsubscribe.next();
662
- this._ngUnsubscribe.complete();
582
+ this.ngUnsubscribe.next();
583
+ this.ngUnsubscribe.complete();
584
+ }
585
+ toggleMenuOpen() {
586
+ if (!this.disabled) {
587
+ this.open = !this.open;
588
+ }
589
+ this.changeRef.markForCheck();
590
+ }
591
+ subMenuOpen() {
592
+ return this.tabs && this.tabs.find((t) => t.active) !== undefined;
663
593
  }
664
594
  }
665
- SkySectionedFormSectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkySectionedFormSectionComponent, deps: [{ token: SkySectionedFormService }, { token: SkyVerticalTabsetService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
666
- SkySectionedFormSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: SkySectionedFormSectionComponent, selector: "sky-sectioned-form-section", inputs: { heading: "heading", itemCount: "itemCount", active: "active" }, providers: [SkySectionedFormService], viewQueries: [{ propertyName: "tab", first: true, predicate: SkyVerticalTabComponent, descendants: true }], ngImport: i0, template: "<sky-vertical-tab\n [active]=\"active\"\n [errorIndicator]=\"fieldInvalid\"\n [ngClass]=\"{\n 'sky-tab-field-required': fieldRequired\n }\"\n [showTabRightArrow]=\"true\"\n [tabHeaderCount]=\"itemCount\"\n [tabHeading]=\"heading\"\n [tabId]=\"sectionTabId\"\n>\n <ng-content></ng-content>\n</sky-vertical-tab>\n", styles: [":host .sky-tab-field-required ::ng-deep .sky-vertical-tab-heading:after{content:\"*\";color:#ef4044;padding-left:5px}\n"], components: [{ type: SkyVerticalTabComponent, selector: "sky-vertical-tab", inputs: ["active", "ariaControls", "ariaRole", "disabled", "errorIndicator", "tabHeaderCount", "tabHeading", "showTabRightArrow", "tabId"] }], directives: [{ type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
667
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkySectionedFormSectionComponent, decorators: [{
595
+ SkyVerticalTabsetGroupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyVerticalTabsetGroupComponent, deps: [{ token: SkyVerticalTabsetService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
596
+ SkyVerticalTabsetGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: SkyVerticalTabsetGroupComponent, selector: "sky-vertical-tabset-group", inputs: { disabled: "disabled", groupHeading: "groupHeading", open: "open" }, queries: [{ propertyName: "tabs", predicate: SkyVerticalTabComponent }], ngImport: i0, template: "<div class=\"sky-vertical-tabset-group\">\n <!-- [ngClass] includes font classes for both modern and default styles -->\n <div\n class=\"sky-vertical-tabset-group-header\"\n [ngClass]=\"{\n 'sky-vertical-tabset-group-header-sub-open sky-font-emphasized sky-emphasized':\n subMenuOpen(),\n 'sky-font-deemphasized': disabled,\n 'sky-deemphasized': disabled,\n 'sky-vertical-tabset-disabled': disabled\n }\"\n [tabIndex]=\"-1\"\n >\n <button\n class=\"sky-padding-even-default\"\n type=\"button\"\n skyId\n [attr.aria-controls]=\"groupContent.id\"\n [attr.aria-expanded]=\"open\"\n (click)=\"toggleMenuOpen()\"\n #groupHeadingButton\n >\n {{ groupHeading }}\n <sky-expansion-indicator\n class=\"sky-vertical-tabset-group-expansion-indicator\"\n [direction]=\"open ? 'up' : 'down'\"\n >\n </sky-expansion-indicator>\n </button>\n </div>\n <div\n class=\"sky-vertical-tabset-group-content\"\n role=\"region\"\n skyId\n [attr.labelledby]=\"groupHeadingButton.id\"\n [@skyAnimationSlide]=\"open ? 'down' : 'up'\"\n #groupContent\n >\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [".sky-vertical-tabset-group{border-bottom:1px solid #e2e3e4;margin:5px 0 5px 5px}.sky-vertical-tabset-group-header button{cursor:pointer;display:flex;justify-content:space-between;border:none;width:100%;text-align:left;background:none}.sky-vertical-tabset-group-content{overflow:hidden;border-top:1px solid #e2e3e4}:host ::ng-deep .sky-vertical-tabset-group-expansion-indicator>button{font-size:14px!important}.sky-vertical-tabset-disabled{cursor:not-allowed;pointer-events:none}:host-context(.sky-theme-modern) .sky-vertical-tabset-group{border:none;margin:10px 0}:host-context(.sky-theme-modern) .sky-vertical-tabset-group-content{border:none;padding-left:25px}:host-context(.sky-theme-modern) .sky-vertical-tabset-group-header{position:relative}:host-context(.sky-theme-modern) .sky-vertical-tabset-group-expansion-indicator{position:absolute;top:6px;right:5px}.sky-theme-modern .sky-vertical-tabset-group{border:none;margin:10px 0}.sky-theme-modern .sky-vertical-tabset-group-content{border:none;padding-left:25px}.sky-theme-modern .sky-vertical-tabset-group-header{position:relative}.sky-theme-modern .sky-vertical-tabset-group-expansion-indicator{position:absolute;top:6px;right:5px}\n"], components: [{ type: i4.λ15, selector: "sky-expansion-indicator", inputs: ["direction"] }], directives: [{ type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.λ2, selector: "[skyId]", exportAs: ["skyId"] }], animations: [skyAnimationSlide], changeDetection: i0.ChangeDetectionStrategy.OnPush });
597
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyVerticalTabsetGroupComponent, decorators: [{
668
598
  type: Component,
669
599
  args: [{
670
- selector: 'sky-sectioned-form-section',
671
- templateUrl: './sectioned-form-section.component.html',
672
- providers: [SkySectionedFormService],
673
- styleUrls: ['./sectioned-form-section.component.scss'],
600
+ selector: 'sky-vertical-tabset-group',
601
+ templateUrl: './vertical-tabset-group.component.html',
602
+ styleUrls: ['./vertical-tabset-group.component.scss'],
603
+ changeDetection: ChangeDetectionStrategy.OnPush,
604
+ animations: [skyAnimationSlide],
674
605
  }]
675
- }], ctorParameters: function () { return [{ type: SkySectionedFormService }, { type: SkyVerticalTabsetService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { heading: [{
606
+ }], ctorParameters: function () { return [{ type: SkyVerticalTabsetService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { disabled: [{
676
607
  type: Input
677
- }], itemCount: [{
608
+ }], groupHeading: [{
678
609
  type: Input
679
- }], active: [{
610
+ }], open: [{
680
611
  type: Input
681
- }], tab: [{
682
- type: ViewChild,
612
+ }], tabs: [{
613
+ type: ContentChildren,
683
614
  args: [SkyVerticalTabComponent]
684
615
  }] } });
685
616
 
686
- /**
687
- * NOTICE: DO NOT MODIFY THIS FILE!
688
- * The contents of this file were automatically generated by
689
- * the 'ng generate @skyux/i18n:lib-resources-module modules/shared/sky-tabs' schematic.
690
- * To update this file, simply rerun the command.
691
- */
692
- const RESOURCES = {
693
- 'EN-US': {
694
- skyux_tab_add: { message: 'Add tab' },
695
- skyux_tab_close: { message: 'Close {0} tab' },
696
- skyux_tabs_navigator_next: { message: 'Next' },
697
- skyux_tabs_navigator_previous: { message: 'Previous' },
698
- skyux_tab_open: { message: 'Open tab' },
699
- skyux_vertical_tabs_show_tabs_text: { message: 'Tab list' },
700
- },
701
- };
702
- class SkyTabsResourcesProvider {
703
- getString(localeInfo, name) {
704
- return getLibStringForLocale(RESOURCES, localeInfo.locale, name);
705
- }
706
- }
707
- /**
708
- * Import into any component library module that needs to use resource strings.
709
- */
710
- class SkyTabsResourcesModule {
711
- }
712
- SkyTabsResourcesModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyTabsResourcesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
713
- SkyTabsResourcesModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyTabsResourcesModule, exports: [SkyI18nModule] });
714
- SkyTabsResourcesModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyTabsResourcesModule, providers: [
715
- {
716
- provide: SKY_LIB_RESOURCES_PROVIDERS,
717
- useClass: SkyTabsResourcesProvider,
718
- multi: true,
719
- },
720
- ], imports: [SkyI18nModule] });
721
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyTabsResourcesModule, decorators: [{
722
- type: NgModule,
723
- args: [{
724
- exports: [SkyI18nModule],
725
- providers: [
726
- {
727
- provide: SKY_LIB_RESOURCES_PROVIDERS,
728
- useClass: SkyTabsResourcesProvider,
729
- multi: true,
730
- },
731
- ],
732
- }]
733
- }] });
734
-
735
617
  class SkyVerticalTabsetComponent {
736
618
  constructor(adapterService, tabService, resources, changeRef) {
737
619
  this.adapterService = adapterService;
@@ -876,84 +758,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
876
758
  args: ['contentContainerWrapper']
877
759
  }] } });
878
760
 
879
- class SkyVerticalTabsetGroupComponent {
880
- constructor(tabService, changeRef) {
881
- this.tabService = tabService;
882
- this.changeRef = changeRef;
883
- this.ngUnsubscribe = new Subject();
884
- this.openBeforeTabsHidden = false;
885
- this._open = false;
886
- this.tabClicked = () => {
887
- this.changeRef.markForCheck();
888
- };
889
- this.tabsHidden = () => {
890
- // this fixes an animation bug with ngIf when the parent component goes from visible to hidden
891
- this.openBeforeTabsHidden = this.open;
892
- this.open = false;
893
- this.changeRef.markForCheck();
894
- };
895
- this.tabsShown = () => {
896
- this.open = this.openBeforeTabsHidden;
897
- this.changeRef.markForCheck();
898
- };
899
- }
900
- /**
901
- * Indicates whether the collapsible group is expanded.
902
- * @default false
903
- */
904
- set open(value) {
905
- this._open = value;
906
- }
907
- get open() {
908
- return !this.disabled && this._open;
909
- }
910
- ngOnInit() {
911
- this.tabService.hidingTabs
912
- .pipe(takeUntil(this.ngUnsubscribe))
913
- .subscribe(this.tabsHidden);
914
- this.tabService.showingTabs
915
- .pipe(takeUntil(this.ngUnsubscribe))
916
- .subscribe(this.tabsShown);
917
- this.tabService.tabClicked
918
- .pipe(takeUntil(this.ngUnsubscribe))
919
- .subscribe(this.tabClicked);
920
- }
921
- ngOnDestroy() {
922
- this.ngUnsubscribe.next();
923
- this.ngUnsubscribe.complete();
924
- }
925
- toggleMenuOpen() {
926
- if (!this.disabled) {
927
- this.open = !this.open;
928
- }
929
- this.changeRef.markForCheck();
930
- }
931
- subMenuOpen() {
932
- return this.tabs && this.tabs.find((t) => t.active) !== undefined;
933
- }
934
- }
935
- SkyVerticalTabsetGroupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyVerticalTabsetGroupComponent, deps: [{ token: SkyVerticalTabsetService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
936
- SkyVerticalTabsetGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: SkyVerticalTabsetGroupComponent, selector: "sky-vertical-tabset-group", inputs: { disabled: "disabled", groupHeading: "groupHeading", open: "open" }, queries: [{ propertyName: "tabs", predicate: SkyVerticalTabComponent }], ngImport: i0, template: "<div class=\"sky-vertical-tabset-group\">\n <!-- [ngClass] includes font classes for both modern and default styles -->\n <div\n class=\"sky-vertical-tabset-group-header\"\n [ngClass]=\"{\n 'sky-vertical-tabset-group-header-sub-open sky-font-emphasized sky-emphasized':\n subMenuOpen(),\n 'sky-font-deemphasized': disabled,\n 'sky-deemphasized': disabled,\n 'sky-vertical-tabset-disabled': disabled\n }\"\n [tabIndex]=\"-1\"\n >\n <button\n class=\"sky-padding-even-default\"\n type=\"button\"\n skyId\n [attr.aria-controls]=\"groupContent.id\"\n [attr.aria-expanded]=\"open\"\n (click)=\"toggleMenuOpen()\"\n #groupHeadingButton\n >\n {{ groupHeading }}\n <sky-expansion-indicator\n class=\"sky-vertical-tabset-group-expansion-indicator\"\n [direction]=\"open ? 'up' : 'down'\"\n >\n </sky-expansion-indicator>\n </button>\n </div>\n <div\n class=\"sky-vertical-tabset-group-content\"\n role=\"region\"\n skyId\n [attr.labelledby]=\"groupHeadingButton.id\"\n [@skyAnimationSlide]=\"open ? 'down' : 'up'\"\n #groupContent\n >\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [".sky-vertical-tabset-group{border-bottom:1px solid #e2e3e4;margin:5px 0 5px 5px}.sky-vertical-tabset-group-header button{cursor:pointer;display:flex;justify-content:space-between;border:none;width:100%;text-align:left;background:none}.sky-vertical-tabset-group-content{overflow:hidden;border-top:1px solid #e2e3e4}:host ::ng-deep .sky-vertical-tabset-group-expansion-indicator>button{font-size:14px!important}.sky-vertical-tabset-disabled{cursor:not-allowed;pointer-events:none}:host-context(.sky-theme-modern) .sky-vertical-tabset-group{border:none;margin:10px 0}:host-context(.sky-theme-modern) .sky-vertical-tabset-group-content{border:none;padding-left:25px}:host-context(.sky-theme-modern) .sky-vertical-tabset-group-header{position:relative}:host-context(.sky-theme-modern) .sky-vertical-tabset-group-expansion-indicator{position:absolute;top:6px;right:5px}.sky-theme-modern .sky-vertical-tabset-group{border:none;margin:10px 0}.sky-theme-modern .sky-vertical-tabset-group-content{border:none;padding-left:25px}.sky-theme-modern .sky-vertical-tabset-group-header{position:relative}.sky-theme-modern .sky-vertical-tabset-group-expansion-indicator{position:absolute;top:6px;right:5px}\n"], components: [{ type: i4.λ15, selector: "sky-expansion-indicator", inputs: ["direction"] }], directives: [{ type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.λ2, selector: "[skyId]", exportAs: ["skyId"] }], animations: [skyAnimationSlide], changeDetection: i0.ChangeDetectionStrategy.OnPush });
937
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyVerticalTabsetGroupComponent, decorators: [{
938
- type: Component,
939
- args: [{
940
- selector: 'sky-vertical-tabset-group',
941
- templateUrl: './vertical-tabset-group.component.html',
942
- styleUrls: ['./vertical-tabset-group.component.scss'],
943
- changeDetection: ChangeDetectionStrategy.OnPush,
944
- animations: [skyAnimationSlide],
945
- }]
946
- }], ctorParameters: function () { return [{ type: SkyVerticalTabsetService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { disabled: [{
947
- type: Input
948
- }], groupHeading: [{
949
- type: Input
950
- }], open: [{
951
- type: Input
952
- }], tabs: [{
953
- type: ContentChildren,
954
- args: [SkyVerticalTabComponent]
955
- }] } });
956
-
957
761
  class SkyVerticalTabsetModule {
958
762
  }
959
763
  SkyVerticalTabsetModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyVerticalTabsetModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
@@ -1003,6 +807,202 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
1003
807
  }]
1004
808
  }] });
1005
809
 
810
+ class SkySectionedFormService {
811
+ constructor() {
812
+ /**
813
+ * @internal
814
+ */
815
+ this.invalidChange = new BehaviorSubject(undefined);
816
+ /**
817
+ * @internal
818
+ */
819
+ this.requiredChange = new BehaviorSubject(undefined);
820
+ }
821
+ /**
822
+ * Sets the current section's invalid state based on the `isInvalid` parameter.
823
+ * This method is used within a `sky-sectioned-form-section` element.
824
+ */
825
+ invalidFieldChanged(isInvalid) {
826
+ this.invalidChange.next(isInvalid);
827
+ }
828
+ /**
829
+ * Sets the current section's required state based on the `isRequired` parameter.
830
+ * This method is used within a `sky-sectioned-form-section` element.
831
+ */
832
+ requiredFieldChanged(isRequired) {
833
+ this.requiredChange.next(isRequired);
834
+ }
835
+ }
836
+ SkySectionedFormService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkySectionedFormService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
837
+ SkySectionedFormService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkySectionedFormService });
838
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkySectionedFormService, decorators: [{
839
+ type: Injectable
840
+ }] });
841
+
842
+ let nextId$1 = 0;
843
+ /**
844
+ * Creates an individual form to display as a section within the sectioned form.
845
+ */
846
+ class SkySectionedFormSectionComponent {
847
+ constructor(sectionedFormService, tabsetService, changeRef) {
848
+ this.sectionedFormService = sectionedFormService;
849
+ this.tabsetService = tabsetService;
850
+ this.changeRef = changeRef;
851
+ this.sectionTabId = `sky-sectioned-form-tab-${++nextId$1}`;
852
+ this.sectionContentId = `sky-sectioned-form-section-${++nextId$1}`;
853
+ /**
854
+ * Indicates whether the section is active when the form loads.
855
+ * @default false
856
+ */
857
+ this.active = false;
858
+ this._ngUnsubscribe = new Subject();
859
+ }
860
+ ngOnInit() {
861
+ this.changeRef.detectChanges();
862
+ this.tabsetService.switchingMobile.subscribe((mobile) => {
863
+ this.changeRef.detectChanges();
864
+ });
865
+ this.sectionedFormService.requiredChange
866
+ .pipe(takeUntil(this._ngUnsubscribe))
867
+ .subscribe((required) => (this.fieldRequired = required));
868
+ this.sectionedFormService.invalidChange
869
+ .pipe(takeUntil(this._ngUnsubscribe))
870
+ .subscribe((invalid) => (this.fieldInvalid = invalid));
871
+ }
872
+ ngOnDestroy() {
873
+ this._ngUnsubscribe.next();
874
+ this._ngUnsubscribe.complete();
875
+ }
876
+ }
877
+ SkySectionedFormSectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkySectionedFormSectionComponent, deps: [{ token: SkySectionedFormService }, { token: SkyVerticalTabsetService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
878
+ SkySectionedFormSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: SkySectionedFormSectionComponent, selector: "sky-sectioned-form-section", inputs: { heading: "heading", itemCount: "itemCount", active: "active" }, providers: [SkySectionedFormService], viewQueries: [{ propertyName: "tab", first: true, predicate: SkyVerticalTabComponent, descendants: true }], ngImport: i0, template: "<sky-vertical-tab\n [active]=\"active\"\n [errorIndicator]=\"fieldInvalid\"\n [ngClass]=\"{\n 'sky-tab-field-required': fieldRequired\n }\"\n [showTabRightArrow]=\"true\"\n [tabHeaderCount]=\"itemCount\"\n [tabHeading]=\"heading\"\n [tabId]=\"sectionTabId\"\n>\n <ng-content></ng-content>\n</sky-vertical-tab>\n", styles: [":host .sky-tab-field-required ::ng-deep .sky-vertical-tab-heading:after{content:\"*\";color:#ef4044;padding-left:5px}\n"], components: [{ type: SkyVerticalTabComponent, selector: "sky-vertical-tab", inputs: ["active", "ariaControls", "ariaRole", "disabled", "errorIndicator", "tabHeaderCount", "tabHeading", "showTabRightArrow", "tabId"] }], directives: [{ type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
879
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkySectionedFormSectionComponent, decorators: [{
880
+ type: Component,
881
+ args: [{
882
+ selector: 'sky-sectioned-form-section',
883
+ templateUrl: './sectioned-form-section.component.html',
884
+ providers: [SkySectionedFormService],
885
+ styleUrls: ['./sectioned-form-section.component.scss'],
886
+ }]
887
+ }], ctorParameters: function () { return [{ type: SkySectionedFormService }, { type: SkyVerticalTabsetService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { heading: [{
888
+ type: Input
889
+ }], itemCount: [{
890
+ type: Input
891
+ }], active: [{
892
+ type: Input
893
+ }], tab: [{
894
+ type: ViewChild,
895
+ args: [SkyVerticalTabComponent]
896
+ }] } });
897
+
898
+ /**
899
+ * Creates a container for the sectioned forms.
900
+ */
901
+ class SkySectionedFormComponent {
902
+ constructor(tabService, changeRef) {
903
+ this.tabService = tabService;
904
+ this.changeRef = changeRef;
905
+ /**
906
+ * Indicates whether the sectioned form loads section content during initialization so that it
907
+ * displays content without moving around elements in the content container.
908
+ * @default false
909
+ */
910
+ this.maintainSectionContent = false;
911
+ /**
912
+ * Fires when the active tab changes and emits the index of the active
913
+ * section. The index is based on the section's position when the form loads.
914
+ */
915
+ this.indexChanged = new EventEmitter();
916
+ this.isMobile = false;
917
+ this._ngUnsubscribe = new Subject();
918
+ }
919
+ get ariaRole() {
920
+ return this.isMobile ? undefined : 'tablist';
921
+ }
922
+ ngOnInit() {
923
+ this.tabService.maintainTabContent = this.maintainSectionContent;
924
+ this.tabService.indexChanged
925
+ .pipe(takeUntil(this._ngUnsubscribe))
926
+ .subscribe((index) => {
927
+ this.indexChanged.emit(index);
928
+ this.changeRef.markForCheck();
929
+ });
930
+ this.tabService.switchingMobile
931
+ .pipe(takeUntil(this._ngUnsubscribe))
932
+ .subscribe((mobile) => {
933
+ this.isMobile = mobile;
934
+ this.changeRef.markForCheck();
935
+ });
936
+ if (this.tabService.isMobile()) {
937
+ this.isMobile = true;
938
+ this.tabService.animationContentVisibleState = VISIBLE_STATE;
939
+ this.changeRef.markForCheck();
940
+ }
941
+ }
942
+ ngAfterViewChecked() {
943
+ this.tabService.content = this.content;
944
+ this.tabService.updateContent();
945
+ }
946
+ ngOnDestroy() {
947
+ this._ngUnsubscribe.next();
948
+ this._ngUnsubscribe.complete();
949
+ }
950
+ tabsVisible() {
951
+ this.changeRef.markForCheck();
952
+ return this.tabService.tabsVisible();
953
+ }
954
+ showTabs() {
955
+ this.tabService.showTabs();
956
+ this.changeRef.markForCheck();
957
+ }
958
+ }
959
+ SkySectionedFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkySectionedFormComponent, deps: [{ token: SkyVerticalTabsetService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
960
+ SkySectionedFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: SkySectionedFormComponent, selector: "sky-sectioned-form", inputs: { maintainSectionContent: "maintainSectionContent" }, outputs: { indexChanged: "indexChanged" }, providers: [SkyVerticalTabsetService], viewQueries: [{ propertyName: "content", first: true, predicate: ["skySectionSideContent"], descendants: true }], ngImport: i0, template: "<div\n aria-orientation=\"vertical\"\n class=\"sky-sectioned-form\"\n [attr.role]=\"ariaRole\"\n (window:resize)=\"tabService.updateContent()\"\n>\n <div\n *ngIf=\"maintainSectionContent || tabsVisible()\"\n class=\"sky-sectioned-form-tabs\"\n [ngClass]=\"{ 'sky-sectioned-form-tabs-hidden': !tabsVisible() }\"\n [@tabEnter]=\"tabService.animationTabsVisibleState\"\n >\n <ng-content></ng-content>\n </div>\n <div\n *ngIf=\"maintainSectionContent || tabService.contentVisible()\"\n class=\"sky-sectioned-form-content\"\n [ngClass]=\"{\n 'sky-sectioned-form-content-hidden': !tabService.contentVisible()\n }\"\n [@contentEnter]=\"tabService.animationContentVisibleState\"\n #skySectionSideContent\n ></div>\n</div>\n", styles: [":host .sky-sectioned-form{display:block;max-height:none}:host .sky-sectioned-form-content{flex-basis:auto;overflow-y:visible}:host .sky-sectioned-form-tabs{flex-basis:auto;overflow-y:visible;border-right:1px solid #e2e3e4}:host-context(.sky-responsive-container-xs) .sky-sectioned-form,:host-context(.sky-responsive-container-sm) .sky-sectioned-form,:host-context(.sky-responsive-container-md) .sky-sectioned-form,:host-context(.sky-responsive-container-lg) .sky-sectioned-form{display:block;max-height:none}:host-context(.sky-responsive-container-xs) .sky-sectioned-form-content,:host-context(.sky-responsive-container-sm) .sky-sectioned-form-content,:host-context(.sky-responsive-container-md) .sky-sectioned-form-content,:host-context(.sky-responsive-container-lg) .sky-sectioned-form-content{flex-basis:auto;overflow-y:visible}:host-context(.sky-responsive-container-xs) .sky-sectioned-form-tabs,:host-context(.sky-responsive-container-sm) .sky-sectioned-form-tabs,:host-context(.sky-responsive-container-md) .sky-sectioned-form-tabs,:host-context(.sky-responsive-container-lg) .sky-sectioned-form-tabs{flex-basis:auto;overflow-y:visible;border-right:1px solid #e2e3e4}@media (min-width: 768px){:host .sky-sectioned-form{display:flex;max-height:100%}:host .sky-sectioned-form-content{flex-basis:70%;margin:15px;overflow-y:auto}:host .sky-sectioned-form-tabs{flex-basis:30%;overflow-y:auto}}:host-context(.sky-responsive-container-sm) .sky-sectioned-form,:host-context(.sky-responsive-container-md) .sky-sectioned-form,:host-context(.sky-responsive-container-lg) .sky-sectioned-form{display:flex;max-height:100%}:host-context(.sky-responsive-container-sm) .sky-sectioned-form-content,:host-context(.sky-responsive-container-md) .sky-sectioned-form-content,:host-context(.sky-responsive-container-lg) .sky-sectioned-form-content{flex-basis:70%;margin:15px;overflow-y:auto}:host-context(.sky-responsive-container-sm) .sky-sectioned-form-tabs,:host-context(.sky-responsive-container-md) .sky-sectioned-form-tabs,:host-context(.sky-responsive-container-lg) .sky-sectioned-form-tabs{flex-basis:30%;overflow-y:auto}.sky-sectioned-form-tabs-hidden{display:none}.sky-sectioned-form-content-hidden{display:none}:host-context(.sky-theme-modern) .sky-sectioned-form-content{margin:15px}:host-context(.sky-theme-modern) .sky-sectioned-form-tabs{border-right:1px solid #d2d2d2}@media (min-width: 768px){:host-context(.sky-theme-modern) :host .sky-sectioned-form-content{margin:20px 30px}}:host-context(.sky-theme-modern) :host-context(.sky-responsive-container-sm) .sky-sectioned-form-content,:host-context(.sky-theme-modern) :host-context(.sky-responsive-container-md) .sky-sectioned-form-content,:host-context(.sky-theme-modern) :host-context(.sky-responsive-container-lg) .sky-sectioned-form-content{margin:20px 30px}.sky-theme-modern .sky-sectioned-form-content{margin:15px}.sky-theme-modern .sky-sectioned-form-tabs{border-right:1px solid #d2d2d2}@media (min-width: 768px){.sky-theme-modern :host .sky-sectioned-form-content{margin:20px 30px}}.sky-theme-modern :host-context(.sky-responsive-container-sm) .sky-sectioned-form-content,.sky-theme-modern :host-context(.sky-responsive-container-md) .sky-sectioned-form-content,.sky-theme-modern :host-context(.sky-responsive-container-lg) .sky-sectioned-form-content{margin:20px 30px}\n"], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], animations: [
961
+ trigger('tabEnter', [
962
+ transition(`${HIDDEN_STATE} => ${VISIBLE_STATE}`, [
963
+ style({ transform: 'translate(-100%)' }),
964
+ animate('150ms ease-in'),
965
+ ]),
966
+ ]),
967
+ trigger('contentEnter', [
968
+ transition(`${HIDDEN_STATE} => ${VISIBLE_STATE}`, [
969
+ style({ transform: 'translate(100%)' }),
970
+ animate('150ms ease-in'),
971
+ ]),
972
+ ]),
973
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush });
974
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkySectionedFormComponent, decorators: [{
975
+ type: Component,
976
+ args: [{
977
+ selector: 'sky-sectioned-form',
978
+ templateUrl: './sectioned-form.component.html',
979
+ styleUrls: ['./sectioned-form.component.scss'],
980
+ providers: [SkyVerticalTabsetService],
981
+ changeDetection: ChangeDetectionStrategy.OnPush,
982
+ animations: [
983
+ trigger('tabEnter', [
984
+ transition(`${HIDDEN_STATE} => ${VISIBLE_STATE}`, [
985
+ style({ transform: 'translate(-100%)' }),
986
+ animate('150ms ease-in'),
987
+ ]),
988
+ ]),
989
+ trigger('contentEnter', [
990
+ transition(`${HIDDEN_STATE} => ${VISIBLE_STATE}`, [
991
+ style({ transform: 'translate(100%)' }),
992
+ animate('150ms ease-in'),
993
+ ]),
994
+ ]),
995
+ ],
996
+ }]
997
+ }], ctorParameters: function () { return [{ type: SkyVerticalTabsetService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { maintainSectionContent: [{
998
+ type: Input
999
+ }], indexChanged: [{
1000
+ type: Output
1001
+ }], content: [{
1002
+ type: ViewChild,
1003
+ args: ['skySectionSideContent']
1004
+ }] } });
1005
+
1006
1006
  class SkySectionedFormModule {
1007
1007
  }
1008
1008
  SkySectionedFormModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkySectionedFormModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
@@ -1190,7 +1190,7 @@ class SkyTabsetPermalinkService {
1190
1190
  const sanitized = value
1191
1191
  .toLowerCase()
1192
1192
  // Remove special characters.
1193
- .replace(/[\_\~\`\@\!\#\$\%\^\&\*\(\)\[\]\{\}\;\:\'\/\\\<\>\,\.\?\=\+\|"]/g, '')
1193
+ .replace(/[_~`@!#$%^&*()[\]{};:'/\\<>,.?=+|"]/g, '')
1194
1194
  // Replace space characters with a dash.
1195
1195
  .replace(/\s/g, '-')
1196
1196
  // Remove any double-dashes.
@@ -1946,17 +1946,17 @@ class SkyTabsetNavButtonComponent {
1946
1946
  return selectedTab;
1947
1947
  }
1948
1948
  get nextTab() {
1949
- let selectedTab = this.selectedTab;
1949
+ const selectedTab = this.selectedTab;
1950
1950
  if (selectedTab) {
1951
- let tabs = this.tabset.tabs.toArray();
1951
+ const tabs = this.tabset.tabs.toArray();
1952
1952
  return tabs[tabs.indexOf(selectedTab) + 1];
1953
1953
  }
1954
1954
  return undefined;
1955
1955
  }
1956
1956
  get previousTab() {
1957
- let selectedTab = this.selectedTab;
1957
+ const selectedTab = this.selectedTab;
1958
1958
  if (selectedTab) {
1959
- let tabs = this.tabset.tabs.toArray();
1959
+ const tabs = this.tabset.tabs.toArray();
1960
1960
  return tabs[tabs.indexOf(selectedTab) - 1];
1961
1961
  }
1962
1962
  return undefined;