Files
ProjectSS/client/src/core/components/CouncilScreen.css
T
kyoung5seoandClaude Sonnet 5 20207ff23c 라운드 접수량 버그 수정 + 토큰→코인 용어 통일 + 외부 배포(NAS)
플레이 피드백 4건(주목도 미차감, 상점 빈 상품, 상점 UX 오해, 재화 명칭)을
검토해 방향이 확정된 항목만 반영하고, 외부 테스터에게 링크를 공유할 수 있게
시놀로지 NAS 배포까지 준비했다.

## 게임 로직

- 라운드 접수량 크리티컬 버그 수정: 합본을 반복하면 라운드가 안 끝나던 문제.
  deskCards에서 파생시키던 값을 순수 누적 카운터(roundIntake)로 교체 — 결정
  노트: 2026-09-18-라운드-접수량-누적카운터
- DeskBar/CoreSwipeCard 정보 역할 분리: "이번 라운드 접수량/한도"는 결재
  화면 전담, DeskBar는 책상에 쌓인 것(총 주목도·축별 분포)만 표시
- 토큰 → 코인 용어 일괄 변경: core/ 전체(식별자·CSS·주석·UI)와 기획서 SSOT
  동기화, lucide Coins 아이콘 추가

## 배포

- vite base를 상대 경로로 변경 (Web Station 서브패스 서빙 시 asset 404 방지)
- 모바일 100vh → 100dvh (주소창 노출 시 하단 버튼 가림 방지)
- 빌드 식별자 표시, 타이틀/테마색/description 정리
- deploy.sh + npm run deploy — SSH 키 권한 문제(777 → StrictModes 거부)와
  NAS rsync 게이트를 scp -O로 우회해 실제 배포까지 검증 완료
  → https://play.mint-grape.duckdns.org/projectss/

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-18 23:20:22 +09:00

336 lines
5.8 KiB
CSS

