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.
Apple Human Interface Guidelines for iPad. An agent skill from ehmo/platform-design-skills.
$ npx skills add ehmo/platform-design-skills --skill ipados-design-guidelines -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ehmo/platform-design-skills ipados-design-guidelines --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/ehmo/platform-design-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/ipados .claude/skills/ipados-design-guidelines && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "ipados-design-guidelines" agent skill from https://github.com/ehmo/platform-design-skills/tree/main/skills/ipados into .claude/skills/ipados-design-guidelines/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ipados-design-guidelines", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/ehmo/platform-design-skills/tree/main/skills/ipadosType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add ehmo/platform-design-skills --skill ipados-design-guidelines -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ehmo/platform-design-skills ipados-design-guidelines --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ehmo/platform-design-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/ipados .agents/skills/ipados-design-guidelines && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "ipados-design-guidelines" agent skill from https://github.com/ehmo/platform-design-skills/tree/main/skills/ipados into .agents/skills/ipados-design-guidelines/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ipados-design-guidelines", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ehmo/platform-design-skills --skill ipados-design-guidelines -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ehmo/platform-design-skills ipados-design-guidelines --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ehmo/platform-design-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/ipados .cursor/skills/ipados-design-guidelines && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "ipados-design-guidelines" agent skill from https://github.com/ehmo/platform-design-skills/tree/main/skills/ipados into .cursor/skills/ipados-design-guidelines/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ipados-design-guidelines", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/ehmo/platform-design-skills.git --path skills/ipados--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add ehmo/platform-design-skills --skill ipados-design-guidelines -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ehmo/platform-design-skills ipados-design-guidelines --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ehmo/platform-design-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/ipados .gemini/skills/ipados-design-guidelines && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "ipados-design-guidelines" agent skill from https://github.com/ehmo/platform-design-skills/tree/main/skills/ipados into .gemini/skills/ipados-design-guidelines/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ipados-design-guidelines", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install ehmo/platform-design-skills ipados-design-guidelinesInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add ehmo/platform-design-skills --skill ipados-design-guidelines -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ehmo/platform-design-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/ipados .github/skills/ipados-design-guidelines && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "ipados-design-guidelines" agent skill from https://github.com/ehmo/platform-design-skills/tree/main/skills/ipados into .github/skills/ipados-design-guidelines/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ipados-design-guidelines", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ehmo/platform-design-skills --skill ipados-design-guidelines -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ehmo/platform-design-skills ipados-design-guidelines --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ehmo/platform-design-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/ipados .opencode/skills/ipados-design-guidelines && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "ipados-design-guidelines" agent skill from https://github.com/ehmo/platform-design-skills/tree/main/skills/ipados into .opencode/skills/ipados-design-guidelines/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ipados-design-guidelines", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
ipados-design-guidelinesApple Human Interface Guidelines for iPad. An agent skill from ehmo/platform-design-skills.
Ipados Design Guidelines is an agent skill from ehmo/platform-design-skills. Apple Human Interface Guidelines for iPad. Use when building iPad-optimized interfaces, implementing multitasking, pointer support, keyboard shortcuts, or responsive layouts. Triggers on tasks involving iPad, Split View, Stage Manager, sidebar navigation, or trackpad support.
Its SKILL.md is about 6.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 4 other files (for example `AGENTS.md`, `metadata.json` and `rules/_sections.md`).
It sits in Frontend & Design, covering Responsive design and iOS development. It works with iOS. The repository describes itself as: Platform design skill pack: 300+ rules for Apple HIG, Material Design 3, and WCAG 2.2 across iOS, iPadOS, macOS, watchOS, visionOS, tvOS, Android, and Web. The licence is MIT.
9 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit dc2be82. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are swift).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Ipados Design Guidelines loads about 6.4k tokens when it runs. Until then it costs about 75 tokens; SKILL.md has 2,460 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from ehmo/platform-design-skills at commit dc2be82, republished under its MIT licence (© ehmo). 2,460 words, ~6,436 tokens.
.claude/skills/ipados-design-guidelines/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.Comprehensive rules for building iPad-native apps following Apple's Human Interface Guidelines. iPad is not a big iPhone -- it demands adaptive layouts, multitasking support, pointer interactions, keyboard shortcuts, and inter-app drag and drop. These rules extend iOS patterns for the larger, more capable canvas.
iPad presents two horizontal size classes: regular (full screen, large splits) and compact (Slide Over, narrow splits). Design for both. Never hardcode dimensions.
struct AdaptiveView: View {
@Environment(\.horizontalSizeClass) var sizeClass
var body: some View {
if sizeClass == .regular {
TwoColumnLayout()
} else {
StackedLayout()
}
}
}iPad layouts must be purpose-built. Stretching an iPhone layout across a 13" display wastes space and feels wrong. Use multi-column layouts, master-detail patterns, and increased information density in regular width.
Design for the full range: iPad Mini (8.3"), iPad (11"), iPad Air (11"/13"), and iPad Pro (11"/13"). Use flexible layouts that redistribute content rather than simply scaling.
In regular width, organize content into columns. Two-column is the most common (sidebar + detail). Three-column works for deep hierarchies (sidebar + list + detail). Avoid single-column full-width layouts on large screens.
struct ThreeColumnLayout: View {
var body: some View {
NavigationSplitView {
SidebarView()
} content: {
ContentListView()
} detail: {
DetailView()
}
}
}iPad safe areas differ from iPhone. Older iPads have no home indicator. iPads in landscape have different insets than portrait. Always use safeAreaInset and never hardcode padding for notches or indicators.
iPad apps must work well in both portrait and landscape. Landscape is the dominant orientation for productivity. Portrait is common for reading. Adapt column counts and layout density to orientation.
Your app must function correctly at 1/3, 1/2, and 2/3 screen widths in Split View. At 1/3 width, your app receives compact horizontal size class. Content must remain usable at every split ratio.
Slide Over presents your app as a compact-width overlay on the right edge. It behaves like an iPhone-width app. Ensure all functionality remains accessible in this narrow mode.
Stage Manager allows freely resizable windows and multiple windows simultaneously. Your app must:
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
// Support multiple windows
WindowGroup("Detail", for: Item.ID.self) { $itemId in
DetailView(itemId: itemId)
}
}
}The app may launch directly into Split View or Stage Manager. Do not depend on full-screen dimensions during setup, onboarding, or any flow. Test your app at every possible size.
When the user resizes via multitasking, animate layout changes smoothly. Preserve scroll position, selection state, and user context across size transitions. Never reload content on resize.
Use UIScene / SwiftUI WindowGroup to let users open multiple instances of your app showing different content. Each scene is independent. Support NSUserActivity for state restoration.
In regular width, replace the iPhone tab bar with a sidebar. The sidebar provides more room for navigation items, supports sections, and feels native on iPad.
struct AppNavigation: View {
@State private var selection: NavigationItem? = .inbox
var body: some View {
NavigationSplitView {
List(selection: $selection) {
Section("Main") {
Label("Inbox", systemImage: "tray")
.tag(NavigationItem.inbox)
Label("Drafts", systemImage: "doc")
.tag(NavigationItem.drafts)
Label("Sent", systemImage: "paperplane")
.tag(NavigationItem.sent)
}
Section("Labels") {
// Dynamic sections
}
}
.navigationTitle("Mail")
} detail: {
DetailView(for: selection)
}
}
}SwiftUI TabView with .sidebarAdaptable style automatically converts to a sidebar in regular width. Use this for seamless iPhone-to-iPad adaptation.
TabView {
Tab("Home", systemImage: "house") { HomeView() }
Tab("Search", systemImage: "magnifyingglass") { SearchView() }
Tab("Profile", systemImage: "person") { ProfileView() }
}
.tabViewStyle(.sidebarAdaptable)Use NavigationSplitView with three columns when your information architecture has three levels: category > list > detail. Examples: mail (accounts > messages > message), file managers, settings.
On iPad, toolbars live at the top of the screen in the navigation bar area, not at the bottom like iPhone. Place contextual actions in .toolbar with appropriate placement.
.toolbar {
ToolbarItemGroup(placement: .primaryAction) {
Button("Compose", systemImage: "square.and.pencil") { }
}
ToolbarItemGroup(placement: .secondaryAction) {
Button("Archive", systemImage: "archivebox") { }
Button("Delete", systemImage: "trash") { }
}
}When no item is selected in a list/sidebar, show a meaningful empty state in the detail area. Use a placeholder with icon and instruction text, not a blank screen.
Keep sidebar selection, search terms, and disclosure state visible and preserved across size changes and scene switches. In multi-column layouts, users should resume from structure on screen, not from memory.
All tappable elements should respond to pointer hover. The system provides automatic hover effects for standard controls. For custom views, use .hoverEffect().
Button("Action") { }
.hoverEffect(.highlight) // Subtle highlight on hover
// Custom hover effect
MyCustomView()
.hoverEffect(.lift) // Lifts and adds shadowThe pointer should snap to (be attracted toward) button bounds. Standard UIKit/SwiftUI buttons get this automatically. For custom hit targets, ensure the pointer region matches the tappable area using .contentShape().
Right-click (secondary click) should present context menus. Use .contextMenu which automatically supports both long-press (touch) and right-click (pointer).
Text(item.title)
.contextMenu {
Button("Copy", systemImage: "doc.on.doc") { }
Button("Share", systemImage: "square.and.arrow.up") { }
Divider()
Button("Delete", systemImage: "trash", role: .destructive) { }
}Support two-finger scrolling with momentum. Pinch to zoom where appropriate. Respect scroll direction preferences. For custom scroll views, ensure trackpad gestures feel natural alongside touch gestures.
Change cursor appearance based on context. Text areas show I-beam. Links show pointer hand. Resize handles show resize cursors. Draggable items show grab cursor.
Pointer users expect click-and-drag for rearranging, selecting, and moving content. Combine with multi-select via Shift-click and Cmd-click.
Every primary action must have a keyboard shortcut. Standard shortcuts are mandatory:
| Shortcut | Action |
|---|---|
| Cmd+N | New item |
| Cmd+F | Find/Search |
| Cmd+S | Save |
| Cmd+Z | Undo |
| Cmd+Shift+Z | Redo |
| Cmd+C/V/X | Copy/Paste/Cut |
| Cmd+A | Select all |
| Cmd+P | |
| Cmd+W | Close window/tab |
| Cmd+, | Settings/Preferences |
| Delete | Delete selected item |
Button("New Document") { createDocument() }
.keyboardShortcut("n", modifiers: .command)When the user holds the Cmd key, iPadOS shows a shortcut overlay. Register all shortcuts using .keyboardShortcut() so they appear in this overlay. Group related shortcuts logically.
Support Tab to move forward and Shift+Tab to move backward between form fields and focusable elements. Use .focusable() and @FocusState to manage keyboard focus order.
struct FormView: View {
@FocusState private var focusedField: Field?
var body: some View {
Form {
TextField("Name", text: $name)
.focused($focusedField, equals: .name)
TextField("Email", text: $email)
.focused($focusedField, equals: .email)
TextField("Phone", text: $phone)
.focused($focusedField, equals: .phone)
}
}
}Do not claim shortcuts reserved by the system: Cmd+H (Home), Cmd+Tab (App Switcher), Cmd+Space (Spotlight), Globe key combinations. These will not work and create confusion.
Adapt UI when a hardware keyboard is connected. Hide the on-screen keyboard shortcut bar. Show keyboard-optimized controls. Use GCKeyboard or track keyboard visibility to detect state.
Support arrow keys for navigating lists, grids, and collections. Combine with Shift for multi-selection. This is essential for productivity-focused apps.
Do not rely on users memorizing shortcut vocabularies. Expose commands through the Cmd-hold overlay, menu labels, and visible focus movement so people learn shortcuts by recognition and repetition.
iPadOS converts handwriting to text in any standard text field automatically. Do not disable Scribble. For custom text input, adopt UIScribbleInteraction. Test that Scribble works in all text entry points.
Apple Pencil 2 and later supports double-tap to switch tools (e.g., pen to eraser). If your app has drawing tools, implement the UIPencilInteraction delegate to handle double-tap.
For drawing apps, respond to force (pressure) and altitudeAngle/azimuthAngle (tilt) from pencil touch events. Use these for variable line width, opacity, or shading.
Apple Pencil with hover (M2 iPad Pro and later) provides position data before the pencil touches the screen. Use this for preview effects, tool size indicators, and enhanced precision.
// UIKit hover support via UIHoverGestureRecognizer
let hoverRecognizer = UIHoverGestureRecognizer(target: self, action: #selector(pencilHoverChanged(_:)))
hoverRecognizer.allowedTouchTypes = [NSNumber(value: UITouch.TouchType.pencil.rawValue)]
canvas.addGestureRecognizer(hoverRecognizer)
@objc func pencilHoverChanged(_ hover: UIHoverGestureRecognizer) {
let location = hover.location(in: canvas)
showBrushPreview(at: location)
}For note-taking and annotation, use PKCanvasView from PencilKit. It provides a full drawing experience with tool picker, undo, and ink recognition out of the box.
import PencilKit
struct DrawingView: UIViewRepresentable {
@Binding var canvasView: PKCanvasView
func makeUIView(context: Context) -> PKCanvasView {
canvasView.tool = PKInkingTool(.pen, color: .black, width: 5)
canvasView.drawingPolicy = .anyInput
return canvasView
}
}iPad users expect to drag content between apps. Support dragging content out (as a source) and dropping content in (as a destination). This is a core iPad interaction.
// As drag source
Text(item.title)
.draggable(item.title)
// As drop destination
DropTarget()
.dropDestination(for: String.self) { items, location in
handleDrop(items)
return true
}Users can pick up one item, then tap additional items to add them to the drag. Support multi-item drag by providing multiple NSItemProvider items. Show a badge count on the drag preview.
When dragging over a navigation element (folder, tab, sidebar item), pause briefly to "spring open" that destination. Implement spring-loading on navigation containers to enable deep drop targets.
Provide clear visual states:
Universal Control lets users drag between iPad and Mac. If your app supports drag and drop with standard NSItemProvider and UTTypes, Universal Control works automatically.
Use DropDelegate for fine-grained control over drop behavior: validating drop content, reordering within lists, and handling drop position.
struct ReorderDropDelegate: DropDelegate {
let item: Item
@Binding var items: [Item]
@Binding var draggedItem: Item?
func performDrop(info: DropInfo) -> Bool {
draggedItem = nil
return true
}
func dropEntered(info: DropInfo) {
guard let draggedItem,
let fromIndex = items.firstIndex(of: draggedItem),
let toIndex = items.firstIndex(of: item) else { return }
withAnimation {
items.move(fromOffsets: IndexSet(integer: fromIndex),
toOffset: toIndex > fromIndex ? toIndex + 1 : toIndex)
}
}
}When connected to an external display, show complementary content rather than duplicating the iPad screen. Presentations, reference material, or expanded views belong on the external display while controls stay on iPad.
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
// Additional scene for external display
WindowGroup(id: "presentation") {
PresentationView()
}
}
}Observe external display lifecycle via UIWindowScene events in your SceneDelegate or by listening for UIScene session notifications (UIApplication.didConnectSceneSessionNotification / UIApplication.didDisconnectSceneSessionNotification). Transition gracefully — if the external display disconnects mid-presentation, bring content back to the iPad screen without data loss.
// SceneDelegate: detect when a scene (external display window) connects or disconnects
func scene(_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = scene as? UIWindowScene else { return }
configureExternalDisplay(for: windowScene)
}
func sceneDidDisconnect(_ scene: UIScene) {
restoreContentToiPad()
}Use the full resolution and aspect ratio of the external display. Do not letterbox or pillarbox your content. In iOS 16+ multi-scene contexts, UIScreen.main is deprecated — query the connected display via UIWindowScene.coordinateSpace.bounds and UIWindowScene.screen.scale, or use @Environment(\.displayScale) in SwiftUI.
Impact: CRITICAL
Every button, control, and interactive element must have a meaningful accessibility label. Icon-only toolbar items and custom views must use .accessibilityLabel().
Correct:
Button(action: compose) {
Image(systemName: "square.and.pencil")
}
.accessibilityLabel("Compose new message")Incorrect:
Button(action: compose) {
Image(systemName: "square.and.pencil")
}
// VoiceOver reads "square.and.pencil" — meaningless to usersUse semantic text styles (title, body, caption) so text scales with the user's preferred size. In iPad's larger canvas, never clamp text size or disable scaling. Test up to the five accessibility size steps.
Text("Section Header")
.font(.headline) // Scales with Dynamic Type automaticallyHover states (.hoverEffect) enhance pointer input but must not be the sole indicator of interactivity. Ensure all interactive elements are also distinguishable via color, shape, or label for VoiceOver and keyboard-only users.
With Full Keyboard Access enabled, Tab must move focus through all interactive elements in logical order. In Split View and multi-window layouts, focus must not escape to a hidden or occluded window. Use @FocusState and .focusable() to control the keyboard focus graph.
struct FormView: View {
@FocusState private var focusedField: Field?
var body: some View {
VStack {
TextField("Name", text: $name)
.focused($focusedField, equals: .name)
TextField("Email", text: $email)
.focused($focusedField, equals: .email)
}
}
}In Split View, each app has its own VoiceOver focus context. Your app must not assume it occupies the full screen. Ensure VoiceOver can navigate your entire visible interface even at 1/3 or 1/2 split width. Do not hide actionable content outside the visible region without also removing it from the accessibility tree.
When the user enables Bold Text in Settings, custom-rendered text must adapt. SwiftUI text styles handle this automatically. UIKit code must check UIAccessibility.isBoldTextEnabled or use @Environment(\.legibilityWeight) in SwiftUI.
Correct:
// SwiftUI — handled automatically for standard text styles
Text("Section Header")
.font(.headline)
// SwiftUI — custom rendering respects legibilityWeight
@Environment(\.legibilityWeight) var legibilityWeight
var body: some View {
Text("Custom Label")
.fontWeight(legibilityWeight == .bold ? .bold : .regular)
}Incorrect:
// Hardcoded weight ignores Bold Text preference
label.font = UIFont.systemFont(ofSize: 17, weight: .regular)
// Missing: re-query font when UIAccessibility.boldTextStatusDidChangeNotification firesWhen the user enables Increase Contrast in Settings, custom colors must provide higher-contrast variants. Use @Environment(\.colorSchemeContrast) in SwiftUI or UIAccessibility.isDarkerSystemColorsEnabled in UIKit.
Correct:
// SwiftUI
@Environment(\.colorSchemeContrast) var contrast
var separatorColor: Color {
contrast == .increased ? Color.primary : Color.secondary
}
// UIKit
let useHighContrast = UIAccessibility.isDarkerSystemColorsEnabled
let borderColor: UIColor = useHighContrast ? .label : .separatorIncorrect:
// Static color ignores Increase Contrast setting
let borderColor = UIColor.separator // Always low-contrast; ignores user preferenceUse this checklist to verify iPad-readiness:
horizontalSizeClassUIAccessibility.isBoldTextEnabled)colorSchemeContrast or isDarkerSystemColorsEnabled)Stretching a single-column iPhone UI to fill an iPad screen wastes space, looks lazy, and provides a poor experience. Always redesign for the larger canvas.
Never opt out of multitasking support. Users expect every app to work in Split View and Slide Over. Requiring full screen is hostile to iPad workflows.
Many iPad users have Magic Keyboard or Smart Keyboard. An app with no keyboard shortcuts forces them to reach for the screen constantly. Provide shortcuts for all frequent actions.
Tab bars at the bottom waste vertical space on iPad and look out of place. Convert to sidebar navigation in regular width. SwiftUI does this automatically with .sidebarAdaptable.
On iPad, popovers should anchor to their source element as floating panels. Only use full-screen sheets for immersive content or flows that genuinely need the full screen. Avoid the iPhone pattern of everything being a sheet.
Missing hover effects make the app feel broken when using a trackpad. Users cannot tell what is interactive. Always add hover feedback to custom interactive elements.
Never hardcode widths, heights, or positions based on a specific iPad model. Use Auto Layout constraints, SwiftUI flexible frames, and GeometryReader for dynamic sizing.
On iPad, drag and drop between apps is a core workflow. Not supporting it makes your app a dead end for content. At minimum, support dragging text, images, and URLs in and out.
Claiming Cmd+H, Cmd+Tab, Cmd+Space, or Globe shortcuts will not work and confuses users who expect system behavior. Check Apple's reserved shortcuts list before assigning.
Large iPad screens tempt designers to show everything at once. Content should still scroll when it exceeds the visible area. Never truncate content to avoid scrolling.
© ehmo, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 3 other files in skills/ipados of ehmo/platform-design-skills.
Open the folder on GitHubat commit dc2be82
Ipados Design Guidelines next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Ipados Design Guidelines this skillehmo/platform-design-skills | 606 | — | ~6.4k | Automated safety check: Pass | MIT | |
| Iphone Duo Adaptive Layoutmirzaaghazadeh/iphone-duo-skills | 142 | — | ~2.8k | Automated safety check: Pass | Custom licence | |
| iOS Hig Design Guidedavepoon/buildwithclaude | 3.6k | — | ~735 | Automated safety check: Pass | MIT | |
| App Icon Generatorrshankras/claude-code-apple-skills | 783 | — | ~5.1k | Automated safety check: Notes | MIT | |
| Iphone Duo Design Reviewmirzaaghazadeh/iphone-duo-skills | 142 | — | ~2.2k | Automated safety check: Pass | Custom licence | |
| iOS Higjohnrogers/claude-swift-engineering | 231 | — | ~705 | Automated safety check: Pass | MIT |
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.
davepoon/buildwithclaude
Build, update, and apply iOS design specifications using Apple Human Interface Guidelines (HIG) source data.
rshankras/claude-code-apple-skills
Generates an app icon for macOS or iOS — a fast CoreGraphics placeholder and/or flat layered source art to finish in Icon Composer (the Liquid Glass / iOS 26+ standard).
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…
johnrogers/claude-swift-engineering
A skill your agent uses when designing iOS interfaces, implementing accessibility (VoiceOver, Dynamic Type), handling dark mode, ensuring adequate touch targets, providing animation/haptic feedback…
AnastasiyaW/codex-claude-code-config
Создание высококачественных, визуально выдающихся фронтенд-интерфейсов.
ehmo/platform-design-skills
Apple Human Interface Guidelines for Apple TV. An agent skill from ehmo/platform-design-skills.
ehmo/platform-design-skills
Apple Human Interface Guidelines for Mac. An agent skill from ehmo/platform-design-skills.
ehmo/platform-design-skills
Apple Human Interface Guidelines for Apple Watch. An agent skill from ehmo/platform-design-skills.
ehmo/platform-design-skills
Material Design 3 and Android platform guidelines. An agent skill from ehmo/platform-design-skills.
ehmo/platform-design-skills
Apple Human Interface Guidelines for iPhone. An agent skill from ehmo/platform-design-skills.
ehmo/platform-design-skills
Apple Human Interface Guidelines for Apple Vision Pro. An agent skill from ehmo/platform-design-skills.
Works with
Categories
Apple Human Interface Guidelines for iPad. An agent skill from ehmo/platform-design-skills. Ipados Design Guidelines is an agent skill from ehmo/platform-design-skills. Apple Human Interface Guidelines for iPad.
Ipados Design Guidelines fits situations like: building iPad-optimized interfaces; implementing multitasking; pointer support; keyboard shortcuts.
Run `npx skills add ehmo/platform-design-skills --skill ipados-design-guidelines -a claude-code`. Or copy the skill folder (skills/ipados in ehmo/platform-design-skills) into .claude/skills/ipados-design-guidelines in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ehmo/platform-design-skills --skill ipados-design-guidelines -a codex`. Or copy the skill folder (skills/ipados in ehmo/platform-design-skills) into .agents/skills/ipados-design-guidelines in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ehmo/platform-design-skills --skill ipados-design-guidelines -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ipados-design-guidelines, .gemini/skills/ipados-design-guidelines, .github/skills/ipados-design-guidelines and .opencode/skills/ipados-design-guidelines in your project.
SKILL.md names no scripts, command-line tools or credentials: Ipados Design Guidelines is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Ipados Design Guidelines is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.4k tokens (SKILL.md is roughly 26k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Ipados Design Guidelines: Iphone Duo Adaptive Layout (mirzaaghazadeh/iphone-duo-skills, 142 stars), iOS Hig Design Guide (davepoon/buildwithclaude, 3.6k stars), App Icon Generator (rshankras/claude-code-apple-skills, 783 stars) and Iphone Duo Design Review (mirzaaghazadeh/iphone-duo-skills, 142 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
ehmo (a GitHub user) maintains it in ehmo/platform-design-skills, which has 606 GitHub stars. The repository holds 8 skills in this directory. The repository was last updated on March 19, 2026.
Source: ehmo/platform-design-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.