diff --git a/src/pages/lotto/components/decision/PickCard.jsx b/src/pages/lotto/components/decision/PickCard.jsx new file mode 100644 index 0000000..430ddc4 --- /dev/null +++ b/src/pages/lotto/components/decision/PickCard.jsx @@ -0,0 +1,19 @@ +const ROLE_COLOR = { '안정': 'stable', '균형': 'balance', '공격': 'aggro' }; + +export default function PickCard({ pick, index, total }) { + const role = pick.risk_tag; + return ( +
+
+ ● {role} + Set {index + 1} / {total} +
+
+ {pick.numbers.map(n => ( + {n} + ))} +
+

{pick.reason}

+
+ ); +} diff --git a/src/pages/lotto/components/decision/RetrospectiveBox.jsx b/src/pages/lotto/components/decision/RetrospectiveBox.jsx new file mode 100644 index 0000000..ac7b6d9 --- /dev/null +++ b/src/pages/lotto/components/decision/RetrospectiveBox.jsx @@ -0,0 +1,11 @@ +export default function RetrospectiveBox({ briefing, review }) { + const retro = briefing?.narrative?.retrospective; + if (!retro) return null; + const drawNo = review?.draw_no ?? (briefing?.draw_no ? briefing.draw_no - 1 : null); + return ( + + ); +} diff --git a/src/pages/lotto/components/decision/TierModeToggle.jsx b/src/pages/lotto/components/decision/TierModeToggle.jsx new file mode 100644 index 0000000..33bb657 --- /dev/null +++ b/src/pages/lotto/components/decision/TierModeToggle.jsx @@ -0,0 +1,28 @@ +const MODES = [ + { key: 'core', label: '코어', sets: 5, amount: 5000 }, + { key: 'core_bonus', label: '+ 보너스', sets: 10, amount: 10000 }, + { key: 'core_bonus_extended', label: '+ 확장', sets: 15, amount: 15000 }, + { key: 'full', label: '+ 풀', sets: 20, amount: 20000 }, +]; + +export default function TierModeToggle({ value, onChange }) { + return ( +
+ {MODES.map((m, i) => ( + + ))} +
+ ); +} + +export { MODES }; diff --git a/src/pages/lotto/components/decision/TierSection.jsx b/src/pages/lotto/components/decision/TierSection.jsx new file mode 100644 index 0000000..67bc90f --- /dev/null +++ b/src/pages/lotto/components/decision/TierSection.jsx @@ -0,0 +1,25 @@ +import PickCard from './PickCard'; + +const TIER_TITLE = { + core: '코어 (필수, 5세트)', + bonus: '보너스 (+5)', + extended: '확장 (+5)', + pool: '풀 (+5)', +}; + +export default function TierSection({ tier, picks, rationale, indexBase = 0, totalSets }) { + if (!picks?.length) return null; + return ( +
+
+

{TIER_TITLE[tier]}

+ {rationale && tier !== 'core' && ( +

{rationale}

+ )} +
+ {picks.map((p, i) => ( + + ))} +
+ ); +} diff --git a/src/pages/lotto/components/decision/decision.css b/src/pages/lotto/components/decision/decision.css new file mode 100644 index 0000000..73eb4c0 --- /dev/null +++ b/src/pages/lotto/components/decision/decision.css @@ -0,0 +1,47 @@ +.lc-card { max-width: 720px; margin: 0 auto; background: linear-gradient(180deg, #161220 0%, #1a1426 100%); + border: 1px solid rgba(255,255,255,0.08); border-radius: 16px; padding: 24px; color: #ece6f7; } +.lc-head { display: flex; justify-content: space-between; align-items: flex-end; margin-bottom: 14px; } +.lc-eyebrow { font-size: 10px; letter-spacing: 2px; opacity: 0.5; text-transform: uppercase; margin: 0 0 4px; } +.lc-title { font-size: 22px; font-weight: 700; margin: 0; letter-spacing: -0.02em; } +.lc-conf { display: flex; flex-direction: column; align-items: flex-end; } +.lc-conf__num { font-family: 'Courier New', monospace; font-size: 28px; font-weight: 700; color: #b8a8ff; letter-spacing: -0.04em; } +.lc-conf__lbl { font-size: 9px; letter-spacing: 1.5px; opacity: 0.55; } +.lc-retro { background: rgba(184, 168, 255, 0.06); border-left: 2px solid rgba(184, 168, 255, 0.4); + padding: 10px 14px; margin: 14px 0; border-radius: 4px; } +.lc-retro__time { font-size: 9px; letter-spacing: 1.5px; color: #b8a8ff; opacity: 0.7; margin: 0 0 4px; } +.lc-retro__body { font-size: 13px; line-height: 1.55; opacity: 0.85; margin: 0; } +.lc-headline { font-size: 16px; font-weight: 600; line-height: 1.5; margin: 18px 0 4px; } +.lc-headline-3 { font-size: 12px; opacity: 0.65; line-height: 1.55; margin: 0 0 18px; } +.lc-balance { display: flex; justify-content: space-between; align-items: center; padding: 10px 14px; + background: rgba(255,255,255,0.03); border-radius: 8px; margin-bottom: 16px; font-size: 11px; } +.lc-balance__chips { display: flex; gap: 8px; } +.lc-chip { padding: 3px 8px; border-radius: 100px; font-weight: 600; font-size: 11px; } +.lc-chip--stable { background: rgba(80, 200, 120, 0.15); color: #76e09a; } +.lc-chip--balance { background: rgba(255, 200, 80, 0.15); color: #ffce6e; } +.lc-chip--aggro { background: rgba(255, 100, 130, 0.15); color: #ff8aa0; } +.lc-toggle { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; margin: 16px 0; } +.lc-toggle__chip { padding: 10px 8px; background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.08); + border-radius: 10px; color: #ece6f7; cursor: pointer; display: flex; flex-direction: column; gap: 4px; align-items: center; } +.lc-toggle__chip.is-active { background: rgba(184, 168, 255, 0.15); border-color: rgba(184, 168, 255, 0.5); } +.lc-toggle__dots { letter-spacing: 2px; font-size: 10px; opacity: 0.7; } +.lc-toggle__lbl { font-size: 12px; font-weight: 600; } +.lc-toggle__sub { font-size: 10px; opacity: 0.55; } +.lc-tier { margin-bottom: 14px; } +.lc-tier__head { padding: 8px 0; border-top: 1px dashed rgba(255,255,255,0.1); margin-bottom: 8px; } +.lc-tier:first-of-type .lc-tier__head { border-top: none; } +.lc-tier__head h4 { font-size: 12px; font-weight: 600; margin: 0 0 4px; opacity: 0.75; letter-spacing: 0.5px; } +.lc-tier__rationale { font-size: 11px; opacity: 0.55; margin: 0; } +.lc-set { background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.06); border-radius: 12px; + padding: 14px; margin-bottom: 10px; } +.lc-set__head { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; } +.lc-set__role { font-size: 11px; font-weight: 600; letter-spacing: 0.5px; } +.lc-set__role--stable { color: #76e09a; } +.lc-set__role--balance { color: #ffce6e; } +.lc-set__role--aggro { color: #ff8aa0; } +.lc-set__idx { font-size: 10px; opacity: 0.4; } +.lc-balls { display: flex; gap: 6px; margin-bottom: 8px; flex-wrap: wrap; } +.lc-set__reason { font-size: 12px; opacity: 0.7; line-height: 1.45; margin: 0; } +.lc-actions { display: flex; gap: 10px; margin-top: 18px; } +@media (max-width: 480px) { + .lc-toggle { grid-template-columns: repeat(2, 1fr); } +}