@reforgium/data-grid 3.2.2 → 3.2.4

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.
@@ -1,6 +1,25 @@
1
- import { c as computeScrollbarState, a as clampThumbTop, m as mapThumbTopToScrollTop } from './reforgium-data-grid-reforgium-data-grid-MQb2oHWO.mjs';
1
+ import { c as computeScrollbarState, a as clampThumbTop, m as mapThumbTopToScrollTop } from './reforgium-data-grid-reforgium-data-grid-BP7MSHYb.mjs';
2
2
 
3
3
  function createGridOverlayScrollFeature(ctx) {
4
+ let activeMove = null;
5
+ let activeUp = null;
6
+ const removeDragListeners = () => {
7
+ if (activeMove) {
8
+ window.removeEventListener('pointermove', activeMove);
9
+ activeMove = null;
10
+ }
11
+ if (activeUp) {
12
+ window.removeEventListener('pointerup', activeUp);
13
+ window.removeEventListener('pointercancel', activeUp);
14
+ activeUp = null;
15
+ }
16
+ };
17
+ const cancelDrag = () => {
18
+ removeDragListeners();
19
+ if (ctx.isDragging()) {
20
+ ctx.setDragging(false);
21
+ }
22
+ };
4
23
  const showScrollbar = () => {
5
24
  ctx.setScrollbarVisible(true);
6
25
  clearTimeout(ctx.getHideTimeout());
@@ -19,6 +38,7 @@ function createGridOverlayScrollFeature(ctx) {
19
38
  if (!scrollEl) {
20
39
  return;
21
40
  }
41
+ cancelDrag();
22
42
  ctx.setDragging(true);
23
43
  showScrollbar();
24
44
  const startY = event.clientY;
@@ -27,6 +47,9 @@ function createGridOverlayScrollFeature(ctx) {
27
47
  const maxThumbTop = state.maxThumbTop || 1;
28
48
  const maxScrollTop = state.maxScrollTop || 1;
29
49
  const onMove = (moveEvent) => {
50
+ if (activeMove !== onMove) {
51
+ return;
52
+ }
30
53
  const delta = moveEvent.clientY - startY;
31
54
  const newTop = clampThumbTop(startTop + delta, maxThumbTop);
32
55
  ctx.setThumbTop(newTop);
@@ -35,13 +58,18 @@ function createGridOverlayScrollFeature(ctx) {
35
58
  showScrollbar();
36
59
  };
37
60
  const onUp = () => {
38
- window.removeEventListener('mousemove', onMove);
39
- window.removeEventListener('mouseup', onUp);
61
+ if (activeUp !== onUp) {
62
+ return;
63
+ }
64
+ removeDragListeners();
40
65
  ctx.setDragging(false);
41
66
  hideScrollbarSoon();
42
67
  };
43
- window.addEventListener('mousemove', onMove);
44
- window.addEventListener('mouseup', onUp);
68
+ activeMove = onMove;
69
+ activeUp = onUp;
70
+ window.addEventListener('pointermove', onMove);
71
+ window.addEventListener('pointerup', onUp);
72
+ window.addEventListener('pointercancel', onUp);
45
73
  };
46
74
  const scheduleScrollbarUpdate = () => {
47
75
  if (ctx.getScrollbarRafId() !== null) {
@@ -60,6 +88,12 @@ function createGridOverlayScrollFeature(ctx) {
60
88
  cancelAnimationFrame(rafId);
61
89
  ctx.setScrollbarRafId(null);
62
90
  };
91
+ const destroy = () => {
92
+ cancelDrag();
93
+ clearTimeout(ctx.getHideTimeout());
94
+ ctx.setHideTimeout(undefined);
95
+ clearScrollbarRaf();
96
+ };
63
97
  const finalizeScroll = () => {
64
98
  scheduleScrollbarUpdate();
65
99
  showScrollbar();
@@ -72,8 +106,9 @@ function createGridOverlayScrollFeature(ctx) {
72
106
  scheduleScrollbarUpdate,
73
107
  clearScrollbarRaf,
74
108
  finalizeScroll,
109
+ destroy,
75
110
  };
76
111
  }
77
112
 
78
113
  export { createGridOverlayScrollFeature };
79
- //# sourceMappingURL=reforgium-data-grid-grid-overlay-scroll.feature-CaO2mnI-.mjs.map
114
+ //# sourceMappingURL=reforgium-data-grid-grid-overlay-scroll.feature-BuyObmQ7.mjs.map
@@ -43,6 +43,7 @@ class DataGridPaginator {
43
43
  totalElements = input(0, { ...(ngDevMode ? { debugName: "totalElements" } : /* istanbul ignore next */ {}), transform: numberAttribute });
44
44
  pageSize = input(0, { ...(ngDevMode ? { debugName: "pageSize" } : /* istanbul ignore next */ {}), transform: numberAttribute });
45
45
  maxShowPages = input(7, { ...(ngDevMode ? { debugName: "maxShowPages" } : /* istanbul ignore next */ {}), transform: numberAttribute });
46
+ disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
46
47
  showFirstLast = input(false, { ...(ngDevMode ? { debugName: "showFirstLast" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
47
48
  firstLabel = input('First', ...(ngDevMode ? [{ debugName: "firstLabel" }] : /* istanbul ignore next */ []));
48
49
  lastLabel = input('Last', ...(ngDevMode ? [{ debugName: "lastLabel" }] : /* istanbul ignore next */ []));
@@ -61,8 +62,9 @@ class DataGridPaginator {
61
62
  const uniq = new Set(this.pageSizeOptions()
62
63
  .map((value) => Number(value))
63
64
  .filter((value) => Number.isFinite(value) && value > 0));
64
- if (!uniq.has(this.pageSize())) {
65
- uniq.add(this.pageSize());
65
+ const currentPageSize = this.pageSize();
66
+ if (currentPageSize > 0 && !uniq.has(currentPageSize)) {
67
+ uniq.add(currentPageSize);
66
68
  }
67
69
  return [...uniq].sort((a, b) => a - b).map((value) => ({ label: `${value}`, value }));
68
70
  }, ...(ngDevMode ? [{ debugName: "normalizedPageSizeOptions" }] : /* istanbul ignore next */ []));
@@ -70,10 +72,15 @@ class DataGridPaginator {
70
72
  const size = this.pageSize();
71
73
  return size > 0 ? Math.ceil(this.totalElements() / size) : 0;
72
74
  }, ...(ngDevMode ? [{ debugName: "totalPages" }] : /* istanbul ignore next */ []));
75
+ normalizedCurrent = computed(() => {
76
+ const total = this.totalPages();
77
+ return total > 0 ? Math.min(Math.max(0, this.current()), total - 1) : 0;
78
+ }, ...(ngDevMode ? [{ debugName: "normalizedCurrent" }] : /* istanbul ignore next */ []));
73
79
  pages = computed(() => {
74
- const current = this.current();
80
+ const current = this.normalizedCurrent();
75
81
  const total = this.totalPages();
76
- const max = this.maxShowPages();
82
+ const requestedMax = this.maxShowPages();
83
+ const max = Number.isFinite(requestedMax) ? Math.max(5, Math.floor(requestedMax)) : 5;
77
84
  if (total <= max) {
78
85
  return Array.from({ length: total }, (_, i) => i);
79
86
  }
@@ -101,25 +108,26 @@ class DataGridPaginator {
101
108
  return pages;
102
109
  }, ...(ngDevMode ? [{ debugName: "pages" }] : /* istanbul ignore next */ []));
103
110
  goToPage(page) {
104
- if (!Number.isInteger(page)) {
111
+ if (this.disabled() || !Number.isInteger(page)) {
105
112
  return;
106
113
  }
107
114
  const total = this.totalPages();
108
- if (page < 0 || page >= total || page === this.current()) {
115
+ if (page < 0 || page >= total || page === this.normalizedCurrent()) {
109
116
  return;
110
117
  }
111
118
  this.pageChange.emit(page);
112
119
  }
113
120
  onPageSizeChange(value) {
114
121
  const typedValue = Number(value);
115
- if (!Number.isFinite(typedValue) || typedValue <= 0 || value === this.pageSize()) {
122
+ if (this.disabled() || !Number.isFinite(typedValue) || typedValue <= 0 || value === this.pageSize()) {
116
123
  return;
117
124
  }
118
125
  this.pageSizeChange.emit(typedValue);
119
126
  }
120
127
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: DataGridPaginator, deps: [], target: i0.ɵɵFactoryTarget.Component });
121
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: DataGridPaginator, isStandalone: true, selector: "re-data-grid-paginator", inputs: { current: { classPropertyName: "current", publicName: "current", isSignal: true, isRequired: false, transformFunction: null }, totalElements: { classPropertyName: "totalElements", publicName: "totalElements", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, maxShowPages: { classPropertyName: "maxShowPages", publicName: "maxShowPages", isSignal: true, isRequired: false, transformFunction: null }, showFirstLast: { classPropertyName: "showFirstLast", publicName: "showFirstLast", isSignal: true, isRequired: false, transformFunction: null }, firstLabel: { classPropertyName: "firstLabel", publicName: "firstLabel", isSignal: true, isRequired: false, transformFunction: null }, lastLabel: { classPropertyName: "lastLabel", publicName: "lastLabel", isSignal: true, isRequired: false, transformFunction: null }, showPerPage: { classPropertyName: "showPerPage", publicName: "showPerPage", isSignal: true, isRequired: false, transformFunction: null }, perPageLabel: { classPropertyName: "perPageLabel", publicName: "perPageLabel", isSignal: true, isRequired: false, transformFunction: null }, pageSizeOptions: { classPropertyName: "pageSizeOptions", publicName: "pageSizeOptions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pageChange: "pageChange", pageSizeChange: "pageSizeChange" }, queries: [{ propertyName: "firstSlotRefs", predicate: DataGridPaginatorFirstDirective, isSignal: true }, { propertyName: "lastSlotRefs", predicate: DataGridPaginatorLastDirective, isSignal: true }, { propertyName: "pageSlotRefs", predicate: DataGridPaginatorPageDirective, isSignal: true }], ngImport: i0, template: `
128
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: DataGridPaginator, isStandalone: true, selector: "re-data-grid-paginator", inputs: { current: { classPropertyName: "current", publicName: "current", isSignal: true, isRequired: false, transformFunction: null }, totalElements: { classPropertyName: "totalElements", publicName: "totalElements", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, maxShowPages: { classPropertyName: "maxShowPages", publicName: "maxShowPages", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, showFirstLast: { classPropertyName: "showFirstLast", publicName: "showFirstLast", isSignal: true, isRequired: false, transformFunction: null }, firstLabel: { classPropertyName: "firstLabel", publicName: "firstLabel", isSignal: true, isRequired: false, transformFunction: null }, lastLabel: { classPropertyName: "lastLabel", publicName: "lastLabel", isSignal: true, isRequired: false, transformFunction: null }, showPerPage: { classPropertyName: "showPerPage", publicName: "showPerPage", isSignal: true, isRequired: false, transformFunction: null }, perPageLabel: { classPropertyName: "perPageLabel", publicName: "perPageLabel", isSignal: true, isRequired: false, transformFunction: null }, pageSizeOptions: { classPropertyName: "pageSizeOptions", publicName: "pageSizeOptions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pageChange: "pageChange", pageSizeChange: "pageSizeChange" }, queries: [{ propertyName: "firstSlotRefs", predicate: DataGridPaginatorFirstDirective, isSignal: true }, { propertyName: "lastSlotRefs", predicate: DataGridPaginatorLastDirective, isSignal: true }, { propertyName: "pageSlotRefs", predicate: DataGridPaginatorPageDirective, isSignal: true }], ngImport: i0, template: `
122
129
  @let total = totalPages();
130
+ @let currentPage = normalizedCurrent();
123
131
  @let perPageOptions = normalizedPageSizeOptions();
124
132
 
125
133
  @if (showPerPage() && perPageOptions.length) {
@@ -129,6 +137,7 @@ class DataGridPaginator {
129
137
  <re-data-grid-dropdown
130
138
  [options]="perPageOptions"
131
139
  [value]="pageSize()"
140
+ [disabled]="disabled()"
132
141
  [placeholder]="''"
133
142
  (selectValue)="onPageSizeChange($event)"
134
143
  />
@@ -136,13 +145,18 @@ class DataGridPaginator {
136
145
  }
137
146
 
138
147
  @if (showFirstLast() && total > 1) {
139
- @let firstDisabled = current() <= 0;
148
+ @let firstDisabled = disabled() || currentPage <= 0;
140
149
 
141
- <button class="re-paginator-edge re-paginator-edge--first" [disabled]="firstDisabled" (click)="goToPage(0)">
150
+ <button
151
+ class="re-paginator-edge re-paginator-edge--first"
152
+ aria-label="Go to first page"
153
+ [disabled]="firstDisabled"
154
+ (click)="goToPage(0)"
155
+ >
142
156
  @if (firstTpl()) {
143
157
  <ng-container
144
158
  [ngTemplateOutlet]="firstTpl()!.tpl"
145
- [ngTemplateOutletContext]="{ $implicit: 0, current: current(), total, disabled: firstDisabled }"
159
+ [ngTemplateOutletContext]="{ $implicit: 0, current: currentPage, total, disabled: firstDisabled }"
146
160
  />
147
161
  } @else {
148
162
  {{ firstLabel() }}
@@ -152,11 +166,14 @@ class DataGridPaginator {
152
166
 
153
167
  @for (page of pages(); track $index) {
154
168
  @if (page === -1) {
155
- <span class="re-paginator-gap">...</span>
169
+ <span class="re-paginator-gap" role="presentation" aria-hidden="true">...</span>
156
170
  } @else {
157
171
  <button
158
172
  class="re-paginator-page"
159
- [class.re-paginator-page--active]="page === current()"
173
+ [class.re-paginator-page--active]="page === currentPage"
174
+ [attr.aria-current]="page === currentPage ? 'page' : null"
175
+ [attr.aria-label]="'Go to page ' + (page + 1)"
176
+ [disabled]="disabled() || page === currentPage"
160
177
  (click)="goToPage(page)"
161
178
  >
162
179
  @if (pageTpl()) {
@@ -166,9 +183,9 @@ class DataGridPaginator {
166
183
  $implicit: page,
167
184
  page,
168
185
  label: page + 1,
169
- current: current(),
186
+ current: currentPage,
170
187
  total,
171
- active: page === current(),
188
+ active: page === currentPage,
172
189
  }"
173
190
  />
174
191
  } @else {
@@ -180,25 +197,31 @@ class DataGridPaginator {
180
197
 
181
198
  @if (showFirstLast() && total > 1) {
182
199
  @let lastPage = total - 1;
183
- @let lastDisabled = current() >= lastPage;
200
+ @let lastDisabled = disabled() || currentPage >= lastPage;
184
201
 
185
- <button class="re-paginator-edge re-paginator-edge--last" [disabled]="lastDisabled" (click)="goToPage(lastPage)">
202
+ <button
203
+ class="re-paginator-edge re-paginator-edge--last"
204
+ aria-label="Go to last page"
205
+ [disabled]="lastDisabled"
206
+ (click)="goToPage(lastPage)"
207
+ >
186
208
  @if (lastTpl()) {
187
209
  <ng-container
188
210
  [ngTemplateOutlet]="lastTpl()!.tpl"
189
- [ngTemplateOutletContext]="{ $implicit: lastPage, current: current(), total, disabled: lastDisabled }"
211
+ [ngTemplateOutletContext]="{ $implicit: lastPage, current: currentPage, total, disabled: lastDisabled }"
190
212
  />
191
213
  } @else {
192
214
  {{ lastLabel() }}
193
215
  }
194
216
  </button>
195
217
  }
196
- `, isInline: true, styles: [":host{--re-data-grid-paginator-gap: .5rem;--re-data-grid-paginator-page-size: 1.75rem;--re-data-grid-paginator-page-min-width: var(--re-data-grid-paginator-page-size);--re-data-grid-paginator-page-height: var(--re-data-grid-paginator-page-size);--re-data-grid-paginator-page-paddings: 0 .5rem;--re-data-grid-paginator-page-border: 1px solid var(--re-data-grid-paginator-separator-color, #e2e8f0);--re-data-grid-paginator-page-separator-color: var(--re-data-grid-separator-color, --border-color);--re-data-grid-paginator-page-rounded: var(--re-data-grid-rounded, --radius-md);--re-data-grid-paginator-page-surface: var(--re-data-grid-surface, white);--re-data-grid-paginator-page-color: var(--text-primary, #1e293b);--re-data-grid-paginator-page-font-size: .875rem;--re-data-grid-paginator-page-active-surface: var(--re-data-grid-active, #3b82f6);--re-data-grid-paginator-page-active-color: white;--re-data-grid-paginator-page-hover-surface: var(--re-data-grid-active, #3b82f6);--re-data-grid-paginator-page-hover-color: white;--re-data-grid-paginator-edge-min-width: 2.5rem;--re-data-grid-paginator-edge-height: var(--re-data-grid-paginator-page-size);--re-data-grid-paginator-edge-paddings: 0 .625rem;--re-data-grid-paginator-edge-border: var(--re-data-grid-paginator-page-border);--re-data-grid-paginator-edge-rounded: var(--re-data-grid-paginator-page-rounded);--re-data-grid-paginator-edge-surface: var(--re-data-grid-paginator-page-surface);--re-data-grid-paginator-edge-color: var(--re-data-grid-paginator-page-color);--re-data-grid-paginator-edge-font-size: var(--re-data-grid-paginator-page-font-size);--re-data-grid-paginator-edge-hover-surface: var(--re-data-grid-paginator-page-hover-surface);--re-data-grid-paginator-edge-hover-color: var(--re-data-grid-paginator-page-hover-color);--re-data-grid-paginator-edge-disabled-opacity: .5;--re-data-grid-paginator-per-page-gap: .5rem;--re-data-grid-paginator-per-page-label-size: .8125rem;--re-data-grid-paginator-per-page-label-color: var(--re-data-grid-paginator-page-color);display:flex;align-items:center;gap:var(--re-data-grid-paginator-gap);flex-wrap:wrap}:host re-data-grid-dropdown{--re-data-grid-dropdown-width: 4rem}.re-paginator-per-page{display:inline-flex;align-items:center;gap:var(--re-data-grid-paginator-per-page-gap);margin-right:auto}.re-paginator-per-page-label{font-size:var(--re-data-grid-paginator-per-page-label-size);color:var(--re-data-grid-paginator-per-page-label-color)}.re-paginator-page{display:inline-flex;justify-content:center;align-items:center;min-width:var(--re-data-grid-paginator-page-min-width);height:var(--re-data-grid-paginator-page-height);padding:var(--re-data-grid-paginator-page-paddings);border-radius:var(--re-data-grid-paginator-page-rounded);border:var(--re-data-grid-paginator-page-border);font-size:var(--re-data-grid-paginator-page-font-size);background:var(--re-data-grid-paginator-page-surface);color:var(--re-data-grid-paginator-page-color);cursor:pointer;white-space:nowrap;transition:all .2s}.re-paginator-edge{display:inline-flex;justify-content:center;align-items:center;min-width:var(--re-data-grid-paginator-edge-min-width);height:var(--re-data-grid-paginator-edge-height);padding:var(--re-data-grid-paginator-edge-paddings);border-radius:var(--re-data-grid-paginator-edge-rounded);border:var(--re-data-grid-paginator-edge-border);font-size:var(--re-data-grid-paginator-edge-font-size);background:var(--re-data-grid-paginator-edge-surface);color:var(--re-data-grid-paginator-edge-color);cursor:pointer;white-space:nowrap;transition:all .2s}.re-paginator-edge:hover:not(:disabled){background:var(--re-data-grid-paginator-edge-hover-surface);color:var(--re-data-grid-paginator-edge-hover-color)}.re-paginator-edge:disabled{opacity:var(--re-data-grid-paginator-edge-disabled-opacity);cursor:default}.re-paginator-page:hover:not(.re-paginator-page--active){background:var(--re-data-grid-paginator-page-hover-surface);color:var(--re-data-grid-paginator-page-hover-color)}.re-paginator-page--active{border-color:var(--re-data-grid-paginator-active-surface);background:var(--re-data-grid-paginator-page-active-surface);color:var(--re-data-grid-paginator-page-active-color)}.re-paginator-gap{display:flex;align-items:center;justify-content:center;padding:var(--re-data-grid-paginator-page-paddings);color:var(--re-data-grid-paginator-page-color)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: DataGridDropdown, selector: "re-data-grid-dropdown", inputs: ["options", "value", "disabled", "placeholder"], outputs: ["selectValue"] }] });
218
+ `, isInline: true, styles: [":host{--re-data-grid-paginator-gap: .5rem;--re-data-grid-paginator-page-size: 1.75rem;--re-data-grid-paginator-page-min-width: var(--re-data-grid-paginator-page-size);--re-data-grid-paginator-page-height: var(--re-data-grid-paginator-page-size);--re-data-grid-paginator-page-paddings: 0 .5rem;--re-data-grid-paginator-page-border: 1px solid var(--re-data-grid-paginator-separator-color, #e2e8f0);--re-data-grid-paginator-page-separator-color: var(--re-data-grid-separator-color, var(--border-color, #e2e8f0));--re-data-grid-paginator-page-rounded: var(--re-data-grid-rounded, var(--radius-md, .375rem));--re-data-grid-paginator-page-surface: var(--re-data-grid-surface, white);--re-data-grid-paginator-page-color: var(--text-primary, #1e293b);--re-data-grid-paginator-page-font-size: .875rem;--re-data-grid-paginator-page-active-surface: var(--re-data-grid-active, #3b82f6);--re-data-grid-paginator-page-active-color: white;--re-data-grid-paginator-page-hover-surface: var(--re-data-grid-active, #3b82f6);--re-data-grid-paginator-page-hover-color: white;--re-data-grid-paginator-edge-min-width: 2.5rem;--re-data-grid-paginator-edge-height: var(--re-data-grid-paginator-page-size);--re-data-grid-paginator-edge-paddings: 0 .625rem;--re-data-grid-paginator-edge-border: var(--re-data-grid-paginator-page-border);--re-data-grid-paginator-edge-rounded: var(--re-data-grid-paginator-page-rounded);--re-data-grid-paginator-edge-surface: var(--re-data-grid-paginator-page-surface);--re-data-grid-paginator-edge-color: var(--re-data-grid-paginator-page-color);--re-data-grid-paginator-edge-font-size: var(--re-data-grid-paginator-page-font-size);--re-data-grid-paginator-edge-hover-surface: var(--re-data-grid-paginator-page-hover-surface);--re-data-grid-paginator-edge-hover-color: var(--re-data-grid-paginator-page-hover-color);--re-data-grid-paginator-edge-disabled-opacity: .5;--re-data-grid-paginator-per-page-gap: .5rem;--re-data-grid-paginator-per-page-label-size: .8125rem;--re-data-grid-paginator-per-page-label-color: var(--re-data-grid-paginator-page-color);display:flex;align-items:center;gap:var(--re-data-grid-paginator-gap);flex-wrap:wrap}:host re-data-grid-dropdown{--re-data-grid-dropdown-width: 4rem}.re-paginator-per-page{display:inline-flex;align-items:center;gap:var(--re-data-grid-paginator-per-page-gap);margin-right:auto}.re-paginator-per-page-label{font-size:var(--re-data-grid-paginator-per-page-label-size);color:var(--re-data-grid-paginator-per-page-label-color)}.re-paginator-page{display:inline-flex;justify-content:center;align-items:center;min-width:var(--re-data-grid-paginator-page-min-width);height:var(--re-data-grid-paginator-page-height);padding:var(--re-data-grid-paginator-page-paddings);border-radius:var(--re-data-grid-paginator-page-rounded);border:var(--re-data-grid-paginator-page-border);font-size:var(--re-data-grid-paginator-page-font-size);background:var(--re-data-grid-paginator-page-surface);color:var(--re-data-grid-paginator-page-color);cursor:pointer;white-space:nowrap;transition:all .2s}.re-paginator-edge{display:inline-flex;justify-content:center;align-items:center;min-width:var(--re-data-grid-paginator-edge-min-width);height:var(--re-data-grid-paginator-edge-height);padding:var(--re-data-grid-paginator-edge-paddings);border-radius:var(--re-data-grid-paginator-edge-rounded);border:var(--re-data-grid-paginator-edge-border);font-size:var(--re-data-grid-paginator-edge-font-size);background:var(--re-data-grid-paginator-edge-surface);color:var(--re-data-grid-paginator-edge-color);cursor:pointer;white-space:nowrap;transition:all .2s}.re-paginator-edge:hover:not(:disabled){background:var(--re-data-grid-paginator-edge-hover-surface);color:var(--re-data-grid-paginator-edge-hover-color)}.re-paginator-edge:disabled{opacity:var(--re-data-grid-paginator-edge-disabled-opacity);cursor:default}.re-paginator-page:hover:not(.re-paginator-page--active){background:var(--re-data-grid-paginator-page-hover-surface);color:var(--re-data-grid-paginator-page-hover-color)}.re-paginator-page--active{border-color:var(--re-data-grid-paginator-active-surface);background:var(--re-data-grid-paginator-page-active-surface);color:var(--re-data-grid-paginator-page-active-color)}.re-paginator-gap{display:flex;align-items:center;justify-content:center;padding:var(--re-data-grid-paginator-page-paddings);color:var(--re-data-grid-paginator-page-color)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: DataGridDropdown, selector: "re-data-grid-dropdown", inputs: ["options", "value", "disabled", "placeholder"], outputs: ["selectValue"] }] });
197
219
  }
198
220
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: DataGridPaginator, decorators: [{
199
221
  type: Component,
200
- args: [{ selector: 're-data-grid-paginator', imports: [NgTemplateOutlet, DataGridDropdown], template: `
222
+ args: [{ selector: 're-data-grid-paginator', standalone: true, imports: [NgTemplateOutlet, DataGridDropdown], template: `
201
223
  @let total = totalPages();
224
+ @let currentPage = normalizedCurrent();
202
225
  @let perPageOptions = normalizedPageSizeOptions();
203
226
 
204
227
  @if (showPerPage() && perPageOptions.length) {
@@ -208,6 +231,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
208
231
  <re-data-grid-dropdown
209
232
  [options]="perPageOptions"
210
233
  [value]="pageSize()"
234
+ [disabled]="disabled()"
211
235
  [placeholder]="''"
212
236
  (selectValue)="onPageSizeChange($event)"
213
237
  />
@@ -215,13 +239,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
215
239
  }
216
240
 
217
241
  @if (showFirstLast() && total > 1) {
218
- @let firstDisabled = current() <= 0;
242
+ @let firstDisabled = disabled() || currentPage <= 0;
219
243
 
220
- <button class="re-paginator-edge re-paginator-edge--first" [disabled]="firstDisabled" (click)="goToPage(0)">
244
+ <button
245
+ class="re-paginator-edge re-paginator-edge--first"
246
+ aria-label="Go to first page"
247
+ [disabled]="firstDisabled"
248
+ (click)="goToPage(0)"
249
+ >
221
250
  @if (firstTpl()) {
222
251
  <ng-container
223
252
  [ngTemplateOutlet]="firstTpl()!.tpl"
224
- [ngTemplateOutletContext]="{ $implicit: 0, current: current(), total, disabled: firstDisabled }"
253
+ [ngTemplateOutletContext]="{ $implicit: 0, current: currentPage, total, disabled: firstDisabled }"
225
254
  />
226
255
  } @else {
227
256
  {{ firstLabel() }}
@@ -231,11 +260,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
231
260
 
232
261
  @for (page of pages(); track $index) {
233
262
  @if (page === -1) {
234
- <span class="re-paginator-gap">...</span>
263
+ <span class="re-paginator-gap" role="presentation" aria-hidden="true">...</span>
235
264
  } @else {
236
265
  <button
237
266
  class="re-paginator-page"
238
- [class.re-paginator-page--active]="page === current()"
267
+ [class.re-paginator-page--active]="page === currentPage"
268
+ [attr.aria-current]="page === currentPage ? 'page' : null"
269
+ [attr.aria-label]="'Go to page ' + (page + 1)"
270
+ [disabled]="disabled() || page === currentPage"
239
271
  (click)="goToPage(page)"
240
272
  >
241
273
  @if (pageTpl()) {
@@ -245,9 +277,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
245
277
  $implicit: page,
246
278
  page,
247
279
  label: page + 1,
248
- current: current(),
280
+ current: currentPage,
249
281
  total,
250
- active: page === current(),
282
+ active: page === currentPage,
251
283
  }"
252
284
  />
253
285
  } @else {
@@ -259,21 +291,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
259
291
 
260
292
  @if (showFirstLast() && total > 1) {
261
293
  @let lastPage = total - 1;
262
- @let lastDisabled = current() >= lastPage;
294
+ @let lastDisabled = disabled() || currentPage >= lastPage;
263
295
 
264
- <button class="re-paginator-edge re-paginator-edge--last" [disabled]="lastDisabled" (click)="goToPage(lastPage)">
296
+ <button
297
+ class="re-paginator-edge re-paginator-edge--last"
298
+ aria-label="Go to last page"
299
+ [disabled]="lastDisabled"
300
+ (click)="goToPage(lastPage)"
301
+ >
265
302
  @if (lastTpl()) {
266
303
  <ng-container
267
304
  [ngTemplateOutlet]="lastTpl()!.tpl"
268
- [ngTemplateOutletContext]="{ $implicit: lastPage, current: current(), total, disabled: lastDisabled }"
305
+ [ngTemplateOutletContext]="{ $implicit: lastPage, current: currentPage, total, disabled: lastDisabled }"
269
306
  />
270
307
  } @else {
271
308
  {{ lastLabel() }}
272
309
  }
273
310
  </button>
274
311
  }
275
- `, styles: [":host{--re-data-grid-paginator-gap: .5rem;--re-data-grid-paginator-page-size: 1.75rem;--re-data-grid-paginator-page-min-width: var(--re-data-grid-paginator-page-size);--re-data-grid-paginator-page-height: var(--re-data-grid-paginator-page-size);--re-data-grid-paginator-page-paddings: 0 .5rem;--re-data-grid-paginator-page-border: 1px solid var(--re-data-grid-paginator-separator-color, #e2e8f0);--re-data-grid-paginator-page-separator-color: var(--re-data-grid-separator-color, --border-color);--re-data-grid-paginator-page-rounded: var(--re-data-grid-rounded, --radius-md);--re-data-grid-paginator-page-surface: var(--re-data-grid-surface, white);--re-data-grid-paginator-page-color: var(--text-primary, #1e293b);--re-data-grid-paginator-page-font-size: .875rem;--re-data-grid-paginator-page-active-surface: var(--re-data-grid-active, #3b82f6);--re-data-grid-paginator-page-active-color: white;--re-data-grid-paginator-page-hover-surface: var(--re-data-grid-active, #3b82f6);--re-data-grid-paginator-page-hover-color: white;--re-data-grid-paginator-edge-min-width: 2.5rem;--re-data-grid-paginator-edge-height: var(--re-data-grid-paginator-page-size);--re-data-grid-paginator-edge-paddings: 0 .625rem;--re-data-grid-paginator-edge-border: var(--re-data-grid-paginator-page-border);--re-data-grid-paginator-edge-rounded: var(--re-data-grid-paginator-page-rounded);--re-data-grid-paginator-edge-surface: var(--re-data-grid-paginator-page-surface);--re-data-grid-paginator-edge-color: var(--re-data-grid-paginator-page-color);--re-data-grid-paginator-edge-font-size: var(--re-data-grid-paginator-page-font-size);--re-data-grid-paginator-edge-hover-surface: var(--re-data-grid-paginator-page-hover-surface);--re-data-grid-paginator-edge-hover-color: var(--re-data-grid-paginator-page-hover-color);--re-data-grid-paginator-edge-disabled-opacity: .5;--re-data-grid-paginator-per-page-gap: .5rem;--re-data-grid-paginator-per-page-label-size: .8125rem;--re-data-grid-paginator-per-page-label-color: var(--re-data-grid-paginator-page-color);display:flex;align-items:center;gap:var(--re-data-grid-paginator-gap);flex-wrap:wrap}:host re-data-grid-dropdown{--re-data-grid-dropdown-width: 4rem}.re-paginator-per-page{display:inline-flex;align-items:center;gap:var(--re-data-grid-paginator-per-page-gap);margin-right:auto}.re-paginator-per-page-label{font-size:var(--re-data-grid-paginator-per-page-label-size);color:var(--re-data-grid-paginator-per-page-label-color)}.re-paginator-page{display:inline-flex;justify-content:center;align-items:center;min-width:var(--re-data-grid-paginator-page-min-width);height:var(--re-data-grid-paginator-page-height);padding:var(--re-data-grid-paginator-page-paddings);border-radius:var(--re-data-grid-paginator-page-rounded);border:var(--re-data-grid-paginator-page-border);font-size:var(--re-data-grid-paginator-page-font-size);background:var(--re-data-grid-paginator-page-surface);color:var(--re-data-grid-paginator-page-color);cursor:pointer;white-space:nowrap;transition:all .2s}.re-paginator-edge{display:inline-flex;justify-content:center;align-items:center;min-width:var(--re-data-grid-paginator-edge-min-width);height:var(--re-data-grid-paginator-edge-height);padding:var(--re-data-grid-paginator-edge-paddings);border-radius:var(--re-data-grid-paginator-edge-rounded);border:var(--re-data-grid-paginator-edge-border);font-size:var(--re-data-grid-paginator-edge-font-size);background:var(--re-data-grid-paginator-edge-surface);color:var(--re-data-grid-paginator-edge-color);cursor:pointer;white-space:nowrap;transition:all .2s}.re-paginator-edge:hover:not(:disabled){background:var(--re-data-grid-paginator-edge-hover-surface);color:var(--re-data-grid-paginator-edge-hover-color)}.re-paginator-edge:disabled{opacity:var(--re-data-grid-paginator-edge-disabled-opacity);cursor:default}.re-paginator-page:hover:not(.re-paginator-page--active){background:var(--re-data-grid-paginator-page-hover-surface);color:var(--re-data-grid-paginator-page-hover-color)}.re-paginator-page--active{border-color:var(--re-data-grid-paginator-active-surface);background:var(--re-data-grid-paginator-page-active-surface);color:var(--re-data-grid-paginator-page-active-color)}.re-paginator-gap{display:flex;align-items:center;justify-content:center;padding:var(--re-data-grid-paginator-page-paddings);color:var(--re-data-grid-paginator-page-color)}\n"] }]
276
- }], propDecorators: { current: [{ type: i0.Input, args: [{ isSignal: true, alias: "current", required: false }] }], totalElements: [{ type: i0.Input, args: [{ isSignal: true, alias: "totalElements", required: false }] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }], maxShowPages: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxShowPages", required: false }] }], showFirstLast: [{ type: i0.Input, args: [{ isSignal: true, alias: "showFirstLast", required: false }] }], firstLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstLabel", required: false }] }], lastLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "lastLabel", required: false }] }], showPerPage: [{ type: i0.Input, args: [{ isSignal: true, alias: "showPerPage", required: false }] }], perPageLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "perPageLabel", required: false }] }], pageSizeOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSizeOptions", required: false }] }], pageChange: [{ type: i0.Output, args: ["pageChange"] }], pageSizeChange: [{ type: i0.Output, args: ["pageSizeChange"] }], firstSlotRefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => DataGridPaginatorFirstDirective), { isSignal: true }] }], lastSlotRefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => DataGridPaginatorLastDirective), { isSignal: true }] }], pageSlotRefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => DataGridPaginatorPageDirective), { isSignal: true }] }] } });
312
+ `, styles: [":host{--re-data-grid-paginator-gap: .5rem;--re-data-grid-paginator-page-size: 1.75rem;--re-data-grid-paginator-page-min-width: var(--re-data-grid-paginator-page-size);--re-data-grid-paginator-page-height: var(--re-data-grid-paginator-page-size);--re-data-grid-paginator-page-paddings: 0 .5rem;--re-data-grid-paginator-page-border: 1px solid var(--re-data-grid-paginator-separator-color, #e2e8f0);--re-data-grid-paginator-page-separator-color: var(--re-data-grid-separator-color, var(--border-color, #e2e8f0));--re-data-grid-paginator-page-rounded: var(--re-data-grid-rounded, var(--radius-md, .375rem));--re-data-grid-paginator-page-surface: var(--re-data-grid-surface, white);--re-data-grid-paginator-page-color: var(--text-primary, #1e293b);--re-data-grid-paginator-page-font-size: .875rem;--re-data-grid-paginator-page-active-surface: var(--re-data-grid-active, #3b82f6);--re-data-grid-paginator-page-active-color: white;--re-data-grid-paginator-page-hover-surface: var(--re-data-grid-active, #3b82f6);--re-data-grid-paginator-page-hover-color: white;--re-data-grid-paginator-edge-min-width: 2.5rem;--re-data-grid-paginator-edge-height: var(--re-data-grid-paginator-page-size);--re-data-grid-paginator-edge-paddings: 0 .625rem;--re-data-grid-paginator-edge-border: var(--re-data-grid-paginator-page-border);--re-data-grid-paginator-edge-rounded: var(--re-data-grid-paginator-page-rounded);--re-data-grid-paginator-edge-surface: var(--re-data-grid-paginator-page-surface);--re-data-grid-paginator-edge-color: var(--re-data-grid-paginator-page-color);--re-data-grid-paginator-edge-font-size: var(--re-data-grid-paginator-page-font-size);--re-data-grid-paginator-edge-hover-surface: var(--re-data-grid-paginator-page-hover-surface);--re-data-grid-paginator-edge-hover-color: var(--re-data-grid-paginator-page-hover-color);--re-data-grid-paginator-edge-disabled-opacity: .5;--re-data-grid-paginator-per-page-gap: .5rem;--re-data-grid-paginator-per-page-label-size: .8125rem;--re-data-grid-paginator-per-page-label-color: var(--re-data-grid-paginator-page-color);display:flex;align-items:center;gap:var(--re-data-grid-paginator-gap);flex-wrap:wrap}:host re-data-grid-dropdown{--re-data-grid-dropdown-width: 4rem}.re-paginator-per-page{display:inline-flex;align-items:center;gap:var(--re-data-grid-paginator-per-page-gap);margin-right:auto}.re-paginator-per-page-label{font-size:var(--re-data-grid-paginator-per-page-label-size);color:var(--re-data-grid-paginator-per-page-label-color)}.re-paginator-page{display:inline-flex;justify-content:center;align-items:center;min-width:var(--re-data-grid-paginator-page-min-width);height:var(--re-data-grid-paginator-page-height);padding:var(--re-data-grid-paginator-page-paddings);border-radius:var(--re-data-grid-paginator-page-rounded);border:var(--re-data-grid-paginator-page-border);font-size:var(--re-data-grid-paginator-page-font-size);background:var(--re-data-grid-paginator-page-surface);color:var(--re-data-grid-paginator-page-color);cursor:pointer;white-space:nowrap;transition:all .2s}.re-paginator-edge{display:inline-flex;justify-content:center;align-items:center;min-width:var(--re-data-grid-paginator-edge-min-width);height:var(--re-data-grid-paginator-edge-height);padding:var(--re-data-grid-paginator-edge-paddings);border-radius:var(--re-data-grid-paginator-edge-rounded);border:var(--re-data-grid-paginator-edge-border);font-size:var(--re-data-grid-paginator-edge-font-size);background:var(--re-data-grid-paginator-edge-surface);color:var(--re-data-grid-paginator-edge-color);cursor:pointer;white-space:nowrap;transition:all .2s}.re-paginator-edge:hover:not(:disabled){background:var(--re-data-grid-paginator-edge-hover-surface);color:var(--re-data-grid-paginator-edge-hover-color)}.re-paginator-edge:disabled{opacity:var(--re-data-grid-paginator-edge-disabled-opacity);cursor:default}.re-paginator-page:hover:not(.re-paginator-page--active){background:var(--re-data-grid-paginator-page-hover-surface);color:var(--re-data-grid-paginator-page-hover-color)}.re-paginator-page--active{border-color:var(--re-data-grid-paginator-active-surface);background:var(--re-data-grid-paginator-page-active-surface);color:var(--re-data-grid-paginator-page-active-color)}.re-paginator-gap{display:flex;align-items:center;justify-content:center;padding:var(--re-data-grid-paginator-page-paddings);color:var(--re-data-grid-paginator-page-color)}\n"] }]
313
+ }], propDecorators: { current: [{ type: i0.Input, args: [{ isSignal: true, alias: "current", required: false }] }], totalElements: [{ type: i0.Input, args: [{ isSignal: true, alias: "totalElements", required: false }] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }], maxShowPages: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxShowPages", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], showFirstLast: [{ type: i0.Input, args: [{ isSignal: true, alias: "showFirstLast", required: false }] }], firstLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstLabel", required: false }] }], lastLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "lastLabel", required: false }] }], showPerPage: [{ type: i0.Input, args: [{ isSignal: true, alias: "showPerPage", required: false }] }], perPageLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "perPageLabel", required: false }] }], pageSizeOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSizeOptions", required: false }] }], pageChange: [{ type: i0.Output, args: ["pageChange"] }], pageSizeChange: [{ type: i0.Output, args: ["pageSizeChange"] }], firstSlotRefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => DataGridPaginatorFirstDirective), { isSignal: true }] }], lastSlotRefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => DataGridPaginatorLastDirective), { isSignal: true }] }], pageSlotRefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => DataGridPaginatorPageDirective), { isSignal: true }] }] } });
277
314
 
278
315
  /**
279
316
  * Generated bundle index. Do not edit.