UX Phase 3: Polish — 라벨/안전/실루엣 정리

스크린샷에서 발견된 디테일 4건 fix.

9. Status badge 임상 모드 분기
   - 일반 모드: urgency.message ("Enjoy your day!" 등) 그대로
   - 임상 모드: "Supine · 0 cm" 같은 측정 라벨 표시
   - 임상 시연 시 캐주얼 메시지가 부적절했던 문제 해결
   - 검사자가 현재 어느 condition인지 즉시 인지 가능

10. 카테터 카운트에 "left" 라벨 추가
    - 이전: 아이콘 + 숫자만 (의미 모호 — 잔여? 추가? 누적?)
    - 새로: 아이콘 + 숫자 + "left" 텍스트 (10×fontScale, 0.7 alpha)
    - 한눈에 "잔여 카테터" 의미 전달

11. 토르소 실루엣 모래시계 완화
    - chestW 0.42 → 0.40 (어깨 살짝 축소)
    - waistW 0.32 → 0.36 (허리 덜 잘록 — 다리처럼 보이던 원인)
    - hipW 0.46 → 0.42 (골반 살짝 축소)
    - 결과: 더 자연스러운 토르소 형태

12. Skip 버튼 Dev 모드 한정
    - 이전: 항상 표시 (임상에선 정렬 우회 위험)
    - 새로: appState.isDevMode일 때만 표시 + "Skip (Dev)" 라벨 + 크기 ↓
    - 폰트 15→13sp, alpha 0.6 — 의도된 dev 도구임을 시각적으로 명시

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-26 16:13:25 +09:00
parent 52bd58ac87
commit 83f63c62ca
2 changed files with 24 additions and 14 deletions
@@ -899,6 +899,9 @@ fun PiezoMonitoringView(appState: AppState) {
Icon(Icons.Default.LocalHospital, "Catheter", tint = MlPrimary, modifier = Modifier.size(16.dp))
Spacer(modifier = Modifier.width(4.dp))
Text("$cathCount", fontSize = (13 * fontScale).sp, fontWeight = FontWeight.Bold, color = MlPrimary)
Spacer(modifier = Modifier.width(2.dp))
Text("left", fontSize = (10 * fontScale).sp, fontWeight = FontWeight.SemiBold,
color = MlPrimary.copy(alpha = 0.7f))
}
}
if (showAddCatheter) {
@@ -983,8 +986,12 @@ fun PiezoMonitoringView(appState: AppState) {
Arrangement.spacedBy(nonDevSpacing)
) {
// Status badge (항상 urgency 메시지) — 빌드 114: dev 모드 한정 탭 시 더미 측정값 주입
val statusText = urgency.message
// Status badge — 임상 모드에선 측정 라벨, 일반 모드에선 urgency 메시지.
// 빌드 114: dev 모드 한정 탭 시 더미 측정값 주입
val clinicalSession = com.example.medilightv2android.services.ClinicalSessionStore.currentSession
val statusText = if (clinicalSession != null)
"${clinicalSession.posture.label} · ${clinicalSession.step.label}"
else urgency.message
val statusColor = urgency.accentColor
Text(
text = statusText,
@@ -342,9 +342,10 @@ fun PlacementGuideView(appState: AppState) {
val waistY = h * 0.42f
val hipY = h * 0.76f
val pubisY = h * 0.96f
val chestW = bodyW * 0.42f
val waistW = bodyW * 0.32f
val hipW = bodyW * 0.46f
// bodyW: Charles 833c110 가로 모드 대응 / 비율: 우리 d6b0a6b 다리처럼 안 보이게 조정
val chestW = bodyW * 0.40f
val waistW = bodyW * 0.36f
val hipW = bodyW * 0.42f
// ── Torso silhouette — hourglass via cubic bezier ──
val bodyPath = Path().apply {
@@ -881,15 +882,17 @@ fun PlacementGuideView(appState: AppState) {
Text("Start Scanning", fontSize = 28.sp, fontWeight = FontWeight.Bold, color = Color.White)
}
// Skip button
Spacer(modifier = Modifier.height(8.dp))
TextButton(onClick = { isContinuousMode = false; appState.placementComplete() }) {
Text(
text = "Skip",
fontSize = 15.sp,
fontWeight = FontWeight.SemiBold,
color = MlSecondaryText
)
// Skip — Dev 모드 한정 (임상에선 정렬 우회 위험)
if (appState.isDevMode) {
Spacer(modifier = Modifier.height(8.dp))
TextButton(onClick = { isContinuousMode = false; appState.placementComplete() }) {
Text(
text = "Skip (Dev)",
fontSize = 13.sp,
fontWeight = FontWeight.SemiBold,
color = MlSecondaryText.copy(alpha = 0.6f)
)
}
}
Spacer(modifier = Modifier.height(32.dp))