```file:Pagination.tsx
import React from "react";

interface PaginationProps {
  currentPage: number; // 1-based
  totalPages: number; // >= 1
  onPageChange: (page: number) => void;
}

const Pagination: React.FC<PaginationProps> = ({
  currentPage,
  totalPages,
  onPageChange,
}: PaginationProps) => {
  const isFirstPage = currentPage <= 1;
  const isLastPage = currentPage >= totalPages;

  const handlePageClick = (page: number): void => {
    if (page < 1 || page > totalPages) {
      return;
    }
    if (page === currentPage) {
      return;
    }
    onPageChange(page);
  };

  const handlePrevious = (): void => {
    if (isFirstPage) {
      return;
    }
    handlePageClick(currentPage - 1);
  };

  const handleNext = (): void => {
    if (isLastPage) {
      return;
    }
    handlePageClick(currentPage + 1);
  };

  const pages: number[] = [];
  for (let i = 1; i <= totalPages; i += 1) {
    pages.push(i);
  }

  return (
    <nav aria-label="Pagination">
      <ul className="pagination">
        <li className="pagination-item">
          <button
            type="button"
            onClick={handlePrevious}
            disabled={isFirstPage}
            aria-label="Previous page"
          >
            Previous
          </button>
        </li>
        {pages.map((page: number) => {
          const isActive = page === currentPage;
          return (
            <li className="pagination-item" key={page}>
              <button
                type="button"
                onClick={(): void => handlePageClick(page)}
                aria-current={isActive ? "page" : undefined}
                className={isActive ? "active" : undefined}
              >
                {page}
              </button>
            </li>
          );
        })}
        <li className="pagination-item">
          <button
            type="button"
            onClick={handleNext}
            disabled={isLastPage}
            aria-label="Next page"
          >
            Next
          </button>
        </li>
      </ul>
    </nav>
  );
};

export type { PaginationProps };
export { Pagination };
export default Pagination;
```