{"version":3,"file":"edsis-component-pagination.mjs","sources":["../../../library/component/pagination/pagination.component.ts","../../../library/component/pagination/edsis-component-pagination.ts"],"sourcesContent":["import { buttonVariants } from '@edsis/component/button';\nimport { Component, computed, input, model } from '@angular/core';\nimport { cn } from '@edsis/component/class';\n\n/**\n * Simple pagination. Emits the desired page via `(pageChange)` and reflects\n * the current page through the `page` model input while allowing lightweight\n * label and visibility tweaks for localized and icon-only demos.\n */\n@Component({\n  selector: 'Pagination, nav[Pagination]',\n  host: {\n    role: 'navigation',\n    'aria-label': 'pagination',\n    '[class]': 'classes()',\n  },\n  template: `\n    <ul class=\"flex flex-row items-center gap-1\">\n      <li>\n        <button\n          type=\"button\"\n          [disabled]=\"page() <= 1 || null\"\n          [attr.aria-label]=\"previousAriaLabel()\"\n          [class]=\"navClasses(previousText().length > 0)\"\n          (click)=\"go(page() - 1)\"\n        >\n          <svg\n            aria-hidden=\"true\"\n            class=\"h-4 w-4\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            stroke-width=\"2\"\n            stroke-linecap=\"round\"\n            stroke-linejoin=\"round\"\n          >\n            <polyline points=\"15 18 9 12 15 6\" />\n          </svg>\n          @if (previousText()) {\n            <span>{{ previousText() }}</span>\n          }\n        </button>\n      </li>\n\n      @for (p of pages(); track p.key) {\n        <li>\n          @if (p.kind === 'page') {\n            <button\n              type=\"button\"\n              [attr.aria-current]=\"p.value === page() ? 'page' : null\"\n              [class]=\"pageClasses(p.value === page())\"\n              (click)=\"go(p.value)\"\n            >\n              {{ formatPageLabel()(p.value) }}\n            </button>\n          } @else {\n            <span class=\"flex h-9 w-9 items-center justify-center\" aria-hidden=\"true\">…</span>\n          }\n        </li>\n      }\n\n      <li>\n        <button\n          type=\"button\"\n          [disabled]=\"page() >= total() || null\"\n          [attr.aria-label]=\"nextAriaLabel()\"\n          [class]=\"navClasses(nextText().length > 0)\"\n          (click)=\"go(page() + 1)\"\n        >\n          @if (nextText()) {\n            <span>{{ nextText() }}</span>\n          }\n          <svg\n            aria-hidden=\"true\"\n            class=\"h-4 w-4\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            stroke-width=\"2\"\n            stroke-linecap=\"round\"\n            stroke-linejoin=\"round\"\n          >\n            <polyline points=\"9 18 15 12 9 6\" />\n          </svg>\n        </button>\n      </li>\n    </ul>\n  `,\n})\nexport class PaginationComponent {\n  readonly page = model<number>(1);\n  readonly total = input<number>(1);\n  /** Number of sibling pages on each side of current. */\n  readonly siblingCount = input<number>(1);\n  readonly showPageNumbers = input<boolean>(true);\n  readonly previousText = input<string>('Previous');\n  readonly nextText = input<string>('Next');\n  readonly previousAriaLabel = input<string>('Go to previous page');\n  readonly nextAriaLabel = input<string>('Go to next page');\n  readonly formatPageLabel = input<(page: number) => string>((page) => page.toString());\n  readonly class = input<string>('');\n\n  protected readonly classes = computed(() =>\n    cn('mx-auto flex w-full justify-center', this.class()),\n  );\n\n  protected readonly pages = computed(() => {\n    if (!this.showPageNumbers()) {\n      return [];\n    }\n\n    const total = Math.max(1, this.total());\n    const current = Math.min(Math.max(1, this.page()), total);\n    const siblings = Math.max(0, this.siblingCount());\n    const range: Array<{ key: string; kind: 'page' | 'ellipsis'; value: number }> = [];\n    const start = Math.max(2, current - siblings);\n    const end = Math.min(total - 1, current + siblings);\n\n    range.push({ key: 'p-1', kind: 'page', value: 1 });\n    if (start > 2) range.push({ key: 'e-start', kind: 'ellipsis', value: -1 });\n    for (let i = start; i <= end; i++) range.push({ key: `p-${i}`, kind: 'page', value: i });\n    if (end < total - 1) range.push({ key: 'e-end', kind: 'ellipsis', value: -1 });\n    if (total > 1) range.push({ key: `p-${total}`, kind: 'page', value: total });\n    return range;\n  });\n\n  protected navClasses(hasText: boolean): string {\n    return hasText\n      ? cn(buttonVariants({ variant: 'ghost', size: 'default' }), 'gap-1 pl-2.5 pr-2.5')\n      : cn(buttonVariants({ variant: 'ghost', size: 'icon' }), 'h-9 w-9');\n  }\n\n  protected pageClasses(active: boolean): string {\n    return cn(buttonVariants({ variant: active ? 'outline' : 'ghost', size: 'icon' }), 'h-9 w-9');\n  }\n\n  protected go(target: number): void {\n    const total = Math.max(1, this.total());\n    const next = Math.min(Math.max(1, target), total);\n    if (next === this.page()) return;\n    this.page.set(next);\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}