Initial commit

This commit is contained in:
Kwesi Banson Jnr
2026-03-19 11:03:33 +00:00
commit c68c007945
8388 changed files with 520335 additions and 0 deletions

View File

@@ -0,0 +1,559 @@
:root {
--click-blue: #0099d9;
--click-blue-deep: #007bb5;
--click-blue-soft: #e6f5fc;
--click-ink: #0b2748;
--click-slate: #5f7386;
--click-cloud: #f4f8fb;
--click-line: rgba(11, 39, 72, 0.12);
--click-white: #ffffff;
--click-success: #198754;
--click-warning: #f59f00;
--click-danger: #dc3545;
--click-shadow: 0 24px 60px rgba(11, 39, 72, 0.12);
--click-radius-lg: 28px;
--click-radius-md: 20px;
--click-radius-sm: 14px;
}
body {
font-family: "DM Sans", sans-serif;
color: var(--click-ink);
background:
radial-gradient(circle at top left, rgba(0, 153, 217, 0.18), transparent 28%),
radial-gradient(circle at bottom right, rgba(0, 123, 181, 0.14), transparent 26%),
linear-gradient(180deg, #f8fcff 0%, #eef5f8 100%);
min-height: 100vh;
}
h1,
h2,
h3,
h4,
h5,
h6,
.font-display {
font-family: "Sora", sans-serif;
}
a {
color: inherit;
}
.brand-logo {
height: 34px;
width: auto;
}
.brand-chip {
display: inline-flex;
align-items: center;
gap: 0.5rem;
border: 1px solid rgba(255, 255, 255, 0.25);
background: rgba(255, 255, 255, 0.14);
color: #fff;
border-radius: 999px;
padding: 0.5rem 0.9rem;
font-size: 0.85rem;
letter-spacing: 0.02em;
}
.auth-shell {
min-height: 100vh;
position: relative;
overflow: hidden;
}
.auth-shell::before,
.auth-shell::after {
content: "";
position: absolute;
border-radius: 999px;
filter: blur(8px);
}
.auth-shell::before {
width: 26rem;
height: 26rem;
top: -10rem;
left: -7rem;
background: rgba(0, 153, 217, 0.18);
}
.auth-shell::after {
width: 24rem;
height: 24rem;
right: -7rem;
bottom: -8rem;
background: rgba(0, 123, 181, 0.12);
}
.auth-stage {
position: relative;
z-index: 1;
}
.auth-panel {
background:
linear-gradient(140deg, rgba(0, 123, 181, 0.96) 0%, rgba(0, 153, 217, 0.92) 55%, rgba(5, 41, 87, 0.94) 100%);
color: var(--click-white);
border-radius: var(--click-radius-lg);
padding: 2rem;
box-shadow: var(--click-shadow);
position: relative;
overflow: hidden;
}
.auth-panel::before {
content: "";
position: absolute;
inset: auto auto -5rem -4rem;
width: 14rem;
height: 14rem;
border-radius: 50%;
background: rgba(255, 255, 255, 0.12);
}
.auth-panel::after {
content: "";
position: absolute;
top: -4rem;
right: -4rem;
width: 13rem;
height: 13rem;
border-radius: 50%;
background: rgba(255, 255, 255, 0.09);
}
.auth-metric,
.traffic-card,
.detail-card,
.filter-card,
.traffic-table-card {
background: rgba(255, 255, 255, 0.92);
border: 1px solid rgba(255, 255, 255, 0.6);
backdrop-filter: blur(14px);
box-shadow: var(--click-shadow);
}
.auth-metric {
border-radius: var(--click-radius-md);
padding: 1rem 1.15rem;
background: rgba(255, 255, 255, 0.95);
border-color: rgba(255, 255, 255, 0.7);
}
.auth-metric-label {
color: rgba(11, 39, 72, 0.68);
font-size: 0.82rem;
}
.auth-metric-value {
color: var(--click-ink);
}
.glass-card {
background: rgba(255, 255, 255, 0.88);
border: 1px solid rgba(255, 255, 255, 0.75);
border-radius: var(--click-radius-lg);
padding: 2rem;
box-shadow: var(--click-shadow);
backdrop-filter: blur(16px);
}
.form-control,
.form-select {
border-radius: 0.95rem;
min-height: 3.25rem;
border-color: rgba(11, 39, 72, 0.12);
padding-inline: 1rem;
}
.form-control:focus,
.form-select:focus {
border-color: rgba(0, 153, 217, 0.45);
box-shadow: 0 0 0 0.25rem rgba(0, 153, 217, 0.14);
}
.btn-click {
min-height: 3.25rem;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 999px;
padding: 0.9rem 1.5rem;
font-weight: 700;
line-height: 1;
letter-spacing: 0.01em;
border: none;
background: linear-gradient(135deg, var(--click-blue-deep), var(--click-blue));
color: #fff;
box-shadow: 0 16px 30px rgba(0, 123, 181, 0.22);
}
.btn-click:hover,
.btn-click:focus {
color: #fff;
background: linear-gradient(135deg, #006a9f, var(--click-blue));
}
.btn-ghost {
min-height: 3.1rem;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 999px;
padding: 0.9rem 1.5rem;
line-height: 1;
border: 1px solid rgba(11, 39, 72, 0.14);
color: var(--click-ink);
background: rgba(255, 255, 255, 0.8);
}
.btn-click i,
.btn-ghost i {
line-height: 1;
}
.btn-ghost:hover,
.btn-ghost:focus {
background: var(--click-white);
border-color: rgba(0, 153, 217, 0.3);
color: var(--click-blue-deep);
}
.hero-graphic {
min-height: 17rem;
border-radius: var(--click-radius-md);
background:
linear-gradient(160deg, rgba(255, 255, 255, 0.18), rgba(255, 255, 255, 0.02)),
rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.16);
position: relative;
overflow: hidden;
}
.hero-graphic::before {
content: "";
position: absolute;
inset: 1.5rem;
border-radius: 1.5rem;
border: 1px solid rgba(255, 255, 255, 0.14);
}
.signal-dot,
.signal-line {
position: absolute;
}
.signal-dot {
width: 0.9rem;
height: 0.9rem;
background: #fff;
border-radius: 50%;
box-shadow: 0 0 0 0.6rem rgba(255, 255, 255, 0.12);
}
.signal-line {
height: 2px;
background: linear-gradient(90deg, rgba(255, 255, 255, 0.18), rgba(255, 255, 255, 0.95));
transform-origin: left center;
}
.message-pill {
position: absolute;
background: rgba(255, 255, 255, 0.92);
color: var(--click-ink);
border-radius: 999px;
padding: 0.5rem 0.85rem;
font-size: 0.82rem;
font-weight: 700;
}
.topbar {
padding-block: 1.25rem;
}
.topbar-card {
border-radius: 999px;
padding: 0.8rem 1rem;
background: rgba(255, 255, 255, 0.9);
border: 1px solid rgba(255, 255, 255, 0.8);
box-shadow: 0 12px 35px rgba(11, 39, 72, 0.08);
}
.traffic-hero {
border-radius: 32px;
padding: 2rem;
background:
radial-gradient(circle at right top, rgba(255, 255, 255, 0.26), transparent 30%),
linear-gradient(135deg, #052957 0%, #007bb5 48%, #0099d9 100%);
color: #fff;
box-shadow: var(--click-shadow);
}
.traffic-card,
.detail-card,
.filter-card,
.traffic-table-card {
border-radius: var(--click-radius-md);
}
.traffic-card {
padding: 1.2rem;
height: 100%;
}
.traffic-card .icon-wrap {
width: 3rem;
height: 3rem;
border-radius: 1rem;
display: inline-flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg, rgba(0, 153, 217, 0.16), rgba(0, 123, 181, 0.22));
color: var(--click-blue-deep);
}
.filter-card,
.detail-card,
.traffic-table-card {
padding: 1.35rem;
}
.compose-card,
.preview-card {
background: rgba(255, 255, 255, 0.92);
border: 1px solid rgba(255, 255, 255, 0.6);
border-radius: var(--click-radius-md);
box-shadow: var(--click-shadow);
backdrop-filter: blur(14px);
}
.compose-card {
padding: 1.5rem;
}
.preview-card {
padding: 1.35rem;
}
.section-kicker {
font-size: 0.8rem;
font-weight: 700;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--click-blue-deep);
}
.option-chip {
display: inline-flex;
align-items: center;
gap: 0.55rem;
min-height: 3rem;
padding: 0.75rem 1rem;
border: 1px solid rgba(11, 39, 72, 0.12);
border-radius: 1rem;
background: rgba(255, 255, 255, 0.86);
color: var(--click-ink);
font-weight: 500;
}
.option-chip.active {
border-color: rgba(0, 153, 217, 0.3);
background: rgba(230, 245, 252, 0.96);
color: var(--click-blue-deep);
}
.recipient-box {
min-height: 8rem;
padding: 1rem;
border: 1px solid rgba(11, 39, 72, 0.12);
border-radius: 1rem;
background: rgba(255, 255, 255, 0.72);
}
.recipient-tag {
display: inline-flex;
align-items: center;
gap: 0.4rem;
margin: 0 0.55rem 0.55rem 0;
padding: 0.45rem 0.75rem;
border-radius: 999px;
background: var(--click-blue-soft);
color: var(--click-blue-deep);
font-size: 0.84rem;
font-weight: 700;
}
.char-progress {
height: 0.55rem;
background: rgba(11, 39, 72, 0.08);
border-radius: 999px;
overflow: hidden;
}
.char-progress span {
display: block;
height: 100%;
width: 34%;
border-radius: inherit;
background: linear-gradient(90deg, var(--click-blue), var(--click-blue-deep));
}
.preview-phone {
max-width: 19rem;
margin: 0 auto;
border-radius: 2rem;
padding: 1rem;
background: linear-gradient(180deg, #0d2645 0%, #112f54 100%);
box-shadow: 0 24px 50px rgba(11, 39, 72, 0.28);
}
.preview-screen {
border-radius: 1.5rem;
padding: 1.25rem 1rem;
background:
radial-gradient(circle at top right, rgba(0, 153, 217, 0.24), transparent 24%),
linear-gradient(180deg, #eef8ff 0%, #dcecf8 100%);
min-height: 24rem;
}
.sms-bubble-out,
.sms-bubble-in {
max-width: 85%;
padding: 0.8rem 0.95rem;
border-radius: 1.15rem;
font-size: 0.92rem;
line-height: 1.45;
}
.sms-bubble-out {
margin-left: auto;
background: linear-gradient(135deg, var(--click-blue-deep), var(--click-blue));
color: #fff;
border-bottom-right-radius: 0.45rem;
}
.sms-bubble-in {
background: rgba(255, 255, 255, 0.88);
color: var(--click-ink);
border-bottom-left-radius: 0.45rem;
}
.summary-list {
display: grid;
gap: 0.9rem;
}
.summary-item {
display: flex;
align-items: start;
justify-content: space-between;
gap: 1rem;
padding-bottom: 0.9rem;
border-bottom: 1px solid rgba(11, 39, 72, 0.08);
}
.summary-item:last-child {
padding-bottom: 0;
border-bottom: 0;
}
.table thead th {
color: var(--click-slate);
text-transform: uppercase;
letter-spacing: 0.08em;
font-size: 0.75rem;
border-bottom-width: 1px;
border-color: rgba(11, 39, 72, 0.08);
white-space: nowrap;
}
.table tbody td {
vertical-align: middle;
padding-block: 1rem;
border-color: rgba(11, 39, 72, 0.06);
}
.recipient-cell {
min-width: 15rem;
}
.status-badge,
.channel-badge {
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 999px;
padding: 0.4rem 0.7rem;
font-size: 0.78rem;
font-weight: 700;
}
.status-delivered {
background: rgba(25, 135, 84, 0.12);
color: var(--click-success);
}
.status-pending {
background: rgba(245, 159, 0, 0.14);
color: #9a6700;
}
.status-failed {
background: rgba(220, 53, 69, 0.1);
color: var(--click-danger);
}
.channel-badge {
background: var(--click-blue-soft);
color: var(--click-blue-deep);
}
.mini-chart {
height: 0.55rem;
border-radius: 999px;
background: rgba(11, 39, 72, 0.08);
overflow: hidden;
}
.mini-chart span {
display: block;
height: 100%;
border-radius: inherit;
background: linear-gradient(90deg, var(--click-blue), var(--click-blue-deep));
}
.timeline-item + .timeline-item {
margin-top: 1rem;
padding-top: 1rem;
border-top: 1px solid rgba(11, 39, 72, 0.08);
}
.muted-label {
color: var(--click-slate);
font-size: 0.84rem;
}
@media (max-width: 991.98px) {
.auth-panel,
.glass-card,
.traffic-hero {
padding: 1.5rem;
}
}
@media (max-width: 767.98px) {
.auth-shell {
padding-block: 1.5rem;
}
.topbar-card {
border-radius: 1.25rem;
}
.traffic-hero {
border-radius: 24px;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

@@ -0,0 +1,132 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Click Client Portal | Login</title>
<link rel="icon" type="image/png" href="assets/img/click-logo.png">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&family=Sora:wght@400;600;700&display=swap" rel="stylesheet">
<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 href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.css" rel="stylesheet">
<link href="assets/css/theme.css" rel="stylesheet">
</head>
<body>
<main class="auth-shell d-flex align-items-center">
<div class="container auth-stage py-4 py-lg-5">
<div class="row g-4 align-items-center">
<div class="col-lg-6">
<section class="auth-panel h-100">
<div class="brand-chip mb-4">
<i class="bi bi-broadcast-pin"></i>
SMS traffic visibility portal
</div>
<img src="assets/img/click-logo.png" alt="Click Mobile" class="brand-logo mb-4">
<h1 class="display-6 fw-semibold mb-3">Monitor delivery traffic with a cleaner client experience.</h1>
<p class="fs-5 opacity-75 mb-4">
A branded front door for clients to review sent SMS, delivery status, route activity, and campaign health in one place.
</p>
<div class="hero-graphic mb-4">
<span class="signal-dot" style="top: 18%; left: 14%;"></span>
<span class="signal-dot" style="top: 30%; left: 66%;"></span>
<span class="signal-dot" style="top: 72%; left: 28%;"></span>
<span class="signal-dot" style="top: 62%; left: 78%;"></span>
<span class="signal-line" style="top: 21%; left: 17%; width: 52%; transform: rotate(8deg);"></span>
<span class="signal-line" style="top: 34%; left: 45%; width: 29%; transform: rotate(35deg);"></span>
<span class="signal-line" style="top: 69%; left: 31%; width: 45%; transform: rotate(-8deg);"></span>
<span class="message-pill" style="top: 18%; right: 12%;">OTP sent in 2.1s</span>
<span class="message-pill" style="left: 10%; bottom: 16%;">98.4% delivered</span>
<span class="message-pill" style="top: 48%; left: 38%;">Bridge active</span>
</div>
<div class="row g-3">
<div class="col-sm-4">
<div class="auth-metric">
<div class="auth-metric-label mb-1">Live routes</div>
<div class="auth-metric-value h4 mb-0">24+</div>
</div>
</div>
<div class="col-sm-4">
<div class="auth-metric">
<div class="auth-metric-label mb-1">Messages today</div>
<div class="auth-metric-value h4 mb-0">186k</div>
</div>
</div>
<div class="col-sm-4">
<div class="auth-metric">
<div class="auth-metric-label mb-1">Delivery rate</div>
<div class="auth-metric-value h4 mb-0">98.4%</div>
</div>
</div>
</div>
</section>
</div>
<div class="col-lg-5 offset-lg-1">
<section class="glass-card">
<div class="d-flex align-items-center justify-content-between mb-4">
<div>
<div class="text-uppercase small fw-semibold text-primary mb-2">Client Portal</div>
<h2 class="h3 mb-1">Welcome back</h2>
<p class="text-secondary mb-0">Sign in to review SMS traffic and delivery logs.</p>
</div>
<span class="badge text-bg-light rounded-pill px-3 py-2">Bootstrap 5</span>
</div>
<form class="needs-validation" novalidate>
<div class="mb-3">
<label for="companyEmail" class="form-label fw-semibold">Work email</label>
<input type="email" class="form-control" id="companyEmail" placeholder="client@click-mobile.com" value="ops@click-mobile.com" autocomplete="username">
</div>
<div class="mb-3">
<label for="password" class="form-label fw-semibold">Password</label>
<div class="input-group">
<span class="input-group-text bg-white border-end-0 rounded-start-4">
<i class="bi bi-shield-lock"></i>
</span>
<input type="password" class="form-control border-start-0 rounded-end-4" id="password" placeholder="Enter password" autocomplete="current-password">
</div>
</div>
<div class="d-flex align-items-center justify-content-between mb-4">
<div class="form-check">
<input class="form-check-input" type="checkbox" value="" id="rememberMe" checked>
<label class="form-check-label" for="rememberMe">
Keep me signed in
</label>
</div>
<a href="#" class="text-decoration-none fw-semibold">Forgot password?</a>
</div>
<div class="d-grid gap-3">
<a href="sms-traffic.html" class="btn btn-click">Sign in to portal</a>
<button type="button" class="btn btn-ghost">Request account access</button>
</div>
</form>
<div class="row g-3 mt-4">
<div class="col-sm-6">
<div class="p-3 rounded-4 bg-body-tertiary h-100">
<div class="muted-label mb-2">Portal features</div>
<div class="fw-semibold">Sent SMS logs, status breakdown, search filters, and route insights.</div>
</div>
</div>
<div class="col-sm-6">
<div class="p-3 rounded-4 bg-body-tertiary h-100">
<div class="muted-label mb-2">Support window</div>
<div class="fw-semibold">Mon to Fri, 08:00 to 18:00 CAT</div>
</div>
</div>
</div>
</section>
</div>
</div>
</div>
</main>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
</body>
</html>

View File

@@ -0,0 +1,215 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Click Client Portal | Send SMS</title>
<link rel="icon" type="image/png" href="assets/img/click-logo.png">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&family=Sora:wght@400;600;700&display=swap" rel="stylesheet">
<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 href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.css" rel="stylesheet">
<link href="assets/css/theme.css" rel="stylesheet">
</head>
<body>
<div class="container py-3 py-lg-4">
<header class="topbar">
<div class="topbar-card d-flex flex-column flex-lg-row align-items-lg-center justify-content-between gap-3">
<div class="d-flex align-items-center gap-3">
<img src="assets/img/click-logo.png" alt="Click Mobile" class="brand-logo">
<div>
<div class="small text-uppercase text-primary fw-semibold">Client Portal</div>
<div class="fw-semibold">Compose outbound SMS</div>
</div>
</div>
<div class="d-flex flex-wrap align-items-center gap-2">
<span class="badge rounded-pill text-bg-light px-3 py-2">Acme Finance Ltd</span>
<a href="sms-traffic.html" class="btn btn-ghost px-4"><i class="bi bi-arrow-left me-2"></i>Back to traffic</a>
<a href="index.html" class="btn btn-ghost px-4">Log out</a>
</div>
</div>
</header>
<section class="traffic-hero mb-4">
<div class="row g-4 align-items-end">
<div class="col-lg-8">
<div class="text-uppercase small fw-semibold opacity-75 mb-2">Campaign Composer</div>
<h1 class="display-6 fw-semibold mb-3">Create and send an SMS campaign in one flow.</h1>
<p class="fs-5 opacity-75 mb-0">
Draft the message, choose sender and recipients, then send immediately or schedule it for later delivery.
</p>
</div>
<div class="col-lg-4">
<div class="row g-3">
<div class="col-6">
<div class="rounded-4 p-3 bg-white bg-opacity-10">
<div class="small opacity-75">Available credit</div>
<div class="h3 mb-0">48.2k</div>
</div>
</div>
<div class="col-6">
<div class="rounded-4 p-3 bg-white bg-opacity-10">
<div class="small opacity-75">Sender IDs</div>
<div class="h3 mb-0">3</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="row g-4">
<div class="col-xl-8">
<div class="compose-card mb-4">
<div class="section-kicker mb-2">Message setup</div>
<div class="d-flex flex-column flex-lg-row align-items-lg-center justify-content-between gap-3 mb-4">
<div>
<h2 class="h3 mb-1">Compose message</h2>
<p class="text-secondary mb-0">Set campaign details, recipients, and delivery rules before sending.</p>
</div>
<div class="d-flex flex-wrap gap-2">
<span class="option-chip active"><i class="bi bi-lightning-charge"></i>Send now</span>
<span class="option-chip"><i class="bi bi-calendar-event"></i>Schedule</span>
</div>
</div>
<form>
<div class="row g-3 mb-4">
<div class="col-md-6">
<label for="campaignName" class="form-label fw-semibold">Campaign name</label>
<input id="campaignName" type="text" class="form-control" value="March savings reminder">
</div>
<div class="col-md-3">
<label for="senderSelect" class="form-label fw-semibold">Sender ID</label>
<select id="senderSelect" class="form-select">
<option>CLICKINFO</option>
<option>CLICKOTP</option>
<option>ACMEBANK</option>
</select>
</div>
<div class="col-md-3">
<label for="country" class="form-label fw-semibold">Primary market</label>
<select id="country" class="form-select">
<option>Ghana</option>
<option>Malawi</option>
<option>Zambia</option>
</select>
</div>
</div>
<div class="mb-4">
<div class="d-flex align-items-center justify-content-between mb-2">
<label for="messageText" class="form-label fw-semibold mb-0">Message content</label>
<span class="muted-label">54 / 160 characters</span>
</div>
<textarea id="messageText" class="form-control py-3" rows="5">Dear customer, grow your savings with our new fixed plan. Visit any branch today.</textarea>
<div class="char-progress mt-3"><span></span></div>
</div>
<div class="mb-4">
<div class="d-flex flex-column flex-lg-row align-items-lg-center justify-content-between gap-2 mb-2">
<label class="form-label fw-semibold mb-0">Recipients</label>
<span class="muted-label">Paste numbers, upload CSV, or target a saved segment</span>
</div>
<div class="recipient-box">
<span class="recipient-tag"><i class="bi bi-telephone"></i>+233245559001</span>
<span class="recipient-tag"><i class="bi bi-telephone"></i>+233502287744</span>
<span class="recipient-tag"><i class="bi bi-telephone"></i>+265884412280</span>
<span class="recipient-tag"><i class="bi bi-people"></i>Retail Savers Segment</span>
</div>
</div>
<div class="row g-3 mb-4">
<div class="col-md-6">
<label for="deliveryWindow" class="form-label fw-semibold">Delivery window</label>
<select id="deliveryWindow" class="form-select">
<option>Immediately</option>
<option>09:00 - 12:00</option>
<option>12:00 - 15:00</option>
<option>15:00 - 18:00</option>
</select>
</div>
<div class="col-md-6">
<label for="failover" class="form-label fw-semibold">Retry policy</label>
<select id="failover" class="form-select">
<option>Retry once after 5 minutes</option>
<option>Retry twice after 10 minutes</option>
<option>No retries</option>
</select>
</div>
</div>
<div class="d-flex flex-column flex-lg-row gap-3">
<button type="button" class="btn btn-click flex-grow-1"><i class="bi bi-send me-2"></i>Send SMS campaign</button>
<button type="button" class="btn btn-ghost flex-grow-1"><i class="bi bi-floppy me-2"></i>Save draft</button>
</div>
</form>
</div>
</div>
<div class="col-xl-4">
<aside class="preview-card mb-4">
<div class="section-kicker mb-2">Live preview</div>
<h2 class="h4 mb-3">Recipient experience</h2>
<div class="preview-phone">
<div class="preview-screen">
<div class="small text-secondary mb-3">Today 10:35</div>
<div class="sms-bubble-in mb-3">Acme Bank Promotions</div>
<div class="sms-bubble-out">
Dear customer, grow your savings with our new fixed plan. Visit any branch today.
</div>
</div>
</div>
</aside>
<aside class="preview-card mb-4">
<div class="section-kicker mb-2">Campaign summary</div>
<h2 class="h4 mb-3">Before you send</h2>
<div class="summary-list">
<div class="summary-item">
<div>
<div class="fw-semibold">Estimated recipients</div>
<div class="muted-label">Individual numbers plus one saved segment</div>
</div>
<div class="fw-semibold">2,460</div>
</div>
<div class="summary-item">
<div>
<div class="fw-semibold">Estimated cost</div>
<div class="muted-label">Based on Ghana and Malawi routes</div>
</div>
<div class="fw-semibold">2,214 credits</div>
</div>
<div class="summary-item">
<div>
<div class="fw-semibold">Encoding</div>
<div class="muted-label">Single-part GSM message</div>
</div>
<div class="fw-semibold">1 part</div>
</div>
</div>
</aside>
<aside class="detail-card">
<h2 class="h5 mb-3">Sending checklist</h2>
<div class="timeline-item pt-0 mt-0 border-0">
<div class="fw-semibold">Sender ID approved</div>
<div class="muted-label">CLICKINFO is active for Ghana and Malawi.</div>
</div>
<div class="timeline-item">
<div class="fw-semibold">Quiet hours</div>
<div class="muted-label">No restrictions detected for the selected delivery window.</div>
</div>
<div class="timeline-item">
<div class="fw-semibold">Credit balance</div>
<div class="muted-label">Sufficient balance available to send this campaign.</div>
</div>
</aside>
</div>
</section>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
</body>
</html>

View File

@@ -0,0 +1,305 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Click Client Portal | SMS Traffic</title>
<link rel="icon" type="image/png" href="assets/img/click-logo.png">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&family=Sora:wght@400;600;700&display=swap" rel="stylesheet">
<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 href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.css" rel="stylesheet">
<link href="assets/css/theme.css" rel="stylesheet">
</head>
<body>
<div class="container py-3 py-lg-4">
<header class="topbar">
<div class="topbar-card d-flex flex-column flex-lg-row align-items-lg-center justify-content-between gap-3">
<div class="d-flex align-items-center gap-3">
<img src="assets/img/click-logo.png" alt="Click Mobile" class="brand-logo">
<div>
<div class="small text-uppercase text-primary fw-semibold">Client Portal</div>
<div class="fw-semibold">SMS traffic overview</div>
</div>
</div>
<div class="d-flex flex-wrap align-items-center gap-2">
<span class="badge rounded-pill text-bg-light px-3 py-2">Acme Finance Ltd</span>
<span class="badge rounded-pill text-bg-light px-3 py-2"><i class="bi bi-clock-history me-1"></i> Last sync 09:12</span>
<a href="send-sms.html" class="btn btn-click px-4"><i class="bi bi-plus-circle me-2"></i>New SMS</a>
<a href="index.html" class="btn btn-ghost px-4">Log out</a>
</div>
</div>
</header>
<section class="traffic-hero mb-4">
<div class="row g-4 align-items-end">
<div class="col-lg-8">
<div class="text-uppercase small fw-semibold opacity-75 mb-2">Outbound SMS Monitoring</div>
<h1 class="display-6 fw-semibold mb-3">Track every message your team sends.</h1>
<p class="fs-5 opacity-75 mb-0">
Search sent SMS, review delivery outcomes, inspect failed attempts, and give clients a fast audit trail for every campaign.
</p>
</div>
<div class="col-lg-4">
<div class="row g-3">
<div class="col-6">
<div class="rounded-4 p-3 bg-white bg-opacity-10">
<div class="small opacity-75">Campaigns</div>
<div class="h3 mb-0">18</div>
</div>
</div>
<div class="col-6">
<div class="rounded-4 p-3 bg-white bg-opacity-10">
<div class="small opacity-75">Countries</div>
<div class="h3 mb-0">7</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="row g-4 mb-4">
<div class="col-sm-6 col-xl-3">
<article class="traffic-card">
<div class="d-flex align-items-start justify-content-between mb-3">
<div class="icon-wrap"><i class="bi bi-send-check"></i></div>
<span class="small text-success fw-semibold">+12.6%</span>
</div>
<div class="muted-label mb-2">Messages sent today</div>
<div class="h3 mb-2">186,420</div>
<div class="mini-chart"><span style="width: 82%;"></span></div>
</article>
</div>
<div class="col-sm-6 col-xl-3">
<article class="traffic-card">
<div class="d-flex align-items-start justify-content-between mb-3">
<div class="icon-wrap"><i class="bi bi-check2-circle"></i></div>
<span class="small text-success fw-semibold">98.4%</span>
</div>
<div class="muted-label mb-2">Delivery success</div>
<div class="h3 mb-2">183,372</div>
<div class="mini-chart"><span style="width: 98%;"></span></div>
</article>
</div>
<div class="col-sm-6 col-xl-3">
<article class="traffic-card">
<div class="d-flex align-items-start justify-content-between mb-3">
<div class="icon-wrap"><i class="bi bi-exclamation-triangle"></i></div>
<span class="small text-warning fw-semibold">1.1%</span>
</div>
<div class="muted-label mb-2">Pending or queued</div>
<div class="h3 mb-2">2,074</div>
<div class="mini-chart"><span style="width: 34%;"></span></div>
</article>
</div>
<div class="col-sm-6 col-xl-3">
<article class="traffic-card">
<div class="d-flex align-items-start justify-content-between mb-3">
<div class="icon-wrap"><i class="bi bi-x-octagon"></i></div>
<span class="small text-danger fw-semibold">0.5%</span>
</div>
<div class="muted-label mb-2">Failed messages</div>
<div class="h3 mb-2">974</div>
<div class="mini-chart"><span style="width: 18%;"></span></div>
</article>
</div>
</section>
<section class="row g-4">
<div class="col-xl-9">
<div class="filter-card mb-4">
<div class="d-flex flex-column flex-lg-row align-items-lg-center justify-content-between gap-3 mb-3">
<div>
<h2 class="h4 mb-1">Sent SMS list</h2>
<p class="text-secondary mb-0">Filter messages by date, sender, recipient, or delivery state.</p>
</div>
<div class="d-flex flex-wrap gap-2">
<button class="btn btn-ghost px-4"><i class="bi bi-download me-2"></i>Export CSV</button>
<button class="btn btn-click px-4"><i class="bi bi-funnel me-2"></i>Apply filters</button>
</div>
</div>
<div class="row g-3">
<div class="col-md-6 col-lg-3">
<label for="range" class="form-label fw-semibold">Date range</label>
<select id="range" class="form-select">
<option>Today</option>
<option>Last 7 days</option>
<option>Last 30 days</option>
</select>
</div>
<div class="col-md-6 col-lg-3">
<label for="senderId" class="form-label fw-semibold">Sender ID</label>
<select id="senderId" class="form-select">
<option>CLICKOTP</option>
<option>CLICKINFO</option>
<option>ACMEBANK</option>
</select>
</div>
<div class="col-md-6 col-lg-3">
<label for="status" class="form-label fw-semibold">Status</label>
<select id="status" class="form-select">
<option>All statuses</option>
<option>Delivered</option>
<option>Pending</option>
<option>Failed</option>
</select>
</div>
<div class="col-md-6 col-lg-3">
<label for="search" class="form-label fw-semibold">Search</label>
<input id="search" type="text" class="form-control" placeholder="Phone, message ID, text">
</div>
</div>
</div>
<div class="traffic-table-card">
<div class="table-responsive">
<table class="table align-middle mb-0">
<thead>
<tr>
<th scope="col">Message ID</th>
<th scope="col">Recipient</th>
<th scope="col">Content</th>
<th scope="col">Channel</th>
<th scope="col">Sent time</th>
<th scope="col">Status</th>
</tr>
</thead>
<tbody>
<tr>
<td class="fw-semibold">MSG-900214</td>
<td class="recipient-cell">
<div class="fw-semibold">+233 24 555 9001</div>
<div class="text-secondary small">Ghana</div>
</td>
<td>Your OTP is 827194. Valid for 5 minutes.</td>
<td><span class="channel-badge">A2P SMS</span></td>
<td>17 Mar 2026, 08:58</td>
<td><span class="status-badge status-delivered">Delivered</span></td>
</tr>
<tr>
<td class="fw-semibold">MSG-900193</td>
<td class="recipient-cell">
<div class="fw-semibold">+265 88 441 2280</div>
<div class="text-secondary small">Malawi</div>
</td>
<td>Debit alert: MWK 24,000 completed successfully.</td>
<td><span class="channel-badge">Transactional</span></td>
<td>17 Mar 2026, 08:54</td>
<td><span class="status-badge status-delivered">Delivered</span></td>
</tr>
<tr>
<td class="fw-semibold">MSG-900171</td>
<td class="recipient-cell">
<div class="fw-semibold">+260 97 882 1433</div>
<div class="text-secondary small">Zambia</div>
</td>
<td>Reminder: your loan repayment is due tomorrow.</td>
<td><span class="channel-badge">Reminder</span></td>
<td>17 Mar 2026, 08:51</td>
<td><span class="status-badge status-pending">Queued</span></td>
</tr>
<tr>
<td class="fw-semibold">MSG-900148</td>
<td class="recipient-cell">
<div class="fw-semibold">+234 80 114 5600</div>
<div class="text-secondary small">Nigeria</div>
</td>
<td>Promo: Activate your merchant wallet before 6pm.</td>
<td><span class="channel-badge">Campaign</span></td>
<td>17 Mar 2026, 08:46</td>
<td><span class="status-badge status-failed">Rejected</span></td>
</tr>
<tr>
<td class="fw-semibold">MSG-900110</td>
<td class="recipient-cell">
<div class="fw-semibold">+254 72 445 6712</div>
<div class="text-secondary small">Kenya</div>
</td>
<td>Ticket update: your support request has been resolved.</td>
<td><span class="channel-badge">Support</span></td>
<td>17 Mar 2026, 08:39</td>
<td><span class="status-badge status-delivered">Delivered</span></td>
</tr>
<tr>
<td class="fw-semibold">MSG-900084</td>
<td class="recipient-cell">
<div class="fw-semibold">+233 50 228 7744</div>
<div class="text-secondary small">Ghana</div>
</td>
<td>Balance update: GHS 1,950 available in your wallet.</td>
<td><span class="channel-badge">Transactional</span></td>
<td>17 Mar 2026, 08:32</td>
<td><span class="status-badge status-delivered">Delivered</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="col-xl-3">
<aside class="detail-card mb-4">
<div class="d-flex justify-content-between align-items-start mb-3">
<div>
<h2 class="h5 mb-1">Route health</h2>
<div class="muted-label">Top active markets</div>
</div>
<span class="badge rounded-pill text-bg-light">Live</span>
</div>
<div class="timeline-item">
<div class="d-flex justify-content-between fw-semibold mb-2">
<span>Ghana</span>
<span>99.1%</span>
</div>
<div class="mini-chart"><span style="width: 99%;"></span></div>
</div>
<div class="timeline-item">
<div class="d-flex justify-content-between fw-semibold mb-2">
<span>Malawi</span>
<span>97.8%</span>
</div>
<div class="mini-chart"><span style="width: 97%;"></span></div>
</div>
<div class="timeline-item">
<div class="d-flex justify-content-between fw-semibold mb-2">
<span>Zambia</span>
<span>96.4%</span>
</div>
<div class="mini-chart"><span style="width: 96%;"></span></div>
</div>
</aside>
<aside class="detail-card">
<h2 class="h5 mb-3">Recent activity</h2>
<div class="timeline-item pt-0 mt-0 border-0">
<div class="fw-semibold">Sender ID approved</div>
<div class="muted-label">CLICKINFO added for finance alerts</div>
<div class="small text-secondary mt-1">09:04</div>
</div>
<div class="timeline-item">
<div class="fw-semibold">Retry queue triggered</div>
<div class="muted-label">42 Zambia messages re-routed after timeout</div>
<div class="small text-secondary mt-1">08:57</div>
</div>
<div class="timeline-item">
<div class="fw-semibold">Campaign completed</div>
<div class="muted-label">Merchant onboarding reminder batch closed</div>
<div class="small text-secondary mt-1">08:41</div>
</div>
</aside>
</div>
</section>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
</body>
</html>