.council-screen {
flex: 1;
display: flex;
flex-direction: column;
gap: 16px;
padding: 20px;
max-width: 560px;
margin: 0 auto;
width: 100%;
overflow-y: auto;
font-family: var(--font-ui);
}
.council-screen h2 {
font-family: var(--font-doc-title);
margin: 0;
}
.council-screen h3 {
font-size: 13px;
margin: 0 0 8px;
opacity: 0.75;
font-family: var(--font-typewriter);
}
.council-audit {
background: var(--color-surface);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 8px;
padding: 14px;
}
.council-audit-row {
display: flex;
justify-content: space-between;
/* 규약 델타까지 붙으면 좁은 화면에서 오른쪽이 잘린다 — 줄바꿈을 허용한다. */
flex-wrap: wrap;
gap: 4px 10px;
font-family: var(--font-typewriter);
font-size: 14px;
font-weight: 700;
}
.audit-met { color: var(--color-coin); }
.audit-short { color: var(--color-risk-critical); }
.council-audit-breakdown {
font-size: 11px;
opacity: 0.6;
margin: 6px 0 12px;
}
.council-coin-pay {
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
font-family: var(--font-typewriter);
font-size: 12px;
background: rgba(255, 255, 255, 0.04);
padding: 6px 10px;
border-radius: 5px;
}
.council-coin-pay button {
background: rgba(255, 255, 255, 0.1);
border: none;
color: var(--color-text);
width: 22px;
height: 22px;
border-radius: 4px;
cursor: pointer;
}
.council-coin-pay button:disabled {
opacity: 0.3;
cursor: not-allowed;
}
.council-coin-committed {
min-width: 14px;
text-align: center;
color: var(--color-coin);
}
.council-coin-note {
opacity: 0.5;
font-size: 11px;
}
.council-penalties {
display: flex;
flex-direction: column;
gap: 6px;
}
.council-penalty-chip {
font-size: 12px;
padding: 6px 10px;
background: rgba(255, 68, 68, 0.08);
border: 1px solid rgba(255, 68, 68, 0.25);
border-radius: 5px;
color: var(--color-risk-critical);
}
.council-penalty-chip.targetable {
cursor: pointer;
outline: 1px dashed var(--color-risk-critical);
}
.council-penalty-more {
align-self: flex-start;
background: transparent;
border: none;
color: var(--color-text);
opacity: 0.6;
font-size: 11px;
font-family: var(--font-typewriter);
cursor: pointer;
padding: 2px 0;
text-decoration: underline;
}
.council-justifications {
display: flex;
flex-direction: column;
gap: 8px;
}
.council-empty {
font-size: 12px;
opacity: 0.5;
}
.council-justification-item {
display: flex;
align-items: center;
gap: 6px;
flex-wrap: wrap;
background: rgba(255, 255, 255, 0.03);
padding: 8px;
border-radius: 6px;
}
.justification-badge {
font-family: var(--font-typewriter);
font-size: 12px;
font-weight: 700;
padding: 2px 8px;
border-radius: 10px;
background: rgba(255, 255, 255, 0.08);
}
.justification-partial {
font-size: 10px;
opacity: 0.5;
}
.council-justification-item button {
font-family: var(--font-typewriter);
font-size: 11px;
background: transparent;
border: 1px solid rgba(255, 255, 255, 0.2);
color: var(--color-text);
border-radius: 4px;
padding: 4px 8px;
cursor: pointer;
}
.council-justification-item button:hover {
border-color: var(--color-coin);
}
.council-justification-item button:disabled {
opacity: 0.35;
cursor: not-allowed;
}
.council-pending-hint {
font-size: 11px;
color: var(--color-risk-critical);
}
.council-cancel-btn {
margin-left: 8px;
background: transparent;
border: 1px solid rgba(255, 255, 255, 0.25);
color: var(--color-text);
border-radius: 4px;
padding: 2px 8px;
font-size: 10px;
cursor: pointer;
font-family: var(--font-typewriter);
}
.council-candidates {
display: flex;
flex-direction: column;
gap: 8px;
}
.council-pool {
display: flex;
flex-direction: column;
gap: 8px;
}
.council-candidate {
background: var(--color-surface);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 6px;
padding: 10px 12px;
}
.council-candidate.targetable {
cursor: pointer;
outline: 1px dashed var(--color-token-info);
}
.council-candidate.removed {
opacity: 0.4;
text-decoration: line-through;
}
.council-candidate.forced {
border-color: var(--color-coin);
}
.candidate-name {
font-size: 13px;
font-weight: 700;
}
.candidate-flavor {
font-size: 11px;
opacity: 0.6;
margin-top: 3px;
}
.council-deferred-note {
font-size: 12px;
opacity: 0.7;
}
.council-confirm-btn {
font-family: var(--font-typewriter);
background: var(--color-token-info);
color: #fff;
border: none;
border-radius: 6px;
padding: 12px;
font-weight: 700;
cursor: pointer;
font-size: 14px;
margin-top: 4px;
}
/* ── 2026-09-17: 13석 표결 표시 + 툴팁 배치 ── */
.council-required-delta {
font-size: 11px;
color: var(--color-coin);
font-weight: 400;
}
.council-margin {
font-size: 11px;
font-weight: 400;
opacity: 0.7;
}
.council-margin-hint {
color: var(--color-risk-critical);
opacity: 1;
}
.council-penalty-list,
.council-pool-list {
display: flex;
flex-wrap: wrap;
gap: 6px;
}
.council-penalty-slot.targetable,
.council-pool-slot.targetable {
outline: 1px dashed var(--color-risk-critical);
outline-offset: 2px;
border-radius: 10px;
cursor: pointer;
}
.candidate-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
flex-wrap: wrap;
}
.candidate-votes {
font-family: var(--font-typewriter);
font-size: 12px;
opacity: 0.7;
white-space: nowrap;
}
.candidate-votes.lead {
opacity: 1;
color: var(--color-coin);
font-weight: 700;
}
.candidate-state {
font-size: 11px;
opacity: 0.65;
margin-top: 5px;
}
.council-candidate.winning {
border-color: var(--color-coin);
}
.council-candidate.added {
border-style: dashed;
}
.council-confirm-sub {
font-weight: 400;
font-size: 11px;
opacity: 0.85;
}
.council-margin-hint-weak {
opacity: 0.55;
}