Compare commits

...

6 Commits

6 changed files with 180 additions and 53 deletions

View File

@ -1,22 +1,63 @@
<script setup>
import { NCarousel, NDivider, NMarquee, NPopselect } from "naive-ui";
import { onUnmounted, ref, watch, onMounted, computed } from "vue";
import { ref } from 'vue'
import { NCard, NRadioGroup, NRadio, NInput, NDatePicker, NButton } from 'naive-ui'
const investmentType = ref('amount')
const amount = ref(10000)
const dividendType = ref('notReinvested')
const investmentDate = ref(null)
const handleSubmit = () => {
}
</script>
<template>
<header className="header">
375
</header>
<main ref="main">
</main>
<footer>
</footer>
<div class="flex-center h-60vh px-2 py-4 animate-bg-move">
<n-card
class="w-full max-w-90vw glass-card animate-bounce-in shadow-lg border-none"
:content-style="{padding: '20px 10px'}"
:header-style="{background: 'transparent'}"
>
<div class="flex flex-col gap-6">
<!-- 投资类型 -->
<div>
<div class="text-base font-bold mb-2">Investment Type</div>
<n-radio-group v-model:value="investmentType" name="investmentType">
<n-radio value="amount">Amount invested (in dollars)</n-radio>
<n-radio value="shares">Number of shares purchased</n-radio>
</n-radio-group>
</div>
<!-- 金额与分红 -->
<div>
<div class="text-base font-bold mb-2">Amount to Calculate</div>
<n-input v-model:value="amount" type="number" class="mb-2" size="medium" placeholder="Enter amount" />
<n-radio-group v-model:value="dividendType" name="dividendType">
<n-radio value="reinvested">Dividends reinvested</n-radio>
<n-radio value="notReinvested">Dividends not reinvested</n-radio>
</n-radio-group>
</div>
<!-- 投资日期 -->
<div>
<div class="text-base font-bold mb-2">Investment Date</div>
<n-date-picker v-model:value="investmentDate" type="date" class="w-full" size="medium" placeholder="Select date" />
</div>
</div>
<div class="flex justify-end mt-6">
<n-button type="primary" size="medium" class="px-6 py-2 rounded-full animate-bounce-in hover:scale-105 transition-transform duration-300 shadow" @click="handleSubmit">
Submit
</n-button>
</div>
</n-card>
</div>
</template>
<style scoped lang="scss">
<style scoped>
.glass-card {
background: rgba(255,255,255,0.18);
box-shadow: 0 4px 16px 0 rgba(31, 38, 135, 0.18);
backdrop-filter: blur(10px);
border-radius: 20px;
border: 1px solid rgba(255,255,255,0.18);
}
</style>

View File

@ -6,10 +6,8 @@ function copyEmail() {
</script>
<template>
<header class="header-mobile">
<!-- 可根据需要添加移动端头部内容 -->
</header>
<main ref="main" class="flex flex-col items-center from-primary to-accent w-[100vw] mt-8 animate-fade-in px-4 py-8 bg-[url('@/assets/image/bg-mobile.png')]">
<main ref="main" class="flex flex-col items-center from-primary to-accent w-[100vw] mt-8 animate-fade-in px-4 py-8 pt-500px bg-[url('@/assets/image/bg-mobile.png')]">
<div class="w-full flex flex-col items-center gap-4 px-2">
<h1 class="text-2xl font-bold text-primary animate-fade-in-down animate-delay-0">Investor Contacts</h1>
<div class="text-lg font-semibold text-gray-800 animate-fade-in-down animate-delay-200">FiEE Inc.</div>
@ -20,9 +18,7 @@ function copyEmail() {
</div>
</div>
</main>
<footer class="footer-mobile">
<!-- 可根据需要添加移动端底部内容 -->
</footer>
</template>
<style scoped lang="scss">

View File

@ -7,7 +7,7 @@ const form = ref({
email: "",
company: "",
phone: "",
alertType: "all"
alertType: "all"
});
const submitted = ref(false);

View File

@ -1,22 +1,75 @@
<script setup>
import { NCarousel, NDivider, NMarquee, NPopselect } from "naive-ui";
import { onUnmounted, ref, watch, onMounted, computed } from "vue";
import { ref } 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>
<template>
<header className="header">
375
</header>
<main ref="main">
<main class="min-h-60vh flex flex-col items-center justify-center relative px-4 py-8">
<!-- Card -->
<div class="w-full max-w-90vw p-4 bg-white/95 rounded-2xl shadow-lg animate-bounce-in">
<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>
<footer>
</footer>
</template>
<style scoped lang="scss">
/* Keep mobile background simple */
</style>

View File

@ -11,19 +11,17 @@ import customFooter from '@/components/customFooter/index.vue'
375
</header> -->
<!-- <main ref="main"></main> -->
<customHeader />
<div style="margin: 80px 0; position: relative; min-height: 100vh;">
<div class="background-image"></div>
<div class="flex flex-col h-screen">
<customHeader />
<div class="bg-[url('@/assets/image/bg-mobile.png')] bg-cover bg-center flex-1" style="margin: 80px 0;">
<router-view />
</div>
<customFooter />
</div>
</template>
<style scoped lang="scss">
main {
padding: var(--header-height, 80px) 0 0;
}
.background-image {
position: absolute;
top: 0;

View File

@ -1,22 +1,61 @@
<script setup>
import { NCarousel, NDivider, NMarquee, NPopselect } from "naive-ui";
import { onUnmounted, ref, watch, onMounted, computed } from "vue";
import { useStockQuote } from '@/store/stock-quote/index.js';
const { getStockQuate, stockQuote } = useStockQuote();
getStockQuate();
</script>
<template>
<header className="header">
375
</header>
<main ref="main">
<main class="min-h-60vh flex flex-col items-center justify-start px-2 py-5 pt-500px">
<!-- 价格卡片 -->
<section class="w-full max-w-90vw flex flex-col items-center justify-center glass-card p-4 rounded-2xl shadow mb-5">
<div class="text-4xl font-extrabold text-#8A5AFB animate-bg-move select-none drop-shadow-lg">$1.98</div>
<div class="mt-2 text-sm 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-2">
<div class="info-card">
<div class="text-xs text-gray-400">Open</div>
<div class="text-lg font-bold">{{ stockQuote.Open }}</div>
</div>
<div class="info-card">
<div class="text-xs text-gray-400">Change</div>
<div class="text-lg 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-lg font-bold">{{ stockQuote.DaysRange }}</div>
</div>
<div class="info-card">
<div class="text-xs text-gray-400">52-Week Range</div>
<div class="text-lg font-bold">{{ stockQuote.Week52Range }}</div>
</div>
<div class="info-card">
<div class="text-xs text-gray-400">Volume</div>
<div class="text-lg font-bold">{{ stockQuote.Volume }}</div>
</div>
<div class="info-card">
<div class="text-xs text-gray-400">Market Cap</div>
<div class="text-lg font-bold">{{ stockQuote.MarketCap }}</div>
</div>
</section>
</main>
<footer>
</footer>
</template>
<style scoped lang="scss">
<style scoped>
.glass-card {
backdrop-filter: blur(10px);
background: rgba(255,255,255,0.92);
border: 1px solid rgba(200,200,255,0.18);
box-shadow: 0 2px 8px 0 rgba(31,38,135,0.08);
}
.info-card {
background: rgba(255,255,255,0.95);
border-radius: 16px;
box-shadow: 0 1px 4px 0 rgba(31,38,135,0.06);
padding: 12px 10px;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 2px;
}
</style>