@@ -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
596443type SlideEntry = { id : string ; label : string ; Component : React . ComponentType } ;
597444
598445function 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