대시보드
Morit Plugin3. 화면과 사용자 경험

화면, 레이아웃, 내비게이션

플러그인 UI는 “어디에 나타나는가”를 정하는 extension point와 “무엇을 그리는가”를 정하는 Runtime tree로 나뉩니다. 먼저 사용자 흐름을 화면 단위로 나눈 뒤 각 화면의 JSON을 작성하세요.

화면 역할부터 정하기

사용자 목적extension point권장 내용
홈에서 상태를 빠르게 확인card핵심 상태 1~3개와 명확한 다음 행동
홈에서 즉시 실행action짧은 라벨의 단일 행동
플러그인의 주 작업screen목록, 상세, 편집 등 독립 화면
홈 메뉴 진입점menu자주 찾지만 상시 노출할 필요 없는 화면
플러그인 설정settings권한, 알림, 표시 옵션, 계정 진입
AI와 함께 작업workspace대화 맥락과 함께 보는 도구 화면
AI 실행 결과response해당 AI 메시지에 붙는 읽기 중심 결과

surface는 기존 패키지 호환용 일반 화면 point입니다. 새 독립 화면에는 역할이 더 명확한 screen을 사용합니다.

권장 화면 흐름

text
Home card/action
  → Overview screen
      ├─ List/filter state
      ├─ Detail screen
      └─ Edit dialog 또는 sheet

Plugin detail
  → Settings screen
      ├─ Account connections
      ├─ Notifications
      └─ Display preferences

첫 화면은 사용자가 현재 상태와 다음 행동을 5초 안에 파악할 수 있어야 합니다. 원시 JSON, capability ID, package ID, 디버그 상태는 사용자 화면에 두지 않습니다.

레이아웃 선택

  • column: 기본 읽기 흐름. 모바일에서 가장 안전한 시작점입니다.
  • row: 짧은 상태와 행동을 나란히 놓을 때 사용합니다. 좁은 폭에서는 stack_at으로 세로 전환합니다.
  • wrap: chip이나 짧은 필터처럼 항목 너비가 다른 반복 요소에 사용합니다.
  • grid: 같은 중요도의 카드·metric을 반복할 때 사용합니다. min_item_width로 열 수를 줄입니다.
  • section: 제목이 있는 정보 그룹입니다. 한 화면에 section이 너무 많아지면 화면을 분리합니다.
  • card: 배경과 경계가 필요한 독립 정보나 누를 수 있는 요약에 사용합니다.

중첩 card와 section을 장식 목적으로 반복하지 마세요. 부모 하나로 관계가 설명되면 추가 surface는 정보 계층을 흐립니다.

내비게이션

같은 플러그인의 다른 UI extension으로 이동할 때 navigate를 사용합니다.

json
{
  "type": "button",
  "props": {"label": "전체 시간표 보기", "style": "tonal"},
  "action": {"type": "navigate", "target": "school_life.week"}
}

target은 같은 manifest에 선언된 UI extension ID여야 합니다. 현재 화면을 닫고 이전 Host 화면으로 돌아갈 때는 back을 사용합니다.

json
{"type": "back"}

탭처럼 보여야 하는 단순 필터는 새 화면을 만들지 말고 chipset_state로 처리합니다. 반대로 목록과 상세처럼 제목, 스크롤 위치, 뒤로가기 의미가 달라지는 정보는 별도 screen으로 나눕니다.

상단 메뉴와 설정

Host가 화면 제목, 뒤로가기, 플러그인 메뉴를 담당합니다. JSON tree에서 별도 앱 바를 흉내 내지 않습니다. 화면의 overflow 메뉴는 해당 화면에서 자주 쓰지 않는 보조 행동만 담습니다. 계정 연결은 settings 화면의 Connection 관리로 제공하며 동일 패키지 root Instance를 복제하는 “계정 추가” 동작을 만들지 않습니다.

상태별 화면

한 data source에는 적어도 다음 상태를 고려합니다.

상태화면 동작
첫 로딩기존 레이아웃 크기를 유지하는 진행 표시
데이터 없음무엇이 비었는지와 시작 행동을 설명하는 empty
재시도 가능 오류원인 요약과 refresh 행동
권한·연결 필요필요한 권한/계정과 설정 진입
갱신 실패 + 기존 데이터기존 내용을 유지하고 작은 상태 안내

전체 화면을 한 data source의 오류로 교체하지 않습니다. 오류는 영향을 받은 section에 격리합니다.

다음은 기본·커스텀 컴포넌트입니다.