Skip to content

Cse 403#103

Merged
RamuuXfree merged 8 commits into
mainfrom
cse-403
Jul 14, 2026
Merged

Cse 403#103
RamuuXfree merged 8 commits into
mainfrom
cse-403

Conversation

@RamuuXfree

@RamuuXfree RamuuXfree commented Jul 14, 2026

Copy link
Copy Markdown
Collaborator

Pull Request

Summary

This PR resolves the merge conflicts between origin/main and the branch cse-403. The conflicts were present in app/rgpv/page.tsx, components/university/premium-animated-boy.tsx, components/university/university-flow-banner.tsx, and components/university/university-hero.tsx. All conflicts have been resolved by adopting the typing enhancements, modern animations, and dashboard layout structure from the main branch.


Related Issue

Closes #


Type of Change

  • Feature
  • Bug Fix
  • Documentation
  • Refactor
  • Performance Improvement
  • CI / Build
  • Other

What Changed?

Merged origin/main into the current branch and resolved all conflicts:

  • In page.tsx, kept the DashboardPage component implementation and removed the obsolete QuickAccess import/reference.
  • In premium-animated-boy.tsx, adopted proper TypeScript interfaces and Framer Motion types from origin/main (e.g., import("framer-motion").Transition and Variants) to replace fallback any casts.
  • In university-flow-banner.tsx, kept the premium minimal wind wave animation and maintained the cartoon wave animation changes (removed ground arc) as per the updated layout.
  • In university-hero.tsx, kept the smoother stagger duration and premium entrance scale transition.

Screenshots (UI Changes Only)

N/A (Conflict resolution, styling/animation updates are preserved from main).


Testing

Ran local verification checks on the resolved merge:

  • npm run typecheck passes successfully.
  • npm run lint passes successfully.

Checklist

Before requesting a review, confirm the following:

  • My branch is up to date with the latest main.
  • My code follows the project's coding standards.
  • I have formatted the modified files (npx prettier --write <file>).
  • npm run format:check passes.
  • npm run lint passes.
  • npm run typecheck passes.
  • npm run build passes.
  • I have updated documentation if required.
  • I have tested my changes locally.
  • This Pull Request focuses on a single feature or fix.

Additional Notes

Linter and TypeScript build checks have verified complete type safety and code consistency across all modified files.

@RamuuXfree RamuuXfree requested a review from imuniqueshiv as a code owner July 14, 2026 16:57
@vercel

vercel Bot commented Jul 14, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
hyper-learning-tech Ready Ready Preview, Comment Jul 14, 2026 5:19pm

@coderabbitai

coderabbitai Bot commented Jul 14, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@RamuuXfree, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 28 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

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 configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 83260de3-c2c8-409e-8354-37bf06311a6e

📥 Commits

Reviewing files that changed from the base of the PR and between 34afdfb and 19b727c.

📒 Files selected for processing (7)
  • components/university/university-flow-banner.tsx
  • content/rgpv/cse/semester-4/cs-403/pyqs.json
  • content/rgpv/cse/semester-4/cs-403/syllabus.json
  • content/rgpv/cse/semester-4/cs-404/pyqs.json
  • content/rgpv/cse/semester-4/cs-404/syllabus.json
  • content/rgpv/cse/semester-4/cs-405/pyqs.json
  • content/rgpv/cse/semester-4/cs-405/syllabus.json
📝 Walkthrough

Walkthrough

Changes

CGPA career insights

Layer / File(s) Summary
Tiered calculator results and insights
app/(public)/cgpa-calculator/page.tsx
Adds optional career-tier selection, tier-specific pro tips, new eligibility states, redesigned success results, and revised calculator styling.

University hero flow animation

Layer / File(s) Summary
Hero and animated flow integration
components/university/university-hero.tsx, components/university/university-flow-banner.tsx
Rebuilds the university hero around feature cards and adds an animated step-flow banner with active-step scrolling, jump transitions, progress rendering, and final-step effects.
Kinematic character animation
components/university/premium-animated-boy.tsx
Adds a reusable animated SVG character with state-based motion, forward-kinematics limb paths, accessories, and happy-state artwork.

Privacy interactive path

Layer / File(s) Summary
Tracker jump synchronization
app/(public)/privacy/InteractivePath.tsx, app/(public)/privacy/page.tsx
Clamps path progress, locks reverse-jump positioning, adjusts jump physics, drives running-man effects from jump state, and removes the pendulum animation styling while tightening CTA geometry.

RGPV academic datasets

Layer / File(s) Summary
Question paper datasets
content/rgpv/**/pyqs.json
Populates multiple RGPV exam-paper datasets with metadata, exams, questions, sub-questions, units, types, and optional image references.
Structured syllabus schemas
content/rgpv/**/syllabus.json
Converts syllabus modules and string topics into stable, ordered topic objects with module question mappings and expanded subject metadata.

Public page and utility updates

Layer / File(s) Summary
Creators and landing-page presentation
app/(public)/creators/page.tsx, features/landing/ai-demo.tsx, features/landing/faq.tsx
Restyles the creators cards and CTA, updates icon imports, changes feature-list states and scrollbar handling, and redesigns the FAQ support CTA.
Utility routes and copy
app/api/heartbeat/route.ts, app/dashboard/page.tsx, app/rgpv/page.tsx, components/contact/ContactSection.tsx
Adds GET and POST heartbeat responses, updates dashboard and contact copy, and adds layered RGPV page backgrounds behind foreground content.

Estimated code review effort: 5 (Critical) | ~120 minutes

Sequence Diagram(s)

sequenceDiagram
  participant UniversityFlowBanner
  participant ActiveStepMeasurement
  participant PremiumAnimatedBoy
  UniversityFlowBanner->>ActiveStepMeasurement: measure active step and calculate targetX
  ActiveStepMeasurement-->>UniversityFlowBanner: return centered step position
  UniversityFlowBanner->>PremiumAnimatedBoy: update position and jump state
  PremiumAnimatedBoy-->>UniversityFlowBanner: complete jump animation
  UniversityFlowBanner->>UniversityFlowBanner: render final-step completion effect
Loading

Possibly related PRs

Suggested reviewers: imuniqueshiv, nitinmohan18

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title is related to the changeset because CSE 403 question-paper content is included, though it is narrower than the full PR.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cse-403

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@RamuuXfree RamuuXfree merged commit e2eaa5e into main Jul 14, 2026
4 of 5 checks passed
@github-actions

Copy link
Copy Markdown

🎉 Congratulations @RamuuXfree!

Thank you for contributing to HyperLearningTech.

Your pull request has been successfully merged into main.

📦 Merge Summary

  • PR: Cse 403 #103 - Cse 403
  • Status: ✅ Merged
  • Repository: HyperLearningTech

🚀 Keep Contributing

  • Follow the CONTRIBUTING.md guidelines.
  • Keep each Pull Request focused on a single feature or fix.
  • Run formatting, linting, type checking, and a production build before opening a PR.

Thank you for helping make HyperLearningTech better.

Happy Coding! 🚀

@RamuuXfree RamuuXfree deleted the cse-403 branch July 14, 2026 17:21

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 13

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
app/(public)/cgpa-calculator/page.tsx (1)

555-585: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Tier toggle buttons lack focus indication and selection state for assistive tech.

The button className (Line 560) has no focus/focus-visible ring classes — unlike the numeric inputs elsewhere in this file which do (e.g. Line 167 focus:ring-4 focus:ring-blue-500/20) — so keyboard users get no visible focus indicator when tabbing through tiers. The buttons also don't expose aria-pressed to announce the selected tier to screen readers.

♿ Proposed fix
                       <button
                         key={tier.id}
+                        aria-pressed={radarTier === tier.id}
                         onClick={() =>
                           setRadarTier(radarTier === tier.id ? null : tier.id)
                         }
