> ⚠️ Fabric 复杂 Phase。**详细实施计划（含每步真实代码）见 [`docs/superpowers/plans/2026-06-11-phase-2d-banner.md`](../../../docs/superpowers/plans/2026-06-11-phase-2d-banner.md)**——apply 时以该计划为准（三层结构/ViewManager 生命周期 hook/props 时序/Fabric 组件 spec/事件走 BannerCall/单测 infra 都已砸实）。下面是任务清单的勾选索引。

## 0. 构建配置（Fabric 前置）

- [x] 0.1 `package.json` codegenConfig `type: "modules"` → `"all"`（支持 Fabric 组件 spec）
- [x] 0.2 清 codegen 缓存（首次 Fabric：rm android/build example/android/build app/build .cxx）

## 1. 依赖

- [x] 1.1 Banner API 编译确认在 core-taku:6.5.73.3；缺则 example 加 `implementation "com.anythink.sdk:banner-taku:6.5.40"`（ADX 已配）

## 2. L2 spec

- [x] 2.1 Fabric 组件 spec `src/specs/ATBannerViewNativeComponent.ts`（codegenNativeComponent；props placementID/sceneID/extraMap/isAdaptiveHeight/width/height + onAdEvent DirectEventHandler 占位）
- [x] 2.2 `NativeATBridge.ts` 加命令式桥：`loadBannerAd(placementID, settings)`、`checkBannerLoadStatus(placementID): Promise<Object>`、`getBannerValidAds(placementID): Promise<Object[]>`、`entryBannerScenario(placementID, scenario, tkExtra)`、`setBannerLocalExtra/setBannerTKExtra`

## 3. 常量

- [x] 3.1 `Const.ts` 补 `BannerCallback` 15 个（含 close=bannerAdTapCloseButton、refresh/refreshFail=AutoRefresh*；无 video/reward/again）；index 导出
- [x] 3.2 sync-const-check 通过

## 4. L3 Android — Banner（含 Fabric）

- [x] 4.1 移植 `ATAdBannerManger→ATBannerManager`（命令式路由 + `ConcurrentHashMap<pid, Helper>` + checkAdStatus/validAds Promise + setLocalExtra/setTKExtra + entryScenario tkExtra），包名 `com.anythink.reactnative.banner`
- [x] 4.2 移植 `ATBannerHelper`（持 `ATBannerView` + Listener；回调 emit BannerCall，用 `Const.CallbackMethodCall.BannerCall` + `Const.BannerCallback.*`；AdSource 串行）
- [x] 4.3 **Fabric `ATBannerViewManager`**（三层结构）：Fabric 容器绑 props → UIComponent 中间层(attach/detach/load/生命周期) → 原生 ATBannerView；props 延迟 init（关键 props 齐才加载）
- [x] 4.4 生命周期：`onDetachedFromWindow→停自动刷新`；destroy command/prop → ATBannerView.destroy + 移除 view + 移除 ATAdEvents 监听
- [x] 4.5 注册 ViewManager 到 ATReactNativePackage；命令式桥方法路由到 ATBannerManager（未 init→reject SDK_NOT_INITIALIZED）

## 5. L1 TypeScript

- [x] 5.1 `src/banner/ATBannerView.ts`（命令式，SPACE §4.9）：setPlacementId/loadAd(adRequest?)/setShowConfig/setLocalExtra/setTKExtra/checkAdStatus():Promise/checkValidAdCaches():Promise/entryAdScenario(...tkExtra?)/destroy + setBannerAdListener/setAdRevenue/MultipleLoaded/AdSourceStatusListener（实例内按 callbackName 分流）
- [x] 5.2 `src/banner/ATBannerViewComponent.tsx`：包 codegen 原生组件；props 透传；内部 `ATAdEvents.setAdListener(placementID,...)` → 过滤后回调 `onAdEvent`；unmount → removeAdListener
- [x] 5.3 `src/index.tsx` 导出 ATBannerView / ATBannerViewComponent / BannerCallback

## 6. L3 iOS（stub）

- [x] 6.1 banner ViewManager + view stub（空实现 + NSLog）；命令式桥 stub；保留线程守护

## 7. Example

- [x] 7.1 `sdkConfig.ts` 加 banner 位 `banner: b5fdc16d5a63fc`
- [x] 7.2 Home 内嵌 `<ATBannerViewComponent>`（按钮切换显示/移除，验 destroy）

## 8. 单测（Fabric 组件 infra）

- [x] 8.0 装 `react-test-renderer` + `@types/react-test-renderer`（Fabric 组件渲染测试需要；前几期纯逻辑 mock 没装）
- [x] 8.1 `ATBannerView.test.tsx`：① 命令式 dispatch（mock NativeATBridge + NativeEventEmitter，emit BannerCall→验回调）② loadAd({channelSource:1})→{atAdRequest} ③ 组件 props 映射（TestRenderer + mock 原生组件，验 placementID/adWidth 透传）（B-Q01）
- [x] 8.2 Event 分发：mock BannerCall → 对应 placement 的 onAdEvent 收到正确 callbackName

## 9. 验证（你本机编译 + 对拍）

- [x] 9.1 Android：清缓存 + `yarn example android` 编译绿（codegen 生成 Fabric 组件）；内嵌 banner mount→展示
- [x] 9.2 show/click/close + 自动刷新事件；unmount 调 destroy 无残留刷新（B-F03/F04）
- [x] 9.3 多 banner 不串（B-F06）；L1 无 showInRectangle/hide/remove（B-F05）
- [ ] 9.4 iOS：pod install + `yarn example ios` 编译过、NSLog 路由可见
- [x] 9.5 jest 单测过；tsc/prettier/sync-const-check 绿
- [x] 9.6 对照验收 §八 B-F/D/Q/C 逐条；更新实施规范 §十二 Phase 2-D → ✅
