feat: simplify public site architecture - #11
Conversation
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
|
Warning Review the following alerts detected in dependencies. According to your organization's Security Policy, it is recommended to resolve "Warn" alerts. Learn more about Socket for GitHub.
|
|
Warning Review limit reached
Next review available in: 42 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (1)
📝 WalkthroughWalkthroughThe PR repositions the site around company and blog content, removes careers, contact, and public product workflows, updates the database schema and migrations, rebuilds blog and homepage presentation, and reorganizes shared admin UI, media, navigation, styling, and project documentation. ChangesCompany site redesign and platform cleanup
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant Visitor
participant BlogPage
participant Database
participant BlogList
participant PostContent
Visitor->>BlogPage: Open blog list or post
BlogPage->>Database: Fetch published posts
Database-->>BlogPage: Return post data
BlogPage->>BlogList: Render searchable and paginated articles
BlogPage->>PostContent: Render article content
PostContent->>PostContent: Assign heading IDs
BlogPage-->>Visitor: Display article, TOC, and related posts
Possibly related PRs
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (3 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.
Actionable comments posted: 7
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/app/`(public)/blog/[slug]/page.tsx:
- Around line 44-77: Update getNodeText to concatenate child text without
inserting separators so heading text matches the slug source used by
PostContent. In getTableOfContents, restrict collected headings to levels 2 and
3 if those are the only anchor targets, while preserving existing slug and text
handling.
In `@src/app/`(public)/page.tsx:
- Around line 33-38: Update the homepage component’s main render to follow the
required order: HeroSection, FeaturedStorySection, LatestReleasesSection, then
RecognitionSection. Replace GoalsSection with the existing FeaturedStorySection
and add RecognitionSection while preserving latestPosts on
LatestReleasesSection.
In `@src/app/admin/`(protected)/blog/page.tsx:
- Around line 68-70: Replace the mojibake character in the recognition Badge
within the post rendering block with the lucide-react Star icon, adding the Star
import alongside the file’s existing imports. Keep the “Recognition” label and
badge variant unchanged, and render the icon using the project’s established
icon sizing and accessibility conventions.
In `@src/components/admin/actions/AdminDeleteButton.tsx`:
- Line 5: Update the Button import in AdminDeleteButton to reference the
generated admin UI button under the admin UI components, replacing the public UI
primitive while preserving the existing Button usage.
In `@src/components/admin/media/ImageUpload.tsx`:
- Around line 252-298: Update the crop modal container around sourceUrl to
expose dialog semantics with role="dialog" and aria-modal="true", and add an
Escape-key handler that invokes closeCropper while the modal is open. Ensure
keyboard focus is contained within the modal so users cannot tab into background
content, while preserving the existing Cancel control as a dismissal option.
In `@src/components/blog/UpdatesList.tsx`:
- Around line 218-226: Update the post-list derivation around featuredPosts,
allPosts, visiblePosts, and leadPost so the lead post rendered by
FeaturedArticle is excluded from downstream featured and all-article
collections. Preserve the existing filtering, slicing, and visibility behavior
for the remaining posts.
In `@src/components/layout/Footer.tsx`:
- Around line 164-170: Update the Image element in the Footer component to
replace the fixed h-[120px] class with h-auto, preserving the wordmark’s
intrinsic aspect ratio while retaining the existing responsive width classes.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 96c951fb-c65e-4b5b-9005-6bcad48b12a3
⛔ Files ignored due to path filters (3)
pnpm-lock.yamlis excluded by!**/pnpm-lock.yamlpublic/mascot/kody.svgis excluded by!**/*.svgpublic/mascot/kodysmile.svgis excluded by!**/*.svg
📒 Files selected for processing (71)
.env.exampleAGENTS.mdREADME.mdcomponents.jsondesign-qa.mdeslint.config.mjspackage.jsonsrc/app/(public)/about/page.tsxsrc/app/(public)/blog/[slug]/page.tsxsrc/app/(public)/blog/page.tsxsrc/app/(public)/careers/page.tsxsrc/app/(public)/contact/page.tsxsrc/app/(public)/page.tsxsrc/app/(public)/products/[slug]/page.tsxsrc/app/(public)/products/page.tsxsrc/app/(public)/team/page.tsxsrc/app/admin/(protected)/applications/page.tsxsrc/app/admin/(protected)/blog/[id]/page.tsxsrc/app/admin/(protected)/blog/new/page.tsxsrc/app/admin/(protected)/blog/page.tsxsrc/app/admin/(protected)/careers/[id]/page.tsxsrc/app/admin/(protected)/careers/new/page.tsxsrc/app/admin/(protected)/careers/page.tsxsrc/app/admin/(protected)/dashboard/page.tsxsrc/app/admin/(protected)/messages/page.tsxsrc/app/admin/(protected)/products/[id]/page.tsxsrc/app/admin/(protected)/products/new/page.tsxsrc/app/admin/(protected)/products/page.tsxsrc/app/admin/(protected)/team/[id]/page.tsxsrc/app/admin/(protected)/team/new/page.tsxsrc/app/admin/(protected)/team/page.tsxsrc/app/api/admin/applications/[id]/route.tssrc/app/api/admin/applications/route.tssrc/app/api/admin/careers/[id]/route.tssrc/app/api/admin/careers/route.tssrc/app/api/admin/messages/[id]/route.tssrc/app/api/admin/messages/route.tssrc/app/api/careers/apply/route.tssrc/app/api/contact/route.tssrc/app/globals.csssrc/app/sitemap.tssrc/components/admin/ApplicationsManager.tsxsrc/components/admin/MessagesManager.tsxsrc/components/admin/actions/AdminDeleteButton.tsxsrc/components/admin/editors/RichTextEditor.tsxsrc/components/admin/forms/ResourceForms.tsxsrc/components/admin/media/ImageUpload.tsxsrc/components/admin/tables/DataTable.tsxsrc/components/admin/ui/button.tsxsrc/components/blog/PostContent.tsxsrc/components/blog/UpdatesList.tsxsrc/components/careers/ApplicationForm.tsxsrc/components/contact/ContactForm.tsxsrc/components/layout/AdminSidebar.tsxsrc/components/layout/Footer.tsxsrc/components/layout/Navbar.tsxsrc/components/sections/AboutTeaser.tsxsrc/components/sections/FeaturedStorySection.tsxsrc/components/sections/GoalsSection.tsxsrc/components/sections/HeroSection.tsxsrc/components/sections/LatestReleasesSection.tsxsrc/components/sections/ProductsSection.tsxsrc/components/sections/RecognitionSection.tsxsrc/components/sections/TeamSection.tsxsrc/components/ui/icons.tsxsrc/db/migrations/0004_confused_chamber.sqlsrc/db/migrations/meta/0004_snapshot.jsonsrc/db/migrations/meta/_journal.jsonsrc/db/schema.tssrc/lib/email.tssrc/types/index.ts
💤 Files with no reviewable changes (29)
- src/components/sections/AboutTeaser.tsx
- src/app/api/contact/route.ts
- src/app/api/admin/applications/route.ts
- src/app/admin/(protected)/applications/page.tsx
- src/app/admin/(protected)/messages/page.tsx
- src/app/admin/(protected)/careers/[id]/page.tsx
- src/components/careers/ApplicationForm.tsx
- src/lib/email.ts
- src/app/admin/(protected)/careers/new/page.tsx
- src/app/api/admin/careers/route.ts
- src/app/api/admin/applications/[id]/route.ts
- src/components/sections/ProductsSection.tsx
- src/app/api/admin/messages/[id]/route.ts
- src/components/admin/MessagesManager.tsx
- src/app/api/careers/apply/route.ts
- src/components/sections/TeamSection.tsx
- src/app/(public)/careers/page.tsx
- src/app/admin/(protected)/careers/page.tsx
- src/app/(public)/products/[slug]/page.tsx
- src/app/(public)/about/page.tsx
- src/app/(public)/products/page.tsx
- src/components/contact/ContactForm.tsx
- src/components/admin/ApplicationsManager.tsx
- src/app/(public)/contact/page.tsx
- src/app/api/admin/messages/route.ts
- src/app/api/admin/careers/[id]/route.ts
- src/db/schema.ts
- src/types/index.ts
- .env.example
There was a problem hiding this comment.
Caution
Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.
Actionable comments posted: 7
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/app/`(public)/blog/[slug]/page.tsx:
- Around line 44-77: Update getNodeText to concatenate child text without
inserting separators so heading text matches the slug source used by
PostContent. In getTableOfContents, restrict collected headings to levels 2 and
3 if those are the only anchor targets, while preserving existing slug and text
handling.
In `@src/app/`(public)/page.tsx:
- Around line 33-38: Update the homepage component’s main render to follow the
required order: HeroSection, FeaturedStorySection, LatestReleasesSection, then
RecognitionSection. Replace GoalsSection with the existing FeaturedStorySection
and add RecognitionSection while preserving latestPosts on
LatestReleasesSection.
In `@src/app/admin/`(protected)/blog/page.tsx:
- Around line 68-70: Replace the mojibake character in the recognition Badge
within the post rendering block with the lucide-react Star icon, adding the Star
import alongside the file’s existing imports. Keep the “Recognition” label and
badge variant unchanged, and render the icon using the project’s established
icon sizing and accessibility conventions.
In `@src/components/admin/actions/AdminDeleteButton.tsx`:
- Line 5: Update the Button import in AdminDeleteButton to reference the
generated admin UI button under the admin UI components, replacing the public UI
primitive while preserving the existing Button usage.
In `@src/components/admin/media/ImageUpload.tsx`:
- Around line 252-298: Update the crop modal container around sourceUrl to
expose dialog semantics with role="dialog" and aria-modal="true", and add an
Escape-key handler that invokes closeCropper while the modal is open. Ensure
keyboard focus is contained within the modal so users cannot tab into background
content, while preserving the existing Cancel control as a dismissal option.
In `@src/components/blog/UpdatesList.tsx`:
- Around line 218-226: Update the post-list derivation around featuredPosts,
allPosts, visiblePosts, and leadPost so the lead post rendered by
FeaturedArticle is excluded from downstream featured and all-article
collections. Preserve the existing filtering, slicing, and visibility behavior
for the remaining posts.
In `@src/components/layout/Footer.tsx`:
- Around line 164-170: Update the Image element in the Footer component to
replace the fixed h-[120px] class with h-auto, preserving the wordmark’s
intrinsic aspect ratio while retaining the existing responsive width classes.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 96c951fb-c65e-4b5b-9005-6bcad48b12a3
⛔ Files ignored due to path filters (3)
pnpm-lock.yamlis excluded by!**/pnpm-lock.yamlpublic/mascot/kody.svgis excluded by!**/*.svgpublic/mascot/kodysmile.svgis excluded by!**/*.svg
📒 Files selected for processing (71)
.env.exampleAGENTS.mdREADME.mdcomponents.jsondesign-qa.mdeslint.config.mjspackage.jsonsrc/app/(public)/about/page.tsxsrc/app/(public)/blog/[slug]/page.tsxsrc/app/(public)/blog/page.tsxsrc/app/(public)/careers/page.tsxsrc/app/(public)/contact/page.tsxsrc/app/(public)/page.tsxsrc/app/(public)/products/[slug]/page.tsxsrc/app/(public)/products/page.tsxsrc/app/(public)/team/page.tsxsrc/app/admin/(protected)/applications/page.tsxsrc/app/admin/(protected)/blog/[id]/page.tsxsrc/app/admin/(protected)/blog/new/page.tsxsrc/app/admin/(protected)/blog/page.tsxsrc/app/admin/(protected)/careers/[id]/page.tsxsrc/app/admin/(protected)/careers/new/page.tsxsrc/app/admin/(protected)/careers/page.tsxsrc/app/admin/(protected)/dashboard/page.tsxsrc/app/admin/(protected)/messages/page.tsxsrc/app/admin/(protected)/products/[id]/page.tsxsrc/app/admin/(protected)/products/new/page.tsxsrc/app/admin/(protected)/products/page.tsxsrc/app/admin/(protected)/team/[id]/page.tsxsrc/app/admin/(protected)/team/new/page.tsxsrc/app/admin/(protected)/team/page.tsxsrc/app/api/admin/applications/[id]/route.tssrc/app/api/admin/applications/route.tssrc/app/api/admin/careers/[id]/route.tssrc/app/api/admin/careers/route.tssrc/app/api/admin/messages/[id]/route.tssrc/app/api/admin/messages/route.tssrc/app/api/careers/apply/route.tssrc/app/api/contact/route.tssrc/app/globals.csssrc/app/sitemap.tssrc/components/admin/ApplicationsManager.tsxsrc/components/admin/MessagesManager.tsxsrc/components/admin/actions/AdminDeleteButton.tsxsrc/components/admin/editors/RichTextEditor.tsxsrc/components/admin/forms/ResourceForms.tsxsrc/components/admin/media/ImageUpload.tsxsrc/components/admin/tables/DataTable.tsxsrc/components/admin/ui/button.tsxsrc/components/blog/PostContent.tsxsrc/components/blog/UpdatesList.tsxsrc/components/careers/ApplicationForm.tsxsrc/components/contact/ContactForm.tsxsrc/components/layout/AdminSidebar.tsxsrc/components/layout/Footer.tsxsrc/components/layout/Navbar.tsxsrc/components/sections/AboutTeaser.tsxsrc/components/sections/FeaturedStorySection.tsxsrc/components/sections/GoalsSection.tsxsrc/components/sections/HeroSection.tsxsrc/components/sections/LatestReleasesSection.tsxsrc/components/sections/ProductsSection.tsxsrc/components/sections/RecognitionSection.tsxsrc/components/sections/TeamSection.tsxsrc/components/ui/icons.tsxsrc/db/migrations/0004_confused_chamber.sqlsrc/db/migrations/meta/0004_snapshot.jsonsrc/db/migrations/meta/_journal.jsonsrc/db/schema.tssrc/lib/email.tssrc/types/index.ts
💤 Files with no reviewable changes (29)
- src/components/sections/AboutTeaser.tsx
- src/app/api/contact/route.ts
- src/app/api/admin/applications/route.ts
- src/app/admin/(protected)/applications/page.tsx
- src/app/admin/(protected)/messages/page.tsx
- src/app/admin/(protected)/careers/[id]/page.tsx
- src/components/careers/ApplicationForm.tsx
- src/lib/email.ts
- src/app/admin/(protected)/careers/new/page.tsx
- src/app/api/admin/careers/route.ts
- src/app/api/admin/applications/[id]/route.ts
- src/components/sections/ProductsSection.tsx
- src/app/api/admin/messages/[id]/route.ts
- src/components/admin/MessagesManager.tsx
- src/app/api/careers/apply/route.ts
- src/components/sections/TeamSection.tsx
- src/app/(public)/careers/page.tsx
- src/app/admin/(protected)/careers/page.tsx
- src/app/(public)/products/[slug]/page.tsx
- src/app/(public)/about/page.tsx
- src/app/(public)/products/page.tsx
- src/components/contact/ContactForm.tsx
- src/components/admin/ApplicationsManager.tsx
- src/app/(public)/contact/page.tsx
- src/app/api/admin/messages/route.ts
- src/app/api/admin/careers/[id]/route.ts
- src/db/schema.ts
- src/types/index.ts
- .env.example
🛑 Comments failed to post (7)
src/app/(public)/blog/[slug]/page.tsx (1)
44-77: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash fd -t f 'RichTextEditor.tsx' src/components/admin | xargs -I{} rg -nP -C3 'Heading|levels' {} rg -nP -C2 'StarterKit|heading' src/components/blog/PostContent.tsxRepository: coded-devs/website
Length of output: 1314
🏁 Script executed:
#!/bin/bash set -euo pipefail # Inspect the relevant page file and TOC usage. sed -n '1,180p' src/app/(public)/blog/[slug]/page.tsx printf '\n--- PostContent ---\n' sed -n '1,140p' src/components/blog/PostContent.tsx printf '\n--- RichTextEditor heading controls ---\n' sed -n '100,150p' src/components/admin/RichTextEditor.tsxRepository: coded-devs/website
Length of output: 209
🏁 Script executed:
#!/bin/bash set -euo pipefail sed -n '1,220p' src/lib/utils.ts printf '\n--- TOC consumer ---\n' rg -n "getTableOfContents|table of contents|toc" src/app/(public)/blog src/components -g '!**/*.map'Repository: coded-devs/website
Length of output: 1375
🏁 Script executed:
#!/bin/bash set -euo pipefail printf '%s\n' '--- page.tsx ---' sed -n '1,220p' 'src/app/(public)/blog/[slug]/page.tsx' printf '\n%s\n' '--- PostContent.tsx ---' sed -n '1,180p' 'src/components/blog/PostContent.tsx' printf '\n%s\n' '--- RichTextEditor.tsx ---' sed -n '100,160p' 'src/components/admin/RichTextEditor.tsx' printf '\n%s\n' '--- TOC references ---' rg -n "getTableOfContents|table of contents|toc" 'src/app/(public)/blog' 'src/components' -g '!**/*.map'Repository: coded-devs/website
Length of output: 10069
🏁 Script executed:
#!/bin/bash set -euo pipefail printf '%s\n' '--- page.tsx ---' sed -n '1,220p' 'src/app/(public)/blog/[slug]/page.tsx' printf '\n%s\n' '--- PostContent.tsx ---' sed -n '1,180p' 'src/components/blog/PostContent.tsx' printf '\n%s\n' '--- RichTextEditor.tsx ---' sed -n '100,170p' 'src/components/admin/RichTextEditor.tsx' printf '\n%s\n' '--- heading-related usage ---' rg -n 'toggleHeading\\(|heading\\s*[:=]|heading' 'src/components/admin' 'src/components/blog' 'src/app/(public)/blog' -g '!**/*.map'Repository: coded-devs/website
Length of output: 10069
Align TOC slugs with
PostContent.getNodeTextinserts spaces between inline children, so a heading split across marks/nodes can produce a fragment that doesn’t match theidassigned inPostContent. Concatenate without separators here; if onlyh2/h3should be anchor targets, filter to those levels too.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/app/`(public)/blog/[slug]/page.tsx around lines 44 - 77, Update getNodeText to concatenate child text without inserting separators so heading text matches the slug source used by PostContent. In getTableOfContents, restrict collected headings to levels 2 and 3 if those are the only anchor targets, while preserving existing slug and text handling.src/app/(public)/page.tsx (1)
33-38: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash set -euo pipefail # Inspect the homepage file and nearby section components. printf '\n== page.tsx ==\n' cat -n src/app/'(public)'/page.tsx printf '\n== available public section files ==\n' git ls-files 'src/app/(public)/**/*.tsx' | sed 's#^`#-` #' printf '\n== search for section component usage ==\n' rg -n "HeroSection|GoalsSection|LatestReleasesSection|FeaturedStorySection|RecognitionSection" src/app/'(public)' -g '*.tsx'Repository: coded-devs/website
Length of output: 2131
🏁 Script executed:
#!/bin/bash set -euo pipefail # Read the relevant section components if they exist. for f in \ src/app/'(public)'/components/HeroSection.tsx \ src/app/'(public)'/components/GoalsSection.tsx \ src/app/'(public)'/components/LatestReleasesSection.tsx \ src/app/'(public)'/components/FeaturedStorySection.tsx \ src/app/'(public)'/components/RecognitionSection.tsx do if [ -f "$f" ]; then printf '\n== %s ==\n' "$f" cat -n "$f" fi doneRepository: coded-devs/website
Length of output: 156
🏁 Script executed:
#!/bin/bash set -euo pipefail printf '\n== section component search across repo ==\n' rg -n "export default function (FeaturedStorySection|RecognitionSection|GoalsSection)|function (FeaturedStorySection|RecognitionSection|GoalsSection)|const (FeaturedStorySection|RecognitionSection|GoalsSection)" src -g '*.tsx' -g '*.ts' printf '\n== files with matching names ==\n' fd -a 'FeaturedStorySection.tsx|RecognitionSection.tsx|GoalsSection.tsx' src printf '\n== inspect GoalsSection ==\n' if [ -f src/components/sections/GoalsSection.tsx ]; then cat -n src/components/sections/GoalsSection.tsx fiRepository: coded-devs/website
Length of output: 3287
Restore the homepage section order
src/app/(public)/page.tsxstill rendersHero → Goals → Latest Releases, but the public homepage contract isHero → Featured Story → Latest Releases → Recognition.FeaturedStorySectionandRecognitionSectionalready exist, so swap them in here or update the guideline if this redesign is intentional.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/app/`(public)/page.tsx around lines 33 - 38, Update the homepage component’s main render to follow the required order: HeroSection, FeaturedStorySection, LatestReleasesSection, then RecognitionSection. Replace GoalsSection with the existing FeaturedStorySection and add RecognitionSection while preserving latestPosts on LatestReleasesSection.Source: Coding guidelines
src/app/admin/(protected)/blog/page.tsx (1)
68-70: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Replace the mojibake character with a Lucide icon.
The
âcharacter appears to be mojibake from an encoding error (likely a corrupted⭐emoji). Furthermore, as per coding guidelines, emojis should never be used as UI icons. Please replace it with a standardlucide-reacticon instead.♻️ Proposed refactor
First, add the import at the top of the file:
import { Star } from "lucide-react";Then, update the badge:
- <Badge variant="default">â Recognition</Badge> + <Badge variant="default" className="gap-1"><Star className="size-3" /> Recognition</Badge>📝 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.{post.showInRecognition ? ( <Badge variant="default" className="gap-1"><Star className="size-3" /> Recognition</Badge> ) : null}🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/app/admin/`(protected)/blog/page.tsx around lines 68 - 70, Replace the mojibake character in the recognition Badge within the post rendering block with the lucide-react Star icon, adding the Star import alongside the file’s existing imports. Keep the “Recognition” label and badge variant unchanged, and render the icon using the project’s established icon sizing and accessibility conventions.Source: Coding guidelines
src/components/admin/actions/AdminDeleteButton.tsx (1)
5-5: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win
Use the admin UI button primitive instead of the public UI button.
As per coding guidelines, admin controls should use the generated shadcn/ui components under
src/components/admin/ui/. Please update the import to use the newly created admin button.♻️ Proposed refactor
-import Button from "`@/components/ui/Button`"; +import { Button } from "`@/components/admin/ui/button`";📝 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.import { Button } from "`@/components/admin/ui/button`";🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/components/admin/actions/AdminDeleteButton.tsx` at line 5, Update the Button import in AdminDeleteButton to reference the generated admin UI button under the admin UI components, replacing the public UI primitive while preserving the existing Button usage.Source: Coding guidelines
src/components/admin/media/ImageUpload.tsx (1)
252-298: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Crop modal lacks dialog semantics and keyboard dismissal.
The overlay at lines 252-298 is a plain
fixeddiv: norole="dialog"/aria-modal="true", no Escape-to-close handler, and no focus trap. Keyboard-only users can tab into background content behind the modal and have no non-mouse way to dismiss it.♿ Proposed fix: minimal dialog semantics + Escape handling
- {sourceUrl ? ( - <div className="fixed inset-0 z-[100] flex items-center justify-center bg-black/60 px-4 py-8"> + {sourceUrl ? ( + <div + role="dialog" + aria-modal="true" + aria-label="Crop image" + className="fixed inset-0 z-[100] flex items-center justify-center bg-black/60 px-4 py-8" + onKeyDown={(event) => { + if (event.key === "Escape") { + closeCropper(); + } + }} + >📝 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.{sourceUrl ? ( <div role="dialog" aria-modal="true" aria-label="Crop image" className="fixed inset-0 z-[100] flex items-center justify-center bg-black/60 px-4 py-8" onKeyDown={(event) => { if (event.key === "Escape") { closeCropper(); } }} > <div className="w-full max-w-2xl rounded-lg bg-white p-6 shadow-sm"> <div className="max-h-[70vh] overflow-auto"> <ReactCrop crop={crop} aspect={aspectRatio} onChange={(_, percentCrop) => setCrop(percentCrop)} onComplete={(pixelCrop) => setCompletedCrop(pixelCrop)} > <Image ref={imageRef} src={sourceUrl} alt="Crop selected upload" width={1200} height={800} unoptimized className="h-auto max-h-[60vh] w-auto max-w-full" onLoad={handleImageLoad} /> </ReactCrop> </div> {error ? ( <p className="mt-4 font-sans text-sm text-[`#DC2626`]">{error}</p> ) : null} <div className="mt-6 flex flex-wrap justify-end gap-3"> <Button type="button" variant="secondary" disabled={isUploading} onClick={closeCropper} > Cancel </Button> <Button type="button" disabled={isUploading} onClick={handleApplyCrop} > {isUploading ? "Uploading..." : "Apply Crop"} </Button> </div> </div> </div> ) : null}🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/components/admin/media/ImageUpload.tsx` around lines 252 - 298, Update the crop modal container around sourceUrl to expose dialog semantics with role="dialog" and aria-modal="true", and add an Escape-key handler that invokes closeCropper while the modal is open. Ensure keyboard focus is contained within the modal so users cannot tab into background content, while preserving the existing Cancel control as a dismissal option.src/components/blog/UpdatesList.tsx (1)
218-226: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Lead post is rendered multiple times.
leadPost = posts[0]renders asFeaturedArticle, and becausefeaturedPosts = filteredPosts.slice(0, 3)(andallPosts = filteredPosts) for the default "All" filter,posts[0]also appears as the first "Featured" card and again under "All articles". Consider excluding the lead post from the downstream lists to avoid duplicate presentation.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/components/blog/UpdatesList.tsx` around lines 218 - 226, Update the post-list derivation around featuredPosts, allPosts, visiblePosts, and leadPost so the lead post rendered by FeaturedArticle is excluded from downstream featured and all-article collections. Preserve the existing filtering, slicing, and visibility behavior for the remaining posts.src/components/layout/Footer.tsx (1)
164-170: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Correct the image height to preserve its intrinsic aspect ratio.
The
h-[120px]class will distort the wordmark's aspect ratio, conflicting with the190x72natural dimensions and thew-[135px]mobile width. Although the design QA notes claim this fixed-height utility was corrected, it appears to still be present. Useh-autoto allow the image to scale proportionally with its width.🎨 Proposed fix
<Image src="/logos/wordmark.svg" alt="CodedDevs Technology LTD" width={190} height={72} - className="h-[120px] w-[135px] brightness-0 invert md:w-[190px]" + className="h-auto w-[135px] brightness-0 invert md:w-[190px]" />📝 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.<Image src="/logos/wordmark.svg" alt="CodedDevs Technology LTD" width={190} height={72} className="h-auto w-[135px] brightness-0 invert md:w-[190px]" />🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/components/layout/Footer.tsx` around lines 164 - 170, Update the Image element in the Footer component to replace the fixed h-[120px] class with h-auto, preserving the wordmark’s intrinsic aspect ratio while retaining the existing responsive width classes.
What changed
Why
Keeps the company website focused around Home, Blog, and Team while products are introduced through company blog updates and external CTAs.
Validation
Summary by CodeRabbit
New Features
Enhancements