@open-assets/open-assets 0.1.10 → 0.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +113 -94
- package/bin/open-assets.mjs +133 -320
- package/lib/add.mjs +476 -0
- package/lib/init.mjs +215 -107
- package/lib/list.mjs +66 -0
- package/lib/lockfile.mjs +1 -1
- package/lib/manifest.mjs +125 -0
- package/lib/render.mjs +206 -0
- package/lib/renderer.mjs +19 -5
- package/lib/server.mjs +14 -4
- package/lib/validate.mjs +90 -0
- package/package.json +10 -1
- package/public/img/banner/1280/banner.png +0 -0
- package/public/img/icon/16/icon.png +0 -0
- package/public/img/icon/180/icon.png +0 -0
- package/public/img/icon/192/icon.png +0 -0
- package/public/img/icon/32/icon.png +0 -0
- package/public/img/icon/512/icon.png +0 -0
- package/public/viewer.html +28 -25
- package/skills/open-assets/SKILL.md +544 -0
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: open-assets
|
|
3
|
+
description: Generate and manage app marketing assets (screenshots, icons, logos) using HTML/Tailwind with open-assets
|
|
4
|
+
user-invocable: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## open-assets
|
|
8
|
+
|
|
9
|
+
open-assets is a dev server and export tool for app marketing assets — screenshots, icons, logos, OG images, favicons, and more — designed as HTML/CSS/SVG files rendered to PNG via Puppeteer. Think Storybook, but for marketing assets.
|
|
10
|
+
|
|
11
|
+
## Running
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Start dev server (preview + export UI)
|
|
15
|
+
open-assets dev
|
|
16
|
+
|
|
17
|
+
# Or with Tailwind
|
|
18
|
+
concurrently "npx @tailwindcss/cli -i src/styles.css -o dist/styles.css --watch" "open-assets dev"
|
|
19
|
+
|
|
20
|
+
# Headless render
|
|
21
|
+
open-assets render --collection screenshots --size iphone-6.9
|
|
22
|
+
open-assets render --collection icon --all
|
|
23
|
+
open-assets render --all
|
|
24
|
+
open-assets render --template 01-hero --all
|
|
25
|
+
open-assets render --force # ignore cache, re-render everything
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Concepts
|
|
29
|
+
|
|
30
|
+
| Term | Definition |
|
|
31
|
+
|------|-----------|
|
|
32
|
+
| **Collection** | A named group of related assets sharing the same source size and export sizes. One tab in the dev UI. |
|
|
33
|
+
| **Template** | A single source file (HTML or SVG) that produces one image per export size. |
|
|
34
|
+
| **Export Size** | A named output dimension that templates are rendered at (e.g., "iPhone 6.9" → 1320×2868). |
|
|
35
|
+
| **Source Size** | The dimensions the HTML template is authored at. Puppeteer scales from source → export size. |
|
|
36
|
+
| **Output** | An optional post-render action (e.g., write to Xcode `.appiconset`, copy SVG source). |
|
|
37
|
+
|
|
38
|
+
## assets.json
|
|
39
|
+
|
|
40
|
+
The `assets.json` at the project root defines all asset collections. All collections follow the same unified schema — no `type` field needed.
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"version": 1,
|
|
45
|
+
"name": "App Display Name",
|
|
46
|
+
"publicDir": "public",
|
|
47
|
+
"command": "npx open-assets render --all",
|
|
48
|
+
"collections": [
|
|
49
|
+
{
|
|
50
|
+
"id": "unique-id",
|
|
51
|
+
"label": "Tab Label",
|
|
52
|
+
"sourceSize": { "width": 440, "height": 956 },
|
|
53
|
+
"borderRadius": 4,
|
|
54
|
+
"templates": [
|
|
55
|
+
{ "src": "src/screenshots/01-hero.html", "name": "01-hero", "label": "Hero" }
|
|
56
|
+
],
|
|
57
|
+
"export": [
|
|
58
|
+
{ "name": "iphone-6.9", "label": "iPhone 6.9\"", "size": { "width": 1320, "height": 2868 } }
|
|
59
|
+
],
|
|
60
|
+
"outputs": [],
|
|
61
|
+
"customExport": { "defaultWidth": 1320, "defaultHeight": 2868 }
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Collection Fields
|
|
68
|
+
|
|
69
|
+
| Field | Type | Description |
|
|
70
|
+
|-------|------|-------------|
|
|
71
|
+
| `id` | string | Unique identifier (used in CLI `--collection`) |
|
|
72
|
+
| `label` | string | Display name in UI |
|
|
73
|
+
| `sourceSize` | object | `{ width, height }` — dimensions templates are authored at |
|
|
74
|
+
| `borderRadius` | number | Border radius for preview frames (px) |
|
|
75
|
+
| `templates` | array | Source files: `{ src, name, label }` |
|
|
76
|
+
| `export` | array | Export sizes: `[{ name, label, size: { width, height }, outFile? }]` |
|
|
77
|
+
| `outputs` | array | Post-render actions (optional) |
|
|
78
|
+
| `customExport` | object | Custom size defaults for UI (optional) |
|
|
79
|
+
|
|
80
|
+
### Output Types
|
|
81
|
+
|
|
82
|
+
| Type | Config | Description |
|
|
83
|
+
|------|--------|-------------|
|
|
84
|
+
| `xcode` | `{ "type": "xcode", "path": "..." }` | Render icon and write to Xcode asset catalog |
|
|
85
|
+
| `copy-source` | `{ "type": "copy-source", "format": "svg" }` | Copy source files to export directory |
|
|
86
|
+
|
|
87
|
+
### Example Collections
|
|
88
|
+
|
|
89
|
+
**Screenshots** (many templates × many device sizes):
|
|
90
|
+
```json
|
|
91
|
+
{
|
|
92
|
+
"id": "screenshots",
|
|
93
|
+
"label": "App Store Screenshots",
|
|
94
|
+
"sourceSize": { "width": 440, "height": 956 },
|
|
95
|
+
"borderRadius": 4,
|
|
96
|
+
"templates": [
|
|
97
|
+
{ "src": "src/screenshots/01-hero.html", "name": "01-hero", "label": "Hero" },
|
|
98
|
+
{ "src": "src/screenshots/02-features.html", "name": "02-features", "label": "Features" }
|
|
99
|
+
],
|
|
100
|
+
"export": [
|
|
101
|
+
{ "name": "iphone-6.9", "label": "iPhone 6.9\"", "size": { "width": 1320, "height": 2868 } },
|
|
102
|
+
{ "name": "iphone-6.7", "label": "iPhone 6.7\"", "size": { "width": 1290, "height": 2796 } }
|
|
103
|
+
]
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**App Icon** (1 template × many sizes + Xcode):
|
|
108
|
+
```json
|
|
109
|
+
{
|
|
110
|
+
"id": "icon",
|
|
111
|
+
"label": "App Icon",
|
|
112
|
+
"sourceSize": { "width": 1024, "height": 1024 },
|
|
113
|
+
"borderRadius": 224,
|
|
114
|
+
"templates": [
|
|
115
|
+
{ "src": "src/icon.html", "name": "icon", "label": "App Icon" }
|
|
116
|
+
],
|
|
117
|
+
"export": [
|
|
118
|
+
{ "name": "1024", "label": "1024px", "size": { "width": 1024, "height": 1024 } },
|
|
119
|
+
{ "name": "180", "label": "180px", "size": { "width": 180, "height": 180 } }
|
|
120
|
+
],
|
|
121
|
+
"outputs": [{ "type": "xcode", "path": "../MyApp/Assets.xcassets/AppIcon.appiconset" }]
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
**Icon Explorations** (multiple concept variants):
|
|
126
|
+
```json
|
|
127
|
+
{
|
|
128
|
+
"id": "icon-explorations",
|
|
129
|
+
"label": "Icon Explorations",
|
|
130
|
+
"sourceSize": { "width": 1024, "height": 1024 },
|
|
131
|
+
"borderRadius": 224,
|
|
132
|
+
"templates": [
|
|
133
|
+
{ "src": "src/icons/concept-a.html", "name": "concept-a", "label": "Concept A" },
|
|
134
|
+
{ "src": "src/icons/concept-b.html", "name": "concept-b", "label": "Concept B" }
|
|
135
|
+
],
|
|
136
|
+
"export": [
|
|
137
|
+
{ "name": "1024", "label": "1024px", "size": { "width": 1024, "height": 1024 } }
|
|
138
|
+
]
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**Logo** (SVG variants + source copy):
|
|
143
|
+
```json
|
|
144
|
+
{
|
|
145
|
+
"id": "logo",
|
|
146
|
+
"label": "Logo",
|
|
147
|
+
"sourceSize": { "width": 940, "height": 940 },
|
|
148
|
+
"templates": [
|
|
149
|
+
{ "src": "src/logo.svg", "name": "logo", "label": "Logo" },
|
|
150
|
+
{ "src": "src/logo-dark.svg", "name": "logo-dark", "label": "Dark" }
|
|
151
|
+
],
|
|
152
|
+
"export": [
|
|
153
|
+
{ "name": "1024", "label": "1024px", "size": { "width": 1024, "height": 1024 } },
|
|
154
|
+
{ "name": "512", "label": "512px", "size": { "width": 512, "height": 512 } }
|
|
155
|
+
],
|
|
156
|
+
"outputs": [{ "type": "copy-source", "format": "svg" }]
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
**OG Images** (social cards):
|
|
161
|
+
```json
|
|
162
|
+
{
|
|
163
|
+
"id": "og-images",
|
|
164
|
+
"label": "Social Cards",
|
|
165
|
+
"sourceSize": { "width": 1200, "height": 630 },
|
|
166
|
+
"templates": [
|
|
167
|
+
{ "src": "src/og/default.html", "name": "default", "label": "Default OG" }
|
|
168
|
+
],
|
|
169
|
+
"export": [
|
|
170
|
+
{ "name": "og", "label": "OG Image", "size": { "width": 1200, "height": 630 } }
|
|
171
|
+
]
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## CLI Reference
|
|
176
|
+
|
|
177
|
+
### All commands
|
|
178
|
+
|
|
179
|
+
| Command | Description |
|
|
180
|
+
|---------|-------------|
|
|
181
|
+
| `open-assets dev [dir]` | Start dev server with live preview and export UI |
|
|
182
|
+
| `open-assets render [dir]` | Render assets headlessly via CLI |
|
|
183
|
+
| `open-assets list [dir]` | List all collections and templates in the config |
|
|
184
|
+
| `open-assets validate [dir]` | Validate assets.json and check referenced files exist |
|
|
185
|
+
| `open-assets init [dir]` | Scaffold a new assets.json and example assets |
|
|
186
|
+
| `open-assets add collection [dir]` | Add a new collection (from presets or custom) |
|
|
187
|
+
| `open-assets add template [dir]` | Add a new template to an existing collection |
|
|
188
|
+
| `open-assets add size [dir]` | Add an export size to a collection |
|
|
189
|
+
| `open-assets skills [dir]` | Install Claude Code skills into a project |
|
|
190
|
+
|
|
191
|
+
### render command flags
|
|
192
|
+
|
|
193
|
+
| Flag | Description |
|
|
194
|
+
|------|-------------|
|
|
195
|
+
| `--collection <id>` | Render only the collection with this ID |
|
|
196
|
+
| `--template <name>` | Render only the template with this name |
|
|
197
|
+
| `--size <name>` | Use a named export size from config |
|
|
198
|
+
| `--all` | Export at every size defined in the config |
|
|
199
|
+
| `--force` | Re-render all assets even if unchanged |
|
|
200
|
+
| `-o, --output <dir>` | Output directory (default: `./exports`) |
|
|
201
|
+
| `--json` | Output results as JSON |
|
|
202
|
+
| `-q, --quiet` | Suppress progress logs |
|
|
203
|
+
|
|
204
|
+
Flags compose naturally:
|
|
205
|
+
- `--collection screenshots --template 01-hero --size iphone-6.9` → single template, single size
|
|
206
|
+
- `--collection screenshots --template 01-hero --all` → one template, all sizes
|
|
207
|
+
- `--collection screenshots --size iphone-6.9` → all templates, one size
|
|
208
|
+
|
|
209
|
+
### add commands
|
|
210
|
+
|
|
211
|
+
Interactive commands for managing the config without editing JSON by hand. All support `--config <path>` for custom config filenames.
|
|
212
|
+
|
|
213
|
+
#### `open-assets add collection`
|
|
214
|
+
|
|
215
|
+
Add a new asset collection. Choose from presets or configure custom dimensions and format.
|
|
216
|
+
|
|
217
|
+
**Presets:**
|
|
218
|
+
| Preset | Source Size | Format |
|
|
219
|
+
|--------|-----------|--------|
|
|
220
|
+
| App Store Screenshots | 440x956 | HTML |
|
|
221
|
+
| App Icon | 1024x1024 | HTML |
|
|
222
|
+
| Logo | 800x800 | SVG |
|
|
223
|
+
| Wordmark | 1200x400 | SVG |
|
|
224
|
+
| Feature Graphic (Google Play) | 1024x500 | HTML |
|
|
225
|
+
| OG Image / Social | 1200x630 | HTML |
|
|
226
|
+
| Custom | user-defined | HTML or SVG |
|
|
227
|
+
|
|
228
|
+
Creates a starter template file and adds the collection to `assets.json` with appropriate export sizes.
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
open-assets add collection # interactive preset picker
|
|
232
|
+
open-assets add collection ./my-assets # in a specific directory
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
#### `open-assets add template`
|
|
236
|
+
|
|
237
|
+
Add a new template (HTML or SVG) to an existing collection. Prompts for which collection, template name/label, and format. Creates the source file in the same directory as the collection's existing templates.
|
|
238
|
+
|
|
239
|
+
```bash
|
|
240
|
+
open-assets add template # interactive
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
#### `open-assets add size`
|
|
244
|
+
|
|
245
|
+
Add an export size to a collection. Choose from common device/platform presets or enter custom dimensions.
|
|
246
|
+
|
|
247
|
+
**Size presets include:**
|
|
248
|
+
- iPhone 6.9", 6.7", 6.5", 6.1"
|
|
249
|
+
- iPad 13", 12.9"
|
|
250
|
+
- Google Play Phone, 7" Tablet
|
|
251
|
+
- Mac App Store Retina
|
|
252
|
+
- OG Image, Twitter Card, Product Hunt Gallery
|
|
253
|
+
- Custom dimensions
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
open-assets add size # interactive
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### Output structure
|
|
260
|
+
|
|
261
|
+
`exports/{collection}/{size}/{template}.png`
|
|
262
|
+
|
|
263
|
+
```
|
|
264
|
+
exports/
|
|
265
|
+
screenshots/
|
|
266
|
+
iphone-6.9/
|
|
267
|
+
01-hero.png
|
|
268
|
+
02-features.png
|
|
269
|
+
iphone-6.7/
|
|
270
|
+
01-hero.png
|
|
271
|
+
icon/
|
|
272
|
+
1024/
|
|
273
|
+
icon.png
|
|
274
|
+
logo/
|
|
275
|
+
svg/
|
|
276
|
+
logo.svg
|
|
277
|
+
1024/
|
|
278
|
+
logo.png
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
## Creating New Screenshot HTML Files
|
|
282
|
+
|
|
283
|
+
Each screenshot is a standalone HTML file at fixed dimensions. You can create them manually or use `open-assets add template` to scaffold one.
|
|
284
|
+
|
|
285
|
+
Key rules:
|
|
286
|
+
|
|
287
|
+
1. Set `width` and `height` on the body to match `sourceSize` in the config
|
|
288
|
+
2. Set `overflow: hidden` on the body
|
|
289
|
+
3. Reference compiled Tailwind CSS via `<link rel="stylesheet" href="../dist/styles.css" />`
|
|
290
|
+
4. All paths are relative to the project root
|
|
291
|
+
5. Put shared assets (images, logos, icons) in `publicDir` (default: `public/`)
|
|
292
|
+
|
|
293
|
+
Example template:
|
|
294
|
+
|
|
295
|
+
```html
|
|
296
|
+
<!DOCTYPE html>
|
|
297
|
+
<html lang="en">
|
|
298
|
+
<head>
|
|
299
|
+
<meta charset="UTF-8" />
|
|
300
|
+
<meta name="viewport" content="width=440" />
|
|
301
|
+
<link rel="stylesheet" href="../dist/styles.css" />
|
|
302
|
+
</head>
|
|
303
|
+
<body class="m-0 p-0">
|
|
304
|
+
<div class="screenshot bg-white flex flex-col items-center">
|
|
305
|
+
<!-- Your screenshot content here -->
|
|
306
|
+
</div>
|
|
307
|
+
</body>
|
|
308
|
+
</html>
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
After creating the file manually, add it to the `templates` array in the relevant collection in `assets.json`. Or use `open-assets add template` to do both steps at once.
|
|
312
|
+
|
|
313
|
+
## Adding a New Collection
|
|
314
|
+
|
|
315
|
+
Use `open-assets add collection` to interactively add a collection from presets or with custom dimensions and format (HTML/SVG). This creates the starter template file and updates `assets.json` automatically.
|
|
316
|
+
|
|
317
|
+
Alternatively, add a new object to the `collections` array in `assets.json` manually. Each collection needs a unique `id`, a `sourceSize`, `templates`, and `export`.
|
|
318
|
+
|
|
319
|
+
## Common Export Sizes
|
|
320
|
+
|
|
321
|
+
| Platform | Label | Width | Height |
|
|
322
|
+
|----------|-------|-------|--------|
|
|
323
|
+
| App Store | iPhone 6.9" | 1320 | 2868 |
|
|
324
|
+
| App Store | iPhone 6.7" | 1290 | 2796 |
|
|
325
|
+
| App Store | iPhone 6.5" | 1284 | 2778 |
|
|
326
|
+
| App Store | iPhone 6.1" | 1179 | 2556 |
|
|
327
|
+
| App Store | iPad 12.9" | 2048 | 2732 |
|
|
328
|
+
| Play Store | Phone | 1080 | 1920 |
|
|
329
|
+
| Play Store | Phone (tall) | 1080 | 2400 |
|
|
330
|
+
| Product Hunt | Gallery | 1270 | 760 |
|
|
331
|
+
| Web | OG Image | 1200 | 630 |
|
|
332
|
+
| Mac App Store | Retina | 2880 | 1800 |
|
|
333
|
+
|
|
334
|
+
## Incremental Builds (assets.lock)
|
|
335
|
+
|
|
336
|
+
The `render` command maintains a `assets.lock` file with SHA256 checksums of source files. On subsequent renders, unchanged assets are skipped automatically. Use `--force` to re-render everything.
|
|
337
|
+
|
|
338
|
+
Note: only source HTML/SVG files are checksummed. Changes to referenced assets (images in publicDir, compiled CSS) will not trigger re-renders — use `--force` when those change.
|
|
339
|
+
|
|
340
|
+
## File Structure Convention
|
|
341
|
+
|
|
342
|
+
```
|
|
343
|
+
project/
|
|
344
|
+
assets.json
|
|
345
|
+
assets.lock # Auto-generated, add to .gitignore
|
|
346
|
+
public/ # Shared assets (images, logos, icons, photos)
|
|
347
|
+
logo-round.png
|
|
348
|
+
social/
|
|
349
|
+
youtube.svg
|
|
350
|
+
screenshots/ # Real app screenshots for use in templates
|
|
351
|
+
01.png
|
|
352
|
+
src/
|
|
353
|
+
styles.css # Tailwind input
|
|
354
|
+
icon.html # App icon template
|
|
355
|
+
icons/ # Icon concept explorations
|
|
356
|
+
concept-a.html
|
|
357
|
+
concept-b.html
|
|
358
|
+
logo.svg # Vector logo template
|
|
359
|
+
screenshots/
|
|
360
|
+
01-hero.html
|
|
361
|
+
02-features.html
|
|
362
|
+
og/ # OG image templates
|
|
363
|
+
default.html
|
|
364
|
+
dist/
|
|
365
|
+
styles.css # Compiled Tailwind
|
|
366
|
+
exports/ # Rendered output (add to .gitignore)
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
## Screenshot Design Best Practices
|
|
372
|
+
|
|
373
|
+
These guidelines are distilled from high-converting App Store listings. Follow them when creating screenshot HTML files.
|
|
374
|
+
|
|
375
|
+
### Copywriting
|
|
376
|
+
|
|
377
|
+
- **Headlines: 3-6 words max**, large and bold. Every word must earn its place.
|
|
378
|
+
- **Lead with the benefit**, not the feature name. "Got Recipes?" not "Recipe Import Feature". "Save from anywhere" not "Multi-platform Import Support".
|
|
379
|
+
- **Use action words**: Save, Track, Cook, Get, Try, Discover, Create, Find.
|
|
380
|
+
- **First screenshot** = elevator pitch headline. This is the only one most users see.
|
|
381
|
+
- **Last screenshot** = CTA with social proof (reviews, ratings, badges).
|
|
382
|
+
- **Highlight the key word** in each headline with a colored background or different color.
|
|
383
|
+
|
|
384
|
+
### Visual Hierarchy
|
|
385
|
+
|
|
386
|
+
First 1-2 screenshots should use large hero graphics with oversized headlines. The goal is to stop the scroll in the App Store.
|
|
387
|
+
|
|
388
|
+
**Oversized headline pattern** (44-86px):
|
|
389
|
+
```html
|
|
390
|
+
<div class="text-[86px] font-black leading-[0.9] tracking-[-0.04em]">Got</div>
|
|
391
|
+
<div class="inline-block bg-brand-black text-white text-[86px] font-black px-[16px] pt-[6px] pb-[12px] rounded-[16px] mt-[4px]">Recipes?</div>
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
**Highlighted keyword pattern** — wrap key words with a colored background pill:
|
|
395
|
+
```html
|
|
396
|
+
<h1 class="text-[44px] font-extrabold leading-[1.18] tracking-[-0.03em]">
|
|
397
|
+
Save recipes from <span class="inline-block bg-brand-green text-white px-[10px] pt-[3px] pb-[5px] rounded-[10px]">anywhere</span>
|
|
398
|
+
</h1>
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
### Layout Patterns
|
|
402
|
+
|
|
403
|
+
Use a mix of these layouts across your 6-10 screenshots. Variety keeps users scrolling.
|
|
404
|
+
|
|
405
|
+
#### 1. Hero (Screenshot 1)
|
|
406
|
+
Oversized headline + logo + large background graphic bleeding off the edges.
|
|
407
|
+
```html
|
|
408
|
+
<!-- Headline at top -->
|
|
409
|
+
<div class="relative z-10 pt-[28px] px-[24px]">
|
|
410
|
+
<div class="text-[86px] font-black">Got</div>
|
|
411
|
+
<div class="inline-block bg-brand-black text-white text-[86px] font-black px-[16px] rounded-[16px]">Recipes?</div>
|
|
412
|
+
</div>
|
|
413
|
+
<!-- Logo and rating centered -->
|
|
414
|
+
<div class="relative z-10 mt-[44px] flex flex-col items-center">
|
|
415
|
+
<img src="../../public/logo-round.png" width="64" height="64" />
|
|
416
|
+
<img src="../../public/rating.svg" width="365" height="191" class="mt-[8px]" />
|
|
417
|
+
</div>
|
|
418
|
+
<!-- Large image bleeding off bottom-right edge -->
|
|
419
|
+
<div class="absolute z-0" style="bottom: -350px; right: -176px; width: 792px; height: 792px;">
|
|
420
|
+
<img src="../../public/meal.svg" class="w-full h-full object-contain" />
|
|
421
|
+
</div>
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
#### 2. Dual-Phone (Before/After or Feature Comparison)
|
|
425
|
+
Two phone mockups side by side with an arrow or VS indicator between them. Great for showing "messy website → clean recipe" transformations.
|
|
426
|
+
|
|
427
|
+
#### 3. Orbital (Integrations / Multi-Platform)
|
|
428
|
+
Center your app icon with platform logos on concentric orbital rings:
|
|
429
|
+
```html
|
|
430
|
+
<div class="orbital-container" style="position: relative; width: 380px; height: 380px;">
|
|
431
|
+
<!-- Concentric ring borders -->
|
|
432
|
+
<div style="position: absolute; border-radius: 50%; border: 1px solid rgba(128,128,128,0.13); width: 240px; height: 240px; top: 70px; left: 70px;"></div>
|
|
433
|
+
<div style="position: absolute; border-radius: 50%; border: 1px solid rgba(128,128,128,0.13); width: 340px; height: 340px; top: 20px; left: 20px;"></div>
|
|
434
|
+
<!-- Center app icon -->
|
|
435
|
+
<div style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);">
|
|
436
|
+
<img src="../../public/logo-round.png" width="104" height="104" style="border-radius: 50%; box-shadow: 0 6px 20px rgba(0,0,0,0.18);" />
|
|
437
|
+
</div>
|
|
438
|
+
<!-- Platform icons at various positions on rings -->
|
|
439
|
+
<div style="position: absolute; top: 52px; left: 216px; opacity: 0.85;">
|
|
440
|
+
<img src="../../public/social/youtube.svg" width="68" height="68" style="border-radius: 50%;" />
|
|
441
|
+
</div>
|
|
442
|
+
</div>
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
#### 4. Feature Showcase
|
|
446
|
+
Headline + phone mockup showing a real app screenshot.
|
|
447
|
+
```html
|
|
448
|
+
<h1 class="text-[44px] font-extrabold tracking-[-0.03em] text-center">
|
|
449
|
+
Just the <span class="inline-block bg-brand-green text-white px-[10px] rounded-[10px]">recipe</span>
|
|
450
|
+
</h1>
|
|
451
|
+
<div class="phone phone-340">
|
|
452
|
+
<div class="phone-screen">
|
|
453
|
+
<img src="../../public/screenshots/05.png" style="width: 100%; height: 100%; object-fit: cover;" />
|
|
454
|
+
</div>
|
|
455
|
+
</div>
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
#### 5. Review Carousel (Social Proof)
|
|
459
|
+
Staggered review cards with alternating left/right offset:
|
|
460
|
+
```html
|
|
461
|
+
<div class="pl-5 pr-12">
|
|
462
|
+
<div style="background: white; border-radius: 18px; padding: 14px 18px; box-shadow: 0 4px 24px rgba(0,0,0,0.08);">
|
|
463
|
+
<div style="display: flex; justify-content: space-between; margin-bottom: 4px;">
|
|
464
|
+
<p style="font-size: 16px; font-weight: 800;">Username</p>
|
|
465
|
+
<div style="display: flex; gap: 1px;">
|
|
466
|
+
<svg viewBox="0 0 24 24" fill="#F2C94C" width="16" height="16"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg>
|
|
467
|
+
</div>
|
|
468
|
+
</div>
|
|
469
|
+
<p style="font-size: 16px; color: #4B5563;">"Their actual review text here."</p>
|
|
470
|
+
</div>
|
|
471
|
+
</div>
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
#### 6. CTA (Final Screenshot)
|
|
475
|
+
Social proof badges + lifestyle photo fading at bottom:
|
|
476
|
+
```html
|
|
477
|
+
<h1 class="text-[42px] font-extrabold tracking-[-0.03em]">
|
|
478
|
+
Time to cook, <span class="inline-block bg-brand-green text-white px-[10px] rounded-[10px]">chef</span>
|
|
479
|
+
</h1>
|
|
480
|
+
<!-- Badge pills -->
|
|
481
|
+
<div class="flex flex-wrap gap-2.5 justify-center">
|
|
482
|
+
<div style="display: inline-flex; align-items: center; gap: 10px; background: rgba(255,255,255,0.85); backdrop-filter: blur(12px); border: 1.5px solid rgba(0,0,0,0.06); border-radius: 100px; padding: 10px 20px 10px 14px;">
|
|
483
|
+
<span style="font-size: 16px; font-weight: 700;">No Ads</span>
|
|
484
|
+
</div>
|
|
485
|
+
</div>
|
|
486
|
+
<!-- Lifestyle photo with gradient fade -->
|
|
487
|
+
<div style="position: absolute; bottom: -80px; left: 0; right: 0; height: 320px;">
|
|
488
|
+
<div style="position: absolute; top: 0; left: 0; right: 0; height: 180px; background: linear-gradient(180deg, #FFFFFF 0%, rgba(255,255,255,0) 100%); z-index: 1;"></div>
|
|
489
|
+
<img src="../../public/kitchen-light.jpg" style="width: 100%; height: 100%; object-fit: cover;" />
|
|
490
|
+
</div>
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
### Typography
|
|
494
|
+
|
|
495
|
+
**Google Fonts** — add to the `<head>` of each HTML file:
|
|
496
|
+
```html
|
|
497
|
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap" rel="stylesheet">
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
**Recommended pairings:**
|
|
501
|
+
- **Inter** (body) + **Fraunces** (display) — modern + editorial
|
|
502
|
+
- **DM Sans** (body) + **DM Serif Display** (headlines) — clean + elegant
|
|
503
|
+
- **Plus Jakarta Sans** (body) + **Playfair Display** (headlines) — geometric + classic
|
|
504
|
+
- **Outfit** (body) + **Cal Sans** (display) — startup-y + bold
|
|
505
|
+
|
|
506
|
+
**iOS-native feel** — use the system font stack:
|
|
507
|
+
```css
|
|
508
|
+
font-family: -apple-system, BlinkMacSystemFont, "SF Pro Display", system-ui, sans-serif;
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
### Icon and Asset Resources
|
|
512
|
+
|
|
513
|
+
| Source | URL | Use For |
|
|
514
|
+
|--------|-----|---------|
|
|
515
|
+
| **Lucide Icons** | https://lucide.dev | Clean UI icons (MIT licensed) |
|
|
516
|
+
| **Heroicons** | https://heroicons.com | UI icons by Tailwind team (MIT) |
|
|
517
|
+
| **Simple Icons** | https://simpleicons.org | Brand/platform logos (YouTube, Instagram, etc.) |
|
|
518
|
+
| **SVG Repo** | https://www.svgrepo.com | Decorative elements, arrows, squiggles |
|
|
519
|
+
| **Unsplash** | https://unsplash.com | Lifestyle photography for backgrounds |
|
|
520
|
+
| **Pexels** | https://www.pexels.com | Free stock photography |
|
|
521
|
+
|
|
522
|
+
### Example Prompts
|
|
523
|
+
|
|
524
|
+
**Full screenshot set:**
|
|
525
|
+
```
|
|
526
|
+
Now we want to make beautiful screenshots for this app. Install the open-assets skill
|
|
527
|
+
from https://github.com/parra-inc/open-assets. Look at the marketing doc and
|
|
528
|
+
demographics. Design 8 high-converting App Store screenshots that catch your eye as
|
|
529
|
+
you scroll. Use bold headlines with highlighted keywords, phone mockups with real app
|
|
530
|
+
screenshots, and close with reviews + a CTA. Export for iPhone 6.7" and 6.9".
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
**Single screenshot iteration:**
|
|
534
|
+
```
|
|
535
|
+
Update the hero screenshot (01-hero.html) to use a bigger headline at 86px with a
|
|
536
|
+
colored background on the key word. Add the app rating below the logo. Make the
|
|
537
|
+
background food photo bleed off the bottom-right edge for visual impact.
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
**Adding a new export size:**
|
|
541
|
+
```
|
|
542
|
+
Add Play Store screenshot sizes to the config. Use 1080x2400 as the export size.
|
|
543
|
+
The screenshots can share the same templates.
|
|
544
|
+
```
|