예약 명령 인자 입력을 전체화면 overlay로 전환

Ref v_processing처럼 인자가 필요한 장수·사령턴 명령은 작은 popup 대신
body 위 전체화면 dialog에서 입력한다. 명령 목록 단계는 기존 popup을 유지한다.

- 상단 막대: 명령 취소 · 명령 다시 선택 · 명령명과 대상 턴 · 검색 켜짐/꺼짐
- 검색 토글 상태를 useCommandTargetSearchEnabled()로 폼과 공유
- URL은 유지하고 같은 URL의 history entry로 Back이 overlay만 닫게 함
- 1120px 이상에서는 원본 700px 지도와 대상 목록을 두 열로 배치
- 징병·모병 sticky 기준을 공용 header 높이 변수로 연결
- e2e를 전체화면 계약에 맞게 갱신하고 overlay·Back·geometry 테스트 추가

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-23 13:39:02 +00:00
co-authored by Claude Opus 5.5
parent 9d0a1a4add
commit a373ed327d
7 changed files with 613 additions and 278 deletions
@@ -245,10 +245,7 @@ test('shows and operates a city target map through live PostgreSQL, Game API, an
expect(geometry.display).not.toBe('none');
await page.screenshot({ path: testInfo.outputPath('chief-command-city-map-live.png'), fullPage: true });
await page
.getByRole('button', { name: '명령 입력 닫기', exact: true })
.click({ timeout: 2_000 })
.catch(() => undefined);
await page.getByRole('button', { name: '명령 취소', exact: true }).click();
await page.getByRole('button', { name: '2턴 명령 입력', exact: true }).click();
const nationPicker = page.getByTestId('command-picker');
await nationPicker.getByRole('button', { name: /^(?:국가:)?외교$/, exact: true }).click();
@@ -264,10 +261,7 @@ test('shows and operates a city target map through live PostgreSQL, Game API, an
);
await page.screenshot({ path: testInfo.outputPath('chief-command-nation-map-live.png'), fullPage: true });
await page
.getByRole('button', { name: '명령 입력 닫기', exact: true })
.click({ timeout: 2_000 })
.catch(() => undefined);
await page.getByRole('button', { name: '명령 취소', exact: true }).click();
await page.getByRole('button', { name: '3턴 명령 입력', exact: true }).click();
const assignmentPicker = page.getByTestId('command-picker');
await assignmentPicker.getByRole('button', { name: /^(?:국가:)?인사$/, exact: true }).click();