-
{symbol.region}
-
- Lv.
{level}
-
/ {symbol.max_level}
+
{symbol.region}
+
+ Lv.{level}
+ / {symbol.max_level}
{equipped && !isMax && !effectivelyMax && (
@@ -206,11 +222,16 @@ function SymbolCard({ symbol, equipped, charId }) {
type="button"
onClick={() => patch({ dailyDone: !dailyDone })}
title="오늘 일퀘 완료 여부"
- className={`shrink-0 rounded-md h-8 px-3 text-xs font-semibold border transition disabled:opacity-40 disabled:cursor-not-allowed ${
- dailyDone
- ? 'bg-emerald-500/20 border-emerald-500/50 text-emerald-300'
- : 'bg-red-500/10 border-red-500/40 text-red-300 hover:bg-red-500/20'
- }`}
+ className="shrink-0 rounded-md h-8 px-3 text-xs font-semibold border disabled:opacity-40 disabled:cursor-not-allowed"
+ style={dailyDone ? {
+ background: 'var(--selected-bg)',
+ borderColor: 'var(--selected-border)',
+ color: 'var(--accent-bright)',
+ } : {
+ background: 'var(--danger-bg-hover)',
+ borderColor: 'var(--icon-danger-border)',
+ color: 'var(--danger-text)',
+ }}
>
{dailyDone ? '금일 일퀘 완료' : '금일 일퀘 미완료'}
@@ -221,36 +242,42 @@ function SymbolCard({ symbol, equipped, charId }) {
{isMax ? (
-
- 성장치 MAX
+
+ 성장치 MAX
) : effectivelyMax ? (
-
- 성장치 {growth} (MAX) / {requireGrowth}
+
+ 성장치 {growth} (MAX) / {requireGrowth}
) : reachableLevel > level ? (
-
+
성장치 {growth} / {requireGrowth}
) : (
-
+
성장치 {growth} / {requireGrowth}
)}
{!isMax && !effectivelyMax && (
-
+
{requireGrowth ? Math.min(Math.floor((growth / requireGrowth) * 100), 100) : 0}%
)}
-
@@ -261,19 +288,24 @@ function SymbolCard({ symbol, equipped, charId }) {
style={{ gridTemplateColumns: symbol.weekly_default > 0 ? '0.7fr 1.3fr 1fr' : '1fr 1fr' }}
>
-
+
patch({ daily: Number(e.target.value.replace(/[^\d]/g, '')) || 0 })}
disabled={!interactable}
- className="w-full h-10 rounded-md border border-white/10 bg-gray-950 px-3 text-base text-right tabular-nums outline-none focus:border-emerald-500/50 hover:border-white/20 disabled:opacity-50 transition"
+ className={inputClass}
+ style={{
+ background: 'var(--input-bg)',
+ borderColor: 'var(--input-border)',
+ color: 'var(--text-strong)',
+ }}
/>
{symbol.weekly_default > 0 && (
-
+
)}
-
+
patch({ extra: Number(e.target.value.replace(/[^\d]/g, '')) || 0 })}
disabled={!interactable}
- className="w-full h-10 rounded-md border border-white/10 bg-gray-950 px-3 text-base text-right tabular-nums outline-none focus:border-emerald-500/50 hover:border-white/20 disabled:opacity-50 transition"
+ className={inputClass}
+ style={{
+ background: 'var(--input-bg)',
+ borderColor: 'var(--input-border)',
+ color: 'var(--text-strong)',
+ }}
/>
{/* 정보 */}
-
-
- 남은 심볼
-
- {equipped && !isMax && !effectivelyMax ? `${remainingSymbols.toLocaleString()}개` : '-'}
-
-
-
-
필요 메소
- {equipped && !isMax ? (
-
-
- {remainingMeso.toLocaleString()}
+
+ {[
+ { label: '남은 심볼', value: equipped && !isMax && !effectivelyMax ? `${remainingSymbols.toLocaleString()}개` : '-', color: 'var(--text-emphasis)' },
+ { label: '필요 메소', value: equipped && !isMax ? remainingMeso.toLocaleString() : '-', color: 'var(--warning-text-bright)', tooltip: equipped && !isMax ? formatMesoKorean(remainingMeso) : null },
+ { label: '체납 메소', value: equipped && !isMax ? arrearMeso.toLocaleString() : '-', color: 'var(--danger-text)', tooltip: equipped && !isMax ? formatMesoKorean(arrearMeso) : null },
+ { label: '남은 일수', value: equipped && !isMax && !effectivelyMax && daysLeft != null ? `${daysLeft.toLocaleString()}일` : '-', color: 'var(--text-emphasis)' },
+ { label: '예상 완료일', value: equipped && !isMax && !effectivelyMax && completeDate ? formatKoreanDate(completeDate) : '-', color: equipped && !isMax && !effectivelyMax && completeDate ? 'var(--accent-bright)' : 'var(--text-dim)', strong: true },
+ ].map((row, i) => (
+
+ {row.label}
+ {row.tooltip ? (
+
+
+ {row.value}
+
+
+ ) : (
+
+ {row.value}
-
- ) : (
- -
- )}
-
-
- 체납 메소
- {equipped && !isMax ? (
-
-
- {arrearMeso.toLocaleString()}
-
-
- ) : (
- -
- )}
-
-
- 남은 일수
-
- {equipped && !isMax && !effectivelyMax && daysLeft != null ? `${daysLeft.toLocaleString()}일` : '-'}
-
-
-
- 예상 완료일
-
- {equipped && !isMax && !effectivelyMax && completeDate ? formatKoreanDate(completeDate) : '-'}
-
-
+ )}
+
+ ))}
)
@@ -383,7 +404,7 @@ export default function Symbol() {
const tab = storedTab || tabs[0]?.key || null
const setTab = (t) => { if (selectedCharId) setTabStore(selectedCharId, t) }
-
+
// 각 캐릭터 기본정보(코디 이미지) 새로고침
const basicQueries = useQueries({
queries: characters.map((c) => ({
@@ -526,10 +547,20 @@ export default function Symbol() {
return (
{/* 캐릭터 조회 */}
-
+
- {addError &&
{addError}
}
+ {addError && (
+
{addError}
+ )}
{/* 캐릭터 목록 */}
{characters.length > 0 && (
@@ -571,25 +614,34 @@ export default function Symbol() {
{/* 심볼 타입 탭 */}
- {tabs.map((t) => (
-
- ))}
+ {tabs.map((t) => {
+ const active = tab === t.key
+ return (
+
+ )
+ })}
{/* 심볼 카드 그리드 */}
@@ -600,27 +652,45 @@ export default function Symbol() {
{/* 전체 요약 */}
-
+
-
{tabInfo?.label} 전체 만렙 완료 예상일
-
+
+ {tabInfo?.label} 전체 만렙 완료 예상일
+
+
{overallDate ? formatKoreanDate(overallDate) : '-'}
-
누적 체납 메소
+
누적 체납 메소
-
+
{totalArrearMeso.toLocaleString()}
-
+
-
남은 필요 메소
+
남은 필요 메소
-
+
{totalRequiredMeso.toLocaleString()}