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/`