@skyux/lists 8.7.2 → 9.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/documentation.json +120 -120
  2. package/esm2022/lib/modules/filter/filter-button.component.mjs +73 -0
  3. package/{esm2020 → esm2022}/lib/modules/filter/filter-inline-item.component.mjs +4 -4
  4. package/{esm2020 → esm2022}/lib/modules/filter/filter-inline.component.mjs +4 -4
  5. package/esm2022/lib/modules/filter/filter-summary-item.component.mjs +52 -0
  6. package/{esm2020 → esm2022}/lib/modules/filter/filter-summary.component.mjs +4 -4
  7. package/{esm2020 → esm2022}/lib/modules/filter/filter.module.mjs +21 -21
  8. package/esm2022/lib/modules/infinite-scroll/infinite-scroll-dom-adapter.service.mjs +82 -0
  9. package/esm2022/lib/modules/infinite-scroll/infinite-scroll.component.mjs +116 -0
  10. package/{esm2020 → esm2022}/lib/modules/infinite-scroll/infinite-scroll.module.mjs +5 -5
  11. package/esm2022/lib/modules/paging/paging.component.mjs +122 -0
  12. package/{esm2020 → esm2022}/lib/modules/paging/paging.module.mjs +11 -11
  13. package/esm2022/lib/modules/repeater/repeater-adapter.service.mjs +75 -0
  14. package/{esm2020 → esm2022}/lib/modules/repeater/repeater-auto-scroll.service.mjs +4 -4
  15. package/{esm2020 → esm2022}/lib/modules/repeater/repeater-item-content.component.mjs +4 -4
  16. package/{esm2020 → esm2022}/lib/modules/repeater/repeater-item-context-menu.component.mjs +4 -4
  17. package/{esm2020 → esm2022}/lib/modules/repeater/repeater-item-title.component.mjs +4 -4
  18. package/esm2022/lib/modules/repeater/repeater-item.component.mjs +504 -0
  19. package/esm2022/lib/modules/repeater/repeater.component.mjs +373 -0
  20. package/{esm2020 → esm2022}/lib/modules/repeater/repeater.module.mjs +27 -27
  21. package/esm2022/lib/modules/repeater/repeater.service.mjs +86 -0
  22. package/{esm2020 → esm2022}/lib/modules/shared/sky-lists-resources.module.mjs +11 -11
  23. package/esm2022/lib/modules/sort/sort-item.component.mjs +66 -0
  24. package/{esm2020 → esm2022}/lib/modules/sort/sort-menu-heading.component.mjs +4 -4
  25. package/{esm2020 → esm2022}/lib/modules/sort/sort.component.mjs +4 -4
  26. package/{esm2020 → esm2022}/lib/modules/sort/sort.module.mjs +17 -17
  27. package/{esm2020 → esm2022}/lib/modules/sort/sort.service.mjs +4 -4
  28. package/esm2022/testing/filter/filter-fixture-button.mjs +53 -0
  29. package/esm2022/testing/filter/filter-fixture-summary.mjs +31 -0
  30. package/{esm2020 → esm2022}/testing/filter/filter-testing.module.mjs +5 -5
  31. package/esm2022/testing/infinite-scroll/infinite-scroll-fixture.mjs +31 -0
  32. package/esm2022/testing/infinite-scroll/infinite-scroll-harness.mjs +49 -0
  33. package/{esm2020 → esm2022}/testing/infinite-scroll/infinite-scroll-testing.module.mjs +5 -5
  34. package/esm2022/testing/paging/paging-fixture.mjs +95 -0
  35. package/{esm2020 → esm2022}/testing/paging/paging-testing.module.mjs +5 -5
  36. package/esm2022/testing/repeater/repeater-harness.mjs +25 -0
  37. package/esm2022/testing/repeater/repeater-item-harness.mjs +167 -0
  38. package/esm2022/testing/sort/sort-fixture.mjs +149 -0
  39. package/{esm2020 → esm2022}/testing/sort/sort-testing.module.mjs +5 -5
  40. package/fesm2022/skyux-lists-testing.mjs +664 -0
  41. package/{fesm2020 → fesm2022}/skyux-lists-testing.mjs.map +1 -1
  42. package/fesm2022/skyux-lists.mjs +1913 -0
  43. package/{fesm2020 → fesm2022}/skyux-lists.mjs.map +1 -1
  44. package/lib/modules/filter/filter-button.component.d.ts +1 -1
  45. package/lib/modules/filter/filter-summary-item.component.d.ts +1 -1
  46. package/lib/modules/infinite-scroll/infinite-scroll.component.d.ts +1 -1
  47. package/lib/modules/paging/paging.component.d.ts +1 -1
  48. package/lib/modules/repeater/repeater-item.component.d.ts +1 -1
  49. package/lib/modules/repeater/repeater.component.d.ts +1 -1
  50. package/lib/modules/sort/sort-item.component.d.ts +1 -1
  51. package/lib/modules/sort/sort.component.d.ts +1 -1
  52. package/package.json +22 -30
  53. package/esm2020/lib/modules/filter/filter-button.component.mjs +0 -75
  54. package/esm2020/lib/modules/filter/filter-summary-item.component.mjs +0 -54
  55. package/esm2020/lib/modules/infinite-scroll/infinite-scroll-dom-adapter.service.mjs +0 -84
  56. package/esm2020/lib/modules/infinite-scroll/infinite-scroll.component.mjs +0 -116
  57. package/esm2020/lib/modules/paging/paging.component.mjs +0 -123
  58. package/esm2020/lib/modules/repeater/repeater-adapter.service.mjs +0 -73
  59. package/esm2020/lib/modules/repeater/repeater-item.component.mjs +0 -492
  60. package/esm2020/lib/modules/repeater/repeater.component.mjs +0 -357
  61. package/esm2020/lib/modules/repeater/repeater.service.mjs +0 -88
  62. package/esm2020/lib/modules/sort/sort-item.component.mjs +0 -69
  63. package/esm2020/testing/filter/filter-fixture-button.mjs +0 -55
  64. package/esm2020/testing/filter/filter-fixture-summary.mjs +0 -34
  65. package/esm2020/testing/infinite-scroll/infinite-scroll-fixture.mjs +0 -34
  66. package/esm2020/testing/infinite-scroll/infinite-scroll-harness.mjs +0 -55
  67. package/esm2020/testing/paging/paging-fixture.mjs +0 -91
  68. package/esm2020/testing/repeater/repeater-harness.mjs +0 -25
  69. package/esm2020/testing/repeater/repeater-item-harness.mjs +0 -173
  70. package/esm2020/testing/sort/sort-fixture.mjs +0 -148
  71. package/fesm2015/skyux-lists-testing.mjs +0 -747
  72. package/fesm2015/skyux-lists-testing.mjs.map +0 -1
  73. package/fesm2015/skyux-lists.mjs +0 -1894
  74. package/fesm2015/skyux-lists.mjs.map +0 -1
  75. package/fesm2020/skyux-lists-testing.mjs +0 -673
  76. package/fesm2020/skyux-lists.mjs +0 -1886
  77. /package/{esm2020 → esm2022}/index.mjs +0 -0
  78. /package/{esm2020 → esm2022}/lib/modules/repeater/repeater-auto-scroll-options.mjs +0 -0
  79. /package/{esm2020 → esm2022}/lib/modules/repeater/repeater-auto-scroller.mjs +0 -0
  80. /package/{esm2020 → esm2022}/lib/modules/repeater/repeater-expand-mode-type.mjs +0 -0
  81. /package/{esm2020 → esm2022}/lib/modules/repeater/repeater-item-roles.type.mjs +0 -0
  82. /package/{esm2020 → esm2022}/lib/modules/repeater/repeater-role.type.mjs +0 -0
  83. /package/{esm2020 → esm2022}/skyux-lists.mjs +0 -0
  84. /package/{esm2020 → esm2022}/testing/filter/lists-filter-fixture-button.mjs +0 -0
  85. /package/{esm2020 → esm2022}/testing/infinite-scroll/infinite-scroll-harness-filters.mjs +0 -0
  86. /package/{esm2020 → esm2022}/testing/paging/paging-fixture-button.mjs +0 -0
  87. /package/{esm2020 → esm2022}/testing/public-api.mjs +0 -0
  88. /package/{esm2020 → esm2022}/testing/repeater/repeater-harness-filters.mjs +0 -0
  89. /package/{esm2020 → esm2022}/testing/repeater/repeater-item-harness-filters.mjs +0 -0
  90. /package/{esm2020 → esm2022}/testing/skyux-lists-testing.mjs +0 -0
  91. /package/{esm2020 → esm2022}/testing/sort/sort-fixture-menu-item.mjs +0 -0
  92. /package/{esm2020 → esm2022}/testing/sort/sort-fixture-menu.mjs +0 -0
