0f4cb2c2c2
### Full-bleed backgrounds on wide screens Decorative section backgrounds were capped at the 1512px content width, leaving large empty gutters on ultra-wide viewports. - Added an opt-in `fullBleedBackground` prop to `SectionShell` that lifts the background layer off the content-width cap (default unchanged, so every other section is untouched). - Applied it to `HomeHero` (bridge halftone field) and both testimonials sections. - Capped the `NotchedCardShape` notch at its width at the content cap, so the white/dark card can span the full viewport while the notch stays fixed and centered. The footer and any other capped card are unaffected. <img width="3024" height="1718" alt="image" src="https://github.com/user-attachments/assets/a2200677-58af-4740-9257-77f6385ade28" /> <img width="3024" height="1224" alt="image" src="https://github.com/user-attachments/assets/73aa6745-b766-405e-b736-8c0c7591232e" /> ### Navigation restructure - Removed **Product** from the menu and footer nav, and promoted **Why** out of the Resources dropdown to a top-level item in Product's place. (The Product page itself is unchanged). - Resources dropdown polish: tightened the preview frame height now that the list is shorter; restored the cleaner/brighter User Guide and Developers preview assets from `twenty-website`; gave User Guide a center + 2× image scale so its halftone fills the frame like Developers, and raised `NextImage` `sizes` to keep the fine halftone crisp through that magnification. - Restored the **current-page highlight** in the Resources dropdown (active icon/label in highlight blue + marker bar), matching the old `NavDropdown`. <p> <img width="1509" height="323" alt="image" src="https://github.com/user-attachments/assets/d5702761-31f5-4b4d-9fcc-c33d5c7ae6ab" /> </p> ### OpenNext / Cloudflare deployment config Ported the Cloudflare Workers deployment setup from `twenty-website` so the same CI/deploy pipeline works against the redone package: - `open-next.config.ts` (R2 incremental cache + regional cache + skew protection), `wrangler.jsonc` (dev/prod envs — **worker names, routes, R2 buckets kept identical** for a seamless cutover), `initOpenNextCloudflareForDev()` in `next.config.ts`, the `preview`/`deploy:*`/`cf-typegen` scripts, the `@opennextjs/cloudflare` + `wrangler` devDependencies, a `.dev.vars.example` template, and the relevant `.gitignore` entries.
101 lines
3.5 KiB
JSON
101 lines
3.5 KiB
JSON
{
|
||
"$schema": "node_modules/wrangler/config-schema.json",
|
||
"name": "twenty-website",
|
||
"main": ".open-next/worker.js",
|
||
"compatibility_date": "2026-04-15",
|
||
// `global_fetch_strictly_public` forces the skew handler's cross-version
|
||
// fetch to `<version>-<worker>.<account>.workers.dev` to take the public
|
||
// Internet path. Without it, Cloudflare's optimized intra-account routing
|
||
// self-loops back to the current worker (timeouts → 522).
|
||
"compatibility_flags": ["nodejs_compat", "global_fetch_strictly_public"],
|
||
"assets": {
|
||
"directory": ".open-next/assets",
|
||
"binding": "ASSETS",
|
||
// Worker must intercept asset requests so it can route /_next/static/*
|
||
// and /_next/data/* from a stale client to the matching old Worker
|
||
// version (skew protection). Cloudflare's edge cache still absorbs hot
|
||
// paths, so this isn't a 5× Worker invocation tax in practice.
|
||
"run_worker_first": true,
|
||
},
|
||
// Per-version preview URLs are how skew protection routes a stale request
|
||
// to the old deployment: `<version>-<worker>.<account>.workers.dev`.
|
||
"preview_urls": true,
|
||
"observability": {
|
||
"enabled": true,
|
||
},
|
||
"env": {
|
||
"dev": {
|
||
"name": "twenty-website-dev",
|
||
"routes": [
|
||
{
|
||
"pattern": "twenty-main.com",
|
||
"custom_domain": true,
|
||
},
|
||
{
|
||
"pattern": "www.twenty-main.com",
|
||
"custom_domain": true,
|
||
},
|
||
],
|
||
"r2_buckets": [
|
||
{
|
||
"binding": "NEXT_INC_CACHE_R2_BUCKET",
|
||
"bucket_name": "twenty-website-cache-dev",
|
||
},
|
||
],
|
||
// Self-reference so OpenNext can fire-and-forget background ISR
|
||
// revalidations instead of blocking the request. Per-env because the
|
||
// service name must match the deployed worker name.
|
||
"services": [
|
||
{
|
||
"binding": "WORKER_SELF_REFERENCE",
|
||
"service": "twenty-website-dev",
|
||
},
|
||
],
|
||
// Skew-protection runtime inputs. The handler reads these to construct
|
||
// `<old-version-id>-<CF_WORKER_NAME>.<CF_PREVIEW_DOMAIN>.workers.dev`
|
||
// when routing a stale request to an older Worker version.
|
||
"vars": {
|
||
"CF_WORKER_NAME": "twenty-website-dev",
|
||
// OpenNext appends `.workers.dev` itself when constructing the
|
||
// per-version preview URL — passing the full `twentyhq.workers.dev`
|
||
// here would yield `…twentyhq.workers.dev.workers.dev` and 404.
|
||
// See https://github.com/opennextjs/opennextjs-cloudflare/issues/811
|
||
"CF_PREVIEW_DOMAIN": "twentyhq",
|
||
},
|
||
},
|
||
"prod": {
|
||
"name": "twenty-website-prod",
|
||
"routes": [
|
||
{
|
||
"pattern": "twenty.com",
|
||
"custom_domain": true,
|
||
},
|
||
{
|
||
"pattern": "www.twenty.com",
|
||
"custom_domain": true,
|
||
},
|
||
],
|
||
"r2_buckets": [
|
||
{
|
||
"binding": "NEXT_INC_CACHE_R2_BUCKET",
|
||
"bucket_name": "twenty-website-cache-prod",
|
||
},
|
||
],
|
||
"services": [
|
||
{
|
||
"binding": "WORKER_SELF_REFERENCE",
|
||
"service": "twenty-website-prod",
|
||
},
|
||
],
|
||
"vars": {
|
||
"CF_WORKER_NAME": "twenty-website-prod",
|
||
// OpenNext appends `.workers.dev` itself when constructing the
|
||
// per-version preview URL — passing the full `twentyhq.workers.dev`
|
||
// here would yield `…twentyhq.workers.dev.workers.dev` and 404.
|
||
// See https://github.com/opennextjs/opennextjs-cloudflare/issues/811
|
||
"CF_PREVIEW_DOMAIN": "twentyhq",
|
||
},
|
||
},
|
||
},
|
||
}
|