stockfolio-tracker / index.html
Humaniz's picture
creat sqlite database and complete this site
f6e40df verified
Raw
History Blame Contribute Delete
28.4 kB
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Stockfolio PKX - Pakistan Stock Exchange Tracker</title>
<link rel="icon" type="image/x-icon" href="/static/favicon.ico">
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://unpkg.com/feather-icons"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vanta@latest/dist/vanta.globe.min.js"></script>
<script>
tailwind.config = {
theme: {
extend: {
colors: {
primary: {
100: '#d1fae5',
500: '#10b981',
900: '#064e3b',
},
secondary: {
100: '#e0e7ff',
500: '#6366f1',
900: '#3730a3',
}
}
}
}
}
</script>
<style>
.hero-bg {
background: linear-gradient(135deg, rgba(16, 185, 129, 0.1) 0%, rgba(99, 102, 241, 0.1) 100%);
}
.stock-card:hover {
transform: translateY(-5px);
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
}
</style>
</head>
<body class="bg-gray-50">
<!-- Navbar -->
<nav class="bg-white shadow-sm">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex justify-between h-16">
<div class="flex items-center">
<div class="flex-shrink-0 flex items-center">
<i data-feather="trending-up" class="text-primary-500 h-8 w-8"></i>
<span class="ml-2 text-xl font-bold text-gray-900">Stockfolio <span class="text-secondary-500">PKX</span></span>
</div>
<div class="hidden sm:ml-6 sm:flex sm:space-x-8">
<a href="#" class="border-primary-500 text-gray-900 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium">Dashboard</a>
<a href="#" class="border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium">PSX Companies</a>
<a href="#" class="border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium">Sector Analysis</a>
<a href="#" class="border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium">UAC Reports</a>
</div>
</div>
<div class="hidden sm:ml-6 sm:flex sm:items-center">
<div class="flex space-x-2">
<a href="#" class="bg-green-500 hover:bg-green-600 text-white px-3 py-1 rounded-full text-sm flex items-center">
<i data-feather="facebook" class="w-4 h-4 mr-1"></i> Login
</a>
<a href="#" class="bg-blue-500 hover:bg-blue-600 text-white px-3 py-1 rounded-full text-sm flex items-center">
<i data-feather="twitter" class="w-4 h-4 mr-1"></i> Login
</a>
<a href="#" class="bg-red-500 hover:bg-red-600 text-white px-3 py-1 rounded-full text-sm flex items-center">
<i data-feather="mail" class="w-4 h-4 mr-1"></i> Login
</a>
</div>
</div>
<div class="-mr-2 flex items-center sm:hidden">
<button type="button" class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-primary-500">
<i data-feather="menu"></i>
</button>
</div>
</div>
</div>
</nav>
<!-- Hero Section -->
<div id="hero" class="hero-bg">
<div class="max-w-7xl mx-auto py-12 px-4 sm:px-6 lg:px-8">
<div class="lg:grid lg:grid-cols-2 lg:gap-8 items-center">
<div class="mb-8 lg:mb-0">
<h1 class="text-4xl font-extrabold text-gray-900 sm:text-5xl sm:tracking-tight lg:text-6xl">
Pakistan Stock Exchange <span class="text-primary-500">Tracker</span>
</h1>
<p class="mt-5 max-w-xl text-xl text-gray-500">
Real-time PSX data, sector analysis, and portfolio tracking in PKR. Integrated with SECP UAC for compliance.
</p>
<div class="mt-8 flex flex-col sm:flex-row gap-4">
<a href="#" class="flex items-center justify-center px-8 py-3 border border-transparent text-base font-medium rounded-md text-white bg-primary-500 hover:bg-primary-600 md:py-4 md:text-lg md:px-10">
Get Started
</a>
<a href="#" class="flex items-center justify-center px-8 py-3 border border-transparent text-base font-medium rounded-md text-primary-500 bg-white hover:bg-gray-50 md:py-4 md:text-lg md:px-10">
<i data-feather="play" class="mr-2"></i> Watch Demo
</a>
</div>
</div>
<div class="relative">
<div class="relative w-full overflow-hidden rounded-xl shadow-xl">
<div class="bg-white p-6">
<div class="flex justify-between items-center mb-4">
<h3 class="text-lg font-medium text-gray-900">PSX Snapshot</h3>
<span class="px-3 py-1 rounded-full text-sm font-medium bg-green-100 text-green-800" id="kse100Change">Loading...</span>
</div>
<canvas id="portfolioChart" height="250"></canvas>
<div class="mt-6 grid grid-cols-3 gap-4">
<div class="bg-gray-50 p-3 rounded-lg">
<p class="text-sm text-gray-500">KSE-100 Index</p>
<p class="text-xl font-semibold" id="kse100Index">Loading...</p>
</div>
<div class="bg-gray-50 p-3 rounded-lg">
<p class="text-sm text-gray-500">Volume (mn)</p>
<p class="text-xl font-semibold" id="psxVolume">Loading...</p>
</div>
<div class="bg-gray-50 p-3 rounded-lg">
<p class="text-sm text-gray-500">Value (mn PKR)</p>
<p class="text-xl font-semibold" id="psxValue">Loading...</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Main Content -->
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
<!-- Market Overview -->
<div class="mb-12">
<div class="flex justify-between items-center mb-6">
<h2 class="text-2xl font-bold text-gray-900">Market Overview</h2>
<a href="#" class="text-primary-500 hover:text-primary-600 flex items-center">
View all <i data-feather="chevron-right" class="ml-1"></i>
</a>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6" id="topStocksContainer">
<!-- Top Stocks will be loaded here via API -->
<div class="text-center py-8">
<i data-feather="loader" class="animate-spin h-8 w-8 text-primary-500 mx-auto"></i>
<p class="mt-2 text-gray-500">Loading PSX data...</p>
</div>
</div>
</div>
<!-- Portfolio Performance -->
<div class="mb-12">
<h2 class="text-2xl font-bold text-gray-900 mb-6">Portfolio Performance</h2>
<div class="bg-white shadow overflow-hidden sm:rounded-lg">
<div class="px-4 py-5 sm:px-6 border-b border-gray-200">
<h3 class="text-lg leading-6 font-medium text-gray-900">Investment Growth</h3>
</div>
<div class="px-4 py-5 sm:p-6">
<canvas id="performanceChart" height="300"></canvas>
</div>
</div>
</div>
<!-- Recent Transactions -->
<div>
<div class="flex justify-between items-center mb-6">
<h2 class="text-2xl font-bold text-gray-900">Recent Transactions</h2>
<a href="#" class="text-primary-500 hover:text-primary-600 flex items-center">
View all <i data-feather="chevron-right" class="ml-1"></i>
</a>
</div>
<div class="bg-white shadow overflow-hidden sm:rounded-lg">
<ul class="divide-y divide-gray-200">
<li class="px-4 py-4 sm:px-6">
<div class="flex items-center justify-between">
<div class="flex items-center">
<div class="flex-shrink-0 bg-green-100 p-2 rounded-md">
<i data-feather="arrow-up-right" class="text-green-600"></i>
</div>
<div class="ml-4">
<p class="text-sm font-medium text-gray-900">Bought AAPL</p>
<p class="text-sm text-gray-500">10 shares at $145.32</p>
</div>
</div>
<div class="text-right">
<p class="text-sm font-medium text-gray-900">-$1,453.20</p>
<p class="text-sm text-gray-500">Today, 10:45 AM</p>
</div>
</div>
</li>
<li class="px-4 py-4 sm:px-6">
<div class="flex items-center justify-between">
<div class="flex items-center">
<div class="flex-shrink-0 bg-red-100 p-2 rounded-md">
<i data-feather="arrow-down-left" class="text-red-600"></i>
</div>
<div class="ml-4">
<p class="text-sm font-medium text-gray-900">Sold MSFT</p>
<p class="text-sm text-gray-500">5 shares at $298.76</p>
</div>
</div>
<div class="text-right">
<p class="text-sm font-medium text-gray-900">+$1,493.80</p>
<p class="text-sm text-gray-500">Yesterday, 2:30 PM</p>
</div>
</div>
</li>
<li class="px-4 py-4 sm:px-6">
<div class="flex items-center justify-between">
<div class="flex items-center">
<div class="flex-shrink-0 bg-green-100 p-2 rounded-md">
<i data-feather="arrow-up-right" class="text-green-600"></i>
</div>
<div class="ml-4">
<p class="text-sm font-medium text-gray-900">Bought TSLA</p>
<p class="text-sm text-gray-500">3 shares at $712.45</p>
</div>
</div>
<div class="text-right">
<p class="text-sm font-medium text-gray-900">-$2,137.35</p>
<p class="text-sm text-gray-500">2 days ago</p>
</div>
</div>
</li>
<li class="px-4 py-4 sm:px-6">
<div class="flex items-center justify-between">
<div class="flex items-center">
<div class="flex-shrink-0 bg-green-100 p-2 rounded-md">
<i data-feather="arrow-up-right" class="text-green-600"></i>
</div>
<div class="ml-4">
<p class="text-sm font-medium text-gray-900">Bought GOOGL</p>
<p class="text-sm text-gray-500">2 shares at $2,398.12</p>
</div>
</div>
<div class="text-right">
<p class="text-sm font-medium text-gray-900">-$4,796.24</p>
<p class="text-sm text-gray-500">3 days ago</p>
</div>
</div>
</li>
</ul>
</div>
</div>
</div>
<!-- Footer -->
<footer class="bg-gray-800">
<div class="max-w-7xl mx-auto py-12 px-4 sm:px-6 lg:px-8">
<div class="grid grid-cols-1 md:grid-cols-3 gap-8">
<div>
<h3 class="text-white text-lg font-semibold mb-4">Stockfolio</h3>
<p class="text-gray-300 text-sm">
Your personal stock portfolio management solution. Track, analyze, and optimize your investments with ease.
</p>
</div>
<div>
<h3 class="text-white text-lg font-semibold mb-4">Quick Links</h3>
<ul class="space-y-2">
<li><a href="#" class="text-gray-300 hover:text-white text-sm">Dashboard</a></li>
<li><a href="#" class="text-gray-300 hover:text-white text-sm">Portfolio</a></li>
<li><a href="#" class="text-gray-300 hover:text-white text-sm">Watchlist</a></li>
<li><a href="#" class="text-gray-300 hover:text-white text-sm">Reports</a></li>
</ul>
</div>
<div>
<h3 class="text-white text-lg font-semibold mb-4">Connect</h3>
<div class="flex space-x-4">
<a href="#" class="sso-login text-gray-300 hover:text-white" data-provider="facebook">
<i data-feather="facebook"></i>
</a>
<a href="#" class="sso-login text-gray-300 hover:text-white" data-provider="twitter">
<i data-feather="twitter"></i>
</a>
<a href="#" class="sso-login text-gray-300 hover:text-white" data-provider="google">
<i data-feather="mail"></i>
</a>
<a href="#" class="text-gray-300 hover:text-white">
<i data-feather="smartphone"></i>
</a>
</div>
<p class="mt-4 text-gray-300 text-sm">
Subscribe to our newsletter for market insights.
</p>
<div class="mt-2 flex">
<input type="email" placeholder="Your email" class="px-4 py-2 rounded-l-md text-sm w-full focus:outline-none focus:ring-2 focus:ring-primary-500">
<button class="bg-primary-500 hover:bg-primary-600 text-white px-4 py-2 rounded-r-md text-sm font-medium">
<i data-feather="send" class="w-4 h-4"></i>
</button>
</div>
</div>
</div>
<div class="mt-8 pt-8 border-t border-gray-700">
<p class="text-gray-300 text-sm text-center">
&copy; 2023 Stockfolio PKX. SECP UAC compliant. All rights reserved.
</p>
</div>
</div>
</footer>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script src="/js/api.js"></script>
<script>
// Initialize charts and load PSX data
document.addEventListener('DOMContentLoaded', function() {
feather.replace();
// PSX Data API Integration
async function fetchPSXData() {
try {
// Fetch market data from our own API
const [marketSummary, topStocks] = await Promise.all([
StockfolioAPI.getMarketSummary(),
StockfolioAPI.getTopStocks()
]);
// Update market summary
document.getElementById('kse100Index').textContent = marketSummary.kse100.toLocaleString('en-PK');
document.getElementById('psxVolume').textContent = (marketSummary.volume / 1000000).toFixed(2);
document.getElementById('psxValue').textContent = (marketSummary.value / 1000000).toFixed(2);
const changePercent = marketSummary.change_percent;
document.getElementById('kse100Change').textContent = changePercent > 0 ?
`+${changePercent.toFixed(2)}%` :
`${changePercent.toFixed(2)}%`;
if (changePercent < 0) {
document.getElementById('kse100Change').classList.remove('bg-green-100', 'text-green-800');
document.getElementById('kse100Change').classList.add('bg-red-100', 'text-red-800');
}
// Render top stocks
renderTopStocks(topStocks);
const kse100Data = response.data;
document.getElementById('kse100Index').textContent = kse100Data.current.toLocaleString('en-PK');
document.getElementById('kse100Change').textContent = kse100Data.change > 0 ?
`+${kse100Data.change.toFixed(2)}%` :
`${kse100Data.change.toFixed(2)}%`;
if (kse100Data.change < 0) {
document.getElementById('kse100Change').classList.remove('bg-green-100', 'text-green-800');
document.getElementById('kse100Change').classList.add('bg-red-100', 'text-red-800');
}
// Fetch volume and value
const marketData = await axios.get('https://psx-api.example.com/market-summary');
document.getElementById('psxVolume').textContent = (marketData.data.volume / 1000000).toFixed(2);
document.getElementById('psxValue').textContent = (marketData.data.value / 1000000).toFixed(2);
// Fetch top stocks
const topStocks = await axios.get('https://psx-api.example.com/top-stocks');
renderTopStocks(topStocks.data);
// Initialize charts with sample data
initializeCharts([
{ date: 'Jan', close: 42000 },
{ date: 'Feb', close: 43500 },
{ date: 'Mar', close: 42800 },
{ date: 'Apr', close: 44500 },
{ date: 'May', close: 46000 },
{ date: 'Jun', close: 45500 }
]);
} catch (error) {
console.error('Error fetching PSX data:', error);
// Fallback data or error handling
}
}
function renderTopStocks(stocks) {
const container = document.getElementById('topStocksContainer');
container.innerHTML = '';
stocks.forEach(stock => {
const changeClass = stock.change > 0 ?
'bg-green-100 text-green-800' :
'bg-red-100 text-red-800';
const changeIcon = stock.change > 0 ?
'arrow-up-right' :
'arrow-down-left';
const card = document.createElement('div');
card.className = 'stock-card bg-white overflow-hidden shadow rounded-lg transition-all duration-300 ease-in-out';
card.innerHTML = `
<div class="px-4 py-5 sm:p-6">
<div class="flex items-center justify-between">
<div class="flex items-center">
<div class="flex-shrink-0 bg-gray-100 p-2 rounded-md">
<i data-feather="${changeIcon}" class="text-primary-500"></i>
</div>
<div class="ml-4">
<h3 class="text-lg font-medium text-gray-900">${stock.symbol}</h3>
<p class="text-sm text-gray-500">${stock.company}</p>
</div>
</div>
<span class="px-2 py-1 text-xs font-medium rounded-full ${changeClass}">${stock.change > 0 ? '+' : ''}${stock.change.toFixed(2)}%</span>
</div>
<div class="mt-6 flex justify-between items-center">
<div>
<p class="text-sm text-gray-500">Current Price</p>
<p class="text-2xl font-semibold text-gray-900">${stock.price.toLocaleString('en-PK')} PKR</p>
</div>
<div class="text-right">
<p class="text-sm text-gray-500">Volume</p>
<p class="text-xl font-semibold text-primary-500">${(stock.volume / 1000).toFixed(0)}K</p>
</div>
</div>
</div>
`;
container.appendChild(card);
});
feather.replace();
}
function initializeCharts(historyData) {
// Portfolio Chart - Show sector distribution
const portfolioCtx = document.getElementById('portfolioChart').getContext('2d');
const portfolioChart = new Chart(portfolioCtx, {
type: 'doughnut',
data: {
labels: ['Banking', 'Oil & Gas', 'Cement', 'Power', 'Textile', 'Others'],
datasets: [{
data: [35, 20, 15, 10, 8, 12],
backgroundColor: [
'#10b981',
'#6366f1',
'#f59e0b',
'#ef4444',
'#8b5cf6',
'#14b8a6'
],
borderWidth: 0
}]
},
options: {
cutout: '70%',
plugins: {
legend: {
position: 'bottom',
labels: {
boxWidth: 12,
padding: 20,
usePointStyle: true,
pointStyle: 'circle'
}
}
}
}
});
// Performance Chart - Show KSE-100 historical data
const performanceCtx = document.getElementById('performanceChart').getContext('2d');
const performanceChart = new Chart(performanceCtx, {
type: 'line',
data: {
labels: historyData.map(item => item.date),
datasets: [{
label: 'KSE-100 Index',
data: historyData.map(item => item.close),
borderColor: '#10b981',
backgroundColor: 'rgba(16, 185, 129, 0.05)',
borderWidth: 2,
pointBackgroundColor: '#10b981',
pointRadius: 3,
pointHoverRadius: 5,
fill: true,
tension: 0.3
}]
},
options: {
responsive: true,
plugins: {
legend: {
display: false
},
tooltip: {
callbacks: {
label: function(context) {
return `KSE-100: ${context.raw.toLocaleString('en-PK')} PKR`;
}
}
}
},
scales: {
y: {
beginAtZero: false,
grid: {
drawBorder: false
},
ticks: {
callback: function(value) {
return value.toLocaleString('en-PK') + ' PKR';
}
}
},
x: {
grid: {
display: false
}
}
}
}
});
}
// Initialize SSO and UAC integration
function initializeAuth() {
// SSO Login Handlers
document.querySelectorAll('.sso-login').forEach(btn => {
btn.addEventListener('click', (e) => {
e.preventDefault();
const provider = btn.dataset.provider;
window.location.href = `/auth/${provider}`;
});
});
// UAC Compliance Check
if (localStorage.getItem('uac_verified') !== 'true') {
// Show UAC verification modal
console.log('UAC verification required');
// In a real app, this would redirect to SECP UAC verification
}
}
// Initialize everything
fetchPSXData();
initializeAuth();
// Vanta.js Globe Animation
VANTA.GLOBE({
el: '#hero',
mouseControls: true,
touchControls: true,
gyroControls: false,
minHeight: 200.00,
minWidth: 200.00,
scale: 1.00,
scaleMobile: 1.00,
color: '#10b981',
backgroundColor: 'rgba(249, 250, 251, 0.5)',
size: 0.8
});
});
</script>
</body>
</html>