-
Notifications
You must be signed in to change notification settings - Fork 0
Docs/refine apple design skills #3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
3396aab
6564a8e
16fbe54
20cf213
21007cb
f02999a
1b82799
18b3670
cdfe7df
77aafb2
8a755e5
57e7746
34c98f4
7977ec0
2c657e5
fa021f6
e5564e9
9f59eeb
5f23dbb
66160ea
7786a22
db75b2b
2b5134b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,131 @@ | ||
| # Homepage recipe — anatomy, real screenshots, verification | ||
|
|
||
| This reference is the complete homepage spec — self-contained, with no | ||
| external checkout required before building. Structure, tokens, and workflow | ||
| stay identical across products; only frontmatter content changes. A consumer | ||
| example may exist at `GroupTripMoney/web/` where that checkout is available; | ||
| it is optional and illustrative only, never the source of truth. | ||
|
|
||
| ## Homepage anatomy (section order) | ||
|
|
||
| All copy lives in frontmatter `as const` arrays at the top of | ||
| `src/pages/index.astro` (`screens`, `benefits`, `testimonialPlaceholders`, | ||
| `pricingPoints`, `faqs`) so the next product swap only edits data. | ||
|
|
||
| 1. **Hero** — eyebrow, `h1.display-title` (two short lines), `.lede`, CTA | ||
| trio, CSS device mockup right. | ||
| CTA trio: status pill (`span.btn.btn-coming-soon`, `role="status"`, | ||
| `aria-describedby` → microcopy note), `a.btn.btn-secondary[href="#screens"]` | ||
| "See it in action", text link to `/help/`. | ||
| 2. **Trust strip** — thin divider + centered row of three privacy/product | ||
| promises that match the app's real behavior. | ||
| 3. **Screenshot gallery** (`id="screens"`) — exactly 4 real captures, one | ||
| per main app screen. Mobile: horizontal | ||
| `snap-x snap-mandatory` scroll, `w-[72vw] max-w-[16.5rem]` cards; `sm+`: | ||
| `grid sm:grid-cols-2 lg:grid-cols-4`. Each item: `figure` → rounded frame | ||
| (`rounded-[1.4rem] ring-1 ring-black/10 shadow-soft`) → `img` | ||
| (`width="640" height="1391"`, `loading="lazy"`, descriptive `alt`) → | ||
| `figcaption` (bold title + muted caption). Never CSS illustrations here — | ||
| only captures of the real app. | ||
| 4. **Benefits** — full-bleed `#efeff1` band, `ul.grid sm:grid-cols-2 | ||
| lg:grid-cols-3` of 6 cards (`rounded-[1.25rem] border border-line | ||
| bg-surface p-6 shadow-soft`) with uppercase kicker, `h3`, muted body. | ||
| One benefit per real capability. | ||
| 5. **Clarity / product visual** — two-column grid; calm diagram card | ||
| (flat cards, `shadow-soft`, no stickers/gradients) + copy + short bullet | ||
| list with 5px ink dot markers. | ||
| 6. **Social proof placeholders** — full-bleed band, `md:grid-cols-3` quote | ||
| cards: `blockquote` in curly quotes + `footer` with 36px initials avatar | ||
| (soft pastel bg), name, context line. Pre-launch: array is | ||
| `testimonialPlaceholders` with a `// PLACEHOLDER` comment — never present | ||
| invented people as real customers. | ||
| 7. **Pricing** — centered; one card (`max-w-md`, `rounded-[1.5rem]`, | ||
| `p-8 md:p-10`) with app name + "Free" (or real price), border-t bullet | ||
| list with ink dots, full-width coming-soon status pill, microcopy. Only | ||
| state pricing facts the product really has. | ||
| 8. **FAQ** — `max-w-3xl border-t border-line` list of 5 native | ||
| `details.faq-item` rows (`border-b border-line`, `+`/`−` circle | ||
| indicators), plus a muted line linking `/help/`. Answers describe the | ||
| app's real behavior (accounts? money movement? storage? launch timing). | ||
| 9. **Final CTA / privacy band** — dark `bg-night rounded-[1.5rem]` panel: | ||
| eyebrow + `h2` (product promise), body combining privacy posture + launch | ||
| status (`#a1a1a6`), right column with `a.btn.btn-on-dark` | ||
| → `#screens` and underline link → `/privacy/`. | ||
|
|
||
| Section rhythm: page canvas (`#f5f5f7`) alternating with full-bleed | ||
| `#efeff1` bands; `py-24 md:py-32` section padding; `site-shell` | ||
| (`min(1120px, calc(100% - 2.5rem))`). | ||
|
|
||
| ## Honesty conventions | ||
|
|
||
| - Pre-launch CTAs are **status controls**, not fake buttons: `role="status"` | ||
| + `aria-describedby` + microcopy ("The App Store listing is not available | ||
| yet."). No dead App Store links. | ||
| - Social proof is placeholder data until real users exist, marked in code. | ||
| - Every claim traces to something the app actually does — read the app | ||
| source first; never invent features, pricing, or privacy posture. | ||
|
|
||
| ## Capturing real screenshots | ||
|
|
||
| Fixture mode first: launch the app with its fixture launch argument (e.g. | ||
| `-useFixtureData` seeding an in-memory container) via XcodeBuildMCP | ||
| (`build_run_sim` with `launchArgs`). Then drive navigation with a throwaway | ||
| Maestro flow in `/tmp` — never the repo's committed `.maestro/` suite: | ||
|
Comment on lines
+70
to
+73
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
This recipe is mandatory for the marketing-site skill, which is advertised for iOS or macOS apps, but the real-screenshot path only tells agents to launch with AGENTS.md reference: AGENTS.md:L3-L3 Useful? React with 👍 / 👎. |
||
|
|
||
| - Do **not** include `launchApp` in the flow: Maestro restarts the app and | ||
| its `arguments:` map does not reproduce `-useFixtureData` on iOS, so the | ||
| app relaunches without fixtures. Drive the already-running app. | ||
| - `assertVisible` only text guaranteed on screen (below-fold assertions | ||
| fail); scroll first (`swipe: {direction: UP}`) for below-fold shots. | ||
| - Tap rows/buttons by text; tap tab bars by percentage points across the | ||
| bar at ~94% height (e.g. 17% / 50% / 83% for a three-tab bar). Toolbar | ||
| buttons exist only on the screen that owns them — inspect the current | ||
| screen before tapping. | ||
| - Maestro terminates the app between runs: one flow covering every screen, | ||
| or relaunch with fixtures before each flow. | ||
| - Assert distinctive text on every screen before screenshotting; names on | ||
| `takeScreenshot` map to content. | ||
|
|
||
| Downscale to 640px wide into `web/public/screenshots/`: | ||
| `sips --resampleWidth 640 shot.png --out web/public/screenshots/name.png` | ||
| (optionally `xcrun simctl io booted screenshot /tmp/x.png` for full-res). | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
For a consumer whose raw-Xcode-tooling policy is AGENTS.md reference: AGENTS.md:L13-L13 Useful? React with 👍 / 👎. |
||
| Delete unused captures; register each in the `screens` array. | ||
|
|
||
| ## Verification pass (mandatory) | ||
|
|
||
| 1. `cd web && npm run build` — all routes emit, no errors. | ||
| 2. `npm run preview -- --port 4321`; every route and asset returns 200 | ||
| (`/`, `/help/`, `/support/`, `/privacy/`, `/terms/`, screenshots, favicon). | ||
| 3. Browser automation (agent-browser CLI or equivalent): desktop 1440×900 — | ||
| no console/page errors; no horizontal overflow | ||
| (`document.documentElement.scrollWidth <= innerWidth`); **every link** | ||
| clicked (scroll the element into view first — below-fold clicks miss), | ||
| URLs/hashes confirmed; support form: empty submit shows per-field errors | ||
| and focuses the first invalid field, valid submit reveals the toast and a | ||
| correctly built `mailto:` href; help search filters with result count and | ||
| empty state; FAQ `<details>` toggles; skip link (Tab → Enter → `#main`); | ||
| `img` naturalWidth > 0 with non-empty `alt`; heading order h1→h2→h3 | ||
| without jumps; `role="status"` pills present. | ||
| 4. Mobile 390×844 (plus the 320px minimum width): overflow still false | ||
| (gallery scrolls internally); menu | ||
| toggle sets `aria-expanded` and a nav link closes it. | ||
| 5. Full-page screenshots at both widths; if the model cannot view images, | ||
| pixel-sample the PNGs (canvas `#f5f5f7`, bands `#efeff1`, night | ||
| `#1d1d1f`, white cards) to confirm sections render. | ||
| 6. Re-sweep all routes for console errors; commit only intended files | ||
| (revert incidental lockfile churn). | ||
|
|
||
| Regenerate screenshots whenever the app UI changes — stale captures are | ||
| worse than none. | ||
|
|
||
| ## Per-project swap table | ||
|
|
||
| | What changes | Where | | ||
| | --- | --- | | ||
| | Product name, domain, support email | `astro.config.mjs`, `BaseLayout` meta, `Header`/`Footer`, `SupportForm` address | | ||
| | Screenshots | recapture from THIS app | | ||
| | Reviews / social proof | `testimonialPlaceholders` array | | ||
| | Hero, benefits, FAQ, pricing copy | frontmatter arrays on `index.astro` | | ||
| | Privacy / trust claims | `TrustStrip`, final band — match real posture | | ||
| | Phone mockup content | `PhoneMockup.astro` (illustrative) | | ||
| | Favicon / brand mark | `public/favicon.*`, `BrandMark.astro` | | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -11,6 +11,11 @@ or comparison is explicitly requested. | |
|
|
||
| ## Procedure | ||
|
|
||
| Read [skill sync](../../../docs/reference/skill-sync.mdx) before trusting this | ||
| repository's installed skills for any routing decision. In an autonomous session | ||
| with no human present, first reconcile installed skills against HEAD with | ||
| `./Scripts/install-skills.sh --status` and re-sync before routing on divergence. | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
When the globally installed router is invoked from a consumer repository without its own AGENTS.md reference: AGENTS.md:L28-L30 Useful? React with 👍 / 👎. |
||
|
|
||
| 1. Read [master-skill.json](master-skill.json) as the machine-readable catalog. | ||
| 2. Use its IDs, roles, and purposes to shortlist only the children relevant to | ||
| the request. Do not scan the repository, audit inventories, install skills, | ||
|
|
@@ -39,3 +44,6 @@ override their exclusions, install global files, or claim automatic activation. | |
| For host-local skills that compete with this catalog (generic macOS development | ||
| guides, design-only skills, and similar), see | ||
| [references/competing-macos-skills-plan.md](references/competing-macos-skills-plan.md). | ||
| For Liquid Glass, animation polish, and motion-audit routing (foundation first, | ||
| host depth only if needed), see | ||
| [references/design-motion-glass-routing.md](references/design-motion-glass-routing.md). | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For an app with fewer or more than four primary screens, the mandatory recipe's requirement for exactly four captures while also demanding one per main screen is impossible to follow truthfully: consumers must either omit real surfaces or fabricate/duplicate captures. Derive the gallery size from the actual app rather than fixing it at four so the skill remains reusable across consumer products.
AGENTS.md reference: AGENTS.md:L12-L12
Useful? React with 👍 / 👎.