Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
385b299
docs: add home redesign / 2026 rebrand plan + design assets
manuelgeek Jun 19, 2026
d944135
docs: defer font wiring to follow-up issue #125
manuelgeek Jun 19, 2026
6ad02f7
feat: update color palette and adjust active link styles for consistency
NewtonMutugi Jun 20, 2026
3d9b6db
feat: update tailwind configuration and lockfile dependencies
NewtonMutugi Jun 23, 2026
79f9f83
docs: defer font wiring to follow-up issue #125
manuelgeek Jun 19, 2026
db9b4ef
docs: point font to private repo, drop local archive reference
manuelgeek Jun 25, 2026
a7003f0
style: update font-slab to Rubik and remove unused accent colors from…
NewtonMutugi Jun 25, 2026
eaecd6f
feat: expand black color palette and add droidcon-1 and droidcon-2 co…
NewtonMutugi Jun 25, 2026
bc781ea
Merge branch 'feat/home-redesign-plan' into feat/phase-0
NewtonMutugi Jun 25, 2026
699e88c
docs: document central-branch workflow for redesign PRs
manuelgeek Jun 25, 2026
8332bb1
Inject licensed Rauschen B brand font at build time (#128)
manuelgeek Jun 25, 2026
84160e8
fix: remove antigravity config file
NewtonMutugi Jun 25, 2026
5bfd464
docs: accurate color tokens from Figma export (green #00FF4F + blue #…
manuelgeek Jun 25, 2026
5dcc943
Merge branch 'feat/home-redesign-plan' into feat/phase-0
NewtonMutugi Jun 25, 2026
276d436
feat: rebrand color tokens — blue primary + green accent
manuelgeek Jun 25, 2026
03e5bcf
refactor: rename droidcon-1 and droidcon-2 color palettes to green an…
NewtonMutugi Jun 25, 2026
bc2b7e1
Merge pull request #129 from droidconKE/feat/design-tokens
NewtonMutugi Jun 25, 2026
dd4ff06
Merge branch 'feat/home-redesign-plan' into feat/phase-0
NewtonMutugi Jun 25, 2026
1f0cc3d
chore: remove bun.lock file
NewtonMutugi Jun 25, 2026
2a78591
Merge remote-tracking branch 'refs/remotes/origin/feat/phase-0' into …
NewtonMutugi Jun 25, 2026
c3e2358
Merge pull request #127 from droidconKE/feat/phase-0
NewtonMutugi Jun 25, 2026
2a0a6af
Phase-1: Navbar and Footer (#130)
NewtonMutugi Jun 29, 2026
30b78c6
Feat/phase 2 (#131)
NewtonMutugi Jun 30, 2026
380c26f
feat: remove login/auth, keep session bookmarks in localStorage (#133)
manuelgeek Jul 3, 2026
3f4ae6a
Feat/polish and propagate (#134)
NewtonMutugi Jul 3, 2026
72d5d6e
feat: add diagonal stripe pattern to sponsor section dividers
NewtonMutugi Jul 5, 2026
5bd40b5
Redesign sessions, speakers, session detail, about & sponsors (#135)
manuelgeek Jul 7, 2026
a5f5fee
fix: scope theme-toggle CSS + make session cards fully clickable
manuelgeek Jul 7, 2026
a519670
chore: stop tracking .claude/ local settings
manuelgeek Jul 7, 2026
157774c
fix: isolate accent cards from the fixed nav; restore session-detail …
manuelgeek Jul 7, 2026
3ce2197
fix: site title reads 'Largest Mobile' not 'Largest Android' (og/twit…
manuelgeek Jul 7, 2026
1b39eff
fix: meta description reads 'engineering of mobile applications'
manuelgeek Jul 7, 2026
c4adc35
fix: remove the unused push notification prompt and Firebase messagin…
manuelgeek Aug 5, 2026
8ab6a60
Feat/fix navbar issue (#138)
NewtonMutugi Aug 5, 2026
ac3edcd
Revised landing page, brand icons and social preview (#139)
manuelgeek Aug 14, 2026
f8b1bdc
fix: drop the vertical divider from the About stat cards (#140)
manuelgeek Aug 14, 2026
acd9701
refactor: update wording for clarity and conciseness in About and Tea…
NewtonMutugi Aug 15, 2026
790ac31
Merge pull request #141 from droidconKE/feat/wordings-update
NewtonMutugi Aug 15, 2026
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
16 changes: 8 additions & 8 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,17 @@ NEXT_PUBLIC_EVENT_SLUG=

NEXT_PUBLIC_EVENT_READY=

NEXT_PUBLIC_GOOGLE_CLIENT_ID=

NEXT_PUBLIC_FIREBASE_API_KEY=
NEXT_PUBLIC_FIREBASE_MESSAGE_ID=
NEXT_PUBLIC_FIREBASE_PUBLIC_KEY=
NEXT_PUBLIC_FIREBASE_SERVER_KEY=
NEXT_PUBLIC_FIREBASE_APP_ID=
NEXT_PUBLIC_MESSAGING_TOPIC=
NEXT_PUBLIC_GOOGLE_TAG=

NEXT_PUBLIC_EVENT_SLUG_2022=
NEXT_PUBLIC_EVENT_SLUG_2023=droidconke-2023-137
NEXT_PUBLIC_EVENT_SLUG_2024=
NEXT_PUBLIC_EVENT_SLUG_2025=
# --- Brand font (optional) ---
# Rauschen B is a licensed font kept in a PRIVATE repo (not committed here).
# It's fetched at build time (scripts/fetch-font.sh) into public/fonts/.
# Leave blank and the app still builds/runs — it just falls back to Montserrat.
# To render the real brand font, create a fine-grained PAT with
# **Contents: Read-only** on droidconKE/private-fonts and paste it below.
# Setup steps: https://github.com/droidconKE/private-fonts (see README)
FONT_REPO_TOKEN=
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,11 @@ yarn-error.log*

*.swp
*.swo

# Licensed font archives (do not commit to public repo)
docs/design/*.zip

# Build-time injected licensed font (see scripts/fetch-font.sh)
public/fonts/

.claude/
60 changes: 30 additions & 30 deletions components/about/Team.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,51 +22,51 @@ function Team({ organizers: unOrderedOrgs }: { organizers: Organizer[] }) {
})
return (
<>
<section className="l-container mt-4 md:mt-10">
<div className="flex flex-wrap md:py-16">
<div className="w-full text-center mb-2 md:mb-0 mt-4 md:mt-0 items-center justify-center">
<h2 className="title lowercase dark:text-accent-dark pt-6 md:pt-0">
<span>organizing</span> <span className="font-medium">team</span>
</h2>
<section className="s-container mt-8 md:mt-12">
<div className="w-full bg-primary rounded-4xl md:rounded-5xl px-6 py-8 md:px-12 md:py-12 text-left">
<div className="flex items-center text-white/80 text-sm md:text-base font-medium mb-3">
<div className="w-6 h-px bg-white/80 mr-3" />
meet the team
</div>
<h2 className="font-display capitalize text-accent text-3xl md:text-5xl">
<span>organizing</span> <span>team</span>
</h2>
<p className="mt-4 text-white text-lg md:text-xl leading-relaxed lg:w-10/12">
Droidcon Kenya is organized by a seasoned team with a seven-edition
track record of delivering developer events in Africa. The same team
organizes Fluttercon Kenya, ensuring that the two conferences
function as a single experience.
</p>
</div>
<p className="mb-4 md:mb-0 text-xl justify-center text-center">
Droidcon Kenya is a Codescape Limited product, organized by a seasoned
team with a proven seven-edition track record of delivering
exceptional developer events in Africa. The same team also organizes
Fluttercon Kenya, ensuring seamless integration between the two
conferences.
</p>
</section>
<section className="s-container">
<section className="s-container mt-8 md:mt-10">
<div>
<div className="items-center flex flex-wrap">
<div className="w-full px-0 md:px-24 mr-auto mb-4 md:mb-0 pb-0 lg:pb-16">
<div className="w-full flex-wrap grid sm:grid-cols-4 md:grid-cols-5 grid-cols-3 gap-2 lg:gap-4">
<div className="w-full mr-auto mb-4 md:mb-0 pb-0 lg:pb-16">
<div className="w-full flex-wrap grid sm:grid-cols-4 md:grid-cols-5 grid-cols-3 gap-4 md:gap-6">
{organizers.map((org) => (
<a
key={org.created_at}
target="_blank"
href={org.link}
className="text-center"
rel="noreferrer"
className="group flex flex-col h-full rounded-2xl overflow-hidden bg-white dark:bg-darker-dark border border-primary dark:border-primary shadow-md hover:shadow-xl hover:border-accent transition-all duration-200"
>
<div className="flex justify-center">
<div className="w-24 h-24 md:w-44 md:h-44 p-2 md:p-4 bg-green-c-2 rounded">
<img
className="w-full p-0 flex rounded-lg border border-accent-2"
src={
org.photo === null ? '/images/icon.png' : org.photo
}
alt={org.name}
/>
</div>
<div className="relative overflow-hidden bg-blue-600">
<img
className="w-full aspect-square object-cover grayscale contrast-125 mix-blend-screen group-hover:scale-105 transition-transform duration-300"
src={
org.photo === null ? '/images/icon.png' : org.photo
}
alt={org.name}
/>
<span className="pointer-events-none absolute inset-0 mix-blend-overlay [background-image:radial-gradient(rgba(255,255,255,0.3)_1px,transparent_1.4px)] [background-size:6px_6px]" />
</div>
<div className="self-start">
<p className="mt-2 w-full text-base md:text-xl">
<div className="p-2 md:p-3 text-center flex-1 flex flex-col justify-center">
<p className="text-xs md:text-base font-bold text-accent dark:text-accent">
{org.name}
</p>
<p className="text-xs md:text-sm text-light dark:text-light">
<p className="text-[10px] md:text-xs text-black dark:text-white-dark mt-0.5 line-clamp-2">
{org.tagline}
</p>
</div>
Expand Down
42 changes: 0 additions & 42 deletions components/auth/Login.tsx

This file was deleted.

45 changes: 23 additions & 22 deletions components/error/index.tsx
Original file line number Diff line number Diff line change
@@ -1,29 +1,30 @@
import Link from 'next/link'
import { ErrorInterface } from '../../types/types'
import TitleComponent from './Title'
import MessageComponent from './Message'

const ErrorComponent = ({ message, status }: ErrorInterface) => {
return (
<div className="bg-lighter dark:bg-black flex flex-col h-screen justify-center">
<div className="absolute top-[32%] left-[15%] rotate-[340deg]">
<img
src="/images/svg/colored-x.svg"
className="w-12 h-12 sm:w-16 sm:h-16 md:w-20 md:h20 lg:w-28 lg:h-28"
alt="droidcon colored-x icon"
/>
</div>

<div className="absolute top-[70%] right-[5%] sm:right-[7%] md:top-96 md:right-[7%] lg:right-[7%] xl:right-[10%] 2xl:right-[15%]">
<img
src="/images/element_left.png"
className="w-14 sm:w-24 sm:h-20 md:w-28 md:h-24 lg:w-36 lg:h-32"
alt="droidcon element-x icon"
/>
</div>
// Short codes (404, 500) render huge; word statuses (OFFLINE) render smaller.
const isShort = String(status).length <= 4

<TitleComponent status={status} />

<MessageComponent message={message} />
return (
<div className="s-container min-h-[75vh] flex flex-col items-center justify-center text-center py-16 md:py-24">
<p className="text-primary dark:text-primary font-bold uppercase tracking-wide text-sm md:text-base mb-3">
( Error )
</p>
<h1
className={`relative font-display text-black dark:text-white-dark leading-none break-words max-w-full ${
isShort ? 'text-8xl md:text-[11rem]' : 'text-5xl md:text-8xl'
}`}
>
{status}
{/* halftone accent behind the code */}
<span className="pointer-events-none absolute -top-4 -right-6 w-24 h-24 [background-image:radial-gradient(#00FF4F_1.5px,transparent_1.7px)] [background-size:10px_10px] [mask-image:radial-gradient(circle_at_top_right,#000,transparent_70%)] [-webkit-mask-image:radial-gradient(circle_at_top_right,#000,transparent_70%)]" />
</h1>
<p className="mt-6 text-base md:text-lg text-black dark:text-white-dark max-w-md">
{message}
</p>
<Link href="/" className="btn-primary uppercase mt-8">
Head back home
</Link>
</div>
)
}
Expand Down
55 changes: 55 additions & 0 deletions components/home/About.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import React from 'react'

const statsBoxes = [
{ value: '7TH', label: 'DROIDCON EDITION' },
{ value: '3RD', label: 'FLUTTER EDITION' },
{ value: '200+', label: 'SESSIONS' },
{ value: '3000+', label: 'ATTENDEES' },
]

const About = () => {
return (
<section className="s-container ">
<div className="flex flex-col md:flex-row w-full rounded-3xl overflow-hidden shadow-xl">
{/* Left Column (Blue) */}
<div className="w-full md:w-[55%] bg-primary p-8 md:p-10 lg:p-12 flex flex-col justify-center">
<h2 className="text-accent text-5xl md:text-7xl font-display leading-none mb-8">
About
<br />
DroidconKe
</h2>
<p className="text-white dark:text-white text-lg md:text-xl leading-relaxed mb-6">
Droidcon Kenya returns for its 7th edition on November 5th and 6th,
2026, at PrideInn Azure Hotel in Nairobi, as the largest Droidcon
chapter in Sub-Saharan Africa.
</p>
<p className="text-white dark:text-white text-lg md:text-xl leading-relaxed">
Droidcon Kenya is part of next.app devCon, the global home of
Droidcon, Fluttercon, and the wider mobile developer community.
</p>
</div>

{/* Right Column (Green) — 2x2 split by hairlines */}
<div className="w-full md:w-[45%] bg-accent grid grid-cols-2">
{statsBoxes.map((box, index) => (
<div
key={box.value}
className={`p-6 md:p-8 lg:p-10 flex flex-col justify-center ${
index < 2 ? 'border-b border-primary' : ''
}`}
>
<div className="text-primary text-3xl md:text-5xl lg:text-6xl font-display mb-2">
{box.value}
</div>
<div className="text-primary text-[10px] md:text-xs uppercase">
{box.label}
</div>
</div>
))}
</div>
</div>
</section>
)
}

export default About
Loading
Loading