@@ -0,0 +1,1913 @@
1
+ import * as i1 from '@angular/common';
2
+ import { CommonModule } from '@angular/common';
3
+ import * as i0 from '@angular/core';
4
+ import { NgModule, EventEmitter, Component, ChangeDetectionStrategy, Input, Output, Injectable, ElementRef, ViewEncapsulation, ContentChild, HostBinding, ViewChild, ContentChildren, HostListener, inject, ChangeDetectorRef, Renderer2 } from '@angular/core';
5
+ import * as i2 from '@skyux/indicators';
6
+ import { SkyIconModule, SkyTokensModule, SkyWaitModule, SkyChevronModule } from '@skyux/indicators';
7
+ import * as i3 from '@skyux/theme';
8
+ import { SkyThemeModule } from '@skyux/theme';
9
+ import * as i3$1 from '@skyux/i18n';
10
+ import { getLibStringForLocale, SkyI18nModule, SKY_LIB_RESOURCES_PROVIDERS } from '@skyux/i18n';
11
+ import { Subject, fromEvent, BehaviorSubject, forkJoin } from 'rxjs';
12
+ import { takeUntil, filter, map } from 'rxjs/operators';
13
+ import * as i1$1 from '@skyux/core';
14
+ import { SkyScrollableHostService, SkyLogService, SkyIdModule } from '@skyux/core';
15
+ import * as i2$1 from '@angular/cdk/observers';
16
+ import { ObserversModule } from '@angular/cdk/observers';
17
+ import * as i6 from '@skyux/forms';
18
+ import { SkyCheckboxModule } from '@skyux/forms';
19
+ import * as i7 from '@skyux/inline-form';
20
+ import { SkyInlineFormModule } from '@skyux/inline-form';
21
+ import * as i1$2 from 'ng2-dragula';
22
+ import { DragulaService, DragulaModule } from 'ng2-dragula';
23
+ import { skyAnimationSlide } from '@skyux/animations';
24
+ import autoScroll from 'dom-autoscroller';
25
+ import * as i2$2 from '@skyux/popovers';
26
+ import { SkyDropdownMessageType, SkyDropdownModule } from '@skyux/popovers';
27
+
28
+ /**
29
+ * NOTICE: DO NOT MODIFY THIS FILE!
30
+ * The contents of this file were automatically generated by
31
+ * the 'ng generate @skyux/i18n:lib-resources-module lib/modules/shared/sky-lists' schematic.
32
+ * To update this file, simply rerun the command.
33
+ */
34
+ const RESOURCES = {
35
+ 'EN-US': {
36
+ skyux_filter_button_title: { message: 'Filter' },
37
+ skyux_filter_summary_close: { message: 'Remove filter' },
38
+ skyux_filter_summary_header: { message: 'Filter' },
39
+ skyux_infinite_scroll_load_more_button: { message: 'Load more' },
40
+ skyux_paging_label: { message: 'Pagination' },
41
+ skyux_paging_next: { message: 'Next' },
42
+ skyux_paging_page_link_aria_label: { message: 'Page {0}' },
43
+ skyux_paging_previous: { message: 'Previous' },
44
+ skyux_repeater_label: { message: 'List of items' },
45
+ skyux_repeater_item_collapse: { message: 'Collapse {0}' },
46
+ skyux_repeater_item_collapse_default: { message: 'Collapse' },
47
+ skyux_repeater_item_expand: { message: 'Expand {0}' },
48
+ skyux_repeater_item_expand_default: { message: 'Expand' },
49
+ skyux_repeater_item_checkbox_label: { message: 'Select {0}' },
50
+ skyux_repeater_item_checkbox_label_default: { message: 'Select row' },
51
+ skyux_repeater_item_reorder_cancel: {
52
+ message: 'Item reordering was canceled. The item was returned to its original position.',
53
+ },
54
+ skyux_repeater_item_reorder_finish: {
55
+ message: 'Dropped the item in position',
56
+ },
57
+ skyux_repeater_item_reorder_instructions: {
58
+ message: 'Item grabbed. Press the up and down arrow keys to change position. Press the spacebar or enter key to drop. And press the escape key to cancel.',
59
+ },
60
+ skyux_repeater_item_reorder_moved: {
61
+ message: 'Moved the item to position',
62
+ },
63
+ skyux_repeater_item_reorder_label_default: { message: 'Reorder' },
64
+ skyux_repeater_item_reorder_label: { message: 'Reorder {0}' },
65
+ skyux_repeater_item_reorder_operation: {
66
+ message: 'Press the spacebar or enter key to reorder.',
67
+ },
68
+ skyux_repeater_item_reorder_top: { message: 'Top' },
69
+ skyux_repeater_item_reorder_top_label: { message: 'Move {0} to top' },
70
+ skyux_repeater_item_reorder_top_label_default: { message: 'Move to top' },
71
+ skyux_sort_button_label: { message: 'Sort' },
72
+ skyux_sort_menu_heading: { message: 'Sort by' },
73
+ },
74
+ };
75
+ class SkyListsResourcesProvider {
76
+ getString(localeInfo, name) {
77
+ return getLibStringForLocale(RESOURCES, localeInfo.locale, name);
78
+ }
79
+ }
80
+ /**
81
+ * Import into any component library module that needs to use resource strings.
82
+ */
83
+ class SkyListsResourcesModule {
84
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyListsResourcesModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
85
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: SkyListsResourcesModule, exports: [SkyI18nModule] }); }
86
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyListsResourcesModule, providers: [
87
+ {
88
+ provide: SKY_LIB_RESOURCES_PROVIDERS,
89
+ useClass: SkyListsResourcesProvider,
90
+ multi: true,
91
+ },
92
+ ], imports: [SkyI18nModule] }); }
93
+ }
94
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyListsResourcesModule, decorators: [{
95
+ type: NgModule,
96
+ args: [{
97
+ exports: [SkyI18nModule],
98
+ providers: [
99
+ {
100
+ provide: SKY_LIB_RESOURCES_PROVIDERS,
101
+ useClass: SkyListsResourcesProvider,
102
+ multi: true,
103
+ },
104
+ ],
105
+ }]
106
+ }] });
107
+
108
+ let nextId = 0;
109
+ class SkyFilterButtonComponent {
110
+ /**
111
+ * The ID for the filter button.
112
+ */
113
+ get filterButtonId() {
114
+ return this.#filterButtonIdOrDefault;
115
+ }
116
+ set filterButtonId(value) {
117
+ this.#filterButtonIdOrDefault = value || this.#defaultButtonId;
118
+ }
119
+ constructor() {
120
+ /**
121
+ * Whether the filtering options are exposed.
122
+ * To support [accessibility rules for disclosures](https://www.w3.org/TR/wai-aria-practices-1.1/#disclosure),
123
+ * this property is necessary to set the `aria-expanded` attribute when using inline filters.
124
+ * For more information about the `aria-expanded` attribute, see the [WAI-ARIA definition](https://www.w3.org/TR/wai-aria/#aria-expanded).
125
+ */
126
+ this.ariaExpanded = false;
127
+ /**
128
+ * Whether to highlight the filter button to indicate that filters were applied.
129
+ * We recommend setting this property to `true` when no indication of filtering is visible
130
+ * to users. For example, set it to `true` if you do not display the filter summary.
131
+ */
132
+ this.active = false;
133
+ /**
134
+ * Whether to disable the filter button.
135
+ */
136
+ this.disabled = false;
137
+ /**
138
+ * Whether to display a "Filter" label beside the icon on the filter button.
139
+ */
140
+ this.showButtonText = false;
141
+ /**
142
+ * Fires when the filter button is selected.
143
+ */
144
+ this.filterButtonClick = new EventEmitter();
145
+ this.#filterButtonIdOrDefault =
146
+ this.#defaultButtonId = `sky-filter-button-${++nextId}`;
147
+ }
148
+ #defaultButtonId;
149
+ #filterButtonIdOrDefault;
150
+ filterButtonOnClick() {
151
+ this.filterButtonClick.emit();
152
+ }
153
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
154
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyFilterButtonComponent, selector: "sky-filter-button", inputs: { filterButtonId: "filterButtonId", ariaControls: "ariaControls", ariaExpanded: "ariaExpanded", active: "active", disabled: "disabled", showButtonText: "showButtonText" }, outputs: { filterButtonClick: "filterButtonClick" }, ngImport: i0, template: "<button\n class=\"sky-btn sky-btn-default sky-filter-btn\"\n type=\"button\"\n [attr.aria-controls]=\"ariaControls\"\n [attr.aria-expanded]=\"ariaExpanded\"\n [attr.aria-label]=\"'skyux_filter_button_title' | skyLibResources\"\n [attr.title]=\"'skyux_filter_button_title' | skyLibResources\"\n [disabled]=\"disabled\"\n [id]=\"filterButtonId\"\n [ngClass]=\"{\n 'sky-filter-btn-active': active\n }\"\n [skyThemeClass]=\"{\n 'sky-rounded-corners': 'default',\n 'sky-theme-modern': 'modern'\n }\"\n (click)=\"filterButtonOnClick()\"\n>\n <sky-icon *skyThemeIf=\"'default'\" icon=\"filter\" size=\"lg\"> </sky-icon>\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"filter\" iconType=\"skyux\"></sky-icon>\n <span *ngIf=\"showButtonText\" class=\"sky-filter-btn-text\">\n {{ 'skyux_filter_button_title' | skyLibResources }}\n </span>\n</button>\n", styles: [".sky-filter-btn-active,.sky-filter-btn-active:hover,.sky-filter-btn-active:focus{color:#72bf44;border:2px solid #72bf44;padding:5px 11px}.sky-filter-btn-active:hover,.sky-filter-btn-active:focus{color:#212327}.sky-theme-modern.sky-filter-btn-active,.sky-theme-modern.sky-filter-btn-active:hover,.sky-theme-modern.sky-filter-btn-active:focus{color:initial;border:none;box-shadow:inset 0 0 0 1px #0974a1;background-color:#c1e8fb;color:#212327;padding:9px 21px}.sky-theme-modern.sky-filter-btn-active:hover,.sky-theme-modern.sky-filter-btn-active:hover:hover,.sky-theme-modern.sky-filter-btn-active:focus:hover{border:none;box-shadow:inset 0 0 0 1px #0974a1;text-decoration:none}.sky-theme-modern.sky-filter-btn-active:hover,.sky-theme-modern.sky-filter-btn-active:active,.sky-theme-modern.sky-filter-btn-active.sky-btn-active,.sky-theme-modern.sky-filter-btn-active:hover:hover,.sky-theme-modern.sky-filter-btn-active:hover:active,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-active,.sky-theme-modern.sky-filter-btn-active:focus:hover,.sky-theme-modern.sky-filter-btn-active:focus:active,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-active{color:#212327}.sky-theme-modern.sky-filter-btn-active:active,.sky-theme-modern.sky-filter-btn-active.sky-btn-active,.sky-theme-modern.sky-filter-btn-active:hover:active,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-active,.sky-theme-modern.sky-filter-btn-active:focus:active,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-active{border:none;box-shadow:inset 0 0 0 2px #0974a1;background-image:none}.sky-theme-modern.sky-filter-btn-active.sky-btn-disabled,.sky-theme-modern.sky-filter-btn-active.sky-btn-disabled:hover,.sky-theme-modern.sky-filter-btn-active.sky-btn-disabled:focus-visible,.sky-theme-modern.sky-filter-btn-active.sky-btn-disabled.sky-btn-focus,.sky-theme-modern.sky-filter-btn-active.sky-btn-disabled:active,.sky-theme-modern.sky-filter-btn-active.sky-btn-disabled.sky-btn-active,.sky-theme-modern.sky-filter-btn-active[disabled],.sky-theme-modern.sky-filter-btn-active[disabled]:hover,.sky-theme-modern.sky-filter-btn-active[disabled]:focus-visible,.sky-theme-modern.sky-filter-btn-active[disabled].sky-btn-focus,.sky-theme-modern.sky-filter-btn-active[disabled]:active,.sky-theme-modern.sky-filter-btn-active[disabled].sky-btn-active,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-disabled,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-disabled:hover,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-disabled:focus-visible,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-disabled.sky-btn-focus,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-disabled:active,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-disabled.sky-btn-active,.sky-theme-modern.sky-filter-btn-active:hover[disabled],.sky-theme-modern.sky-filter-btn-active:hover[disabled]:hover,.sky-theme-modern.sky-filter-btn-active:hover[disabled]:focus-visible,.sky-theme-modern.sky-filter-btn-active:hover[disabled].sky-btn-focus,.sky-theme-modern.sky-filter-btn-active:hover[disabled]:active,.sky-theme-modern.sky-filter-btn-active:hover[disabled].sky-btn-active,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-disabled,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-disabled:hover,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-disabled:focus-visible,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-disabled.sky-btn-focus,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-disabled:active,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-disabled.sky-btn-active,.sky-theme-modern.sky-filter-btn-active:focus[disabled],.sky-theme-modern.sky-filter-btn-active:focus[disabled]:hover,.sky-theme-modern.sky-filter-btn-active:focus[disabled]:focus-visible,.sky-theme-modern.sky-filter-btn-active:focus[disabled].sky-btn-focus,.sky-theme-modern.sky-filter-btn-active:focus[disabled]:active,.sky-theme-modern.sky-filter-btn-active:focus[disabled].sky-btn-active{border:none;box-shadow:inset 0 0 0 1px #d2d2d2;background-color:#ededee;color:#686c73;opacity:1}.sky-theme-modern.sky-filter-btn-active:focus-visible,.sky-theme-modern.sky-filter-btn-active:hover:focus-visible,.sky-theme-modern.sky-filter-btn-active:focus:focus-visible{outline:none}.sky-theme-modern.sky-filter-btn-active:focus-visible:not(:active),.sky-theme-modern.sky-filter-btn-active:hover:focus-visible:not(:active),.sky-theme-modern.sky-filter-btn-active:focus:focus-visible:not(:active){border:none;box-shadow:inset 0 0 0 2px #0974a1,0 1px 8px #0000004d}:host .sky-filter-btn-text{display:none}:host .sky-filter-btn ::ng-deep .sky-dropdown-caret{display:none}:host-context(.sky-responsive-container-xs) .sky-filter-btn-text,:host-context(.sky-responsive-container-sm) .sky-filter-btn-text,:host-context(.sky-responsive-container-md) .sky-filter-btn-text,:host-context(.sky-responsive-container-lg) .sky-filter-btn-text{display:none}:host-context(.sky-responsive-container-xs) .sky-filter-btn ::ng-deep .sky-dropdown-caret,:host-context(.sky-responsive-container-sm) .sky-filter-btn ::ng-deep .sky-dropdown-caret,:host-context(.sky-responsive-container-md) .sky-filter-btn ::ng-deep .sky-dropdown-caret,:host-context(.sky-responsive-container-lg) .sky-filter-btn ::ng-deep .sky-dropdown-caret{display:none}@media (min-width: 768px){:host .sky-filter-btn-text{display:inline}:host .sky-filter-btn ::ng-deep .sky-dropdown-caret{display:inline-block}}:host-context(.sky-responsive-container-sm) .sky-filter-btn-text,:host-context(.sky-responsive-container-md) .sky-filter-btn-text,:host-context(.sky-responsive-container-lg) .sky-filter-btn-text{display:inline}:host-context(.sky-responsive-container-sm) .sky-filter-btn ::ng-deep .sky-dropdown-caret,:host-context(.sky-responsive-container-md) .sky-filter-btn ::ng-deep .sky-dropdown-caret,:host-context(.sky-responsive-container-lg) .sky-filter-btn ::ng-deep .sky-dropdown-caret{display:inline-block}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { kind: "directive", type: i3.λ2, selector: "[skyThemeClass]", inputs: ["class", "skyThemeClass"] }, { kind: "directive", type: i3.λ3, selector: "[skyThemeIf]", inputs: ["skyThemeIf"] }, { kind: "pipe", type: i3$1.SkyLibResourcesPipe, name: "skyLibResources" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
155
+ }
156
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterButtonComponent, decorators: [{
157
+ type: Component,
158
+ args: [{ selector: 'sky-filter-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n class=\"sky-btn sky-btn-default sky-filter-btn\"\n type=\"button\"\n [attr.aria-controls]=\"ariaControls\"\n [attr.aria-expanded]=\"ariaExpanded\"\n [attr.aria-label]=\"'skyux_filter_button_title' | skyLibResources\"\n [attr.title]=\"'skyux_filter_button_title' | skyLibResources\"\n [disabled]=\"disabled\"\n [id]=\"filterButtonId\"\n [ngClass]=\"{\n 'sky-filter-btn-active': active\n }\"\n [skyThemeClass]=\"{\n 'sky-rounded-corners': 'default',\n 'sky-theme-modern': 'modern'\n }\"\n (click)=\"filterButtonOnClick()\"\n>\n <sky-icon *skyThemeIf=\"'default'\" icon=\"filter\" size=\"lg\"> </sky-icon>\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"filter\" iconType=\"skyux\"></sky-icon>\n <span *ngIf=\"showButtonText\" class=\"sky-filter-btn-text\">\n {{ 'skyux_filter_button_title' | skyLibResources }}\n </span>\n</button>\n", styles: [".sky-filter-btn-active,.sky-filter-btn-active:hover,.sky-filter-btn-active:focus{color:#72bf44;border:2px solid #72bf44;padding:5px 11px}.sky-filter-btn-active:hover,.sky-filter-btn-active:focus{color:#212327}.sky-theme-modern.sky-filter-btn-active,.sky-theme-modern.sky-filter-btn-active:hover,.sky-theme-modern.sky-filter-btn-active:focus{color:initial;border:none;box-shadow:inset 0 0 0 1px #0974a1;background-color:#c1e8fb;color:#212327;padding:9px 21px}.sky-theme-modern.sky-filter-btn-active:hover,.sky-theme-modern.sky-filter-btn-active:hover:hover,.sky-theme-modern.sky-filter-btn-active:focus:hover{border:none;box-shadow:inset 0 0 0 1px #0974a1;text-decoration:none}.sky-theme-modern.sky-filter-btn-active:hover,.sky-theme-modern.sky-filter-btn-active:active,.sky-theme-modern.sky-filter-btn-active.sky-btn-active,.sky-theme-modern.sky-filter-btn-active:hover:hover,.sky-theme-modern.sky-filter-btn-active:hover:active,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-active,.sky-theme-modern.sky-filter-btn-active:focus:hover,.sky-theme-modern.sky-filter-btn-active:focus:active,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-active{color:#212327}.sky-theme-modern.sky-filter-btn-active:active,.sky-theme-modern.sky-filter-btn-active.sky-btn-active,.sky-theme-modern.sky-filter-btn-active:hover:active,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-active,.sky-theme-modern.sky-filter-btn-active:focus:active,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-active{border:none;box-shadow:inset 0 0 0 2px #0974a1;background-image:none}.sky-theme-modern.sky-filter-btn-active.sky-btn-disabled,.sky-theme-modern.sky-filter-btn-active.sky-btn-disabled:hover,.sky-theme-modern.sky-filter-btn-active.sky-btn-disabled:focus-visible,.sky-theme-modern.sky-filter-btn-active.sky-btn-disabled.sky-btn-focus,.sky-theme-modern.sky-filter-btn-active.sky-btn-disabled:active,.sky-theme-modern.sky-filter-btn-active.sky-btn-disabled.sky-btn-active,.sky-theme-modern.sky-filter-btn-active[disabled],.sky-theme-modern.sky-filter-btn-active[disabled]:hover,.sky-theme-modern.sky-filter-btn-active[disabled]:focus-visible,.sky-theme-modern.sky-filter-btn-active[disabled].sky-btn-focus,.sky-theme-modern.sky-filter-btn-active[disabled]:active,.sky-theme-modern.sky-filter-btn-active[disabled].sky-btn-active,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-disabled,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-disabled:hover,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-disabled:focus-visible,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-disabled.sky-btn-focus,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-disabled:active,.sky-theme-modern.sky-filter-btn-active:hover.sky-btn-disabled.sky-btn-active,.sky-theme-modern.sky-filter-btn-active:hover[disabled],.sky-theme-modern.sky-filter-btn-active:hover[disabled]:hover,.sky-theme-modern.sky-filter-btn-active:hover[disabled]:focus-visible,.sky-theme-modern.sky-filter-btn-active:hover[disabled].sky-btn-focus,.sky-theme-modern.sky-filter-btn-active:hover[disabled]:active,.sky-theme-modern.sky-filter-btn-active:hover[disabled].sky-btn-active,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-disabled,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-disabled:hover,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-disabled:focus-visible,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-disabled.sky-btn-focus,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-disabled:active,.sky-theme-modern.sky-filter-btn-active:focus.sky-btn-disabled.sky-btn-active,.sky-theme-modern.sky-filter-btn-active:focus[disabled],.sky-theme-modern.sky-filter-btn-active:focus[disabled]:hover,.sky-theme-modern.sky-filter-btn-active:focus[disabled]:focus-visible,.sky-theme-modern.sky-filter-btn-active:focus[disabled].sky-btn-focus,.sky-theme-modern.sky-filter-btn-active:focus[disabled]:active,.sky-theme-modern.sky-filter-btn-active:focus[disabled].sky-btn-active{border:none;box-shadow:inset 0 0 0 1px #d2d2d2;background-color:#ededee;color:#686c73;opacity:1}.sky-theme-modern.sky-filter-btn-active:focus-visible,.sky-theme-modern.sky-filter-btn-active:hover:focus-visible,.sky-theme-modern.sky-filter-btn-active:focus:focus-visible{outline:none}.sky-theme-modern.sky-filter-btn-active:focus-visible:not(:active),.sky-theme-modern.sky-filter-btn-active:hover:focus-visible:not(:active),.sky-theme-modern.sky-filter-btn-active:focus:focus-visible:not(:active){border:none;box-shadow:inset 0 0 0 2px #0974a1,0 1px 8px #0000004d}:host .sky-filter-btn-text{display:none}:host .sky-filter-btn ::ng-deep .sky-dropdown-caret{display:none}:host-context(.sky-responsive-container-xs) .sky-filter-btn-text,:host-context(.sky-responsive-container-sm) .sky-filter-btn-text,:host-context(.sky-responsive-container-md) .sky-filter-btn-text,:host-context(.sky-responsive-container-lg) .sky-filter-btn-text{display:none}:host-context(.sky-responsive-container-xs) .sky-filter-btn ::ng-deep .sky-dropdown-caret,:host-context(.sky-responsive-container-sm) .sky-filter-btn ::ng-deep .sky-dropdown-caret,:host-context(.sky-responsive-container-md) .sky-filter-btn ::ng-deep .sky-dropdown-caret,:host-context(.sky-responsive-container-lg) .sky-filter-btn ::ng-deep .sky-dropdown-caret{display:none}@media (min-width: 768px){:host .sky-filter-btn-text{display:inline}:host .sky-filter-btn ::ng-deep .sky-dropdown-caret{display:inline-block}}:host-context(.sky-responsive-container-sm) .sky-filter-btn-text,:host-context(.sky-responsive-container-md) .sky-filter-btn-text,:host-context(.sky-responsive-container-lg) .sky-filter-btn-text{display:inline}:host-context(.sky-responsive-container-sm) .sky-filter-btn ::ng-deep .sky-dropdown-caret,:host-context(.sky-responsive-container-md) .sky-filter-btn ::ng-deep .sky-dropdown-caret,:host-context(.sky-responsive-container-lg) .sky-filter-btn ::ng-deep .sky-dropdown-caret{display:inline-block}\n"] }]
159
+ }], ctorParameters: function () { return []; }, propDecorators: { filterButtonId: [{
160
+ type: Input
161
+ }], ariaControls: [{
162
+ type: Input
163
+ }], ariaExpanded: [{
164
+ type: Input
165
+ }], active: [{
166
+ type: Input
167
+ }], disabled: [{
168
+ type: Input
169
+ }], showButtonText: [{
170
+ type: Input
171
+ }], filterButtonClick: [{
172
+ type: Output
173
+ }] } });
174
+
175
+ /**
176
+ * Specifies an inline filter.
177
+ */
178
+ class SkyFilterInlineItemComponent {
179
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterInlineItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
180
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyFilterInlineItemComponent, selector: "sky-filter-inline-item", ngImport: i0, template: "<div class=\"sky-filter-inline-item\">\n <ng-content></ng-content>\n</div>\n", styles: [".sky-filter-inline-item{margin-right:10px}\n"] }); }
181
+ }
182
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterInlineItemComponent, decorators: [{
183
+ type: Component,
184
+ args: [{ selector: 'sky-filter-inline-item', template: "<div class=\"sky-filter-inline-item\">\n <ng-content></ng-content>\n</div>\n", styles: [".sky-filter-inline-item{margin-right:10px}\n"] }]
185
+ }] });
186
+
187
+ /**
188
+ * Specifies a wrapper for the inline filters.
189
+ */
190
+ class SkyFilterInlineComponent {
191
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterInlineComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
192
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyFilterInlineComponent, selector: "sky-filter-inline", ngImport: i0, template: "<div class=\"sky-filter-inline sky-padding-even-default\">\n <ng-content></ng-content>\n</div>\n", styles: [".sky-filter-inline{background-color:#eeeeef;display:flex;align-items:center}\n"] }); }
193
+ }
194
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterInlineComponent, decorators: [{
195
+ type: Component,
196
+ args: [{ selector: 'sky-filter-inline', template: "<div class=\"sky-filter-inline sky-padding-even-default\">\n <ng-content></ng-content>\n</div>\n", styles: [".sky-filter-inline{background-color:#eeeeef;display:flex;align-items:center}\n"] }]
197
+ }] });
198
+
199
+ /**
200
+ * Specifies a filter that was applied.
201
+ */
202
+ class SkyFilterSummaryItemComponent {
203
+ constructor() {
204
+ /**
205
+ * Fires when the summary item close button is selected.
206
+ */
207
+ this.dismiss = new EventEmitter();
208
+ /**
209
+ * Fires when the summary item is selected.
210
+ */
211
+ this.itemClick = new EventEmitter();
212
+ this.#_dismissible = true;
213
+ }
214
+ /**
215
+ * Whether the filter summary item has a close button.
216
+ */
217
+ get dismissible() {
218
+ return this.#_dismissible;
219
+ }
220
+ set dismissible(value) {
221
+ this.#_dismissible = value !== false;
222
+ }
223
+ #_dismissible;
224
+ onItemDismiss() {
225
+ this.dismiss.emit();
226
+ }
227
+ onItemClick() {
228
+ this.itemClick.emit();
229
+ }
230
+ onItemKeypress() {
231
+ this.itemClick.emit();
232
+ }
233
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterSummaryItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
234
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyFilterSummaryItemComponent, selector: "sky-filter-summary-item", inputs: { dismissible: "dismissible" }, outputs: { dismiss: "dismiss", itemClick: "itemClick" }, ngImport: i0, template: "<div\n class=\"sky-filter-summary-item\"\n (click)=\"onItemClick()\"\n (keypress.enter)=\"onItemKeypress()\"\n>\n <sky-token\n [ariaLabel]=\"'skyux_filter_summary_close' | skyLibResources\"\n [dismissible]=\"dismissible\"\n (dismiss)=\"onItemDismiss()\"\n >\n <ng-content> </ng-content>\n </sky-token>\n</div>\n", styles: [".sky-filter-summary-item{display:inline-block}:host:not(:last-child){margin-right:5px}:host-context(.sky-theme-modern) .sky-filter-summary-item{padding:0 0 5px}.sky-theme-modern .sky-filter-summary-item{padding:0 0 5px}\n"], dependencies: [{ kind: "component", type: i2.λ12, selector: "sky-token", inputs: ["disabled", "ariaLabel", "dismissible", "focusable", "role"], outputs: ["dismiss", "tokenFocus"] }, { kind: "pipe", type: i3$1.SkyLibResourcesPipe, name: "skyLibResources" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
235
+ }
236
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterSummaryItemComponent, decorators: [{
237
+ type: Component,
238
+ args: [{ selector: 'sky-filter-summary-item', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"sky-filter-summary-item\"\n (click)=\"onItemClick()\"\n (keypress.enter)=\"onItemKeypress()\"\n>\n <sky-token\n [ariaLabel]=\"'skyux_filter_summary_close' | skyLibResources\"\n [dismissible]=\"dismissible\"\n (dismiss)=\"onItemDismiss()\"\n >\n <ng-content> </ng-content>\n </sky-token>\n</div>\n", styles: [".sky-filter-summary-item{display:inline-block}:host:not(:last-child){margin-right:5px}:host-context(.sky-theme-modern) .sky-filter-summary-item{padding:0 0 5px}.sky-theme-modern .sky-filter-summary-item{padding:0 0 5px}\n"] }]
239
+ }], propDecorators: { dismissible: [{
240
+ type: Input
241
+ }], dismiss: [{
242
+ type: Output
243
+ }], itemClick: [{
244
+ type: Output
245
+ }] } });
246
+
247
+ /**
248
+ * Specifies a wrapper for the filters that were applied.
249
+ */
250
+ class SkyFilterSummaryComponent {
251
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterSummaryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
252
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyFilterSummaryComponent, selector: "sky-filter-summary", ngImport: i0, template: "<div class=\"sky-filter-summary\">\n <span class=\"sky-filter-summary-header\"\n >{{ 'skyux_filter_summary_header' | skyLibResources }}:</span\n >\n <div class=\"sky-filter-summary-items\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [".sky-filter-summary-header{margin:5px 10px 0 0;font-weight:600}.sky-filter-summary{background-color:#fff;overflow-x:auto;display:flex;align-items:flex-start}.sky-filter-summary-items{display:flex;flex-wrap:wrap}:host-context(.sky-theme-modern) .sky-filter-summary-header{margin:0 10px 0 0}.sky-theme-modern .sky-filter-summary-header{margin:0 10px 0 0}\n"], dependencies: [{ kind: "pipe", type: i3$1.SkyLibResourcesPipe, name: "skyLibResources" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
253
+ }
254
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterSummaryComponent, decorators: [{
255
+ type: Component,
256
+ args: [{ selector: 'sky-filter-summary', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"sky-filter-summary\">\n <span class=\"sky-filter-summary-header\"\n >{{ 'skyux_filter_summary_header' | skyLibResources }}:</span\n >\n <div class=\"sky-filter-summary-items\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [".sky-filter-summary-header{margin:5px 10px 0 0;font-weight:600}.sky-filter-summary{background-color:#fff;overflow-x:auto;display:flex;align-items:flex-start}.sky-filter-summary-items{display:flex;flex-wrap:wrap}:host-context(.sky-theme-modern) .sky-filter-summary-header{margin:0 10px 0 0}.sky-theme-modern .sky-filter-summary-header{margin:0 10px 0 0}\n"] }]
257
+ }] });
258
+
259
+ class SkyFilterModule {
260
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
261
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterModule, declarations: [SkyFilterButtonComponent,
262
+ SkyFilterInlineComponent,
263
+ SkyFilterInlineItemComponent,
264
+ SkyFilterSummaryComponent,
265
+ SkyFilterSummaryItemComponent], imports: [CommonModule,
266
+ SkyIconModule,
267
+ SkyListsResourcesModule,
268
+ SkyTokensModule,
269
+ SkyThemeModule], exports: [SkyFilterButtonComponent,
270
+ SkyFilterInlineComponent,
271
+ SkyFilterInlineItemComponent,
272
+ SkyFilterSummaryComponent,
273
+ SkyFilterSummaryItemComponent] }); }
274
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterModule, imports: [CommonModule,
275
+ SkyIconModule,
276
+ SkyListsResourcesModule,
277
+ SkyTokensModule,
278
+ SkyThemeModule] }); }
279
+ }
280
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyFilterModule, decorators: [{
281
+ type: NgModule,
282
+ args: [{
283
+ declarations: [
284
+ SkyFilterButtonComponent,
285
+ SkyFilterInlineComponent,
286
+ SkyFilterInlineItemComponent,
287
+ SkyFilterSummaryComponent,
288
+ SkyFilterSummaryItemComponent,
289
+ ],
290
+ imports: [
291
+ CommonModule,
292
+ SkyIconModule,
293
+ SkyListsResourcesModule,
294
+ SkyTokensModule,
295
+ SkyThemeModule,
296
+ ],
297
+ exports: [
298
+ SkyFilterButtonComponent,
299
+ SkyFilterInlineComponent,
300
+ SkyFilterInlineItemComponent,
301
+ SkyFilterSummaryComponent,
302
+ SkyFilterSummaryItemComponent,
303
+ ],
304
+ }]
305
+ }] });
306
+
307
+ /**
308
+ * @internal
309
+ */
310
+ class SkyInfiniteScrollDomAdapterService {
311
+ #ngUnsubscribe = new Subject();
312
+ #observer;
313
+ #parentChanges;
314
+ #parentChangesObs;
315
+ #scrollableHostSvc;
316
+ #windowRef;
317
+ constructor(scrollableHostSvc, windowRef) {
318
+ this.#scrollableHostSvc = scrollableHostSvc;
319
+ this.#windowRef = windowRef;
320
+ this.#parentChanges = new Subject();
321
+ this.#parentChangesObs = this.#parentChanges.asObservable();
322
+ }
323
+ ngOnDestroy() {
324
+ this.#parentChanges.complete();
325
+ this.#ngUnsubscribe.next();
326
+ this.#ngUnsubscribe.complete();
327
+ }
328
+ /**
329
+ * This event is triggered when child nodes are added to the infinite
330
+ * scroll parent container. e.g., A repeating list of elements was added.
331
+ * @param elementRef The infinite scroll element reference.
332
+ */
333
+ parentChanges(elementRef) {
334
+ this.#createObserver(elementRef);
335
+ return this.#parentChangesObs;
336
+ }
337
+ /**
338
+ * This event is triggered when the provided element reference
339
+ * is visible (or scrolled to) within its scrollable parent container.
340
+ * @param elementRef The infinite scroll element reference.
341
+ */
342
+ scrollTo(elementRef) {
343
+ const parent = this.#scrollableHostSvc.getScrollableHost(elementRef);
344
+ return fromEvent(parent, 'scroll').pipe(takeUntil(this.#ngUnsubscribe), filter(() => {
345
+ return this.#isElementScrolledInView(elementRef.nativeElement, parent);
346
+ }), map(() => undefined) // Change to void return type
347
+ );
348
+ }
349
+ #createObserver(elementRef) {
350
+ this.#observer = new MutationObserver((mutations) => {
351
+ const hasUpdates = !!mutations.find((mutation) => {
352
+ return (!elementRef.nativeElement.contains(mutation.target) &&
353
+ mutation.addedNodes.length > 0);
354
+ });
355
+ if (hasUpdates) {
356
+ this.#parentChanges.next();
357
+ }
358
+ });
359
+ const windowObj = this.#windowRef.nativeWindow;
360
+ const parent = this.#scrollableHostSvc.getScrollableHost(elementRef);
361
+ const observedParent = parent === windowObj ? windowObj.document.body : parent;
362
+ this.#observer.observe(observedParent, {
363
+ childList: true,
364
+ subtree: true,
365
+ });
366
+ }
367
+ #isElementScrolledInView(element, parentElement) {
368
+ const windowObj = this.#windowRef.nativeWindow;
369
+ if (parentElement === windowObj) {
370
+ return (parentElement.pageYOffset + parentElement.innerHeight >
371
+ element.offsetTop);
372
+ }
373
+ const elementRect = element.getBoundingClientRect();
374
+ const parentRect = parentElement.getBoundingClientRect();
375
+ return elementRect.top < parentRect.top + parentRect.height;
376
+ }
377
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyInfiniteScrollDomAdapterService, deps: [{ token: i1$1.SkyScrollableHostService }, { token: i1$1.SkyAppWindowRef }], target: i0.ɵɵFactoryTarget.Injectable }); }
378
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyInfiniteScrollDomAdapterService }); }
379
+ }
380
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyInfiniteScrollDomAdapterService, decorators: [{
381
+ type: Injectable
382
+ }], ctorParameters: function () { return [{ type: i1$1.SkyScrollableHostService }, { type: i1$1.SkyAppWindowRef }]; } });
383
+
384
+ class SkyInfiniteScrollComponent {
385
+ /**
386
+ * Whether to make the infinite scroll component active when more data is available
387
+ * to load. By default, infinite scroll is inactive and does not call the load function.
388
+ * @default false
389
+ */
390
+ get enabled() {
391
+ return this.#_enabled;
392
+ }
393
+ set enabled(value) {
394
+ if (this.#_enabled !== value) {
395
+ this.#_enabled = value;
396
+ this.#setListeners();
397
+ }
398
+ }
399
+ /**
400
+ * Whether data is loading because of a `scrollEnd` event. Setting the property
401
+ * to `true` disables new `scrollEnd` events from firing until it changes to `false`. If this
402
+ * property is not specified, the infinite scroll component watches the DOM for changes
403
+ * and fires `scrollEnd` events when changes occur on its parent DOM element. Relying
404
+ * on this default behavior could fire an excessive number of `scrollEnd` events
405
+ * if the DOM changes are not related to loading data, so we strongly recommend using this
406
+ * property to explicitly set the infinite scroll's loading state.
407
+ * @required
408
+ */
409
+ get loading() {
410
+ return this.#_loading;
411
+ }
412
+ set loading(value) {
413
+ this.#_loading = value;
414
+ if (value !== undefined) {
415
+ this.isWaiting = value;
416
+ }
417
+ }
418
+ #changeDetector;
419
+ #domAdapter;
420
+ #elementRef;
421
+ #ngUnsubscribe;
422
+ #_enabled;
423
+ #_loading;
424
+ constructor(changeDetector, elementRef, domAdapter) {
425
+ /**
426
+ * Fires when scrolling triggers the need to load more data or when users select the button
427
+ * to load more data. This event only fires when the `enabled` property is set to `true`
428
+ * and data is not already loading.
429
+ */
430
+ this.scrollEnd = new EventEmitter();
431
+ this.isWaiting = false;
432
+ this.#ngUnsubscribe = new Subject();
433
+ this.#_enabled = false;
434
+ this.#changeDetector = changeDetector;
435
+ this.#elementRef = elementRef;
436
+ this.#domAdapter = domAdapter;
437
+ }
438
+ ngOnDestroy() {
439
+ this.enabled = false;
440
+ this.#ngUnsubscribe.next();
441
+ this.#ngUnsubscribe.complete();
442
+ }
443
+ startInfiniteScrollLoad() {
444
+ this.#notifyScrollEnd();
445
+ }
446
+ #notifyScrollEnd() {
447
+ this.isWaiting = true;
448
+ this.scrollEnd.emit();
449
+ this.#changeDetector.markForCheck();
450
+ }
451
+ #setListeners() {
452
+ if (this.enabled) {
453
+ // The user has scrolled to the infinite scroll element.
454
+ this.#domAdapter
455
+ .scrollTo(this.#elementRef)
456
+ .pipe(takeUntil(this.#ngUnsubscribe))
457
+ .subscribe(() => {
458
+ if (!this.isWaiting && this.enabled) {
459
+ this.#notifyScrollEnd();
460
+ }
461
+ });
462
+ // New items have been loaded into the parent element.
463
+ this.#domAdapter
464
+ .parentChanges(this.#elementRef)
465
+ .pipe(takeUntil(this.#ngUnsubscribe))
466
+ .subscribe(() => {
467
+ if (!this.loading) {
468
+ this.isWaiting = false;
469
+ this.#changeDetector.markForCheck();
470
+ }
471
+ });
472
+ }
473
+ else {
474
+ this.#ngUnsubscribe.next();
475
+ }
476
+ }
477
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyInfiniteScrollComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: SkyInfiniteScrollDomAdapterService }], target: i0.ɵɵFactoryTarget.Component }); }
478
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyInfiniteScrollComponent, selector: "sky-infinite-scroll", inputs: { enabled: "enabled", loading: "loading" }, outputs: { scrollEnd: "scrollEnd" }, providers: [SkyInfiniteScrollDomAdapterService], ngImport: i0, template: "<div *ngIf=\"enabled\" class=\"sky-infinite-scroll\">\n <button\n *ngIf=\"!isWaiting && enabled\"\n class=\"sky-btn sky-btn-default sky-infinite-scroll-load-more-button\"\n type=\"button\"\n (click)=\"startInfiniteScrollLoad()\"\n >\n {{ 'skyux_infinite_scroll_load_more_button' | skyLibResources }}\n </button>\n <sky-wait [isWaiting]=\"isWaiting\"> </sky-wait>\n</div>\n", styles: [".sky-infinite-scroll{margin-top:20px;text-align:center;min-height:75px}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.λ14, selector: "sky-wait", inputs: ["ariaLabel", "isWaiting", "isFullPage", "isNonBlocking", "screenReaderCompletedText"] }, { kind: "pipe", type: i3$1.SkyLibResourcesPipe, name: "skyLibResources" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
479
+ }
480
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyInfiniteScrollComponent, decorators: [{
481
+ type: Component,
482
+ args: [{ selector: 'sky-infinite-scroll', changeDetection: ChangeDetectionStrategy.OnPush, providers: [SkyInfiniteScrollDomAdapterService], template: "<div *ngIf=\"enabled\" class=\"sky-infinite-scroll\">\n <button\n *ngIf=\"!isWaiting && enabled\"\n class=\"sky-btn sky-btn-default sky-infinite-scroll-load-more-button\"\n type=\"button\"\n (click)=\"startInfiniteScrollLoad()\"\n >\n {{ 'skyux_infinite_scroll_load_more_button' | skyLibResources }}\n </button>\n <sky-wait [isWaiting]=\"isWaiting\"> </sky-wait>\n</div>\n", styles: [".sky-infinite-scroll{margin-top:20px;text-align:center;min-height:75px}\n"] }]
483
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: SkyInfiniteScrollDomAdapterService }]; }, propDecorators: { enabled: [{
484
+ type: Input
485
+ }], loading: [{
486
+ type: Input
487
+ }], scrollEnd: [{
488
+ type: Output
489
+ }] } });
490
+
491
+ class SkyInfiniteScrollModule {
492
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyInfiniteScrollModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
493
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: SkyInfiniteScrollModule, declarations: [SkyInfiniteScrollComponent], imports: [CommonModule, SkyListsResourcesModule, SkyWaitModule], exports: [SkyInfiniteScrollComponent] }); }
494
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyInfiniteScrollModule, imports: [CommonModule, SkyListsResourcesModule, SkyWaitModule] }); }
495
+ }
496
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyInfiniteScrollModule, decorators: [{
497
+ type: NgModule,
498
+ args: [{
499
+ declarations: [SkyInfiniteScrollComponent],
500
+ imports: [CommonModule, SkyListsResourcesModule, SkyWaitModule],
501
+ exports: [SkyInfiniteScrollComponent],
502
+ }]
503
+ }] });
504
+
505
+ class SkyPagingComponent {
506
+ constructor() {
507
+ /**
508
+ * The page number of the current page. Page numbers start at 1 and increment.
509
+ */
510
+ this.currentPage = 1;
511
+ /**
512
+ * The total number of items across all pages.
513
+ */
514
+ this.itemCount = 0;
515
+ /**
516
+ * The maximum number of pages to display in the pagination control.
517
+ */
518
+ this.maxPages = 5;
519
+ /**
520
+ * The number of items to display per page.
521
+ */
522
+ this.pageSize = 10;
523
+ /**
524
+ * Fires when the current page changes and emits the new current page.
525
+ */
526
+ this.currentPageChange = new EventEmitter();
527
+ this.displayedPages = [];
528
+ this.pageCount = 0;
529
+ }
530
+ ngOnChanges(changes) {
531
+ this.setPage(this.currentPage);
532
+ }
533
+ setPage(pageNumber) {
534
+ const previousPage = this.currentPage;
535
+ this.#setPageCount();
536
+ if (pageNumber < 1 || this.pageCount < 1) {
537
+ this.currentPage = 1;
538
+ }
539
+ else if (pageNumber > this.pageCount) {
540
+ this.currentPage = this.pageCount;
541
+ }
542
+ else {
543
+ this.currentPage = pageNumber;
544
+ }
545
+ this.#setDisplayedPages();
546
+ if (previousPage !== this.currentPage) {
547
+ this.currentPageChange.emit(this.currentPage);
548
+ }
549
+ }
550
+ nextPage() {
551
+ this.setPage(this.currentPage + 1);
552
+ }
553
+ previousPage() {
554
+ this.setPage(this.currentPage - 1);
555
+ }
556
+ get isPreviousButtonDisabled() {
557
+ return this.currentPage === 1;
558
+ }
559
+ get isNextButtonDisabled() {
560
+ return this.currentPage === this.pageCount;
561
+ }
562
+ #getDisplayedPageNumbers(pageCount, maxDisplayedPages, pageNumber) {
563
+ const pageIndex = pageNumber - 1;
564
+ const pageBounds = Math.floor(maxDisplayedPages / 2);
565
+ let upperBound = pageIndex + pageBounds;
566
+ let lowerBound = pageIndex - pageBounds;
567
+ if (maxDisplayedPages % 2 !== 0) {
568
+ upperBound += 1;
569
+ }
570
+ // Wrap negative values to increase the upper bound
571
+ if (lowerBound < 0) {
572
+ upperBound -= lowerBound;
573
+ lowerBound = 0;
574
+ }
575
+ // Wrap overflow to decrease the lower bound
576
+ if (upperBound > pageCount) {
577
+ lowerBound -= upperBound - pageCount;
578
+ upperBound = pageCount;
579
+ }
580
+ // If both are the same ignore everything else and just display it all
581
+ if (pageCount < maxDisplayedPages) {
582
+ lowerBound = 0;
583
+ upperBound = pageCount;
584
+ }
585
+ const displayedPageNumbers = [];
586
+ for (let i = lowerBound; i < upperBound; i++) {
587
+ displayedPageNumbers.push(i + 1);
588
+ }
589
+ return displayedPageNumbers;
590
+ }
591
+ #setPageCount() {
592
+ if (this.itemCount === 0 || this.pageSize === 0) {
593
+ this.pageCount = 0;
594
+ return;
595
+ }
596
+ this.pageCount = Math.ceil(this.itemCount / this.pageSize);
597
+ }
598
+ #setDisplayedPages() {
599
+ this.displayedPages = this.#getDisplayedPageNumbers(this.pageCount, this.maxPages, this.currentPage);
600
+ }
601
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyPagingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
602
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyPagingComponent, selector: "sky-paging", inputs: { currentPage: "currentPage", itemCount: "itemCount", maxPages: "maxPages", pageSize: "pageSize", pagingLabel: "pagingLabel" }, outputs: { currentPageChange: "currentPageChange" }, usesOnChanges: true, ngImport: i0, template: "<nav\n *ngIf=\"pageCount > 1\"\n class=\"sky-paging\"\n [attr.aria-label]=\"pagingLabel || ('skyux_paging_label' | skyLibResources)\"\n>\n <ul>\n <li>\n <button\n class=\"sky-btn sky-btn-default sky-paging-btn sky-paging-btn-previous sky-box\"\n sky-cmp-id=\"previous\"\n type=\"button\"\n [attr.aria-label]=\"'skyux_paging_previous' | skyLibResources\"\n [disabled]=\"isPreviousButtonDisabled\"\n (click)=\"previousPage()\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"caret-left\"></sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n icon=\"chevron-left\"\n iconType=\"skyux\"\n ></sky-icon>\n </button>\n </li>\n <li *ngFor=\"let pageNumber of displayedPages\" class=\"sky-list-paging-link\">\n <button\n class=\"sky-btn sky-btn-default sky-paging-btn sky-box\"\n type=\"button\"\n [attr.aria-current]=\"currentPage === pageNumber ? 'page' : null\"\n [attr.sky-cmp-id]=\"pageNumber\"\n [attr.aria-label]=\"\n 'skyux_paging_page_link_aria_label' | skyLibResources : pageNumber\n \"\n [disabled]=\"currentPage === pageNumber\"\n [ngClass]=\"{ 'sky-paging-current': currentPage === pageNumber }\"\n (click)=\"setPage(pageNumber)\"\n >\n {{ pageNumber }}\n </button>\n </li>\n <li>\n <button\n class=\"sky-btn sky-btn-default sky-paging-btn sky-paging-btn-next sky-box\"\n sky-cmp-id=\"next\"\n type=\"button\"\n [attr.aria-label]=\"'skyux_paging_next' | skyLibResources\"\n [disabled]=\"isNextButtonDisabled\"\n (click)=\"nextPage()\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"caret-right\"></sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n icon=\"chevron-right\"\n iconType=\"skyux\"\n ></sky-icon>\n </button>\n </li>\n </ul>\n</nav>\n", styles: [":host{display:block}ul{margin:15px 0 0;display:inline-block;padding-left:0;border-radius:4px}li{display:inline}.sky-paging-btn{border-top:1px solid #e2e3e4;border-right:1px solid #e2e3e4;border-bottom:1px solid #e2e3e4;border-left:1px solid #e2e3e4;border-radius:0;background-color:#fff;color:inherit;float:left;margin-left:-1px;padding:4px 10px;text-decoration:none;line-height:1.428571429;font-size:15px;cursor:pointer}.sky-paging-btn.sky-paging-caret{transform:none}.sky-paging-btn.sky-paging-current,.sky-paging-btn.sky-paging-current:disabled,.sky-paging-btn.sky-paging-current[disabled]{background-color:#eeeeef;cursor:default;color:inherit;opacity:1}.sky-paging-btn:hover{background-color:#d4d4d6}.sky-paging-btn:disabled{color:#686c73;cursor:not-allowed;pointer-events:none}.sky-paging-btn.sky-paging-btn-previous,.sky-paging-btn.sky-paging-btn-next{padding-left:8.5px;padding-right:8.5px}:host-context(.sky-theme-modern) .sky-paging-btn{background-color:transparent;border:none;box-shadow:none;border-radius:6px;margin-right:10px;padding:3px 10px}:host-context(.sky-theme-modern) .sky-paging-btn:hover{background-color:transparent;border:solid 1px #1870B8;padding:2px 9px;z-index:1}:host-context(.sky-theme-modern) .sky-paging-btn:active,:host-context(.sky-theme-modern) .sky-paging-btn:focus{border:solid 2px #1870B8;color:#212327;padding:1px 8px}:host-context(.sky-theme-modern) .sky-paging-btn:focus:not(:active){outline:none;box-shadow:0 1px 3px #0000004d}:host-context(.sky-theme-modern) .sky-paging-current{background-color:var(--sky-background-color-item-selected);border:solid 1px #1870B8;padding:2px 9px}.sky-theme-modern .sky-paging-btn{background-color:transparent;border:none;box-shadow:none;border-radius:6px;margin-right:10px;padding:3px 10px}.sky-theme-modern .sky-paging-btn:hover{background-color:transparent;border:solid 1px #1870B8;padding:2px 9px;z-index:1}.sky-theme-modern .sky-paging-btn:active,.sky-theme-modern .sky-paging-btn:focus{border:solid 2px #1870B8;color:#212327;padding:1px 8px}.sky-theme-modern .sky-paging-btn:focus:not(:active){outline:none;box-shadow:0 1px 3px #0000004d}.sky-theme-modern .sky-paging-current{background-color:var(--sky-background-color-item-selected);border:solid 1px #1870B8;padding:2px 9px}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-paging-btn:active,:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-paging-btn:focus{color:#fbfcfe}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-paging-current{background-color:#1870b8}.sky-theme-modern.sky-theme-mode-dark .sky-paging-btn:active,.sky-theme-modern.sky-theme-mode-dark .sky-paging-btn:focus{color:#fbfcfe}.sky-theme-modern.sky-theme-mode-dark .sky-paging-current{background-color:#1870b8}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { kind: "directive", type: i3.λ3, selector: "[skyThemeIf]", inputs: ["skyThemeIf"] }, { kind: "pipe", type: i3$1.SkyLibResourcesPipe, name: "skyLibResources" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
603
+ }
604
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyPagingComponent, decorators: [{
605
+ type: Component,
606
+ args: [{ selector: 'sky-paging', changeDetection: ChangeDetectionStrategy.OnPush, template: "<nav\n *ngIf=\"pageCount > 1\"\n class=\"sky-paging\"\n [attr.aria-label]=\"pagingLabel || ('skyux_paging_label' | skyLibResources)\"\n>\n <ul>\n <li>\n <button\n class=\"sky-btn sky-btn-default sky-paging-btn sky-paging-btn-previous sky-box\"\n sky-cmp-id=\"previous\"\n type=\"button\"\n [attr.aria-label]=\"'skyux_paging_previous' | skyLibResources\"\n [disabled]=\"isPreviousButtonDisabled\"\n (click)=\"previousPage()\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"caret-left\"></sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n icon=\"chevron-left\"\n iconType=\"skyux\"\n ></sky-icon>\n </button>\n </li>\n <li *ngFor=\"let pageNumber of displayedPages\" class=\"sky-list-paging-link\">\n <button\n class=\"sky-btn sky-btn-default sky-paging-btn sky-box\"\n type=\"button\"\n [attr.aria-current]=\"currentPage === pageNumber ? 'page' : null\"\n [attr.sky-cmp-id]=\"pageNumber\"\n [attr.aria-label]=\"\n 'skyux_paging_page_link_aria_label' | skyLibResources : pageNumber\n \"\n [disabled]=\"currentPage === pageNumber\"\n [ngClass]=\"{ 'sky-paging-current': currentPage === pageNumber }\"\n (click)=\"setPage(pageNumber)\"\n >\n {{ pageNumber }}\n </button>\n </li>\n <li>\n <button\n class=\"sky-btn sky-btn-default sky-paging-btn sky-paging-btn-next sky-box\"\n sky-cmp-id=\"next\"\n type=\"button\"\n [attr.aria-label]=\"'skyux_paging_next' | skyLibResources\"\n [disabled]=\"isNextButtonDisabled\"\n (click)=\"nextPage()\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"caret-right\"></sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n icon=\"chevron-right\"\n iconType=\"skyux\"\n ></sky-icon>\n </button>\n </li>\n </ul>\n</nav>\n", styles: [":host{display:block}ul{margin:15px 0 0;display:inline-block;padding-left:0;border-radius:4px}li{display:inline}.sky-paging-btn{border-top:1px solid #e2e3e4;border-right:1px solid #e2e3e4;border-bottom:1px solid #e2e3e4;border-left:1px solid #e2e3e4;border-radius:0;background-color:#fff;color:inherit;float:left;margin-left:-1px;padding:4px 10px;text-decoration:none;line-height:1.428571429;font-size:15px;cursor:pointer}.sky-paging-btn.sky-paging-caret{transform:none}.sky-paging-btn.sky-paging-current,.sky-paging-btn.sky-paging-current:disabled,.sky-paging-btn.sky-paging-current[disabled]{background-color:#eeeeef;cursor:default;color:inherit;opacity:1}.sky-paging-btn:hover{background-color:#d4d4d6}.sky-paging-btn:disabled{color:#686c73;cursor:not-allowed;pointer-events:none}.sky-paging-btn.sky-paging-btn-previous,.sky-paging-btn.sky-paging-btn-next{padding-left:8.5px;padding-right:8.5px}:host-context(.sky-theme-modern) .sky-paging-btn{background-color:transparent;border:none;box-shadow:none;border-radius:6px;margin-right:10px;padding:3px 10px}:host-context(.sky-theme-modern) .sky-paging-btn:hover{background-color:transparent;border:solid 1px #1870B8;padding:2px 9px;z-index:1}:host-context(.sky-theme-modern) .sky-paging-btn:active,:host-context(.sky-theme-modern) .sky-paging-btn:focus{border:solid 2px #1870B8;color:#212327;padding:1px 8px}:host-context(.sky-theme-modern) .sky-paging-btn:focus:not(:active){outline:none;box-shadow:0 1px 3px #0000004d}:host-context(.sky-theme-modern) .sky-paging-current{background-color:var(--sky-background-color-item-selected);border:solid 1px #1870B8;padding:2px 9px}.sky-theme-modern .sky-paging-btn{background-color:transparent;border:none;box-shadow:none;border-radius:6px;margin-right:10px;padding:3px 10px}.sky-theme-modern .sky-paging-btn:hover{background-color:transparent;border:solid 1px #1870B8;padding:2px 9px;z-index:1}.sky-theme-modern .sky-paging-btn:active,.sky-theme-modern .sky-paging-btn:focus{border:solid 2px #1870B8;color:#212327;padding:1px 8px}.sky-theme-modern .sky-paging-btn:focus:not(:active){outline:none;box-shadow:0 1px 3px #0000004d}.sky-theme-modern .sky-paging-current{background-color:var(--sky-background-color-item-selected);border:solid 1px #1870B8;padding:2px 9px}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-paging-btn:active,:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-paging-btn:focus{color:#fbfcfe}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-paging-current{background-color:#1870b8}.sky-theme-modern.sky-theme-mode-dark .sky-paging-btn:active,.sky-theme-modern.sky-theme-mode-dark .sky-paging-btn:focus{color:#fbfcfe}.sky-theme-modern.sky-theme-mode-dark .sky-paging-current{background-color:#1870b8}\n"] }]
607
+ }], propDecorators: { currentPage: [{
608
+ type: Input
609
+ }], itemCount: [{
610
+ type: Input
611
+ }], maxPages: [{
612
+ type: Input
613
+ }], pageSize: [{
614
+ type: Input
615
+ }], pagingLabel: [{
616
+ type: Input
617
+ }], currentPageChange: [{
618
+ type: Output
619
+ }] } });
620
+
621
+ class SkyPagingModule {
622
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyPagingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
623
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: SkyPagingModule, declarations: [SkyPagingComponent], imports: [CommonModule,
624
+ SkyIconModule,
625
+ SkyListsResourcesModule,
626
+ SkyThemeModule], exports: [SkyPagingComponent] }); }
627
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyPagingModule, imports: [CommonModule,
628
+ SkyIconModule,
629
+ SkyListsResourcesModule,
630
+ SkyThemeModule] }); }
631
+ }
632
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyPagingModule, decorators: [{
633
+ type: NgModule,
634
+ args: [{
635
+ declarations: [SkyPagingComponent],
636
+ imports: [
637
+ CommonModule,
638
+ SkyIconModule,
639
+ SkyListsResourcesModule,
640
+ SkyThemeModule,
641
+ ],
642
+ exports: [SkyPagingComponent],
643
+ }]
644
+ }] });
645
+
646
+ /**
647
+ * Displays content text when the repeater is expanded.
648
+ */
649
+ class SkyRepeaterItemContentComponent {
650
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterItemContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
651
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyRepeaterItemContentComponent, selector: "sky-repeater-item-content", ngImport: i0, template: "<ng-content></ng-content>\n" }); }
652
+ }
653
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterItemContentComponent, decorators: [{
654
+ type: Component,
655
+ args: [{ selector: 'sky-repeater-item-content', template: "<ng-content></ng-content>\n" }]
656
+ }] });
657
+
658
+ /**
659
+ * Wraps and styles a
660
+ * [`skyux-dropdown` component](https://developer.blackbaud.com/skyux-popovers/docs/dropdown).
661
+ */
662
+ /* istanbul ignore next */
663
+ /* Code coverage having problems with no statements in classes */
664
+ class SkyRepeaterItemContextMenuComponent {
665
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterItemContextMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
666
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyRepeaterItemContextMenuComponent, selector: "sky-repeater-item-context-menu", ngImport: i0, template: "<ng-content></ng-content>\n" }); }
667
+ }
668
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterItemContextMenuComponent, decorators: [{
669
+ type: Component,
670
+ args: [{ selector: 'sky-repeater-item-context-menu', template: "<ng-content></ng-content>\n" }]
671
+ }] });
672
+
673
+ /**
674
+ * Displays a header inside the repeater item.
675
+ */
676
+ class SkyRepeaterItemTitleComponent {
677
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterItemTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
678
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyRepeaterItemTitleComponent, selector: "sky-repeater-item-title", ngImport: i0, template: "<ng-content></ng-content>\n" }); }
679
+ }
680
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterItemTitleComponent, decorators: [{
681
+ type: Component,
682
+ args: [{ selector: 'sky-repeater-item-title', template: "<ng-content></ng-content>\n" }]
683
+ }] });
684
+
685
+ let uniqueId = 0;
686
+ const DEFAULT_EXPAND_MODE = 'none';
687
+ /**
688
+ * @internal
689
+ */
690
+ class SkyRepeaterService {
691
+ constructor() {
692
+ this.activeItemChange = new BehaviorSubject(undefined);
693
+ this.activeItemIndexChange = new BehaviorSubject(undefined);
694
+ this.enableActiveState = false;
695
+ this.itemCollapseStateChange = new EventEmitter();
696
+ this.items = [];
697
+ this.itemRole = new BehaviorSubject({
698
+ content: undefined,
699
+ item: undefined,
700
+ title: undefined,
701
+ });
702
+ this.orderChange = new BehaviorSubject(undefined);
703
+ this.repeaterGroupId = ++uniqueId;
704
+ this.#_expandMode = DEFAULT_EXPAND_MODE;
705
+ }
706
+ // TODO: Remove 'string' as a valid type in a breaking change.
707
+ get expandMode() {
708
+ return this.#_expandMode;
709
+ }
710
+ set expandMode(value) {
711
+ this.#_expandMode = value ?? DEFAULT_EXPAND_MODE;
712
+ }
713
+ #_expandMode;
714
+ ngOnDestroy() {
715
+ this.activeItemChange.complete();
716
+ this.itemCollapseStateChange.complete();
717
+ this.orderChange.complete();
718
+ }
719
+ activateItem(item) {
720
+ if (this.enableActiveState) {
721
+ /* istanbul ignore else */
722
+ if (item && !item.disabled) {
723
+ const index = this.items.findIndex((i) => i === item);
724
+ this.activeItemIndexChange.next(index);
725
+ this.activeItemChange.next(item);
726
+ }
727
+ }
728
+ }
729
+ activateItemByIndex(index) {
730
+ /* istanbul ignore else */
731
+ if (this.enableActiveState) {
732
+ if (index === undefined) {
733
+ this.activeItemChange.next(undefined);
734
+ }
735
+ else {
736
+ const activeItem = this.items[index];
737
+ if (activeItem && !activeItem.disabled) {
738
+ this.activeItemChange.next(activeItem);
739
+ }
740
+ }
741
+ }
742
+ }
743
+ registerItem(item) {
744
+ this.items.push(item);
745
+ }
746
+ unregisterItem(item) {
747
+ const indexOfDestroyedItem = this.items.indexOf(item);
748
+ if (indexOfDestroyedItem > -1) {
749
+ this.items.splice(indexOfDestroyedItem, 1);
750
+ }
751
+ }
752
+ onItemCollapseStateChange(item) {
753
+ this.itemCollapseStateChange.emit(item);
754
+ }
755
+ registerOrderChange() {
756
+ this.orderChange.next();
757
+ }
758
+ reorderItem(oldIndex, newIndex) {
759
+ this.items.splice(newIndex, 0, this.items.splice(oldIndex, 1)[0]);
760
+ }
761
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
762
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterService }); }
763
+ }
764
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterService, decorators: [{
765
+ type: Injectable
766
+ }] });
767
+
768
+ /**
769
+ * @internal
770
+ */
771
+ class SkyRepeaterAdapterService {
772
+ get #repeaterItemGroupSelector() {
773
+ return '.sky-repeater-item-group-' + this.#repeaterService.repeaterGroupId;
774
+ }
775
+ #host;
776
+ #repeaterService;
777
+ constructor(repeaterService) {
778
+ this.#repeaterService = repeaterService;
779
+ }
780
+ focusElement(element) {
781
+ if (element) {
782
+ if (element instanceof ElementRef) {
783
+ element.nativeElement.focus();
784
+ }
785
+ else {
786
+ element.focus();
787
+ }
788
+ }
789
+ }
790
+ setRepeaterHost(hostRef) {
791
+ this.#host = hostRef;
792
+ }
793
+ getRepeaterItemIndex(element) {
794
+ return this.#getRepeaterItemArray().indexOf(element);
795
+ }
796
+ moveItemUp(element, top = false, steps = 1) {
797
+ const index = this.getRepeaterItemIndex(element);
798
+ if (index === 0) {
799
+ return;
800
+ }
801
+ let newIndex = index - steps;
802
+ if (top || newIndex < 0) {
803
+ newIndex = 0;
804
+ }
805
+ return this.#moveItem(element, index, newIndex);
806
+ }
807
+ moveItemDown(element, steps = 1) {
808
+ const itemArray = this.#getRepeaterItemArray();
809
+ const index = this.getRepeaterItemIndex(element);
810
+ if (index === itemArray.length - steps) {
811
+ return;
812
+ }
813
+ const newIndex = index + steps;
814
+ return this.#moveItem(element, index, newIndex);
815
+ }
816
+ #moveItem(element, oldIndex, newIndex) {
817
+ /* istanbul ignore else */
818
+ if (this.#host) {
819
+ const repeaterDiv = this.#host.nativeElement.querySelector('.sky-repeater');
820
+ repeaterDiv.removeChild(element);
821
+ const nextSibling = repeaterDiv.querySelectorAll(this.#repeaterItemGroupSelector)[newIndex];
822
+ repeaterDiv.insertBefore(element, nextSibling);
823
+ this.#repeaterService.reorderItem(oldIndex, newIndex);
824
+ }
825
+ return newIndex;
826
+ }
827
+ /**
828
+ * Returns an array of the immediate repeater item descendants. Excludes nested repeater items.
829
+ */
830
+ #getRepeaterItemArray() {
831
+ return Array.from(this.#host?.nativeElement.querySelectorAll(this.#repeaterItemGroupSelector));
832
+ }
833
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterAdapterService, deps: [{ token: SkyRepeaterService }], target: i0.ɵɵFactoryTarget.Injectable }); }
834
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterAdapterService }); }
835
+ }
836
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterAdapterService, decorators: [{
837
+ type: Injectable
838
+ }], ctorParameters: function () { return [{ type: SkyRepeaterService }]; } });
839
+
840
+ let nextContentId = 0;
841
+ /**
842
+ * Creates an individual repeater item.
843
+ */
844
+ class SkyRepeaterItemComponent {
845
+ /**
846
+ * Make the first, non-disabled item tab-focusable.
847
+ * - Disabled items should not be focusable per [W3C](https://www.w3.org/TR/wai-aria-practices-1.1/#kbd_disabled_controls).
848
+ * - One item per list/grid/listbox should be tab focusable per [W3C](https://www.w3.org/TR/wai-aria-practices-1.1/#grid).
849
+ */
850
+ get tabindex() {
851
+ return this.#repeaterService.items.filter((item) => !item.disabled)[0] ===
852
+ this
853
+ ? 0
854
+ : -1;
855
+ }
856
+ /**
857
+ * Whether to exclude an item when cycling through.
858
+ */
859
+ set disabled(value) {
860
+ if (this.#_isDisabled !== value) {
861
+ if (value) {
862
+ this.isSelected = false;
863
+ this.#_isDisabled = true;
864
+ }
865
+ else {
866
+ this.#_isDisabled = false;
867
+ }
868
+ if (this.isActive) {
869
+ this.#repeaterService.activateItemByIndex(undefined);
870
+ }
871
+ if (this.#elementRef.nativeElement.matches(':focus-within')) {
872
+ this.#elementRef.nativeElement.ownerDocument.activeElement.blur();
873
+ }
874
+ this.#changeDetector.markForCheck();
875
+ }
876
+ }
877
+ get disabled() {
878
+ return this.#_isDisabled;
879
+ }
880
+ /**
881
+ * Whether the repeater item is expanded.
882
+ * @default true
883
+ */
884
+ set isExpanded(value) {
885
+ this.updateForExpanded(value !== false, true);
886
+ }
887
+ get isExpanded() {
888
+ return this.#isExpanded;
889
+ }
890
+ /**
891
+ * Whether the repeater item's checkbox is selected.
892
+ * When users select the repeater item, the specified property on your model is updated accordingly.
893
+ * @default false
894
+ */
895
+ set isSelected(value) {
896
+ if (!this.disabled && value !== this.#_isSelected) {
897
+ this.#_isSelected = value;
898
+ this.isSelectedChange.emit(this.#_isSelected);
899
+ }
900
+ }
901
+ get isSelected() {
902
+ return this.#_isSelected;
903
+ }
904
+ set isCollapsible(value) {
905
+ if (this.isCollapsible !== value) {
906
+ this.#_isCollapsible = value !== false;
907
+ /*istanbul ignore else */
908
+ if (!this.#_isCollapsible) {
909
+ this.updateForExpanded(true, true);
910
+ }
911
+ }
912
+ this.#changeDetector.markForCheck();
913
+ }
914
+ get isCollapsible() {
915
+ return this.#_isCollapsible;
916
+ }
917
+ get repeaterGroupClass() {
918
+ return 'sky-repeater-item-group-' + this.#repeaterService.repeaterGroupId;
919
+ }
920
+ #adapterService;
921
+ #changeDetector;
922
+ #elementRef;
923
+ #isExpanded;
924
+ #keyboardReorderingEnabled;
925
+ #ngUnsubscribe;
926
+ #reorderCancelText;
927
+ #reorderCurrentIndex;
928
+ #reorderFinishText;
929
+ #reorderInstructions;
930
+ #reorderMovedText;
931
+ #reorderStateDescription;
932
+ #reorderSteps;
933
+ #repeaterService;
934
+ #resourceService;
935
+ #_isCollapsible;
936
+ #_isDisabled;
937
+ #_isSelected;
938
+ constructor(repeaterService, changeDetector, adapterService, elementRef, resourceService) {
939
+ /**
940
+ * Whether users can change the order of the repeater item.
941
+ * The repeater component's `reorderable` property must also be set to `true`.
942
+ */
943
+ this.reorderable = false;
944
+ /**
945
+ * Whether to display a checkbox in the left of the repeater item.
946
+ */
947
+ this.selectable = false;
948
+ /**
949
+ * Whether to display an inline form within the repeater.
950
+ * Users can toggle between displaying and hiding the inline form.
951
+ */
952
+ this.showInlineForm = false;
953
+ /**
954
+ * Fires when users collapse the repeater item.
955
+ */
956
+ this.collapse = new EventEmitter();
957
+ /**
958
+ * Fires when users expand the repeater item.
959
+ */
960
+ this.expand = new EventEmitter();
961
+ /**
962
+ * Fires when the repeater includes an inline form and users close it. This event emits
963
+ * [a `SkyInlineFormCloseArgs` type](https://developer.blackbaud.com/skyux/components/inline-form#skyinlineformcloseargs-properties).
964
+ */
965
+ this.inlineFormClose = new EventEmitter();
966
+ /**
967
+ * Fires when users select or clear the checkbox for the repeater item.
968
+ */
969
+ this.isSelectedChange = new EventEmitter();
970
+ this.hasItemContent = false;
971
+ this.isActive = false;
972
+ this.reorderButtonLabel = '';
973
+ this.animationDisabled = false;
974
+ this.#isExpanded = true;
975
+ this.#keyboardReorderingEnabled = false;
976
+ this.#ngUnsubscribe = new Subject();
977
+ this.#reorderCancelText = '';
978
+ this.#reorderCurrentIndex = -1;
979
+ this.#reorderFinishText = '';
980
+ this.#reorderInstructions = '';
981
+ this.#reorderMovedText = '';
982
+ this.#reorderStateDescription = '';
983
+ this.#reorderSteps = 0;
984
+ this.#_isCollapsible = true;
985
+ this.#_isDisabled = false;
986
+ this.#repeaterService = repeaterService;
987
+ this.#changeDetector = changeDetector;
988
+ this.#adapterService = adapterService;
989
+ this.#elementRef = elementRef;
990
+ this.#resourceService = resourceService;
991
+ this.#slideForExpanded(false);
992
+ forkJoin([
993
+ this.#resourceService.getString('skyux_repeater_item_reorder_cancel'),
994
+ this.#resourceService.getString('skyux_repeater_item_reorder_finish'),
995
+ this.#resourceService.getString('skyux_repeater_item_reorder_instructions'),
996
+ this.#resourceService.getString('skyux_repeater_item_reorder_operation'),
997
+ this.#resourceService.getString('skyux_repeater_item_reorder_moved'),
998
+ ])
999
+ .pipe(takeUntil(this.#ngUnsubscribe))
1000
+ .subscribe(([reorderCancelText, reorderFinishText, reorderInstructionsText, reorderOperationText, reorderMovedText,]) => {
1001
+ this.#reorderCancelText = reorderCancelText;
1002
+ this.#reorderFinishText = reorderFinishText;
1003
+ this.#reorderStateDescription = reorderInstructionsText;
1004
+ this.#reorderInstructions = reorderOperationText;
1005
+ this.#reorderMovedText = reorderMovedText;
1006
+ this.reorderButtonLabel = this.#reorderInstructions;
1007
+ });
1008
+ this.contentId = `sky-repeater-item-content-${++nextContentId}`;
1009
+ this.itemRole$ = this.#repeaterService.itemRole.asObservable();
1010
+ }
1011
+ ngOnInit() {
1012
+ this.#repeaterService.registerItem(this);
1013
+ this.#repeaterService.activeItemChange
1014
+ .pipe(takeUntil(this.#ngUnsubscribe))
1015
+ .subscribe((item) => {
1016
+ const newIsActiveValue = this === item;
1017
+ if (newIsActiveValue !== this.isActive) {
1018
+ this.isActive = newIsActiveValue;
1019
+ this.#changeDetector.markForCheck();
1020
+ }
1021
+ });
1022
+ }
1023
+ ngAfterViewInit() {
1024
+ this.hasItemContent = !!this.repeaterItemContentComponents?.length;
1025
+ this.#updateExpandOnContentChange();
1026
+ }
1027
+ ngOnDestroy() {
1028
+ this.collapse.complete();
1029
+ this.expand.complete();
1030
+ this.inlineFormClose.complete();
1031
+ this.isSelectedChange.complete();
1032
+ this.#ngUnsubscribe.next();
1033
+ this.#ngUnsubscribe.complete();
1034
+ this.#repeaterService.unregisterItem(this);
1035
+ }
1036
+ onKeydown($event) {
1037
+ if ([' ', 'Enter', 'Home', 'End', 'ArrowUp', 'ArrowDown'].includes($event.key)) {
1038
+ if ($event.target.matches('input, textarea, select, option, [contenteditable], [contenteditable] *')) {
1039
+ return;
1040
+ }
1041
+ $event.preventDefault();
1042
+ $event.stopPropagation();
1043
+ let activateItem = undefined;
1044
+ /* istanbul ignore else */
1045
+ if ([' ', 'Enter'].includes($event.key)) {
1046
+ if (this.selectable) {
1047
+ this.isSelected = !this.isSelected;
1048
+ }
1049
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
1050
+ activateItem = this;
1051
+ }
1052
+ /* istanbul ignore else */
1053
+ if (['Home', 'End'].includes($event.key)) {
1054
+ const items = this.#repeaterService.items.filter((item) => !item.disabled);
1055
+ if ($event.key === 'Home') {
1056
+ activateItem = items.shift();
1057
+ }
1058
+ else {
1059
+ activateItem = items.pop();
1060
+ }
1061
+ }
1062
+ /* istanbul ignore else */
1063
+ if (['ArrowUp', 'ArrowDown'].includes($event.key)) {
1064
+ const currentIndex = this.#repeaterService.items.findIndex((item) => item === this);
1065
+ let sliceFrom;
1066
+ let sliceTo;
1067
+ if ($event.key === 'ArrowUp') {
1068
+ sliceFrom = 0;
1069
+ sliceTo = currentIndex;
1070
+ }
1071
+ else {
1072
+ sliceFrom = currentIndex + 1;
1073
+ sliceTo = undefined;
1074
+ }
1075
+ const items = this.#repeaterService.items
1076
+ .slice(sliceFrom, sliceTo)
1077
+ .filter((item) => !item.disabled);
1078
+ activateItem = $event.key === 'ArrowUp' ? items.pop() : items.shift();
1079
+ if (!activateItem) {
1080
+ // Wrap around.
1081
+ if ($event.key === 'ArrowDown') {
1082
+ sliceFrom = 0;
1083
+ sliceTo = currentIndex;
1084
+ }
1085
+ else {
1086
+ sliceFrom = currentIndex + 1;
1087
+ sliceTo = undefined;
1088
+ }
1089
+ const items = this.#repeaterService.items
1090
+ .slice(sliceFrom, sliceTo)
1091
+ .filter((item) => !item.disabled);
1092
+ activateItem = $event.key === 'ArrowUp' ? items.pop() : items.shift();
1093
+ }
1094
+ }
1095
+ /* istanbul ignore else */
1096
+ if (activateItem && !activateItem.isActive) {
1097
+ this.#repeaterService.activateItem(activateItem);
1098
+ if (!activateItem.#elementRef.nativeElement.matches(':focus-within')) {
1099
+ activateItem.itemRef?.nativeElement.focus();
1100
+ }
1101
+ }
1102
+ }
1103
+ }
1104
+ headerClick() {
1105
+ if (this.isCollapsible) {
1106
+ this.updateForExpanded(!this.isExpanded, true);
1107
+ }
1108
+ }
1109
+ chevronDirectionChange(direction) {
1110
+ this.updateForExpanded(direction === 'up', true);
1111
+ }
1112
+ onRepeaterItemClick(event) {
1113
+ // Only activate item if clicking on the title, content, or parent item div.
1114
+ // This will avoid accidental activations when clicking inside interactive elements like
1115
+ // the expand/collapse chevron, dropdown, inline-delete, etc...
1116
+ if (event.target === this.itemRef?.nativeElement ||
1117
+ this.itemContentRef?.nativeElement.contains(event.target) ||
1118
+ this.itemHeaderRef?.nativeElement.contains(event.target)) {
1119
+ this.#repeaterService.activateItem(this);
1120
+ }
1121
+ }
1122
+ updateForExpanded(value, animate) {
1123
+ if (this.isCollapsible === false && value === false) {
1124
+ console.warn(`Setting isExpanded to false when the repeater item is not collapsible
1125
+ will have no effect.`);
1126
+ }
1127
+ else if (this.#isExpanded !== value) {
1128
+ this.#isExpanded = value;
1129
+ if (this.#isExpanded) {
1130
+ this.expand.emit();
1131
+ }
1132
+ else {
1133
+ this.collapse.emit();
1134
+ }
1135
+ this.#repeaterService.onItemCollapseStateChange(this);
1136
+ this.#slideForExpanded(animate);
1137
+ this.#changeDetector.markForCheck();
1138
+ }
1139
+ }
1140
+ onCheckboxChange(value) {
1141
+ this.isSelected = value.checked;
1142
+ }
1143
+ onInlineFormClose(inlineFormCloseArgs) {
1144
+ this.inlineFormClose.emit(inlineFormCloseArgs);
1145
+ }
1146
+ moveToTop(event) {
1147
+ event.stopPropagation();
1148
+ this.#adapterService.moveItemUp(this.#elementRef.nativeElement, true);
1149
+ this.#adapterService.focusElement(event.target);
1150
+ this.#repeaterService.registerOrderChange();
1151
+ }
1152
+ onReorderHandleKeyDown(event) {
1153
+ /*istanbul ignore else */
1154
+ if (event.key) {
1155
+ switch (event.key.toLowerCase()) {
1156
+ case ' ':
1157
+ case 'enter':
1158
+ this.#keyboardToggleReorder();
1159
+ event.preventDefault();
1160
+ event.stopPropagation();
1161
+ break;
1162
+ case 'escape':
1163
+ /* istanbul ignore else */
1164
+ if (this.#keyboardReorderingEnabled) {
1165
+ this.#keyboardReorderingEnabled = false;
1166
+ this.#revertReorderSteps();
1167
+ this.reorderButtonLabel =
1168
+ this.#reorderCancelText + ' ' + this.#reorderInstructions;
1169
+ this.#adapterService.focusElement(event.target);
1170
+ event.preventDefault();
1171
+ event.stopPropagation();
1172
+ }
1173
+ break;
1174
+ case 'arrowup':
1175
+ if (this.#keyboardReorderingEnabled) {
1176
+ this.#keyboardReorderUp();
1177
+ event.preventDefault();
1178
+ event.stopPropagation();
1179
+ this.#repeaterService.registerOrderChange();
1180
+ }
1181
+ break;
1182
+ case 'arrowdown':
1183
+ /* istanbul ignore else */
1184
+ if (this.#keyboardReorderingEnabled) {
1185
+ this.#keyboardReorderDown();
1186
+ event.preventDefault();
1187
+ event.stopPropagation();
1188
+ this.#repeaterService.registerOrderChange();
1189
+ }
1190
+ break;
1191
+ case 'arrowleft':
1192
+ case 'arrowright':
1193
+ /* istanbul ignore else */
1194
+ if (this.#keyboardReorderingEnabled) {
1195
+ event.preventDefault();
1196
+ event.stopPropagation();
1197
+ }
1198
+ break;
1199
+ /* istanbul ignore next */
1200
+ default:
1201
+ break;
1202
+ }
1203
+ }
1204
+ }
1205
+ onReorderHandleBlur(event) {
1206
+ this.#keyboardReorderingEnabled = false;
1207
+ this.#revertReorderSteps();
1208
+ this.reorderButtonLabel = this.#reorderInstructions;
1209
+ this.reorderState = undefined;
1210
+ }
1211
+ #slideForExpanded(animate) {
1212
+ this.animationDisabled = !animate;
1213
+ this.slideDirection = this.isExpanded ? 'down' : 'up';
1214
+ }
1215
+ #keyboardReorderUp() {
1216
+ const newIndex = this.#adapterService.moveItemUp(this.#elementRef.nativeElement);
1217
+ if (newIndex !== undefined) {
1218
+ this.#reorderCurrentIndex = newIndex;
1219
+ this.#reorderSteps--;
1220
+ this.#adapterService.focusElement(this.grabHandle);
1221
+ this.#keyboardReorderingEnabled = true;
1222
+ this.reorderButtonLabel = `${this.#reorderMovedText} ${this.#reorderCurrentIndex + 1}`;
1223
+ }
1224
+ }
1225
+ #keyboardReorderDown() {
1226
+ const newIndex = this.#adapterService.moveItemDown(this.#elementRef.nativeElement);
1227
+ if (newIndex) {
1228
+ this.#reorderCurrentIndex = newIndex;
1229
+ this.#reorderSteps++;
1230
+ this.#adapterService.focusElement(this.grabHandle);
1231
+ this.#keyboardReorderingEnabled = true;
1232
+ this.reorderButtonLabel = `${this.#reorderMovedText} ${this.#reorderCurrentIndex + 1}`;
1233
+ }
1234
+ }
1235
+ #keyboardToggleReorder() {
1236
+ this.#keyboardReorderingEnabled = !this.#keyboardReorderingEnabled;
1237
+ this.#reorderSteps = 0;
1238
+ if (this.#keyboardReorderingEnabled) {
1239
+ this.reorderState = this.#reorderStateDescription;
1240
+ }
1241
+ else {
1242
+ // TODO: Needs improvement to be localized
1243
+ this.reorderState = `${this.#reorderFinishText} ${this.#reorderCurrentIndex + 1} ${this.#reorderInstructions}`;
1244
+ this.#reorderCurrentIndex = -1;
1245
+ }
1246
+ }
1247
+ #revertReorderSteps() {
1248
+ if (this.#reorderSteps < 0) {
1249
+ this.#adapterService.moveItemDown(this.#elementRef.nativeElement, Math.abs(this.#reorderSteps));
1250
+ }
1251
+ else if (this.#reorderSteps > 0) {
1252
+ this.#adapterService.moveItemUp(this.#elementRef.nativeElement, false, this.#reorderSteps);
1253
+ }
1254
+ this.#repeaterService.registerOrderChange();
1255
+ }
1256
+ #updateExpandOnContentChange() {
1257
+ this.repeaterItemContentComponents?.changes
1258
+ .pipe(takeUntil(this.#ngUnsubscribe))
1259
+ .subscribe(() => {
1260
+ this.hasItemContent = !!this.repeaterItemContentComponents?.length;
1261
+ /* istanbul ignore next */
1262
+ this.isCollapsible =
1263
+ this.hasItemContent && this.#repeaterService.expandMode !== 'none';
1264
+ /* istanbul ignore else */
1265
+ if (this.#repeaterService.expandMode === 'single') {
1266
+ this.#repeaterService.onItemCollapseStateChange(this);
1267
+ }
1268
+ });
1269
+ }
1270
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterItemComponent, deps: [{ token: SkyRepeaterService }, { token: i0.ChangeDetectorRef }, { token: SkyRepeaterAdapterService }, { token: i0.ElementRef }, { token: i3$1.SkyLibResourcesService }], target: i0.ɵɵFactoryTarget.Component }); }
1271
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyRepeaterItemComponent, selector: "sky-repeater-item", inputs: { disabled: "disabled", itemName: "itemName", inlineFormConfig: "inlineFormConfig", inlineFormTemplate: "inlineFormTemplate", isExpanded: "isExpanded", isSelected: "isSelected", reorderable: "reorderable", selectable: "selectable", showInlineForm: "showInlineForm", tag: "tag" }, outputs: { collapse: "collapse", expand: "expand", inlineFormClose: "inlineFormClose", isSelectedChange: "isSelectedChange" }, host: { listeners: { "keydown": "onKeydown($event)" }, properties: { "class": "this.repeaterGroupClass" } }, queries: [{ propertyName: "contextMenu", first: true, predicate: SkyRepeaterItemContextMenuComponent, descendants: true, read: ElementRef }, { propertyName: "repeaterItemContentComponents", predicate: SkyRepeaterItemContentComponent }], viewQueries: [{ propertyName: "grabHandle", first: true, predicate: ["grabHandle"], descendants: true, read: ElementRef }, { propertyName: "itemContentRef", first: true, predicate: ["itemContentRef"], descendants: true, read: ElementRef }, { propertyName: "itemHeaderRef", first: true, predicate: ["itemHeaderRef"], descendants: true, read: ElementRef }, { propertyName: "itemRef", first: true, predicate: ["itemRef"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div\n class=\"sky-repeater-item sky-padding-even-default\"\n [attr.aria-label]=\"itemName\"\n [attr.aria-selected]=\"selectable ? !!isSelected : undefined\"\n [attr.role]=\"(itemRole$ | async)?.item\"\n [attr.tabIndex]=\"tabindex\"\n [ngClass]=\"{\n 'sky-repeater-item-active': isActive,\n 'sky-repeater-item-collapsible': isCollapsible,\n 'sky-repeater-item-selected': isSelected\n }\"\n (click)=\"onRepeaterItemClick($event)\"\n #itemRef\n>\n <div #inlineDelete>\n <ng-content select=\"sky-inline-delete\"></ng-content>\n </div>\n\n <ng-container *ngIf=\"inlineFormTemplate\">\n <sky-inline-form\n [config]=\"inlineFormConfig\"\n [showForm]=\"showInlineForm\"\n [template]=\"inlineFormTemplate\"\n (close)=\"onInlineFormClose($event)\"\n >\n <ng-container *ngTemplateOutlet=\"skyRepeaterItemLeft\"></ng-container>\n <ng-container *ngTemplateOutlet=\"skyRepeaterItemRight\"></ng-container>\n </sky-inline-form>\n </ng-container>\n\n <ng-container *ngIf=\"!inlineFormTemplate\">\n <ng-container *ngTemplateOutlet=\"skyRepeaterItemLeft\"></ng-container>\n <ng-container *ngTemplateOutlet=\"skyRepeaterItemRight\"></ng-container>\n </ng-container>\n</div>\n\n<ng-template #skyRepeaterItemLeft>\n <div\n [attr.role]=\"!showInlineForm ? (itemRole$ | async)?.content : undefined\"\n class=\"sky-repeater-item-left\"\n >\n <ng-container *ngIf=\"reorderable\">\n <span\n aria-live=\"assertive\"\n class=\"sky-screen-reader-only\"\n [id]=\"contentId + '-reorder-state'\"\n >\n {{ reorderState }}\n </span>\n <span\n class=\"sky-screen-reader-only\"\n [id]=\"contentId + '-reorder-instructions'\"\n >{{ reorderButtonLabel }}</span\n >\n <button\n class=\"sky-btn sky-tile-tools-control sky-repeater-item-grab-handle\"\n type=\"button\"\n [attr.aria-describedby]=\"contentId + '-reorder-instructions'\"\n [attr.aria-label]=\"\n itemName\n ? ('skyux_repeater_item_reorder_label' | skyLibResources : itemName)\n : ('skyux_repeater_item_reorder_label_default' | skyLibResources)\n \"\n (blur)=\"onReorderHandleBlur($event)\"\n (keydown)=\"onReorderHandleKeyDown($event)\"\n #grabHandle\n >\n <sky-icon icon=\"arrows-v\"></sky-icon>\n </button>\n </ng-container>\n <sky-checkbox\n *ngIf=\"selectable\"\n class=\"sky-repeater-item-checkbox\"\n [checked]=\"isSelected\"\n [label]=\"\n itemName\n ? ('skyux_repeater_item_checkbox_label' | skyLibResources : itemName)\n : ('skyux_repeater_item_checkbox_label_default' | skyLibResources)\n \"\n (change)=\"onCheckboxChange($event)\"\n >\n </sky-checkbox>\n <div\n class=\"sky-repeater-item-context-menu\"\n [hidden]=\"contextMenuEl.children.length === 0\"\n #contextMenuEl\n >\n <ng-content select=\"sky-repeater-item-context-menu\"></ng-content>\n </div>\n </div>\n</ng-template>\n\n<ng-template #skyRepeaterItemRight>\n <div class=\"sky-repeater-item-right\" #itemHeaderRef>\n <div\n class=\"sky-repeater-item-header\"\n [attr.role]=\"(itemRole$ | async)?.title\"\n [hidden]=\"titleRef.children.length === 0\"\n (click)=\"headerClick()\"\n >\n <div class=\"sky-repeater-item-title sky-font-emphasized\" #titleRef>\n <ng-content select=\"sky-repeater-item-title\"></ng-content>\n </div>\n <button\n *ngIf=\"reorderable\"\n class=\"sky-btn sky-btn-link sky-repeater-item-reorder-top\"\n type=\"button\"\n [attr.aria-label]=\"\n itemName\n ? ('skyux_repeater_item_reorder_top_label'\n | skyLibResources : itemName)\n : ('skyux_repeater_item_reorder_top_label_default'\n | skyLibResources)\n \"\n (click)=\"moveToTop($event)\"\n >\n <sky-icon icon=\"arrow-circle-up\"></sky-icon>\n {{ 'skyux_repeater_item_reorder_top' | skyLibResources }}\n </button>\n <div *ngIf=\"isCollapsible\" class=\"sky-repeater-item-chevron\">\n <sky-chevron\n [ariaControls]=\"contentId\"\n [ariaLabel]=\"\n itemName\n ? isExpanded\n ? ('skyux_repeater_item_expand' | skyLibResources : itemName)\n : ('skyux_repeater_item_collapse' | skyLibResources : itemName)\n : isExpanded\n ? ('skyux_repeater_item_expand_default' | skyLibResources)\n : ('skyux_repeater_item_collapse_default' | skyLibResources)\n \"\n [direction]=\"isExpanded ? 'up' : 'down'\"\n (directionChange)=\"chevronDirectionChange($event)\"\n >\n </sky-chevron>\n </div>\n <!-- Used for when the chevron is hidden to ensure that the right side is the same height as the left.-->\n <div\n *ngIf=\"!isCollapsible && !contextMenu\"\n class=\"sky-repeater-item-chevron-placeholder\"\n ></div>\n <!-- Used to ensure that the right side is the same height as the left.-->\n <div\n *ngIf=\"contextMenu\"\n class=\"sky-repeater-item-chevron-placeholder-with-context\"\n ></div>\n </div>\n <div\n class=\"sky-repeater-item-content\"\n [id]=\"contentId\"\n [@.disabled]=\"animationDisabled\"\n [@skyAnimationSlide]=\"slideDirection\"\n #itemContentRef\n [attr.role]=\"(itemRole$ | async)?.content\"\n >\n <ng-content select=\"sky-repeater-item-content\"></ng-content>\n </div>\n </div>\n</ng-template>\n", styles: ["sky-repeater-item .sky-repeater-item{display:flex;border-bottom:1px dotted #cdcfd2;padding-top:0;position:relative;transition:box-shadow .15s;align-items:flex-start}sky-repeater-item .sky-repeater-item sky-inline-form{display:block;width:100%}sky-repeater-item .sky-repeater-item sky-inline-form>:first-child,sky-repeater-item .sky-repeater-item sky-inline-form .sky-slide-dissolve-first,sky-repeater-item .sky-repeater-item sky-inline-form .sky-slide-dissolve-last{display:flex;align-items:flex-start;flex:1 0 auto;width:100%}sky-repeater-item .sky-repeater-item sky-inline-form .sky-slide-dissolve-last{padding-top:10px}sky-repeater-item .sky-repeater-item.sky-repeater-item-active{background-color:#eeeeef;color:#212327;padding-left:6px;border-left:4px solid #00b4f1}sky-repeater-item .sky-repeater-item.sky-repeater-item-active .sky-inline-delete{margin-left:-4px;width:calc(100% + 4px)}sky-repeater-item .sky-repeater-item-left{display:flex;padding-top:10px;align-items:center}sky-repeater-item .sky-repeater-item-left sky-checkbox{display:flex}sky-repeater-item .sky-repeater-item-right{max-width:100%;flex-grow:1;align-self:center}sky-repeater-item .sky-repeater-item-header{align-items:center;display:flex;padding-top:10px}sky-repeater-item .sky-repeater-item-chevron{margin-left:10px}sky-repeater-item .sky-repeater-item-chevron-placeholder{height:24px}sky-repeater-item .sky-repeater-item-chevron-placeholder-with-context{height:29px}sky-repeater-item .sky-repeater-item-context-menu{padding:0 10px 0 0}sky-repeater-item .sky-repeater-item-checkbox{padding:0 5px 0 0}sky-repeater-item .sky-repeater-item-selected{background-color:#f1eef6;transition:background-color .15s}sky-repeater-item .sky-repeater-item-title{margin:0;flex-grow:1;line-height:1.1;color:#212327}sky-repeater-item sky-repeater-item-content{display:block;margin:10px 0 0}sky-repeater-item .sky-repeater-item-collapsible .sky-repeater-item-header{cursor:pointer}sky-repeater-item .sky-repeater-item-collapsible .sky-repeater-item-content{padding-right:34px}sky-repeater-item .sky-repeater-item-collapsed .sky-repeater-item-content{display:none}sky-repeater-item .sky-repeater-item-grab-handle{color:#cdcfd2;cursor:pointer;border:0;width:24px;height:24px;cursor:grab;cursor:-moz-grab;padding:0;margin:5px 10px 5px 0}sky-repeater-item .sky-repeater-item-grab-handle:hover{color:#979ba2;transition:color .15s}sky-repeater-item.sky-repeater-item-dragging.gu-mirror{opacity:initial;-ms-filter:initial;filter:initial;background-color:#fff;box-shadow:0 0 5px #0000004d}sky-repeater-item.sky-repeater-item-dragging.gu-transit .sky-repeater-item{background-color:#d8d8d8}sky-repeater-item.sky-repeater-item-dragging.gu-transit .sky-repeater-item .sky-repeater-item-left,sky-repeater-item.sky-repeater-item-dragging.gu-transit .sky-repeater-item .sky-repeater-item-right{visibility:hidden}sky-repeater-item.sky-repeater-item-dragging .sky-repeater-item-grab-handle{cursor:grabbing;cursor:-webkit-grabbing}.sky-theme-modern sky-repeater-item .sky-repeater-item{padding-bottom:20px}.sky-theme-modern sky-repeater-item .sky-repeater-item.sky-repeater-item-active{background-color:transparent;border-left-color:#1870b8}.sky-theme-modern sky-repeater-item .sky-repeater-item:focus,.sky-theme-modern sky-repeater-item .sky-repeater-item:active:focus{outline:solid 2px #1870B8;outline-offset:-2px}.sky-theme-modern sky-repeater-item .sky-repeater-item:focus:not(:active){box-shadow:0 1px 8px #0000004d}.sky-theme-modern sky-repeater-item .sky-repeater-item-header[hidden]+.sky-repeater-item-content sky-repeater-item-content{margin:20px 0 0}.sky-theme-modern sky-repeater-item .sky-repeater-item-header,.sky-theme-modern sky-repeater-item .sky-repeater-item-left{padding-top:20px}.sky-theme-modern sky-repeater-item sky-inline-form .sky-slide-dissolve-last{padding-top:20px}.sky-theme-modern.sky-theme-mode-dark sky-repeater-item .sky-repeater-item{border-bottom-color:#686c73}.sky-theme-modern.sky-theme-mode-dark sky-repeater-item .sky-repeater-item.sky-repeater-item-active{color:#fbfcfe}.sky-theme-modern.sky-theme-mode-dark sky-repeater-item .sky-repeater-item-title{color:#fbfcfe}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.λ2, selector: "sky-chevron", inputs: ["ariaControls", "ariaLabel", "direction", "disabled"], outputs: ["directionChange"] }, { kind: "component", type: i6.λ3, selector: "sky-checkbox", inputs: ["label", "labelledBy", "id", "disabled", "tabindex", "name", "icon", "checkboxType", "checked", "indeterminate", "required"], outputs: ["change", "checkedChange", "disabledChange", "indeterminateChange"] }, { kind: "component", type: i2.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { kind: "component", type: i7.λ1, selector: "sky-inline-form", inputs: ["config", "template", "showForm"], outputs: ["close"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i3$1.SkyLibResourcesPipe, name: "skyLibResources" }], animations: [skyAnimationSlide], encapsulation: i0.ViewEncapsulation.None }); }
1272
+ }
1273
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterItemComponent, decorators: [{
1274
+ type: Component,
1275
+ args: [{ selector: 'sky-repeater-item', animations: [skyAnimationSlide], encapsulation: ViewEncapsulation.None, template: "<div\n class=\"sky-repeater-item sky-padding-even-default\"\n [attr.aria-label]=\"itemName\"\n [attr.aria-selected]=\"selectable ? !!isSelected : undefined\"\n [attr.role]=\"(itemRole$ | async)?.item\"\n [attr.tabIndex]=\"tabindex\"\n [ngClass]=\"{\n 'sky-repeater-item-active': isActive,\n 'sky-repeater-item-collapsible': isCollapsible,\n 'sky-repeater-item-selected': isSelected\n }\"\n (click)=\"onRepeaterItemClick($event)\"\n #itemRef\n>\n <div #inlineDelete>\n <ng-content select=\"sky-inline-delete\"></ng-content>\n </div>\n\n <ng-container *ngIf=\"inlineFormTemplate\">\n <sky-inline-form\n [config]=\"inlineFormConfig\"\n [showForm]=\"showInlineForm\"\n [template]=\"inlineFormTemplate\"\n (close)=\"onInlineFormClose($event)\"\n >\n <ng-container *ngTemplateOutlet=\"skyRepeaterItemLeft\"></ng-container>\n <ng-container *ngTemplateOutlet=\"skyRepeaterItemRight\"></ng-container>\n </sky-inline-form>\n </ng-container>\n\n <ng-container *ngIf=\"!inlineFormTemplate\">\n <ng-container *ngTemplateOutlet=\"skyRepeaterItemLeft\"></ng-container>\n <ng-container *ngTemplateOutlet=\"skyRepeaterItemRight\"></ng-container>\n </ng-container>\n</div>\n\n<ng-template #skyRepeaterItemLeft>\n <div\n [attr.role]=\"!showInlineForm ? (itemRole$ | async)?.content : undefined\"\n class=\"sky-repeater-item-left\"\n >\n <ng-container *ngIf=\"reorderable\">\n <span\n aria-live=\"assertive\"\n class=\"sky-screen-reader-only\"\n [id]=\"contentId + '-reorder-state'\"\n >\n {{ reorderState }}\n </span>\n <span\n class=\"sky-screen-reader-only\"\n [id]=\"contentId + '-reorder-instructions'\"\n >{{ reorderButtonLabel }}</span\n >\n <button\n class=\"sky-btn sky-tile-tools-control sky-repeater-item-grab-handle\"\n type=\"button\"\n [attr.aria-describedby]=\"contentId + '-reorder-instructions'\"\n [attr.aria-label]=\"\n itemName\n ? ('skyux_repeater_item_reorder_label' | skyLibResources : itemName)\n : ('skyux_repeater_item_reorder_label_default' | skyLibResources)\n \"\n (blur)=\"onReorderHandleBlur($event)\"\n (keydown)=\"onReorderHandleKeyDown($event)\"\n #grabHandle\n >\n <sky-icon icon=\"arrows-v\"></sky-icon>\n </button>\n </ng-container>\n <sky-checkbox\n *ngIf=\"selectable\"\n class=\"sky-repeater-item-checkbox\"\n [checked]=\"isSelected\"\n [label]=\"\n itemName\n ? ('skyux_repeater_item_checkbox_label' | skyLibResources : itemName)\n : ('skyux_repeater_item_checkbox_label_default' | skyLibResources)\n \"\n (change)=\"onCheckboxChange($event)\"\n >\n </sky-checkbox>\n <div\n class=\"sky-repeater-item-context-menu\"\n [hidden]=\"contextMenuEl.children.length === 0\"\n #contextMenuEl\n >\n <ng-content select=\"sky-repeater-item-context-menu\"></ng-content>\n </div>\n </div>\n</ng-template>\n\n<ng-template #skyRepeaterItemRight>\n <div class=\"sky-repeater-item-right\" #itemHeaderRef>\n <div\n class=\"sky-repeater-item-header\"\n [attr.role]=\"(itemRole$ | async)?.title\"\n [hidden]=\"titleRef.children.length === 0\"\n (click)=\"headerClick()\"\n >\n <div class=\"sky-repeater-item-title sky-font-emphasized\" #titleRef>\n <ng-content select=\"sky-repeater-item-title\"></ng-content>\n </div>\n <button\n *ngIf=\"reorderable\"\n class=\"sky-btn sky-btn-link sky-repeater-item-reorder-top\"\n type=\"button\"\n [attr.aria-label]=\"\n itemName\n ? ('skyux_repeater_item_reorder_top_label'\n | skyLibResources : itemName)\n : ('skyux_repeater_item_reorder_top_label_default'\n | skyLibResources)\n \"\n (click)=\"moveToTop($event)\"\n >\n <sky-icon icon=\"arrow-circle-up\"></sky-icon>\n {{ 'skyux_repeater_item_reorder_top' | skyLibResources }}\n </button>\n <div *ngIf=\"isCollapsible\" class=\"sky-repeater-item-chevron\">\n <sky-chevron\n [ariaControls]=\"contentId\"\n [ariaLabel]=\"\n itemName\n ? isExpanded\n ? ('skyux_repeater_item_expand' | skyLibResources : itemName)\n : ('skyux_repeater_item_collapse' | skyLibResources : itemName)\n : isExpanded\n ? ('skyux_repeater_item_expand_default' | skyLibResources)\n : ('skyux_repeater_item_collapse_default' | skyLibResources)\n \"\n [direction]=\"isExpanded ? 'up' : 'down'\"\n (directionChange)=\"chevronDirectionChange($event)\"\n >\n </sky-chevron>\n </div>\n <!-- Used for when the chevron is hidden to ensure that the right side is the same height as the left.-->\n <div\n *ngIf=\"!isCollapsible && !contextMenu\"\n class=\"sky-repeater-item-chevron-placeholder\"\n ></div>\n <!-- Used to ensure that the right side is the same height as the left.-->\n <div\n *ngIf=\"contextMenu\"\n class=\"sky-repeater-item-chevron-placeholder-with-context\"\n ></div>\n </div>\n <div\n class=\"sky-repeater-item-content\"\n [id]=\"contentId\"\n [@.disabled]=\"animationDisabled\"\n [@skyAnimationSlide]=\"slideDirection\"\n #itemContentRef\n [attr.role]=\"(itemRole$ | async)?.content\"\n >\n <ng-content select=\"sky-repeater-item-content\"></ng-content>\n </div>\n </div>\n</ng-template>\n", styles: ["sky-repeater-item .sky-repeater-item{display:flex;border-bottom:1px dotted #cdcfd2;padding-top:0;position:relative;transition:box-shadow .15s;align-items:flex-start}sky-repeater-item .sky-repeater-item sky-inline-form{display:block;width:100%}sky-repeater-item .sky-repeater-item sky-inline-form>:first-child,sky-repeater-item .sky-repeater-item sky-inline-form .sky-slide-dissolve-first,sky-repeater-item .sky-repeater-item sky-inline-form .sky-slide-dissolve-last{display:flex;align-items:flex-start;flex:1 0 auto;width:100%}sky-repeater-item .sky-repeater-item sky-inline-form .sky-slide-dissolve-last{padding-top:10px}sky-repeater-item .sky-repeater-item.sky-repeater-item-active{background-color:#eeeeef;color:#212327;padding-left:6px;border-left:4px solid #00b4f1}sky-repeater-item .sky-repeater-item.sky-repeater-item-active .sky-inline-delete{margin-left:-4px;width:calc(100% + 4px)}sky-repeater-item .sky-repeater-item-left{display:flex;padding-top:10px;align-items:center}sky-repeater-item .sky-repeater-item-left sky-checkbox{display:flex}sky-repeater-item .sky-repeater-item-right{max-width:100%;flex-grow:1;align-self:center}sky-repeater-item .sky-repeater-item-header{align-items:center;display:flex;padding-top:10px}sky-repeater-item .sky-repeater-item-chevron{margin-left:10px}sky-repeater-item .sky-repeater-item-chevron-placeholder{height:24px}sky-repeater-item .sky-repeater-item-chevron-placeholder-with-context{height:29px}sky-repeater-item .sky-repeater-item-context-menu{padding:0 10px 0 0}sky-repeater-item .sky-repeater-item-checkbox{padding:0 5px 0 0}sky-repeater-item .sky-repeater-item-selected{background-color:#f1eef6;transition:background-color .15s}sky-repeater-item .sky-repeater-item-title{margin:0;flex-grow:1;line-height:1.1;color:#212327}sky-repeater-item sky-repeater-item-content{display:block;margin:10px 0 0}sky-repeater-item .sky-repeater-item-collapsible .sky-repeater-item-header{cursor:pointer}sky-repeater-item .sky-repeater-item-collapsible .sky-repeater-item-content{padding-right:34px}sky-repeater-item .sky-repeater-item-collapsed .sky-repeater-item-content{display:none}sky-repeater-item .sky-repeater-item-grab-handle{color:#cdcfd2;cursor:pointer;border:0;width:24px;height:24px;cursor:grab;cursor:-moz-grab;padding:0;margin:5px 10px 5px 0}sky-repeater-item .sky-repeater-item-grab-handle:hover{color:#979ba2;transition:color .15s}sky-repeater-item.sky-repeater-item-dragging.gu-mirror{opacity:initial;-ms-filter:initial;filter:initial;background-color:#fff;box-shadow:0 0 5px #0000004d}sky-repeater-item.sky-repeater-item-dragging.gu-transit .sky-repeater-item{background-color:#d8d8d8}sky-repeater-item.sky-repeater-item-dragging.gu-transit .sky-repeater-item .sky-repeater-item-left,sky-repeater-item.sky-repeater-item-dragging.gu-transit .sky-repeater-item .sky-repeater-item-right{visibility:hidden}sky-repeater-item.sky-repeater-item-dragging .sky-repeater-item-grab-handle{cursor:grabbing;cursor:-webkit-grabbing}.sky-theme-modern sky-repeater-item .sky-repeater-item{padding-bottom:20px}.sky-theme-modern sky-repeater-item .sky-repeater-item.sky-repeater-item-active{background-color:transparent;border-left-color:#1870b8}.sky-theme-modern sky-repeater-item .sky-repeater-item:focus,.sky-theme-modern sky-repeater-item .sky-repeater-item:active:focus{outline:solid 2px #1870B8;outline-offset:-2px}.sky-theme-modern sky-repeater-item .sky-repeater-item:focus:not(:active){box-shadow:0 1px 8px #0000004d}.sky-theme-modern sky-repeater-item .sky-repeater-item-header[hidden]+.sky-repeater-item-content sky-repeater-item-content{margin:20px 0 0}.sky-theme-modern sky-repeater-item .sky-repeater-item-header,.sky-theme-modern sky-repeater-item .sky-repeater-item-left{padding-top:20px}.sky-theme-modern sky-repeater-item sky-inline-form .sky-slide-dissolve-last{padding-top:20px}.sky-theme-modern.sky-theme-mode-dark sky-repeater-item .sky-repeater-item{border-bottom-color:#686c73}.sky-theme-modern.sky-theme-mode-dark sky-repeater-item .sky-repeater-item.sky-repeater-item-active{color:#fbfcfe}.sky-theme-modern.sky-theme-mode-dark sky-repeater-item .sky-repeater-item-title{color:#fbfcfe}\n"] }]
1276
+ }], ctorParameters: function () { return [{ type: SkyRepeaterService }, { type: i0.ChangeDetectorRef }, { type: SkyRepeaterAdapterService }, { type: i0.ElementRef }, { type: i3$1.SkyLibResourcesService }]; }, propDecorators: { disabled: [{
1277
+ type: Input
1278
+ }], itemName: [{
1279
+ type: Input
1280
+ }], inlineFormConfig: [{
1281
+ type: Input
1282
+ }], inlineFormTemplate: [{
1283
+ type: Input
1284
+ }], isExpanded: [{
1285
+ type: Input
1286
+ }], isSelected: [{
1287
+ type: Input
1288
+ }], reorderable: [{
1289
+ type: Input
1290
+ }], selectable: [{
1291
+ type: Input
1292
+ }], showInlineForm: [{
1293
+ type: Input
1294
+ }], tag: [{
1295
+ type: Input
1296
+ }], collapse: [{
1297
+ type: Output
1298
+ }], expand: [{
1299
+ type: Output
1300
+ }], inlineFormClose: [{
1301
+ type: Output
1302
+ }], isSelectedChange: [{
1303
+ type: Output
1304
+ }], contextMenu: [{
1305
+ type: ContentChild,
1306
+ args: [SkyRepeaterItemContextMenuComponent, { read: ElementRef }]
1307
+ }], repeaterGroupClass: [{
1308
+ type: HostBinding,
1309
+ args: ['class']
1310
+ }], grabHandle: [{
1311
+ type: ViewChild,
1312
+ args: ['grabHandle', { read: ElementRef }]
1313
+ }], itemContentRef: [{
1314
+ type: ViewChild,
1315
+ args: ['itemContentRef', { read: ElementRef }]
1316
+ }], itemHeaderRef: [{
1317
+ type: ViewChild,
1318
+ args: ['itemHeaderRef', { read: ElementRef }]
1319
+ }], itemRef: [{
1320
+ type: ViewChild,
1321
+ args: ['itemRef', { read: ElementRef }]
1322
+ }], repeaterItemContentComponents: [{
1323
+ type: ContentChildren,
1324
+ args: [SkyRepeaterItemContentComponent]
1325
+ }], onKeydown: [{
1326
+ type: HostListener,
1327
+ args: ['keydown', ['$event']]
1328
+ }] } });
1329
+
1330
+ /**
1331
+ * @internal
1332
+ */
1333
+ class SkyRepeaterAutoScrollService {
1334
+ autoScroll(elements, options) {
1335
+ return autoScroll(elements, options);
1336
+ }
1337
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterAutoScrollService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1338
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterAutoScrollService }); }
1339
+ }
1340
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterAutoScrollService, decorators: [{
1341
+ type: Injectable
1342
+ }] });
1343
+
1344
+ /**
1345
+ * Creates a container to display repeater items.
1346
+ */
1347
+ class SkyRepeaterComponent {
1348
+ /**
1349
+ * The layout that determines which repeater items are expanded by default and whether
1350
+ * repeater items are expandable and collapsible. Collapsed items display titles only.
1351
+ * The valid options are `multiple`, `none`, and `single`.
1352
+ * - `multiple` loads repeater items in an expanded state unless `isExpanded` is set to
1353
+ * `false` for a repeater item. This layout allows users to expand and collapse
1354
+ * as many repeater items as necessary. It is best-suited to repeater items where body
1355
+ * content is important but users don't always need to see it.
1356
+ * - `none` loads all repeater items in an expanded state and does not allow users to
1357
+ * collapse them. This default layout provides the quickest access to the details in the
1358
+ * repeater items. It is best-suited to repeater items with concise content
1359
+ * that users need to view frequently.
1360
+ * - `single` loads one repeater item in an expanded state and collapses all others.
1361
+ * The expanded repeater item is the first one where `isExpanded` is set to `true`. This layout
1362
+ * allows users to expand one item at a time. It provides the most compact view and is
1363
+ * best-suited to repeater items where the most important information is in the titles
1364
+ * and users only occasionally need to view the body content.
1365
+ * @default "none"
1366
+ */
1367
+ set expandMode(value) {
1368
+ this.#repeaterService.expandMode = value;
1369
+ this.#updateForExpandMode();
1370
+ }
1371
+ get expandMode() {
1372
+ return this.#repeaterService.expandMode;
1373
+ }
1374
+ #autoScroller;
1375
+ #ngUnsubscribe;
1376
+ #itemNameWarned;
1377
+ #adapterService;
1378
+ #changeDetector;
1379
+ #dragulaService;
1380
+ #elementRef;
1381
+ #renderer;
1382
+ #repeaterService;
1383
+ #autoScrollSvc;
1384
+ #scrollableHostSvc;
1385
+ #logSvc;
1386
+ constructor() {
1387
+ /**
1388
+ * Whether users can change the order of items in the repeater list.
1389
+ * Each repeater item also has `reorderable` property to indicate whether
1390
+ * users can change its order.
1391
+ */
1392
+ this.reorderable = false;
1393
+ /**
1394
+ * Fires when the active repeater item changes.
1395
+ */
1396
+ this.activeIndexChange = new EventEmitter();
1397
+ /**
1398
+ * Fires when users change the order of repeater items.
1399
+ * This event emits an ordered array of the `tag` properties that the consumer provides for each repeater item.
1400
+ */
1401
+ this.orderChange = new EventEmitter();
1402
+ this.#ngUnsubscribe = new Subject();
1403
+ this.#itemNameWarned = false;
1404
+ this.#adapterService = inject(SkyRepeaterAdapterService);
1405
+ this.#changeDetector = inject(ChangeDetectorRef);
1406
+ this.#dragulaService = inject(DragulaService);
1407
+ this.#elementRef = inject(ElementRef);
1408
+ this.#renderer = inject(Renderer2);
1409
+ this.#repeaterService = inject(SkyRepeaterService);
1410
+ this.#autoScrollSvc = inject(SkyRepeaterAutoScrollService);
1411
+ this.#scrollableHostSvc = inject(SkyScrollableHostService);
1412
+ this.#logSvc = inject(SkyLogService);
1413
+ this.dragulaGroupName = `sky-repeater-dragula-${this.#repeaterService.repeaterGroupId}`;
1414
+ this.#repeaterService.itemCollapseStateChange
1415
+ .pipe(takeUntil(this.#ngUnsubscribe))
1416
+ .subscribe((item) => {
1417
+ if (this.expandMode === 'single' && item.isExpanded) {
1418
+ this.items?.forEach((otherItem) => {
1419
+ if (otherItem !== item &&
1420
+ otherItem.isExpanded &&
1421
+ otherItem.isCollapsible) {
1422
+ otherItem.isExpanded = false;
1423
+ }
1424
+ });
1425
+ }
1426
+ });
1427
+ this.#repeaterService.activeItemIndexChange
1428
+ .pipe(takeUntil(this.#ngUnsubscribe))
1429
+ .subscribe((index) => {
1430
+ if (index !== this.activeIndex) {
1431
+ this.activeIndex = index;
1432
+ this.activeIndexChange.emit(index);
1433
+ }
1434
+ });
1435
+ this.#repeaterService.orderChange
1436
+ .pipe(takeUntil(this.#ngUnsubscribe))
1437
+ .subscribe(() => {
1438
+ this.#emitTags();
1439
+ });
1440
+ this.#updateForExpandMode();
1441
+ this.#adapterService.setRepeaterHost(this.#elementRef);
1442
+ this.#initializeDragAndDrop();
1443
+ }
1444
+ ngAfterContentInit() {
1445
+ // If activeIndex has been set on init, call service to activate the appropriate item.
1446
+ setTimeout(() => {
1447
+ if (this.activeIndex || this.activeIndex === 0) {
1448
+ this.#repeaterService.activateItemByIndex(this.activeIndex);
1449
+ }
1450
+ this.#validateTags();
1451
+ });
1452
+ // HACK: Not updating for expand mode in a timeout causes an error.
1453
+ // https://github.com/angular/angular/issues/6005
1454
+ this.items?.changes.pipe(takeUntil(this.#ngUnsubscribe)).subscribe(() => {
1455
+ setTimeout(() => {
1456
+ if (this.items?.length) {
1457
+ this.#updateForExpandMode(this.items.last);
1458
+ this.#updateReorderability();
1459
+ this.#repeaterService.items = this.items.toArray();
1460
+ }
1461
+ if (this.activeIndex !== undefined) {
1462
+ this.#repeaterService.activateItemByIndex(this.activeIndex);
1463
+ }
1464
+ this.#updateRole();
1465
+ this.#validateTags();
1466
+ });
1467
+ });
1468
+ setTimeout(() => {
1469
+ this.#updateForExpandMode();
1470
+ this.items?.forEach((item) => {
1471
+ item.reorderable = this.reorderable;
1472
+ });
1473
+ this.#updateRole();
1474
+ }, 0);
1475
+ }
1476
+ ngAfterViewChecked() {
1477
+ if (!this.#itemNameWarned && this.items?.some((item) => !item.itemName)) {
1478
+ this.#logSvc?.deprecated('SkyRepeaterItemComponent without `itemName`', {
1479
+ deprecationMajorVersion: 8,
1480
+ replacementRecommendation: 'Always specify an `itemName` property.',
1481
+ });
1482
+ this.#itemNameWarned = true;
1483
+ }
1484
+ }
1485
+ ngOnChanges(changes) {
1486
+ if (changes['activeIndex']) {
1487
+ this.#repeaterService.enableActiveState = true;
1488
+ if (changes['activeIndex'].currentValue !==
1489
+ changes['activeIndex'].previousValue) {
1490
+ this.#repeaterService.activateItemByIndex(this.activeIndex);
1491
+ }
1492
+ }
1493
+ if (changes['reorderable']) {
1494
+ if (this.items) {
1495
+ this.#updateReorderability();
1496
+ }
1497
+ this.#updateRole();
1498
+ this.#changeDetector.markForCheck();
1499
+ }
1500
+ }
1501
+ ngOnDestroy() {
1502
+ this.#ngUnsubscribe.next();
1503
+ this.#ngUnsubscribe.complete();
1504
+ this.#destroyDragAndDrop();
1505
+ }
1506
+ ngOnInit() {
1507
+ this.#updateRole();
1508
+ }
1509
+ onCdkObserveContent() {
1510
+ this.#updateRole();
1511
+ }
1512
+ #updateForExpandMode(itemAdded) {
1513
+ if (this.items) {
1514
+ let foundExpanded = false;
1515
+ const isCollapsible = this.expandMode !== 'none';
1516
+ const isSingle = this.expandMode === 'single';
1517
+ // Keep any newly-added expanded item expanded and collapse the rest.
1518
+ if (itemAdded && itemAdded.isExpanded) {
1519
+ foundExpanded = true;
1520
+ }
1521
+ for (const item of this.items) {
1522
+ item.isCollapsible = isCollapsible && !!item.hasItemContent;
1523
+ // Collapse any items that aren't the item that was just added.
1524
+ if (item !== itemAdded && isSingle && item.isExpanded) {
1525
+ if (foundExpanded) {
1526
+ // If this item is being collapsed because a new item was
1527
+ // added, animate it.
1528
+ item.updateForExpanded(false, !!itemAdded);
1529
+ }
1530
+ foundExpanded = true;
1531
+ }
1532
+ }
1533
+ this.#updateRole();
1534
+ }
1535
+ }
1536
+ #initializeDragAndDrop() {
1537
+ /* Sanity check that we haven't already set up dragging abilities */
1538
+ /* istanbul ignore else */
1539
+ if (!this.#dragulaService.find(this.dragulaGroupName)) {
1540
+ this.#dragulaService.createGroup(this.dragulaGroupName, {
1541
+ moves: (el, _container, handle) => {
1542
+ const target = el?.querySelector('.sky-repeater-item-grab-handle');
1543
+ return !!(this.reorderable && target?.contains(handle));
1544
+ },
1545
+ });
1546
+ }
1547
+ let draggedItemIndex = -1;
1548
+ this.#dragulaService
1549
+ .drag(this.dragulaGroupName)
1550
+ .pipe(takeUntil(this.#ngUnsubscribe))
1551
+ .subscribe((args) => {
1552
+ /* istanbul ignore else */
1553
+ if (args.name === this.dragulaGroupName) {
1554
+ this.#destroyAutoScroll();
1555
+ this.#autoScroller = this.#autoScrollSvc.autoScroll([this.#scrollableHostSvc.getScrollableHost(this.#elementRef)], {
1556
+ margin: 20,
1557
+ maxSpeed: 10,
1558
+ scrollWhenOutside: true,
1559
+ autoScroll: () => true,
1560
+ });
1561
+ this.#renderer.addClass(args.el, 'sky-repeater-item-dragging');
1562
+ draggedItemIndex = this.#adapterService.getRepeaterItemIndex(args.el);
1563
+ }
1564
+ });
1565
+ this.#dragulaService
1566
+ .dragend(this.dragulaGroupName)
1567
+ .pipe(takeUntil(this.#ngUnsubscribe))
1568
+ .subscribe((args) => {
1569
+ /* istanbul ignore else */
1570
+ if (args.name === this.dragulaGroupName) {
1571
+ this.#destroyAutoScroll();
1572
+ this.#renderer.removeClass(args.el, 'sky-repeater-item-dragging');
1573
+ const newItemIndex = this.#adapterService.getRepeaterItemIndex(args.el);
1574
+ /* sanity check */
1575
+ /* istanbul ignore else */
1576
+ if (draggedItemIndex >= 0) {
1577
+ this.#repeaterService.reorderItem(draggedItemIndex, newItemIndex);
1578
+ draggedItemIndex = -1;
1579
+ }
1580
+ this.#emitTags();
1581
+ }
1582
+ });
1583
+ }
1584
+ #destroyDragAndDrop() {
1585
+ /* Sanity check that we have set up dragging abilities */
1586
+ /* istanbul ignore else */
1587
+ if (this.#dragulaService.find(this.dragulaGroupName)) {
1588
+ this.#dragulaService.destroy(this.dragulaGroupName);
1589
+ }
1590
+ this.#destroyAutoScroll();
1591
+ }
1592
+ #destroyAutoScroll() {
1593
+ if (this.#autoScroller) {
1594
+ this.#autoScroller.destroy();
1595
+ this.#autoScroller = undefined;
1596
+ }
1597
+ }
1598
+ #emitTags() {
1599
+ const tags = this.#repeaterService.items.map((item) => item.tag);
1600
+ this.orderChange.emit(tags);
1601
+ }
1602
+ #everyItemHasTag() {
1603
+ /* sanity check */
1604
+ /* istanbul ignore if */
1605
+ if (!this.items || this.items.length === 0) {
1606
+ return false;
1607
+ }
1608
+ return this.items.toArray().every((item) => {
1609
+ return item.tag !== undefined;
1610
+ });
1611
+ }
1612
+ #updateRole() {
1613
+ // Determine a role using a hierarchy based on https://www.w3.org/TR/wai-aria-practices-1.1/
1614
+ // 1. If there are one or more interactions in the repeater item projected content, use grid.
1615
+ // 2. If there are selectable repeater items and no other interactions, use listbox.
1616
+ // 3. If there are no interactions, use list.
1617
+ // Default to list role.
1618
+ let autoRole = 'list';
1619
+ const roleMap = {
1620
+ list: { item: 'listitem', title: undefined, content: undefined },
1621
+ listbox: { item: 'option', title: undefined, content: undefined },
1622
+ grid: { item: 'row', title: 'rowheader', content: 'gridcell' },
1623
+ };
1624
+ // Based on https://html.spec.whatwg.org/multipage/dom.html#interactive-content
1625
+ const interactionSelector = [
1626
+ 'a[href]',
1627
+ 'audio[controls]',
1628
+ 'button',
1629
+ 'details',
1630
+ 'embed',
1631
+ 'iframe',
1632
+ 'img[usemap]',
1633
+ 'input:not([type="hidden"])',
1634
+ 'label',
1635
+ 'select',
1636
+ 'textarea',
1637
+ 'video[controls]',
1638
+ '[contenteditable]',
1639
+ '.sky-repeater[role="grid"]',
1640
+ ]
1641
+ .map((selector) => `sky-repeater-item-title ${selector}:not([hidden]), sky-repeater-item-content ${selector}:not([hidden])`)
1642
+ .concat([`skyux-dropdown`])
1643
+ .join(', ');
1644
+ const hasInteraction = this.reorderable ||
1645
+ this.items?.some((item) => item.isCollapsible) ||
1646
+ this.items?.some((item) => !!item.selectable) ||
1647
+ !!this.#elementRef.nativeElement.querySelector(interactionSelector);
1648
+ if (hasInteraction) {
1649
+ // If the repeater matches interaction selector https://www.w3.org/TR/wai-aria-practices-1.1/#grid
1650
+ autoRole = 'grid';
1651
+ }
1652
+ if (this.role !== autoRole) {
1653
+ this.#repeaterService.itemRole.next({
1654
+ ...roleMap[autoRole],
1655
+ });
1656
+ this.role = `${autoRole}`;
1657
+ this.#changeDetector.markForCheck();
1658
+ }
1659
+ }
1660
+ #updateReorderability() {
1661
+ if (this.items) {
1662
+ for (const item of this.items) {
1663
+ item.reorderable = this.reorderable;
1664
+ }
1665
+ }
1666
+ }
1667
+ #validateTags() {
1668
+ if (this.reorderable && !this.#everyItemHasTag()) {
1669
+ console.warn('Please supply tag properties for each repeater item when reordering functionality is enabled.');
1670
+ }
1671
+ }
1672
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1673
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyRepeaterComponent, selector: "sky-repeater", inputs: { activeIndex: "activeIndex", ariaLabel: "ariaLabel", reorderable: "reorderable", expandMode: "expandMode" }, outputs: { activeIndexChange: "activeIndexChange", orderChange: "orderChange" }, providers: [
1674
+ SkyRepeaterService,
1675
+ SkyRepeaterAdapterService,
1676
+ SkyRepeaterAutoScrollService,
1677
+ ], queries: [{ propertyName: "items", predicate: SkyRepeaterItemComponent }], usesOnChanges: true, ngImport: i0, template: "<ng-container #repeaterHost>\n <div\n class=\"sky-repeater\"\n [attr.role]=\"role\"\n [attr.aria-label]=\"ariaLabel || ('skyux_repeater_label' | skyLibResources)\"\n [dragula]=\"dragulaGroupName\"\n (cdkObserveContent)=\"onCdkObserveContent()\"\n >\n <ng-content></ng-content>\n </div>\n</ng-container>\n", styles: [".sky-repeater{padding:0}\n"], dependencies: [{ kind: "directive", type: i1$2.DragulaDirective, selector: "[dragula]", inputs: ["dragula", "dragulaModel"], outputs: ["dragulaModelChange"] }, { kind: "directive", type: i2$1.CdkObserveContent, selector: "[cdkObserveContent]", inputs: ["cdkObserveContentDisabled", "debounce"], outputs: ["cdkObserveContent"], exportAs: ["cdkObserveContent"] }, { kind: "pipe", type: i3$1.SkyLibResourcesPipe, name: "skyLibResources" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1678
+ }
1679
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterComponent, decorators: [{
1680
+ type: Component,
1681
+ args: [{ selector: 'sky-repeater', providers: [
1682
+ SkyRepeaterService,
1683
+ SkyRepeaterAdapterService,
1684
+ SkyRepeaterAutoScrollService,
1685
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container #repeaterHost>\n <div\n class=\"sky-repeater\"\n [attr.role]=\"role\"\n [attr.aria-label]=\"ariaLabel || ('skyux_repeater_label' | skyLibResources)\"\n [dragula]=\"dragulaGroupName\"\n (cdkObserveContent)=\"onCdkObserveContent()\"\n >\n <ng-content></ng-content>\n </div>\n</ng-container>\n", styles: [".sky-repeater{padding:0}\n"] }]
1686
+ }], ctorParameters: function () { return []; }, propDecorators: { activeIndex: [{
1687
+ type: Input
1688
+ }], ariaLabel: [{
1689
+ type: Input
1690
+ }], reorderable: [{
1691
+ type: Input
1692
+ }], expandMode: [{
1693
+ type: Input
1694
+ }], activeIndexChange: [{
1695
+ type: Output
1696
+ }], orderChange: [{
1697
+ type: Output
1698
+ }], items: [{
1699
+ type: ContentChildren,
1700
+ args: [SkyRepeaterItemComponent]
1701
+ }] } });
1702
+
1703
+ class SkyRepeaterModule {
1704
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1705
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterModule, declarations: [SkyRepeaterComponent,
1706
+ SkyRepeaterItemComponent,
1707
+ SkyRepeaterItemContentComponent,
1708
+ SkyRepeaterItemContextMenuComponent,
1709
+ SkyRepeaterItemTitleComponent], imports: [CommonModule,
1710
+ DragulaModule,
1711
+ ObserversModule,
1712
+ SkyChevronModule,
1713
+ SkyCheckboxModule,
1714
+ SkyIconModule,
1715
+ SkyInlineFormModule,
1716
+ SkyListsResourcesModule], exports: [SkyRepeaterComponent,
1717
+ SkyRepeaterItemComponent,
1718
+ SkyRepeaterItemContentComponent,
1719
+ SkyRepeaterItemContextMenuComponent,
1720
+ SkyRepeaterItemTitleComponent] }); }
1721
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterModule, providers: [DragulaService], imports: [CommonModule,
1722
+ DragulaModule,
1723
+ ObserversModule,
1724
+ SkyChevronModule,
1725
+ SkyCheckboxModule,
1726
+ SkyIconModule,
1727
+ SkyInlineFormModule,
1728
+ SkyListsResourcesModule] }); }
1729
+ }
1730
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyRepeaterModule, decorators: [{
1731
+ type: NgModule,
1732
+ args: [{
1733
+ declarations: [
1734
+ SkyRepeaterComponent,
1735
+ SkyRepeaterItemComponent,
1736
+ SkyRepeaterItemContentComponent,
1737
+ SkyRepeaterItemContextMenuComponent,
1738
+ SkyRepeaterItemTitleComponent,
1739
+ ],
1740
+ imports: [
1741
+ CommonModule,
1742
+ DragulaModule,
1743
+ ObserversModule,
1744
+ SkyChevronModule,
1745
+ SkyCheckboxModule,
1746
+ SkyIconModule,
1747
+ SkyInlineFormModule,
1748
+ SkyListsResourcesModule,
1749
+ ],
1750
+ exports: [
1751
+ SkyRepeaterComponent,
1752
+ SkyRepeaterItemComponent,
1753
+ SkyRepeaterItemContentComponent,
1754
+ SkyRepeaterItemContextMenuComponent,
1755
+ SkyRepeaterItemTitleComponent,
1756
+ ],
1757
+ providers: [DragulaService],
1758
+ }]
1759
+ }] });
1760
+
1761
+ /**
1762
+ * @internal
1763
+ */
1764
+ class SkySortService {
1765
+ constructor() {
1766
+ this.selectedItem = new BehaviorSubject('');
1767
+ }
1768
+ selectItem(sortItem) {
1769
+ this.selectedItem.next(sortItem);
1770
+ }
1771
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkySortService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1772
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkySortService }); }
1773
+ }
1774
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkySortService, decorators: [{
1775
+ type: Injectable
1776
+ }] });
1777
+
1778
+ const SORT_ITEM_ID_PREFIX = 'sky-sort-item-';
1779
+ let sortItemIdNumber = 0;
1780
+ class SkySortItemComponent {
1781
+ #subscription;
1782
+ #sortItemId;
1783
+ #sortService;
1784
+ #detector;
1785
+ constructor(sortService, detector) {
1786
+ /**
1787
+ * Fires when a sort item is selected.
1788
+ */
1789
+ this.itemSelect = new EventEmitter(); // TODO: Change to `EventEmitter<void>` in a breaking change.
1790
+ this.isSelected = new BehaviorSubject(false);
1791
+ this.#sortService = sortService;
1792
+ this.#detector = detector;
1793
+ }
1794
+ ngOnInit() {
1795
+ sortItemIdNumber++;
1796
+ this.#sortItemId = SORT_ITEM_ID_PREFIX + sortItemIdNumber.toString();
1797
+ this.#subscription = this.#sortService.selectedItem.subscribe((itemId) => {
1798
+ this.isSelected.next(itemId === this.#sortItemId);
1799
+ this.#detector.detectChanges();
1800
+ });
1801
+ if (this.active) {
1802
+ this.#sortService.selectItem(this.#sortItemId);
1803
+ }
1804
+ }
1805
+ ngOnChanges(changes) {
1806
+ if (this.#sortItemId &&
1807
+ changes &&
1808
+ changes['active'] &&
1809
+ changes['active'].currentValue &&
1810
+ changes['active'].currentValue !== changes['active'].previousValue) {
1811
+ this.#sortService.selectItem(this.#sortItemId);
1812
+ }
1813
+ }
1814
+ itemClicked() {
1815
+ if (this.#sortItemId) {
1816
+ this.#sortService.selectItem(this.#sortItemId);
1817
+ this.itemSelect.emit();
1818
+ }
1819
+ }
1820
+ ngOnDestroy() {
1821
+ /* istanbul ignore else */
1822
+ /* sanity check */
1823
+ if (this.#subscription) {
1824
+ this.#subscription.unsubscribe();
1825
+ }
1826
+ }
1827
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkySortItemComponent, deps: [{ token: SkySortService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
1828
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkySortItemComponent, selector: "sky-sort-item", inputs: { active: "active" }, outputs: { itemSelect: "itemSelect" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"sky-sort-item\"\n role=\"menuitemradio\"\n [attr.aria-checked]=\"isSelected | async\"\n [ngClass]=\"{ 'sky-sort-item-selected': (isSelected | async) }\"\n>\n <button\n type=\"button\"\n [ngClass]=\"{ 'sky-font-emphasized': (isSelected | async) }\"\n (click)=\"itemClicked()\"\n >\n <ng-content></ng-content>\n </button>\n</div>\n", styles: [".sky-sort-item{background-color:transparent;border:none;display:block;margin:4px;min-width:160px;text-align:left;transition:background-color .15s}.sky-sort-item.sky-dropdown-item-active a,.sky-sort-item.sky-dropdown-item-active button,.sky-sort-item:hover a,.sky-sort-item:hover button{background-color:var(--sky-background-color-neutral-light)}.sky-sort-item button[disabled],.sky-sort-item a[disabled]{cursor:default}.sky-sort-item button[disabled]:hover,.sky-sort-item a[disabled]:hover{background-color:transparent}.sky-sort-item ::ng-deep>button{background-color:transparent;border:none;color:var(--sky-text-color-default);cursor:pointer;display:block;padding:3px 20px;text-align:left;width:100%}.sky-sort-item ::ng-deep>button[disabled]{color:var(--sky-text-color-deemphasized)}.sky-sort-item ::ng-deep>button[disabled]:hover{cursor:default}.sky-sort-item-selected{background-color:#f1eef6;padding:4px;margin:0}:host-context(.sky-theme-modern) .sky-sort-item{margin:0;border:none;color:var(--sky-text-color-deemphasized);font-weight:400;transition:box-shadow .15s;border-radius:6px;padding:10px 20px}:host-context(.sky-theme-modern) .sky-sort-item:hover:not(.sky-btn-tab-disabled):not(.sky-btn-tab-selected):not(.sky-dropdown-button-type-tab):not(:focus-visible){background-color:transparent;border-bottom:solid 1px var(--sky-highlight-color-info);color:var(--sky-text-color-default);padding-bottom:9px}:host-context(.sky-theme-modern) .sky-sort-item:focus-visible{background-color:transparent;color:var(--sky-text-color-default);outline:none}:host-context(.sky-theme-modern) .sky-sort-item:focus-visible:not(:active){color:var(--sky-text-color-default);outline:solid 2px var(--sky-background-color-primary-dark);outline-offset:-2px;box-shadow:0 1px 8px #0000004d}:host-context(.sky-theme-modern) .sky-sort-item:active{color:var(--sky-text-color-default);padding-bottom:7px}:host-context(.sky-theme-modern) .sky-sort-item.sky-btn-tab-disabled{background-color:transparent;font-family:BLKB Sans,Helvetica Neue,Arial,sans-serif;color:var(--sky-text-color-deemphasized);font-weight:400;font-size:15px;font-style:italic}:host-context(.sky-theme-modern) .sky-sort-item.sky-btn-tab-disabled .sky-btn-tab-close{font-size:16px}:host-context(.sky-theme-modern) .sky-sort-item:hover:not(.sky-btn-tab-disabled){background-color:transparent;border-bottom:none;outline:solid 1px var(--sky-background-color-primary-dark);outline-offset:-1px}:host-context(.sky-theme-modern) .sky-sort-item:focus-visible:not(:active){background-color:transparent;box-shadow:0 1px 8px #0000004d;outline:solid 2px var(--sky-background-color-primary-dark);outline-offset:-2px}:host-context(.sky-theme-modern) .sky-sort-item button{padding:0;color:#686c73}:host-context(.sky-theme-modern) .sky-sort-item-selected{color:var(--sky-text-color-default);border-bottom:none;border-radius:0 6px 6px 0;border-left:solid 3px var(--sky-background-color-primary-dark);padding-bottom:10px;padding-left:17px;background-color:inherit}:host-context(.sky-theme-modern) .sky-sort-item-selected button{font-weight:400;color:#212327}.sky-theme-modern .sky-sort-item{margin:0;border:none;color:var(--sky-text-color-deemphasized);font-weight:400;transition:box-shadow .15s;border-radius:6px;padding:10px 20px}.sky-theme-modern .sky-sort-item:hover:not(.sky-btn-tab-disabled):not(.sky-btn-tab-selected):not(.sky-dropdown-button-type-tab):not(:focus-visible){background-color:transparent;border-bottom:solid 1px var(--sky-highlight-color-info);color:var(--sky-text-color-default);padding-bottom:9px}.sky-theme-modern .sky-sort-item:focus-visible{background-color:transparent;color:var(--sky-text-color-default);outline:none}.sky-theme-modern .sky-sort-item:focus-visible:not(:active){color:var(--sky-text-color-default);outline:solid 2px var(--sky-background-color-primary-dark);outline-offset:-2px;box-shadow:0 1px 8px #0000004d}.sky-theme-modern .sky-sort-item:active{color:var(--sky-text-color-default);padding-bottom:7px}.sky-theme-modern .sky-sort-item.sky-btn-tab-disabled{background-color:transparent;font-family:BLKB Sans,Helvetica Neue,Arial,sans-serif;color:var(--sky-text-color-deemphasized);font-weight:400;font-size:15px;font-style:italic}.sky-theme-modern .sky-sort-item.sky-btn-tab-disabled .sky-btn-tab-close{font-size:16px}.sky-theme-modern .sky-sort-item:hover:not(.sky-btn-tab-disabled){background-color:transparent;border-bottom:none;outline:solid 1px var(--sky-background-color-primary-dark);outline-offset:-1px}.sky-theme-modern .sky-sort-item:focus-visible:not(:active){background-color:transparent;box-shadow:0 1px 8px #0000004d;outline:solid 2px var(--sky-background-color-primary-dark);outline-offset:-2px}.sky-theme-modern .sky-sort-item button{padding:0;color:#686c73}.sky-theme-modern .sky-sort-item-selected{color:var(--sky-text-color-default);border-bottom:none;border-radius:0 6px 6px 0;border-left:solid 3px var(--sky-background-color-primary-dark);padding-bottom:10px;padding-left:17px;background-color:inherit}.sky-theme-modern .sky-sort-item-selected button{font-weight:400;color:#212327}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-sort-item button{color:#c0c2c5}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-sort-item-selected button{color:#fbfcfe}.sky-theme-modern.sky-theme-mode-dark .sky-sort-item button{color:#c0c2c5}.sky-theme-modern.sky-theme-mode-dark .sky-sort-item-selected button{color:#fbfcfe}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1829
+ }
1830
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkySortItemComponent, decorators: [{
1831
+ type: Component,
1832
+ args: [{ selector: 'sky-sort-item', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"sky-sort-item\"\n role=\"menuitemradio\"\n [attr.aria-checked]=\"isSelected | async\"\n [ngClass]=\"{ 'sky-sort-item-selected': (isSelected | async) }\"\n>\n <button\n type=\"button\"\n [ngClass]=\"{ 'sky-font-emphasized': (isSelected | async) }\"\n (click)=\"itemClicked()\"\n >\n <ng-content></ng-content>\n </button>\n</div>\n", styles: [".sky-sort-item{background-color:transparent;border:none;display:block;margin:4px;min-width:160px;text-align:left;transition:background-color .15s}.sky-sort-item.sky-dropdown-item-active a,.sky-sort-item.sky-dropdown-item-active button,.sky-sort-item:hover a,.sky-sort-item:hover button{background-color:var(--sky-background-color-neutral-light)}.sky-sort-item button[disabled],.sky-sort-item a[disabled]{cursor:default}.sky-sort-item button[disabled]:hover,.sky-sort-item a[disabled]:hover{background-color:transparent}.sky-sort-item ::ng-deep>button{background-color:transparent;border:none;color:var(--sky-text-color-default);cursor:pointer;display:block;padding:3px 20px;text-align:left;width:100%}.sky-sort-item ::ng-deep>button[disabled]{color:var(--sky-text-color-deemphasized)}.sky-sort-item ::ng-deep>button[disabled]:hover{cursor:default}.sky-sort-item-selected{background-color:#f1eef6;padding:4px;margin:0}:host-context(.sky-theme-modern) .sky-sort-item{margin:0;border:none;color:var(--sky-text-color-deemphasized);font-weight:400;transition:box-shadow .15s;border-radius:6px;padding:10px 20px}:host-context(.sky-theme-modern) .sky-sort-item:hover:not(.sky-btn-tab-disabled):not(.sky-btn-tab-selected):not(.sky-dropdown-button-type-tab):not(:focus-visible){background-color:transparent;border-bottom:solid 1px var(--sky-highlight-color-info);color:var(--sky-text-color-default);padding-bottom:9px}:host-context(.sky-theme-modern) .sky-sort-item:focus-visible{background-color:transparent;color:var(--sky-text-color-default);outline:none}:host-context(.sky-theme-modern) .sky-sort-item:focus-visible:not(:active){color:var(--sky-text-color-default);outline:solid 2px var(--sky-background-color-primary-dark);outline-offset:-2px;box-shadow:0 1px 8px #0000004d}:host-context(.sky-theme-modern) .sky-sort-item:active{color:var(--sky-text-color-default);padding-bottom:7px}:host-context(.sky-theme-modern) .sky-sort-item.sky-btn-tab-disabled{background-color:transparent;font-family:BLKB Sans,Helvetica Neue,Arial,sans-serif;color:var(--sky-text-color-deemphasized);font-weight:400;font-size:15px;font-style:italic}:host-context(.sky-theme-modern) .sky-sort-item.sky-btn-tab-disabled .sky-btn-tab-close{font-size:16px}:host-context(.sky-theme-modern) .sky-sort-item:hover:not(.sky-btn-tab-disabled){background-color:transparent;border-bottom:none;outline:solid 1px var(--sky-background-color-primary-dark);outline-offset:-1px}:host-context(.sky-theme-modern) .sky-sort-item:focus-visible:not(:active){background-color:transparent;box-shadow:0 1px 8px #0000004d;outline:solid 2px var(--sky-background-color-primary-dark);outline-offset:-2px}:host-context(.sky-theme-modern) .sky-sort-item button{padding:0;color:#686c73}:host-context(.sky-theme-modern) .sky-sort-item-selected{color:var(--sky-text-color-default);border-bottom:none;border-radius:0 6px 6px 0;border-left:solid 3px var(--sky-background-color-primary-dark);padding-bottom:10px;padding-left:17px;background-color:inherit}:host-context(.sky-theme-modern) .sky-sort-item-selected button{font-weight:400;color:#212327}.sky-theme-modern .sky-sort-item{margin:0;border:none;color:var(--sky-text-color-deemphasized);font-weight:400;transition:box-shadow .15s;border-radius:6px;padding:10px 20px}.sky-theme-modern .sky-sort-item:hover:not(.sky-btn-tab-disabled):not(.sky-btn-tab-selected):not(.sky-dropdown-button-type-tab):not(:focus-visible){background-color:transparent;border-bottom:solid 1px var(--sky-highlight-color-info);color:var(--sky-text-color-default);padding-bottom:9px}.sky-theme-modern .sky-sort-item:focus-visible{background-color:transparent;color:var(--sky-text-color-default);outline:none}.sky-theme-modern .sky-sort-item:focus-visible:not(:active){color:var(--sky-text-color-default);outline:solid 2px var(--sky-background-color-primary-dark);outline-offset:-2px;box-shadow:0 1px 8px #0000004d}.sky-theme-modern .sky-sort-item:active{color:var(--sky-text-color-default);padding-bottom:7px}.sky-theme-modern .sky-sort-item.sky-btn-tab-disabled{background-color:transparent;font-family:BLKB Sans,Helvetica Neue,Arial,sans-serif;color:var(--sky-text-color-deemphasized);font-weight:400;font-size:15px;font-style:italic}.sky-theme-modern .sky-sort-item.sky-btn-tab-disabled .sky-btn-tab-close{font-size:16px}.sky-theme-modern .sky-sort-item:hover:not(.sky-btn-tab-disabled){background-color:transparent;border-bottom:none;outline:solid 1px var(--sky-background-color-primary-dark);outline-offset:-1px}.sky-theme-modern .sky-sort-item:focus-visible:not(:active){background-color:transparent;box-shadow:0 1px 8px #0000004d;outline:solid 2px var(--sky-background-color-primary-dark);outline-offset:-2px}.sky-theme-modern .sky-sort-item button{padding:0;color:#686c73}.sky-theme-modern .sky-sort-item-selected{color:var(--sky-text-color-default);border-bottom:none;border-radius:0 6px 6px 0;border-left:solid 3px var(--sky-background-color-primary-dark);padding-bottom:10px;padding-left:17px;background-color:inherit}.sky-theme-modern .sky-sort-item-selected button{font-weight:400;color:#212327}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-sort-item button{color:#c0c2c5}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-sort-item-selected button{color:#fbfcfe}.sky-theme-modern.sky-theme-mode-dark .sky-sort-item button{color:#c0c2c5}.sky-theme-modern.sky-theme-mode-dark .sky-sort-item-selected button{color:#fbfcfe}\n"] }]
1833
+ }], ctorParameters: function () { return [{ type: SkySortService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { active: [{
1834
+ type: Input
1835
+ }], itemSelect: [{
1836
+ type: Output
1837
+ }] } });
1838
+
1839
+ class SkySortMenuHeadingComponent {
1840
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkySortMenuHeadingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1841
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkySortMenuHeadingComponent, selector: "sky-sort-menu-heading", ngImport: i0, template: "<div\n class=\"sky-sort-menu-heading\"\n [skyThemeClass]=\"{\n 'sky-subsection-heading': 'default',\n 'sky-font-heading-4': 'modern'\n }\"\n>\n {{ 'skyux_sort_menu_heading' | skyLibResources }}\n</div>\n", styles: [".sky-sort-menu-heading{background-color:transparent;border:none;display:block;margin:4px;min-width:160px;transition:background-color .15s;padding:3px 20px;text-align:left;width:100%}:host-context(.sky-theme-modern) .sky-sort-menu-heading{margin:0;padding:10px 20px}.sky-theme-modern .sky-sort-menu-heading{margin:0;padding:10px 20px}\n"], dependencies: [{ kind: "directive", type: i3.λ2, selector: "[skyThemeClass]", inputs: ["class", "skyThemeClass"] }, { kind: "pipe", type: i3$1.SkyLibResourcesPipe, name: "skyLibResources" }] }); }
1842
+ }
1843
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkySortMenuHeadingComponent, decorators: [{
1844
+ type: Component,
1845
+ args: [{ selector: 'sky-sort-menu-heading', template: "<div\n class=\"sky-sort-menu-heading\"\n [skyThemeClass]=\"{\n 'sky-subsection-heading': 'default',\n 'sky-font-heading-4': 'modern'\n }\"\n>\n {{ 'skyux_sort_menu_heading' | skyLibResources }}\n</div>\n", styles: [".sky-sort-menu-heading{background-color:transparent;border:none;display:block;margin:4px;min-width:160px;transition:background-color .15s;padding:3px 20px;text-align:left;width:100%}:host-context(.sky-theme-modern) .sky-sort-menu-heading{margin:0;padding:10px 20px}.sky-theme-modern .sky-sort-menu-heading{margin:0;padding:10px 20px}\n"] }]
1846
+ }] });
1847
+
1848
+ class SkySortComponent {
1849
+ constructor() {
1850
+ /**
1851
+ * Whether to display a "Sort" label beside the icon on the sort button.
1852
+ */
1853
+ this.showButtonText = false;
1854
+ this.dropdownController = new Subject();
1855
+ }
1856
+ dropdownClicked() {
1857
+ this.dropdownController.next({
1858
+ type: SkyDropdownMessageType.Close,
1859
+ });
1860
+ }
1861
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkySortComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1862
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkySortComponent, selector: "sky-sort", inputs: { showButtonText: "showButtonText" }, providers: [SkySortService], ngImport: i0, template: "<div class=\"sky-sort\">\n <sky-dropdown\n buttonType=\"select\"\n [label]=\"'skyux_sort_button_label' | skyLibResources\"\n [messageStream]=\"dropdownController\"\n [title]=\"'skyux_sort_button_label' | skyLibResources\"\n >\n <sky-dropdown-button>\n <sky-icon *skyThemeIf=\"'default'\" icon=\"sort\"></sky-icon>\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"sort\" iconType=\"skyux\"></sky-icon>\n <span *ngIf=\"showButtonText\" class=\"sky-sort-btn-text\">\n {{ 'skyux_sort_button_label' | skyLibResources }}\n </span>\n </sky-dropdown-button>\n <sky-dropdown-menu\n ariaRole=\"menu\"\n [ariaLabelledBy]=\"sortMenuHeading.id\"\n (click)=\"dropdownClicked()\"\n >\n <sky-sort-menu-heading\n skyId\n #sortMenuHeading=\"skyId\"\n ></sky-sort-menu-heading>\n <div *skyThemeIf=\"'default'\" class=\"sky-sort-heading-divider\"></div>\n <ng-content></ng-content>\n </sky-dropdown-menu>\n </sky-dropdown>\n</div>\n", styles: [".sky-sort-heading-divider{margin:0;height:1px;overflow:hidden;background-color:#eeeeef}:host .sky-sort-btn-text{display:none}:host-context(.sky-responsive-container-xs) .sky-sort-btn-text,:host-context(.sky-responsive-container-sm) .sky-sort-btn-text,:host-context(.sky-responsive-container-md) .sky-sort-btn-text,:host-context(.sky-responsive-container-lg) .sky-sort-btn-text{display:none}@media (min-width: 768px){:host .sky-sort-btn-text{display:inline}}:host-context(.sky-responsive-container-sm) .sky-sort-btn-text,:host-context(.sky-responsive-container-md) .sky-sort-btn-text,:host-context(.sky-responsive-container-lg) .sky-sort-btn-text{display:inline}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2$2.λ2, selector: "sky-dropdown-button" }, { kind: "component", type: i2$2.λ3, selector: "sky-dropdown", inputs: ["buttonStyle", "buttonType", "disabled", "dismissOnBlur", "label", "horizontalAlignment", "messageStream", "title", "trigger"] }, { kind: "component", type: i2$2.λ4, selector: "sky-dropdown-menu", inputs: ["ariaLabelledBy", "ariaRole", "useNativeFocus"], outputs: ["menuChanges"] }, { kind: "component", type: i2.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { kind: "directive", type: i1$1.λ2, selector: "[skyId]", exportAs: ["skyId"] }, { kind: "directive", type: i3.λ3, selector: "[skyThemeIf]", inputs: ["skyThemeIf"] }, { kind: "component", type: SkySortMenuHeadingComponent, selector: "sky-sort-menu-heading" }, { kind: "pipe", type: i3$1.SkyLibResourcesPipe, name: "skyLibResources" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1863
+ }
1864
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkySortComponent, decorators: [{
1865
+ type: Component,
1866
+ args: [{ selector: 'sky-sort', providers: [SkySortService], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"sky-sort\">\n <sky-dropdown\n buttonType=\"select\"\n [label]=\"'skyux_sort_button_label' | skyLibResources\"\n [messageStream]=\"dropdownController\"\n [title]=\"'skyux_sort_button_label' | skyLibResources\"\n >\n <sky-dropdown-button>\n <sky-icon *skyThemeIf=\"'default'\" icon=\"sort\"></sky-icon>\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"sort\" iconType=\"skyux\"></sky-icon>\n <span *ngIf=\"showButtonText\" class=\"sky-sort-btn-text\">\n {{ 'skyux_sort_button_label' | skyLibResources }}\n </span>\n </sky-dropdown-button>\n <sky-dropdown-menu\n ariaRole=\"menu\"\n [ariaLabelledBy]=\"sortMenuHeading.id\"\n (click)=\"dropdownClicked()\"\n >\n <sky-sort-menu-heading\n skyId\n #sortMenuHeading=\"skyId\"\n ></sky-sort-menu-heading>\n <div *skyThemeIf=\"'default'\" class=\"sky-sort-heading-divider\"></div>\n <ng-content></ng-content>\n </sky-dropdown-menu>\n </sky-dropdown>\n</div>\n", styles: [".sky-sort-heading-divider{margin:0;height:1px;overflow:hidden;background-color:#eeeeef}:host .sky-sort-btn-text{display:none}:host-context(.sky-responsive-container-xs) .sky-sort-btn-text,:host-context(.sky-responsive-container-sm) .sky-sort-btn-text,:host-context(.sky-responsive-container-md) .sky-sort-btn-text,:host-context(.sky-responsive-container-lg) .sky-sort-btn-text{display:none}@media (min-width: 768px){:host .sky-sort-btn-text{display:inline}}:host-context(.sky-responsive-container-sm) .sky-sort-btn-text,:host-context(.sky-responsive-container-md) .sky-sort-btn-text,:host-context(.sky-responsive-container-lg) .sky-sort-btn-text{display:inline}\n"] }]
1867
+ }], propDecorators: { showButtonText: [{
1868
+ type: Input
1869
+ }] } });
1870
+
1871
+ class SkySortModule {
1872
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkySortModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1873
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: SkySortModule, declarations: [SkySortComponent,
1874
+ SkySortItemComponent,
1875
+ SkySortMenuHeadingComponent], imports: [CommonModule,
1876
+ SkyDropdownModule,
1877
+ SkyIconModule,
1878
+ SkyIdModule,
1879
+ SkyListsResourcesModule,
1880
+ SkyThemeModule], exports: [SkySortComponent, SkySortItemComponent] }); }
1881
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkySortModule, imports: [CommonModule,
1882
+ SkyDropdownModule,
1883
+ SkyIconModule,
1884
+ SkyIdModule,
1885
+ SkyListsResourcesModule,
1886
+ SkyThemeModule] }); }
1887
+ }
1888
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkySortModule, decorators: [{
1889
+ type: NgModule,
1890
+ args: [{
1891
+ declarations: [
1892
+ SkySortComponent,
1893
+ SkySortItemComponent,
1894
+ SkySortMenuHeadingComponent,
1895
+ ],
1896
+ imports: [
1897
+ CommonModule,
1898
+ SkyDropdownModule,
1899
+ SkyIconModule,
1900
+ SkyIdModule,
1901
+ SkyListsResourcesModule,
1902
+ SkyThemeModule,
1903
+ ],
1904
+ exports: [SkySortComponent, SkySortItemComponent],
1905
+ }]
1906
+ }] });
1907
+
1908
+ /**
1909
+ * Generated bundle index. Do not edit.
1910
+ */
1911
+
1912
+ export { SkyFilterModule, SkyInfiniteScrollModule, SkyPagingModule, SkyRepeaterModule, SkySortModule, SkyFilterButtonComponent as λ1, SkyRepeaterItemComponent as λ10, SkyRepeaterComponent as λ11, SkyRepeaterItemTitleComponent as λ12, SkySortItemComponent as λ13, SkySortComponent as λ14, SkyFilterInlineComponent as λ2, SkyFilterInlineItemComponent as λ3, SkyFilterSummaryItemComponent as λ4, SkyFilterSummaryComponent as λ5, SkyInfiniteScrollComponent as λ6, SkyPagingComponent as λ7, SkyRepeaterItemContentComponent as λ8, SkyRepeaterItemContextMenuComponent as λ9 };
1913
+ //# sourceMappingURL=skyux-lists.mjs.map