Compare commits
	
		
			2 Commits
		
	
	
		
			b4e8ed0736
			...
			bbdb49a655
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | bbdb49a655 | ||
|  | 4943345467 | 
| @ -7,7 +7,7 @@ const form = ref({ | |||||||
|   email: "", |   email: "", | ||||||
|   company: "", |   company: "", | ||||||
|   phone: "", |   phone: "", | ||||||
|   alertType: "all" | alertType: "all" | ||||||
| }); | }); | ||||||
| const submitted = ref(false); | const submitted = ref(false); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,22 +1,75 @@ | |||||||
| <script setup> | <script setup> | ||||||
| import { NCarousel, NDivider, NMarquee, NPopselect } from "naive-ui"; | import { ref } from 'vue'; | ||||||
| import { onUnmounted, ref, watch, onMounted, computed } from "vue"; |  | ||||||
| 
 | 
 | ||||||
|  | const form = ref({ | ||||||
|  |   firstName: '', | ||||||
|  |   lastName: '', | ||||||
|  |   email: '', | ||||||
|  |   company: '', | ||||||
|  |   phone: '', | ||||||
|  |   alertType: 'all', | ||||||
|  | }); | ||||||
|  | const submitted = ref(false); | ||||||
|  | 
 | ||||||
|  | function handleSubmit(e) { | ||||||
|  |   e.preventDefault(); | ||||||
|  |   submitted.value = true; | ||||||
|  | } | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <template> | <template> | ||||||
|   <header className="header"> |   <main class="min-h-screen flex flex-col items-center justify-center bg-white relative px-4 py-8"> | ||||||
|   375 |     <!-- Card --> | ||||||
|   </header> |     <div class="w-full max-w-90vw p-4 bg-white/95 rounded-2xl shadow-lg animate-bounce-in"> | ||||||
|   <main ref="main"> |       <template v-if="!submitted"> | ||||||
| 
 |         <h2 class="text-xl font-bold text-#8A5AFB mb-2 text-center tracking-wide">E-Mail Alerts</h2> | ||||||
|  |         <p class="text-xs text-gray-500 mb-4 text-center">* Required Fields</p> | ||||||
|  |         <form class="flex flex-col gap-3" @submit="handleSubmit"> | ||||||
|  |           <div> | ||||||
|  |             <label class="block text-gray-700 font-semibold mb-1 text-sm">* First Name</label> | ||||||
|  |             <input v-model="form.firstName" type="text" required class="w-full px-3 py-2 rounded-lg border border-gray-300 outline-none bg-white/90 text-sm" /> | ||||||
|  |           </div> | ||||||
|  |           <div> | ||||||
|  |             <label class="block text-gray-700 font-semibold mb-1 text-sm">* Last Name</label> | ||||||
|  |             <input v-model="form.lastName" type="text" required class="w-full px-3 py-2 rounded-lg border border-gray-300 outline-none bg-white/90 text-sm" /> | ||||||
|  |           </div> | ||||||
|  |           <div> | ||||||
|  |             <label class="block text-gray-700 font-semibold mb-1 text-sm">* Email</label> | ||||||
|  |             <input v-model="form.email" type="email" required class="w-full px-3 py-2 rounded-lg border border-gray-300 outline-none bg-white/90 text-sm" /> | ||||||
|  |           </div> | ||||||
|  |           <div> | ||||||
|  |             <label class="block text-gray-700 font-semibold mb-1 text-sm">* Company</label> | ||||||
|  |             <input v-model="form.company" type="text" required class="w-full px-3 py-2 rounded-lg border border-gray-300 outline-none bg-white/90 text-sm" /> | ||||||
|  |           </div> | ||||||
|  |           <div> | ||||||
|  |             <label class="block text-gray-700 font-semibold mb-1 text-sm">Phone</label> | ||||||
|  |             <input v-model="form.phone" type="tel" class="w-full px-3 py-2 rounded-lg border border-gray-300 outline-none bg-white/90 text-sm" /> | ||||||
|  |           </div> | ||||||
|  |           <button type="submit" class="w-full py-3 rounded-xl bg-#8A5AFB text-white font-bold text-base active:scale-95 transition-all duration-200 animate-bounce-in animate-delay-200 mt-2"> | ||||||
|  |             Submit | ||||||
|  |           </button> | ||||||
|  |         </form> | ||||||
|  |       </template> | ||||||
|  |       <template v-else> | ||||||
|  |         <div class="flex flex-col items-center justify-center min-h-[200px] animate-bounce-in"> | ||||||
|  |           <span class="i-mdi:check-circle-outline text-green-500 text-4xl mb-3"></span> | ||||||
|  |           <h2 class="text-lg font-bold text-#8A5AFB mb-2">Submitted successfully!</h2> | ||||||
|  |           <div class="text-gray-700 text-sm mb-3">The information you submitted is as follows:</div> | ||||||
|  |           <div class="w-full bg-white/90 rounded-xl shadow p-3 space-y-1 text-gray-800 text-sm"> | ||||||
|  |             <div><span class="font-semibold">First Name:</span>{{ form.firstName }}</div> | ||||||
|  |             <div><span class="font-semibold">Last Name:</span>{{ form.lastName }}</div> | ||||||
|  |             <div><span class="font-semibold">Email:</span>{{ form.email }}</div> | ||||||
|  |             <div><span class="font-semibold">Company:</span>{{ form.company }}</div> | ||||||
|  |             <div><span class="font-semibold">Phone:</span>{{ form.phone || '(Not filled)' }}</div> | ||||||
|  |             <div><span class="font-semibold">Alert Type:</span>{{ form.alertType === 'all' ? 'All Alerts' : 'Customize Alerts' }}</div> | ||||||
|  |           </div> | ||||||
|  |         </div> | ||||||
|  |       </template> | ||||||
|  |     </div> | ||||||
|   </main> |   </main> | ||||||
|   <footer> |  | ||||||
| 
 |  | ||||||
