플레이 피드백 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>
336 lines
5.8 KiB
CSS
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;
|
|
}
|