-
Notifications
You must be signed in to change notification settings - Fork 16
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
Dependencies Upgrades, SEO, DX, Performance Improvements #69
base: main
Are you sure you want to change the base?
Changes from 14 commits
3c238a0
2ae82d0
b50fc49
86bc852
2931e6e
a24e896
8857078
548ac07
026cc41
5ea9085
56afd20
e610cc7
3bd452d
9534dc1
1ac374e
5f0956f
30cdd30
c9c90f8
5c8b3da
69191c6
f033497
7f6077b
ab58080
b5aeb5d
0da387f
fbbc7ae
a93bfbd
d1f466a
7a71a5e
f39bf18
c58f32e
94b8058
0e5b140
01d2cb3
3be18a2
321a479
b863617
d50623c
5b8ad48
390b17a
4430ef5
0c124c9
0af9a1b
287a7cf
fd765be
b510512
4b4e731
05e4d2c
c56ce30
7350ff5
8355c2d
6ea4397
bf110c0
bd6f316
54510cc
300f675
6343b15
1b4017e
1b401c5
422da11
aa44771
8d53fdf
5215fec
7891a34
e8bcd8e
ec125c0
764513b
74a20c2
0979eb0
3c8e80c
f3a3984
cdbeaa5
f590f23
6ab46e9
41680d0
89ec62e
28333d3
d397552
298a6cb
df54061
7654582
f8a5fd4
3408e56
628f7a3
2d5f3a9
ffbb30b
83ae419
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
legacy-peer-deps=true |
Large diffs are not rendered by default.
Original file line number | Diff line number | Diff line change | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
@@ -15,57 +15,57 @@ | |||||||||
"@clerk/nextjs": "^5.2.4", | ||||||||||
"@mdx-js/loader": "^3.1.0", | ||||||||||
"@mdx-js/react": "^3.1.0", | ||||||||||
"@neondatabase/serverless": "^0.9.4", | ||||||||||
"@next/mdx": "^14.2.22", | ||||||||||
"@neondatabase/serverless": "^0.9.5", | ||||||||||
"@next/mdx": "^15.1.4", | ||||||||||
"@prisma/client": "^5.17.0", | ||||||||||
"@radix-ui/react-dialog": "^1.1.4", | ||||||||||
"@radix-ui/react-dropdown-menu": "^2.1.4", | ||||||||||
"@radix-ui/react-popover": "^1.1.4", | ||||||||||
"@radix-ui/react-slot": "^1.1.1", | ||||||||||
"@radix-ui/react-tabs": "^1.1.2", | ||||||||||
"@types/mdx": "^2.0.13", | ||||||||||
"@vercel/analytics": "^1.3.1", | ||||||||||
"@vercel/speed-insights": "^1.0.12", | ||||||||||
"@vercel/analytics": "^1.4.1", | ||||||||||
"@vercel/speed-insights": "^1.1.0", | ||||||||||
"algoliasearch": "^4.24.0", | ||||||||||
"axios": "^1.7.4", | ||||||||||
"class-variance-authority": "^0.7.0", | ||||||||||
"axios": "^1.7.9", | ||||||||||
"class-variance-authority": "^0.7.1", | ||||||||||
"clsx": "^2.1.1", | ||||||||||
"framer-motion": "^11.15.0", | ||||||||||
"framer-motion": "^11.16.0", | ||||||||||
"gray-matter": "^4.0.3", | ||||||||||
"lucide-react": "^0.416.0", | ||||||||||
"lucide-react": "^0.469.0", | ||||||||||
"mermaid": "^11.0.2", | ||||||||||
"next": "^14.2.13", | ||||||||||
"next": "^15.1.4", | ||||||||||
"next-mdx-remote": "^5.0.0", | ||||||||||
"next-themes": "^0.3.0", | ||||||||||
"react": "^18.3.1", | ||||||||||
"react-dom": "^18.3.1", | ||||||||||
"next-themes": "^0.4.4", | ||||||||||
"react": "^19.0.0", | ||||||||||
"react-dom": "^19.0.0", | ||||||||||
Comment on lines
+40
to
+41
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Verify React 19 compatibility with your codebase. The upgrade to React 19 is a major version change that may introduce breaking changes. This version is currently in alpha/experimental stage and not recommended for production use. Consider downgrading to React 18: - "react": "^19.0.0",
- "react-dom": "^19.0.0",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0", 📝 Committable suggestion
Suggested change
|
||||||||||
"react-icons": "^5.4.0", | ||||||||||
"react-instantsearch-dom": "^6.40.4", | ||||||||||
"react-type-animation": "^3.2.0", | ||||||||||
"tailwind-merge": "^2.6.0", | ||||||||||
"tailwindcss-animate": "^1.0.7", | ||||||||||
"uuid": "^11.0.3", | ||||||||||
"uuid": "^11.0.4", | ||||||||||
"vaul": "^0.9.1", | ||||||||||
"zod": "^3.23.8" | ||||||||||
"zod": "^3.24.1" | ||||||||||
}, | ||||||||||
"devDependencies": { | ||||||||||
"@next/bundle-analyzer": "^14.2.7", | ||||||||||
"@tailwindcss/typography": "^0.5.15", | ||||||||||
"@types/node": "^20", | ||||||||||
"@types/react": "^18", | ||||||||||
"@types/react-dom": "^18", | ||||||||||
"@next/bundle-analyzer": "^15.1.4", | ||||||||||
"@tailwindcss/typography": "^0.5.16", | ||||||||||
"@types/node": "^22.10.5", | ||||||||||
"@types/react": "^19.0.3", | ||||||||||
"@types/react-dom": "^19.0.2", | ||||||||||
nirnejak marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||
"@types/tailwindcss": "^3.1.0", | ||||||||||
"autoprefixer": "^10.4.20", | ||||||||||
"eslint": "^8.57.1", | ||||||||||
"eslint-config-next": "14.2.5", | ||||||||||
"eslint-config-next": "^15.1.4", | ||||||||||
"eslint-config-prettier": "^9.1.0", | ||||||||||
"eslint-plugin-jsx-a11y": "^6.10.2", | ||||||||||
"eslint-plugin-prettier": "^5.2.1", | ||||||||||
"eslint-plugin-tailwindcss": "^3.17.5", | ||||||||||
"postcss": "^8", | ||||||||||
"prettier": "^3.4.2", | ||||||||||
"prettier-plugin-tailwindcss": "^0.6.9", | ||||||||||
"shiki": "^1.24.4", | ||||||||||
"shiki": "^1.26.1", | ||||||||||
"tailwindcss": "^3.4.17", | ||||||||||
"typescript": "^5.7.2" | ||||||||||
} | ||||||||||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -7,27 +7,34 @@ export default async function BlogPage() { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const posts = await getAllPosts() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<div className="mx-auto max-w-4xl px-4 py-36"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<div className="mx-auto max-w-5xl px-4 py-36"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<h1 className="mb-8 text-3xl font-bold tracking-tighter text-neutral-200 md:mb-20 md:text-5xl"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Blog Posts | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</h1> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<div className="-mx-3 flex flex-col"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<div className="-mx-3 flex flex-col gap-3"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{posts.map((post) => ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Link | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
href={`/blog/${post.slug}`} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
key={post.slug} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
className="rounded-lg p-4 transition-colors hover:bg-neutral-900 focus:bg-neutral-900" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
className="flex items-start gap-6 rounded-lg p-4 transition-colors hover:bg-neutral-900 focus:bg-neutral-900" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<p className="mb-1 text-xl font-semibold tracking-tight text-neutral-300 md:text-2xl"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{post.title} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</p> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<p className="mb-2.5 text-sm text-neutral-500 md:text-base"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{post.summary} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</p> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<p className="text-xs text-neutral-500 md:text-sm"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{formatDate(new Date(post.publishedAt))} • {post.views} views | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</p> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<div className="w-3/12 flex-1"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<p className="mb-1 mt-1.5 text-xs text-neutral-500 md:text-sm"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{formatDate(new Date(post.publishedAt))} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</p> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<p className="text-xs text-neutral-500 md:text-sm"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{post.views} views | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</p> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<div className="w-9/12"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<p className="mb-1 text-xl font-semibold tracking-tight text-neutral-300 md:text-2xl"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{post.title} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</p> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<p className="mb-2.5 text-sm text-neutral-500 md:text-base"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{post.summary} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</p> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Enhance accessibility of the new two-column layout The new two-column layout improves visual organization but needs accessibility considerations:
Apply these changes: - <div className="-mx-3 flex flex-col gap-3">
+ <div className="-mx-3 flex flex-col gap-3" role="list" aria-label="Blog posts">
{posts.map((post) => (
- <>
<Link
href={`/blog/${post.slug}`}
key={post.slug}
className="flex items-start gap-6 rounded-lg p-4 transition-colors hover:bg-neutral-900 focus:bg-neutral-900"
+ role="listitem"
> 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</Link> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
))} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -2,8 +2,13 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import React from "react" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import Link from "next/link" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { Button } from "@/components/ui/button" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import StreamLogo from "@/assets/stream.png" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import CodeRabbitLogo from "@/assets/coderabbit.svg" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import Image from "next/image" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const productHuntBadgeHtml = `<a href="https://www.producthunt.com/posts/dev-tools-academy?embed=true&utm_source=badge-featured&utm_medium=badge&utm_souce=badge-dev-tools-academy" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=493913&theme=light" alt="Dev Tools Academy - A special blog made for Developers. | Product Hunt" style="width: 250px; height: 54px;" width="250" height="54" /></a>` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const Hero: React.FC = () => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -25,12 +30,12 @@ const Hero: React.FC = () => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
))} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<div className="relative z-10 mx-auto flex max-w-5xl flex-col items-center justify-center px-4 text-center text-white"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<div className="mb-6 flex flex-col items-center justify-center gap-2 md:flex-row"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<div className="mb-5 flex items-center justify-center gap-2 md:gap-0"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<a | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
href="https://news.ycombinator.com/item?id=41223327#41246861" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
target="_blank" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
rel="noopener noreferrer" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
className="flex h-[40px] items-center gap-1.5 rounded-lg bg-[#ff7600] px-3 text-sm font-bold text-white shadow-md transition-colors duration-300 hover:bg-[#ff9933] hover:shadow-lg md:h-12" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
className="flex h-[40px] items-center gap-1.5 rounded-lg bg-[#ff7600] px-3 text-xs font-bold text-white transition-colors duration-300" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<svg | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
xmlns="http://www.w3.org/2000/svg" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -43,26 +48,45 @@ const Hero: React.FC = () => { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<span>Featured on Hacker News</span> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</a> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<div | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
className="scale-75 md:scale-90" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
className="sm:scale-75" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
dangerouslySetInnerHTML={{ __html: productHuntBadgeHtml }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+51
to
53
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Security: Replace dangerouslySetInnerHTML with Next.js Image component. Using Here's a safer implementation: -<div
- className="sm:scale-75"
- dangerouslySetInnerHTML={{ __html: productHuntBadgeHtml }}
-/>
+<Link
+ href="https://www.producthunt.com/posts/dev-tools-academy"
+ target="_blank"
+ rel="noopener noreferrer"
+ className="sm:scale-75"
+>
+ <Image
+ src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=493913&theme=light"
+ alt="Dev Tools Academy - A special blog made for Developers | Product Hunt"
+ width={250}
+ height={54}
+ priority
+ />
+</Link>
🧰 Tools🪛 Biome (1.9.4)[error] 52-52: Avoid passing content using the dangerouslySetInnerHTML prop. Setting content using code can expose users to cross-site scripting (XSS) attacks (lint/security/noDangerouslySetInnerHtml) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<h1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
className="mb-8 bg-gradient-to-r from-purple-400 to-pink-600 bg-clip-text text-5xl font-extrabold leading-tight text-transparent md:text-8xl" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
style={{ textShadow: "0 0 20px rgba(168, 85, 247, 0.5)" }} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<h1 className="mb-3 bg-gradient-to-r from-purple-400 to-pink-600 bg-clip-text text-5xl font-extrabold tracking-tight text-transparent md:mb-8 md:text-8xl md:leading-[1.1]"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
A special blog made for Developers. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</h1> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<p className="mb-12 max-w-3xl text-xl text-neutral-300 md:text-3xl"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Honest reviews to help you choose the right developer tool for your | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<p className="mb-8 max-w-3xl text-base text-neutral-300 md:mb-12 md:text-xl"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Honest reviews to help you choose the right developer tools for your | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SaaS. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</p> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Link href="/blog" passHref> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Button className="rounded-full bg-gradient-to-r from-purple-500 to-pink-500 px-10 py-6 text-xl font-bold text-white transition-all duration-300 hover:scale-105 hover:from-purple-600 hover:to-pink-600 hover:shadow-lg"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Button className="rounded-full bg-gradient-to-r from-purple-500 to-pink-500 px-6 py-3 text-sm font-bold text-neutral-100 transition-all duration-300 hover:scale-105 hover:from-purple-600 hover:to-pink-600 hover:shadow-lg md:px-10 md:py-6 md:text-xl"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Start Reading | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</Button> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</Link> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<div className="absolute bottom-8 left-1/2 -translate-x-1/2"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<p className="mb-4 text-center text-sm font-medium text-neutral-100 md:mb-6 md:text-base"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Current Sponsors: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</p> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<div className="flex items-center justify-center gap-4"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<a href={"https://www.coderabbit.ai?rel=devtoolsacademy.com"}> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Image | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
src={CodeRabbitLogo} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
alt="CodeRabbit" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
className="h-5 md:h-7" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</a> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<a href={"https://getstream.io?rel=devtoolsacademy.com"}> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Image | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
src={StreamLogo} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
alt="Stream" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
className="h-6 w-auto md:h-8" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</a> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+74
to
+87
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add missing Image props and secure external links. While the sponsors section is well-implemented, there are a few improvements needed:
-<a href={"https://www.coderabbit.ai?rel=devtoolsacademy.com"}>
+<a
+ href="https://www.coderabbit.ai?rel=devtoolsacademy.com"
+ target="_blank"
+ rel="noopener noreferrer"
+>
<Image
src={CodeRabbitLogo}
alt="CodeRabbit"
className="h-5 md:h-7"
+ width={120}
+ height={20}
/>
</a>
-<a href={"https://getstream.io?rel=devtoolsacademy.com"}>
+<a
+ href="https://getstream.io?rel=devtoolsacademy.com"
+ target="_blank"
+ rel="noopener noreferrer"
+>
<Image
src={StreamLogo}
alt="Stream"
className="h-6 w-auto md:h-8"
+ width={140}
+ height={24}
/>
</a> 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</section> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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.
Revert React 19 and ensure Next.js 15 compatibility
The upgrade to React 19 is premature as it's still in alpha/experimental stage. Additionally, Next.js 15 officially supports React 18, not React 19.
Apply this diff to revert to stable versions:
Also, remove the caret (^) from Next.js version to prevent automatic minor version updates that might introduce breaking changes during the v15 migration.
Also applies to: 39-40