CHORE(merge): merge from develop
Some checks failed
Build Docker Image / build-and-push (push) Has been cancelled
CI / lint-and-build (push) Has been cancelled

- Initial setup and all features from develop branch
- Includes: auth, deploy, docker, style fixes
- K3S deployment configuration
This commit is contained in:
2026-01-06 17:29:16 +09:00
parent b4ce36ba3b
commit f78454c2a1
159 changed files with 18365 additions and 774 deletions

View File

@@ -0,0 +1,87 @@
interface PaginationProps {
currentPage: number;
totalPages: number;
onPageChange: (page: number) => void;
}
export default function Pagination({
currentPage,
totalPages,
onPageChange,
}: PaginationProps) {
if (totalPages <= 1) return null;
const getPageNumbers = () => {
const pages: (number | string)[] = [];
const maxVisible = 5;
if (totalPages <= maxVisible) {
for (let i = 1; i <= totalPages; i++) pages.push(i);
} else {
if (currentPage <= 3) {
for (let i = 1; i <= 4; i++) pages.push(i);
pages.push('...');
pages.push(totalPages);
} else if (currentPage >= totalPages - 2) {
pages.push(1);
pages.push('...');
for (let i = totalPages - 3; i <= totalPages; i++) pages.push(i);
} else {
pages.push(1);
pages.push('...');
for (let i = currentPage - 1; i <= currentPage + 1; i++) pages.push(i);
pages.push('...');
pages.push(totalPages);
}
}
return pages;
};
return (
<div className="flex justify-center items-center gap-2 mt-8">
<button
onClick={() => onPageChange(currentPage - 1)}
disabled={currentPage === 1}
className={`px-3 py-2 rounded-lg border transition-colors disabled:opacity-50 disabled:cursor-not-allowed ${
currentPage === 1
? 'border-gray-300 text-gray-400'
: 'border-[#94b7d6] text-[#6d96c5] hover:bg-[#a9c6e1]'
}`}
>
</button>
{getPageNumbers().map((page, idx) =>
typeof page === 'number' ? (
<button
key={idx}
onClick={() => onPageChange(page)}
className={`w-10 h-10 flex items-center justify-center rounded-lg transition-colors ${
currentPage === page
? 'bg-[#6d96c5] text-white'
: 'border border-[#94b7d6] text-[#6d96c5] hover:bg-[#a9c6e1]'
}`}
>
{page}
</button>
) : (
<span key={idx} className="px-2">
{page}
</span>
)
)}
<button
onClick={() => onPageChange(currentPage + 1)}
disabled={currentPage === totalPages}
className={`px-3 py-2 rounded-lg border transition-colors disabled:opacity-50 disabled:cursor-not-allowed ${
currentPage === totalPages
? 'border-gray-300 text-gray-400'
: 'border-[#94b7d6] text-[#6d96c5] hover:bg-[#a9c6e1]'
}`}
>
</button>
</div>
);
}