
iphone-duo-vertical-bars
Adapt toolbars, navigation bars and tab bars for the vertical axis on iPhone Duo — item ordering, symbol vs text representations, axis behavior, overflow menus, visibility priority, and when to opt out. Use when toolbar items look wrong, overflow too early, or need to move to the side on the outer display.
- Installs
- 626
- Last 24h
- +27
- Trending rank
- #4688
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/mirzaaghazadeh/iphone-duo-skills --skill iphone-duo-vertical-bars- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads iphone-duo-vertical-bars automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
Bars on the vertical axis
iPhone Duo's displays are wider and shorter than a traditional iPhone's. Vertical space is the scarce resource, so the system moves controls that normally sit at the top and bottom over to the side, where they also land closer to the thumb. The content area to their left stays uninterrupted and comparable to a conventional iPhone screen.
Same components, different axis. The position stays consistent as the user opens the device to the inner display in landscape. The one pose that keeps horizontal bars is the inner display in portrait, where there is plenty of vertical room for content.
Opting in
Two requirements, both mandatory:
1. Rebuild against the latest SDK. Without this the bars stay horizontal.
2. Use bars that come from navigation containers. In SwiftUI, pair the
toolbar modifier with NavigationStack or NavigationSplitView. In UIKit,
prefer UINavigationController and UITabBarController, which manage their own
bars — set toolbar items on a view controller and put it in a navigation
controller.
If you build a bar by hand out of UIToolbar, UINavigationBar or UITabBar,
its content is not considered for vertical layout. This is the single most
common reason an app's bars stay stubbornly horizontal.
How items are placed
Navigation, toolbar and tab bar controls all coexist in one shared vertical region. Picture the horizontal bar rotated 90° into a vertical stack — depending on the screen it may hold toolbar items, tab items, or both.
Two structural exceptions:
- Split views — only the detail column participates. Items in other columns stay horizontal.
- Inspectors — no vertical bar of their own when expanded, since the detail column already has one and two would be confusing.
Sheets vary by display. On the outer display a sheet that already has a toolbar gets it vertically. On the inner display sheets are centered and their items stay horizontal. When you move a sheet with the preferred-placement API, a sheet placed on the right gets a vertical bar; one placed on the left does not.
The bar is aligned to the hardware, so it stays on the same physical side in right-to-left languages. Content adapts around it; the bar itself does not move.
Ordering items
Audit your toolbar configuration against this hierarchy, top to bottom:
- Primary navigation — back, close. With a navigation controller the back
button is added for you. For a custom back or close, make a
ToolbarItemwithcancellationActionplacement in SwiftUI; in UIKit add an item toleadingItemGroups. - Prominent actions — done, and similar. Use the
topBarPinnedTrailingplacement in SwiftUI,pinnedTrailingGroupin UIKit. Group related items withToolbarItemPlacementsemantics rather than positioning them by hand. - Everything else, keeping its original grouping. A vertical spacer separates top and bottom placements even once they're unified into one bar.
Not every pose lays bars out vertically, so keep placement consistent. Users should not have to relearn where an action lives each time they open the device.
Symbol or text
This is where most polish is won or lost.
A horizontal bar gives items a fixed height and flexible width. A vertical bar inverts that: fixed width, flexible height. Narrow and tall strongly favors symbol-only representations.
The system already picks a representation from the icon and title you supply — icon when visible in a bar, text when there is no icon, both once the item moves into an overflow menu. None of that changes. What is new is that the system also weighs whether an item suits the vertical axis: items with an icon go vertical, text-only items stay horizontal.
So: always provide both a title and an image, even when you expect the image
to be used. Use a SwiftUI Label or the corresponding UIBarButtonItem
properties. The title is what the system falls back on in overflow menus and
expanded forms.
Overriding with axis behavior
The inference is usually right. When it isn't, override it: the
.axisBehavior(_:) modifier taking a ToolbarItemAxisBehavior in SwiftUI, or
UIBarButtonItem.axisBehavior (a UIBarButtonItem.AxisBehavior) in UIKit.
Force horizontal when an item alternates between a symbol and text — an edit button that becomes "Done", for example. Even though the symbol could sit in a vertical bar, the text form can't, and an item that jumps axes is jarring. The system Edit button handles this already; a custom equivalent needs the horizontal-only behavior. Keep related items on the same axis as a rule.
Allow vertical when you have a custom view that the system would otherwise keep horizontal but which does have a good vertical representation.
Reducing text so more can go vertical
Minimize title-only items and custom views that pair text with an image. Most are better as symbols. A count rendered inline next to an icon, for instance, becomes a badge on the symbol — the iOS 26 badge API gives you the standard appearance on every device — turning a mixed item into a symbol-only one.
The test: is the text reinforcing the symbol, or carrying information the symbol can't? Supplementary text can go. A cart button showing a running total cannot — keep that one horizontal.
Keyboard accessory bars stay attached to the keyboard. They never move to the vertical axis.
Custom views
Opted-in custom views must either fit the bar's fixed width or lay out vertically on their own. Revisit their metrics — a control panel might hide its labels and shrink slightly when vertical to free up room.
To branch on this, read toolbarVerticalEdge (environment value in SwiftUI,
trait in UIKit). It's readable from the content view or from inside the item's
own view.
Read the semantics carefully, because they're easy to get backwards. It is a
HorizontalEdge?, and it reports which edge the system prefers for the
vertical bar in the current context — whether or not a vertical bar is actually
visible. So it is not a "are my items going vertical right now?" flag. It's
"if there's a vertical bar here, it belongs on this side," which is exactly what
you need to align your own custom bars and edge-anchored UI with the system's
placement.
Two behavioral details worth knowing: a vertical bar has no scroll edge effect by default, but it does get a background when Reduce Transparency is on, so keep custom content legible either way. And flexible spacers collapse to zero on the vertical axis while fixed spacers keep their minimum — though your app shouldn't be adding bar spacing manually on either axis.
Group instead of spacing. Rather than inserting spacers by hand, express the
relationship: ToolbarItemGroup in SwiftUI, UIBarButtonItemGroup in UIKit.
Groups space themselves against neighbouring groups and re-space as the available
room changes — which on this device happens constantly. Manual spacing is fixed
at exactly the moment it needs to be fluid.
Keep controls near what they act on. When a control belongs to a content area that isn't the trailing one, leave it with that area instead of sending it to the side bar. Proximity is what tells someone the control applies to that pane. In a mail-style layout, controls acting on the message list belong above the list, not in the shared vertical bar where they'd read as applying to the open message.
Overflow
Items overflow more readily here — the outer display in landscape has little vertical room, and competing UI such as the keyboard or pinned Picture-in-Picture squeezes it further.
First decide what survives longest: toolbar items, or the tab bar.
- Navigation-driven screens should let the toolbar compress first, keeping primary destinations reachable. This is the default.
- Task-driven screens should let the tab bar compress first, preserving frequently used actions.
Configure this per view with the toolbar compression behavior API.
Consolidate into the system overflow. If the app has its own overflow menu,
fold its actions into the system-managed one — ToolbarOverflowMenu in SwiftUI,
UINavigationItem.additionalOverflowItems in UIKit. Reserve the ellipsis symbol
for overflow specifically; give other menus their own distinct symbols rather
than importing conventions from other platforms.
Then set priorities. By default items overflow bottom to top. Assign a
visibility priority — ToolbarItemVisibilityPriority in SwiftUI,
UIBarButtonItemVisibilityPriority in UIKit — to control the collapse order.
Prioritize by group first, then within a group if you need finer control.
Two things deserve high priority: actions people reach for constantly (compose, new note), and controls conveying status such as badged items, which are useless once hidden.
When to turn it off
Default answer: don't. Side-mounted controls are a defining pattern of this device, and Apple's guidance is explicit that you generally shouldn't override the placement. Familiar control positions are what let someone pick up your app and already know it, and every app that opts out erodes that a little.
The legitimate exceptions are narrow:
- Interfaces that don't need bars at all — a calculator-style layout that spans the full display width. This works for visual, immersive, non-scrolling interfaces, provided nothing collides with the Dynamic Island or status bar. You can also mix: a full-width background or header with the scrollable content inset.
- Control-light sheets, where one close button doesn't justify surrendering the width.
Use toolbarVerticalBehavior (SwiftUI) or preferredVerticalBarBehavior (UIKit)
to opt out. When a sheet opts out on the outer display, it stops just short of
the front camera and the status bar repositions itself.
Checklist
- Rebuild against the latest SDK.
- Replace hand-rolled bars with container-provided ones.
- Give every item both a title and an image.
- Order items: navigation, then prominent actions, then the rest.
- Convert text+symbol items to symbols with badges where the text is supplementary.
- Apply
.axisBehavior(_:)/UIBarButtonItem.axisBehaviorto items that alternate between symbol and text. - Choose toolbar-first or tab-bar-first compression per view.
- Consolidate custom overflow into the system menu, and assign
visibilityPriority. - Verify in every pose in Device Hub, including Split View on both sides.
FAQ
What does the iphone-duo-vertical-bars skill do?
Adapt toolbars, navigation bars and tab bars for the vertical axis on iPhone Duo — item ordering, symbol vs text representations, axis behavior, overflow menus, visibility priority, and when to opt out. Use when toolbar items look wrong, overflow too early, or need to move to the side on the outer display.
How do I install iphone-duo-vertical-bars?
Run npx skills add https://github.com/mirzaaghazadeh/iphone-duo-skills --skill iphone-duo-vertical-bars in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/iphone-duo-vertical-bars/ (personal) or .claude/skills/iphone-duo-vertical-bars/ (project).
Which AI agents can use iphone-duo-vertical-bars?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is iphone-duo-vertical-bars safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains iphone-duo-vertical-bars?
It is published by mirzaaghazadeh in mirzaaghazadeh/iphone-duo-skills. It has 626 recorded installs.
More from mirzaaghazadeh/iphone-duo-skills
iphone-duo-readiness
mirzaaghazadeh/iphone-duo-skills
Audit and port an iOS app to iPhone Duo, Apple's first foldable iPhone. Use when asked to support, adapt, prepare, test, or review an app for iPhone Duo, foldable iPhone, the inner/outer display, device poses, or the fold. Entry point that routes to the layout, bars, hinge/scenes, camera, and design skills.
iphone-duo-adaptive-layout
mirzaaghazadeh/iphone-duo-skills
Build layouts that adapt to the iPhone Duo fold using reserved regions, division and occlusion regions, displacement patterns, and the split and overlay ArrangementView containers. Use when content or controls land in the fold, when building a split-like or overlay layout, or when custom manually-positioned UI must avoid the hinge or the under-display camera.
iphone-duo-design-review
mirzaaghazadeh/iphone-duo-skills
Review or design an iOS interface for iPhone Duo's poses — closed, open, book-folded, tabletop and tent — covering side-mounted controls, asymmetric layouts, fold avoidance, sheets, and how to use the inner display well. Use for design critique, mockup review, or deciding what a screen should look like on a foldable iPhone rather than how to code it.
iphone-duo-hinge-and-scenes
mirzaaghazadeh/iphone-duo-skills
Use the iPhone Duo hinge angle for interactions and effects, support Split View multitasking and multiple app scenes, and pair UI across both displays with scene accessories including CameraCaptureAccessory. Use when building fold-driven effects, multi-window support, or dual-display experiences.
iphone-duo-camera
mirzaaghazadeh/iphone-duo-skills
Build camera capture for iPhone Duo's two front cameras — the virtual front camera, the inner under-display and outer ultra-wide devices, AVCaptureDeviceDirectionCoordinator, preview mirroring and video gravity, and dual-display capture. Use when an app captures photo or video and must handle the device opening, closing or flipping.
iphone-duo-react-native
mirzaaghazadeh/iphone-duo-skills
Open the skill to read its SKILL.md instructions.
Popular mobile skills
design-mobile-apps
designed-by-ai/skills
Design mobile app screens with Sleek, edit Sleek projects, and implement their designs in React Native or HTML.
ios-design
uizze.sh
Design and review iOS UI/UX for iPhone apps in SwiftUI, UIKit, or React Native. Use for mobile app design, screen redesigns, navigation flows, typography, forms, keyboard and safe-area layout, and accessibility checks. Apply Apple Human Interface Guidelines and consult real product references through the optional Uizze connection.
vercel-react-native-skills
vercel-labs/agent-skills
React Native and Expo best practices for building performant mobile apps. Use when building React Native components, optimizing list performance, implementing animations, or working with native modules. Triggers on tasks involving React Native, Expo, mobile performance, or native platform APIs.
animate-expo
emilkowalski/skills
Build animations in React Native and Expo, making the decisions in the order that determines whether they feel right — should it animate, which thread it runs on, which properties, spring or timing, how the gesture hands off, how it degrades. Writes the implementation with Reanimated, Gesture Handler, Expo Router and expo-haptics. Use when animating anything in an Expo app, adding gestures, sheets, screen transitions, press feedback or haptics, or fixing motion that stutters on device. For web animation use animate.
xcode-project-setup
firebase/agent-skills
Safely modifies Xcode projects (.pbxproj) to add Swift Packages and link files. Use this skill whenever an iOS project needs dependencies installed (e.g. Firebase, Alamofire).
firebase-remote-config-basics
firebase/agent-skills
Manages Firebase Remote Config templates, feature flags, loading strategies, and SDKs (Android, iOS). Use when downloading/deploying remoteconfig JSON templates, managing version history/feature flags, setting in-app defaults, fetchAndActivate(), real-time listeners, or SDK setup. Don't use for Firebase Hosting, Auth, Firestore, Data Connect, Crashlytics, or App Hosting.