From f39155f2a7c8f439697b3ea20658df3d8670f5ed Mon Sep 17 00:00:00 2001 From: chu eun ju Date: Thu, 11 Dec 2025 11:48:08 +0900 Subject: [PATCH] =?UTF-8?q?=EB=8C=80=EC=8B=9C=EB=B3=B4=EB=93=9C=20?= =?UTF-8?q?=EB=AA=A8=EB=B0=94=EC=9D=BC=20=EB=B0=98=EC=9D=91=ED=98=95=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/app/dashboard/page.tsx | 102 ++++++++++++++++------------ 1 file changed, 58 insertions(+), 44 deletions(-) diff --git a/frontend/src/app/dashboard/page.tsx b/frontend/src/app/dashboard/page.tsx index cd9cc60..f335b8f 100644 --- a/frontend/src/app/dashboard/page.tsx +++ b/frontend/src/app/dashboard/page.tsx @@ -64,6 +64,15 @@ export default function DashboardPage() { const [stats, setStats] = useState(null) const [farmRanking, setFarmRanking] = useState(null) + // 모바일 감지 (반응형) + const [isMobile, setIsMobile] = useState(false) + useEffect(() => { + const checkMobile = () => setIsMobile(window.innerWidth < 640) + checkMobile() + window.addEventListener('resize', checkMobile) + return () => window.removeEventListener('resize', checkMobile) + }, []) + // 필터에서 고정된 첫 번째 형질 (없으면 '도체중') const firstPinnedTrait = filters.pinnedTraits?.[0] || '도체중' @@ -718,37 +727,37 @@ export default function DashboardPage() { {farmPositionData.label} 기준

{/* 모바일/웹 모두 3열 */} -
+
{/* 순위 카드 */} -
-

순위

-

- {farmPositionData.rank ?? '-'} +

+

순위

+

+ {farmPositionData.rank ?? '-'}

-

/{farmPositionData.totalFarms}개

+

/{farmPositionData.totalFarms} 농가

{/* 백분율 카드 */} -
-

상위

-

- {farmPositionData.percentile ?? '-'}% +

+

상위

+

+ {farmPositionData.percentile ?? '-'}%

보은군 내

{/* 점수 비교 카드 */} -
= 0 +
= 0 ? 'border-emerald-200 bg-emerald-50/30' : 'border-red-200 bg-red-50/30' }`}> -

평균대비

-

= 0 ? 'text-emerald-600' : 'text-red-500'}`}> +

평균대비

+

= 0 ? 'text-emerald-600' : 'text-red-500'}`}> {farmPositionData.farmScore > 0 ? '+' : ''}{farmPositionData.farmScore.toFixed(2)}

= 0 ? 'text-emerald-500' : 'text-red-400'}`}> {farmPositionData.farmScore >= 0 ? ( - <>높음 + <>높음 ) : ( - <>낮음 + <>낮음 )}

@@ -814,9 +823,14 @@ export default function DashboardPage() { 농가: d.hasData ? d.농가 : minBarValue, 보은군: d.hasData ? d.보은군 : minBarValue, })) + // 모바일/웹 차트 설정 + const labelFontSize = isMobile ? 12 : 16 + const barMaxSize = isMobile ? 50 : 70 // 막대 너비 설정 + const chartHeight = isMobile ? 300 : 350 // 막대 높이 설정 + const chartMarginBottom = isMobile ? 40 : 70 return ( - - + + { const item = chartData[index] - if (!item.hasData) return - + if (!item.hasData) return - const v = item.농가 // 양수: 막대 위에, 음수: 막대 바로 아래 - const labelY = height < 0 ? y + 18 : y - 14 - return {(v > 0 ? '+' : '') + v.toFixed(2)} + const labelY = height < 0 ? y + 20 : y - 14 + return {(v > 0 ? '+' : '') + v.toFixed(2)} }} > {chartData.map((entry, index) => ( @@ -859,14 +873,14 @@ export default function DashboardPage() { { const item = chartData[index] - if (!item.hasData) return - + if (!item.hasData) return - const v = item.보은군 // 양수: 막대 위에, 음수: 막대 바로 아래 - const labelY = height < 0 ? y + 18 : y - 14 - return {(v > 0 ? '+' : '') + v.toFixed(2)} + const labelY = height < 0 ? y + 20 : y - 14 + return {(v > 0 ? '+' : '') + v.toFixed(2)} }} > {chartData.map((entry, index) => ( @@ -918,41 +932,41 @@ export default function DashboardPage() { } return ( -
+
{/* 전년대비 */} -
= 0 ? 'border-blue-200 bg-blue-50/30' : 'border-red-200 bg-red-50/30') : 'border-slate-200 bg-slate-50/30'}`}> -

전년대비

+
= 0 ? 'border-blue-200 bg-blue-50/30' : 'border-red-200 bg-red-50/30') : 'border-slate-200 bg-slate-50/30'}`}> +

전년대비

{yearOverYear !== null ? ( -

= 0 ? 'text-[#1F3A8F]' : 'text-red-500'}`}> +

= 0 ? 'text-[#1F3A8F]' : 'text-red-500'}`}> {yearOverYear >= 0 ? '+' : ''}{yearOverYear.toFixed(2)} - {yearOverYear >= 0 ? : } + {yearOverYear >= 0 ? : }

) : ( -

-

+

-

)}
{/* 보은군대비 */} -
= 0 ? 'border-emerald-200 bg-emerald-50/30' : 'border-amber-200 bg-amber-50/30') : 'border-slate-200 bg-slate-50/30'}`}> -

보은군대비

+
= 0 ? 'border-emerald-200 bg-emerald-50/30' : 'border-amber-200 bg-amber-50/30') : 'border-slate-200 bg-slate-50/30'}`}> +

보은군대비

{vsRegion !== null ? ( -

= 0 ? 'text-emerald-600' : 'text-amber-600'}`}> +

= 0 ? 'text-emerald-600' : 'text-amber-600'}`}> {vsRegion >= 0 ? '+' : ''}{vsRegion.toFixed(2)}

) : ( -

-

+

-

)}
{/* 3년 추세 */} -
-

3년 추세

+
+

3년 추세

{trend !== null ? ( -

+

{trend} - {trend === '상승' && } - {trend === '하락' && } + {trend === '상승' && } + {trend === '하락' && }

) : ( -

-

+

-

)}
@@ -1151,7 +1165,7 @@ export default function DashboardPage() { {isPositive ? '+' : ''}{avgEpd.toFixed(2)} - + 상위 {avgPercentile}% @@ -1183,9 +1197,9 @@ export default function DashboardPage() { {isPositive ? '+' : ''}{avgEpd.toFixed(2)} - + 상위 - {avgPercentile}% + {avgPercentile}%
)