|   </footer> |  | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
| <style scoped lang="scss"> | <style scoped lang="scss"> | ||||||
| 
 | /* Keep mobile background simple */ | ||||||
| </style> | </style> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -11,19 +11,17 @@ import customFooter from '@/components/customFooter/index.vue' | |||||||
|   375 |   375 | ||||||
|   </header> --> |   </header> --> | ||||||
|   <!-- <main ref="main"></main> --> |   <!-- <main ref="main"></main> --> | ||||||
| 
 |   <div class="flex flex-col h-screen"> | ||||||
|     <customHeader /> |     <customHeader /> | ||||||
|   <div style="margin: 80px 0; position: relative; min-height: 100vh;"> |     <div class="bg-[url('@/assets/image/bg-mobile.png')] bg-cover bg-center flex-1" style="margin: 80px 0;"> | ||||||
|     <div class="background-image"></div> |  | ||||||
|     <router-view /> |     <router-view /> | ||||||
|   </div> |   </div> | ||||||
|   <customFooter /> |   <customFooter /> | ||||||
|  | </div> | ||||||
|  |   | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
| <style scoped lang="scss"> | <style scoped lang="scss"> | ||||||
| main { |  | ||||||
|   padding: var(--header-height, 80px) 0 0; |  | ||||||
| } |  | ||||||
| .background-image { | .background-image { | ||||||
|   position: absolute; |   position: absolute; | ||||||
|   top: 0; |   top: 0; | ||||||
|  | |||||||
| @ -1,22 +1,54 @@ | |||||||
| <script setup> | <script setup> | ||||||
| import { NCarousel, NDivider, NMarquee, NPopselect } from "naive-ui"; | import { useStockQuote } from '@/store/stock-quote/index.js'; | ||||||
| import { onUnmounted, ref, watch, onMounted, computed } from "vue"; | const { getStockQuate, stockQuote } = useStockQuote(); | ||||||
| 
 | getStockQuate(); | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <template> | <template> | ||||||
|   <header className="header"> |   <main class="h-60vh flex flex-col items-center justify-center px-2"> | ||||||
|   375 |     <!-- 价格卡片 --> | ||||||
|   </header> |     <section class="w-full max-w-90vw flex flex-col items-center justify-center glass-card p-6 rounded-2xl shadow-lg mb-6"> | ||||||
|   <main ref="main"> |       <div class="text-5xl font-extrabold text-#8A5AFB animate-bg-move select-none drop-shadow-lg">$1.98</div> | ||||||
| 
 |       <div class="mt-4 text-base text-gray-500 font-semibold tracking-widest">NASDAQ: <span class="text-black">UK</span></div> | ||||||
|  |     </section> | ||||||
|  |     <!-- 信息卡片列表 --> | ||||||
|  |     <section class="w-full max-w-90vw grid grid-cols-2 gap-3"> | ||||||
|  |       <div class="info-card"> | ||||||
|  |         <div class="text-xs text-gray-400">Open</div> | ||||||
|  |         <div class="text-xl font-bold">{{ stockQuote.Open }}</div> | ||||||
|  |       </div> | ||||||
|  |       <div class="info-card"> | ||||||
|  |         <div class="text-xs text-gray-400">Change</div> | ||||||
|  |         <div class="text-xl font-bold text-red-500">{{ stockQuote.change?.join('') }}</div> | ||||||
|  |       </div> | ||||||
|  |       <div class="info-card"> | ||||||
|  |         <div class="text-xs text-gray-400">Day's Range</div> | ||||||
|  |         <div class="text-xl font-bold">{{ stockQuote.DaysRange }}</div> | ||||||
|  |       </div> | ||||||
|  |       <div class="info-card"> | ||||||
|  |         <div class="text-xs text-gray-400">52-Week Range</div> | ||||||
|  |         <div class="text-xl font-bold">{{ stockQuote.Week52Range }}</div> | ||||||
|  |       </div> | ||||||
|  |       <div class="info-card"> | ||||||
|  |         <div class="text-xs text-gray-400">Volume</div> | ||||||
|  |         <div class="text-xl font-bold">{{ stockQuote.Volume }}</div> | ||||||
|  |       </div> | ||||||
|  |       <div class="info-card"> | ||||||
|  |         <div class="text-xs text-gray-400">Market Cap</div> | ||||||
|  |         <div class="text-xl font-bold">{{ stockQuote.MarketCap }}</div> | ||||||
|  |       </div> | ||||||
|  |     </section> | ||||||
|   </main> |   </main> | ||||||
|   <footer> |  | ||||||
| 
 |  | ||||||
|   </footer> |  | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
| <style scoped lang="scss"> | <style scoped> | ||||||
| 
 | .glass-card { | ||||||
|  |   backdrop-filter: blur(12px); | ||||||
|  |   background: rgba(255,255,255,0.7); | ||||||
|  |   border: 1px solid rgba(255,255,255,0.3); | ||||||
|  |   box-shadow: 0 4px 16px 0 rgba(31,38,135,0.10); | ||||||
|  | } | ||||||
|  | .info-card { | ||||||
|  |   @apply glass-card p-3 rounded-lg flex flex-col items-start gap-1; | ||||||
|  | } | ||||||
| </style> | </style> | ||||||
| 
 |  | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user