import type { DesignSkill } from "./design-skill.js"; export const mobileApp: DesignSkill = { name: "mobile-app", scenario: "design", description: "Mobile app prototype. Phone-frame-contained HTML with iOS/Android patterns, touch targets, and native-feel interactions.", outputKind: "html", workflow: `# Mobile App Prototype Skill Produce a mobile app prototype as a single HTML file. Phone-frame contained, touch-friendly, native-feel interactions. ## Phase 0 — Pre-flight 1. Read the design system for color tokens. 2. Determine: app name, screens needed (2-5), platform style (iOS or Material). 3. Vocalize: "I'll build [app name] with [N] screens: [screen names]. [iOS/Material] patterns." ## Phase 1 — Shell with Phone Frame Create \`app.html\` with a phone frame wrapper: \`\`\`html App Name
9:41 ●●●○ WiFi ▮▮▮
\`\`\` ## Phase 2 — Component Patterns ### List Item (44px minimum tap target) \`\`\`css .list-item { display: flex; align-items: center; padding: 12px 16px; min-height: 44px; gap: 12px; border-bottom: 0.5px solid var(--color-border); cursor: pointer; } .list-item:active { background: var(--color-bg-hover, rgba(0,0,0,0.04)); } .list-item-icon { width: 40px; height: 40px; border-radius: 10px; background: var(--color-accent); display: flex; align-items: center; justify-content: center; color: white; font-size: 18px; } .list-item-content { flex: 1; } .list-item-title { font-size: 16px; font-weight: 500; } .list-item-subtitle { font-size: 14px; color: var(--color-text-secondary); margin-top: 2px; } .list-item-trailing { color: var(--color-text-secondary); font-size: 14px; } \`\`\` ### Card \`\`\`css .card { background: var(--color-bg-surface, #fff); border-radius: 16px; padding: 16px; margin: 8px 16px; box-shadow: 0 1px 3px rgba(0,0,0,0.08); } .card-image { width: 100%; height: 180px; border-radius: 12px; object-fit: cover; background: var(--color-bg-secondary); } .card-title { font-size: 17px; font-weight: 600; margin: 12px 0 4px; } .card-subtitle { font-size: 14px; color: var(--color-text-secondary); } \`\`\` ### Input Field \`\`\`css .input-group { padding: 8px 16px; } .input-label { font-size: 13px; color: var(--color-text-secondary); margin-bottom: 4px; display: block; } .input-field { width: 100%; height: 44px; padding: 0 12px; border: 1px solid var(--color-border); border-radius: 10px; font-size: 16px; background: var(--color-bg-secondary, #f5f5f5); outline: none; } .input-field:focus { border-color: var(--color-accent); } \`\`\` ### Button \`\`\`css .btn { display: flex; align-items: center; justify-content: center; height: 50px; padding: 0 24px; border-radius: 14px; font-size: 17px; font-weight: 600; border: none; cursor: pointer; margin: 8px 16px; user-select: none; } .btn-primary { background: var(--color-accent); color: #fff; } .btn-secondary { background: var(--color-bg-secondary, #f0f0f0); color: var(--color-text-primary); } .btn:active { opacity: 0.8; transform: scale(0.98); } \`\`\` ## Phase 3 — Mobile-Specific Rules - Minimum touch target: 44×44px - Font sizes: 13px (captions), 15px (body), 17px (headlines), 22px (titles), 28px (hero) - Padding: 16px horizontal standard, 8-16px card margins - Never use hover effects — use :active for tap feedback - Scrollable content uses \`overflow-y: auto; -webkit-overflow-scrolling: touch;\` - Status bar: 54px height standard, dark or light based on design system - Bottom safe area: 34px for home indicator - Images: use \`object-fit: cover\` with fixed aspect ratios, gradient placeholders - No hamburger menus — use tab bar navigation (3-5 items)`, };