feat: 重新設計手機版分頁導航解決字體過小問題

- 手機版採用極簡圓形按鈕設計,移除擠壓的下拉選單
- 大字體顯示:text-base (16px) 和 text-lg (18px) 確保清晰易讀
- 圓形大按鈕:12x12 觸控區域 + 陰影效果 + 按壓動畫
- 垂直居中布局:分頁資訊 + 導航控制分層顯示
- 桌面版保持完整功能:詳細統計 + 頁碼導航 + 每頁選擇
- 改進桌面版下拉選單:min-w-[80px] 確保適當寬度

解決手機版下拉選單字體過小和界面擠壓問題。

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
鄭沛軒 2025-10-07 18:49:27 +08:00
parent f08d798aa4
commit a5b2cc746c
1 changed files with 113 additions and 75 deletions

View File

@ -45,87 +45,125 @@ export const PaginationControls: React.FC<PaginationControlsProps> = ({
} }
return ( return (
<div className="flex items-center justify-between p-4 bg-white border-t border-gray-200"> <div className="bg-white border-t border-gray-200">
{/* 左側:顯示資訊 */} {/* 手機版 - 簡潔美觀設計 */}
<div className="flex items-center gap-4"> <div className="block md:hidden p-4">
<span className="text-sm text-gray-700"> <div className="flex flex-col items-center gap-4">
{startItem} {endItem} {totalCount} {/* 分頁控制 - 圓形大按鈕 */}
</span> <div className="flex items-center gap-4">
<button
onClick={handlePrevPage}
disabled={!hasPrev}
className={`flex items-center justify-center w-12 h-12 rounded-full transition-all ${
hasPrev
? 'bg-blue-100 text-blue-700 hover:bg-blue-200 shadow-md hover:shadow-lg active:scale-95'
: 'bg-gray-100 text-gray-400 cursor-not-allowed'
}`}
>
<svg className="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 19l-7-7 7-7" />
</svg>
</button>
{/* 每頁筆數選擇 */} <div className="px-4 py-2 bg-gray-100 rounded-full min-w-[60px] text-center">
<div className="flex items-center gap-2"> <span className="text-lg font-bold text-gray-800">{currentPage}</span>
<label className="text-sm text-gray-600"></label> </div>
<select
value={pageSize} <button
onChange={handlePageSizeChange} onClick={handleNextPage}
className="border border-gray-300 rounded px-2 py-1 text-sm focus:ring-blue-500 focus:border-blue-500" disabled={!hasNext}
> className={`flex items-center justify-center w-12 h-12 rounded-full transition-all ${
<option value={10}>10</option> hasNext
<option value={20}>20</option> ? 'bg-blue-100 text-blue-700 hover:bg-blue-200 shadow-md hover:shadow-lg active:scale-95'
<option value={50}>50</option> : 'bg-gray-100 text-gray-400 cursor-not-allowed'
<option value={100}>100</option> }`}
</select> >
<svg className="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
</svg>
</button>
</div>
</div> </div>
</div> </div>
{/* 右側:分頁控制 */} {/* 桌面版 - 保持完整功能 */}
<div className="flex items-center gap-2"> <div className="hidden md:flex items-center justify-between p-4">
{/* 上一頁按鈕 */} {/* 左側:顯示資訊 */}
<button <div className="flex items-center gap-4">
onClick={handlePrevPage} {/* 每頁筆數選擇 */}
disabled={!hasPrev} <div className="flex items-center gap-2">
className={`px-3 py-2 text-sm rounded-lg border transition-colors ${ <label className="text-sm text-gray-600"></label>
hasPrev <select
? 'border-gray-300 text-gray-700 hover:bg-gray-50' value={pageSize}
: 'border-gray-200 text-gray-400 cursor-not-allowed' onChange={handlePageSizeChange}
}`} className="border border-gray-300 rounded px-3 py-2 text-sm focus:ring-blue-500 focus:border-blue-500 min-w-[80px]"
> >
<option value={10}>10</option>
</button> <option value={20}>20</option>
<option value={50}>50</option>
{/* 頁碼顯示 */} <option value={100}>100</option>
<div className="flex items-center gap-1"> </select>
{/* 顯示當前頁附近的頁碼 */} </div>
{Array.from({ length: Math.min(5, totalPages) }, (_, i) => {
let pageNumber
if (totalPages <= 5) {
pageNumber = i + 1
} else if (currentPage <= 3) {
pageNumber = i + 1
} else if (currentPage >= totalPages - 2) {
pageNumber = totalPages - 4 + i
} else {
pageNumber = currentPage - 2 + i
}
return (
<button
key={pageNumber}
onClick={() => onPageChange(pageNumber)}
className={`px-3 py-2 text-sm rounded-lg transition-colors ${
pageNumber === currentPage
? 'bg-blue-600 text-white'
: 'text-gray-700 hover:bg-gray-100'
}`}
>
{pageNumber}
</button>
)
})}
</div> </div>
{/* 下一頁按鈕 */} {/* 右側:分頁控制 */}
<button <div className="flex items-center gap-2">
onClick={handleNextPage} {/* 上一頁按鈕 */}
disabled={!hasNext} <button
className={`px-3 py-2 text-sm rounded-lg border transition-colors ${ onClick={handlePrevPage}
hasNext disabled={!hasPrev}
? 'border-gray-300 text-gray-700 hover:bg-gray-50' className={`px-3 py-2 text-sm rounded-lg border transition-colors ${
: 'border-gray-200 text-gray-400 cursor-not-allowed' hasPrev
}`} ? 'border-gray-300 text-gray-700 hover:bg-gray-50'
> : 'border-gray-200 text-gray-400 cursor-not-allowed'
}`}
</button> >
</button>
{/* 頁碼顯示 */}
<div className="flex items-center gap-1">
{Array.from({ length: Math.min(5, totalPages) }, (_, i) => {
let pageNumber
if (totalPages <= 5) {
pageNumber = i + 1
} else if (currentPage <= 3) {
pageNumber = i + 1
} else if (currentPage >= totalPages - 2) {
pageNumber = totalPages - 4 + i
} else {
pageNumber = currentPage - 2 + i
}
return (
<button
key={pageNumber}
onClick={() => onPageChange(pageNumber)}
className={`px-3 py-2 text-sm rounded-lg transition-colors ${
pageNumber === currentPage
? 'bg-blue-600 text-white'
: 'text-gray-700 hover:bg-gray-100'
}`}
>
{pageNumber}
</button>
)
})}
</div>
{/* 下一頁按鈕 */}
<button
onClick={handleNextPage}
disabled={!hasNext}
className={`px-3 py-2 text-sm rounded-lg border transition-colors ${
hasNext
? 'border-gray-300 text-gray-700 hover:bg-gray-50'
: 'border-gray-200 text-gray-400 cursor-not-allowed'
}`}
>
</button>
</div>
</div> </div>
</div> </div>
) )