2026-08-11 PulseUp 작업일지입니다. 오늘은 11건의 작업을 진행했습니다.
1Monitor 가로 패널 — 타이틀 줄 1:2 + 구분선
현상/기능
- count 영역 상단의 회사로고와 운동명을 1:2로 하고 밑줄로 영역 구분
작업
- `renderer/single/landscape/`
- 타이틀 줄을 `1fr 2fr` 그리드로 바꿔 로고:운동명을 1:2로 나눴고, 두 칸 사이 구분선은 로고 칸의 `border-right`로 그려 경계와 정확히 맞췄다. 줄 아래에는 `border-bottom`을 넣어 카운터 영역과 분리했다
1Monitor 가로 화면 — 안내 문구 최상단 + 4분할 경계선
현상/기능
- rest/waterbreak가 화면 맨 위로 와야 한다. 4분할된 분할 경계 표시
작업
- `renderer/single/landscape/`, , 각 `landscape/*-`
- 문구를 정보 패널보다 위 layer(z-index 70)로 올려 패널까지 덮게 했다. 4분할 경계선은 선을 따로 그리지 않고 격자 간격 3px(`#343637`)으로 만들어 칸과 어긋나지 않게 했고, 패널 크기를 `calc(50% - 1.5px)`로 맞췄다. solo 구간은 패널 바깥 그림자가 같은 두께의 경계선 역할을 한다
1Monitor 가로 화면 — DS/CD 3분할 + 패널 비율
현상/기능
- DS/CD가 전체화면 1개로 나오는데 메인 3분할처럼 DS1,2,3 / DS4,5,6 / CD1,2,3 / CD4,5,6이 한 세트로 나오게. 패널 비율은 AMRAP 5:5, COMBO 3:3:3
작업
- `renderer/single/`, `renderer/single/landscape/`
- main이 이미 보내는 `positionGroups`에서 활성 순번이 속한 3개 묶음과 활성 슬롯을 찾는 모듈을 새로 만들어, main 수정 없이 DS/CD를 3분할로 표시하게 했다. 활성 슬롯은 position 라벨 색(`#e02020`)으로 구분한다
- `combo/`, `amrap/`, 각 `*-`, 각 `landscape/*-`
- 3분할 DS/CD는 **가로 화면만** 적용한다. view 계약에 `supportsStretchingSplit`·`setActiveSlot`(선택)을 추가해 가로 view만 구현했고, 세로 화면은 기존처럼 활성 운동 1개를 전체화면으로 유지한다. 전환 프리뷰도 같은 묶음으로 띄워 CD 시작 시 영상 재로딩이 없다
- `renderer/single/landscape/`
- WORK 칸이 `auto`라 카운터가 과도하게 넓어지던 문제를 균등 분할로 고쳤다(COMBO 3:3:3, AMRAP 5:5)
1Monitor 가로 화면 — 영상 미표시 수정
현상/기능
- AMRAP을 실행하는데 영상이 하나도 안 나온다
작업
- `renderer/single/landscape/`
- 본문(`<main>`)을 `position:relative`로 덮어써 칸 안의 absolute 슬롯 때문에 높이가 0으로 접히던 문제를 `absolute` + 사방 0 고정으로 해결했다. COMBO 가로 화면도 같은 증상이었다
1Monitor COMBO·AMRAP 가로 화면 (2×2 격자)
현상/기능
- COMBO Stress/Loop·AMRAP 가로 화면을 첨부 layout(좌상단 정보 패널 + 영상 3분할)으로 만들고, 다른 운동처럼 모두 새 파일로 분리
작업
- `renderer/single/landscape/`
- 좌상단 정보 패널(로고·구간 / WORK·카운터 / TIME·ELAPSED)과 2×2 격자·solo 본문 빌더를 COMBO·AMRAP 공용 모듈로 새로 만들었다. 패널은 본문 밖에 두어 레이아웃 전환에도 다시 그리지 않는다
- `renderer/single/combo/landscape/`, `renderer/single/amrap/landscape/`
- 세로 view는 손대지 않고 가로 전용 view를 새로 추가했다. element id·갱신 메서드를 세로와 동일하게 맞춰 controller 로직을 그대로 재사용하며, REST/WATER BREAK 문구도 세로와 같은 규격으로 표시한다
- `renderer/single/combo/`, `renderer/single/amrap/`, 각 `*-`
- controller가 요구하는 view 계약을 정의하고 생성자에 view 주입 파라미터를 추가했다(미주입 시 기존 세로 view). selector는 `metadata.videoOrientation === 'horizontal'`일 때 `combo-stress-landscape`·`combo-loop-landscape`·`amrap-landscape` 종류로 판정해 가로 view를 주입한다. 재생·preload·카운트 로직은 세로와 100% 동일하다
- §12·§13·§14에 "화면 구성 (가로 1Monitor)" 항목과 가로 구현 파일을 추가했다
- **문서** · `workout_exercises_logic.md`
1Monitor Main/EMOM — 재생 중 다음 영상 preload
현상/기능
- 영상이 재생되면 다음 영상이 preload 되도록 기능 추가
작업
- `renderer/single/`
- 현재 MOVE 재생 중(KEEP_VIDEO로 activate를 건너뛰는 경우 포함) 다음 다른 MOVE를 next 슬롯에 항상 preload 하도록 보강했다
1Monitor Main/EMOM rest·water — 세로와 동일 REST/WATER BREAK 문구
현상/기능
- Main/EMOM rest·waterbreak를 세로 운동과 동일하게 화면에 표시
작업
- `renderer/single/`
- 가로·세로 공통으로 영상 영역 중앙에 `REST`(초록)·`WATER BREAK`(파랑) 대형 문구를 띄우도록 COMBO/AMRAP과 같은 규격의 notice를 추가했다
1Monitor 가로 Main/EMOM — Ready→Main A1 재로딩 수정
현상/기능
- 가로 Main·EMOM에서 카운트다운→Main 사이 A1이 잠깐 나왔다가 다시 로딩됨
작업
- `renderer/single/`
- Ready `workout-play-preview`로 이미 켠 다음 구간 첫 MOVE는 `sectionPreviewActive`로 표시하고, 실제 exercise 진입 시 video pool 재로드·seek를 건너뛴다
SINGLE Main Stress 전용 모듈
현상/기능
- SingleLoopModule처럼 SingleStressModule 전용 모듈 생성
작업
- MULTI `StressModule` 폴백을 제거하고 SINGLE Main Stress 전용 모듈/main-round로 MOVE 1개 broadcast·KEEP_VIDEO·물보충 preload를 분리했다
Electron Windows 배포 — 코드 서명 비활성
현상/기능
- Windows 빌드 시 코드 서명 불필요
작업
- `dist:win`에 `CSC_IDENTITY_AUTO_DISCOVERY=false`를 넣어 electron-builder 서명 자동 검색을 끈다
COMBO Stress 마지막 SET — 휴식 없이 물보충 / 마지막 MOVE는 Ready→CD
현상/기능
- MOVE 1~3 마지막은 휴식 없이 바로 물보충, 마지막 MOVE는 마지막 운동 후 Ready 카운트 후 CD
작업
- Stress 저장 시 마지막 SET의 rest를 시퀀스에 넣지 않고, 마지막 MOVE에는 water도 넣지 않음. Set 패널 마지막 행 휴식 칸을 `-`로 표시. 시간 합산도 동일 규칙
- `single/`, `combo-stress/`
- 마지막 SET 뒤 레거시 휴식 보정(synthetic rest)을 제거해 물보충/Ready 전에 휴식이 끼어들지 않게 함. 문서 §6·§12 시퀀스 표기 수정
- **Web** · `exercises/shared/save-workout/`