The system SHALL provide a CapsuleSafeArea component that computes the minimum right-side margin needed to avoid the WeChat mini-program capsule button, and wraps its default slot with that left margin.
uni.getMenuButtonBoundingClientRect() and uni.getSystemInfoSync() to compute safeWidth = screenWidth - menuButton.left + 8px, and applies margin-left: safeWidth to the wrapped content0 so the layout remains unchangeduni.getMenuButtonBoundingClientRect() fails or returns invalid datascreenWidth (approximately 28% of screen width) so the layout remains safe on common devicesThe system SHALL wrap the TopBar right slot inside CapsuleSafeArea so any right-side action buttons are shifted left of the capsule automatically. Pages using TopBar shall not need to manually add capsule-safe spacing.
TopBar right slotThe system SHALL ensure the notification bell on pages/home/home (all roles) does not overlap the WeChat capsule by rendering the home header with TopBar and placing the bell inside the TopBar right slot.
DispatchHome.vue renders the top-right notification bellTopBar, the left slot keeps the existing avatar/greeting, and the bell is placed inside the TopBar right slot and is not covered by the capsuleThe system SHALL ensure the "新增/发布" button on pages/task/task does not overlap the WeChat capsule by rendering the task list header with TopBar and placing the button inside the TopBar right slot.
TaskListView.vue renders the top-right add buttonTopBar with the page title, and the button is placed inside the TopBar right slot and is not covered by the capsuleThe system SHALL ensure the "今天" and "新增排班" buttons on pages/schedule/schedule do not overlap the WeChat capsule by placing both buttons inside the TopBar right slot.
ScheduleView.vue renders the top-right action buttonsTopBar right slot and are not covered by the capsule, and the month-switching row below TopBar only keeps the month navigation on the leftThe system SHALL keep npm run build:mp-weixin and npm run type-check passing, and non-WeChat layouts must not regress.