I wrapped up six PRs this Hacktoberfest across two repos, with most of my time going into the Payment-Page project. I focused on small, well‑scoped changes that add visible value: a UI refactor for a template, a product‑style features page, and a live analytics dashboard. Below are the highlights and a few lessons that helped me move fast without breaking things.
TL;DR
- 6 PRs across 2 repos (majority in Payment-Page)
- Highlights: refactored inline code for a cleaner UI, shipped a features page with comparisons, and built a real‑time analytics dashboard with KPIs
- Takeaways: keep PRs tight, add screenshots for UI work, and shape data for smooth charts
Why these projects
- UI/template work gives immediate impact—cleaner structure, better accessibility, and easier maintenance.
- Payment flows benefit from clarity and feedback. A solid features page reduces confusion; a dashboard makes status and trends obvious at a glance.
Contribution 1 — Fashion Blog Template: Refactor inline code and improve UI
Repo: Maddy57770/Fashion-Blog-Template
PR: https://github.com/Maddy57770/Fashion-Blog-Template/pull/38
What changed
- Moved inline CSS/JS into dedicated files and added small utility classes for spacing, type scale, and buttons.
- Standardized colors and spacing with CSS custom properties; improved contrast on text and interactive elements.
- Replaced inline onclick handlers with event listeners; tuned mobile breakpoints; added helpful ARIA attributes.
Before → after (snippet)
<!-- Before -->
<h2 style="margin: 0 0 16px; color: #444">New Arrivals</h2>
<button onclick="toggleMenu()" style="background:#000;color:#fff">Menu</button>
<!-- After -->
<h2 class="heading-md text-ink-700">New Arrivals</h2>
<button class="btn btn-dark" aria-controls="mobile-menu" aria-expanded="false">Menu</button>
/* utilities.css */
:root {
--space-2: 0.5rem;
--space-4: 1rem;
--radius: 0.5rem;
--ink-700: #374151;
}
.heading-md { font-size: clamp(1.25rem, 2vw, 1.5rem); margin-bottom: var(--space-4); }
.text-ink-700 { color: var(--ink-700); }
.btn { padding: 0.625rem 1rem; border-radius: var(--radius); border: 0; cursor: pointer; }
.btn-dark { background: #111; color: #fff; }
.btn-dark:focus-visible { outline: 2px solid #7c3aed; outline-offset: 2px; }
// app.js
const menuBtn = document.querySelector('.btn[aria-controls="mobile-menu"]');
const menu = document.getElementById('mobile-menu');
menuBtn?.addEventListener('click', () => {
const expanded = menuBtn.getAttribute('aria-expanded') === 'true';
menuBtn.setAttribute('aria-expanded', String(!expanded));
menu?.classList.toggle('hidden', expanded);
});
Impact
- Codebase: fewer inline styles/handlers, clearer structure, better caching potential.
- UX: more consistent spacing/typography; improved focus states and keyboard handling.
Contribution 2 — Payment-Page: Features page with interactive showcase and comparisons
Repo: Maddy57770/Payment-Page
PR: https://github.com/Maddy57770/Payment-Page/pull/9
What shipped
- An interactive features page (filter by category, quick scanning).
- A comparison section that stays readable on mobile.
- Consistent icons, copy tone, and spacing for a cohesive look.
Feature filter (vanilla JS)
// data-tab="all|security|payouts|integrations"
// data-feature="security,webhooks"
const tabs = document.querySelectorAll("[data-tab]");
const cards = document.querySelectorAll("[data-feature]");
tabs.forEach(tab => {
tab.addEventListener("click", () => {
const key = tab.dataset.tab;
tabs.forEach(t => t.classList.toggle("is-active", t === tab));
cards.forEach(card => {
const groups = card.dataset.feature.split(",");
const show = key === "all" || groups.includes(key);
card.hidden = !show;
});
});
});
Mobile‑friendly comparison layout
<section class="comparison">
<div class="row head">
<div></div>
<div>Starter</div>
<div>Pro</div>
</div>
<div class="row">
<div>Instant Payouts</div>
<div>—</div>
<div>✓</div>
</div>
<div class="row">
<div>Dispute Dashboard</div>
<div>✓</div>
<div>✓</div>
</div>
</section>
.comparison { display: grid; gap: 0.5rem; }
.row { display: grid; grid-template-columns: 2fr 1fr 1fr; align-items: center; }
.row.head { font-weight: 600; }
@media (max-width: 640px) {
.row { grid-template-columns: 1fr; }
.row > div:not(:first-child)::before {
content: attr(data-col);
font-size: 0.75rem; color: #6b7280; margin-right: 0.5rem;
}
}
Impact
- Faster decision‑making: users can compare at a glance and try interactions on the spot.
- Easier maintenance: componentized layout makes future plan changes simple.
Contribution 3 — Payment-Page: Analytics dashboard with real‑time charts and KPIs
Repo: Maddy57770/Payment-Page
What shipped
- KPI cards for core metrics (Revenue, Transactions, Conversion, Refunds).
- Real‑time charts (line for revenue trend, bar for methods, doughnut for success vs failure).
- Smooth, incremental updates with a small data generator for demo mode.
Chart update loop (Chart.js)
import Chart from "chart.js/auto";
const el = document.getElementById("revenueChart");
const chart = new Chart(el, {
type: "line",
data: { labels: [], datasets: [{ label: "Revenue", data: [], borderColor: "#4f46e5", tension: 0.3 }] },
options: {
animation: { duration: 250 },
plugins: { legend: { display: false } },
scales: { y: { beginAtZero: true, ticks: { callback: v => `$${v}` } } }
}
});
function addPoint() {
const now = new Date().toLocaleTimeString();
const value = Math.round(200 + Math.random() * 800);
chart.data.labels.push(now);
chart.data.datasets[0].data.push(value);
if (chart.data.labels.length > 12) {
chart.data.labels.shift();
chart.data.datasets[0].data.shift();
}
chart.update("none");
}
setInterval(addPoint, 2000);
KPI card markup
<section class="kpis">
<article class="kpi">
<h3>Revenue</h3>
<p class="value">$12,340</p>
<p class="delta up">+4.2% WoW</p>
</article>
<article class="kpi">
<h3>Transactions</h3>
<p class="value">1,284</p>
<p class="delta down">-1.1% WoW</p>
</article>
</section>
.kpis { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; }
.kpi { padding: 1rem; border: 1px solid #e5e7eb; border-radius: 0.75rem; background: #fff; }
.kpi .value { font-size: 1.75rem; font-weight: 700; margin: 0.25rem 0; }
.delta.up { color: #16a34a; }
.delta.down { color: #dc2626; }
@media (prefers-reduced-motion: reduce) {
* { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; }
}
Impact
- A clear, visual pulse of the system without digging into raw logs.
- Simple to swap the mock generator for real data since the data shape is consistent.
More Payment-Page PRs (quick hits)
- In addition to the major features above, I opened several smaller PRs in Payment-Page focused on polish, cleanup, and minor fixes to keep the UI consistent and the codebase tidy. These included small accessibility tweaks, copy/spacing refinements, and code organization improvements.
Collaboration and review notes
- For UI work, attaching before/after screenshots and a one‑liner “why” sped up reviews noticeably.
- I aligned naming, folder structure, and code style with each repo to keep diffs small and readable.
- I kept each PR tight: one logical change, one clear outcome.
What I learned
- Technical
- Move inline styles and handlers out early; it pays off in maintainability and caching.
- Comparison layouts should prioritize mobile readability—stack rows rather than cramming columns.
- Real‑time charts are as much about data shape and cadence as visuals—limit the window for smooth updates.
- Collaboration
- Ask clarifying questions before building; it saves churn.
- Screenshots, short videos, and a focused PR description are review gold.
- Git hygiene
- Commit messages that tell a story (“what + why”), then squash once the story is clear.
Numbers at a glance
- PRs completed: 6
- Repos touched: 2 (majority of contributions in Payment-Page)
- Focus areas: refactoring, UI/UX polish, feature pages, analytics
What’s next
- Payment-Page
- Add loading skeletons and empty states for analytics.
- Export CSV for selected date ranges.
- Lightweight alerts when error rates spike.
- Fashion-Blog-Template
- Introduce CSS variables for theming and dark mode.
- Audit focus states and color contrast against WCAG AA.
Selected PR links
- Fashion Blog Template — Refactor inline code & improve UI: https://github.com/Maddy57770/Fashion-Blog-Template/pull/38
- Payment-Page — Features page with interactive showcase and comparisons: https://github.com/Maddy57770/Payment-Page/pull/9
- More: additional PRs are in the Payment-Page repo.
Thanks
Appreciate the maintainers for thoughtful reviews and quick feedback. If you’re looking to contribute, both repos have approachable issues:
- Fashion Blog Template issues: https://github.com/Maddy57770/Fashion-Blog-Template/issues
- Payment-Page issues: https://github.com/Maddy57770/Payment-Page/issues
If you have feedback or want to pair on a follow‑up issue, I’m all ears.
Top comments (0)