diff --git a/.gitignore b/.gitignore index 6830bda..d7506d3 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ /out/ .vercel/ .open-next/ +.wrangler/ # production diff --git a/README.md b/README.md index 3dfbc08..4de62e4 100644 --- a/README.md +++ b/README.md @@ -12,11 +12,15 @@ npm run dev Open [http://localhost:3000](http://localhost:3000). +If you see `ENOENT` errors under `.next/…/app-build-manifest.json` or `_buildManifest.js.tmp`, stop the server, run `rm -rf .next`, then `npm run dev` again. Use `npm run dev:clean` to do both. Turbopack (`npm run dev:turbo`) is opt-in and can be flaky with manifest writes on some setups. + ## Scripts | Command | Description | |---------|-------------| -| `npm run dev` | Start dev server (Turbopack) | +| `npm run dev` | Start dev server (webpack — stable default) | +| `npm run dev:turbo` | Dev server with Turbopack (faster, optional) | +| `npm run dev:clean` | Remove `.next` cache then start dev (fixes broken dev cache) | | `npm run build` | Production build | | `npm run start` | Start production server | | `npm run lint` | ESLint | @@ -59,9 +63,7 @@ Logos and speaker cutouts are downloaded from the official site via `scripts/dow ## Calendar -- **Add to calendar** dropdown on the hero, tickets section, and payment page -- **Google Calendar** / **Outlook** deep links -- **`.ics` download** at [`/calendar`](app/calendar/route.ts) for Apple Calendar / iCal +- **`.ics` download** at [`/calendar`](app/calendar/route.ts) for Apple Calendar / iCal (direct URL still works if you share it) ## Payment API @@ -88,6 +90,8 @@ This project is configured for [**OpenNext on Cloudflare**](https://opennext.js. npm run deploy ``` +`predeploy` automatically removes `.next` and `.open-next` first so each deploy matches a clean local build (avoids stale worker bundles). + Alias: ```bash @@ -114,4 +118,24 @@ Add repo secrets: - OpenNext Cloudflare does **not** support `export const runtime = "edge"`; those exports were removed. - Build output is generated under **`.open-next/`** (gitignored). +- **`open-next.config.ts`** imports `@opennextjs/cloudflare` — that package **must** be installed locally (`npm install`). Using only `npx @opennextjs/cloudflare` without installing deps will fail with “Could not resolve `@opennextjs/cloudflare`”. +- Use **Node 20 or 22 LTS** for deploys. Node 25 is not recommended for Wrangler / workerd toolchains. +- Local **`next dev`** does not wire OpenNext’s miniflare shim unless you set **`OPENNEXT_CLOUDFLARE_DEV=1`** (only needed if you call `getCloudflareContext` in app code during dev). Production deploys are unchanged. + +### Troubleshooting + +**`ENOENT` / missing `app-build-manifest.json` or `_buildManifest.js.tmp` in dev** + +Stop the dev server, delete the cache (`rm -rf .next`), and run `npm run dev` again. Prefer the default dev script (webpack); use `dev:turbo` only if you need Turbopack. + +**`ETIMEDOUT` downloading `workerd` or other npm packages** + +Retry when the network is stable, or use a VPN / different DNS. You can also raise timeouts: + +```bash +npm config set fetch-timeout 600000 +npm config set fetch-retries 5 +``` + +Then run `npm install` again before `npm run deploy`. diff --git a/app/apple-icon.tsx b/app/apple-icon.tsx deleted file mode 100644 index 96168f2..0000000 --- a/app/apple-icon.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { ImageResponse } from "next/og"; - -export const size = { width: 180, height: 180 }; -export const contentType = "image/png"; - -export default function AppleIcon() { - return new ImageResponse( - ( -
- Reach the right team for registration, exhibitions, sponsorship, or media inquiries. -
-+ Reach the right team for registration, exhibitions, sponsorship, or media inquiries. +
+ } + /> + +- {exhibitCopy.eyebrow} -
-{exhibitCopy.subheadline}
-{exhibitCopy.subheadline}
} + > +- {partnersIntro.eyebrow} -
-- {partnersIntro.subheadline} -
-{partnersIntro.subheadline}
} + > +- {site.dates.label} -
-- Secure your place at {site.venue.name}, {site.venue.address}. Choose a pass and - complete checkout below. -
-+ Secure your place at {site.venue.name}, {site.venue.address}. Choose a pass and complete + checkout below. +
+ } + /> -${tier.priceUsd}
-per ticket · USD
-- Your registration has been received. Order reference:{" "} - {orderId} - {total && ( - <> - {" "} - · Total: {total} - > - )} -
-- A confirmation email will be sent once payment processing is connected. For now, our - team has logged your request. -
-+ Your registration has been received. Order reference:{" "} + {orderId} + {total && ( + <> + {" "} + · Total: {total} + > + )} +
++ A confirmation email will be sent once payment processing is connected. For now, our team + has logged your request. +
+- Pitch competition -
-{pitchCompetition.subheadline}
-- {pitchCompetition.description} -
-Legal
-Last updated: {privacyPolicy.updated}
-- {privacyPolicy.intro} -
-{section.body}
-Last updated: {privacyPolicy.updated}
+{privacyPolicy.intro}
+ > + } + /> + +{section.body}
+- Two days of workshops, panels, exhibition, and the Great Rift Valley Pitch Competition at - Skylight Hotel, Addis Ababa. -
-+ Two days of workshops, panels, exhibition, and the Great Rift Valley Pitch Competition at + Skylight Hotel, Addis Ababa. +
+ } + /> + +{day.date}
@@ -41,20 +55,23 @@ export default function ProgramPage() {{p.description}
-{p.description}
+Lineup
-- {site.dates.label} · {site.venue.name} -
-+ {site.dates.label} · {site.venue.name} +
+ } + /> -Sponsor
-- Support the Ethiopian Diaspora Trust Fund's mission to foster tech-enabled innovation. - Sponsorship connects your organization with investors, founders, and leaders across - agriculture, healthcare, and education. -
-+ Support the Ethiopian Diaspora Trust Fund's mission to foster tech-enabled + innovation. Sponsorship connects your organization with investors, founders, and leaders + across agriculture, healthcare, and education. +
+ } + /> + +
diff --git a/components/brand/BrandLogo.tsx b/components/brand/BrandLogo.tsx
index 5417faf..4e69848 100644
--- a/components/brand/BrandLogo.tsx
+++ b/components/brand/BrandLogo.tsx
@@ -53,10 +53,10 @@ export function BrandLogo({
: "text-[#0d3d26]/90";
const primarySize = compact
- ? "text-[11px] sm:text-xs md:text-[13px]"
+ ? "text-[12px] sm:text-[13px] md:text-sm"
: isFooter
- ? "text-sm md:text-base"
- : "text-xs sm:text-sm md:text-base";
+ ? "text-base md:text-lg"
+ : "text-sm sm:text-base md:text-lg";
const secondarySize = compact
? "text-[8px] sm:text-[9px]"
: "text-[9px] sm:text-[10px]";
@@ -72,7 +72,7 @@ export function BrandLogo({
>
{
+ let ticking = false;
+ const update = () => {
+ ticking = false;
+ const max = Math.max(
+ 1,
+ document.documentElement.scrollHeight - window.innerHeight
+ );
+ document.documentElement.style.setProperty(
+ "--rift-scroll",
+ String(window.scrollY / max)
+ );
+ };
+ const onScroll = () => {
+ if (!ticking) {
+ ticking = true;
+ requestAnimationFrame(update);
+ }
+ };
+
+ update();
+ window.addEventListener("scroll", onScroll, { passive: true });
+ window.addEventListener("resize", onScroll, { passive: true });
+
+ return () => {
+ window.removeEventListener("scroll", onScroll);
+ window.removeEventListener("resize", onScroll);
+ document.documentElement.style.removeProperty("--rift-scroll");
+ };
+ }, []);
+}
+
+/** Solid page backdrop only — patterns live on each section */
export function RiftPageFlow() {
+ const pathname = usePathname() ?? "/";
+
+ useEffect(() => {
+ document.documentElement.dataset.topoPattern = getPageTopoPattern(pathname);
+ return () => {
+ delete document.documentElement.dataset.topoPattern;
+ };
+ }, [pathname]);
+
+ useRiftScroll();
+
return (
+
{attendCopy.eyebrow}
{attendCopy.subheadline}
+ {attendCopy.subheadline}
{site.dates.label} · {site.venue.name}
+
+
{attendCopy.headline}
-
- Workshops, exhibition, and Africa's largest non-dilutive grant pitch event. -
++ Workshops, exhibition, and Africa's largest non-dilutive grant pitch event. +
+- {site.dates.label} · {site.venue.address} -
-- {site.tagline} Presented by {site.presentedBy}. -
-
-
+ {site.dates.label} · {site.venue.address} +
++ {site.tagline} Presented by {site.presentedBy}. +
+
+
About this summit
@@ -22,8 +23,8 @@ export function PurposeBand() { inaugural Great Rift Valley Pitch Competition—Lineup
@@ -33,9 +34,9 @@ export function Speakers() { Keynotes, panelists, judges, and opening speakers — {site.dates.label} at{" "} {site.venue.name}. -
+
Logo slots below are open — partner with GRV Summit and feature your brand here.
- The future starts here
-
+ The future starts here
+
- Register
+ Tickets
- Join 500+ attendees at {site.venue.name}, {site.venue.address}. Add the summit to your
- calendar when you choose a pass.
+ Join 500+ attendees at {site.venue.name}, {site.venue.address}. Choose a pass below.
The venue {site.venue.address} The venue {site.venue.address}
+ {eyebrow}
+ Partners & sponsors
+
+
{tier.name}
- Powering Ethiopia's innovation leap forward
-
+
+ Powering Ethiopia's innovation leap forward
+
+
Get your ticket
{site.venue.name}
- {site.venue.name}
+