plugins/mobile-apps/skills/preview-screens/SKILL.md
Use when the user wants to preview generated screens in a browser without starting Metro / a simulator — for example after /create-mobile-app finishes or after /edit-app regenerates a screen.
npx skillsauth add microsoft/power-platform-skills preview-screensInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Shared instructions: shared-instructions.md — read first.
Generates a self-contained HTML file that renders every screen in the app as a phone-frame mockup (375 × 812) with tab navigation and a dark/light toggle. The agent reads TSX files, understands the Tamagui component tree, and produces equivalent HTML/CSS — no programmatic TSX parsing.
npx expo start/edit-app; screen-builder is an internal agent invoked by orchestrator skillsDetermine the working directory:
$ARGUMENTS contains --working-dir <path>, use that.Validate the project:
Glob pattern="power.config.json" path="<working_dir>"
If missing, check for package.json. If neither exists, report the error and stop.
Read memory-bank.md if present to get the project name for the page title:
Grep pattern="^# " path="<working_dir>/memory-bank.md"
Fallback: read name from package.json.
Find all TSX files under the app directory:
Glob pattern="app/**/*.tsx" path="<working_dir>"
Exclude these patterns — they are not screens:
_layout.tsx (navigation layouts)+not-found.tsx (Expo Router error boundary).index.tsx at the app root if it only contains an auth redirect (read it to check)Derive screen names from file paths:
app/(app)/home.tsx → "Home"app/(app)/recipes/index.tsx → "Recipes"app/(app)/recipes/[id].tsx → "Recipe Detail"app/login.tsx → "Login"app/oauth-callback.tsx → skip (not a visible screen)If native-app-plan.md exists in the working directory, read its ## Screens section for human-friendly labels.
Build an ordered list: [ { path, screenName, screenId } ].
Default tab ordering — Home first, then two details, then the rest. Step 5 marks the first entry as active, so the order below directly controls which screen the user lands on when preview.html opens.
Sort the list with this priority:
app/(app)/home.tsx, app/(app)/index.tsx, app/(app)/dashboard.tsx, app/index.tsx (only if it's a real home screen — not the auth redirect you already filtered out in Step 2). If native-app-plan.md flags one screen as the home/landing screen, prefer that.[ and ] (e.g. app/(app)/recipes/[id].tsx, app/(app)/orders/[orderId]/edit.tsx). Take the first two in the order they were discovered (alphabetical by path is fine).If there are fewer than two detail screens, just include whatever exists and continue with the rest — do not pad with non-detail screens to force a count of 3.
Do not drop any screens — this rule only reorders. Every discovered screen still gets a tab.
Load the Tamagui-to-HTML mapping reference:
Read file_path="${CLAUDE_SKILL_DIR}/../../shared/references/tamagui-html-mapping.md"
Internalize:
Also check if the project has custom brand tokens:
Glob pattern="tamagui.config.ts" path="<working_dir>"
If found, read it and extract any custom color tokens (look for tokens: { color: { ... } }). Add them as additional CSS custom properties in the generated HTML.
Print before starting:
"→ Reading + converting <N> screens to HTML/CSS (one print per screen as I go)."
For each screen in the ordered list from Step 2:
Read the full TSX file.
Identify the component tree. Walk the JSX return statement and note every Tamagui component, its props, and its children.
Generate equivalent HTML/CSS using the mapping from Step 3:
YStack → <div style="display:flex; flex-direction:column; ...">flex={1} → flex:1, bg="$color2" → background:var(--color2), etc.)p="$4" → padding:16px)<Ionicons name="..." /> icons with Unicode equivalents (see mapping reference Section 3, Guideline 4 — the icon substitution table uses Ionicons names)Handle dynamic content:
.map() over arrays → generate 3–4 representative placeholder itemsuseQuery / useMutation → show the populated state only (skip loading/error branches)defaultValues → pre-fill inputs with those valuesNative PDF/pen controls need honest static approximations:
Stored in Evidence PDF File or On-device share only), and a disabled View PDF button. If the source URL is not visibly HTTPS, label it Preview unavailable in browser rather than showing a fake viewer.Uploads to Evidence PDF File. Do not embed a browser PDF iframe or imply the native viewer runs in preview.Stored in Signature Image or Uploads to Signature File.Produce a <div class="screen" id="screen-{screenId}"> wrapping the converted HTML.
Use inline styles on elements. Keep each screen's HTML self-contained (no shared CSS classes between screens, except the theme variables).
Use the phone frame template from the mapping reference (Section 4) as the outer shell.
Replace the placeholders:
{{APP_NAME}} — project name from Step 1{{TABS}} — one <button class="tab" ...> per screen, first tab gets class active{{SCREENS}} — all screen <div> blocks from Step 4, first screen gets class activeIf the project has custom brand tokens (from Step 3), add them to the :root CSS block.
Write file_path="<working_dir>/preview.html"
Print confirmation:
✅ Preview generated: <working_dir>/preview.html
Screens: <N> (<comma-separated list of screen names>)
Toggle: dark/light mode button in top-right
Do NOT prompt. The visual_companion flag in <working_dir>/memory-bank.md already encodes the answer; asking again is redundant. The flag is set by /design-system (Step 6.75) during project creation, or defaults to yes if /design-system was not run.
Read the flag and act:
grep -E "^visual_companion:[[:space:]]*(yes|no)" "<working_dir>/memory-bank.md" 2>/dev/null
| Flag | Action |
|---|---|
| visual_companion: no | Print the link and stop. Do not auto-open. |
| visual_companion: yes (or missing memory-bank, or standalone invocation) | Print the link, then auto-open. |
visual_companion: no — print:
"Preview is at:
file://<working_dir>/preview.html(Visual Companion off — open manually.)"
Otherwise — print the link AND auto-open in one breath, no prompt:
"Preview is at:
file://<working_dir>/preview.html— opening now."
Then try OS-appropriate openers in sequence and fall back to printing the link if none work:
open "<working_dir>/preview.html" 2>/dev/null \
|| xdg-open "<working_dir>/preview.html" 2>/dev/null \
|| powershell.exe -NoProfile -Command "Start-Process '<working_dir>\preview.html'" 2>/dev/null \
|| echo "Could not auto-open. Open this URL in your browser: file://<working_dir>/preview.html"
open is macOS-only; the chain covers Linux (xdg-open) and Windows / WSL (powershell.exe Start-Process). On headless / SSH sessions all three fail silently and the user just opens the link they were already given.
preview.html — it never modifies TSX files, layouts, configs, or the memory bank./preview-screens overwrites the previous preview.html.tools
Adds Work IQ (M365 Copilot Search) to a Power Apps code app via the Work IQ Copilot MCP connector (shared_a365copilotchatmcp), then wires up a production-ready McpSession wrapper for AI-powered, knowledge-grounded search and chat. Use when integrating Microsoft 365 Copilot search/chat. The CopilotChat tool searches internal Microsoft 365 content (documents, emails, chats, sites, files) across your organization — prefer workload-specific tools (SharePoint, OneDrive, Teams, Mail) when the workload is explicit; do not use it for general knowledge, news, public web, or external information.
development
Use when the user wants to iterate on an existing generated Power Apps mobile app after /create-mobile-app: update the plan, data model, native capabilities, design, screens, generated app code, and preview without restarting the full project flow.
development
Creates and manages the brand design system for a Power Apps mobile app. Generates brand/design-system.md (source of truth), brand/tokens.ts (importable Tamagui tokens), and brand/design-system.html (visual gallery). Triggered at Step 6.5 of /create-mobile-app, or standalone via /design-system.
development
Use when the user wants to start a new Power Apps mobile app (Expo / React Native / TypeScript, targeting iOS and Android) from scratch.