2026-08-03 세션 — devplan UI 부트스트랩 전환 1단계(메인 허브)
논의·대안
페페 지시: "devplan ui 를 전격 변경할거야. 다운 받은 bootstrap ui를 사용할거고, 먼저 메인페이지만 변경해. 확인 후 나머지 연결된 페이지 모두 변경할거야. 다만 색상은 현재 테라코타 색상을 유지한다."
전날 적재한 design-refs 자산(Bootstrap 5.3.8 · MIT)을 devplan 대시보드에 실제로 투입하는 첫 작업이다. 뼈대를 어디까지 바꿀지 3안으로 그릴링(질문 1개) — (A) 공식 dashboard 예제 쉘(상단 고정 navbar + 좌측 사이드바 + 본문) / (B) 현행 1단 구조 유지, 컴포넌트만 치환 / (C) A + 상단 KPI 요약 카드 행. 페페 A 선택.
색 유지 방법도 두 갈래였다 — ①부트스트랩 SCSS를 테라코타로 재컴파일 ②배포본 그대로 링크하고 CSS 변수만 덮기.
②를 택했다: 빌드 도구가 필요 없고, 버전을 올려도 게시본 링크만 바뀌며, 테라코타 토큰이 이미 assets/theme.css 단일 출처로 있다.
결정
- 껍데기 = 부트스트랩 공식
examples/dashboard구조. navbar(테라코타) +offcanvas-md사이드바 +col-md-9 ms-sm-auto col-lg-10본문, 본문 안에서 다시col-xxl-9(본문) /col-xxl-3(활동 레일). - 자산은 design-refs 게시본을 링크한다. devplan 안에 사본을 두지 않는다 —
/design-refs/bootstrap-5.3.8/dist/css/bootstrap.min.css·.../dist/js/bootstrap.bundle.min.js·/design-refs/bootstrap-icons-1.13.1/bootstrap-icons.min.css. 경로 상수는build_hub.py의BS/BI한 곳. - 색은
assets/theme.css가 부트스트랩 변수를 덮는다(브리지 신설) —--bs-primary·--bs-body-bg·--bs-secondary/tertiary-bg·--bs-border-color·--bs-link-color·--bs-focus-ring-color·--bs-success/warning/danger+.btn-primary·.btn-outline-primary·.nav-pills·폼 포커스. 링크 순서 = 부트스트랩 → theme.css → 페이지<style>(순서가 규칙). 페이지가 중복 선언하던:root토큰 블록은 삭제해 단일 출처를 복원했다. - 테마 게이트는 벤더 CSS를 판정하지 않는다 —
check_theme.py의 링크 CSS 스캔에서theme.css·/design-refs/·bootstrap제외(VENDOR). 부트스트랩엔.bg-dark같은 유틸 색이 당연히 들어있고 우리가 그 클래스를 안 쓰면 화면에 안 나온다. 테라코타 유지 책임은 브리지가 지고, 게이트는 페이지가 직접 쓴 색만 본다. - 데이터·기능은 무변경 —
projects.json/project_state.json(진행판 상태층) //api/favs//api/activity/ qahelper 전부 그대로. - 나머지 페이지 전환은 페페 확인 후(지시대로 1단계는 메인만).
산출물·커밋
C:\dev\devplan\build_hub.py— HTML 템플릿 전면 교체(부트스트랩 마크업),BS/BI상수, 게시본 존재 검사(빌드·selftest 둘 다). 상단 탭 6 → 사이드바 8항목, 상태 필터 칩 → 사이드바 nav+카운트 배지, 섹션 →card, 목록 →table-sm table-hover, 진행판<details>→ accordion, 자체 오버레이 모달 → 부트스트랩 modal, 우측 레일 →list-group, 이모지 → Bootstrap Icons(티어 🟢🟠🟡⚪ · 트랙 🪑🧰은 의미값이라 유지).C:\dev\devplan\assets\theme.css—--on-accent추가 + Bootstrap 5.3 브리지 블록 신설.C:\dev\devplan\check_theme.py—VENDOR제외 + 자체검사 케이스 추가(9항목 PASS).C:\dev\devplan\CLAUDE.md— 페이지 작성 규칙에 부트스트랩 링크 순서·함정 추가.C:\dev\devplan\index.html— 재생성(66KB).- 시드:
projects/devplan/{handoff,rules}.md·projects/design-refs/rules.md§4(첫 소비처 기록) · 루트HANDOFF.mdNOW.
검증(전부 실측)
build_hub.py --selftest10항목 PASS(카드 36 source 해결 · 상태층 검증 · 게시본 3파일 존재).check_theme.py index.htmlFAIL 0 · 전체 60페이지 FAIL 0 / WARN 10(기존과 동일).- 8799 실브라우저(Playwright): 콘솔 에러 = favicon 404 하나뿐(기존). 카드 36 · 티어 16·1·4·15 = 36 합계 일치 · 상태필터(개발중 12) · 검색("가구" 9건 / "deskpet") · 지우기 버튼 · 행클릭 모달 개폐(백드롭 잔여 0) · 아코디언 독립 토글 · 별 토글 서버 왕복 후 favs.json 원복 확인 · 390px offcanvas 개폐 · 가로 오버플로 0.
- 색 실측: navbar
rgb(201,124,74)· 사이드바 픽셀#efe9e1·--bs-primary: #c97c4a.
1차 피드백 반영 (같은 세션, 페페 지시)
"좌측 사이드 메뉴 가로폭을 줄여라(공간낭비) · 등록·수정 = projects.json → build_hub.py 문구는 페이지에 필요 없다, 삭제 ·
절약한 공간으로 프로젝트별 기획페이지·관리페이지 아이콘을 바로 클릭하게".
- 사이드바 col-md-3 col-lg-2(1680px에서 277px) → flex 고정 170px(넓은 화면에서 사이드바가 같이 넓어지던 낭비 제거).
본문 1388→1495px, 목록 표 999→1079px. navbar 브랜드도 170px로 맞추고 라벨을 "devplan. 허브"로 줄였다.
- 사이드바 하단 빌드 안내 문구 삭제(운영 방법은 rules.md·devplan/CLAUDE.md 몫이지 화면 몫이 아니다).
- 목록 표(고정·최근 등록)에 바로가기 열 신설 — 기획📋(projects.json.url, 26/36) · 관리⚙(project_state.json.admin_url, 2건) ·
사이트🔗(site, 새 탭 2건). 없는 항목도 흐린 아이콘으로 자리를 지켜 열이 흔들리지 않게 했고, 행 클릭(모달)과는 분리(stopPropagation).
기존의 클릭 안 되는 ↗(계획 페이지 있음) 표시는 실제 링크로 대체.
- 🔑 .row 안에서 폭 고정 사이드바를 만들 땐 본문 flex:1 1 0 — basis:auto면 콘텐츠 폭이 기준이 돼 남은 공간을 넘고
flex는 줄이기 전에 줄바꿈부터 한다 → 본문이 사이드바 아래로 통째로 내려갔다(실측 main.y=1050). 좌표로 확인해야 잡히는 사고.
- 재검증: 좌표 실측(사이드바 x0·170px / 본문 x170 같은 줄) · 기획·관리 아이콘 실클릭 이동(pfs.html·kakao-ops.html) ·
390px 오버플로 0 · 콘솔 에러 0 · build_hub.py --selftest 10 · 테마 FAIL 0.
2차 피드백 반영 (같은 세션, 페페 지시)
"바로가기 버튼이 너무 작다 — 아이콘 테두리는 삭제해라(그것만 해도 커진다) · 나는 폰트크기 13 이상을 원한다.
그 미만은 글씨가 작아서 사용자 읽기가 불편하다".
- 글자 13px 미만 전면 금지 — 허브의 모든 font-size를 px로 재조정(본문·표 셀 14 / thead·배지·날짜·진행판 셀 13 /
카드 헤더·아코디언 15 / 사이드바 nav 14). 부트스트랩 .badge(.75em)·small(.875em)·code(.875em)는 상대단위라
부모가 작아지면 같이 작아진다 → 바닥 3줄(.badge/small,.small/code,kbd = 13px)을 깔았다.
- 게이트 신설 devplan/check_font.py — font-size 전량을 px로 환산(rem×16)해 13px 미만이면 FAIL, HTML은 바닥 3줄 존재까지 확인.
--selftest 7항목. build_hub.py --selftest에 연결(10→11항목) → 템플릿을 고치다 글자가 조용히 작아지는 걸 막는다.
정적 검사로는 em 체인을 못 푸니 브라우저 computed 값으로도 확인했다(직접 텍스트를 가진 전 요소 순회 → 13px 미만 0곳).
- 바로가기 아이콘 — 테두리·배경 제거, 글리프 19px·클릭영역 26×26, 열 66→100px.
🔑 flex 자식은 flex:none이 없으면 좁은 열에서 쪼그라든다(실측 26→19px). 크게 만들었는데 화면에선 그대로여서
값이 아니라 렌더된 박스 크기를 재서 잡았다.
- 재검증: 아이콘 26×26·border 0 · 셀 넘침 0 · 진행판 표 1060/1061 · 확대 후 아이콘 실클릭(furniture-learn.html) ·
테마 FAIL 0 · 폰트 FAIL 0 · selftest 11. 행 높이 25→35px는 가독성 대가로 수용.
3차 피드백 + 2단계 전환 (2026-08-04)
페페: "순번이나 4자 이하의 글자는 줄바꿈이 안 되게 공간을 확보해라. 굵은 글씨를 너무 남발하지 마라. N 기호의 글씨가 너무 뚱뚱하다. 전체 페이지 수정 진행해."
스타일 3건
- 짧은 라벨(회차·배지·트랙·단계·프로젝트명)에 white-space:nowrap + 열 min-width. 진행판은 레일 옆(1061px)에서
계속 접혀서 본문 전폭으로 내렸다(1090 → 1426px 확보, 줄바꿈 0건). 레일은 좌측 목록과 높이를 맞춰(34vh) 빈 공간 제거.
- 굵기: 카드 제목·브랜드만 700, 프로젝트명 600, thead·배지·레일 500~600 → 화면 전체 bold 요소 8개(브랜드 3 + 카드 제목 5).
- N(신규) 배지 800 → 500.
2단계 = 연결된 30페이지 전량 전환(방식은 그릴링 3안 중 페페가 "연결된 것만 수동 전환" 선택)
- 신설 assets/shell.css = 공용 쉘(navbar·사이드바 170px·본문·카드·글자 바닥). 허브도 이 파일을 링크하고
중복 CSS 32줄을 뺐다 → 쉘 규칙 단일 출처.
- 신설 apply_shell.py = 정적 변환기. head 링크 4개(부트스트랩→아이콘→theme.css→shell.css 순서 강제),
navbar+사이드바+.hub-main 래핑, bootstrap JS, 13px 미만 글자 상향, hub-shell-v1 표식으로 재적용 방지,
원본은 _trash/devplan-preshell-20260804/에 백업. --list/--all/--fixfonts/--selftest(8항목).
- 대상 판정 = 허브 네비 + 카드 url + admin_url로 실제 열리는 30개. 미연결 28개(목업·구버전)는 지시대로 제외.
- order-auto.html의 자체 --accent:#c2703d → 정본 #c97c4a로 통일(navbar 색이 그 페이지만 달랐다).
🔑 함정 4개(전부 실측으로 태움)
1. body{display:flex}·max-width·padding이 쉘을 부순다 — 내용은 이미 .hub-main으로 옮겨졌는데 body 선언이 남아
navbar와 사이드바가 가로로 나뉘고 본문이 412px 밀렸다. html > body{display:block;margin:0;padding:0;max-width:none}
(특정도 0,0,2 > 페이지 body{} 0,0,1)로 무력화 — !important 없이 이긴다.
2. <body>도 <head>도 없는 페이지가 있다(암묵 태그) → 본문 시작점을 </style> → </title> 순으로 폴백.
3. 글자 상향은 <style>만 훑으면 놓친다 — 인라인 style=·JS 템플릿 문자열·em/%(code{.85em} = 11.9px)까지.
check_font.py도 em/%를 본문 14px 기준으로 환산하게 확장(그 전엔 "상대단위"로 흘려보냈다).
4. 브라우저 캐시가 검증을 거짓말하게 만든다 — 파일을 고쳤는데 옛 화면을 재서 "쉘이 안 붙었다/글자가 안 커졌다"고
3번 오판했다. 검증은 ?cb=<시각> + CSS에 cache-control:no-cache 라우트로 돌린다.
검증 — 31페이지 실브라우저 전수 PASS(사이드바 170 · 본문 x170 · navbar rgb(201,124,74) · qahelper 존재 ·
computed 13px 미만 0 · 가로 오버플로 0 · 콘솔 에러 0 · 본문 텍스트 존재) + 390px 오프캔버스 개폐 +
사이드바 링크 실이동(catalog→harness) + 게이트 3종(테마 60개 FAIL 0 / 폰트 31개 FAIL 0 / build selftest 11).
회귀 1건 — 2단 레이아웃 페이지가 안 보임 (2026-08-04, 페페 신고)
"furniture-learn 페이지 오류가 있다. 자가학습 검토 페이지가 보이지 않음."
- 원인: 그 페이지는
body{display:flex;height:100%}로 좌(KB 목차) + 우(검토 본문)를 나눈다. 쉘이 내용을.hub-main안으로 넣고html > body{display:block}으로 body를 무력화하자 flex가 사라져 좌우가 위아래로 쌓였고, 본문(main#content)이 y=920으로 내려가 첫 화면엔 목차만 보였다. - 해결:
apply_shell.py --fixbody신설 — body 규칙에서 레이아웃 속성만(display/flex-/height/overflow/width/ gap/align-/justify-/grid-) 떼어.hub-main으로 옮기고, 배경·색·폰트는 body에 남긴다(그건 상속되면 그만이다).height:100%는.hub-main의 부모(.row)가 auto라 안 먹으므로calc(100vh - 48px)로 치환. 해당 5개 = ai-study-vibecoding · furniture-expert · furniture-gpt-bridge · furniture-learn · background-ops. 신규 적용에도 자동 포함(transform ⑤단계),--selftest13항목. - 판정도 고쳤다: 직전 전수검증은
본문 텍스트 300자 이상만 봐서 목차만 보이는 페이지를 PASS로 찍었다(1263자). → 첫 화면(뷰포트) 안에 실제로 보이는 텍스트 양과.hub-main직계 블록의 y좌표 분포를 본다. "존재하는가"가 아니라 "보이는가"를 재야 한다. - 재검증: 31페이지 전수 PASS(가시 텍스트 250자↑ 포함) · 게이트 3종 · 4개 페이지 스크린샷 육안(좌우 2단 복원 확인).
다음
- ⏳페페 = 전 페이지 육안 확인(옛 CSS 캐시 때문에
Ctrl+F5한 번 권장). - 미연결 28개(목업·구버전)는 필요할 때
apply_shell.py <파일>로 개별 적용하면 된다. - 2단계 착수 시 공용화 후보: 헤더·사이드바를 조각으로 빼서 페이지들이 같은 마크업을 쓰게 할지(현재는 허브에만 인라인).
관계
- 주제 그룹: devplan-hub
- 관련 문서: devplan-rules, design-refs-rules, devplan-session-2026-08-03-devplan-manager-board