Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
351 changes: 351 additions & 0 deletions docs/client/post-launch-fixes-report.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,351 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Project Update — Bejundas Platform | Post-Launch Fixes</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<style>
*, *::before, *::after {
box-sizing: border-box; margin: 0; padding: 0;
-webkit-print-color-adjust: exact; print-color-adjust: exact;
}

:root {
--navy: #1a1a2e;
--navy-d: #0f0f1f;
--coral: #e94560;
--coral-d: #c83653;
--coral-lt: #fde8ec;
--green: #16a34a;
--green-lt: #dcfce7;
--slate: #f4f5f9;
--text: #1a1a1a;
--muted: #6a6a7c;
--border: #e3e4ee;
--bg: #f9f9fc;
--white: #ffffff;
}

body { font-family: 'Inter', sans-serif; background: var(--bg); color: var(--text); line-height: 1.7; }

.header { background: var(--navy); color: var(--white); padding: 52px 0 44px; border-bottom: 4px solid var(--coral); }
.inner { max-width: 820px; margin: 0 auto; padding: 0 32px; }
.header-top { display: flex; align-items: center; justify-content: space-between; margin-bottom: 28px; flex-wrap: wrap; gap: 12px; }
.brand { display: flex; align-items: center; gap: 10px; }
.brand-dot { width: 10px; height: 10px; background: var(--coral); border-radius: 50%; }
.brand-name { font-size: 14px; font-weight: 600; color: #d2d2dd; letter-spacing: .04em; text-transform: uppercase; }
.report-date { font-size: 13px; color: #d2d2dd; }
.header h1 { font-size: 34px; font-weight: 700; letter-spacing: -.02em; line-height: 1.2; margin-bottom: 12px; }
.header h1 span { color: var(--coral); }
.header .subtitle { font-size: 16px; color: #e1e1ea; max-width: 600px; margin-bottom: 24px; }
.status-pill { display: inline-flex; align-items: center; gap: 8px; background: var(--green-lt); color: var(--green); font-size: 13px; font-weight: 700; padding: 7px 16px; border-radius: 20px; letter-spacing: .03em; }
.status-pill::before { content: ''; width: 8px; height: 8px; background: var(--green); border-radius: 50%; }

main { max-width: 820px; margin: 0 auto; padding: 40px 32px 64px; display: flex; flex-direction: column; gap: 28px; }

.intro { background: var(--white); border: 1px solid var(--border); border-left: 4px solid var(--coral); border-radius: 10px; padding: 24px 28px; font-size: 15px; color: var(--muted); line-height: 1.8; }
.intro strong { color: var(--navy); }

.summary-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 12px; }
.stat { background: var(--white); border: 1px solid var(--border); border-radius: 10px; padding: 18px 20px; }
.stat .num { font-size: 28px; font-weight: 700; color: var(--coral); line-height: 1; margin-bottom: 6px; }
.stat .lbl { font-size: 12px; font-weight: 600; color: var(--muted); text-transform: uppercase; letter-spacing: .06em; }

.card { background: var(--white); border: 1px solid var(--border); border-radius: 12px; overflow: hidden; }
.card-header { display: flex; align-items: center; gap: 14px; padding: 20px 28px; border-bottom: 1px solid var(--border); background: var(--slate); }
.card-icon { width: 38px; height: 38px; background: var(--navy); border-radius: 9px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.card-icon svg { width: 18px; height: 18px; stroke: var(--coral); fill: none; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.card-header h2 { font-size: 16px; font-weight: 700; color: var(--navy); }
.card-header .card-tag { margin-left: auto; font-size: 11px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--coral-d); background: var(--white); padding: 3px 10px; border-radius: 4px; border: 1px solid #f0c4cd; }
.card-body { padding: 28px; }
.card-body p { color: var(--muted); font-size: 14.5px; margin-bottom: 14px; }
.card-body p:last-child { margin-bottom: 0; }
.card-body strong { color: var(--navy); font-weight: 600; }

.what-changed { background: var(--bg); border: 1px solid var(--border); border-radius: 8px; padding: 16px 20px; margin-top: 16px; }
.what-changed .lbl { font-size: 11px; font-weight: 700; color: var(--coral-d); letter-spacing: .08em; text-transform: uppercase; margin-bottom: 8px; }
.what-changed ul { list-style: none; padding: 0; margin: 0; }
.what-changed li { font-size: 14px; color: var(--text); padding: 6px 0; border-bottom: 1px dashed var(--border); }
.what-changed li:last-child { border-bottom: none; }
.what-changed li::before { content: '→ '; color: var(--coral); font-weight: 700; }

table.compare { width: 100%; border-collapse: collapse; margin-top: 14px; font-size: 13.5px; }
table.compare th, table.compare td { padding: 9px 12px; text-align: left; border-bottom: 1px solid var(--border); }
table.compare th { background: var(--slate); color: var(--navy); font-size: 11px; text-transform: uppercase; letter-spacing: .06em; font-weight: 700; }
table.compare td.label { font-weight: 600; color: var(--navy); width: 30%; }
table.compare td code { font-family: 'SF Mono', Menlo, monospace; font-size: 12.5px; background: var(--slate); padding: 1px 6px; border-radius: 4px; color: var(--coral-d); }

.pr-pill { display: inline-block; background: var(--coral-lt); color: var(--coral-d); font-size: 11px; font-weight: 700; padding: 3px 8px; border-radius: 4px; letter-spacing: .04em; }

.footer-note { background: var(--navy); color: var(--white); border-radius: 12px; padding: 28px 32px; }
.footer-note h3 { color: var(--coral); font-size: 14px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; margin-bottom: 12px; }
.footer-note p { color: #d2d2dd; font-size: 14px; line-height: 1.7; margin-bottom: 10px; }
.footer-note p:last-child { margin-bottom: 0; }
.footer-note a { color: var(--coral); text-decoration: none; font-weight: 600; }

@media (max-width: 600px) {
.header h1 { font-size: 26px; }
.card-header { padding: 16px 20px; }
.card-body { padding: 22px 20px; }
table.compare th, table.compare td { padding: 7px 8px; font-size: 12.5px; }
}

/* Print / Save as PDF — force backgrounds, control page breaks, tighten margins */
@page { size: A4; margin: 14mm 12mm; }

@media print {
html, body { background: var(--white) !important; }
body { font-size: 12pt; line-height: 1.55; }

.header,
.card,
.card-header,
.stat,
.what-changed,
.footer-note,
table.compare th,
.pr-pill,
.status-pill,
.intro { -webkit-print-color-adjust: exact !important; print-color-adjust: exact !important; }

.header { padding: 28px 0 24px; border-bottom-width: 3px; }
.header h1 { font-size: 22pt; }
.header .subtitle { font-size: 11pt; }
.inner { padding: 0 12mm; }
main { padding: 16px 12mm 20px; gap: 16px; }

.summary-grid { grid-template-columns: repeat(4, 1fr); gap: 8px; }
.stat { padding: 12px 14px; }
.stat .num { font-size: 20pt; }

.card { break-inside: avoid; page-break-inside: avoid; }
.card-header { padding: 12px 18px; }
.card-body { padding: 16px 18px; }
.card-body p { font-size: 11pt; margin-bottom: 8px; }

table.compare { font-size: 10.5pt; }
table.compare th, table.compare td { padding: 6px 9px; }
table.compare th { background: var(--slate) !important; color: var(--navy) !important; }
table.compare td code { background: var(--slate) !important; color: var(--coral-d) !important; }

.what-changed { padding: 12px 16px; }
.what-changed li { font-size: 10.5pt; padding: 4px 0; }

.footer-note { break-inside: avoid; page-break-inside: avoid; padding: 20px 24px; }

a { color: inherit; text-decoration: none; }
a[href^="http"]::after { content: ""; } /* don't append URLs */
}
</style>
</head>
<body>

<header class="header">
<div class="inner">
<div class="header-top">
<div class="brand">
<span class="brand-dot"></span>
<span class="brand-name">Bejundas Platform</span>
</div>
<span class="report-date">May 2026</span>
</div>
<h1>Post-Launch <span>Fixes &amp; Polish</span></h1>
<p class="subtitle">Five small but meaningful updates to the live site — corrected legal name, complete contact details across every vertical, the four investment services, footer routing, and the all-caps brand wordmark.</p>
<span class="status-pill">All Five Fixes Live</span>
</div>
</header>

<main>

<div class="intro">
<strong>What this report covers.</strong> Between the launch of the Investments vertical and now, you asked for a series of refinements based on what you saw on the live site and what the client requested. All five were delivered through their own pull requests, tested, and merged. The site at <a href="https://bejundas.co.tz">bejundas.co.tz</a> already reflects every change below.
</div>

<div class="summary-grid">
<div class="stat"><div class="num">5</div><div class="lbl">Fixes shipped</div></div>
<div class="stat"><div class="num">5</div><div class="lbl">Pull requests</div></div>
<div class="stat"><div class="num">591</div><div class="lbl">Tests passing</div></div>
<div class="stat"><div class="num">0</div><div class="lbl">Manual steps for you</div></div>
</div>

<!-- Fix 1: Legal name -->
<div class="card">
<div class="card-header">
<div class="card-icon"><svg viewBox="0 0 24 24"><path d="M12 2l3 7h7l-5.5 4.5 2 7.5L12 17l-6.5 4 2-7.5L2 9h7z"/></svg></div>
<h2>1 &nbsp;·&nbsp; Investments — corrected registered legal name</h2>
<span class="card-tag pr-pill">PR #113</span>
</div>
<div class="card-body">
<p>The Investments vertical was shipped with a placeholder legal name. You confirmed the registered company name, and we replaced it everywhere the formal entity is spelled out — page disclaimers, the home-page structured data (<strong>schema.org Organization</strong> name used by Google), eyebrows, the About body, page titles, meta descriptions, the inquiry-notification email footer, and the client/technical reports.</p>

<table class="compare">
<thead><tr><th>Where</th><th>Was</th><th>Now</th></tr></thead>
<tbody>
<tr><td class="label">Registered name</td><td><code>BEJUNDAS INVESTMENTS LTD</code></td><td><code>BEAJ D&amp;S INVESTMENTS (T) LTD</code></td></tr>
</tbody>
</table>

<div class="what-changed">
<div class="lbl">Important nuance</div>
<ul>
<li>The trading name <strong>"Bejundas Investments"</strong> is kept as the public brand — navbar wordmark, the WhatsApp-friendly short name, the schema.org <em>alternateName</em>.</li>
<li>The <strong>registered name</strong> appears in legal and identification contexts — disclaimers, the Google structured data, the email footer.</li>
<li>That split is normal and correct: a brand and a registered company name often differ.</li>
</ul>
</div>
</div>
</div>

<!-- Fix 2: Per-vertical contacts -->
<div class="card">
<div class="card-header">
<div class="card-icon"><svg viewBox="0 0 24 24"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72c.13.96.37 1.9.72 2.81a2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45c.91.35 1.85.59 2.81.72A2 2 0 0 1 22 16.92z"/></svg></div>
<h2>2 &nbsp;·&nbsp; Every vertical now carries its own contact block</h2>
<span class="card-tag pr-pill">PR #114</span>
</div>
<div class="card-body">
<p>Each vertical contact page now shows the group's shared physical address, postal address, and phone — plus <strong>its own email</strong>. You can edit any value from the admin without a developer.</p>

<table class="compare">
<thead><tr><th>Shared across all five</th><th>Value</th></tr></thead>
<tbody>
<tr><td class="label">Physical address</td><td>Msakuzi - Mbezi - Ubungo - Dar es Salaam</td></tr>
<tr><td class="label">Postal address</td><td>P.O. Box 7276, Dar es Salaam</td></tr>
<tr><td class="label">Phone</td><td>+255 785 778 833 / +255 764 764 011</td></tr>
<tr><td class="label">WhatsApp link</td><td>+255 764 764 011 (the 011 line)</td></tr>
</tbody>
</table>

<table class="compare">
<thead><tr><th>Vertical</th><th>Email</th></tr></thead>
<tbody>
<tr><td class="label">Financial</td><td>financialservices@bejundas.co.tz</td></tr>
<tr><td class="label">Construction</td><td>construction@bejundas.co.tz</td></tr>
<tr><td class="label">Energies</td><td>energies@bejundas.co.tz</td></tr>
<tr><td class="label">Farming</td><td>farming@bejundas.co.tz</td></tr>
<tr><td class="label">Investments</td><td>investments@bejundas.co.tz</td></tr>
</tbody>
</table>

<div class="what-changed">
<div class="lbl">Design choices worth knowing</div>
<ul>
<li><strong>Both phone numbers display as text</strong> on the page — a single click-to-call link can't hold two numbers, and you wanted both visible. The WhatsApp link uses the 011 line.</li>
<li>The Energies <strong>safety page</strong> emergency button was pinned to a single tappable number so the emergency call works on a phone tap.</li>
<li>Financial and Construction didn't have these fields before — they were added to match the others.</li>
</ul>
</div>
</div>
</div>

<!-- Fix 3: Investments services -->
<div class="card">
<div class="card-header">
<div class="card-icon"><svg viewBox="0 0 24 24"><path d="M3 7h18v13H3z M3 7l3-4h12l3 4 M9 12h6"/></svg></div>
<h2>3 &nbsp;·&nbsp; The four investment services are live</h2>
<span class="card-tag pr-pill">PR #116</span>
</div>
<div class="card-body">
<p>The Investments services page was built admin-editable and intentionally empty at launch. The client supplied the four lines, and they're now on the site — shown as a clean grid of <strong>icon + name + short description</strong>, exactly per the brief.</p>

<table class="compare">
<thead><tr><th>Service</th><th>Short description</th></tr></thead>
<tbody>
<tr><td class="label">Real Estate</td><td>Developing, holding, and managing residential and commercial property across Tanzania.</td></tr>
<tr><td class="label">Super &amp; Mini Super Markets</td><td>Retail grocery outlets — from neighbourhood mini-marts to full supermarkets.</td></tr>
<tr><td class="label">Wholesale Business</td><td>Bulk supply and distribution, moving goods from source to retailers at scale.</td></tr>
<tr><td class="label">Hardware &amp; Building Materials</td><td>Construction supplies, hardware, and building materials for projects of every size.</td></tr>
</tbody>
</table>

<div class="what-changed">
<div class="lbl">Still yours to control</div>
<ul>
<li>Each service is a row you can edit, reorder, or hide from the admin — no developer needed.</li>
<li>Adding a fifth or sixth service later means filling in a form; it appears on the page instantly.</li>
<li>The page falls back to a graceful empty-state if every service is ever removed.</li>
</ul>
</div>
</div>
</div>

<!-- Fix 4: Footer + brand caps -->
<div class="card">
<div class="card-header">
<div class="card-icon"><svg viewBox="0 0 24 24"><path d="M5 12h14 M12 5l7 7-7 7"/></svg></div>
<h2>4 &nbsp;·&nbsp; Footer routing fix + all-caps brand wordmark</h2>
<span class="card-tag pr-pill">PR #118</span>
</div>
<div class="card-body">
<p>Two small but visible fixes on the main page.</p>

<table class="compare">
<thead><tr><th>Footer link</th><th>Was</th><th>Now</th></tr></thead>
<tbody>
<tr><td class="label">Financial Services</td><td><code>/services/</code></td><td><code>/financial/</code></td></tr>
<tr><td class="label">Construction</td><td><code>/services/</code></td><td><code>/construction/</code></td></tr>
<tr><td class="label">Energies</td><td><code>/services/</code></td><td><code>/energies/</code></td></tr>
<tr><td class="label">Farming</td><td><code>/services/</code></td><td><code>/farming/</code></td></tr>
<tr><td class="label">Investments</td><td><code>/services/</code></td><td><code>/investments/</code></td></tr>
</tbody>
</table>

<p style="margin-top:14px;">Every vertical in the footer's "Services" column now links to its own page instead of the generic group services page.</p>

<div class="what-changed">
<div class="lbl">Brand wordmark</div>
<ul>
<li>Where the brand name appears as the wordmark — header, mobile menu, footer logo, footer copyright — it now reads <strong>BEJUNDAS GROUP OF COMPANIES</strong> (all capitals).</li>
<li>Page titles and meta descriptions keep their natural case for clean SEO.</li>
<li>Vertical wordmarks already use uppercase legal names, so only the hub was affected.</li>
</ul>
</div>
</div>
</div>

<!-- Fix 5: Hub contact wiring -->
<div class="card">
<div class="card-header">
<div class="card-icon"><svg viewBox="0 0 24 24"><path d="M4 4h16v16H4z M22 6l-10 7L2 6"/></svg></div>
<h2>5 &nbsp;·&nbsp; Main site contact details wired up</h2>
<span class="card-tag pr-pill">PR #120</span>
</div>
<div class="card-body">
<p>The main page's contact section and footer were missing the group's contact info. They now carry the shared block alongside the group's own email address.</p>

<table class="compare">
<thead><tr><th>Group contact (hub)</th><th>Value</th></tr></thead>
<tbody>
<tr><td class="label">Office</td><td>Msakuzi - Mbezi - Ubungo - Dar es Salaam</td></tr>
<tr><td class="label">Postal</td><td>P.O. Box 7276, Dar es Salaam</td></tr>
<tr><td class="label">Phone</td><td>+255 785 778 833 / +255 764 764 011</td></tr>
<tr><td class="label">WhatsApp</td><td>+255 764 764 011</td></tr>
<tr><td class="label">Email</td><td><strong>info@bejundas.co.tz</strong></td></tr>
</tbody>
</table>

<div class="what-changed">
<div class="lbl">How this sits with the verticals</div>
<ul>
<li>The main contact page (<code>bejundas.co.tz/contact/</code>) now shows the full group contact block with <strong>info@bejundas.co.tz</strong>.</li>
<li>The site-wide footer now also carries this group contact on every page — vertical pages keep their own vertical-specific contact pages, but the footer underneath shows the parent group's details.</li>
<li>That mirrors a normal parent-group → division structure: division contact on the division page, group contact in the shared footer.</li>
</ul>
</div>
</div>
</div>

<!-- Wrap-up -->
<div class="footer-note">
<h3>What you can do from here</h3>
<p>Every value above — addresses, phones, emails, the four investment services — lives in the admin and can be edited by you without a developer.</p>
<p>If anything in the wording or presentation looks off in your browser, flag it and we'll iterate. The development environment now has 591 automated tests covering this surface, so future fixes are quick to land without regressions.</p>
<p style="margin-top:16px;font-size:12px;color:#9a9aae;">Generated for Bejundas Group of Companies · Bejundas Platform development</p>
</div>

</main>

</body>
</html>
Loading