laravel-project/templates/mobileView/online_viewer_net (2).htm

1396 lines
42 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Take One Sports App</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH"
crossorigin="anonymous">
<link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
integrity="sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA=="
crossorigin="anonymous"
referrerpolicy="no-referrer"/>
<style>
:root {
--primary-color: #6c63ff;
--secondary-bg: #f5f5f9;
--white: #ffffff;
--text-dark: #333333;
--text-medium: #555555;
--text-light: #999999;
--border-color: #eeeeee;
--light-gray-bg: #f7f7f7;
--activity-accent: #00bcd4;
--tab-bar-height: 62px;
--app-padding: 16px;
}
* { box-sizing: border-box; }
body {
margin: 0;
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
background-color: var(--secondary-bg);
color: var(--text-dark);
min-height: 100vh;
display: flex;
flex-direction: column;
}
/* Sidebar */
.app-sidebar {
position: fixed;
top: 0;
left: -260px;
width: 260px;
height: 100vh;
background: var(--white);
box-shadow: 2px 0 8px rgba(0,0,0,0.15);
z-index: 60;
display: flex;
flex-direction: column;
padding: 12px;
transition: left 0.25s ease-out;
}
.app-sidebar.open {
left: 0;
}
.app-sidebar-backdrop {
position: fixed;
inset: 0;
background: rgba(0,0,0,0.35);
z-index: 55;
display: none;
}
.app-sidebar-backdrop.show {
display: block;
}
.sidebar-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 8px;
}
.sidebar-title {
font-weight: 700;
color: var(--primary-color);
font-size: 16px;
}
.sidebar-close {
border: none;
background: transparent;
font-size: 22px;
line-height: 1;
color: var(--text-medium);
}
.sidebar-section-label {
font-size: 11px;
text-transform: uppercase;
color: var(--text-light);
margin-top: 8px;
margin-bottom: 4px;
}
.sidebar-link {
width: 100%;
border: none;
background: transparent;
display: flex;
align-items: center;
gap: 8px;
padding: 8px 6px;
border-radius: 8px;
font-size: 13px;
color: var(--text-medium);
text-align: left;
cursor: pointer;
}
.sidebar-link span:first-child {
width: 22px;
text-align: center;
}
.sidebar-link:hover {
background: #f3f3f7;
}
/* App header */
.app-header {
flex-shrink: 0;
padding: 10px var(--app-padding);
padding-top: 14px;
background: var(--white);
border-bottom: 1px solid var(--border-color);
display: flex;
align-items: center;
justify-content: space-between;
position: relative;
z-index: 10;
}
.app-header-left {
display: flex;
align-items: center;
gap: 8px;
}
.app-logo {
width: 32px;
height: 32px;
border-radius: 8px;
object-fit: cover;
background: #ddd;
}
.app-title {
display: flex;
flex-direction: column;
}
.app-title span:first-child {
font-size: 12px;
color: var(--text-light);
}
.app-title span:last-child {
font-size: 18px;
font-weight: 700;
color: var(--primary-color);
}
.app-header-actions {
display: flex;
align-items: center;
gap: 8px;
}
.icon-btn {
border: none;
background: transparent;
width: 32px;
height: 32px;
border-radius: 999px;
display: flex;
align-items: center;
justify-content: center;
font-size: 16px;
color: var(--text-medium);
padding: 0;
cursor: pointer;
}
.icon-btn:hover { background: #f3f3f7; }
.pill-btn {
border-radius: 999px;
padding: 6px 14px;
font-size: 13px;
border: none;
background: var(--primary-color);
color: var(--white);
display: inline-flex;
align-items: center;
gap: 6px;
font-weight: 600;
cursor: pointer;
}
/* Content area */
.app-content {
flex: 1;
overflow-y: auto;
padding: 12px var(--app-padding);
padding-bottom: calc(var(--tab-bar-height) + 12px);
}
/* Bottom tab bar */
.app-tab-bar {
position: fixed;
left: 0;
right: 0;
bottom: 0;
height: var(--tab-bar-height);
background: var(--white);
border-top: 1px solid var(--border-color);
display: flex;
justify-content: space-around;
align-items: center;
z-index: 20;
}
.tab-item {
flex: 1;
text-align: center;
font-size: 11px;
color: var(--text-light);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 2px;
cursor: pointer;
}
.tab-item i { font-size: 18px; }
.tab-item.active {
color: var(--primary-color);
font-weight: 600;
}
/* Page containers */
.page-container { display: none; }
.page-container.active-page { display: block; }
/* KPI cards */
.kpi-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 10px;
margin-bottom: 14px;
}
@media (min-width: 540px) {
.kpi-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}
.kpi-card {
background: var(--white);
padding: 12px;
border-radius: 10px;
box-shadow: 0 1px 4px rgba(0,0,0,0.03);
border-left: 3px solid var(--primary-color);
}
.kpi-label {
font-size: 11px;
color: var(--text-light);
margin-bottom: 4px;
}
.kpi-value {
font-size: 18px;
font-weight: 700;
display: flex;
align-items: center;
gap: 4px;
}
.kpi-value span.icon {
font-size: 14px;
color: var(--primary-color);
}
.kpi-change {
font-size: 11px;
margin-top: 4px;
}
.kpi-change.positive { color: #4caf50; }
.kpi-change.negative { color: #f44336; }
.section-card {
background: var(--white);
border-radius: 12px;
padding: 14px;
box-shadow: 0 1px 5px rgba(0,0,0,0.04);
margin-bottom: 12px;
}
.section-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 8px;
}
.section-header h4 {
font-size: 15px;
margin: 0;
color: var(--primary-color);
}
.section-header small {
font-size: 11px;
color: var(--text-light);
}
.hot-package { text-align: center; }
.hot-package-title {
font-size: 16px;
font-weight: 700;
color: var(--primary-color);
margin-bottom: 4px;
}
.hot-package-count {
font-size: 32px;
font-weight: 800;
color: #f44336;
line-height: 1;
}
.hot-package-label {
font-size: 12px;
color: var(--text-medium);
}
.product-list { display: flex; flex-direction: column; gap: 10px; }
.product-item { display: flex; align-items: center; gap: 10px; }
.product-rank {
font-size: 16px;
font-weight: 700;
color: var(--primary-color);
width: 20px;
text-align: center;
}
.product-icon {
width: 34px;
height: 34px;
border-radius: 10px;
background: #f1f1f7;
display: flex;
align-items: center;
justify-content: center;
font-size: 18px;
}
.product-main { flex: 1; min-width: 0; }
.product-main strong {
display: block;
font-size: 13px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.product-main small {
font-size: 11px;
color: var(--text-light);
}
.product-stats {
font-size: 11px;
text-align: right;
min-width: 70px;
}
.product-stats span {
display: block;
font-weight: 600;
color: var(--text-dark);
font-size: 13px;
}
.package-card {
background: var(--white);
border-radius: 12px;
overflow: hidden;
box-shadow: 0 1px 4px rgba(0,0,0,0.04);
margin-bottom: 10px;
}
.package-img {
width: 100%;
height: 120px;
object-fit: cover;
display: block;
}
.package-body { padding: 10px 12px 12px; }
.package-body h5 { font-size: 14px; margin: 0 0 4px; }
.package-body p {
font-size: 11px;
margin: 0 0 6px;
color: var(--text-medium);
}
.package-meta {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 6px;
font-size: 11px;
}
.package-summary {
display: flex;
justify-content: space-between;
font-size: 11px;
color: var(--text-light);
border-top: 1px dashed var(--border-color);
padding-top: 6px;
margin-top: 4px;
}
.package-summary div {
flex: 1;
text-align: center;
padding: 0 3px;
}
.package-actions {
display: flex;
justify-content: flex-end;
gap: 6px;
margin-top: 6px;
}
.activity-card {
background: var(--white);
border-radius: 12px;
box-shadow: 0 1px 4px rgba(0,0,0,0.04);
padding: 10px 12px;
margin-bottom: 10px;
}
.activity-header {
display: flex;
gap: 10px;
margin-bottom: 6px;
}
.activity-thumb {
width: 56px;
height: 56px;
border-radius: 10px;
object-fit: cover;
}
.activity-title {
font-size: 14px;
margin: 0 0 2px;
}
.activity-subtitle {
font-size: 11px;
color: var(--text-light);
}
.activity-grid-row {
display: flex;
gap: 6px;
margin-top: 6px;
}
.activity-grid-row > div {
flex: 1;
background: #f8f9fb;
padding: 6px;
border-radius: 8px;
font-size: 11px;
color: var(--text-medium);
}
.activity-icons-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 6px 4px;
margin-top: 6px;
font-size: 11px;
color: var(--text-light);
}
.activity-icons-grid i {
color: var(--activity-accent);
margin-right: 4px;
}
.activity-actions {
display: flex;
justify-content: flex-end;
gap: 6px;
margin-top: 8px;
}
.profile-card {
background: var(--white);
border-radius: 12px;
padding: 12px;
box-shadow: 0 1px 4px rgba(0,0,0,0.04);
margin-bottom: 12px;
}
.profile-header-content { display: flex; gap: 10px; }
.profile-pic {
width: 70px;
height: 70px;
border-radius: 16px;
object-fit: cover;
background: #ddd;
}
.profile-main-info h3 {
font-size: 16px;
margin: 0 0 4px;
}
.stats-badges {
display: flex;
gap: 10px;
flex-wrap: wrap;
margin-bottom: 6px;
}
.stat-item { font-size: 11px; text-align: center; }
.stat-item .value {
font-size: 15px;
font-weight: 700;
color: var(--primary-color);
}
.tag {
padding: 2px 8px;
border-radius: 999px;
font-size: 10px;
font-weight: 600;
margin-right: 4px;
}
.tag.age { background: #e0f7fa; color: #00bcd4; }
.tag.places { background: #f3e5f5; color: #9c27b0; }
.tag.active { background: #e8f5e9; color: #4caf50; }
.profile-tabs {
display: flex;
gap: 6px;
margin-top: 10px;
border-bottom: 1px solid var(--border-color);
overflow-x: auto;
}
.profile-tabs button {
border: none;
background: transparent;
padding: 8px 10px;
font-size: 12px;
color: var(--text-light);
white-space: nowrap;
cursor: pointer;
}
.profile-tabs button.active {
color: var(--primary-color);
border-bottom: 2px solid var(--primary-color);
font-weight: 600;
}
.tab-content-section {
display: none;
padding-top: 8px;
font-size: 12px;
color: var(--text-medium);
}
.tab-content-section.active { display: block; }
.stats-card {
background: var(--white);
border-radius: 12px;
padding: 12px;
box-shadow: 0 1px 4px rgba(0,0,0,0.04);
margin-bottom: 12px;
}
.stats-card h4 {
font-size: 14px;
margin-bottom: 8px;
color: var(--primary-color);
}
.stats-grid {
display: flex;
flex-direction: column;
gap: 8px;
}
.stat-box {
border-radius: 10px;
padding: 8px;
background: #f7f7fb;
font-size: 12px;
}
.stat-box .count {
font-size: 18px;
font-weight: 700;
margin-bottom: 2px;
}
.progress-bar-container {
width: 100%;
height: 6px;
background: var(--border-color);
border-radius: 999px;
overflow: hidden;
margin-top: 4px;
margin-bottom: 4px;
}
.progress-bar { height: 100%; width: 70%; background: var(--primary-color); }
.sessions .progress-bar { background: var(--primary-color); width: 70%; }
.revenue .progress-bar { background: #4caf50; width: 85%; }
.attendance .progress-bar { background: #ff9800; width: 85%; }
.stat-box small { font-size: 11px; color: var(--text-light); }
.placeholder-card {
background: var(--white);
border-radius: 12px;
padding: 16px;
text-align: center;
box-shadow: 0 1px 4px rgba(0,0,0,0.04);
font-size: 13px;
}
.placeholder-card h2 {
font-size: 18px;
margin-bottom: 6px;
color: var(--primary-color);
}
.modal-overlay {
position: fixed;
inset: 0;
background: rgba(0,0,0,0.55);
display: none;
align-items: flex-end;
justify-content: center;
z-index: 50;
}
.modal-overlay.open { display: flex; }
.modal-sheet {
background: var(--white);
width: 100%;
border-radius: 16px 16px 0 0;
max-height: 90vh;
display: flex;
flex-direction: column;
padding: 10px 12px 12px;
}
.modal-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 8px;
}
.modal-header h4 {
margin: 0;
font-size: 15px;
color: var(--primary-color);
}
.modal-header p {
margin: 0;
font-size: 11px;
color: var(--text-light);
}
.modal-close-btn {
border: none;
background: transparent;
font-size: 20px;
line-height: 1;
color: var(--text-medium);
cursor: pointer;
}
.pos-body {
flex: 1;
overflow-y: auto;
display: flex;
flex-direction: column;
gap: 10px;
}
.category-tabs {
display: flex;
gap: 6px;
overflow-x: auto;
padding-bottom: 6px;
}
.category-tab-btn {
border: none;
background: #f3f3f7;
padding: 6px 12px;
border-radius: 999px;
font-size: 11px;
white-space: nowrap;
color: var(--text-medium);
cursor: pointer;
}
.category-tab-btn.active {
background: var(--primary-color);
color: var(--white);
}
.product-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 8px;
margin-bottom: 6px;
}
.product-tile {
background: #f8f8fc;
border-radius: 10px;
padding: 8px 6px;
text-align: center;
font-size: 11px;
cursor: pointer;
}
.product-tile img {
width: 46px;
height: 46px;
object-fit: cover;
border-radius: 10px;
margin-bottom: 4px;
}
.product-tile strong {
display: block;
font-size: 11px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.product-tile small {
font-size: 11px;
color: #f44336;
font-weight: 600;
}
.cart-section {
border-top: 1px solid var(--border-color);
padding-top: 8px;
}
.cart-list {
max-height: 170px;
overflow-y: auto;
margin-bottom: 6px;
}
.cart-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 4px 0;
font-size: 11px;
border-bottom: 1px dashed var(--border-color);
}
.cart-item-name {
font-weight: 600;
font-size: 12px;
}
.cart-item-price {
font-size: 11px;
color: var(--text-light);
}
.quantity-control {
display: flex;
align-items: center;
border-radius: 999px;
border: 1px solid var(--border-color);
overflow: hidden;
}
.qty-btn {
border: none;
background: var(--light-gray-bg);
width: 22px;
height: 22px;
font-size: 14px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
}
.qty-display {
padding: 0 6px;
font-weight: 600;
font-size: 11px;
}
.cart-totals { font-size: 12px; }
.cart-totals-row {
display: flex;
justify-content: space-between;
margin-bottom: 2px;
}
.cart-totals-row.grand {
margin-top: 4px;
font-size: 14px;
font-weight: 700;
}
.cart-totals-row.grand span:last-child { color: #f44336; }
.pay-button {
width: 100%;
margin-top: 6px;
border-radius: 999px;
padding: 10px;
border: none;
background: var(--primary-color);
color: var(--white);
font-weight: 600;
font-size: 14px;
cursor: pointer;
}
</style>
</head>
<body>
<!-- Sidebar -->
<div id="sidebar" class="app-sidebar">
<div class="sidebar-header">
<div class="sidebar-title">Take One Sports</div>
<button class="sidebar-close" onclick="toggleSidebar(false)">&times;</button>
</div>
<div class="sidebar-section-label">Core Business</div>
<button class="sidebar-link" onclick="setTabById('dashboard_page')">
<span>🏠</span> Dashboard
</button>
<button class="sidebar-link" onclick="setTabById('packages_page')">
<span>📦</span> Packages
</button>
<button class="sidebar-link" onclick="setTabById('user_overview_page')">
<span>👤</span> User Overview
</button>
<button class="sidebar-link" onclick="setTabById('invoicing_payments_page')">
<span>💰</span> Invoicing & Payments
</button>
<div class="sidebar-section-label">People</div>
<button class="sidebar-link" onclick="setTabById('members_page')">
<span>👥</span> Members
</button>
</div>
<div id="sidebarBackdrop" class="app-sidebar-backdrop" onclick="toggleSidebar(false)"></div>
<header class="app-header">
<div class="app-header-left">
<img src="https://bio.innovator.bh/assets/img/2_1757425606.png"
class="app-logo"
onclick="toggleSidebar(true)"
style="cursor:pointer"
onerror="this.onerror=null;this.src='https://placehold.co/64x64/6c63ff/ffffff?text=T1';">
<div class="app-title">
<span>Take One Sports</span>
<span id="appTitle">Dashboard</span>
</div>
</div>
<div class="app-header-actions">
<button class="icon-btn" onclick="toggleDropdown('notificationDropdown')">
<i class="fa fa-bell"></i>
</button>
<button class="pill-btn" onclick="openModal('quickSaleModal')">
<i class="fa fa-bolt"></i><span>Quick Sale</span>
</button>
</div>
</header>
<div id="notificationDropdown" class="section-card" style="position:absolute;top:60px;right:10px;left:10px;display:none;z-index:30;">
<div class="section-header">
<h4>Notifications</h4>
<small>3 new</small>
</div>
<div style="font-size:12px;">
<div class="mb-2">
<strong>Membership Renewal</strong><br>
<span class="text-muted">John Doe's membership renews tomorrow.</span>
</div>
<div class="mb-2">
<strong>New Enrollment</strong><br>
<span class="text-muted">Jane Smith signed up for Premium Fitness.</span>
</div>
<div>
<strong>Support Ticket #45</strong><br>
<span class="text-muted">Resolved by Staff Member A.</span>
</div>
</div>
</div>
<main class="app-content">
<!-- Dashboard -->
<section id="dashboard_page" class="page-container active-page">
<div class="kpi-grid">
<div class="kpi-card">
<div class="kpi-label">Active Members</div>
<div class="kpi-value">
<span class="icon"><i class="fa fa-users"></i></span>
<span>325</span>
</div>
<div class="kpi-change positive">+12 this month</div>
</div>
<div class="kpi-card">
<div class="kpi-label">Active Packages</div>
<div class="kpi-value">
<span class="icon"><i class="fa fa-dumbbell"></i></span>
<span>18</span>
</div>
<div class="kpi-change positive">+3 new offers</div>
</div>
<div class="kpi-card">
<div class="kpi-label">Revenue (month)</div>
<div class="kpi-value">
<span class="icon"><i class="fa fa-dollar-sign"></i></span>
<span>BD 9,450</span>
</div>
<div class="kpi-change positive">+18% vs last</div>
</div>
<div class="kpi-card">
<div class="kpi-label">Attendance</div>
<div class="kpi-value">
<span class="icon"><i class="fa fa-chart-line"></i></span>
<span>87%</span>
</div>
<div class="kpi-change negative">-3% vs last</div>
</div>
</div>
<div class="section-card">
<div class="section-header">
<h4>Membership Trend</h4>
<small>Charts placeholder</small>
</div>
<p style="font-size:12px;color:var(--text-medium);margin:0;">
This section is ready for a chart library integration inside the app view.
</p>
</div>
<div class="section-card hot-package">
<div class="section-header">
<h4>Hot Package</h4>
<small>This month</small>
</div>
<div class="hot-package-title">Unlimited Taekwondo</div>
<div class="hot-package-count">42</div>
<div class="hot-package-label">New enrollments</div>
<p style="font-size:11px;color:var(--text-light);margin-top:6px;">
Strong interest from age 815 segment.
</p>
</div>
<div class="section-card">
<div class="section-header">
<h4>Profit Summary</h4>
<small>This month</small>
</div>
<div style="display:flex;gap:8px;font-size:12px;">
<div style="flex:1;text-align:center;">
<div style="font-size:16px;font-weight:800;">BD 9,450</div>
<div style="color:var(--text-light);">Revenue</div>
</div>
<div style="flex:1;text-align:center;">
<div style="font-size:16px;font-weight:800;">BD 3,200</div>
<div style="color:var(--text-light);">Expenses</div>
</div>
<div style="flex:1;text-align:center;">
<div style="font-size:16px;font-weight:800;">BD 6,250</div>
<div style="color:var(--text-light);">Net profit</div>
</div>
</div>
</div>
<div class="section-card">
<div class="section-header">
<h4>Top Packages</h4>
<small>By revenue</small>
</div>
<div class="product-list">
<div class="product-item">
<div class="product-rank">1</div>
<div class="product-icon">
<i class="fa fa-child text-primary"></i>
</div>
<div class="product-main">
<strong>Kids Taekwondo (3x/week)</strong>
<small>Highest retention, after-school favorite</small>
</div>
<div class="product-stats">
<span>68</span>
Enrollments
</div>
</div>
<div class="product-item">
<div class="product-rank">2</div>
<div class="product-icon">
<i class="fa fa-user-shield text-success"></i>
</div>
<div class="product-main">
<strong>Adult Self-Defense Program</strong>
<small>12-week bootcamp, strong add-ons</small>
</div>
<div class="product-stats">
<span>39</span>
Enrollments
</div>
</div>
<div class="product-item">
<div class="product-rank">3</div>
<div class="product-icon">
<i class="fa fa-heart-pulse text-danger"></i>
</div>
<div class="product-main">
<strong>Fitness & Conditioning</strong>
<small>Cross-training add-on package</small>
</div>
<div class="product-stats">
<span>25</span>
Enrollments
</div>
</div>
</div>
</div>
</section>
<!-- Packages & Activities -->
<section id="packages_page" class="page-container">
<div class="section-card">
<div class="section-header">
<h4>Packages</h4>
</div>
<div class="package-card">
<img src="https://placehold.co/600x300?text=Kids+Taekwondo" class="package-img" alt="">
<div class="package-body">
<h5>Kids Taekwondo (3x/week)</h5>
<p>Classes for kids focusing on discipline, focus, and fun.</p>
<div class="package-meta">
<span class="badge bg-success">BD 50 / month</span>
<span style="font-size:11px;color:var(--text-light);">68 active</span>
</div>
<div class="package-summary">
<div><i class="fa fa-calendar-check text-primary me-1"></i>3x/week</div>
<div><i class="fa fa-child text-success me-1"></i>Ages 612</div>
<div><i class="fa fa-trophy text-warning me-1"></i>High retention</div>
</div>
<div class="package-actions">
<button class="btn btn-sm btn-primary">Details</button>
<button class="btn btn-sm btn-outline-secondary">Edit</button>
</div>
</div>
</div>
<div class="package-card">
<img src="https://placehold.co/600x300?text=Adult+Program" class="package-img" alt="">
<div class="package-body">
<h5>Adult Self-Defense (12 weeks)</h5>
<p>Intensive program combining Taekwondo and practical defense.</p>
<div class="package-meta">
<span class="badge bg-success">BD 120 / 12 weeks</span>
<span style="font-size:11px;color:var(--text-light);">39 active</span>
</div>
<div class="package-summary">
<div><i class="fa fa-clock text-primary me-1"></i>12 weeks</div>
<div><i class="fa fa-fire text-danger me-1"></i>High intensity</div>
<div><i class="fa fa-plus-circle text-success me-1"></i>Add-ons</div>
</div>
<div class="package-actions">
<button class="btn btn-sm btn-primary">Details</button>
<button class="btn btn-sm btn-outline-secondary">Edit</button>
</div>
</div>
</div>
</div>
<div class="section-card">
<div class="section-header">
<h4>Activities</h4>
</div>
<div class="activity-card">
<div class="activity-header">
<img src="https://placehold.co/100x100" class="activity-thumb" alt="">
<div>
<p class="activity-title">Kids Taekwondo Beginner</p>
<p class="activity-subtitle">Coach Ahmed • Dojang A</p>
</div>
</div>
<div class="activity-grid-row">
<div>
<small class="text-muted d-block">Schedule</small>
Sun, Tue, Thu 4:00 PM
</div>
<div>
<small class="text-muted d-block">Capacity</small>
Max 22 • 18 booked
</div>
</div>
<div class="activity-icons-grid">
<div><i class="fa fa-child"></i>Ages 69</div>
<div><i class="fa fa-bolt"></i>Energy focus</div>
<div><i class="fa fa-user-shield"></i>Basic defense</div>
<div><i class="fa fa-heart"></i>Confidence</div>
</div>
<div class="activity-actions">
<button class="btn btn-sm btn-info text-white">Sessions</button>
<button class="btn btn-sm btn-outline-secondary">Edit</button>
</div>
</div>
<div class="activity-card">
<div class="activity-header">
<img src="https://placehold.co/100x100" class="activity-thumb" alt="">
<div>
<p class="activity-title">Adult Sparring Intermediate</p>
<p class="activity-subtitle">Coach Fatima • Dojang B</p>
</div>
</div>
<div class="activity-grid-row">
<div>
<small class="text-muted d-block">Schedule</small>
Mon, Wed 7:00 PM
</div>
<div>
<small class="text-muted d-block">Capacity</small>
Max 18 • 15 booked
</div>
</div>
<div class="activity-icons-grid">
<div><i class="fa fa-person-running"></i>Cardio</div>
<div><i class="fa fa-fist-raised"></i>Sparring</div>
<div><i class="fa fa-scale-balanced"></i>Balance</div>
<div><i class="fa fa-brain"></i>Strategy</div>
</div>
<div class="activity-actions">
<button class="btn btn-sm btn-info text-white">Sessions</button>
<button class="btn btn-sm btn-outline-secondary">Edit</button>
</div>
</div>
</div>
</section>
<!-- User overview -->
<section id="user_overview_page" class="page-container">
<div class="profile-card">
<div class="profile-header-content">
<img src="https://placehold.co/100x100" class="profile-pic" alt="">
<div class="profile-main-info">
<h3>Ali Mohammed</h3>
<div class="stats-badges">
<div class="stat-item">
<div class="value">18</div>
<div><i class="fa fa-calendar-check me-1"></i>Months</div>
</div>
<div class="stat-item">
<div class="value">94%</div>
<div><i class="fa fa-user-check me-1"></i>Attendance</div>
</div>
<div class="stat-item">
<div class="value">BD 620</div>
<div><i class="fa fa-sack-dollar me-1"></i>Spend</div>
</div>
</div>
<div style="margin-bottom:6px;">
<span class="tag age">Age 14</span>
<span class="tag places">Kids Taekwondo</span>
<span class="tag active">Highly Active</span>
</div>
<div style="font-size:11px;color:var(--text-medium);">
<div><strong>Phone:</strong> +973 3X XXX XXX</div>
<div><strong>Email:</strong> ali@example.com</div>
<div><strong>Joined:</strong> Jan 2024</div>
<div><strong>Package:</strong> Kids Taekwondo (3x/week)</div>
</div>
</div>
</div>
<div class="profile-tabs">
<button class="active" onclick="switchProfileTab(event,'member_overview_tab')">Overview</button>
<button onclick="switchProfileTab(event,'member_attendance_tab')">Attendance</button>
<button onclick="switchProfileTab(event,'member_payments_tab')">Payments</button>
<button onclick="switchProfileTab(event,'member_progress_tab')">Progress</button>
</div>
<div id="member_overview_tab" class="tab-content-section active">
High-level overview of member engagement and behavior.
</div>
<div id="member_attendance_tab" class="tab-content-section">
Attendance chart and logs can be shown here.
</div>
<div id="member_payments_tab" class="tab-content-section">
Invoice history and outstanding balances.
</div>
<div id="member_progress_tab" class="tab-content-section">
Progress photos, promotions, and metrics.
</div>
</div>
<div class="stats-card">
<h4>Member Stats Snapshot</h4>
<div class="stats-grid">
<div class="stat-box sessions">
<div class="count">142</div>
<div>Sessions attended</div>
<div class="progress-bar-container"><div class="progress-bar"></div></div>
<small>Very consistent attendance compared to average.</small>
</div>
<div class="stat-box revenue">
<div class="count">BD 620</div>
<div>Total revenue</div>
<div class="progress-bar-container"><div class="progress-bar"></div></div>
<small>Includes class fees and equipment.</small>
</div>
<div class="stat-box attendance">
<div class="count">94%</div>
<div>Attendance rate</div>
<div class="progress-bar-container"><div class="progress-bar"></div></div>
<small>Consider advanced programs and referrals.</small>
</div>
</div>
</div>
</section>
<!-- Placeholder sections -->
<section id="invoicing_payments_page" class="page-container">
<div class="placeholder-card">
<h2>Invoicing & Payments</h2>
<p>Manage invoices and payment statuses.</p>
</div>
</section>
<section id="members_page" class="page-container">
<div class="placeholder-card">
<h2>Members</h2>
<p>Search, filter, and manage members.</p>
</div>
</section>
</main>
<nav class="app-tab-bar">
<div class="tab-item active" data-page="dashboard_page" onclick="setTab(this)">
<i class="fa fa-house"></i>
<span>Home</span>
</div>
<div class="tab-item" data-page="packages_page" onclick="setTab(this)">
<i class="fa fa-box"></i>
<span>Packages</span>
</div>
<div class="tab-item" data-page="user_overview_page" onclick="setTab(this)">
<i class="fa fa-user"></i>
<span>Member</span>
</div>
<div class="tab-item" data-page="members_page" onclick="setTab(this)">
<i class="fa fa-users"></i>
<span>Members</span>
</div>
<div class="tab-item" data-page="invoicing_payments_page" onclick="setTab(this)">
<i class="fa fa-credit-card"></i>
<span>Billing</span>
</div>
</nav>
<!-- Quick Sale Modal -->
<div id="quickSaleModal" class="modal-overlay">
<div class="modal-sheet">
<div class="modal-header">
<div>
<h4>Quick Sale</h4>
<p>Process a walk-in sale.</p>
</div>
<button class="modal-close-btn" onclick="closeModal('quickSaleModal')">&times;</button>
</div>
<div class="pos-body">
<div>
<div class="category-tabs">
<button class="category-tab-btn active">All</button>
<button class="category-tab-btn">Packages</button>
<button class="category-tab-btn">Merch</button>
<button class="category-tab-btn">Other</button>
</div>
<div class="product-grid">
<div class="product-tile" onclick="addToCart('Kids Taekwondo (1 month)',50)">
<img src="https://placehold.co/80x80?text=KT" alt="">
<strong>Kids TKD (1m)</strong>
<small>BD 50</small>
</div>
<div class="product-tile" onclick="addToCart('Adult Self-Defense (12 weeks)',120)">
<img src="https://placehold.co/80x80?text=AD" alt="">
<strong>Adult Self-Def</strong>
<small>BD 120</small>
</div>
<div class="product-tile" onclick="addToCart('Uniform',25)">
<img src="https://placehold.co/80x80?text=GI" alt="">
<strong>Uniform</strong>
<small>BD 25</small>
</div>
<div class="product-tile" onclick="addToCart('Gloves',15)">
<img src="https://placehold.co/80x80?text=GL" alt="">
<strong>Gloves</strong>
<small>BD 15</small>
</div>
</div>
</div>
<div class="cart-section">
<div class="cart-list" id="cartList"></div>
<div class="cart-totals">
<div class="cart-totals-row">
<span>Sub-total</span><span id="subTotalDisplay">BD 0.00</span>
</div>
<div class="cart-totals-row">
<span>Discount</span><span id="discountDisplay">BD 0.00</span>
</div>
<div class="cart-totals-row grand">
<span>Total</span><span id="grandTotalDisplay">BD 0.00</span>
</div>
<button class="pay-button">Pay Now</button>
</div>
</div>
</div>
</div>
</div>
<script>
const pageTitles = {
dashboard_page: 'Dashboard',
packages_page: 'Packages & Activities',
user_overview_page: 'User Overview',
members_page: 'Members',
invoicing_payments_page: 'Billing'
};
function setTab(el) {
document.querySelectorAll('.tab-item').forEach(t => t.classList.remove('active'));
el.classList.add('active');
const pageId = el.getAttribute('data-page');
document.querySelectorAll('.page-container').forEach(p => p.classList.remove('active-page'));
document.getElementById(pageId).classList.add('active-page');
document.getElementById('appTitle').textContent = pageTitles[pageId] || 'Dashboard';
}
function setTabById(pageId) {
document.querySelectorAll('.page-container').forEach(p => p.classList.remove('active-page'));
const page = document.getElementById(pageId);
if (page) page.classList.add('active-page');
document.querySelectorAll('.tab-item').forEach(t => {
if (t.getAttribute('data-page') === pageId) t.classList.add('active');
else t.classList.remove('active');
});
document.getElementById('appTitle').textContent = pageTitles[pageId] || 'Dashboard';
toggleSidebar(false);
}
function toggleDropdown(id) {
const el = document.getElementById(id);
if (!el) return;
const isVisible = el.style.display === 'block';
el.style.display = isVisible ? 'none' : 'block';
}
window.addEventListener('click', (e) => {
const dropdown = document.getElementById('notificationDropdown');
const btn = e.target.closest('.icon-btn');
if (!btn && dropdown && !dropdown.contains(e.target)) {
dropdown.style.display = 'none';
}
});
function switchProfileTab(evt, tabId) {
document.querySelectorAll('.profile-tabs button').forEach(b => b.classList.remove('active'));
evt.currentTarget.classList.add('active');
document.querySelectorAll('.tab-content-section').forEach(c => c.classList.remove('active'));
const t = document.getElementById(tabId);
if (t) t.classList.add('active');
}
function openModal(id) {
const modal = document.getElementById(id);
if (modal) modal.classList.add('open');
}
function closeModal(id) {
const modal = document.getElementById(id);
if (modal) modal.classList.remove('open');
}
function toggleSidebar(open) {
const sidebar = document.getElementById('sidebar');
const backdrop = document.getElementById('sidebarBackdrop');
const shouldOpen = (open === true) || (!sidebar.classList.contains('open') && open !== false);
if (shouldOpen) {
sidebar.classList.add('open');
backdrop.classList.add('show');
} else {
sidebar.classList.remove('open');
backdrop.classList.remove('show');
}
}
const cart = [];
function addToCart(name, price) {
const existing = cart.find(i => i.name === name);
if (existing) existing.qty += 1;
else cart.push({ name, price, qty: 1 });
renderCart();
}
function updateQty(index, delta) {
cart[index].qty += delta;
if (cart[index].qty <= 0) cart.splice(index, 1);
renderCart();
}
function renderCart() {
const list = document.getElementById('cartList');
list.innerHTML = '';
let subTotal = 0;
cart.forEach((item, index) => {
const line = item.price * item.qty;
subTotal += line;
const row = document.createElement('div');
row.className = 'cart-item';
row.innerHTML = `
<div>
<div class="cart-item-name">${item.name}</div>
<div class="cart-item-price">BD ${item.price.toFixed(2)} each</div>
</div>
<div class="quantity-control">
<button class="qty-btn" onclick="updateQty(${index},-1)">-</button>
<div class="qty-display">${item.qty}</div>
<button class="qty-btn" onclick="updateQty(${index},1)">+</button>
</div>
`;
list.appendChild(row);
});
const discount = 0;
const grand = subTotal - discount;
document.getElementById('subTotalDisplay').textContent = 'BD ' + subTotal.toFixed(2);
document.getElementById('discountDisplay').textContent = 'BD ' + discount.toFixed(2);
document.getElementById('grandTotalDisplay').textContent = 'BD ' + grand.toFixed(2);
}
</script>
</body>
</html>