screencraft 0.1.0
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/.claude/settings.local.json +30 -0
- package/.env.example +3 -0
- package/MCP_README.md +200 -0
- package/README.md +148 -0
- package/bin/screencraft.js +61 -0
- package/package.json +31 -0
- package/src/auth/keystore.js +148 -0
- package/src/commands/init.js +119 -0
- package/src/commands/launch.js +405 -0
- package/src/detectors/detectBrand.js +1222 -0
- package/src/detectors/simulator.js +317 -0
- package/src/generators/analyzeStyleReference.js +471 -0
- package/src/generators/compositePSD.js +682 -0
- package/src/generators/copy.js +147 -0
- package/src/mcp/index.js +394 -0
- package/src/pipeline/aeSwap.js +369 -0
- package/src/pipeline/download.js +32 -0
- package/src/pipeline/queue.js +101 -0
- package/src/server/index.js +627 -0
- package/src/server/public/app.js +738 -0
- package/src/server/public/index.html +255 -0
- package/src/server/public/style.css +751 -0
- package/src/server/session.js +36 -0
- package/templates/ae/(Footage)/Assets/This Hip-Hop Upbeat (Short version).wav +0 -0
- package/templates/ae/(Footage)/Assets/screen_01_raw.png +0 -0
- package/templates/ae/(Footage)/Assets/screen_02_raw.png +0 -0
- package/templates/ae/(Footage)/Assets/screen_03_raw.png +0 -0
- package/templates/ae/(Footage)/Assets/screen_04_raw.png +0 -0
- package/templates/ae/(Footage)/Assets/screen_05_raw.png +0 -0
- package/templates/ae/(Footage)/Assets/screen_06_raw.png +0 -0
- package/templates/ae/Motion Forge Test 1.0 (converted).aep +0 -0
- package/templates/ae_swap.jsx +284 -0
- package/templates/layouts/minimal.psd +0 -0
- package/templates/screencraft.config.example.js +165 -0
- package/test/output/layout_test.png +0 -0
- package/test/output/style_profile.json +64 -0
- package/test/reference.png +0 -0
- package/test/test_brand.js +69 -0
- package/test/test_psd.js +83 -0
- package/test/test_style_analysis.js +114 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>ScreenCraft</title>
|
|
7
|
+
<link rel="stylesheet" href="/style.css">
|
|
8
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
9
|
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
|
10
|
+
</head>
|
|
11
|
+
<body>
|
|
12
|
+
<div class="app">
|
|
13
|
+
<!-- Logo -->
|
|
14
|
+
<div class="logo">
|
|
15
|
+
<h1><span class="diamond">◆</span>ScreenCraft</h1>
|
|
16
|
+
<p>App Store launch kit generator</p>
|
|
17
|
+
</div>
|
|
18
|
+
|
|
19
|
+
<!-- Progress bar -->
|
|
20
|
+
<div class="progress-bar" id="progressBar">
|
|
21
|
+
<div class="seg" data-step="0"></div>
|
|
22
|
+
<div class="seg" data-step="1"></div>
|
|
23
|
+
<div class="seg" data-step="2"></div>
|
|
24
|
+
<div class="seg" data-step="3"></div>
|
|
25
|
+
<div class="seg" data-step="4"></div>
|
|
26
|
+
<div class="seg" data-step="5"></div>
|
|
27
|
+
<div class="seg" data-step="6"></div>
|
|
28
|
+
<div class="seg" data-step="7"></div>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<!-- Step 0: Project Path -->
|
|
32
|
+
<div class="step active" id="step-0">
|
|
33
|
+
<div class="step-header">
|
|
34
|
+
<div class="step-number">1</div>
|
|
35
|
+
<h2>Project Directory</h2>
|
|
36
|
+
</div>
|
|
37
|
+
<div class="card">
|
|
38
|
+
<p class="text-dim text-sm mb-16">Enter the path to your app project. ScreenCraft will detect your framework, brand colors, and assets.</p>
|
|
39
|
+
<input type="text" class="full" id="projectPath" placeholder="/Users/you/projects/my-app" autofocus>
|
|
40
|
+
</div>
|
|
41
|
+
<div class="btn-row">
|
|
42
|
+
<button class="btn btn-primary" onclick="detectProject()">Detect Project</button>
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
<!-- Step 1: Brand Detection -->
|
|
47
|
+
<div class="step" id="step-1">
|
|
48
|
+
<div class="step-header">
|
|
49
|
+
<div class="step-number">2</div>
|
|
50
|
+
<h2>Brand Detection</h2>
|
|
51
|
+
<span class="step-sub" id="frameworkBadge"></span>
|
|
52
|
+
</div>
|
|
53
|
+
|
|
54
|
+
<div class="card">
|
|
55
|
+
<div class="card-row">
|
|
56
|
+
<span class="label">App Name</span>
|
|
57
|
+
<input type="text" id="brandAppName" style="text-align:right; width: 200px;">
|
|
58
|
+
</div>
|
|
59
|
+
<div class="card-row">
|
|
60
|
+
<span class="label">Framework</span>
|
|
61
|
+
<span class="value" id="brandFramework"></span>
|
|
62
|
+
</div>
|
|
63
|
+
<div class="card-row">
|
|
64
|
+
<span class="label">Icon</span>
|
|
65
|
+
<span class="value" id="brandIconStatus"></span>
|
|
66
|
+
</div>
|
|
67
|
+
<div class="card-row">
|
|
68
|
+
<span class="label">Font</span>
|
|
69
|
+
<span class="value" id="brandFont"></span>
|
|
70
|
+
</div>
|
|
71
|
+
</div>
|
|
72
|
+
|
|
73
|
+
<div class="card">
|
|
74
|
+
<p class="text-dim text-sm">Click a swatch to change the color</p>
|
|
75
|
+
<div class="color-grid">
|
|
76
|
+
<div class="color-swatch">
|
|
77
|
+
<div class="swatch" id="swatchPrimary">
|
|
78
|
+
<input type="color" id="colorPrimary" onchange="updateColor('primary', this.value)">
|
|
79
|
+
</div>
|
|
80
|
+
<div class="name">Primary</div>
|
|
81
|
+
<div class="hex" id="hexPrimary"></div>
|
|
82
|
+
</div>
|
|
83
|
+
<div class="color-swatch">
|
|
84
|
+
<div class="swatch" id="swatchSecondary">
|
|
85
|
+
<input type="color" id="colorSecondary" onchange="updateColor('secondary', this.value)">
|
|
86
|
+
</div>
|
|
87
|
+
<div class="name">Secondary</div>
|
|
88
|
+
<div class="hex" id="hexSecondary"></div>
|
|
89
|
+
</div>
|
|
90
|
+
<div class="color-swatch">
|
|
91
|
+
<div class="swatch" id="swatchAccent">
|
|
92
|
+
<input type="color" id="colorAccent" onchange="updateColor('accent', this.value)">
|
|
93
|
+
</div>
|
|
94
|
+
<div class="name">Accent</div>
|
|
95
|
+
<div class="hex" id="hexAccent"></div>
|
|
96
|
+
</div>
|
|
97
|
+
<div class="color-swatch">
|
|
98
|
+
<div class="swatch" id="swatchBackground">
|
|
99
|
+
<input type="color" id="colorBackground" onchange="updateColor('background', this.value)">
|
|
100
|
+
</div>
|
|
101
|
+
<div class="name">Background</div>
|
|
102
|
+
<div class="hex" id="hexBackground"></div>
|
|
103
|
+
</div>
|
|
104
|
+
</div>
|
|
105
|
+
</div>
|
|
106
|
+
|
|
107
|
+
<div id="brandIconPreview" style="display:none" class="card text-center">
|
|
108
|
+
<img id="iconImg" style="width:80px; height:80px; border-radius:18px; margin: 8px auto; display:block;">
|
|
109
|
+
</div>
|
|
110
|
+
|
|
111
|
+
<div class="btn-row">
|
|
112
|
+
<button class="btn btn-secondary" onclick="goStep(0)">Back</button>
|
|
113
|
+
<button class="btn btn-primary" onclick="loadTemplates()">Next: Template</button>
|
|
114
|
+
</div>
|
|
115
|
+
</div>
|
|
116
|
+
|
|
117
|
+
<!-- Step 2: Template Selection -->
|
|
118
|
+
<div class="step" id="step-2">
|
|
119
|
+
<div class="step-header">
|
|
120
|
+
<div class="step-number">3</div>
|
|
121
|
+
<h2>Template</h2>
|
|
122
|
+
<span class="step-sub">Choose a layout style</span>
|
|
123
|
+
</div>
|
|
124
|
+
|
|
125
|
+
<div id="templateLoading" class="loading">
|
|
126
|
+
<div class="render-spinner"></div>
|
|
127
|
+
<span>Loading templates...</span>
|
|
128
|
+
</div>
|
|
129
|
+
|
|
130
|
+
<div class="template-grid" id="templateGrid" style="display:none"></div>
|
|
131
|
+
|
|
132
|
+
<div class="btn-row" id="templateBtns" style="display:none">
|
|
133
|
+
<button class="btn btn-secondary" onclick="goStep(1)">Back</button>
|
|
134
|
+
<button class="btn btn-primary" onclick="captureScreenshots()">Next: Screenshots</button>
|
|
135
|
+
</div>
|
|
136
|
+
</div>
|
|
137
|
+
|
|
138
|
+
<!-- Step 3: Screenshots -->
|
|
139
|
+
<div class="step" id="step-3">
|
|
140
|
+
<div class="step-header">
|
|
141
|
+
<div class="step-number">4</div>
|
|
142
|
+
<h2>Screenshots</h2>
|
|
143
|
+
<span class="step-sub" id="screenshotCount"></span>
|
|
144
|
+
</div>
|
|
145
|
+
|
|
146
|
+
<div id="screenshotLoading" class="loading">
|
|
147
|
+
<div class="render-spinner"></div>
|
|
148
|
+
<span>Checking for screenshots...</span>
|
|
149
|
+
</div>
|
|
150
|
+
|
|
151
|
+
<!-- Simulator capture mode -->
|
|
152
|
+
<div id="captureMode" style="display:none">
|
|
153
|
+
<div class="card">
|
|
154
|
+
<p class="text-dim text-sm mb-16" id="captureInstructions">
|
|
155
|
+
Navigate your app in the Simulator, then click "Capture Screen" to take each screenshot. Up to 6 screens.
|
|
156
|
+
</p>
|
|
157
|
+
<div class="btn-row" style="margin-top:16px; justify-content: center;">
|
|
158
|
+
<button class="btn btn-primary" id="captureBtn" onclick="captureOne()">Capture Screen</button>
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
<div class="screenshot-grid" id="screenshotGrid" style="margin-top:16px"></div>
|
|
162
|
+
</div>
|
|
163
|
+
|
|
164
|
+
<!-- Manual mode (already loaded) -->
|
|
165
|
+
<div id="manualMode" style="display:none">
|
|
166
|
+
<div class="screenshot-grid" id="manualGrid"></div>
|
|
167
|
+
</div>
|
|
168
|
+
|
|
169
|
+
<div class="btn-row" id="screenshotBtns" style="display:none">
|
|
170
|
+
<button class="btn btn-secondary" onclick="goStep(2)">Back</button>
|
|
171
|
+
<button class="btn btn-primary" onclick="generateHeadlines()">Next: AI Headlines</button>
|
|
172
|
+
</div>
|
|
173
|
+
</div>
|
|
174
|
+
|
|
175
|
+
<!-- Step 4: Headlines -->
|
|
176
|
+
<div class="step" id="step-4">
|
|
177
|
+
<div class="step-header">
|
|
178
|
+
<div class="step-number">5</div>
|
|
179
|
+
<h2>Headlines</h2>
|
|
180
|
+
<span class="step-sub">Pick or customize for each screen</span>
|
|
181
|
+
</div>
|
|
182
|
+
|
|
183
|
+
<div id="headlineLoading" class="loading">
|
|
184
|
+
<div class="render-spinner"></div>
|
|
185
|
+
<span>Generating headline suggestions with AI...</span>
|
|
186
|
+
</div>
|
|
187
|
+
|
|
188
|
+
<div id="headlineEditor" style="display:none"></div>
|
|
189
|
+
|
|
190
|
+
<div id="headlineBtns" style="display:none">
|
|
191
|
+
<div class="headline-nav">
|
|
192
|
+
<button class="btn btn-secondary" id="headlinePrev" onclick="headlineNav(-1)">Previous</button>
|
|
193
|
+
<div class="headline-dots" id="headlineDots"></div>
|
|
194
|
+
<button class="btn btn-primary" id="headlineNext" onclick="headlineNav(1)">Next Screen</button>
|
|
195
|
+
</div>
|
|
196
|
+
</div>
|
|
197
|
+
</div>
|
|
198
|
+
|
|
199
|
+
<!-- Step 5: Preview -->
|
|
200
|
+
<div class="step" id="step-5">
|
|
201
|
+
<div class="step-header">
|
|
202
|
+
<div class="step-number">6</div>
|
|
203
|
+
<h2>Preview</h2>
|
|
204
|
+
<span class="step-sub">Review your App Store screenshots</span>
|
|
205
|
+
</div>
|
|
206
|
+
|
|
207
|
+
<div class="screenshot-grid" id="previewGrid"></div>
|
|
208
|
+
|
|
209
|
+
<div class="btn-row">
|
|
210
|
+
<button class="btn btn-secondary" onclick="goStep(4); currentHeadline = 0; showHeadline();">Edit Headlines</button>
|
|
211
|
+
<button class="btn btn-primary" onclick="checkLicense()">Generate Launch Kit</button>
|
|
212
|
+
</div>
|
|
213
|
+
</div>
|
|
214
|
+
|
|
215
|
+
<!-- Step 6: License -->
|
|
216
|
+
<div class="step" id="step-6">
|
|
217
|
+
<div class="step-header">
|
|
218
|
+
<div class="step-number">7</div>
|
|
219
|
+
<h2>License</h2>
|
|
220
|
+
</div>
|
|
221
|
+
|
|
222
|
+
<div class="card" id="licenseContent"></div>
|
|
223
|
+
|
|
224
|
+
<div class="btn-row" id="licenseBtns"></div>
|
|
225
|
+
</div>
|
|
226
|
+
|
|
227
|
+
<!-- Step 7: Render -->
|
|
228
|
+
<div class="step" id="step-7">
|
|
229
|
+
<div class="step-header">
|
|
230
|
+
<div class="step-number">8</div>
|
|
231
|
+
<h2>Generating</h2>
|
|
232
|
+
</div>
|
|
233
|
+
|
|
234
|
+
<div id="renderProgress" class="card render-progress">
|
|
235
|
+
<div class="render-spinner"></div>
|
|
236
|
+
<div class="render-bar"><div class="fill" id="renderFill" style="width:0%"></div></div>
|
|
237
|
+
<div class="render-message" id="renderMessage">Starting...</div>
|
|
238
|
+
</div>
|
|
239
|
+
|
|
240
|
+
<div id="outputSection" style="display:none">
|
|
241
|
+
<div class="step-header" style="margin-top:32px">
|
|
242
|
+
<h2>Launch Kit Ready</h2>
|
|
243
|
+
</div>
|
|
244
|
+
<div class="output-grid" id="outputGrid"></div>
|
|
245
|
+
<div class="btn-row">
|
|
246
|
+
<button class="btn btn-primary" onclick="openOutputFolder()">Open Folder</button>
|
|
247
|
+
<button class="btn btn-secondary" onclick="location.reload()">Start Over</button>
|
|
248
|
+
</div>
|
|
249
|
+
</div>
|
|
250
|
+
</div>
|
|
251
|
+
</div>
|
|
252
|
+
|
|
253
|
+
<script src="/app.js"></script>
|
|
254
|
+
</body>
|
|
255
|
+
</html>
|