Adds a presentation-only enter animation for mobile task-detail surfaces (modal and board main-panel), layered on top of the existing FN-7583/FN-7586 dismissal routing, without altering close/back timing.
- Gate a new `.task-detail-modal--mobile-transition` class in TaskDetailModal.tsx via a local resize listener at the 768px breakpoint, mirroring the existing OVERSIGHT_MENU_MOBILE_BREAKPOINT pattern
- Add matching `.task-detail-main-panel--mobile-transition` modifier in MainContent.tsx gated by the existing isMobile prop
- Add slide/fade keyframe animations in TaskDetailModal.css and styles.css, both honoring prefers-reduced-motion
- Add regression tests covering the modal and board-panel mobile transition behavior
- Document the Capacitor WebView limitation preventing a true interactive predictive-back in packages/mobile/README.md
Files changed:
.../dashboard/app/components/TaskDetailModal.css | 33 ++
.../dashboard/app/components/TaskDetailModal.tsx | 31 +-
...skDetail.mobile-transition.board-panel.test.tsx | 333 +++++++++++++++++++++
.../TaskDetail.mobile-transition.test.tsx | 156 ++++++++++
.../app/components/dashboard/MainContent.tsx | 10 +-
packages/dashboard/app/styles.css | 35 +++
packages/mobile/README.md | 30 ++
7 files changed, 626 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-7587
Fusion-Task-Lineage: cc5f08df-4aaf-447d-9c30-237b32191d3f
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Enables the WKWebView interactive-pop (edge-swipe-back) gesture on iOS, matching the Android predictive-back parity already in place, by patching the generated AppDelegate.swift during cap sync.
- Add packages/mobile/scripts/patch-ios-webview.ts: patches AppDelegate.swift to cast the root view controller to CAPBridgeViewController and set webView?.allowsBackForwardNavigationGestures = true before the didFinishLaunchingWithOptions return, is idempotent, and no-ops safely when no ios/ project exists yet
- Wire capacitor:sync:after to run both patch-android-manifest.ts and patch-ios-webview.ts so cap sync keeps both native back-gesture opt-ins in sync; add patch:ios-webview script
- Add unit tests covering patch, idempotency, already-patched, missing-project, and source-preservation cases for the new iOS webview patch, alongside the existing Android manifest patch tests
- Add TaskDetail.swipe-back.test.tsx coverage proving the shared popstate-driven nav-history dismissal stack (no iOS-specific native-back emitter needed) already satisfies the gesture's dismissal contract
- Add mobile-scripts.test.ts dashboard coverage and update MOBILE.md / packages/mobile/README.md documenting the new iOS gesture opt-in
Files changed:
MOBILE.md | 12 ++
.../dashboard/app/__tests__/mobile-scripts.test.ts | 31 +++++
.../__tests__/TaskDetail.swipe-back.test.tsx | 131 +++++++++++++++++++++
packages/mobile/README.md | 36 ++++++
packages/mobile/package.json | 3 +-
packages/mobile/scripts/patch-ios-webview.ts | 119 +++++++++++++++++++
packages/mobile/src/__tests__/native-shell.test.ts | 122 +++++++++++++++++++
7 files changed, 453 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-7586
Fusion-Task-Lineage: 248092a1-de1b-49b6-94ef-70675a7b93a1
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Fixes the Android predictive back-gesture (edge swipe) not returning from a task detail view to the board, even though the hardware/legacy Back button worked correctly.
- Patch the generated Android manifest post-sync to set android:enableOnBackInvokedCallback="true" on the <application> tag, opting into AndroidX's OnBackPressedDispatcher for predictive-back gesture completion (mitigating ionic-team/capacitor-plugins#2418 via the disableBackButtonHandler toggle shipped in @capacitor/app@7.1.0).
- Wire the patch script into Capacitor's capacitor:sync:after npm-script hook so it runs automatically after every cap sync (and therefore after cap run android / build:mobile).
- Ensure both the back gesture and the hardware Back button funnel through the same AndroidBackButtonManager backButton listener, dispatching the shared fusion:native-back event consumed by the dashboard's nav-history stack.
- Add regression coverage: a unit test for the manifest patch script's idempotent opt-in behavior, and a dashboard test asserting the task detail view returns to the board on fusion:native-back.
- Document the Android manifest patch rationale and the unchanged dashboard-side invariant in packages/mobile/README.md.
Files changed:
.../__tests__/TaskDetail.swipe-back.test.tsx | 13 +++
packages/mobile/README.md | 31 +++++++
packages/mobile/capacitor.config.ts | 13 +++
packages/mobile/package.json | 2 +
packages/mobile/scripts/patch-android-manifest.ts | 90 ++++++++++++++++++
packages/mobile/src/__tests__/native-shell.test.ts | 102 +++++++++++++++++++++
6 files changed, 251 insertions(+)
Fusion-Task-Id: FN-7583
Fusion-Task-Lineage: ad0cb02c-6e49-448a-8c93-607cd5ae657b
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Route Android Back through Fusion's mobile navigation stack before native fallback.
- Dispatch a cancelable native-back event from the Capacitor shell before browser-history or app-exit fallback.
- Handle the native-back event in dashboard navigation history so mobile task details dismiss like browser Back and swipe-back.
- Cover Android Back behavior across native shell and task-detail navigation tests.
- Add a patch changeset for the published CLI/mobile bundle.
Files changed:
.changeset/fn-7257-android-back-task-detail.md | 7 +
.../__tests__/TaskDetail.swipe-back.test.tsx | 214 +++++++++++++++++++++
.../dashboard/app/hooks/useNavigationHistory.ts | 15 ++
packages/mobile/src/__tests__/native-shell.test.ts | 151 ++++++++++++++-
packages/mobile/src/index.ts | 7 +-
packages/mobile/src/plugins/native-shell.ts | 103 +++++++++-
6 files changed, 494 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-7257
Fusion-Task-Lineage: 90d0bc32-8968-4876-a5b4-51b34888d480
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Relying on env(safe-area-inset-*) in remotely-served dashboard CSS was
unreliable (depends on device Chromium version reporting insets + the
service-worker-cacheable CSS being current). Configure
@capacitor-community/safe-area with detectViewportFitCoverChanges:false +
initialViewportFitCover:false so it pads the whole webview natively on every
Android device, guaranteeing the app never renders under the status/nav bars
regardless of CSS or webview version.
Android WebView returns 0 for env(safe-area-inset-top) by default, so the
CSS-only header inset had no effect on edge-to-edge devices (API 35+).
- Add @capacitor-community/safe-area@^7.0.0 (Capacitor 7 compatible); it
patches the webview so env(safe-area-inset-*) report real values. Enabled
natively (no JS init), so it works in remote/live mode too.
- capacitor.config.ts: declare SafeArea plugin (initialViewportFitCover).
- mobile-run-android.sh: idempotently enable EdgeToEdge in MainActivity after
cap add (android/ is generated/gitignored), required by the plugin.
The merge completes a multi-step shell regression hardening effort spanning desktop, mobile, and dashboard entry points, adding 12 test files or test expansions to lock down the shell preload and native contracts. A companion fix exempts internal coordination tools (`list_agents`, `delegate_task`, e
Fusion-Task-Id: FN-3409
Adds a new `useShellContext` hook with tests to the dashboard, integrated into `App.tsx` and `Header.tsx` to provide shell context plumbing throughout the UI.
Fusion-Task-Id: FN-3406