"세 surface, 세 lifetime, 세 정보 밀도. Lesson 3 는 decision matrix — 어느 게 어느 ClipDeck feature 얻는지, 그리고 잘못된 feature 를 잘못된 surface 에 밀어 넣는 게 가장 흔한 extension UX 버그인 이유."
세 surface
- Popup. 작고 transient. Max ~800×600 픽셀, 합리적 크기는 320×480 쯤. 바깥 click 에 죽음. Toolbar-icon click 에 mount, focus 떠나는 순간 unmount. One-off 상호작용 — 설정 toggle / quick status / single-button action — 에 탁월.
- Side panel. 키 크고 persistent. Full window height, user 선호에 따라 ~300–400 px wide. Page click 살아남고; tab 전환 살아남고; user 가 명시적으로 닫을 때만 죽음. User 가 반복 참조하는 ambient context 에 탁월.
- Full tab. 가장 큼.
chrome.tabs.create({ url: 'options.html' })나chrome_url_overrides로 열기. 일반 web page 와 같은 context type; 전체 window 차지 가능. 전용 app / settings page / onboarding flow / 복잡한 multi-step UI 에 탁월.
Lifetime, 비교
| Surface | 열려 있는 동안 | Focus 잃을 때 | Re-mount 비용 |
|---|---|---|---|
| Popup | 바깥 click 전까지 | 모든 것 | 매 open 마다 load + render |
| Side panel | user 가 toggle off 할 때까지 | 없음 | 첫 open 시 load, 이후 persist |
| Full tab | user 가 tab 닫을 때까지 | 없음 | 첫 open 시 load, 이후 persist |
Popup mount 가 저렴하지만 자주 일어남; panel 과 full-tab mount 가 더 비싸지만 드물게 일어남. 주된 throughput-vs-latency 거래.
ClipDeck allocation
- Popup — quick action 과 stats. "Save current selection" 버튼 (SW 로 메시지 보내 실제 capture), "Open clip list" 버튼 (side panel 열기), 오늘 카운트, "Reset counters". One-click 으로 완료되고 visible 유지 필요 없는 모든 것.
- Side panel — clip library. Timestamp / source URL / search box / filter / inline edit-delete (Track 7) 가진 full list. User 가 article 읽으면서 열어 둠.
- Full tab — 결국의 options page (Track 6 가 소개) 와 side panel 보다 공간 필요한 가능한 export/import view 용 예약. ClipDeck v1 은 full-tab UI 없이 ship; v2 가 추가할 수도.
결정 규칙, 질문으로: user 가 이 UI 를 얼마나 오래 봐야 해? 초 → popup. 분-부터-세션 → side panel. Long-running 작업이나 settings → full tab.
Anti-pattern
- Clip library 를 popup 에 cramming. 10 entry 넘어가면 popup 답답. 증상: 강제 스크롤, 매 open 마다 selection 손실, filter 공간 없음. Side panel 로 밀기.
- One-click action 을 side panel 에. User 가 dismiss 만 위해 panel 열게 강제. 증상: feature engagement 낮음. Popup 으로 밀기.
- Settings 를 popup 안에 만들기. Multi-section form 은 공간 필요. 증상: 작은 input, form 상호작용에 popup auto-close.
options_page통해 full tab 으로 밀기. - Quick status check 위해 full tab 열기. Disruptive — user 가 있던 page 에서 끌어냄. 증상: user 가 uninstall. Popup 이나 panel 로 밀기.
Surface 를 user intent 의 lifetime 에 맞추기. 초 = popup, 분 = panel, session = full tab. 잘못된 surface 가 extension 이 ship 할 수 있는 가장 큰 UX 버그.
Surface 들이 코드 공유 가능? 응 — popup / side panel / full-tab page 모두 같은 JS module import 가능하고 스타일 공유 가능. ClipDeck 의 clip-row renderer 가 panel.js 와 미래 export-page.js 가 import 하는 한
clip-row.js 에 살 수 있음. Popup 은 보통 다른 니즈 (status-only) 지만, popup 과 panel 이 parallel render logic 자라면 중복보다 shared module 로 factor.