-                        className={`group flex items-center justify-between p-4 rounded-2xl text-left transition-all duration-300 ${
+                        className={`group flex items-center justify-between p-4 rounded-2xl text-left transition-all duration-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-indigo-500 focus-visible:ring-offset-2 ${
                           radarTier === tier.id
🤖 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 `@app/`(public)/cgpa-calculator/page.tsx around lines 555 - 585, Update the
tier toggle buttons in the radarTier mapping to add a visible focus or
focus-visible ring and suitable focus styling to their className, then add
aria-pressed reflecting whether radarTier equals tier.id. Preserve the existing
toggle behavior and visual selected-state classes.
content/rgpv/csit/semester-3/csit-302/syllabus.json (1)

2-15: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

subject block is using pyqs metadata in a syllabus file.

gradingSystem, maxMarks, time, and commonInstructions match content/rgpv/csit/semester-3/csit-302/pyqs.json, while the sibling syllabus files use curriculum fields like university, scheme, and branch. Replace this subject block with the syllabus schema.

🤖 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 `@content/rgpv/csit/semester-3/csit-302/syllabus.json` around lines 2 - 15,
Replace the subject metadata in the syllabus file with the established syllabus
schema used by sibling syllabus files, removing pyqs-specific fields such as
gradingSystem, maxMarks, time, and commonInstructions and using the appropriate
curriculum fields like university, scheme, and branch while preserving the
course identity fields.
🧹 Nitpick comments (3)
app/(public)/cgpa-calculator/page.tsx (1)

356-415: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Duplicate success-state markup — extract a shared component.

The result <= 0 and result <= currentCgpa blocks are structurally identical (glow, icon badge, pill heading, big number, description), differing only in text/value. Extracting a small SuccessResultCard reduces duplication and future drift risk.

♻️ Proposed extraction
function SuccessResultCard({
  badgeLabel,
  value,
  description,
}: {
  badgeLabel: string;
  value: string;
  description: React.ReactNode;
}) {
  return (
    <div className="space-y-6 flex flex-col items-center">
      <div className="relative">
        <div className="absolute inset-0 bg-emerald-500/20 blur-xl rounded-full" />
        <div className="relative w-24 h-24 mx-auto rounded-full bg-emerald-50 dark:bg-emerald-500/10 flex items-center justify-center border-2 border-emerald-400 dark:border-emerald-400/50 shadow-[0_0_30px_rgba(16,185,129,0.3)]">
          <CheckCircle2 className="w-12 h-12 text-emerald-600 dark:text-emerald-400 drop-shadow-md" />
        </div>
      </div>
      <div className="inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-emerald-50 dark:bg-emerald-500/10 border border-emerald-200 dark:border-emerald-500/30">
        <h3 className="text-[13px] font-bold uppercase tracking-widest text-emerald-700 dark:text-emerald-400">
          {badgeLabel}
        </h3>
      </div>
      <div className="text-[80px] md:text-[100px] leading-none font-black text-transparent bg-clip-text bg-gradient-to-b from-emerald-500 to-emerald-700 dark:from-emerald-300 dark:to-emerald-600 tracking-tighter drop-shadow-[0_0_40px_rgba(16,185,129,0.3)]">
        {value}
      </div>
      <p className="text-[16px] font-medium leading-relaxed text-slate-600 dark:text-slate-300 max-w-sm mx-auto">
        {description}
      </p>
    </div>
  );
}
- ) : result <= 0 ? (
-   <div className="space-y-6 flex flex-col items-center">...</div>
- ) : result <= parseFloat(currentCgpa) ? (
-   <div className="space-y-6 flex flex-col items-center">...</div>
+ ) : result <= 0 ? (
+   <SuccessResultCard badgeLabel="Goal Surpassed" value="0.00" description={<>Your current performance is so strong ...</>} />
+ ) : result <= parseFloat(currentCgpa) ? (
+   <SuccessResultCard badgeLabel="Target Secured" value={result.toFixed(2)} description={<>You are currently pacing ahead ...</>} />
🤖 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 `@app/`(public)/cgpa-calculator/page.tsx around lines 356 - 415, Extract the
duplicated success-state markup from the result <= 0 and result <=
parseFloat(currentCgpa) branches into a shared SuccessResultCard component.
Parameterize the badge label, displayed value, and description as props,
including React.ReactNode for descriptions, then replace both branches with the
component while preserving their existing text and formatting.
components/university/premium-animated-boy.tsx (2)

266-300: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Add aria-hidden to the decorative SVG character.

This is a purely decorative, non-lucide SVG figure (no text alternative possible), so screen readers shouldn't traverse its many <path>/<circle>/<g> nodes.

♿ Proposed fix
     <motion.div
       className="w-20 h-20 sm:w-28 sm:h-28 overflow-visible relative"
       initial={false}
       animate={currentVariant}
+      aria-hidden="true"
       variants={{
🤖 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 `@components/university/premium-animated-boy.tsx` around lines 266 - 300, Add
aria-hidden="true" to the decorative motion.svg element inside the animated
character component, ensuring screen readers skip the SVG and all nested path,
circle, and group nodes.

61-173: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Memoize the kinematics-derived variants; they're recomputed on every render for no reason.

getFK/getLimbPath/getEndObj/buildLimbVars/buildEndVars take only the static per-limb constant arrays (fl_h_ra, L_THIGH, etc. — none of which depend on props) plus the shared t transition object. The variant shape (paths, rotations, endpoints) never changes across renders; only t.transition depends on isJumping/jumpType. Right now, every one of the 8 call sites (Lines 361, 377, 418, 434, 676, 692, 727, 743) re-runs the full trig pipeline on every render — including the internal stride tick that fires every 450ms indefinitely while running (Lines 40-46), and any re-render forced by the parent (UniversityFlowBanner re-renders on targetX/resize updates too, since this component isn't memoized). None of that recomputation changes the output unless isJumping/jumpType actually change.

Also note the _h (happy) keyframe arrays (e.g. fl_h_h, bl_h_h, fa_s_h, ba_s_h, Lines 196-198/213-215/226-227/238-239) are all length-2, but only index [0] is ever read in the happy branches of buildLimbVars/buildEndVars — worth a quick check on whether the second element was meant to drive a repeating happy-pose bounce (matching the torso's ht-based loop) or is just dead data.

⚡ Suggested pattern
-import React, { useState, useEffect } from "react";
+import React, { useState, useEffect, useMemo } from "react";
 ...
-export const PremiumAnimatedBoy = ({
+export const PremiumAnimatedBoy = React.memo(function PremiumAnimatedBoy({
   isJumping = false,
   ...
-}: {...}) => {
+}: {...}) {
   ...
-      variants={buildLimbVars(ba_s_ra, ba_e_ra, ba_s_rb, ba_e_rb, ba_s_j, ba_e_j, ba_s_rj, ba_e_rj, ba_s_h, ba_e_h, L_UPARM, L_FOREARM)}
+      variants={useMemo(
+        () => buildLimbVars(ba_s_ra, ba_e_ra, ba_s_rb, ba_e_rb, ba_s_j, ba_e_j, ba_s_rj, ba_e_rj, ba_s_h, ba_e_h, L_UPARM, L_FOREARM),
+        [t]
+      )}
   ...
-};
+});

(Repeat for the other 7 buildLimbVars/buildEndVars call sites, keyed on t.)

🤖 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 `@components/university/premium-animated-boy.tsx` around lines 61 - 173,
Memoize the eight variant-building call sites so the kinematics calculations are
reused across renders: wrap each buildLimbVars/buildEndVars result in useMemo
with all static limb arrays and lengths as dependencies, and include the shared
transition object t so variants refresh when isJumping or jumpType changes. Also
verify whether the second elements of the _h happy keyframe arrays are
intentionally unused; preserve the existing single-pose behavior unless the
animation requires consuming them.
🤖 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 `@app/`(public)/cgpa-calculator/page.tsx:
- Around line 680-822: Create a module-level CAREER_TIERS configuration
containing each tier’s id, label, cutoff, and tips, with a derived CareerTierId
literal type. Refactor the tier button list, cutoffs lookup, radarTier
state/handling, and tips selection around this single configuration, removing
duplicated tier-id maps and render-time tip recreation while preserving default
tips and existing display behavior.

In `@app/`(public)/privacy/InteractivePath.tsx:
- Line 16: Update the reverse-jump timing around jumpBackEndTimeRef and
jumpStyleX so the anchor remains locked until the reverse animation fully
completes, using the same duration boundary as the animation rather than the
shorter 850ms window. Also gate the triggerJump() condition on the lock state
and the animation-driving value instead of allowing clampedVal changes during
the lock to retrigger the jump.

In `@components/university/university-flow-banner.tsx`:
- Around line 275-337: Add a dark-mode border color utility to the mobile
separator div within the steps map, preserving its existing light-mode
border-slate-300 styling and matching the component’s established dark divider
color pattern.

In `@content/rgpv/cscy/semester-4/cy-402/pyqs.json`:
- Around line 8-17: Update the subject blocks in
content/rgpv/cscy/semester-4/cy-402/pyqs.json (lines 8-17) and
content/rgpv/cscy/semester-4/cy-405/pyqs.json (lines 8-16) to include semester,
maxMarks, time, and commonInstructions, using values from the corresponding
actual exam papers and matching the complete shape in cs-302/pyqs.json.

In `@content/rgpv/cscy/semester-4/cy-405/pyqs.json`:
- Around line 380-391: Correct the typo in the q5a question text by replacing
“closer” with “closure,” leaving the rest of the question unchanged.

In `@content/rgpv/cse/semester-3/cs-302/pyqs.json`:
- Around line 328-340: Normalize the multi-unit "unit" fields for q8 and the
corresponding entries at the referenced occurrences by removing duplicate unit
names and using the slash-delimited convention used by sibling subject files.
Preserve the complete set of units represented by each question while ensuring
each value remains concise enough for the single-pill display.
- Around line 274-283: Update the affected subquestions q5b, q7b, q6a, q6b, and
q8b to replace the flat hasImage/imagePath/imageAlt fields with an attachments
array containing an attachment object with id, type, path, title, alt, caption,
and aiContext. Preserve each image’s existing path and descriptive text while
using the schema expected by SubQuestion.

In `@content/rgpv/cse/semester-4/bt-401/pyqs.json`:
- Around line 692-710: Verify the source paper and correct the garbled text of
sub-question q1b in the Q.1 entry, replacing “Find f(g) from the given table”
with the accurately transcribed numeric argument while preserving the existing
interpolation metadata.

In `@content/rgpv/cse/semester-4/cs-403/pyqs.json`:
- Around line 817-841: Replace the June 2025 Q1 entry in the CS-403 PYQs data
with the correct CS-403 question set for that paper, ensuring its questions and
metadata match the intended subject rather than the current Operating Systems
content. Preserve the existing June 2025 exam structure and update only the
mismatched Q1 data.

In `@content/rgpv/cse/semester-4/cs-404/syllabus.json`:
- Around line 13-78: Restore real per-module numeric hour values in
content/rgpv/cse/semester-4/cs-404/syllabus.json lines 13-78 and its modules 2-6
at lines 79-403, and in content/rgpv/cse/semester-4/cs-405/syllabus.json lines
13-50 and its modules 2-5 at lines 51-253. Preserve the required numeric
Module.hours contract used by the syllabus page; only make hours optional and
update the Module type if these values are intentionally unknown.

In `@content/rgpv/csit/semester-3/csit-302/pyqs.json`:
- Around line 279-282: Update the affected diagram question entries in pyqs.json
to use the runtime’s attachments[] schema, with each image resolved under the
subject’s diagrams directory and the existing alt text preserved. Apply the same
conversion to the entries near the referenced ranges, and remove the legacy
hasImage/imagePath/imageAlt fields unless the loader is explicitly updated to
map them.

In `@features/landing/ai-demo.tsx`:
- Around line 186-189: In the feature card className within the landing page
component, replace the deprecated flex-shrink-0 and flex-shrink utilities with
their Tailwind v4 shrink equivalents, preserving the existing responsive sizing
and layout behavior.

In `@features/landing/faq.tsx`:
- Around line 196-207: Update the Contact Support and Get Started Free elements
in the FAQ section to apply their existing button styles directly to each Link,
removing the nested button elements while preserving their destinations, labels,
icons, and interaction states.

---

Outside diff comments:
In `@app/`(public)/cgpa-calculator/page.tsx:
- Around line 555-585: Update the tier toggle buttons in the radarTier mapping
to add a visible focus or focus-visible ring and suitable focus styling to their
className, then add aria-pressed reflecting whether radarTier equals tier.id.
Preserve the existing toggle behavior and visual selected-state classes.

In `@content/rgpv/csit/semester-3/csit-302/syllabus.json`:
- Around line 2-15: Replace the subject metadata in the syllabus file with the
established syllabus schema used by sibling syllabus files, removing
pyqs-specific fields such as gradingSystem, maxMarks, time, and
commonInstructions and using the appropriate curriculum fields like university,
scheme, and branch while preserving the course identity fields.

---

Nitpick comments:
In `@app/`(public)/cgpa-calculator/page.tsx:
- Around line 356-415: Extract the duplicated success-state markup from the
result <= 0 and result <= parseFloat(currentCgpa) branches into a shared
SuccessResultCard component. Parameterize the badge label, displayed value, and
description as props, including React.ReactNode for descriptions, then replace
both branches with the component while preserving their existing text and
formatting.

In `@components/university/premium-animated-boy.tsx`:
- Around line 266-300: Add aria-hidden="true" to the decorative motion.svg
element inside the animated character component, ensuring screen readers skip
the SVG and all nested path, circle, and group nodes.
- Around line 61-173: Memoize the eight variant-building call sites so the
kinematics calculations are reused across renders: wrap each
buildLimbVars/buildEndVars result in useMemo with all static limb arrays and
lengths as dependencies, and include the shared transition object t so variants
refresh when isJumping or jumpType changes. Also verify whether the second
elements of the _h happy keyframe arrays are intentionally unused; preserve the
existing single-pose behavior unless the animation requires consuming them.
🪄 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: 83260de3-c2c8-409e-8354-37bf06311a6e

📥 Commits

Reviewing files that changed from the base of the PR and between 52567d5 and 34afdfb.

📒 Files selected for processing (31)
  • app/(public)/cgpa-calculator/page.tsx
  • app/(public)/creators/page.tsx
  • app/(public)/privacy/InteractivePath.tsx
  • app/(public)/privacy/page.tsx
  • app/api/heartbeat/route.ts
  • app/dashboard/page.tsx
  • app/rgpv/page.tsx
  • components/contact/ContactSection.tsx
  • components/university/premium-animated-boy.tsx
  • components/university/university-flow-banner.tsx
  • components/university/university-hero.tsx
  • content/rgpv/aiml/semester-3/al-302/pyqs.json
  • content/rgpv/aiml/semester-4/al-401/pyqs.json
  • content/rgpv/cscy/semester-4/cy-402/pyqs.json
  • content/rgpv/cscy/semester-4/cy-405/pyqs.json
  • content/rgpv/cse/semester-3/cs-302/pyqs.json
  • content/rgpv/cse/semester-3/cs-302/syllabus.json
  • content/rgpv/cse/semester-4/bt-401/pyqs.json
  • content/rgpv/cse/semester-4/bt-401/syllabus.json
  • content/rgpv/cse/semester-4/cs-402/pyqs.json
  • content/rgpv/cse/semester-4/cs-402/syllabus.json
  • content/rgpv/cse/semester-4/cs-403/pyqs.json
  • content/rgpv/cse/semester-4/cs-403/syllabus.json
  • content/rgpv/cse/semester-4/cs-404/pyqs.json
  • content/rgpv/cse/semester-4/cs-404/syllabus.json
  • content/rgpv/cse/semester-4/cs-405/pyqs.json
  • content/rgpv/cse/semester-4/cs-405/syllabus.json
  • content/rgpv/csit/semester-3/csit-302/pyqs.json
  • content/rgpv/csit/semester-3/csit-302/syllabus.json
  • features/landing/ai-demo.tsx
  • features/landing/faq.tsx

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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: 13

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
app/(public)/cgpa-calculator/page.tsx (1)

555-585: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Tier toggle buttons lack focus indication and selection state for assistive tech.

The button className (Line 560) has no focus/focus-visible ring classes — unlike the numeric inputs elsewhere in this file which do (e.g. Line 167 focus:ring-4 focus:ring-blue-500/20) — so keyboard users get no visible focus indicator when tabbing through tiers. The buttons also don't expose aria-pressed to announce the selected tier to screen readers.

♿ Proposed fix
                       <button
                         key={tier.id}
+                        aria-pressed={radarTier === tier.id}
                         onClick={() =>
                           setRadarTier(radarTier === tier.id ? null : tier.id)
                         }
-                        className={`group flex items-center justify-between p-4 rounded-2xl text-left transition-all duration-300 ${
+                        className={`group flex items-center justify-between p-4 rounded-2xl text-left transition-all duration-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-indigo-500 focus-visible:ring-offset-2 ${
                           radarTier === tier.id
🤖 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 `@app/`(public)/cgpa-calculator/page.tsx around lines 555 - 585, Update the
tier toggle buttons in the radarTier mapping to add a visible focus or
focus-visible ring and suitable focus styling to their className, then add
aria-pressed reflecting whether radarTier equals tier.id. Preserve the existing
toggle behavior and visual selected-state classes.
content/rgpv/csit/semester-3/csit-302/syllabus.json (1)

2-15: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

subject block is using pyqs metadata in a syllabus file.

gradingSystem, maxMarks, time, and commonInstructions match content/rgpv/csit/semester-3/csit-302/pyqs.json, while the sibling syllabus files use curriculum fields like university, scheme, and branch. Replace this subject block with the syllabus schema.

🤖 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 `@content/rgpv/csit/semester-3/csit-302/syllabus.json` around lines 2 - 15,
Replace the subject metadata in the syllabus file with the established syllabus
schema used by sibling syllabus files, removing pyqs-specific fields such as
gradingSystem, maxMarks, time, and commonInstructions and using the appropriate
curriculum fields like university, scheme, and branch while preserving the
course identity fields.
🧹 Nitpick comments (3)
app/(public)/cgpa-calculator/page.tsx (1)

356-415: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Duplicate success-state markup — extract a shared component.

The result <= 0 and result <= currentCgpa blocks are structurally identical (glow, icon badge, pill heading, big number, description), differing only in text/value. Extracting a small SuccessResultCard reduces duplication and future drift risk.

♻️ Proposed extraction
function SuccessResultCard({
  badgeLabel,
  value,
  description,
}: {
  badgeLabel: string;
  value: string;
  description: React.ReactNode;
}) {
  return (
    <div className="space-y-6 flex flex-col items-center">
      <div className="relative">
        <div className="absolute inset-0 bg-emerald-500/20 blur-xl rounded-full" />
        <div className="relative w-24 h-24 mx-auto rounded-full bg-emerald-50 dark:bg-emerald-500/10 flex items-center justify-center border-2 border-emerald-400 dark:border-emerald-400/50 shadow-[0_0_30px_rgba(16,185,129,0.3)]">
          <CheckCircle2 className="w-12 h-12 text-emerald-600 dark:text-emerald-400 drop-shadow-md" />
        </div>
      </div>
      <div className="inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-emerald-50 dark:bg-emerald-500/10 border border-emerald-200 dark:border-emerald-500/30">
        <h3 className="text-[13px] font-bold uppercase tracking-widest text-emerald-700 dark:text-emerald-400">
          {badgeLabel}
        </h3>
      </div>
      <div className="text-[80px] md:text-[100px] leading-none font-black text-transparent bg-clip-text bg-gradient-to-b from-emerald-500 to-emerald-700 dark:from-emerald-300 dark:to-emerald-600 tracking-tighter drop-shadow-[0_0_40px_rgba(16,185,129,0.3)]">
        {value}
      </div>
      <p className="text-[16px] font-medium leading-relaxed text-slate-600 dark:text-slate-300 max-w-sm mx-auto">
        {description}
      </p>
    </div>
  );
}
- ) : result <= 0 ? (
-   <div className="space-y-6 flex flex-col items-center">...</div>
- ) : result <= parseFloat(currentCgpa) ? (
-   <div className="space-y-6 flex flex-col items-center">...</div>
+ ) : result <= 0 ? (
+   <SuccessResultCard badgeLabel="Goal Surpassed" value="0.00" description={<>Your current performance is so strong ...</>} />
+ ) : result <= parseFloat(currentCgpa) ? (
+   <SuccessResultCard badgeLabel="Target Secured" value={result.toFixed(2)} description={<>You are currently pacing ahead ...</>} />
🤖 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 `@app/`(public)/cgpa-calculator/page.tsx around lines 356 - 415, Extract the
duplicated success-state markup from the result <= 0 and result <=
parseFloat(currentCgpa) branches into a shared SuccessResultCard component.
Parameterize the badge label, displayed value, and description as props,
including React.ReactNode for descriptions, then replace both branches with the
component while preserving their existing text and formatting.
components/university/premium-animated-boy.tsx (2)

266-300: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Add aria-hidden to the decorative SVG character.

This is a purely decorative, non-lucide SVG figure (no text alternative possible), so screen readers shouldn't traverse its many <path>/<circle>/<g> nodes.

♿ Proposed fix
     <motion.div
       className="w-20 h-20 sm:w-28 sm:h-28 overflow-visible relative"
       initial={false}
       animate={currentVariant}
+      aria-hidden="true"
       variants={{
🤖 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 `@components/university/premium-animated-boy.tsx` around lines 266 - 300, Add
aria-hidden="true" to the decorative motion.svg element inside the animated
character component, ensuring screen readers skip the SVG and all nested path,
circle, and group nodes.

61-173: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Memoize the kinematics-derived variants; they're recomputed on every render for no reason.

getFK/getLimbPath/getEndObj/buildLimbVars/buildEndVars take only the static per-limb constant arrays (fl_h_ra, L_THIGH, etc. — none of which depend on props) plus the shared t transition object. The variant shape (paths, rotations, endpoints) never changes across renders; only t.transition depends on isJumping/jumpType. Right now, every one of the 8 call sites (Lines 361, 377, 418, 434, 676, 692, 727, 743) re-runs the full trig pipeline on every render — including the internal stride tick that fires every 450ms indefinitely while running (Lines 40-46), and any re-render forced by the parent (UniversityFlowBanner re-renders on targetX/resize updates too, since this component isn't memoized). None of that recomputation changes the output unless isJumping/jumpType actually change.

Also note the _h (happy) keyframe arrays (e.g. fl_h_h, bl_h_h, fa_s_h, ba_s_h, Lines 196-198/213-215/226-227/238-239) are all length-2, but only index [0] is ever read in the happy branches of buildLimbVars/buildEndVars — worth a quick check on whether the second element was meant to drive a repeating happy-pose bounce (matching the torso's ht-based loop) or is just dead data.

⚡ Suggested pattern
-import React, { useState, useEffect } from "react";
+import React, { useState, useEffect, useMemo } from "react";
 ...
-export const PremiumAnimatedBoy = ({
+export const PremiumAnimatedBoy = React.memo(function PremiumAnimatedBoy({
   isJumping = false,
   ...
-}: {...}) => {
+}: {...}) {
   ...
-      variants={buildLimbVars(ba_s_ra, ba_e_ra, ba_s_rb, ba_e_rb, ba_s_j, ba_e_j, ba_s_rj, ba_e_rj, ba_s_h, ba_e_h, L_UPARM, L_FOREARM)}
+      variants={useMemo(
+        () => buildLimbVars(ba_s_ra, ba_e_ra, ba_s_rb, ba_e_rb, ba_s_j, ba_e_j, ba_s_rj, ba_e_rj, ba_s_h, ba_e_h, L_UPARM, L_FOREARM),
+        [t]
+      )}
   ...
-};
+});

(Repeat for the other 7 buildLimbVars/buildEndVars call sites, keyed on t.)

🤖 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 `@components/university/premium-animated-boy.tsx` around lines 61 - 173,
Memoize the eight variant-building call sites so the kinematics calculations are
reused across renders: wrap each buildLimbVars/buildEndVars result in useMemo
with all static limb arrays and lengths as dependencies, and include the shared
transition object t so variants refresh when isJumping or jumpType changes. Also
verify whether the second elements of the _h happy keyframe arrays are
intentionally unused; preserve the existing single-pose behavior unless the
animation requires consuming them.
🤖 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 `@app/`(public)/cgpa-calculator/page.tsx:
- Around line 680-822: Create a module-level CAREER_TIERS configuration
containing each tier’s id, label, cutoff, and tips, with a derived CareerTierId
literal type. Refactor the tier button list, cutoffs lookup, radarTier
state/handling, and tips selection around this single configuration, removing
duplicated tier-id maps and render-time tip recreation while preserving default
tips and existing display behavior.

In `@app/`(public)/privacy/InteractivePath.tsx:
- Line 16: Update the reverse-jump timing around jumpBackEndTimeRef and
jumpStyleX so the anchor remains locked until the reverse animation fully
completes, using the same duration boundary as the animation rather than the
shorter 850ms window. Also gate the triggerJump() condition on the lock state
and the animation-driving value instead of allowing clampedVal changes during
the lock to retrigger the jump.

In `@components/university/university-flow-banner.tsx`:
- Around line 275-337: Add a dark-mode border color utility to the mobile
separator div within the steps map, preserving its existing light-mode
border-slate-300 styling and matching the component’s established dark divider
color pattern.

In `@content/rgpv/cscy/semester-4/cy-402/pyqs.json`:
- Around line 8-17: Update the subject blocks in
content/rgpv/cscy/semester-4/cy-402/pyqs.json (lines 8-17) and
content/rgpv/cscy/semester-4/cy-405/pyqs.json (lines 8-16) to include semester,
maxMarks, time, and commonInstructions, using values from the corresponding
actual exam papers and matching the complete shape in cs-302/pyqs.json.

In `@content/rgpv/cscy/semester-4/cy-405/pyqs.json`:
- Around line 380-391: Correct the typo in the q5a question text by replacing
“closer” with “closure,” leaving the rest of the question unchanged.

In `@content/rgpv/cse/semester-3/cs-302/pyqs.json`:
- Around line 328-340: Normalize the multi-unit "unit" fields for q8 and the
corresponding entries at the referenced occurrences by removing duplicate unit
names and using the slash-delimited convention used by sibling subject files.
Preserve the complete set of units represented by each question while ensuring
each value remains concise enough for the single-pill display.
- Around line 274-283: Update the affected subquestions q5b, q7b, q6a, q6b, and
q8b to replace the flat hasImage/imagePath/imageAlt fields with an attachments
array containing an attachment object with id, type, path, title, alt, caption,
and aiContext. Preserve each image’s existing path and descriptive text while
using the schema expected by SubQuestion.

In `@content/rgpv/cse/semester-4/bt-401/pyqs.json`:
- Around line 692-710: Verify the source paper and correct the garbled text of
sub-question q1b in the Q.1 entry, replacing “Find f(g) from the given table”
with the accurately transcribed numeric argument while preserving the existing
interpolation metadata.

In `@content/rgpv/cse/semester-4/cs-403/pyqs.json`:
- Around line 817-841: Replace the June 2025 Q1 entry in the CS-403 PYQs data
with the correct CS-403 question set for that paper, ensuring its questions and
metadata match the intended subject rather than the current Operating Systems
content. Preserve the existing June 2025 exam structure and update only the
mismatched Q1 data.

In `@content/rgpv/cse/semester-4/cs-404/syllabus.json`:
- Around line 13-78: Restore real per-module numeric hour values in
content/rgpv/cse/semester-4/cs-404/syllabus.json lines 13-78 and its modules 2-6
at lines 79-403, and in content/rgpv/cse/semester-4/cs-405/syllabus.json lines
13-50 and its modules 2-5 at lines 51-253. Preserve the required numeric
Module.hours contract used by the syllabus page; only make hours optional and
update the Module type if these values are intentionally unknown.

In `@content/rgpv/csit/semester-3/csit-302/pyqs.json`:
- Around line 279-282: Update the affected diagram question entries in pyqs.json
to use the runtime’s attachments[] schema, with each image resolved under the
subject’s diagrams directory and the existing alt text preserved. Apply the same
conversion to the entries near the referenced ranges, and remove the legacy
hasImage/imagePath/imageAlt fields unless the loader is explicitly updated to
map them.

In `@features/landing/ai-demo.tsx`:
- Around line 186-189: In the feature card className within the landing page
component, replace the deprecated flex-shrink-0 and flex-shrink utilities with
their Tailwind v4 shrink equivalents, preserving the existing responsive sizing
and layout behavior.

In `@features/landing/faq.tsx`:
- Around line 196-207: Update the Contact Support and Get Started Free elements
in the FAQ section to apply their existing button styles directly to each Link,
removing the nested button elements while preserving their destinations, labels,
icons, and interaction states.

---

Outside diff comments:
In `@app/`(public)/cgpa-calculator/page.tsx:
- Around line 555-585: Update the tier toggle buttons in the radarTier mapping
to add a visible focus or focus-visible ring and suitable focus styling to their
className, then add aria-pressed reflecting whether radarTier equals tier.id.
Preserve the existing toggle behavior and visual selected-state classes.

In `@content/rgpv/csit/semester-3/csit-302/syllabus.json`:
- Around line 2-15: Replace the subject metadata in the syllabus file with the
established syllabus schema used by sibling syllabus files, removing
pyqs-specific fields such as gradingSystem, maxMarks, time, and
commonInstructions and using the appropriate curriculum fields like university,
scheme, and branch while preserving the course identity fields.

---

Nitpick comments:
In `@app/`(public)/cgpa-calculator/page.tsx:
- Around line 356-415: Extract the duplicated success-state markup from the
result <= 0 and result <= parseFloat(currentCgpa) branches into a shared
SuccessResultCard component. Parameterize the badge label, displayed value, and
description as props, including React.ReactNode for descriptions, then replace
both branches with the component while preserving their existing text and
formatting.

In `@components/university/premium-animated-boy.tsx`:
- Around line 266-300: Add aria-hidden="true" to the decorative motion.svg
element inside the animated character component, ensuring screen readers skip
the SVG and all nested path, circle, and group nodes.
- Around line 61-173: Memoize the eight variant-building call sites so the
kinematics calculations are reused across renders: wrap each
buildLimbVars/buildEndVars result in useMemo with all static limb arrays and
lengths as dependencies, and include the shared transition object t so variants
refresh when isJumping or jumpType changes. Also verify whether the second
elements of the _h happy keyframe arrays are intentionally unused; preserve the
existing single-pose behavior unless the animation requires consuming them.
🪄 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: 83260de3-c2c8-409e-8354-37bf06311a6e

📥 Commits

Reviewing files that changed from the base of the PR and between 52567d5 and 34afdfb.

📒 Files selected for processing (31)
  • app/(public)/cgpa-calculator/page.tsx
  • app/(public)/creators/page.tsx
  • app/(public)/privacy/InteractivePath.tsx
  • app/(public)/privacy/page.tsx
  • app/api/heartbeat/route.ts
  • app/dashboard/page.tsx
  • app/rgpv/page.tsx
  • components/contact/ContactSection.tsx
  • components/university/premium-animated-boy.tsx
  • components/university/university-flow-banner.tsx
  • components/university/university-hero.tsx
  • content/rgpv/aiml/semester-3/al-302/pyqs.json
  • content/rgpv/aiml/semester-4/al-401/pyqs.json
  • content/rgpv/cscy/semester-4/cy-402/pyqs.json
  • content/rgpv/cscy/semester-4/cy-405/pyqs.json
  • content/rgpv/cse/semester-3/cs-302/pyqs.json
  • content/rgpv/cse/semester-3/cs-302/syllabus.json
  • content/rgpv/cse/semester-4/bt-401/pyqs.json
  • content/rgpv/cse/semester-4/bt-401/syllabus.json
  • content/rgpv/cse/semester-4/cs-402/pyqs.json
  • content/rgpv/cse/semester-4/cs-402/syllabus.json
  • content/rgpv/cse/semester-4/cs-403/pyqs.json
  • content/rgpv/cse/semester-4/cs-403/syllabus.json
  • content/rgpv/cse/semester-4/cs-404/pyqs.json
  • content/rgpv/cse/semester-4/cs-404/syllabus.json
  • content/rgpv/cse/semester-4/cs-405/pyqs.json
  • content/rgpv/cse/semester-4/cs-405/syllabus.json
  • content/rgpv/csit/semester-3/csit-302/pyqs.json
  • content/rgpv/csit/semester-3/csit-302/syllabus.json
  • features/landing/ai-demo.tsx
  • features/landing/faq.tsx
🛑 Comments failed to post (13)
app/(public)/cgpa-calculator/page.tsx (1)

680-822: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

New tierTips map adds a third duplicated copy of the tier-id set.

The tier ids (tier1/core/tier2/mass) are now defined in three places: the button array (Line 533-553), the pre-existing cutoffs lookup (Line 601-606), and this new tierTips record. If a tier is ever renamed/added/removed in only one of these, cutoffs[radarTier] can resolve to undefined and the eligibility branch's required.toFixed(1) call would throw at render time. Consolidating into a single CAREER_TIERS config (id, label, cutoff, tips) used to derive the button list, the cutoff lookup, and the tips lookup removes this drift risk and would also let radarTier be typed as a literal union instead of string | null (Line 33). As a secondary note, defaultTips/tierTips are recreated on every render inside this IIFE — hoisting the config to module scope avoids that too.

♻️ Sketch of a single source of truth
const CAREER_TIERS = [
  { id: "tier1", label: "Tier-1 Product (Google, Microsoft)", cutoff: 8.0, tips: [...] },
  { id: "core", label: "Core Engineering & PSUs", cutoff: 7.5, tips: [...] },
  { id: "tier2", label: "Tier-2 Tech & Consulting", cutoff: 7.0, tips: [...] },
  { id: "mass", label: "Mass Recruiters (TCS, Infosys)", cutoff: 6.0, tips: [...] },
] as const;

type CareerTierId = (typeof CAREER_TIERS)[number]["id"];
// derive button list, cutoffs, and tierTips from CAREER_TIERS instead of separate literals
🤖 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 `@app/`(public)/cgpa-calculator/page.tsx around lines 680 - 822, Create a
module-level CAREER_TIERS configuration containing each tier’s id, label,
cutoff, and tips, with a derived CareerTierId literal type. Refactor the tier
button list, cutoffs lookup, radarTier state/handling, and tips selection around
this single configuration, removing duplicated tier-id maps and render-time tip
recreation while preserving default tips and existing display behavior.
app/(public)/privacy/InteractivePath.tsx (1)

16-16: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Map the file structure first
ast-grep outline 'app/(public)/privacy/InteractivePath.tsx' --view expanded

# Show the relevant line ranges around the cited locations
nl -ba 'app/(public)/privacy/InteractivePath.tsx' | sed -n '1,180p'

Repository: imuniqueshiv/HyperLearningTech

Length of output: 360


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Read the component body with line numbers via awk (nl is unavailable)
awk 'NR>=1 && NR<=220 { printf "%4d: %s\n", NR, $0 }' 'app/(public)/privacy/InteractivePath.tsx'

Repository: imuniqueshiv/HyperLearningTech

Length of output: 9321


Reverse-jump timing should stay in sync with the jump animation. The anchor unlocks after 850ms, but jumpStyleX still returns for 1050ms, so the tracker can start following scroll again before the man finishes sliding back. Also, the trigger still keys off clampedVal, so a quick 0.97→0.99 flick during that lock can re-fire triggerJump() while the reverse animation is in progress.

🤖 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 `@app/`(public)/privacy/InteractivePath.tsx at line 16, Update the reverse-jump
timing around jumpBackEndTimeRef and jumpStyleX so the anchor remains locked
until the reverse animation fully completes, using the same duration boundary as
the animation rather than the shorter 850ms window. Also gate the triggerJump()
condition on the lock state and the animation-driving value instead of allowing
clampedVal changes during the lock to retrigger the jump.
components/university/university-flow-banner.tsx (1)

275-337: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Mobile separator missing dark-mode variant.

Every other color utility in this file pairs a light-mode class with a dark: variant (rope track, node pills, dividers, etc.), but the mobile separator at Line 335 only sets border-slate-300 with no dark counterpart, breaking the otherwise consistent theming pattern in this component.

🎨 Proposed fix
-                      <div className="sm:hidden absolute top-[35px] w-full border-t-2 border-dashed border-slate-300" />
+                      <div className="sm:hidden absolute top-[35px] w-full border-t-2 border-dashed border-slate-300 dark:border-slate-700" />
📝 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.

              {steps.map((step, index) => (
                <React.Fragment key={step}>
                  {/* Node Container */}
                  <div className="relative flex justify-center z-10 shrink-0 node-center-point">
                    {/* Glass Platform underneath the Node */}
                    <div className="absolute -bottom-4 left-1/2 -translate-x-1/2 w-20 h-5 bg-blue-400/20 rounded-[100%] shadow-[inset_0_0_12px_rgba(59,130,246,0.3)] dark:bg-blue-600/30 dark:shadow-[inset_0_0_12px_rgba(59,130,246,0.6)] -z-10" />

                    {/* The Node Pill */}
                    <div
                      className={`relative z-10 flex items-center justify-center rounded-full px-5 py-2 text-[13px] md:text-[15px] font-semibold transition-all duration-500 whitespace-nowrap ${
                        activeStep === index
                          ? "ring-4 ring-blue-400/30 ring-offset-2 dark:ring-offset-background scale-110"
                          : activeStep > index
                            ? "scale-100 opacity-100"
                            : "scale-100 opacity-70"
                      } ${
                        step === "Hyper AI"
                          ? "bg-gradient-to-b from-blue-500 to-indigo-600 text-white shadow-[0_4px_14px_0_rgb(59,130,246,40%)] border-0"
                          : activeStep === index
                            ? "bg-blue-50 border-2 border-blue-400 text-blue-700 shadow-sm dark:bg-blue-950 dark:border-blue-500/80 dark:text-blue-300"
                            : activeStep > index
                              ? "bg-white border-2 border-blue-200 text-blue-600 shadow-sm dark:bg-slate-900 dark:border-blue-800/60 dark:text-blue-400"
                              : "bg-white border-2 border-slate-200 text-slate-500 shadow-sm dark:bg-slate-900 dark:border-slate-700/80 dark:text-slate-400"
                      }`}
                    >
                      {step}
                    </div>
                  </div>

                  {/* Dynamic Dashed Jump Arc Trail */}
                  {index < steps.length - 1 && (
                    <div className="flex-1 relative h-[70px] -mt-[35px] mx-[8px] z-0 pointer-events-none">
                      <AnimatePresence>
                        {jumpGap === index && (
                          <svg
                            className="absolute inset-0 h-full w-full overflow-visible pointer-events-none"
                            preserveAspectRatio="none"
                            viewBox="0 0 100 100"
                          >
                            <motion.path
                              d="M 0 100 Q 50 -20 100 100"
                              fill="none"
                              stroke="currentColor"
                              strokeWidth="3"
                              strokeDasharray="6 6"
                              vectorEffect="non-scaling-stroke"
                              className="text-blue-400/80"
                              initial={{ pathLength: 0 }}
                              animate={{ pathLength: 1 }}
                              exit={{
                                opacity: 0,
                                transition: { duration: 0.1 },
                              }}
                              transition={{ duration: 0.5, ease: "linear" }}
                            />
                          </svg>
                        )}
                      </AnimatePresence>

                      {/* Mobile Separator */}
                      <div className="sm:hidden absolute top-[35px] w-full border-t-2 border-dashed border-slate-300 dark:border-slate-700" />
                    </div>
                  )}
🤖 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 `@components/university/university-flow-banner.tsx` around lines 275 - 337, Add
a dark-mode border color utility to the mobile separator div within the steps
map, preserving its existing light-mode border-slate-300 styling and matching
the component’s established dark divider color pattern.
content/rgpv/cscy/semester-4/cy-402/pyqs.json (1)

8-17: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

subject.maxMarks/subject.time missing in both CSCY semester-4 files — now user-visible since papers was populated.

Both files' subject blocks only carry id/code/name/title. The paper detail page (app/rgpv/[branch]/[semester]/[subject]/pyqs/[paper]/page.tsx) unconditionally renders pyqs.subject.maxMarks and pyqs.subject.time (no ?.), unlike commonInstructions which is guarded. Previously papers: [] meant the detail page always hit notFound(), so this never rendered; now that both files populate real papers in this PR, visiting a paper will show blank "Max Marks: " / "Duration: " labels. content/rgpv/cse/semester-3/cs-302/pyqs.json, changed in this same PR, shows the complete intended shape (semester, maxMarks, time, commonInstructions).

  • content/rgpv/cscy/semester-4/cy-402/pyqs.json#L8-L17: add maxMarks, time, semester, and commonInstructions to subject (values sourced from the actual CY-402 exam paper).
  • content/rgpv/cscy/semester-4/cy-405/pyqs.json#L8-L16: add the same fields to subject (values sourced from the actual CY-405 exam paper).
🛠️ Shape to replicate (from cs-302/pyqs.json)
   "subject": {
     "id": "cy-402",
     "code": "CY-402",
     "name": "Fundamental of Cyber Security",
-    "title": "CY-402 - Fundamental of Cyber Security"
+    "title": "CY-402 - Fundamental of Cyber Security",
+    "semester": "IV",
+    "maxMarks": 70,
+    "time": "3 Hours",
+    "commonInstructions": [
+      "Attempt any five questions.",
+      "All questions carry equal marks."
+    ]
   },
📍 Affects 2 files
  • content/rgpv/cscy/semester-4/cy-402/pyqs.json#L8-L17 (this comment)
  • content/rgpv/cscy/semester-4/cy-405/pyqs.json#L8-L16
🤖 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 `@content/rgpv/cscy/semester-4/cy-402/pyqs.json` around lines 8 - 17, Update
the subject blocks in content/rgpv/cscy/semester-4/cy-402/pyqs.json (lines 8-17)
and content/rgpv/cscy/semester-4/cy-405/pyqs.json (lines 8-16) to include
semester, maxMarks, time, and commonInstructions, using values from the
corresponding actual exam papers and matching the complete shape in
cs-302/pyqs.json.
content/rgpv/cscy/semester-4/cy-405/pyqs.json (1)

380-391: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Typo: "closer" → "closure".

"Compute the closer of the following set of functional dependencies..." — should be "closure of functional dependencies", the standard DBMS term.

✏️ Proposed fix
-              "text": "Compute the closer of the following set of functional dependencies for a relation scheme. R(A, B, C, D, E), F = { A → BC, CD → E, B → D, E → A } List out the candidate keys of R.",
+              "text": "Compute the closure of the following set of functional dependencies for a relation scheme. R(A, B, C, D, E), F = { A → BC, CD → E, B → D, E → A } List out the candidate keys of R.",
📝 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.

            {
              "id": "q5a",
              "label": "a)",
              "text": "Compute the closure of the following set of functional dependencies for a relation scheme. R(A, B, C, D, E), F = { A → BC, CD → E, B → D, E → A } List out the candidate keys of R.",
              "unit": "Unit 3"
            },
            {
              "id": "q5b",
              "label": "b)",
              "text": "State and explain shadow paging with suitable example.",
              "unit": "Unit 4"
            }
🤖 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 `@content/rgpv/cscy/semester-4/cy-405/pyqs.json` around lines 380 - 391,
Correct the typo in the q5a question text by replacing “closer” with “closure,”
leaving the rest of the question unchanged.
content/rgpv/cse/semester-3/cs-302/pyqs.json (2)

274-283: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
cat types/pyq.ts
rg -n "hasImage|imagePath|imageAlt" --type=ts -C2
rg -n "interface QuestionAttachment" -A 10 --type=ts

Repository: imuniqueshiv/HyperLearningTech

Length of output: 1047


Use attachments objects here

SubQuestion only accepts attachments?: QuestionAttachment[], so these flat hasImage/imagePath/imageAlt fields won't be read. Convert this entry—and the same pattern at Q7b, Q6a, Q6b, and Q8b—to attachments objects with id, type, path, title, alt, caption, and aiContext.

🤖 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 `@content/rgpv/cse/semester-3/cs-302/pyqs.json` around lines 274 - 283, Update
the affected subquestions q5b, q7b, q6a, q6b, and q8b to replace the flat
hasImage/imagePath/imageAlt fields with an attachments array containing an
attachment object with id, type, path, title, alt, caption, and aiContext.
Preserve each image’s existing path and descriptive text while using the schema
expected by SubQuestion.

328-340: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Multi-unit unit values use a comma-separated list that will overflow the single-pill badge, and use a different delimiter than sibling subject files.

"unit": "Unit 1, Unit 2, Unit 3, Unit 1" (and similarly at lines 650, 657, 718, 725, 744, 1003) is rendered verbatim into one compact rounded pill (rounded-full px-3 py-1 text-xs) by the paper page, so long/duplicated lists like this will look cramped or wrap oddly. al-302/al-401 in this same PR use a "/" delimiter for mixed units (e.g. "Unit 2/5") instead of commas — worth standardizing on one convention across subjects.

♻️ Suggested normalization
-              "unit": "Unit 1, Unit 2, Unit 3, Unit 1",
+              "unit": "Unit 1/2/3/1",
📝 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.

        {
          "id": "q8",
          "questionNumber": "Q.8",
          "subQuestions": [
            {
              "id": "q8a",
              "label": "",
              "text": "Discuss in brief any two of the following: i) Partial ordering relation ii) Cosets iii) Disjunctive normal form iv) Pigeonhole principle",
              "unit": "Unit 1/2/3/1",
              "type": "theory"
            }
          ]
        }
🤖 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 `@content/rgpv/cse/semester-3/cs-302/pyqs.json` around lines 328 - 340,
Normalize the multi-unit "unit" fields for q8 and the corresponding entries at
the referenced occurrences by removing duplicate unit names and using the
slash-delimited convention used by sibling subject files. Preserve the complete
set of units represented by each question while ensuring each value remains
concise enough for the single-pill display.
content/rgpv/cse/semester-4/bt-401/pyqs.json (1)

692-710: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Garbled question text: "Find f(g)" doesn't make sense.

q1b in the December 2024 paper reads "Find f(g) from the given table," which isn't a coherent interpolation prompt — "g" isn't a numeric argument. This looks like an OCR/transcription slip (likely a misread digit, e.g. "f(9)").

✏️ Suggested fix (verify against the source paper before applying)
-              "text": "Find f(g) from the given table.",
+              "text": "Find f(9) from the given table.",
📝 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.

          "questionNumber": "Q.1",
          "subQuestions": [
            {
              "id": "q1a",
              "label": "a)",
              "text": "Using Newton-Raphson method find the real root of 3x = cos x + 1 correct to five decimal places.",
              "unit": "Unit 1",
              "type": "root-finding"
            },
            {
              "id": "q1b",
              "label": "b)",
              "text": "Find f(9) from the given table.",
              "unit": "Unit 1",
              "type": "interpolation"
            }
          ]
        },
        {
🤖 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 `@content/rgpv/cse/semester-4/bt-401/pyqs.json` around lines 692 - 710, Verify
the source paper and correct the garbled text of sub-question q1b in the Q.1
entry, replacing “Find f(g) from the given table” with the accurately
transcribed numeric argument while preserving the existing interpolation
metadata.
content/rgpv/cse/semester-4/cs-403/pyqs.json (1)

817-841: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

set -euo pipefail

printf '\n== cs-403 pyqs around June 2025 ==\n'
sed -n '780,900p' content/rgpv/cse/semester-4/cs-403/pyqs.json

printf '\n== search for June 2025 in semester-4 files ==\n'
rg -n '"June 2025"|Operating Systems|Software Engineering|\"type\": \"os\"' content/rgpv/cse/semester-4 -g '*.json'

printf '\n== cs-405 syllabus snippets ==\n'
sed -n '1,220p' content/rgpv/cse/semester-4/cs-405/syllabus.json

Repository: imuniqueshiv/HyperLearningTech

Length of output: 4068


🏁 Script executed:

set -euo pipefail

python3 - <<'PY'
import json, pathlib
p = pathlib.Path('content/rgpv/cse/semester-4/cs-403/pyqs.json')
data = json.loads(p.read_text())
for item in data:
    if item.get('exam') == 'June 2025':
        print('FOUND June 2025 entry')
        print(json.dumps(item, indent=2)[:5000])
        break
else:
    print('June 2025 entry not found')
PY

Repository: imuniqueshiv/HyperLearningTech

Length of output: 293


🏁 Script executed:

set -euo pipefail

python3 - <<'PY'
import json, pathlib
p = pathlib.Path('content/rgpv/cse/semester-4/cs-403/pyqs.json')
data = json.loads(p.read_text())
for item in data:
    if item.get('exam') == 'June 2025':
        print(json.dumps(item, indent=2))
        break
PY

Repository: imuniqueshiv/HyperLearningTech

Length of output: 293


🏁 Script executed:

set -euo pipefail

sed -n '800,870p' content/rgpv/cse/semester-4/cs-403/pyqs.json

Repository: imuniqueshiv/HyperLearningTech

Length of output: 2290


🏁 Script executed:

set -euo pipefail
sed -n '800,870p' content/rgpv/cse/semester-4/cs-403/pyqs.json

Repository: imuniqueshiv/HyperLearningTech

Length of output: 2290


🏁 Script executed:

set -euo pipefail
sed -n '1,40p' content/rgpv/cse/semester-4/cs-403/pyqs.json

Repository: imuniqueshiv/HyperLearningTech

Length of output: 1302


Fix the June 2025 Q1 subject mismatch June 2025 Q1 in content/rgpv/cse/semester-4/cs-403/pyqs.json is Operating Systems content ("type": "os"), not Software Engineering. Replace it with the correct CS-403 question set for that paper.

🤖 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 `@content/rgpv/cse/semester-4/cs-403/pyqs.json` around lines 817 - 841, Replace
the June 2025 Q1 entry in the CS-403 PYQs data with the correct CS-403 question
set for that paper, ensuring its questions and metadata match the intended
subject rather than the current Operating Systems content. Preserve the existing
June 2025 exam structure and update only the mismatched Q1 data.
content/rgpv/cse/semester-4/cs-404/syllabus.json (1)

13-78: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

hours: null breaks the non-nullable Module.hours: number contract used by the syllabus page. Every module in both files sets hours to null (previously 8), while sibling content/rgpv/csit/semester-3/csit-302/syllabus.json kept real hours: 8 values. The downstream Module interface in app/rgpv/[branch]/[semester]/[subject]/syllabus/page.tsx types hours as a required number, so these two files will likely render "null" (or a falsy/NaN duration) wherever module duration is displayed.

  • content/rgpv/cse/semester-4/cs-404/syllabus.json#L13-L78 (and modules 2-6 at L79-L403): restore real per-module hour counts, or make the field intentionally optional end-to-end (update the Module type too) if hours are genuinely unknown for this subject.
  • content/rgpv/cse/semester-4/cs-405/syllabus.json#L13-L50 (and modules 2-5 at L51-L253): same fix.
📍 Affects 2 files
  • content/rgpv/cse/semester-4/cs-404/syllabus.json#L13-L78 (this comment)
  • content/rgpv/cse/semester-4/cs-405/syllabus.json#L13-L50
🤖 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 `@content/rgpv/cse/semester-4/cs-404/syllabus.json` around lines 13 - 78,
Restore real per-module numeric hour values in
content/rgpv/cse/semester-4/cs-404/syllabus.json lines 13-78 and its modules 2-6
at lines 79-403, and in content/rgpv/cse/semester-4/cs-405/syllabus.json lines
13-50 and its modules 2-5 at lines 51-253. Preserve the required numeric
Module.hours contract used by the syllabus page; only make hours optional and
update the Module type if these values are intentionally unknown.
content/rgpv/csit/semester-3/csit-302/pyqs.json (1)

279-282: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check if PYQ/subquestion types declare hasImage/imagePath/imageAlt
rg -n "hasImage|imagePath|imageAlt" --type=ts -C2

# Locate the referenced image assets
fd -i "Q.5-b_june-2023.png" -o fd -i "Q.6-a_dec-2023.png" 2>/dev/null
fd 'ques-diagrams' --type d

Repository: imuniqueshiv/HyperLearningTech

Length of output: 168


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== PYQ-related files =="
git ls-files | rg '(^|/)(pyqs\.json|.*pyq.*\.(ts|tsx|js|json)|.*migrate.*\.ts|.*schema.*\.(ts|json))$' || true

echo
echo "== Search for the new image fields =="
rg -n "hasImage|imagePath|imageAlt" . || true

echo
echo "== Locate the referenced image assets =="
fd -HI 'Q.5-b_june-2023.png|Q.6-a_dec-2023.png|ques-diagrams' . || true

echo
echo "== Relevant JSON snippets in content/rgpv/csit/semester-3/csit-302/pyqs.json =="
rg -n '"hasImage"|"imagePath"|"imageAlt"|ques-diagrams' content/rgpv/csit/semester-3/csit-302/pyqs.json || true

Repository: imuniqueshiv/HyperLearningTech

Length of output: 18012


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== types/pyq.ts =="
wc -l types/pyq.ts
cat -n types/pyq.ts

echo
echo "== attachment rendering files =="
for f in components/pyqs/attachment-image.tsx components/pyqs/question-attachments.tsx components/pyq/question-card.tsx lib/db/repositories/pyq.repository.ts app/rgpv/[branch]/[semester]/[subject]/pyqs/[paper]/page.tsx; do
  echo "--- $f ---"
  wc -l "$f"
done

echo
echo "== relevant excerpts =="
sed -n '1,220p' components/pyqs/attachment-image.tsx
echo
sed -n '1,240p' components/pyqs/question-attachments.tsx
echo
sed -n '1,220p' types/pyq.ts
echo
sed -n '1,240p' lib/db/repositories/pyq.repository.ts

echo
echo "== image asset search =="
fd -HI 'ques-diagrams' content public app components . || true
fd -HI 'Q.5-b_june-2023.png|Q.7-b_june-2023.png|Q.6-a_dec-2023.png|Q.6-b_dec-2023.png|Q.8-b_dec-2025.png' content public app components . || true

Repository: imuniqueshiv/HyperLearningTech

Length of output: 8123


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== attachment helpers =="
wc -l lib/content/attachment-path.ts lib/content/attachment-utils.ts app/rgpv/[branch]/[semester]/[subject]/pyqs/[paper]/page.tsx
echo
sed -n '1,240p' lib/content/attachment-path.ts
echo
sed -n '1,240p' lib/content/attachment-utils.ts
echo
sed -n '1,240p' app/rgpv/[branch]/[semester]/[subject]/pyqs/[paper]/page.tsx

echo
echo "== search for legacy image fields in content loaders =="
rg -n "hasImage|imagePath|imageAlt|attachments" lib app components types content/rgpv -g '!**/pyqs.json' || true

Repository: imuniqueshiv/HyperLearningTech

Length of output: 18412


Use the attachment schema for these diagrams pyqs.json still uses hasImage/imagePath/imageAlt, but the runtime only renders attachments[] entries and resolves them under content/rgpv/<branch>/<semester>/<subject>/diagrams/. These ques-diagrams/*.png references won’t render as written unless the loader maps the legacy fields or the assets are moved/renamed. Also applies to lines 322-324, 458-471, and 1172-1175.

🤖 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 `@content/rgpv/csit/semester-3/csit-302/pyqs.json` around lines 279 - 282,
Update the affected diagram question entries in pyqs.json to use the runtime’s
attachments[] schema, with each image resolved under the subject’s diagrams
directory and the existing alt text preserved. Apply the same conversion to the
entries near the referenced ranges, and remove the legacy
hasImage/imagePath/imageAlt fields unless the loader is explicitly updated to
map them.
features/landing/ai-demo.tsx (1)

186-189: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Update deprecated flex-shrink utilities to shrink.

Tailwind CSS v4 introduces a breaking change that removes the flex-shrink-* classes in favor of shrink-*. The flex-shrink-0 lg:flex-shrink classes will be ignored by the v4 compiler, potentially causing unwanted layout shifts in the feature cards.

🐛 Proposed fix
-                    className={`group relative text-left overflow-hidden rounded-[16px] sm:rounded-[20px] p-4 sm:p-5 transition-all duration-300 ease-[cubic-bezier(0.2,0.8,0.2,1)] min-w-[280px] w-[85vw] sm:w-auto lg:w-full snap-center flex-shrink-0 lg:flex-shrink active:scale-[0.98] ${
+                    className={`group relative text-left overflow-hidden rounded-[16px] sm:rounded-[20px] p-4 sm:p-5 transition-all duration-300 ease-[cubic-bezier(0.2,0.8,0.2,1)] min-w-[280px] w-[85vw] sm:w-auto lg:w-full snap-center shrink-0 lg:shrink active:scale-[0.98] ${
                       isActive
                         ? "border border-indigo-500/50 bg-indigo-50/60 shadow-sm ring-1 ring-indigo-500/20 dark:border-indigo-400/40 dark:bg-indigo-500/[0.08] dark:ring-indigo-400/20"
                         : "border border-slate-200/70 bg-white/90 shadow-sm hover:bg-white hover:border-slate-300 dark:border-white/[0.06] dark:bg-[`#0f172a`]/40 dark:hover:bg-[`#1e293b`]/60 dark:hover:border-white/[0.1]"
📝 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.

                    className={`group relative text-left overflow-hidden rounded-[16px] sm:rounded-[20px] p-4 sm:p-5 transition-all duration-300 ease-[cubic-bezier(0.2,0.8,0.2,1)] min-w-[280px] w-[85vw] sm:w-auto lg:w-full snap-center shrink-0 lg:shrink active:scale-[0.98] ${
                      isActive
                        ? "border border-indigo-500/50 bg-indigo-50/60 shadow-sm ring-1 ring-indigo-500/20 dark:border-indigo-400/40 dark:bg-indigo-500/[0.08] dark:ring-indigo-400/20"
                        : "border border-slate-200/70 bg-white/90 shadow-sm hover:bg-white hover:border-slate-300 dark:border-white/[0.06] dark:bg-[`#0f172a`]/40 dark:hover:bg-[`#1e293b`]/60 dark:hover:border-white/[0.1]"
🤖 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 `@features/landing/ai-demo.tsx` around lines 186 - 189, In the feature card
className within the landing page component, replace the deprecated
flex-shrink-0 and flex-shrink utilities with their Tailwind v4 shrink
equivalents, preserving the existing responsive sizing and layout behavior.
features/landing/faq.tsx (1)

196-207: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Avoid nesting interactive <button> elements inside <Link>.

In Next.js, the <Link> component renders an <a> element. Nesting a <button> inside an <a> tag violates the HTML5 specification and can cause hydration mismatches or accessibility issues. To preserve the styling and behavior, apply the classes directly to the <Link> component and remove the wrapping <button> elements.

🐛 Proposed fix
-                <Link href="/contact">
-                  <button className="inline-flex h-[52px] w-full sm:w-auto items-center justify-center rounded-full bg-slate-900 px-8 text-[15px] font-[650] text-white shadow-md shadow-slate-900/10 transition-all hover:bg-slate-800 hover:shadow-lg dark:bg-white dark:text-slate-900 dark:hover:bg-slate-100 active:scale-[0.98]">
-                    Contact Support
-                  </button>
-                </Link>
-                <Link href="/auth/signup">
-                  <button className="group inline-flex h-[52px] w-full sm:w-auto items-center justify-center rounded-full border border-slate-200 bg-white/60 px-8 text-[15px] font-[650] text-slate-700 shadow-sm transition-all hover:bg-slate-50 hover:border-slate-300 dark:border-white/[0.08] dark:bg-transparent dark:text-slate-300 dark:hover:bg-white/[0.04] dark:hover:text-white active:scale-[0.98] backdrop-blur-sm">
-                    Get Started Free
-                    <ArrowRight className="ml-2 h-4 w-4 transition-transform group-hover:translate-x-1" />
-                  </button>
-                </Link>
+                <Link 
+                  href="/contact"
+                  className="inline-flex h-[52px] w-full sm:w-auto items-center justify-center rounded-full bg-slate-900 px-8 text-[15px] font-[650] text-white shadow-md shadow-slate-900/10 transition-all hover:bg-slate-800 hover:shadow-lg dark:bg-white dark:text-slate-900 dark:hover:bg-slate-100 active:scale-[0.98]"
+                >
+                  Contact Support
+                </Link>
+                <Link 
+                  href="/auth/signup"
+                  className="group inline-flex h-[52px] w-full sm:w-auto items-center justify-center rounded-full border border-slate-200 bg-white/60 px-8 text-[15px] font-[650] text-slate-700 shadow-sm transition-all hover:bg-slate-50 hover:border-slate-300 dark:border-white/[0.08] dark:bg-transparent dark:text-slate-300 dark:hover:bg-white/[0.04] dark:hover:text-white active:scale-[0.98] backdrop-blur-sm"
+                >
+                  Get Started Free
+                  <ArrowRight className="ml-2 h-4 w-4 transition-transform group-hover:translate-x-1" />
+                </Link>
📝 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.

                <Link 
                  href="/contact"
                  className="inline-flex h-[52px] w-full sm:w-auto items-center justify-center rounded-full bg-slate-900 px-8 text-[15px] font-[650] text-white shadow-md shadow-slate-900/10 transition-all hover:bg-slate-800 hover:shadow-lg dark:bg-white dark:text-slate-900 dark:hover:bg-slate-100 active:scale-[0.98]"
                >
                  Contact Support
                </Link>
                <Link 
                  href="/auth/signup"
                  className="group inline-flex h-[52px] w-full sm:w-auto items-center justify-center rounded-full border border-slate-200 bg-white/60 px-8 text-[15px] font-[650] text-slate-700 shadow-sm transition-all hover:bg-slate-50 hover:border-slate-300 dark:border-white/[0.08] dark:bg-transparent dark:text-slate-300 dark:hover:bg-white/[0.04] dark:hover:text-white active:scale-[0.98] backdrop-blur-sm"
                >
                  Get Started Free
                  <ArrowRight className="ml-2 h-4 w-4 transition-transform group-hover:translate-x-1" />
                </Link>
🤖 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 `@features/landing/faq.tsx` around lines 196 - 207, Update the Contact Support
and Get Started Free elements in the FAQ section to apply their existing button
styles directly to each Link, removing the nested button elements while
preserving their destinations, labels, icons, and interaction states.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant