@lumston/ds-angular 0.0.7 → 0.0.8

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 (38) hide show
  1. package/fesm2022/lumston-ds-angular-src-data-display.mjs +215 -0
  2. package/fesm2022/lumston-ds-angular-src-data-display.mjs.map +1 -0
  3. package/fesm2022/lumston-ds-angular-src-dropdown.mjs +94 -0
  4. package/fesm2022/lumston-ds-angular-src-dropdown.mjs.map +1 -0
  5. package/fesm2022/lumston-ds-angular-src-feedback.mjs +400 -0
  6. package/fesm2022/lumston-ds-angular-src-feedback.mjs.map +1 -0
  7. package/fesm2022/lumston-ds-angular-src-icon.mjs +148 -0
  8. package/fesm2022/lumston-ds-angular-src-icon.mjs.map +1 -0
  9. package/fesm2022/lumston-ds-angular-src-inputs.mjs +1132 -0
  10. package/fesm2022/lumston-ds-angular-src-inputs.mjs.map +1 -0
  11. package/fesm2022/lumston-ds-angular-src-navigation.mjs +473 -0
  12. package/fesm2022/lumston-ds-angular-src-navigation.mjs.map +1 -0
  13. package/fesm2022/lumston-ds-angular-src-overlay.mjs +1038 -0
  14. package/fesm2022/lumston-ds-angular-src-overlay.mjs.map +1 -0
  15. package/fesm2022/lumston-ds-angular-src-typography.mjs +303 -0
  16. package/fesm2022/lumston-ds-angular-src-typography.mjs.map +1 -0
  17. package/fesm2022/lumston-ds-angular.mjs +90 -65
  18. package/fesm2022/lumston-ds-angular.mjs.map +1 -1
  19. package/package.json +58 -32
  20. package/styles/index.css +0 -24
  21. package/styles/ls-icons.css +482 -0
  22. package/types/lumston-ds-angular-src-data-display.d.ts +50 -0
  23. package/types/lumston-ds-angular-src-data-display.d.ts.map +1 -0
  24. package/types/lumston-ds-angular-src-dropdown.d.ts +28 -0
  25. package/types/lumston-ds-angular-src-dropdown.d.ts.map +1 -0
  26. package/types/lumston-ds-angular-src-feedback.d.ts +75 -0
  27. package/types/lumston-ds-angular-src-feedback.d.ts.map +1 -0
  28. package/types/lumston-ds-angular-src-icon.d.ts +27 -0
  29. package/types/lumston-ds-angular-src-icon.d.ts.map +1 -0
  30. package/types/lumston-ds-angular-src-inputs.d.ts +201 -0
  31. package/types/lumston-ds-angular-src-inputs.d.ts.map +1 -0
  32. package/types/lumston-ds-angular-src-navigation.d.ts +186 -0
  33. package/types/lumston-ds-angular-src-navigation.d.ts.map +1 -0
  34. package/types/lumston-ds-angular-src-overlay.d.ts +357 -0
  35. package/types/lumston-ds-angular-src-overlay.d.ts.map +1 -0
  36. package/types/lumston-ds-angular-src-typography.d.ts +51 -0
  37. package/types/lumston-ds-angular-src-typography.d.ts.map +1 -0
  38. package/types/lumston-ds-angular.d.ts.map +1 -1
@@ -0,0 +1,473 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, output, signal, computed, ChangeDetectionStrategy, Component, TemplateRef } from '@angular/core';
3
+ import { NgTemplateOutlet } from '@angular/common';
4
+
5
+ /**
6
+ * Renders an accessible pagination bar for navigating a paged data set.
7
+ *
8
+ * Supports both **controlled** and **uncontrolled** modes:
9
+ * - **Controlled**: provide the `page` input and update it in response to
10
+ * the `pageChange` output. The component reflects the external value.
11
+ * - **Uncontrolled**: omit `page`. The component manages its own active
12
+ * page via an internal signal, initialized from `defaultPage`.
13
+ *
14
+ * When the total page count exceeds 5, a 5-item sliding window is rendered
15
+ * centered on the active page. Navigation buttons are rendered inside a
16
+ * `<nav aria-label="pagination">` landmark. Each button receives
17
+ * `aria-current="page"` (active) or `aria-disabled="true"` (boundary/disabled)
18
+ * as appropriate.
19
+ *
20
+ * @example
21
+ * ```html
22
+ * <!-- Uncontrolled -->
23
+ * <ls-pagination [count]="20" (pageChange)="onPage($event)" />
24
+ *
25
+ * <!-- Controlled -->
26
+ * <ls-pagination
27
+ * [count]="20"
28
+ * [page]="currentPage"
29
+ * (pageChange)="currentPage = $event" />
30
+ * ```
31
+ */
32
+ class PaginationComponent {
33
+ constructor() {
34
+ /**
35
+ * Total number of pages in the data set.
36
+ *
37
+ * Must be a positive integer ≥ 1. Determines both the upper boundary for
38
+ * navigation and the page window calculation.
39
+ *
40
+ * @default 1
41
+ */
42
+ this.count = input(1, ...(ngDevMode ? [{ debugName: "count" }] : []));
43
+ /**
44
+ * Active page index in controlled mode (1-based).
45
+ *
46
+ * When provided, the component reflects this value and does not maintain
47
+ * internal page state. The host is responsible for updating this input in
48
+ * response to `pageChange` emissions. Pass `undefined` to switch to
49
+ * uncontrolled mode.
50
+ *
51
+ * @default undefined
52
+ */
53
+ this.page = input(undefined, ...(ngDevMode ? [{ debugName: "page" }] : []));
54
+ /**
55
+ * Initial active page used in uncontrolled mode (1-based).
56
+ *
57
+ * Consumed once on `ngOnInit`. Has no effect when `page` is provided.
58
+ *
59
+ * @default 1
60
+ */
61
+ this.defaultPage = input(1, ...(ngDevMode ? [{ debugName: "defaultPage" }] : []));
62
+ /**
63
+ * Color token applied to the active page item and button hover states.
64
+ *
65
+ * @default 'primary'
66
+ */
67
+ this.color = input('primary', ...(ngDevMode ? [{ debugName: "color" }] : []));
68
+ /**
69
+ * Visual rendering style of page number items and navigation buttons.
70
+ *
71
+ * @default 'outlined'
72
+ */
73
+ this.variant = input('outlined', ...(ngDevMode ? [{ debugName: "variant" }] : []));
74
+ /**
75
+ * Border-radius style applied uniformly to all buttons in the bar.
76
+ *
77
+ * @default 'rounded'
78
+ */
79
+ this.shape = input('rounded', ...(ngDevMode ? [{ debugName: "shape" }] : []));
80
+ /**
81
+ * Physical dimensions (height, font size, padding) of all buttons.
82
+ *
83
+ * @default 'medium'
84
+ */
85
+ this.size = input('medium', ...(ngDevMode ? [{ debugName: "size" }] : []));
86
+ /**
87
+ * Disables all buttons in the pagination bar.
88
+ *
89
+ * When `true`, every button receives `disabled` and
90
+ * `aria-disabled="true"`. The `pageChange` output will not emit.
91
+ *
92
+ * @default false
93
+ */
94
+ this.disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
95
+ /**
96
+ * Renders a "go to first page" button before the previous-page button.
97
+ *
98
+ * The button is automatically disabled and receives `aria-disabled="true"`
99
+ * when the active page is already the first page.
100
+ *
101
+ * @default false
102
+ */
103
+ this.showFirstButton = input(false, ...(ngDevMode ? [{ debugName: "showFirstButton" }] : []));
104
+ /**
105
+ * Renders a "go to last page" button after the next-page button.
106
+ *
107
+ * The button is automatically disabled and receives `aria-disabled="true"`
108
+ * when the active page is already the last page.
109
+ *
110
+ * @default false
111
+ */
112
+ this.showLastButton = input(false, ...(ngDevMode ? [{ debugName: "showLastButton" }] : []));
113
+ /**
114
+ * Hides the previous-page navigation button.
115
+ *
116
+ * @default false
117
+ */
118
+ this.hidePrevButton = input(false, ...(ngDevMode ? [{ debugName: "hidePrevButton" }] : []));
119
+ /**
120
+ * Hides the next-page navigation button.
121
+ *
122
+ * @default false
123
+ */
124
+ this.hideNextButton = input(false, ...(ngDevMode ? [{ debugName: "hideNextButton" }] : []));
125
+ /**
126
+ * Emits the target page number (1-based) when the user activates any
127
+ * page item or navigation button.
128
+ *
129
+ * Does NOT emit when `disabled` is `true` or when the user clicks a
130
+ * boundary button that is already at its limit (first/last page).
131
+ * In controlled mode, the host must update the `page` input in response
132
+ * to this event to reflect the navigation in the UI.
133
+ */
134
+ this.pageChange = output();
135
+ this._internalPage = signal(1, ...(ngDevMode ? [{ debugName: "_internalPage" }] : []));
136
+ this.activePage = computed(() => this.page() ?? this._internalPage(), ...(ngDevMode ? [{ debugName: "activePage" }] : []));
137
+ this.pages = computed(() => {
138
+ const total = this.count();
139
+ const current = this.activePage();
140
+ if (total <= 5) {
141
+ return Array.from({ length: total }, (_, i) => i + 1);
142
+ }
143
+ const start = Math.max(1, Math.min(current - 2, total - 4));
144
+ return Array.from({ length: 5 }, (_, i) => start + i);
145
+ }, ...(ngDevMode ? [{ debugName: "pages" }] : []));
146
+ this.isFirstPage = computed(() => this.activePage() === 1, ...(ngDevMode ? [{ debugName: "isFirstPage" }] : []));
147
+ this.isLastPage = computed(() => this.activePage() === this.count(), ...(ngDevMode ? [{ debugName: "isLastPage" }] : []));
148
+ this._baseClasses = computed(() => {
149
+ const size = this.size();
150
+ const sizeClass = size === 'small'
151
+ ? 'pg-item-sm'
152
+ : size === 'large'
153
+ ? 'pg-item-lg'
154
+ : 'pg-item-md';
155
+ const shapeClass = this.shape() === 'circular' ? 'pg-item-circular' : 'pg-item-rounded';
156
+ return [
157
+ 'pg-item',
158
+ `pg-item-${this.variant()}-${this.color()}`,
159
+ sizeClass,
160
+ shapeClass,
161
+ ].join(' ');
162
+ }, ...(ngDevMode ? [{ debugName: "_baseClasses" }] : []));
163
+ }
164
+ ngOnInit() {
165
+ this._internalPage.set(this.defaultPage());
166
+ }
167
+ pageItemClasses(n) {
168
+ const base = this._baseClasses();
169
+ return n === this.activePage() ? `${base} pg-item-active` : base;
170
+ }
171
+ navClasses(isAtBoundary) {
172
+ const classes = `${this._baseClasses()} pg-nav-btn`;
173
+ return isAtBoundary || this.disabled()
174
+ ? `${classes} pg-item-disabled`
175
+ : classes;
176
+ }
177
+ goToPage(n) {
178
+ if (this.disabled() || n < 1 || n > this.count())
179
+ return;
180
+ if (this.page() === undefined) {
181
+ this._internalPage.set(n);
182
+ }
183
+ this.pageChange.emit(n);
184
+ }
185
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: PaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
186
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: PaginationComponent, isStandalone: true, selector: "ls-pagination", inputs: { count: { classPropertyName: "count", publicName: "count", isSignal: true, isRequired: false, transformFunction: null }, page: { classPropertyName: "page", publicName: "page", isSignal: true, isRequired: false, transformFunction: null }, defaultPage: { classPropertyName: "defaultPage", publicName: "defaultPage", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, shape: { classPropertyName: "shape", publicName: "shape", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, showFirstButton: { classPropertyName: "showFirstButton", publicName: "showFirstButton", isSignal: true, isRequired: false, transformFunction: null }, showLastButton: { classPropertyName: "showLastButton", publicName: "showLastButton", isSignal: true, isRequired: false, transformFunction: null }, hidePrevButton: { classPropertyName: "hidePrevButton", publicName: "hidePrevButton", isSignal: true, isRequired: false, transformFunction: null }, hideNextButton: { classPropertyName: "hideNextButton", publicName: "hideNextButton", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pageChange: "pageChange" }, ngImport: i0, template: `
187
+ <nav aria-label="pagination">
188
+ <ul class="pg-list">
189
+ @if (showFirstButton()) {
190
+ <li>
191
+ <button
192
+ type="button"
193
+ aria-label="first"
194
+ [class]="navClasses(isFirstPage())"
195
+ [disabled]="isFirstPage() || disabled()"
196
+ [attr.aria-disabled]="isFirstPage() || disabled() ? 'true' : null"
197
+ (click)="goToPage(1)">
198
+ <i class="ls-icon ls-chevron-left-double ls-icon-sm"></i>
199
+ </button>
200
+ </li>
201
+ }
202
+ @if (!hidePrevButton()) {
203
+ <li>
204
+ <button
205
+ type="button"
206
+ aria-label="prev"
207
+ [class]="navClasses(isFirstPage())"
208
+ [disabled]="isFirstPage() || disabled()"
209
+ [attr.aria-disabled]="isFirstPage() || disabled() ? 'true' : null"
210
+ (click)="goToPage(activePage() - 1)">
211
+ <i class="ls-icon ls-chevron-left ls-icon-sm"></i>
212
+ </button>
213
+ </li>
214
+ }
215
+ @for (n of pages(); track $index) {
216
+ <li>
217
+ <button
218
+ type="button"
219
+ [class]="pageItemClasses(n)"
220
+ [attr.aria-current]="n === activePage() ? 'page' : null"
221
+ [disabled]="disabled()"
222
+ [attr.aria-disabled]="disabled() ? 'true' : null"
223
+ (click)="goToPage(n)">
224
+ {{ n }}
225
+ </button>
226
+ </li>
227
+ }
228
+ @if (!hideNextButton()) {
229
+ <li>
230
+ <button
231
+ type="button"
232
+ aria-label="next"
233
+ [class]="navClasses(isLastPage())"
234
+ [disabled]="isLastPage() || disabled()"
235
+ [attr.aria-disabled]="isLastPage() || disabled() ? 'true' : null"
236
+ (click)="goToPage(activePage() + 1)">
237
+ <i class="ls-icon ls-chevron-right ls-icon-sm"></i>
238
+ </button>
239
+ </li>
240
+ }
241
+ @if (showLastButton()) {
242
+ <li>
243
+ <button
244
+ type="button"
245
+ aria-label="last"
246
+ [class]="navClasses(isLastPage())"
247
+ [disabled]="isLastPage() || disabled()"
248
+ [attr.aria-disabled]="isLastPage() || disabled() ? 'true' : null"
249
+ (click)="goToPage(count())">
250
+ <i class="ls-icon ls-chevron-right-double ls-icon-sm"></i>
251
+ </button>
252
+ </li>
253
+ }
254
+ </ul>
255
+ </nav>
256
+ `, isInline: true, styles: [":host{display:contents}.pg-icon-left{transform:rotate(90deg)}.pg-icon-right{transform:rotate(-90deg)}.pg-list{display:inline-flex;align-items:center;gap:.25rem;list-style:none;margin:0;padding:0}.pg-item{display:inline-flex;align-items:center;justify-content:center;font-weight:600;cursor:pointer;transition:all var(--ls-transition-duration) ease;border:2px solid transparent;background:none;outline:none;font-family:var(--ls-font-family);line-height:1;-webkit-user-select:none;user-select:none}.pg-item-sm{padding:.375rem .625rem;font-size:.75rem;min-width:1.75rem;height:1.75rem}.pg-item-md{padding:.5rem .875rem;font-size:.875rem;min-width:2.25rem;height:2.25rem}.pg-item-lg{padding:.625rem 1.25rem;font-size:1rem;min-width:2.75rem;height:2.75rem}.pg-item-rounded{border-radius:var(--ls-border-radius-md)}.pg-item-circular{border-radius:var(--ls-border-radius-full);padding-inline:0}.pg-item-circular.pg-item-sm{width:1.75rem}.pg-item-circular.pg-item-md{width:2.25rem}.pg-item-circular.pg-item-lg{width:2.75rem}.pg-item-disabled,.pg-item[disabled]{cursor:not-allowed;opacity:.6}.pg-item-solid-primary{background-color:var(--ls-color-white-light);color:var(--ls-color-dark)}.pg-item-solid-primary:not([disabled]):hover{background-color:var(--ls-color-primary);color:var(--ls-color-white)}.pg-item-solid-primary.pg-item-active{background-color:var(--ls-color-primary);color:var(--ls-color-white)}.pg-item-solid-secondary{background-color:var(--ls-color-white-light);color:var(--ls-color-dark)}.pg-item-solid-secondary:not([disabled]):hover{background-color:var(--ls-color-secondary);color:var(--ls-color-white)}.pg-item-solid-secondary.pg-item-active{background-color:var(--ls-color-secondary);color:var(--ls-color-white)}.pg-item-solid-default{background-color:var(--ls-color-white-light);color:var(--ls-color-dark)}.pg-item-solid-default:not([disabled]):hover{background-color:var(--ls-color-dark);color:var(--ls-color-white)}.pg-item-solid-default.pg-item-active{background-color:var(--ls-color-dark);color:var(--ls-color-white)}.pg-item-outlined-primary{background-color:transparent;border-color:var(--ls-color-white-light);color:var(--ls-color-dark)}.pg-item-outlined-primary:not([disabled]):hover{border-color:var(--ls-color-primary);color:var(--ls-color-primary)}.pg-item-outlined-primary.pg-item-active{border-color:var(--ls-color-primary);color:var(--ls-color-primary)}.pg-item-outlined-secondary{background-color:transparent;border-color:var(--ls-color-white-light);color:var(--ls-color-dark)}.pg-item-outlined-secondary:not([disabled]):hover{border-color:var(--ls-color-secondary);color:var(--ls-color-secondary)}.pg-item-outlined-secondary.pg-item-active{border-color:var(--ls-color-secondary);color:var(--ls-color-secondary)}.pg-item-outlined-default{background-color:transparent;border-color:var(--ls-color-white-light);color:var(--ls-color-dark)}.pg-item-outlined-default:not([disabled]):hover{border-color:var(--ls-color-dark);color:var(--ls-color-dark)}.pg-item-outlined-default.pg-item-active{border-color:var(--ls-color-dark);color:var(--ls-color-dark)}.pg-item-text-primary{background-color:transparent;border-color:transparent;color:var(--ls-color-white-dark)}.pg-item-text-primary:not([disabled]):hover{background-color:#4361ee1a;color:var(--ls-color-primary)}.pg-item-text-primary.pg-item-active{color:var(--ls-color-primary)}.pg-item-text-secondary{background-color:transparent;border-color:transparent;color:var(--ls-color-white-dark)}.pg-item-text-secondary:not([disabled]):hover{background-color:#805dca1a;color:var(--ls-color-secondary)}.pg-item-text-secondary.pg-item-active{color:var(--ls-color-secondary)}.pg-item-text-default{background-color:transparent;border-color:transparent;color:var(--ls-color-white-dark)}.pg-item-text-default:not([disabled]):hover{background-color:#3b3f5c1a;color:var(--ls-color-dark)}.pg-item-text-default.pg-item-active{color:var(--ls-color-dark)}body.dark .pg-item-solid-primary,body.dark .pg-item-solid-secondary,body.dark .pg-item-solid-default{background-color:#191e3a;color:var(--ls-color-white-light)}body.dark .pg-item-solid-primary:not([disabled]):hover,body.dark .pg-item-solid-primary.pg-item-active{background-color:var(--ls-color-primary);color:var(--ls-color-white-light)}body.dark .pg-item-solid-secondary:not([disabled]):hover,body.dark .pg-item-solid-secondary.pg-item-active{background-color:var(--ls-color-secondary);color:var(--ls-color-white-light)}body.dark .pg-item-solid-default:not([disabled]):hover,body.dark .pg-item-solid-default.pg-item-active{background-color:var(--ls-color-dark);color:var(--ls-color-white-light)}body.dark .pg-item-outlined-primary,body.dark .pg-item-outlined-secondary,body.dark .pg-item-outlined-default{border-color:#191e3a;color:var(--ls-color-white-light)}body.dark .pg-item-outlined-primary:not([disabled]):hover,body.dark .pg-item-outlined-primary.pg-item-active{border-color:var(--ls-color-primary);color:var(--ls-color-white-light)}body.dark .pg-item-outlined-secondary:not([disabled]):hover,body.dark .pg-item-outlined-secondary.pg-item-active{border-color:var(--ls-color-secondary);color:var(--ls-color-white-light)}body.dark .pg-item-outlined-default:not([disabled]):hover,body.dark .pg-item-outlined-default.pg-item-active{border-color:var(--ls-color-dark);color:var(--ls-color-white-light)}body.dark .pg-item-text-primary,body.dark .pg-item-text-secondary,body.dark .pg-item-text-default{color:var(--ls-color-white-dark)}body.dark .pg-item-text-primary:not([disabled]):hover,body.dark .pg-item-text-primary.pg-item-active{color:var(--ls-color-primary)}body.dark .pg-item-text-secondary:not([disabled]):hover,body.dark .pg-item-text-secondary.pg-item-active{color:var(--ls-color-secondary)}body.dark .pg-item-text-default:not([disabled]):hover,body.dark .pg-item-text-default.pg-item-active{color:var(--ls-color-white-light)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
257
+ }
258
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: PaginationComponent, decorators: [{
259
+ type: Component,
260
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, imports: [], selector: 'ls-pagination', standalone: true, template: `
261
+ <nav aria-label="pagination">
262
+ <ul class="pg-list">
263
+ @if (showFirstButton()) {
264
+ <li>
265
+ <button
266
+ type="button"
267
+ aria-label="first"
268
+ [class]="navClasses(isFirstPage())"
269
+ [disabled]="isFirstPage() || disabled()"
270
+ [attr.aria-disabled]="isFirstPage() || disabled() ? 'true' : null"
271
+ (click)="goToPage(1)">
272
+ <i class="ls-icon ls-chevron-left-double ls-icon-sm"></i>
273
+ </button>
274
+ </li>
275
+ }
276
+ @if (!hidePrevButton()) {
277
+ <li>
278
+ <button
279
+ type="button"
280
+ aria-label="prev"
281
+ [class]="navClasses(isFirstPage())"
282
+ [disabled]="isFirstPage() || disabled()"
283
+ [attr.aria-disabled]="isFirstPage() || disabled() ? 'true' : null"
284
+ (click)="goToPage(activePage() - 1)">
285
+ <i class="ls-icon ls-chevron-left ls-icon-sm"></i>
286
+ </button>
287
+ </li>
288
+ }
289
+ @for (n of pages(); track $index) {
290
+ <li>
291
+ <button
292
+ type="button"
293
+ [class]="pageItemClasses(n)"
294
+ [attr.aria-current]="n === activePage() ? 'page' : null"
295
+ [disabled]="disabled()"
296
+ [attr.aria-disabled]="disabled() ? 'true' : null"
297
+ (click)="goToPage(n)">
298
+ {{ n }}
299
+ </button>
300
+ </li>
301
+ }
302
+ @if (!hideNextButton()) {
303
+ <li>
304
+ <button
305
+ type="button"
306
+ aria-label="next"
307
+ [class]="navClasses(isLastPage())"
308
+ [disabled]="isLastPage() || disabled()"
309
+ [attr.aria-disabled]="isLastPage() || disabled() ? 'true' : null"
310
+ (click)="goToPage(activePage() + 1)">
311
+ <i class="ls-icon ls-chevron-right ls-icon-sm"></i>
312
+ </button>
313
+ </li>
314
+ }
315
+ @if (showLastButton()) {
316
+ <li>
317
+ <button
318
+ type="button"
319
+ aria-label="last"
320
+ [class]="navClasses(isLastPage())"
321
+ [disabled]="isLastPage() || disabled()"
322
+ [attr.aria-disabled]="isLastPage() || disabled() ? 'true' : null"
323
+ (click)="goToPage(count())">
324
+ <i class="ls-icon ls-chevron-right-double ls-icon-sm"></i>
325
+ </button>
326
+ </li>
327
+ }
328
+ </ul>
329
+ </nav>
330
+ `, styles: [":host{display:contents}.pg-icon-left{transform:rotate(90deg)}.pg-icon-right{transform:rotate(-90deg)}.pg-list{display:inline-flex;align-items:center;gap:.25rem;list-style:none;margin:0;padding:0}.pg-item{display:inline-flex;align-items:center;justify-content:center;font-weight:600;cursor:pointer;transition:all var(--ls-transition-duration) ease;border:2px solid transparent;background:none;outline:none;font-family:var(--ls-font-family);line-height:1;-webkit-user-select:none;user-select:none}.pg-item-sm{padding:.375rem .625rem;font-size:.75rem;min-width:1.75rem;height:1.75rem}.pg-item-md{padding:.5rem .875rem;font-size:.875rem;min-width:2.25rem;height:2.25rem}.pg-item-lg{padding:.625rem 1.25rem;font-size:1rem;min-width:2.75rem;height:2.75rem}.pg-item-rounded{border-radius:var(--ls-border-radius-md)}.pg-item-circular{border-radius:var(--ls-border-radius-full);padding-inline:0}.pg-item-circular.pg-item-sm{width:1.75rem}.pg-item-circular.pg-item-md{width:2.25rem}.pg-item-circular.pg-item-lg{width:2.75rem}.pg-item-disabled,.pg-item[disabled]{cursor:not-allowed;opacity:.6}.pg-item-solid-primary{background-color:var(--ls-color-white-light);color:var(--ls-color-dark)}.pg-item-solid-primary:not([disabled]):hover{background-color:var(--ls-color-primary);color:var(--ls-color-white)}.pg-item-solid-primary.pg-item-active{background-color:var(--ls-color-primary);color:var(--ls-color-white)}.pg-item-solid-secondary{background-color:var(--ls-color-white-light);color:var(--ls-color-dark)}.pg-item-solid-secondary:not([disabled]):hover{background-color:var(--ls-color-secondary);color:var(--ls-color-white)}.pg-item-solid-secondary.pg-item-active{background-color:var(--ls-color-secondary);color:var(--ls-color-white)}.pg-item-solid-default{background-color:var(--ls-color-white-light);color:var(--ls-color-dark)}.pg-item-solid-default:not([disabled]):hover{background-color:var(--ls-color-dark);color:var(--ls-color-white)}.pg-item-solid-default.pg-item-active{background-color:var(--ls-color-dark);color:var(--ls-color-white)}.pg-item-outlined-primary{background-color:transparent;border-color:var(--ls-color-white-light);color:var(--ls-color-dark)}.pg-item-outlined-primary:not([disabled]):hover{border-color:var(--ls-color-primary);color:var(--ls-color-primary)}.pg-item-outlined-primary.pg-item-active{border-color:var(--ls-color-primary);color:var(--ls-color-primary)}.pg-item-outlined-secondary{background-color:transparent;border-color:var(--ls-color-white-light);color:var(--ls-color-dark)}.pg-item-outlined-secondary:not([disabled]):hover{border-color:var(--ls-color-secondary);color:var(--ls-color-secondary)}.pg-item-outlined-secondary.pg-item-active{border-color:var(--ls-color-secondary);color:var(--ls-color-secondary)}.pg-item-outlined-default{background-color:transparent;border-color:var(--ls-color-white-light);color:var(--ls-color-dark)}.pg-item-outlined-default:not([disabled]):hover{border-color:var(--ls-color-dark);color:var(--ls-color-dark)}.pg-item-outlined-default.pg-item-active{border-color:var(--ls-color-dark);color:var(--ls-color-dark)}.pg-item-text-primary{background-color:transparent;border-color:transparent;color:var(--ls-color-white-dark)}.pg-item-text-primary:not([disabled]):hover{background-color:#4361ee1a;color:var(--ls-color-primary)}.pg-item-text-primary.pg-item-active{color:var(--ls-color-primary)}.pg-item-text-secondary{background-color:transparent;border-color:transparent;color:var(--ls-color-white-dark)}.pg-item-text-secondary:not([disabled]):hover{background-color:#805dca1a;color:var(--ls-color-secondary)}.pg-item-text-secondary.pg-item-active{color:var(--ls-color-secondary)}.pg-item-text-default{background-color:transparent;border-color:transparent;color:var(--ls-color-white-dark)}.pg-item-text-default:not([disabled]):hover{background-color:#3b3f5c1a;color:var(--ls-color-dark)}.pg-item-text-default.pg-item-active{color:var(--ls-color-dark)}body.dark .pg-item-solid-primary,body.dark .pg-item-solid-secondary,body.dark .pg-item-solid-default{background-color:#191e3a;color:var(--ls-color-white-light)}body.dark .pg-item-solid-primary:not([disabled]):hover,body.dark .pg-item-solid-primary.pg-item-active{background-color:var(--ls-color-primary);color:var(--ls-color-white-light)}body.dark .pg-item-solid-secondary:not([disabled]):hover,body.dark .pg-item-solid-secondary.pg-item-active{background-color:var(--ls-color-secondary);color:var(--ls-color-white-light)}body.dark .pg-item-solid-default:not([disabled]):hover,body.dark .pg-item-solid-default.pg-item-active{background-color:var(--ls-color-dark);color:var(--ls-color-white-light)}body.dark .pg-item-outlined-primary,body.dark .pg-item-outlined-secondary,body.dark .pg-item-outlined-default{border-color:#191e3a;color:var(--ls-color-white-light)}body.dark .pg-item-outlined-primary:not([disabled]):hover,body.dark .pg-item-outlined-primary.pg-item-active{border-color:var(--ls-color-primary);color:var(--ls-color-white-light)}body.dark .pg-item-outlined-secondary:not([disabled]):hover,body.dark .pg-item-outlined-secondary.pg-item-active{border-color:var(--ls-color-secondary);color:var(--ls-color-white-light)}body.dark .pg-item-outlined-default:not([disabled]):hover,body.dark .pg-item-outlined-default.pg-item-active{border-color:var(--ls-color-dark);color:var(--ls-color-white-light)}body.dark .pg-item-text-primary,body.dark .pg-item-text-secondary,body.dark .pg-item-text-default{color:var(--ls-color-white-dark)}body.dark .pg-item-text-primary:not([disabled]):hover,body.dark .pg-item-text-primary.pg-item-active{color:var(--ls-color-primary)}body.dark .pg-item-text-secondary:not([disabled]):hover,body.dark .pg-item-text-secondary.pg-item-active{color:var(--ls-color-secondary)}body.dark .pg-item-text-default:not([disabled]):hover,body.dark .pg-item-text-default.pg-item-active{color:var(--ls-color-white-light)}\n"] }]
331
+ }], propDecorators: { count: [{ type: i0.Input, args: [{ isSignal: true, alias: "count", required: false }] }], page: [{ type: i0.Input, args: [{ isSignal: true, alias: "page", required: false }] }], defaultPage: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultPage", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], shape: [{ type: i0.Input, args: [{ isSignal: true, alias: "shape", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], showFirstButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showFirstButton", required: false }] }], showLastButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLastButton", required: false }] }], hidePrevButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "hidePrevButton", required: false }] }], hideNextButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideNextButton", required: false }] }], pageChange: [{ type: i0.Output, args: ["pageChange"] }] } });
332
+
333
+ class BreadcrumbComponent {
334
+ constructor() {
335
+ this.items = input.required(...(ngDevMode ? [{ debugName: "items" }] : []));
336
+ this.variant = input('default', ...(ngDevMode ? [{ debugName: "variant" }] : []));
337
+ this.separator = input('/', ...(ngDevMode ? [{ debugName: "separator" }] : []));
338
+ this.color = input('gray', ...(ngDevMode ? [{ debugName: "color" }] : [])); // El nuevo input de color
339
+ // Lógica para el color dinámico
340
+ this._colorStyle = computed(() => {
341
+ const c = this.color();
342
+ const value = c === 'primary'
343
+ ? 'var(--ls-color-primary)'
344
+ : c === 'secondary'
345
+ ? 'var(--ls-color-secondary)'
346
+ : c;
347
+ return { '--ls-breadcrumb-main-color': value };
348
+ }, ...(ngDevMode ? [{ debugName: "_colorStyle" }] : []));
349
+ this._classes = computed(() => {
350
+ return `ls-breadcrumb ls-breadcrumb--${this.variant()}`;
351
+ }, ...(ngDevMode ? [{ debugName: "_classes" }] : []));
352
+ this._isTemplateSeparator = computed(() => {
353
+ return this.separator() instanceof TemplateRef;
354
+ }, ...(ngDevMode ? [{ debugName: "_isTemplateSeparator" }] : []));
355
+ }
356
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: BreadcrumbComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
357
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: BreadcrumbComponent, isStandalone: true, selector: "ls-breadcrumb", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, separator: { classPropertyName: "separator", publicName: "separator", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
358
+ <nav aria-label="Breadcrumb" [style]="_colorStyle()">
359
+ <ol [class]="_classes()">
360
+ @for (item of items(); track item.label; let isLast = $last) {
361
+ <li
362
+ class="ls-breadcrumb-item"
363
+ [class.ls-breadcrumb-item--active]="isLast">
364
+ @if (isLast) {
365
+ <span aria-current="page">
366
+ @if (item.icon) {
367
+ <i
368
+ [class]="
369
+ 'ls-icon ls-' + item.icon + ' ls-breadcrumb-icon'
370
+ "></i>
371
+ }
372
+ {{ item.label }}
373
+ </span>
374
+ } @else if (item.url) {
375
+ <a [href]="item.url">
376
+ @if (item.icon) {
377
+ <i
378
+ [class]="
379
+ 'ls-icon ls-' + item.icon + ' ls-breadcrumb-icon'
380
+ "></i>
381
+ }
382
+ {{ item.label }}
383
+ </a>
384
+ } @else {
385
+ <span>
386
+ @if (item.icon) {
387
+ <i
388
+ [class]="
389
+ 'ls-icon ls-' + item.icon + ' ls-breadcrumb-icon'
390
+ "></i>
391
+ }
392
+ {{ item.label }}
393
+ </span>
394
+ }
395
+ </li>
396
+
397
+ @if (!isLast && variant() !== 'arrowed') {
398
+ <li class="ls-breadcrumb-separator" aria-hidden="true">
399
+ @if (_isTemplateSeparator()) {
400
+ <ng-container *ngTemplateOutlet="$any(separator())" />
401
+ } @else {
402
+ {{ separator() }}
403
+ }
404
+ </li>
405
+ }
406
+ }
407
+ </ol>
408
+ </nav>
409
+ `, isInline: true, styles: [":host{display:block;--ls-breadcrumb-main-color: #4361ee}.ls-breadcrumb{display:flex;align-items:center;flex-wrap:wrap;list-style:none;margin:0;padding:0;font-family:var(--ls-font-family, sans-serif);font-size:.875rem}.ls-breadcrumb-item{display:inline-flex;align-items:center;color:#6c757d}.ls-breadcrumb-item a,.ls-breadcrumb-item span{display:inline-flex;align-items:center;gap:.5rem}.ls-breadcrumb-item a:hover{text-decoration:none!important;color:var(--ls-breadcrumb-main-color)}.ls-breadcrumb-icon{width:1.15rem;height:1.15rem;display:inline-flex;align-items:center;justify-content:center;color:currentColor;flex-shrink:0;vertical-align:middle}.ls-breadcrumb-item .ls-breadcrumb-icon *{vertical-align:middle}.ls-breadcrumb-separator{margin:0 .5rem;color:#888ea8;-webkit-user-select:none;user-select:none}.ls-breadcrumb--default .ls-breadcrumb-item--active{color:#000;font-weight:600}.ls-breadcrumb--dotted .ls-breadcrumb-separator{font-size:0;display:flex;align-items:center}.ls-breadcrumb--dotted .ls-breadcrumb-separator:before{content:\"\";width:6px;height:6px;background:var(--ls-breadcrumb-main-color);border-radius:50%;display:inline-block}.ls-breadcrumb--dotted .ls-breadcrumb-item--active{color:#000;font-weight:600}.ls-breadcrumb--arrowed{gap:0}.ls-breadcrumb--arrowed .ls-breadcrumb-item{position:relative;background:#e9ecef;padding:.5rem 1rem .5rem 1.5rem;margin-left:-10px;clip-path:polygon(calc(100% - 12px) 0%,100% 50%,calc(100% - 12px) 100%,0% 100%,12px 50%,0% 0%);filter:drop-shadow(1px 0 1px rgba(0,0,0,.08));color:#515365}.ls-breadcrumb--arrowed .ls-breadcrumb-item:first-child{margin-left:0;padding-left:.75rem;clip-path:polygon(calc(100% - 12px) 0%,100% 50%,calc(100% - 12px) 100%,0% 100%,0% 0%);border-radius:4px 0 0 4px}.ls-breadcrumb--arrowed .ls-breadcrumb-item:last-child{padding-right:1.25rem;clip-path:polygon(100% 0%,100% 100%,0% 100%,12px 50%,0% 0%);border-radius:0 4px 4px 0}.ls-breadcrumb--arrowed .ls-breadcrumb-item--active{background:var(--ls-breadcrumb-main-color)!important;color:#fff!important;z-index:10!important}.ls-breadcrumb--arrowed .ls-breadcrumb-item:nth-child(1){z-index:5}.ls-breadcrumb--arrowed .ls-breadcrumb-item:nth-child(2){z-index:4}.ls-breadcrumb--arrowed .ls-breadcrumb-item:nth-child(3){z-index:3}body.dark .ls-breadcrumb-item{color:#bfc9d4}body.dark .ls-breadcrumb--default .ls-breadcrumb-item--active,body.dark .ls-breadcrumb--dotted .ls-breadcrumb-item--active{color:#fff!important}body.dark .ls-breadcrumb--arrowed .ls-breadcrumb-item:not(.ls-breadcrumb-item--active){background:#1b2e4b!important;color:#e0e6ed!important}body.dark .ls-breadcrumb-separator{color:#3b3f5c}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
410
+ }
411
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: BreadcrumbComponent, decorators: [{
412
+ type: Component,
413
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgTemplateOutlet], selector: 'ls-breadcrumb', standalone: true, template: `
414
+ <nav aria-label="Breadcrumb" [style]="_colorStyle()">
415
+ <ol [class]="_classes()">
416
+ @for (item of items(); track item.label; let isLast = $last) {
417
+ <li
418
+ class="ls-breadcrumb-item"
419
+ [class.ls-breadcrumb-item--active]="isLast">
420
+ @if (isLast) {
421
+ <span aria-current="page">
422
+ @if (item.icon) {
423
+ <i
424
+ [class]="
425
+ 'ls-icon ls-' + item.icon + ' ls-breadcrumb-icon'
426
+ "></i>
427
+ }
428
+ {{ item.label }}
429
+ </span>
430
+ } @else if (item.url) {
431
+ <a [href]="item.url">
432
+ @if (item.icon) {
433
+ <i
434
+ [class]="
435
+ 'ls-icon ls-' + item.icon + ' ls-breadcrumb-icon'
436
+ "></i>
437
+ }
438
+ {{ item.label }}
439
+ </a>
440
+ } @else {
441
+ <span>
442
+ @if (item.icon) {
443
+ <i
444
+ [class]="
445
+ 'ls-icon ls-' + item.icon + ' ls-breadcrumb-icon'
446
+ "></i>
447
+ }
448
+ {{ item.label }}
449
+ </span>
450
+ }
451
+ </li>
452
+
453
+ @if (!isLast && variant() !== 'arrowed') {
454
+ <li class="ls-breadcrumb-separator" aria-hidden="true">
455
+ @if (_isTemplateSeparator()) {
456
+ <ng-container *ngTemplateOutlet="$any(separator())" />
457
+ } @else {
458
+ {{ separator() }}
459
+ }
460
+ </li>
461
+ }
462
+ }
463
+ </ol>
464
+ </nav>
465
+ `, styles: [":host{display:block;--ls-breadcrumb-main-color: #4361ee}.ls-breadcrumb{display:flex;align-items:center;flex-wrap:wrap;list-style:none;margin:0;padding:0;font-family:var(--ls-font-family, sans-serif);font-size:.875rem}.ls-breadcrumb-item{display:inline-flex;align-items:center;color:#6c757d}.ls-breadcrumb-item a,.ls-breadcrumb-item span{display:inline-flex;align-items:center;gap:.5rem}.ls-breadcrumb-item a:hover{text-decoration:none!important;color:var(--ls-breadcrumb-main-color)}.ls-breadcrumb-icon{width:1.15rem;height:1.15rem;display:inline-flex;align-items:center;justify-content:center;color:currentColor;flex-shrink:0;vertical-align:middle}.ls-breadcrumb-item .ls-breadcrumb-icon *{vertical-align:middle}.ls-breadcrumb-separator{margin:0 .5rem;color:#888ea8;-webkit-user-select:none;user-select:none}.ls-breadcrumb--default .ls-breadcrumb-item--active{color:#000;font-weight:600}.ls-breadcrumb--dotted .ls-breadcrumb-separator{font-size:0;display:flex;align-items:center}.ls-breadcrumb--dotted .ls-breadcrumb-separator:before{content:\"\";width:6px;height:6px;background:var(--ls-breadcrumb-main-color);border-radius:50%;display:inline-block}.ls-breadcrumb--dotted .ls-breadcrumb-item--active{color:#000;font-weight:600}.ls-breadcrumb--arrowed{gap:0}.ls-breadcrumb--arrowed .ls-breadcrumb-item{position:relative;background:#e9ecef;padding:.5rem 1rem .5rem 1.5rem;margin-left:-10px;clip-path:polygon(calc(100% - 12px) 0%,100% 50%,calc(100% - 12px) 100%,0% 100%,12px 50%,0% 0%);filter:drop-shadow(1px 0 1px rgba(0,0,0,.08));color:#515365}.ls-breadcrumb--arrowed .ls-breadcrumb-item:first-child{margin-left:0;padding-left:.75rem;clip-path:polygon(calc(100% - 12px) 0%,100% 50%,calc(100% - 12px) 100%,0% 100%,0% 0%);border-radius:4px 0 0 4px}.ls-breadcrumb--arrowed .ls-breadcrumb-item:last-child{padding-right:1.25rem;clip-path:polygon(100% 0%,100% 100%,0% 100%,12px 50%,0% 0%);border-radius:0 4px 4px 0}.ls-breadcrumb--arrowed .ls-breadcrumb-item--active{background:var(--ls-breadcrumb-main-color)!important;color:#fff!important;z-index:10!important}.ls-breadcrumb--arrowed .ls-breadcrumb-item:nth-child(1){z-index:5}.ls-breadcrumb--arrowed .ls-breadcrumb-item:nth-child(2){z-index:4}.ls-breadcrumb--arrowed .ls-breadcrumb-item:nth-child(3){z-index:3}body.dark .ls-breadcrumb-item{color:#bfc9d4}body.dark .ls-breadcrumb--default .ls-breadcrumb-item--active,body.dark .ls-breadcrumb--dotted .ls-breadcrumb-item--active{color:#fff!important}body.dark .ls-breadcrumb--arrowed .ls-breadcrumb-item:not(.ls-breadcrumb-item--active){background:#1b2e4b!important;color:#e0e6ed!important}body.dark .ls-breadcrumb-separator{color:#3b3f5c}\n"] }]
466
+ }], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: true }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], separator: [{ type: i0.Input, args: [{ isSignal: true, alias: "separator", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }] } });
467
+
468
+ /**
469
+ * Generated bundle index. Do not edit.
470
+ */
471
+
472
+ export { BreadcrumbComponent, PaginationComponent };
473
+ //# sourceMappingURL=lumston-ds-angular-src-navigation.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lumston-ds-angular-src-navigation.mjs","sources":["../../../../libs/ds-angular/src/navigation/pagination/pagination.component.ts","../../../../libs/ds-angular/src/navigation/breadcrumb/breadcrumb.component.ts","../../../../libs/ds-angular/src/navigation/lumston-ds-angular-src-navigation.ts"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n OnInit,\r\n computed,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\n\r\n/** Controls the visual rendering style of page number items and nav buttons. */\r\nexport type PaginationVariant = 'text' | 'outlined' | 'solid';\r\n\r\n/**\r\n * Applies the design-token color to the active page item and hover states.\r\n *\r\n * - `'primary'` — Brand primary color.\r\n * - `'secondary'` — Brand secondary color.\r\n * - `'default'` — Neutral gray, no brand color applied.\r\n */\r\nexport type PaginationColor = 'primary' | 'secondary' | 'default';\r\n\r\n/** Determines the border-radius style applied uniformly to all page buttons. */\r\nexport type PaginationShape = 'circular' | 'rounded';\r\n\r\n/**\r\n * Controls the physical dimensions (height, font size, padding) of all\r\n * buttons in the pagination bar.\r\n */\r\nexport type PaginationSize = 'small' | 'medium' | 'large';\r\n\r\n/**\r\n * Renders an accessible pagination bar for navigating a paged data set.\r\n *\r\n * Supports both **controlled** and **uncontrolled** modes:\r\n * - **Controlled**: provide the `page` input and update it in response to\r\n * the `pageChange` output. The component reflects the external value.\r\n * - **Uncontrolled**: omit `page`. The component manages its own active\r\n * page via an internal signal, initialized from `defaultPage`.\r\n *\r\n * When the total page count exceeds 5, a 5-item sliding window is rendered\r\n * centered on the active page. Navigation buttons are rendered inside a\r\n * `<nav aria-label=\"pagination\">` landmark. Each button receives\r\n * `aria-current=\"page\"` (active) or `aria-disabled=\"true\"` (boundary/disabled)\r\n * as appropriate.\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Uncontrolled -->\r\n * <ls-pagination [count]=\"20\" (pageChange)=\"onPage($event)\" />\r\n *\r\n * <!-- Controlled -->\r\n * <ls-pagination\r\n * [count]=\"20\"\r\n * [page]=\"currentPage\"\r\n * (pageChange)=\"currentPage = $event\" />\r\n * ```\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [],\r\n selector: 'ls-pagination',\r\n standalone: true,\r\n styleUrls: ['./pagination.component.css'],\r\n template: `\r\n <nav aria-label=\"pagination\">\r\n <ul class=\"pg-list\">\r\n @if (showFirstButton()) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n aria-label=\"first\"\r\n [class]=\"navClasses(isFirstPage())\"\r\n [disabled]=\"isFirstPage() || disabled()\"\r\n [attr.aria-disabled]=\"isFirstPage() || disabled() ? 'true' : null\"\r\n (click)=\"goToPage(1)\">\r\n <i class=\"ls-icon ls-chevron-left-double ls-icon-sm\"></i>\r\n </button>\r\n </li>\r\n }\r\n @if (!hidePrevButton()) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n aria-label=\"prev\"\r\n [class]=\"navClasses(isFirstPage())\"\r\n [disabled]=\"isFirstPage() || disabled()\"\r\n [attr.aria-disabled]=\"isFirstPage() || disabled() ? 'true' : null\"\r\n (click)=\"goToPage(activePage() - 1)\">\r\n <i class=\"ls-icon ls-chevron-left ls-icon-sm\"></i>\r\n </button>\r\n </li>\r\n }\r\n @for (n of pages(); track $index) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n [class]=\"pageItemClasses(n)\"\r\n [attr.aria-current]=\"n === activePage() ? 'page' : null\"\r\n [disabled]=\"disabled()\"\r\n [attr.aria-disabled]=\"disabled() ? 'true' : null\"\r\n (click)=\"goToPage(n)\">\r\n {{ n }}\r\n </button>\r\n </li>\r\n }\r\n @if (!hideNextButton()) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n aria-label=\"next\"\r\n [class]=\"navClasses(isLastPage())\"\r\n [disabled]=\"isLastPage() || disabled()\"\r\n [attr.aria-disabled]=\"isLastPage() || disabled() ? 'true' : null\"\r\n (click)=\"goToPage(activePage() + 1)\">\r\n <i class=\"ls-icon ls-chevron-right ls-icon-sm\"></i>\r\n </button>\r\n </li>\r\n }\r\n @if (showLastButton()) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n aria-label=\"last\"\r\n [class]=\"navClasses(isLastPage())\"\r\n [disabled]=\"isLastPage() || disabled()\"\r\n [attr.aria-disabled]=\"isLastPage() || disabled() ? 'true' : null\"\r\n (click)=\"goToPage(count())\">\r\n <i class=\"ls-icon ls-chevron-right-double ls-icon-sm\"></i>\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n </nav>\r\n `,\r\n})\r\nexport class PaginationComponent implements OnInit {\r\n /**\r\n * Total number of pages in the data set.\r\n *\r\n * Must be a positive integer ≥ 1. Determines both the upper boundary for\r\n * navigation and the page window calculation.\r\n *\r\n * @default 1\r\n */\r\n readonly count = input<number>(1);\r\n\r\n /**\r\n * Active page index in controlled mode (1-based).\r\n *\r\n * When provided, the component reflects this value and does not maintain\r\n * internal page state. The host is responsible for updating this input in\r\n * response to `pageChange` emissions. Pass `undefined` to switch to\r\n * uncontrolled mode.\r\n *\r\n * @default undefined\r\n */\r\n readonly page = input<number | undefined>(undefined);\r\n\r\n /**\r\n * Initial active page used in uncontrolled mode (1-based).\r\n *\r\n * Consumed once on `ngOnInit`. Has no effect when `page` is provided.\r\n *\r\n * @default 1\r\n */\r\n readonly defaultPage = input<number>(1);\r\n\r\n /**\r\n * Color token applied to the active page item and button hover states.\r\n *\r\n * @default 'primary'\r\n */\r\n readonly color = input<PaginationColor>('primary');\r\n\r\n /**\r\n * Visual rendering style of page number items and navigation buttons.\r\n *\r\n * @default 'outlined'\r\n */\r\n readonly variant = input<PaginationVariant>('outlined');\r\n\r\n /**\r\n * Border-radius style applied uniformly to all buttons in the bar.\r\n *\r\n * @default 'rounded'\r\n */\r\n readonly shape = input<PaginationShape>('rounded');\r\n\r\n /**\r\n * Physical dimensions (height, font size, padding) of all buttons.\r\n *\r\n * @default 'medium'\r\n */\r\n readonly size = input<PaginationSize>('medium');\r\n\r\n /**\r\n * Disables all buttons in the pagination bar.\r\n *\r\n * When `true`, every button receives `disabled` and\r\n * `aria-disabled=\"true\"`. The `pageChange` output will not emit.\r\n *\r\n * @default false\r\n */\r\n readonly disabled = input<boolean>(false);\r\n\r\n /**\r\n * Renders a \"go to first page\" button before the previous-page button.\r\n *\r\n * The button is automatically disabled and receives `aria-disabled=\"true\"`\r\n * when the active page is already the first page.\r\n *\r\n * @default false\r\n */\r\n readonly showFirstButton = input<boolean>(false);\r\n\r\n /**\r\n * Renders a \"go to last page\" button after the next-page button.\r\n *\r\n * The button is automatically disabled and receives `aria-disabled=\"true\"`\r\n * when the active page is already the last page.\r\n *\r\n * @default false\r\n */\r\n readonly showLastButton = input<boolean>(false);\r\n\r\n /**\r\n * Hides the previous-page navigation button.\r\n *\r\n * @default false\r\n */\r\n readonly hidePrevButton = input<boolean>(false);\r\n\r\n /**\r\n * Hides the next-page navigation button.\r\n *\r\n * @default false\r\n */\r\n readonly hideNextButton = input<boolean>(false);\r\n\r\n /**\r\n * Emits the target page number (1-based) when the user activates any\r\n * page item or navigation button.\r\n *\r\n * Does NOT emit when `disabled` is `true` or when the user clicks a\r\n * boundary button that is already at its limit (first/last page).\r\n * In controlled mode, the host must update the `page` input in response\r\n * to this event to reflect the navigation in the UI.\r\n */\r\n readonly pageChange = output<number>();\r\n\r\n private readonly _internalPage = signal<number>(1);\r\n\r\n protected readonly activePage = computed(\r\n () => this.page() ?? this._internalPage()\r\n );\r\n protected readonly pages = computed(() => {\r\n const total = this.count();\r\n const current = this.activePage();\r\n if (total <= 5) {\r\n return Array.from({ length: total }, (_, i) => i + 1);\r\n }\r\n const start = Math.max(1, Math.min(current - 2, total - 4));\r\n return Array.from({ length: 5 }, (_, i) => start + i);\r\n });\r\n protected readonly isFirstPage = computed(() => this.activePage() === 1);\r\n protected readonly isLastPage = computed(\r\n () => this.activePage() === this.count()\r\n );\r\n\r\n private readonly _baseClasses = computed(() => {\r\n const size = this.size();\r\n const sizeClass =\r\n size === 'small'\r\n ? 'pg-item-sm'\r\n : size === 'large'\r\n ? 'pg-item-lg'\r\n : 'pg-item-md';\r\n const shapeClass =\r\n this.shape() === 'circular' ? 'pg-item-circular' : 'pg-item-rounded';\r\n return [\r\n 'pg-item',\r\n `pg-item-${this.variant()}-${this.color()}`,\r\n sizeClass,\r\n shapeClass,\r\n ].join(' ');\r\n });\r\n\r\n ngOnInit(): void {\r\n this._internalPage.set(this.defaultPage());\r\n }\r\n\r\n protected pageItemClasses(n: number): string {\r\n const base = this._baseClasses();\r\n return n === this.activePage() ? `${base} pg-item-active` : base;\r\n }\r\n\r\n protected navClasses(isAtBoundary: boolean): string {\r\n const classes = `${this._baseClasses()} pg-nav-btn`;\r\n return isAtBoundary || this.disabled()\r\n ? `${classes} pg-item-disabled`\r\n : classes;\r\n }\r\n\r\n protected goToPage(n: number): void {\r\n if (this.disabled() || n < 1 || n > this.count()) return;\r\n if (this.page() === undefined) {\r\n this._internalPage.set(n);\r\n }\r\n this.pageChange.emit(n);\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n input,\r\n TemplateRef,\r\n} from '@angular/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\n\r\nexport interface BreadcrumbItem {\r\n label: string;\r\n url?: string;\r\n icon?: string;\r\n}\r\n\r\nexport type BreadcrumbVariant = 'default' | 'arrowed' | 'dotted';\r\n\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [NgTemplateOutlet],\r\n selector: 'ls-breadcrumb',\r\n standalone: true,\r\n styleUrls: ['./breadcrumb.component.css'],\r\n template: `\r\n <nav aria-label=\"Breadcrumb\" [style]=\"_colorStyle()\">\r\n <ol [class]=\"_classes()\">\r\n @for (item of items(); track item.label; let isLast = $last) {\r\n <li\r\n class=\"ls-breadcrumb-item\"\r\n [class.ls-breadcrumb-item--active]=\"isLast\">\r\n @if (isLast) {\r\n <span aria-current=\"page\">\r\n @if (item.icon) {\r\n <i\r\n [class]=\"\r\n 'ls-icon ls-' + item.icon + ' ls-breadcrumb-icon'\r\n \"></i>\r\n }\r\n {{ item.label }}\r\n </span>\r\n } @else if (item.url) {\r\n <a [href]=\"item.url\">\r\n @if (item.icon) {\r\n <i\r\n [class]=\"\r\n 'ls-icon ls-' + item.icon + ' ls-breadcrumb-icon'\r\n \"></i>\r\n }\r\n {{ item.label }}\r\n </a>\r\n } @else {\r\n <span>\r\n @if (item.icon) {\r\n <i\r\n [class]=\"\r\n 'ls-icon ls-' + item.icon + ' ls-breadcrumb-icon'\r\n \"></i>\r\n }\r\n {{ item.label }}\r\n </span>\r\n }\r\n </li>\r\n\r\n @if (!isLast && variant() !== 'arrowed') {\r\n <li class=\"ls-breadcrumb-separator\" aria-hidden=\"true\">\r\n @if (_isTemplateSeparator()) {\r\n <ng-container *ngTemplateOutlet=\"$any(separator())\" />\r\n } @else {\r\n {{ separator() }}\r\n }\r\n </li>\r\n }\r\n }\r\n </ol>\r\n </nav>\r\n `,\r\n})\r\nexport class BreadcrumbComponent {\r\n readonly items = input.required<BreadcrumbItem[]>();\r\n readonly variant = input<BreadcrumbVariant>('default');\r\n readonly separator = input<string | TemplateRef<unknown>>('/');\r\n readonly color = input<string>('gray'); // El nuevo input de color\r\n\r\n // Lógica para el color dinámico\r\n protected readonly _colorStyle = computed(() => {\r\n const c = this.color();\r\n const value =\r\n c === 'primary'\r\n ? 'var(--ls-color-primary)'\r\n : c === 'secondary'\r\n ? 'var(--ls-color-secondary)'\r\n : c;\r\n return { '--ls-breadcrumb-main-color': value };\r\n });\r\n\r\n protected readonly _classes = computed(() => {\r\n return `ls-breadcrumb ls-breadcrumb--${this.variant()}`;\r\n });\r\n\r\n protected readonly _isTemplateSeparator = computed(() => {\r\n return this.separator() instanceof TemplateRef;\r\n });\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}