diff --git a/myApp/HaruDanim/CLAUDE.md b/myApp/HaruDanim/CLAUDE.md index 3761c22..3d0255b 100644 --- a/myApp/HaruDanim/CLAUDE.md +++ b/myApp/HaruDanim/CLAUDE.md @@ -175,7 +175,7 @@ xcrun xcstringstool sync Widgets/Localizable.xcstrings --stringsdata "${widget_f ### 6.1 모음 탭 (`MainView`) - 상단: 노출 목표 진행 현황 카드(1개=단독, 2개+=스냅 페이징 가로 스크롤 + 페이지 점, iPad=그리드). 카드 스타일 설정: 다짐별 각각(perQuest, 접힘 시 3개+더보기) / 전체 합산(combined) - "현재 진행 중" 영역: 측정 중 세션 나열 + 실시간 타이머 + 종료 버튼 -- **즐겨찾기 빠른 실행 영역**(`favoritesArea`, `runningArea` 아래·전체 그리드 위, `!favoriteActions.isEmpty && !isEditing`일 때만): `Action.isFavorite`(행동 탭과 동일 필드, §6.2) 켠 행동을 기기별 배치 순서(`orderedActions` 기준) 그대로 가로 스크롤 한 줄로 노출 — 행동이 많아져도 즐겨찾기는 스크롤 없이 바로 접근 가능하게 하는 목적(2026-07-21, 실사용 크라우딩 피드백 대응, §15 하단 이력 참고). **추가만 하고 전체 그리드에서 제외하지 않음**(즐겨찾기 아닌 행동을 찾기 더 어려워지는 트레이드오프 방지가 의도된 설계 — 그리드에서 숨기는 방식은 검토 후 기각됨). 셀은 `ActionButtonCell(compact: true)` 고정 폭(108pt) 재사용, 탭 동작(`handleTap`)과 롱프레스 메뉴(`actionContextMenu(for:)` — 기록 확인/통계 보기/기록 직접 입력·수정/**즐겨찾기 지정·해제**/행동 설정 수정/삭제)는 전체 그리드 셀과 완전히 공유. 즐겨찾기 지정·해제는 이 메뉴 또는 행동 탭에서 가능(§6.2) +- **즐겨찾기 빠른 실행 영역**(`favoritesArea`, `runningArea` 아래·전체 그리드 위, `!favoriteActions.isEmpty && !isEditing`일 때만): `Action.isFavorite`(행동 탭과 동일 필드, §6.2) 켠 행동을 기기별 배치 순서(`orderedActions` 기준) 그대로 가로 스크롤 한 줄로 노출 — 행동이 많아져도 즐겨찾기는 스크롤 없이 바로 접근 가능하게 하는 목적(2026-07-21, 실사용 크라우딩 피드백 대응, §15 하단 이력 참고). **추가만 하고 전체 그리드에서 제외하지 않음**(즐겨찾기 아닌 행동을 찾기 더 어려워지는 트레이드오프 방지가 의도된 설계 — 그리드에서 숨기는 방식은 검토 후 기각됨). 셀은 `ActionButtonCell(compact: true)` 고정 폭(108pt, 맥은 축소 매핑 보정으로 150pt — 그리드 버튼과 같은 비율) 재사용, 탭 동작(`handleTap`)과 롱프레스 메뉴(`actionContextMenu(for:)` — 기록 확인/통계 보기/기록 직접 입력·수정/**즐겨찾기 지정·해제**/행동 설정 수정/삭제)는 전체 그리드 셀과 완전히 공유. 즐겨찾기 지정·해제는 이 메뉴 또는 행동 탭에서 가능(§6.2) - 행동 버튼 그리드: 꼬리표 색 그라데이션 배경 + 아이콘 + 이름 + 오늘 누적(시간형) 또는 오늘 횟수(횟수형, 숫자 전환 애니메이션). 측정 중이면 노란 테두리 + record 점. 탭 = 시작/종료 토글 또는 +1 (스프링 눌림 + 햅틱) - 한 줄 개수: iPhone 2~6개 설정(5개 이상은 compact 셀), iPad는 화면 폭 자동 채움 — **iPad의 목표 카드·행동 그리드는 LazyVGrid가 아니라 비-lazy `AdaptiveColumnsLayout`**(MainView 내 커스텀 Layout, LazyVGrid(.adaptive)와 같은 열 계산). lazy 높이 추정이 높이 제각각인 목표 카드 + 1초 타이머 갱신과 결합해 맨 아래 스크롤 시 화면이 무한 진동(터치 불능)하는 실기기 버그의 수정 — iPhone(고정 열·페이징 높이 고정)은 LazyVGrid 유지. iPad 모음 그리드를 다시 lazy로 되돌리지 말 것. **행동 셀 높이 통일 규칙**: 시간형·횟수형 푸터 높이가 달라(횟수형 27pt 숫자) 셀 자연 높이가 달랐음 — 푸터에 숫자 크기의 hidden 템플릿(Text "0")을 깔아 두 유형의 자연 높이를 맞추고, AdaptiveColumnsLayout.place가 LazyVGrid처럼 행 높이를 제안해 행 안 셀도 균일(측정 패스는 불변이라 진동 버그와 무관, 고정 높이 목표 카드 무영향) - 롱프레스 메뉴: 기록 확인(기록 탭 필터 이동) / 통계 보기 / 기록 직접 입력·수정 / **즐겨찾기 지정·해제** / 행동 설정 수정 / 삭제 diff --git a/myApp/HaruDanim/IOS/Views/MainView.swift b/myApp/HaruDanim/IOS/Views/MainView.swift index 0c78eba..cda9718 100644 --- a/myApp/HaruDanim/IOS/Views/MainView.swift +++ b/myApp/HaruDanim/IOS/Views/MainView.swift @@ -264,7 +264,8 @@ struct MainView: View { ActionButtonCell(action: action, isEditing: false, compact: true) { handleTap(action) } - .frame(width: 108) + // 맥은 축소 매핑 보정으로 폭을 키운다 — 그리드 버튼(150→200)과 같은 비율 (§6.1) + .frame(width: DeviceLayout.isMac ? 150 : 108) .contextMenu { actionContextMenu(for: action) }