diff --git a/.env.example b/.env.example index f97e5f1..53c7dab 100644 --- a/.env.example +++ b/.env.example @@ -5,15 +5,15 @@ 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_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= diff --git a/.gitignore b/.gitignore index b94ee51..04e61a4 100755 --- a/.gitignore +++ b/.gitignore @@ -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/ diff --git a/components/about/Team.tsx b/components/about/Team.tsx index 1b2f5c1..82f74f4 100644 --- a/components/about/Team.tsx +++ b/components/about/Team.tsx @@ -22,49 +22,50 @@ function Team({ organizers: unOrderedOrgs }: { organizers: Organizer[] }) { }) return ( <> -
-
-
-

- organizing team -

+
+
+
+
+ meet the team
+

+ organizing team +

+

+ Fluttercon Kenya is a Codescape Limited product, organized by the + same seasoned team behind Droidcon Kenya, ensuring seamless + integration between the two conferences. +

-

- Fluttercon Kenya is a Codescape Limited product, organized by the same - seasoned team behind Droidcon Kenya, ensuring seamless integration - between the two conferences. -

-
+
-
-
+
+
{organizers.map((org) => ( -
-
- {org.name} -
+
+ {org.name} +
-
-

+

+

{org.name}

-

+

{org.tagline}

diff --git a/components/auth/Login.tsx b/components/auth/Login.tsx deleted file mode 100644 index da5b542..0000000 --- a/components/auth/Login.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { useGoogleLogin } from '@react-oauth/google' -import { useContext } from 'react' -import { AuthContext } from '../../context/AuthContext' -import axios from '../../utils/axios' -import { Modal } from '../shared/Modal' - -export const Login = ({ closeDialog }: { closeDialog: () => void }) => { - const { loginUser } = useContext(AuthContext) - - const login = useGoogleLogin({ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onSuccess: async (tokenResponse: any) => { - // console.log({ tokenResponse }) - await axios - .post('/social_login/google', { - access_token: tokenResponse.access_token, - }) - .then((response) => { - // console.log({ response }) - loginUser(response.data) - closeDialog() - }) - }, - onError: () => { - // eslint-disable-next-line no-console - console.log('Login Failed') - }, - }) - return ( - closeDialog()}> -
- -
-
- ) -} diff --git a/components/error/index.tsx b/components/error/index.tsx index 813cd64..a3b396a 100644 --- a/components/error/index.tsx +++ b/components/error/index.tsx @@ -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 ( -
-
- fluttercon colored-x icon -
- -
- fluttercon element-x icon -
+ // Short codes (404, 500) render huge; word statuses (OFFLINE) render smaller. + const isShort = String(status).length <= 4 - - - + return ( +
+

+ ( Error ) +

+

+ {status} + {/* halftone accent behind the code */} + +

+

+ {message} +

+ + Head back home +
) } diff --git a/components/home/About.tsx b/components/home/About.tsx new file mode 100644 index 0000000..d67a5a0 --- /dev/null +++ b/components/home/About.tsx @@ -0,0 +1,59 @@ +import React from 'react' + +const statsBoxes = [ + { value: '3RD', label: 'FLUTTERCON EDITION', isPrimary: true }, + { value: '7TH', label: 'DROIDCON EDITION', isPrimary: false }, + { value: '200+', label: 'SESSIONS', isPrimary: false }, + { value: '3000+', label: 'ATTENDEES', isPrimary: false }, +] + +const About = () => { + return ( +
+
+ {/* Left Column (Blue) */} +
+
+
+ About flutterconke +
+

+ About +
+ FlutterconKE +

+

+ Now in its 3rd edition, FlutterconKE brings together Flutter and + Dart experts, Google Developer Experts, and hundreds of Mobile + developers from across the continent. Co-located with DroidconKE, + participants get an excellent chance to learn, network, and shape + the future of Mobile development in Africa. +

+
+ + {/* Right Column (Green) */} +
+
+ {statsBoxes.map((box) => ( +
+
+ {box.value} +
+
+ {box.label} +
+
+ ))} +
+
+
+
+ ) +} + +export default About diff --git a/components/home/Banner.tsx b/components/home/Banner.tsx index b69d9d7..e5b8c70 100644 --- a/components/home/Banner.tsx +++ b/components/home/Banner.tsx @@ -3,97 +3,108 @@ import { CFS_LINK, TICKETS_LINK } from '../../constant/constants' export const Banner = () => { return ( -
-
-
-

- welcome to
- - FLUTTERCONKE26 - -

-
-

- THE FIRST FLUTTERCON IN AFRICA.
-

-
-
+
+
+
+ {/* Hero Images */} +

Beyond Stacks

+
line + Beyond Stacks + Flutter Icon
-
-

- One ticket, 2 conferences. When you buy a ticket to FlutterconKe,{' '} -
- you are automatically registered to attend droidconKe{' '} -

-
-
-
- - get your ticket - - - submit a talk - - - sponsor flutterconke - - {/* + Africa's largest Mobile developer conference. Two days. One + ticket. FlutterconKE + DroidconKE. Nairobi, November 2026. +

+ + {/* Buttons */} + -
- {/* droid alt */} -
- 05TH - 06TH NOVEMBER 2026 -
-
+ + +
+ + SUBMIT A TALK + + + SPONSOR FLUTTERCONKE +
-
- {/* */} - {/*