Skip to content

Commit 9c15962

Browse files
zcoderrclaude
andcommitted
feat(screenshot-generator): replace features slide with voice chat, update friends screenshot
- Replace friends.PNG with synastry report page (was empty friend list) - Add voice chat screenshot and slide replacing "And So Much More" features page - Remove Slide6 component, FEATURES constant, and features special-case in buildSlides - Add 4-locale i18n copy for voice slide (en/ja/zh-Hans/zh-Hant) Co-authored-by: Claude <noreply@anthropic.com>
1 parent f856fcc commit 9c15962

5 files changed

Lines changed: 23 additions & 184 deletions

File tree

217 KB
Loading
956 KB
Loading
217 KB
Loading
956 KB
Loading

screenshot-generator/src/app/page.tsx

Lines changed: 23 additions & 184 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,10 @@ const T: Record<Locale, Record<string, SlideText>> = {
9696
headline: 'Cosmic\nCompatibility',
9797
sub: 'Explore destiny connections with friends',
9898
},
99-
features: {
100-
labelText: '',
101-
headline: 'And So\nMuch More',
99+
voice: {
100+
labelText: 'LIVE VOICE CHAT',
101+
headline: 'Speak with\nthe Stars',
102+
sub: 'Real-time voice conversations with your astrologer',
102103
},
103104
},
104105
ja: {
@@ -127,9 +128,10 @@ const T: Record<Locale, Record<string, SlideText>> = {
127128
headline: '宇宙の\n相性',
128129
sub: '友達との運命のつながりを探る',
129130
},
130-
features: {
131-
labelText: '',
132-
headline: 'さらに\n多くの機能',
131+
voice: {
132+
labelText: 'リアルタイム音声',
133+
headline: '星と\n話そう',
134+
sub: '占星術師とリアルタイムで音声会話',
133135
},
134136
},
135137
'zh-Hans': {
@@ -158,9 +160,10 @@ const T: Record<Locale, Record<string, SlideText>> = {
158160
headline: '宇宙级\n默契',
159161
sub: '探索与朋友的命运连接',
160162
},
161-
features: {
162-
labelText: '',
163-
headline: '还有更多\n精彩',
163+
voice: {
164+
labelText: '实时语音',
165+
headline: '与星星\n对话',
166+
sub: '与你的占星师实时语音交流',
164167
},
165168
},
166169
'zh-Hant': {
@@ -189,49 +192,14 @@ const T: Record<Locale, Record<string, SlideText>> = {
189192
headline: '宇宙級\n默契',
190193
sub: '探索與朋友的命運連結',
191194
},
192-
features: {
193-
labelText: '',
194-
headline: '還有更多\n精彩',
195+
voice: {
196+
labelText: '即時語音',
197+
headline: '與星星\n對話',
198+
sub: '與你的占星師即時語音交流',
195199
},
196200
},
197201
};
198202

199-
/* Feature tags per locale */
200-
const FEATURES: Record<Locale, { features: string[]; coming: string[]; tagline: string; taglineSub: string }> = {
201-
en: {
202-
features: [
203-
'AI Chat',
204-
'Daily Fortune',
205-
'Natal Chart',
206-
'Synastry',
207-
'Moon Phase',
208-
'Home Widget',
209-
'4 Languages',
210-
'Points System',
211-
],
212-
coming: ['Multiple Astrologers', 'Divination Tools', 'Community'],
213-
tagline: 'Your personal AI astrologer',
214-
taglineSub: 'Free daily insights · Unlock Pro for unlimited access',
215-
},
216-
ja: {
217-
features: ['AIチャット', '毎日の運勢', '出生チャート', '相性診断', '月相', 'ウィジェット', '4言語対応', 'ポイント'],
218-
coming: ['複数の占星術師', '占いツール', 'コミュニティ'],
219-
tagline: 'あなた専属のAI占星術師',
220-
taglineSub: '毎日の無料インサイト · Proで無制限アクセス',
221-
},
222-
'zh-Hans': {
223-
features: ['AI 对话', '每日运势', '本命星盘', '合盘分析', '月相', '桌面小组件', '4 种语言', '积分系统'],
224-
coming: ['多位占星师', '占卜工具', '社区'],
225-
tagline: '你的私人 AI 占星师',
226-
taglineSub: '每日免费洞察 · 解锁 Pro 无限畅享',
227-
},
228-
'zh-Hant': {
229-
features: ['AI 對話', '每日運勢', '本命星盤', '合盤分析', '月相', '桌面小組件', '4 種語言', '積分系統'],
230-
coming: ['多位占星師', '占卜工具', '社區'],
231-
tagline: '你的私人 AI 占星師',
232-
taglineSub: '每日免費洞察 · 解鎖 Pro 無限暢享',
233-
},
234-
};
235203

236204
/* ───────────────────── PHONE COMPONENT ───────────────────── */
237205

@@ -392,6 +360,12 @@ const SLIDE_DATA: SlideData[] = [
392360
screenshotFile: 'friends.PNG',
393361
bgStyle: () => ({ background: `linear-gradient(175deg, ${C.bgWarm}, ${C.bg})` }),
394362
},
363+
{
364+
id: 'voice',
365+
label: 'Voice',
366+
screenshotFile: 'voice.PNG',
367+
bgStyle: () => ({ background: `radial-gradient(ellipse at 50% 50%, ${C.bg}, ${C.bgWarm})` }),
368+
},
395369
];
396370

397371
/* ───────────────────── DECORATIVE LINE ───────────────────── */
@@ -464,151 +438,16 @@ function DeviceSlide({ data, device, locale }: { data: SlideData; device: Device
464438
);
465439
}
466440

467-
/* ───────────────────── SLIDE 6 (features, iPhone only) ───────────────────── */
468-
469-
function Slide6({ locale }: { locale: Locale }) {
470-
const f = FEATURES[locale];
471-
const text = T[locale].features!;
472-
const isCJK = locale === 'zh-Hans' || locale === 'zh-Hant' || locale === 'ja';
473-
474-
return (
475-
<div
476-
style={{
477-
width: IPHONE_CANVAS_W,
478-
height: IPHONE_CANVAS_H,
479-
background: `radial-gradient(ellipse at 50% 50%, ${C.bg}, ${C.bgWarm})`,
480-
position: 'relative',
481-
overflow: 'hidden',
482-
display: 'flex',
483-
flexDirection: 'column',
484-
alignItems: 'center',
485-
}}>
486-
{/* App icon */}
487-
<div
488-
style={{
489-
marginTop: 220,
490-
display: 'flex',
491-
flexDirection: 'column',
492-
alignItems: 'center',
493-
position: 'relative',
494-
zIndex: 2,
495-
}}>
496-
<img
497-
src="/app-icon.png"
498-
alt="Aistro"
499-
style={{
500-
width: 80,
501-
height: 80,
502-
borderRadius: 18,
503-
marginBottom: 28,
504-
border: `1px solid ${C.border}`,
505-
}}
506-
/>
507-
<Caption label="" headline={text.headline} canvasW={IPHONE_CANVAS_W} locale={locale} />
508-
<DecoLine canvasW={IPHONE_CANVAS_W} />
509-
</div>
510-
{/* Feature pills */}
511-
<div style={{ marginTop: 80, padding: '0 80px', position: 'relative', zIndex: 2 }}>
512-
<div style={{ display: 'flex', flexWrap: 'wrap', gap: 12, justifyContent: 'center' }}>
513-
{f.features.map((feat) => (
514-
<div
515-
key={feat}
516-
style={{
517-
padding: '12px 24px',
518-
borderRadius: 24,
519-
background: C.bg,
520-
color: C.textPrimary,
521-
fontSize: 18,
522-
fontWeight: 500,
523-
fontFamily: FM,
524-
border: `1px solid ${C.border}`,
525-
letterSpacing: 0.5,
526-
}}>
527-
{feat}
528-
</div>
529-
))}
530-
</div>
531-
</div>
532-
{/* Coming soon */}
533-
<div style={{ marginTop: 60, padding: '0 80px', position: 'relative', zIndex: 2 }}>
534-
<div
535-
style={{
536-
textAlign: 'center',
537-
fontSize: 13,
538-
fontWeight: 500,
539-
color: C.textMuted,
540-
textTransform: 'uppercase',
541-
letterSpacing: 2,
542-
marginBottom: 16,
543-
fontFamily: FM,
544-
}}>
545-
Coming Soon
546-
</div>
547-
<div style={{ display: 'flex', flexWrap: 'wrap', gap: 12, justifyContent: 'center' }}>
548-
{f.coming.map((feat) => (
549-
<div
550-
key={feat}
551-
style={{
552-
padding: '12px 24px',
553-
borderRadius: 24,
554-
background: 'transparent',
555-
color: C.textMuted,
556-
fontSize: 18,
557-
fontWeight: 500,
558-
fontFamily: FM,
559-
border: `1px solid ${C.border}`,
560-
letterSpacing: 0.5,
561-
}}>
562-
{feat}
563-
</div>
564-
))}
565-
</div>
566-
</div>
567-
{/* Bottom tagline */}
568-
<div
569-
style={{
570-
position: 'absolute',
571-
bottom: 100,
572-
left: 0,
573-
right: 0,
574-
textAlign: 'center',
575-
zIndex: 2,
576-
}}>
577-
<div
578-
style={{
579-
fontFamily: isCJK ? FB : FH,
580-
fontSize: 26,
581-
color: C.textSecondary,
582-
fontWeight: 400,
583-
fontStyle: isCJK ? 'normal' : 'italic',
584-
marginBottom: 12,
585-
}}>
586-
{f.tagline}
587-
</div>
588-
<div style={{ fontFamily: FB, fontSize: 15, color: C.textMuted, fontWeight: 400 }}>{f.taglineSub}</div>
589-
</div>
590-
</div>
591-
);
592-
}
593-
594441
/* ───────────────────── REGISTRY ───────────────────── */
595442

596443
type SlideEntry = { id: string; label: string; Component: React.ComponentType };
597444

598445
function buildSlides(device: DeviceType, locale: Locale): SlideEntry[] {
599-
const slides: SlideEntry[] = SLIDE_DATA.map((data) => ({
446+
return SLIDE_DATA.map((data) => ({
600447
id: `${device}-${data.id}`,
601448
label: data.label,
602449
Component: () => <DeviceSlide data={data} device={device} locale={locale} />,
603450
}));
604-
if (device === 'iphone') {
605-
slides.push({
606-
id: `${device}-features`,
607-
label: 'Features',
608-
Component: () => <Slide6 locale={locale} />,
609-
});
610-
}
611-
return slides;
612451
}
613452

614453
/* ───────────────────── PREVIEW ───────────────────── */

0 commit comments

Comments
 (0)