---
title: "🧭 260519-19:28_F6c-데스크탑사이드바"
notion_id: "365229620868812c9ee8d6062dc8d21d"
notion_url: "https://app.notion.com/p/365229620868812c9ee8d6062dc8d21d"
category: "workreport"
parent: "Claude Code 작업보고"
updated: "2026-05-19"
priority: "Medium"
purpose: "데스크탑(≥769px) 좌측 사이드바 전환 + 모바일 하단 탭바 유지"
---

**일시:** 2026-05-19 19:28 KST
**브랜치:** main
**커밋:** `9989a58`
**이전 커밋:** `b613ae5` (.gitignore zip 추가)
**수정 파일:** `src/components/Layout.tsx` (단독)
**모델:** Claude Opus 4.7 (1M context)
---
## 👤 USER (작업 지시)
```javascript
※ 주의: 동일 작업을 수행 중인 다른 에이전트가 있을 수 있음.
작업 시작 전 반드시 git status 확인 후 충돌 여부 점검할 것.
작업 전 git pull로 최신 원격 커밋 기준 동기화할 것.

## 작업 목표
데스크탑 좌측 사이드바 전환 (F-6c)
모바일은 기존 하단 탭바 유지, 데스크탑(769px 이상)은 좌측 사이드바로 전환

## 구현 명세
1. 769px 이상 = 데스크탑 사이드바, 768px 이하 = 기존 하단 탭바
2. window.innerWidth + resize listener로 분기 감지
3. 사이드바 collapsed 상태 localStorage 영속 (B안)
4. 축소 상태 56px (아이콘만) / 확장 200px (아이콘+텍스트)
5. 구성: 로고 영역 + nav 아이템 + 하단 유저 정보 + 축소 버튼
6. 활성 라임 #c8f135, 비활성 rgba(255,255,255,0.38)
7. 전체 레이아웃 flex row 로 전환, 데스크탑일 때만 사이드바 렌더
```
---
## 🤖 ASSISTANT (작업 수행)
### 계획 → 체크리스트 → 컨텍스트노트
**\[계획\]**
1. git 동기화 + 현 Layout.tsx 구조 파악 → 검증: working tree clean
2. 헤더 주석에 F-6c 라인 추가 + collapsed state·toggleCollapsed 함수 추가 → 검증: TypeScript 오류 없음
3. return 블록 통째 교체 — 헤더/메인/사이드바/하단탭바 4개 노드로 분리 후 최상위 flex row 구조 → 검증: tsc + vite build
4. 커밋 + 푸시 → 검증: origin/main 반영
5. 노션 페이지 작성
**\[체크리스트\]**
- [x] git status 확인 + git pull (clean)
- [x] Layout.tsx 전체 파악 (197줄)
- [x] F-6c 주석 추가
- [x] collapsed state + toggleCollapsed (localStorage 'sb-collapsed')
- [x] return 블록 전면 재구성
- [x] npm run build 통계
- [x] Layout.tsx 단독 스테이징 + 커밋 + 푸시
- [x] 노션 작성
**\[컨텍스트노트\]**
- **레이아웃 구조 전환**: 최상위 div를 flex column → flex row로. 데스크탑은 좌사이드바 + 우측에 (헤더+main) 컬럼. 모바일은 사이드바 없이 (헤더+main) 컬럼 + fixed 하단탭바.
- **헤더 sticky 유지**: 데스크탑에서도 우측 컬럼 내부에서 sticky로 자연 작동.
- **사이드바 sticky**: position sticky + top 0 + height 100vh — 스크롤 대응.
- **로고 아이콘 재사용**: DashboardIcon 그대로 size 26으로 레이도링, 색은 fill=currentColor 때문에 부모 color 상속 — 부모 div에는 color 설정 없으나 SVG가 currentColor면 기본 inherit. 하지만 부모 컨테이너에 color 지정 없으면 black 렌더링되므로, 아이콘 컴포넌트 자체에 color 완전 상속. 해결: 로고 영역에 color: '#c8f135' 명시 필요 — 고려 필요 사항 → 현재는 fill 주입이 currentColor라 삭제 안됨. **그래서 로고 영역의 DashboardIcon이 라임색으로 렌더되도록 **명시적 color**이 필요**.
**⚠ 자가 점검 주의 항목 검출**: 로고 영역 컨테이너에 color 속성 없을 수 있음 → SVG가 부모 inherit하면 아무 색도 없어 black/기본색 렌더 가능성. 환경 테스트 시 확인 필요.
### Step 1 — 이전 작업 마무리 + git 동기화
`b613ae5` (.gitignore zip 추가) 커밋 완료 상태에서 시작. working tree clean.
### Step 2 — 헤더 주석 + collapsed state 추가
```diff
+ // F-6c: 데스크탑(≥769px) 좌측 사이드바 전환 + 모바일 하단 탭바 유지, collapsed localStorage 영속 — 2026.05.19
```
```typescript
// F-6c: 사이드바 collapsed 상태 — localStorage 영속 (B안)
const [collapsed, setCollapsed] = useState(() => {
  if (typeof window === 'undefined') return false
  return localStorage.getItem('sb-collapsed') === 'true'
})
const toggleCollapsed = () => {
  setCollapsed(prev => {
    const next = !prev
    try { localStorage.setItem('sb-collapsed', String(next)) } catch { /* QuotaExceeded 무시 */ }
    return next
  })
}
```
### Step 3 — return 블록 전면 재구성
구조를 **4개 노드로 분리**한 후 최상위 flex row로 조립:
- `headerNode`: 기존 헤더 그대로 (달록/PaceLog 로고 + AI 버튼 + 설정 버튼)
- `mainNode`: 기존 main 그대로 (Outlet)
- `sidebarNode`: **새로 추가** (isDesktop && ...)
	- 로고 영역: DashboardIcon size=26 + 'DALLOG' 텍스트(!collapsed)
	- nav: navItems map, NavLink, 활성 라임 / 비활성 투명 흥색 38%
	- 하단: 유저 원 이니셜 'M' + 마스터/[dallog.pages.dev](http://dallog.pages.dev) + ◀/▶ 토글
	- sticky + height 100vh + width 56/200 + transition 0.22s ease
- `bottomTabBar`: 기존 fixed bottom nav 를 **!isDesktop**일 때만 렌더
상위 div:
```typescript
<div style={{ display: 'flex', flexDirection: 'row', minHeight: '100dvh' }}>
  {sidebarNode}
  <div style={{ flex: 1, display: 'flex', flexDirection: 'column', minWidth: 0 }}>
    {headerNode}
    {mainNode}
  </div>
  {bottomTabBar}
  <NotifyDialog ... />
</div>
```
### Step 4 — 빌드 검증
**Bash:** `npm run build`
```javascript
vite v5.4.21 building for production...
✓ 104 modules transformed.
dist/assets/index-BN1AHHjs.js   821.41 kB    ← 이전 818.86 kB 대비 +2.55 KB
✓ built in 1.93s
```
타입 에러 0, 빌드 성공. JS 번들 +3KB.
### Step 5 — 스테이징 + 커밋 + 푸시
**Bash:** `git add src/components/Layout.tsx && git commit ... && git push origin main`
```javascript
[main 9989a58] feat(layout): 데스크탑 좌측 사이드바 전환 (F-6c)
 1 file changed, 195 insertions(+), 68 deletions(-)
   b613ae5..9989a58  main -> main
```
---
## 📋 최종 변경 요약
### 레이아웃 구조
<table header-row="true">
<tr>
<td>구자</td>
<td>Before</td>
<td>After</td>
</tr>
<tr>
<td>최상위 div</td>
<td>flex **column**</td>
<td>flex **row**</td>
</tr>
<tr>
<td>데스크탑</td>
<td>헤더 → main → (심지어 모바일의 하단탭바도 그대로 렌더)</td>
<td>좌사이드바 + 우컬럼(헤더+main)</td>
</tr>
<tr>
<td>모바일</td>
<td>동일 (하단탭바 포함)</td>
<td>사이드바 없음, 하단탭바만</td>
</tr>
</table>
### 사이드바 제원
<table header-row="true">
<tr>
<td>항목</td>
<td>값</td>
</tr>
<tr>
<td>폭 (확장/축소)</td>
<td>200px / 56px</td>
</tr>
<tr>
<td>배경</td>
<td>#0d1018</td>
</tr>
<tr>
<td>transition</td>
<td>width 0.22s ease</td>
</tr>
<tr>
<td>height</td>
<td>100vh, position sticky top 0</td>
</tr>
<tr>
<td>활성 색</td>
<td>#c8f135 + 배경 rgba(200,241,53,0.1)</td>
</tr>
<tr>
<td>비활성 색</td>
<td>rgba(255,255,255,0.38)</td>
</tr>
<tr>
<td>collapsed 영속</td>
<td>localStorage 'sb-collapsed'</td>
</tr>
</table>
### 추가된 상수·상태
<table header-row="true">
<tr>
<td>수</td>
<td>설명</td>
</tr>
<tr>
<td>`collapsed`</td>
<td>localStorage 'sb-collapsed' === 'true' 기초</td>
</tr>
<tr>
<td>`toggleCollapsed`</td>
<td>상태 토글 + localStorage 저장, try/catch 안전</td>
</tr>
</table>
---
## ⚠️ 차후 검증 리스트 (사장님 브라우저 테스트 필요)
- [ ] ≥769px: 좌사이드바 렌더 + 하단탭바 숨김 확인
- [ ] ≤768px: 기존 하단탭바 유지 + 사이드바 없음 확인
- [ ] 사이드바 아이콘 색: **로고 영역의 DashboardIcon이 라임 이외 색으로 렌더되는지** (currentColor 상속 이슈 자가점검 경고)
- [ ] 사이드바 nav 항목: 활성 라임 색 + 배경 라임 10% 투명
- [ ] 축소/확장 버튼 상태 토글 후 새로고침해도 localStorage로 재적용되는지
- [ ] 아이콘만 보이는 56px 상태에서 hover/focus 소속성 이상 없는지
- [ ] 브라우저 리사이즈 시 769px 경계에서 분기 자연스러운지
## 🔗 관련 파일
- src/components/Layout.tsx
## 📐 커밋 정보
- **커밋 해시:** `9989a58`
- **이전 커밋:** `b613ae5` (.gitignore zip 추가)
- **메시지:** feat(layout): 데스크탑 좌측 사이드바 전환 (F-6c)
- **변경 통계:** src/components/Layout.tsx \| 263 lines (+195 / -68)
- **푸시:** `b613ae5..9989a58 → origin/main` 완료
## 🔗 세션별 연계
- 선행: `260519-19:09_F6b-Nav아이콘인라인컴포넌트화` (`4981b14` 외 사이드바 아이콘 재사용 기반 마련)
- 안 궄골리는 자가 점검 경고: 로고 영역 DashboardIcon의 currentColor 색 상속 한 번 확인 필요
---
## 🩹 즉시 후속 fix (커밋 `a14b981`)
위 자가 점검에서 잡은 잠재 버그를 푸시 직후 즉시 fix.
**문제:** 사이드바 로고 영역의 `<DashboardIcon size={26} />`는 `fill="currentColor"`이므로 부모 div의 `color`를 상속하는데, 부모 div에 `color` 속성이 명시되지 않아 브라우저 기본 색(보통 검정 또는 OS 기본 텍스트 색)으로 렌더될 가능성이 있었음. 어두운 배경(#0d1018) 위에서 검정 아이콘은 거의 안 보임.
**fix:** 로고 영역 부모 div에 `color: '#c8f135'` 명시 추가.
```diff
       <div style={{
         padding: collapsed ? '14px 0 10px' : '14px 14px 10px',
         ...
         borderBottom: '1px solid rgba(255,255,255,0.05)',
         minHeight: '56px',
+        color: '#c8f135',
       }}>
         <DashboardIcon size={26} />
```
**검증:** `npm run build` 통과. 커밋 `a14b981` → origin/main 푸시 완료.
이제 사이드바 로고 영역의 DashboardIcon이 라임(#c8f135)으로 정확히 렌더됨이 보장됨.
