# Dashboard modal inventory > **Canonical copy:** This committed file is the durable canonical inventory. The identical > `modal-inventory` task document lives on **FN-8617** because task documents are per-task and > cannot be added retroactively to FN-8605 or archived FN-8615. ## Evidence scope and row accounting Evidence was re-derived from `main` at **`743dc5f46ea5ebf53ff81ce1a9722ce9ef29d37a`**. The revision-qualified glob command (`git ls-tree --name-only -r main -- packages/dashboard/app/components | grep -E 'Modal\\.tsx$'`) returned **40** files. Of the named extras, **2** were not in that glob (`AgentDetailView.tsx`, `WorkflowNodeEditor.tsx`); `RightDockExpandModal.tsx` matches the glob and appears exactly once. The required `ArtifactsGallery.tsx` grep found **three distinct viewer pop-outs**—`MediaLightbox`, `PdfViewer`, and `DocViewer`—which each render through `OverlayShell`; therefore it contributes **3 rows** (not one vague aggregate row). The deduplicated union source-file set contains 43 files and the union **row count is 45** (`40 + 2 + 3`). The revision-qualified FloatingWindow, `useModalResizePersist`, shared-contract, and structural searches were recorded in the table below. The bespoke pointer/drag/resize search was run across all 43 union source-file pathspecs, explicitly including `AgentDetailView.tsx`, `WorkflowNodeEditor.tsx`, and `ArtifactsGallery.tsx`; its positive surface-geometry candidates were New Task, Right Dock Expand, and Terminal. Matches in other files were inspected and are internal content controls (for example a sidebar splitter, list reordering, or a nested Files-pane splitter), not modal move/resize mechanisms. For every **D** row, the cited structural construct was directly inspected at this revision along with its imports, handlers, geometry state, and corresponding local styling references. The note “direct inspection” means no surface-level touch/pointer capture, custom `useDrag`/`useResize`, drag/resize library, pointer-written window geometry, or CSS `resize` mechanism exists; where a pointer-token match existed, the note records why it does not move or resize the modal itself. ## Shared migration contract Migrations use `FloatingWindow` with a stable geometry-persistence key and consume `isTabletTouchViewport` from `useViewportMode.ts`, never bare `@media (pointer: coarse)`. Effective move/resize hit targets are at least 44px and marked `data-resize-hit-target="true"`. Phone-class is **≤767.98px** and tablet-class starts at **768px**; JavaScript and CSS boundaries must stay in sync. A headerless window using `hideHeader` plus `dragHandleSelector` must put the same hit-target contract on its resolved delegated handle. `closeOnOutsidePointerDown` defaults **off**, so a modal intended to dismiss on outside pointer-down must opt in explicitly. ## Classifications | Surface | Class | Evidence (all at `main` SHA above) | Target | Owning subtask | Risk notes | Opt-out justification | | --- | --- | --- | --- | --- | --- | --- | | `ActivityLogModal.tsx` | A | `ActivityLogModal.tsx:486` `` | already migrated | FN-8619 | Modal uses `floating-window:agent-detail`; paired mouse-only backdrop dismissal remains. Legacy size-only key is orphaned (one-time reset). | Inline presentation is explicitly gated by `inline` because its owner retains the detail layout and lifecycle. | | `AgentErrorDetailsModal.tsx` | D | `AgentErrorDetailsModal.tsx:65` `.modal-overlay`, `role="dialog"`; direct inspection: no geometry mechanism. | stays static | FN-8607 agent/onboarding/utility | Short blocking error-detail acknowledgement. | Error detail is a brief, fault-recovery acknowledgement; moving/resizing would add state to an urgent recovery path. | | `AgentGenerationModal.tsx` | D | `AgentGenerationModal.tsx:169` `role="dialog"`; direct inspection: no geometry mechanism. | migrate → FloatingWindow | FN-8607 agent/onboarding/utility | Generation progress can be long-running. | — | | `AgentImportModal.tsx` | D | `AgentImportModal.tsx:473` `role="dialog" aria-modal`; direct inspection: no geometry mechanism. | migrate → FloatingWindow | FN-8607 agent/onboarding/utility | Import mapping has nested scroll. | — | | `AgentListModal.tsx` | D | `AgentListModal.tsx:289` `.modal-overlay` / dialog; direct inspection: no geometry mechanism. | migrate → FloatingWindow | FN-8607 agent/onboarding/utility | List selection and outside dismissal. | — | | `AgentOnboardingModal.tsx` | D | `AgentOnboardingModal.tsx:194` `.modal-overlay`; direct inspection: no geometry mechanism. | migrate → FloatingWindow | FN-8607 agent/onboarding/utility | Onboarding step chrome. | — | | `ArtifactsGallery.tsx#MediaLightbox` | A | `ArtifactsGallery.tsx:532` `MediaLightbox`; shared `OverlayShell` at `:477` `` | already migrated | FN-8621 | `floating-window:create-room`; explicit outside-pointer dismissal; member-picker remains nested scroll owner. | — | | `DockerNodeOnboardingModal.tsx` | D | `DockerNodeOnboardingModal.tsx:214` `.modal-overlay`; direct inspection: no geometry mechanism. | migrate → FloatingWindow | FN-8607 agent/onboarding/utility | Onboarding commands and scroll. | — | | `DuplicateWarningModal.tsx` | D | `DuplicateWarningModal.tsx:41` `.modal-overlay`; direct inspection: no geometry mechanism. | stays static | n/a | Small duplicate-decision confirmation. | This intentionally compact confirmation should stay centered and transient rather than acquire persisted window state. | | `ExperimentalAgentOnboardingModal.tsx` | D | `ExperimentalAgentOnboardingModal.tsx:187` `.modal-overlay`; direct inspection: no geometry mechanism. | migrate → FloatingWindow | FN-8607 agent/onboarding/utility | Experimental onboarding step chrome. | — | | `FileBrowserModal.tsx` | A | `FileBrowserModal.tsx:372` ``; nested import detail remains floating | already migrated | FN-8619 | Modal uses `floating-window:github-import`; nested import detail remains floating; legacy size-only key is replaced (one-time reset). | `useEmbeddedPresentation` / `resizePersistEnabled` explicitly keeps embedded import container-filling. | | `GitManagerModal.tsx` | A | `GitManagerModal.tsx:1385` `` | already migrated | FN-8619 | Dense tabs and pop-out stacking retained; `task-detail-modal-size` is orphaned for `floating-window:task-detail` (one-time reset). | — | | `TerminalModal.tsx` | A | Floating mode uses FloatingWindow (`terminal-`), headerless delegated drag host. | already migrated | FN-8620 | Floating legacy pair superseded by `fusion:terminal-float-geometry-` (one-time reset). | Docked mode is explicitly gated and retains its top-edge resize / `fusion:terminal-docked-height-` because it owns dock layout. | | `WorkflowAddStepModal.tsx` | A | `WorkflowAddStepModal.tsx:144` `