--- ui_doc_type: component component_id: console-shell status: 구현됨 source_evidence: - type: code path: packages/flutter/oto_console/lib/src/oto_console_shell.dart notes: "OtoConsoleShell Scaffold, rail, selected section content 구현" - type: code path: apps/client/lib/src/app/oto_client_app.dart notes: "OtoClientApp이 OtoConsoleShell을 host MaterialApp home으로 mount" - type: docs path: apps/client/README.md notes: "oto_console package의 embeddable shell 기준" --- # Console Shell Component ID: `console-shell` Status: `구현됨` ## Source Evidence | Type | Path | Notes | |------|------|-------| | code | `packages/flutter/oto_console/lib/src/oto_console_shell.dart` | `OtoConsoleShell` Scaffold, rail, selected section content 구현 | | code | `apps/client/lib/src/app/oto_client_app.dart` | host `MaterialApp`이 `OtoConsoleShell`을 mount | | docs | `apps/client/README.md` | embeddable shell 기준 | ## Purpose Control Plane 콘솔의 전체 layout shell을 제공하고, rail navigation과 선택된 section content를 연결한다. ## Used By - `overview`: shell content area - `runners`: shell content area - `pipelines`: shell content area - `executions`: shell content area - `artifacts`: shell content area - `agent`: shell content area - `settings`: shell content area ## Anatomy - `Scaffold` - `SafeArea` - `console-rail` - selected section content area - optional fallback `section-surface` ## Variants - default: host가 전용 surface를 모두 넘긴 상태 - fallback: 특정 section widget이 없으면 `section-surface`를 표시 ## States - default - selected-section - fallback-section - navigation-callback ## Rules - section enum, rail button, view definition은 같은 section 집합을 말해야 한다. - shell은 view source of truth가 아니라 view를 담는 container component다. ## Decision History - 2026-06-24: 구현 후보 재검토 중 `OtoConsoleShell`을 별도 shell component로 보강했다.