{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "paginate",
  "type": "registry:lib",
  "files": [
    {
      "path": "src/registry/lib/paginate.ts",
      "content": "interface PaginateProps {\n  currentPage: number;\n  totalPages: number;\n  siblings?: number;\n}\n\nconst range = (start: number, end: number) => {\n  return Array.from({ length: end - start }, (_, i) => i + start);\n};\n\nconst between = (num: number, min: number, max: number) => {\n  return Math.max(min, Math.min(num, max));\n};\n\nexport const paginate = ({\n  currentPage,\n  totalPages,\n  siblings = 2,\n}: PaginateProps) => {\n  const page = between(currentPage, 1, totalPages);\n  const max = totalPages - 1;\n\n  const left = between(\n    page - siblings,\n    2,\n    Math.min(max - siblings * 2 - 1, max),\n  );\n  const right = between(\n    page + siblings,\n    Math.min(2 + siblings * 2 + 1, max),\n    max,\n  );\n\n  const hasLeftEllipsis = left - 1 > 2;\n  const hasRightEllipsis = totalPages - right > 2;\n\n  const middle = range(\n    left - 1 === 2 ? left - 1 : left,\n    totalPages - right === 2 ? right + 2 : right + 1,\n  );\n\n  const items = [\n    { type: \"item\", value: 1 },\n    ...(hasLeftEllipsis\n      ? [\n          {\n            type: \"ellipsis\",\n            value: between(page - siblings * 2 - 1, 1, totalPages),\n          },\n        ]\n      : []),\n    ...middle.map((n) => ({ type: \"item\", value: n })),\n    ...(hasRightEllipsis\n      ? [\n          {\n            type: \"ellipsis\",\n            value: between(page + siblings * 2 + 1, 1, totalPages),\n          },\n        ]\n      : []),\n    ...(totalPages >= 2 ? [{ type: \"item\", value: totalPages }] : []),\n  ];\n\n  return {\n    prev: page > 1 ? page - 1 : null,\n    next: page < totalPages ? page + 1 : null,\n    current: page,\n    items,\n  };\n};\n\nexport type PaginateReturn = ReturnType<typeof paginate>;\n",
      "type": "registry:lib",
      "target": "lib/paginate.ts"
    }
  ]
}