-
Notifications
You must be signed in to change notification settings - Fork 24
we build the static clean static web #10
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
WalkthroughA new Next.js project scaffold for Zplit with configuration files, build tooling, styling setup, and a comprehensive React homepage component featuring navigation, hero section, tech stack display, feature gallery, FAQ, and multiple call-to-action sections. Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (1 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 6
🧹 Nitpick comments (6)
Zplit-Website/my-app/.vscode/settings.json (1)
1-1: Consider adding workspace settings or removing the empty file.The empty settings file provides no value. Consider either:
- Adding useful VS Code settings (e.g., formatting, ESLint/TypeScript integration)
- Removing the file if no workspace-specific settings are needed
Example useful settings:
{ "editor.formatOnSave": true, "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.codeActionsOnSave": { "source.fixAll.eslint": "explicit" }, "typescript.tsdk": "node_modules/typescript/lib" }Zplit-Website/my-app/README.md (1)
1-36: Consider customizing the README for your project.The standard Next.js README provides good setup instructions. For better project documentation, consider adding:
- Project-specific description and purpose
- Zplit-specific features or architecture notes
- Environment variable requirements
- Additional setup steps if any
This is optional; the current README is functional for development.
Zplit-Website/my-app/package.json (1)
5-10: Prefernext lintover raweslintfor a Next app.
This reduces config/glob mismatches and aligns witheslint-config-next."scripts": { "dev": "next dev", "build": "next build", "start": "next start", - "lint": "eslint" + "lint": "next lint" },Zplit-Website/my-app/app/page.tsx (3)
909-937: Avoidalert()for waitlist UX; track the TODO and don’t collect emails without a plan.
At minimum, replace the submit handler with a non-blocking inline message and/or wire it to a real endpoint (and ensure you’re not logging/storing emails unintentionally when added).
55-988: Optional: split this file into components + data maps (features/FAQ/cards) to cut duplication.
This will make future edits (copy, links, icons, ordering) much safer.
64-109: Consider usingnext/linkfor navigation consistency, though plain anchor tags work for same-page hash navigation.For same-page fragments like
#features,#tech, etc., standard<a>tags are acceptable per Next.js best practices. Using<Link>provides consistency across the app but doesn't add routing or prefetch benefits for in-page anchors. Also review the logo link (href="#"at line 64) — it appears to be a placeholder and should likely point to the home route instead.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (8)
Zplit-Website/my-app/app/favicon.icois excluded by!**/*.icoZplit-Website/my-app/package-lock.jsonis excluded by!**/package-lock.jsonZplit-Website/my-app/public/file.svgis excluded by!**/*.svgZplit-Website/my-app/public/globe.svgis excluded by!**/*.svgZplit-Website/my-app/public/next.svgis excluded by!**/*.svgZplit-Website/my-app/public/vercel.svgis excluded by!**/*.svgZplit-Website/my-app/public/window.svgis excluded by!**/*.svgZplit-Website/my-app/stability.svgis excluded by!**/*.svg
📒 Files selected for processing (14)
Zplit-Website/my-app/.gitignore(1 hunks)Zplit-Website/my-app/.vercelignore(1 hunks)Zplit-Website/my-app/.vscode/settings.json(1 hunks)Zplit-Website/my-app/README.md(1 hunks)Zplit-Website/my-app/app/globals.css(1 hunks)Zplit-Website/my-app/app/layout.tsx(1 hunks)Zplit-Website/my-app/app/page.tsx(1 hunks)Zplit-Website/my-app/eslint.config.mjs(1 hunks)Zplit-Website/my-app/next.config.ts(1 hunks)Zplit-Website/my-app/package.json(1 hunks)Zplit-Website/my-app/postcss.config.mjs(1 hunks)Zplit-Website/my-app/public/.well-known/assetlinks.json(1 hunks)Zplit-Website/my-app/tsconfig.json(1 hunks)Zplit-Website/my-app/vercel.json(1 hunks)
🔇 Additional comments (7)
Zplit-Website/my-app/postcss.config.mjs (1)
1-7: LGTM!The PostCSS configuration correctly sets up Tailwind CSS v4 processing using the
@tailwindcss/postcssplugin. This aligns with Tailwind v4's new architecture.Zplit-Website/my-app/.gitignore (1)
1-41: LGTM!The
.gitignorefile contains comprehensive and appropriate patterns for a Next.js project, covering dependencies, build artifacts, environment files, and development tools.Zplit-Website/my-app/next.config.ts (1)
1-7: LGTM!The minimal Next.js configuration is valid and appropriate for a new project. Configuration options can be added incrementally as needed.
Zplit-Website/my-app/tsconfig.json (1)
1-43: LGTM!The TypeScript configuration is well-structured and appropriate for a Next.js project with proper compiler options, path aliases, and Next.js plugin integration.
Zplit-Website/my-app/eslint.config.mjs (1)
1-1: The import path"eslint/config"is correct for ESLint v9 flat config. BothdefineConfigandglobalIgnoresare standard exports from this entry point per official ESLint documentation. No changes needed here.Zplit-Website/my-app/app/layout.tsx (1)
1-22: LGTM for a minimal App RouterRootLayout+metadata.Zplit-Website/my-app/app/globals.css (1)
3-29: The code is correct as written. Tailwind CSS v4's@theme inlineemits CSS variables as standard runtime CSS custom properties on:root, which meansvar(--font-sans)in thebodyrule will resolve properly. Duplicating--font-sansin both:rootand@theme inlineis unnecessary and goes against Tailwind v4 conventions, which consolidate token definitions in the@themeblock.
| node_modules | ||
| .next | ||
| .git | ||
| *.log | ||
| .env*.local |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider broadening env ignore patterns (defense-in-depth).
node_modules
.next
.git
*.log
.env*.local
+.env
+.env.*📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| node_modules | |
| .next | |
| .git | |
| *.log | |
| .env*.local | |
| node_modules | |
| .next | |
| .git | |
| *.log | |
| .env*.local | |
| .env | |
| .env.* |
🤖 Prompt for AI Agents
In Zplit-Website/my-app/.vercelignore lines 1–5, the current ignore list covers
some env files but is too narrow; update the file to ignore all
environment-related files for defense-in-depth by adding patterns such as .env,
.env.*, .env.*.local (covers .env.production, .env.development, .env.test,
.env.local, etc.), plus any common variants like .envrc and .local.env so no
accidental environment files are deployed.
| useEffect(() => { | ||
| let ticking = false; | ||
|
|
||
| const handleScroll = () => { | ||
| if (!ticking) { | ||
| window.requestAnimationFrame(() => { | ||
| setScrolled(window.scrollY > 20); | ||
| ticking = false; | ||
| }); | ||
| ticking = true; | ||
| } | ||
| }; | ||
|
|
||
| window.addEventListener('scroll', handleScroll, { passive: true }); | ||
| return () => window.removeEventListener('scroll', handleScroll); | ||
| }, []); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Set initial scrolled on mount (refresh mid-page).
useEffect(() => {
let ticking = false;
const handleScroll = () => {
if (!ticking) {
window.requestAnimationFrame(() => {
setScrolled(window.scrollY > 20);
ticking = false;
});
ticking = true;
}
};
+ handleScroll();
window.addEventListener('scroll', handleScroll, { passive: true });
return () => window.removeEventListener('scroll', handleScroll);
}, []);🤖 Prompt for AI Agents
In Zplit-Website/my-app/app/page.tsx around lines 12 to 27, the effect only
updates `scrolled` in response to future scroll events so a page refresh while
scrolled leaves the state incorrect; fix it by reading the current scroll
position on mount and setting `scrolled` immediately (e.g., call
setScrolled(window.scrollY > 20) at the start of the useEffect before adding the
scroll listener), then keep the existing requestAnimationFrame handler and
cleanup as-is.
| // Handle mobile menu accessibility | ||
| useEffect(() => { | ||
| if (mobileMenuOpen) { | ||
| // Focus first focusable element when menu opens | ||
| const firstFocusable = mobileMenuRef.current?.querySelector('a, button') as HTMLElement; | ||
| firstFocusable?.focus(); | ||
|
|
||
| // Handle Escape key to close menu | ||
| const handleEscape = (e: KeyboardEvent) => { | ||
| if (e.key === 'Escape') { | ||
| setMobileMenuOpen(false); | ||
| menuButtonRef.current?.focus(); | ||
| } | ||
| }; | ||
|
|
||
| document.addEventListener('keydown', handleEscape); | ||
| return () => document.removeEventListener('keydown', handleEscape); | ||
| } else if (menuButtonRef.current && document.activeElement !== menuButtonRef.current) { | ||
| // Return focus to button when menu closes (if not already focused) | ||
| const wasMenuFocused = mobileMenuRef.current?.contains(document.activeElement); | ||
| if (wasMenuFocused) { | ||
| menuButtonRef.current.focus(); | ||
| } | ||
| } | ||
| }, [mobileMenuOpen]); | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Mobile menu isn’t actually “trapped” (keyboard can tab into background).
Consider adding a real focus-trap (or a dialog pattern with role="dialog" aria-modal="true" + inert/background handling). Also ensure focus restoration works for all close paths (ESC + clicking a menu item).
Also applies to: 150-206
🤖 Prompt for AI Agents
Zplit-Website/my-app/app/page.tsx around lines 29-54 (and similarly 150-206):
the mobile menu currently only focuses the first control and listens for Escape,
but does not trap focus or restore focus on all close paths; replace this with a
proper focus-trap/dialog pattern by turning the menu into a modal (role="dialog"
aria-modal="true"), make the rest of the page inert or aria-hidden while open,
programmatically constrain Tab/Shift+Tab to cycle through the menu's focusable
elements (or use a small focus-trap utility), and add handlers so any close
action (Escape, clicking a menu item, backdrop click) calls the same close
routine that removes the trap, restores focus to menuButtonRef, and cleans up
event listeners; ensure event listeners are added/removed in the effect cleanup
and account for dynamic focusable elements inside the menu.
| "scripts": { | ||
| "dev": "next dev", | ||
| "build": "next build", | ||
| "start": "next start", | ||
| "lint": "eslint" | ||
| }, | ||
| "dependencies": { | ||
| "next": "16.0.10", | ||
| "react": "^19", | ||
| "react-dom": "^19" | ||
| }, | ||
| "devDependencies": { | ||
| "@tailwindcss/postcss": "^4", | ||
| "@types/node": "^20", | ||
| "@types/react": "^19", | ||
| "@types/react-dom": "^19", | ||
| "eslint": "^9", | ||
| "eslint-config-next": "16.0.10", | ||
| "tailwindcss": "^4", | ||
| "typescript": "^5" | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🌐 Web query:
Next.js 16.0.10 release Node.js requirements React 19 compatibility
💡 Result:
Short answer:
- Next.js 16.0.10 is a security/patch release (Dec 2025) that fixes React Server Components (RSC) vulnerabilities and should be installed ASAP. [1][2][3]
- Node.js requirement for Next.js 16: minimum Node.js 20.9.0. [4]
- React 19: Next.js 16 is the supported major for React 19 (Next.js 16 is compatible with React 19), but because the security issues affect some React 19 releases you should use the patched React 19 releases listed by the advisory when running RSC/App Router (upgrade React to the patched 19.x versions recommended in the advisories). [1][2]
Sources:
[1] Next.js — Upgrading: Version 16 (Node/TS/browser requirements, React Compiler/Turbopack notes). (nextjs.org)
[2] vercel/next.js security advisory (patches including 16.0.10 for RSC DoS/arbitrary-code fixes). (github.com)
[3] Netlify / vendor advisory summarizing affected versions and listing Next.js 16.0.10 as the patched release and advising React upgrades. (netlify.com)
[4] Next.js docs (Node.js 20.9+ minimum for Next.js 16). (nextjs.org)
If you want, I can give the exact commands to check your current versions and upgrade safely (next + react + node) for your project.
Citations:
- 1: https://nextjs.org/docs/app/guides/upgrading/version-16?utm_source=openai
- 2: https://github.com/vercel/next.js/security/advisories/GHSA-5j59-xgg2-r9c4?utm_source=openai
- 3: https://www.netlify.com/changelog/?utm_source=openai
- 4: https://nextjs.org/docs/app/guides/upgrading/version-16?utm_source=openai
🌐 Web query:
eslint-config-next 16.0.10 ESLint 9 compatibility
💡 Result:
Short answer: Yes — eslint-config-next in the Next.js 16 series (including 16.0.10) is intended to be used with ESLint 9. Next.js moved its ESLint setup toward the newer ESLint flat-config direction in v16 and the project issues / docs show the upgrade path from the older ^7/8 peerDependency constraints to supporting ESLint 9+. [1][2]
Notes / gotchas:
- Older eslint-config-next releases (pre-16 / v14–v15) required ^7 || ^8 as a peerDependency and produced ERESOLVE warnings when you tried to install ESLint 9; this is the root of many reported install errors. If you upgrade to eslint-config-next 16.x, use ESLint 9 to avoid those conflicts. [3][4]
- With pnpm you may still see plugin resolution errors (plugins need to be hoisted or installed at the proper level); that’s a separate pnpm/module-resolution quirk some users have reported. If you use pnpm and see “Failed to load plugin …” errors, either hoist eslint-related packages or install the missing plugins explicitly. [5]
Sources:
- Next.js 16 announcement / ESLint change notes. [1]
- Next.js ESLint docs (config/package behavior). [2]
- GitHub issues discussing peerDependency conflicts and the move to support ESLint 9. [3][4]
- Community writeups / pnpm hoisting explanation for eslint-related install errors. [5]
Confirm React 19 security patches are applied per Next.js 16.0.10 advisory.
The version set (Next.js 16.0.10 / React 19 / ESLint 9 / TypeScript 5) is compatible. However, Next.js 16.0.10 was released as a security patch for React Server Components vulnerabilities that affect some React 19 releases. Verify that react and react-dom are updated to the patched 19.x versions recommended in the security advisory, and ensure your project's Node.js requirement is set to ≥20.9.0 (minimum for Next.js 16).
Consider using "next lint" instead of "eslint" directly in the lint script to leverage Next.js's built-in configuration and file glob handling.
🤖 Prompt for AI Agents
Zplit-Website/my-app/package.json lines 5-25: react and react-dom are set to
generic "^19" which may include unpatched 19.x releases referenced by the
Next.js 16.0.10 security advisory; update both "react" and "react-dom" to the
specific patched 19.x versions recommended in the Next.js security advisory (use
the exact patch numbers from the advisory), add an "engines" field requiring
Node.js >=20.9.0, and change the "lint" script to use Next's wrapper ("next
lint") instead of directly calling "eslint".
| ], | ||
| "target": { | ||
| "namespace": "android_app", | ||
| "package_name": "com.example.zplit", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🏁 Script executed:
find . -name "assetlinks.json" -type f | head -20Repository: StabilityNexus/Zplit
Length of output: 121
🏁 Script executed:
cat -n Zplit-Website/my-app/public/.well-known/assetlinks.jsonRepository: StabilityNexus/Zplit
Length of output: 556
🏁 Script executed:
# Search for Android package name references in the codebase
rg "com\.example\.|com\.stabilitynexus\.|package_name|packageName" --type json --type js --type ts --type jsx --type tsx -i | head -30Repository: StabilityNexus/Zplit
Length of output: 91
🏁 Script executed:
# Look for Android or app configuration files
fd -e "android.json" -e "app.json" -e "package.json" -e "AndroidManifest" -e "build.gradle" | head -20Repository: StabilityNexus/Zplit
Length of output: 46
🏁 Script executed:
# Check README and documentation files
fd -e "md" -e "txt" | xargs grep -l "package" 2>/dev/null | head -10Repository: StabilityNexus/Zplit
Length of output: 73
🏁 Script executed:
cat -n README.mdRepository: StabilityNexus/Zplit
Length of output: 4648
🏁 Script executed:
# Search for Flutter pubspec.yaml and Android build configs
fd -e "pubspec.yaml" -e "build.gradle" -e "pubspec.lock"Repository: StabilityNexus/Zplit
Length of output: 46
🏁 Script executed:
# Also search for any Android package name declarations
rg "package\s*=|applicationId|package_name" -A 2 -B 2 2>/dev/null | head -40Repository: StabilityNexus/Zplit
Length of output: 557
Update the Android package name in both files before production deployment.
The package name com.example.zplit is a placeholder in both android/app/build.gradle.kts (applicationId) and this assetlinks.json file. The build.gradle.kts explicitly marks this as a TODO. For production use, update both files to match your actual Android app package name (e.g., com.stabilitynexus.zplit based on your organization). The assetlinks.json file must contain the exact package name of your deployed Android application for Android App Links verification to work correctly.
🤖 Prompt for AI Agents
In Zplit-Website/my-app/public/.well-known/assetlinks.json around line 8, the
"package_name": "com.example.zplit" is a placeholder; replace it with your real
Android applicationId (the same value used in android/app/build.gradle.kts
applicationId, e.g., com.stabilitynexus.zplit) so the package name in this
assetlinks.json exactly matches the deployed app; update both files to the
identical production package name and keep the JSON structure intact (also
ensure any fingerprint entries match the signing key used for release).
| { | ||
| "buildCommand": "npm run build", | ||
| "devCommand": "npm run dev", | ||
| "installCommand": "npm install", | ||
| "framework": "nextjs", | ||
| "outputDirectory": ".next" | ||
| } No newline at end of file |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🏁 Script executed:
find . -maxdepth 4 -name "package*.json" -o -name "yarn.lock" -o -name "pnpm-lock.yaml" | head -20Repository: StabilityNexus/Zplit
Length of output: 205
🏁 Script executed:
ls -la Zplit-Website/my-app/ 2>/dev/null | grep -E "package|lock"Repository: StabilityNexus/Zplit
Length of output: 196
🏁 Script executed:
git ls-files | grep -E "^Zplit-Website/my-app/(package-lock\.json|yarn\.lock|pnpm-lock\.yaml)"Repository: StabilityNexus/Zplit
Length of output: 102
🌐 Web query:
Vercel Next.js outputDirectory ".next" in vercel.json recommended
💡 Result:
Short answer: Usually no — don’t hardcode "outputDirectory": ".next" in vercel.json for a normal Next.js project. Let Vercel’s Next.js framework preset handle the build output. Only explicitly set outputDirectory when you have a non‑standard build layout (monorepo, custom root, or using Next’s standalone output), in which case point it to the actual build artifact (for example "client/.next/standalone"). [1][2]
References
- Vercel Next.js docs — use the Next.js framework preset (it configures the build and output). [1]
- Vercel community / guides — show using outputDirectory only for custom layouts (example: "client/.next/standalone"). [2]
Use deterministic installs (npm ci) and remove unnecessary outputDirectory for Next.js.
For a standard Next.js deployment, Vercel's framework preset automatically configures the build output. The explicit outputDirectory: ".next" is not needed and should be removed. Additionally, since a package-lock.json exists in the repository, use npm ci for deterministic installs instead of npm install.
{
"buildCommand": "npm run build",
"devCommand": "npm run dev",
- "installCommand": "npm install",
+ "installCommand": "npm ci",
"framework": "nextjs",
- "outputDirectory": ".next"
}🤖 Prompt for AI Agents
In Zplit-Website/my-app/vercel.json around lines 1 to 7, the file uses "npm
install" and explicitly sets "outputDirectory": ".next"; change the
installCommand to "npm ci" to use deterministic installs when package-lock.json
exists, and remove the "outputDirectory" property entirely so Vercel can use its
Next.js framework preset defaults.
the web is complete
Summary by CodeRabbit
New Features
Documentation
✏️ Tip: You can customize this high-level summary in your review settings.