-
-
Notifications
You must be signed in to change notification settings - Fork 295
fix: footer sticks to bottom on large screens #2159
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix: footer sticks to bottom on large screens #2159
Conversation
…om/OUMIMANDAL/Nest-milestones into fix-homepage-container-flexibility # Please enter a commit message to explain why this merge is necessary, # especially if it merges an updated upstream into a topic branch. # # Lines starting with '#' will be ignored, and an empty message aborts # the commit.
…om/OUMIMANDAL/Nest-milestones into fix-homepage-container-flexibility # Please enter a commit message to explain why this merge is necessary, # especially if it merges an updated upstream into a topic branch. # # Lines starting with '#' will be ignored, and an empty message aborts # the commit.
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.29.8 to 3.29.9. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](github/codeql-action@76621b6...df55935) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 3.29.9 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* add id field * update code * add id field by inheriting from strawberry.relay.Node
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.29.9 to 3.29.10. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](github/codeql-action@df55935...96f518a) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 3.29.10 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Added test for RecentIssues Component * Updated code format * update missing title test --------- Co-authored-by: Kate Golovanova <[email protected]>
* Integrate lighthouseci * use nest.owasp.dev * run lighthouse after staging deployment * Update code * Update code temporarily * run lighthouse after staging deployment * remove github app environment variable and test * run lighthouse after staging deployment * Update code --------- Co-authored-by: Arkadii Yakovets <[email protected]>
Summary by CodeRabbit
WalkthroughThis PR updates CI workflows, migrates frontend styling/build to Tailwind v4, adjusts Next.js app layout and pages, introduces new and refactored frontend components, modifies various configs (including removing Apollo), adds schema validation utilities in Python, and changes multiple className orders with largely cosmetic impact. Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~75 minutes Assessment against linked issues
Assessment against linked issues: Out-of-scope changes
Possibly related PRs
Suggested labels
Suggested reviewers
Tip 🔌 Remote MCP (Model Context Protocol) integration is now available!Pro plan users can now connect to remote MCP servers from the Integrations page. Connect with popular remote MCPs such as Notion and Linear to add more context to your reviews and chats. ✨ Finishing Touches
🧪 Generate unit tests
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. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR/Issue comments)Type Other keywords and placeholders
Status, Documentation and Community
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 15
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (5)
frontend/src/components/ModuleForm.tsx (1)
268-271: Fix error handling in debounced fetchSuggestions.
- When query is empty, also hide suggestions.
- Error constructor: pass { cause } option; throwing inside a debounced async often results in unhandled rejections. Prefer logging + user-facing error state.
debounce(async (query: string) => { if (!query.trim()) { - setRawResults([]) - return + setRawResults([]) + setShowSuggestions(false) + return } @@ } catch (err) { setRawResults([]) setShowSuggestions(false) - throw new Error('Error fetching suggestions:', err) + console.error('Error fetching suggestions', err) + setError('Unable to fetch project suggestions. Please try again.') + // Optionally keep the cause if you really need an Error object: + // const e = new Error('Error fetching suggestions', { cause: err as unknown }) + // console.error(e) } }, 300),Also applies to: 281-285
frontend/src/components/Card.tsx (1)
121-124: Fix invalid Tailwind variant chain (duplicate dark:)
dark:hover:dark:text-gray-400won’t parse correctly; should bedark:hover:text-gray-400.Apply:
- className="h-5 w-5 text-blue-500 hover:text-gray-600 dark:hover:dark:text-gray-400" + className="h-5 w-5 text-blue-500 hover:text-gray-600 dark:hover:text-gray-400"frontend/src/components/UserCard.tsx (1)
29-29: next/image: replace deprecated objectFit propNewer Next.js versions require style or utility classes instead of the objectFit prop.
- <Image fill src={`${avatar}&s=160`} alt={name || 'user'} objectFit="cover" /> + <Image fill src={`${avatar}&s=160`} alt={name || 'user'} style={{ objectFit: 'cover' }} /> + {/* + Alternatively: add className="object-cover" and keep style minimal. + */}frontend/src/components/LogoCarousel.tsx (1)
13-18: Avoid DOM mutation with innerHTML; can cause unbounded duplication and memory bloatDuplicating innerHTML on each effect run risks exponential growth if sponsors prop identity changes. Render a doubled list instead.
-import { useEffect, useRef } from 'react' +import { useMemo, useRef } from 'react' @@ - useEffect(() => { - if (scrollerRef.current) { - const scrollContainer = scrollerRef.current - scrollContainer.innerHTML += scrollContainer.innerHTML - } - }, [sponsors]) + const items = useMemo(() => [...sponsors, ...sponsors], [sponsors]) @@ - ref={scrollerRef} - className="animate-scroll flex w-full gap-6" - style={{ animationDuration: `${sponsors.length * 2}s` }} + ref={scrollerRef} + className="animate-scroll flex w-full gap-6" + style={{ animationDuration: `${sponsors.length * 2}s` }} @@ - {sponsors.map((sponsor, index) => ( + {items.map((sponsor, index) => ( <div key={`${sponsor.name}-${index}`} className="flex min-w-[220px] flex-shrink-0 flex-col items-center rounded-lg p-5" >Optionally remove the now-unused ref entirely if it’s only for the previous mutation logic.
.github/workflows/run-ci-cd.yaml (1)
130-136: Fix typo in job name: “Denendencies” → “Dependencies”User-facing label in Actions UI.
- scan-ci-dependencies: - name: Run CI Denendencies Scan + scan-ci-dependencies: + name: Run CI Dependencies Scan
🧹 Nitpick comments (37)
frontend/src/components/skeletons/ApiKeySkelton.tsx (3)
1-1: Nit: filename typo “Skelton” → “Skeleton”Standardize naming to avoid import mistakes and IDE search misses.
Proposed rename (Git move):
-frontend/src/components/skeletons/ApiKeySkelton.tsx +frontend/src/components/skeletons/ApiKeySkeleton.tsxIf you adopt this, update any imports that reference the old path.
5-5: Optional a11y: mark skeleton container as a live statusAlign with CardSkeleton (which already uses role="status") so SRs get a polite loading announcement.
Apply:
- <div className="flex min-h-[80vh] flex-col items-center p-8"> + <div role="status" aria-live="polite" aria-label="Loading API keys" className="flex min-h-[80vh] flex-col items-center p-8">
5-5: Optional: reduce repetition with a helper for shared skeleton classesMany nodes repeat "animate-pulse rounded bg-gray-200 dark:bg-gray-700". Consider a cn() helper or component to cut noise.
Example:
-<div className="h-4 w-96 animate-pulse rounded bg-gray-200 dark:bg-gray-700"></div> +<SkeletonBlock className="h-4 w-96" />(Where SkeletonBlock wraps the common classes.)
frontend/src/components/skeletons/Card.tsx (1)
19-21: Optional: ensure class sorting is automated to avoid churnIf not already, enable the Prettier Tailwind plugin so utility ordering is consistent and future diffs stay minimal.
Would you like a .prettierrc update + example configuration?
frontend/src/components/NavDropDown.tsx (2)
15-24: Type the ref and harden outside-click checkTyping the ref exposes a TS issue with EventTarget; guard with instanceof Node to keep strictness green.
- const dropdownRef = useRef(null) + const dropdownRef = useRef<HTMLDivElement | null>(null) ... - function handleClickOutside(event: MouseEvent) { - if (dropdownRef.current && !dropdownRef.current.contains(event.target)) { + function handleClickOutside(event: MouseEvent) { + if ( + dropdownRef.current && + event.target instanceof Node && + !dropdownRef.current.contains(event.target) + ) { setIsOpen(false) } }
71-79: Prefer stable keys over array indicesUse a deterministic key to avoid unnecessary re-renders on reordering.
- {link.submenu.map((submenu, idx) => ( + {link.submenu.map((submenu) => ( <Link - key={idx} + key={submenu.href || submenu.text}frontend/src/types/issue.ts (1)
9-11: Document duplicated repositoryName Add a JSDoc comment aboverepositoryName?: stringinfrontend/src/types/issue.tsclarifying that it duplicatesrepository?.name(selected via GraphQL for convenience). All GraphQL queries insrc/server/queriesalready includerepositoryName, so it’s consistently populated. Remove the manual verification step.number?: string + /** Duplicate of repository?.name from GraphQL; use repository?.name when available. */ repositoryName?: string organizationName?: string projectName: stringfrontend/src/components/SearchPageLayout.tsx (1)
43-43: Replacejustify-normalwithjustify-startand addmt-autoto<Footer />
- Tailwind’s
justify-normalmaps tojustify-content: normal(same asflex-startby default); usejustify-startor drop it for clarity.- Make the footer stick to the bottom by adding
mt-autoinapp/layout.tsx(either via<Footer className="mt-auto" />or wrapping it in a container withmt-auto).frontend/src/components/SearchPageLayout.tsx - <div className="text-text flex min-h-screen w-full flex-col items-center justify-normal p-5"> + <div className="text-text flex min-h-screen w-full flex-col items-center justify-start p-5"> frontend/src/app/layout.tsx - <Footer /> + <Footer className="mt-auto" />.pre-commit-config.yaml (1)
13-15: No-op whitespace change; consider avoiding churn.The extra blank lines won’t affect behavior but may fight yamlfmt in this same config. Recommend keeping blocks compact to reduce formatter flip-flops.
frontend/src/components/RepositoriesCard.tsx (2)
24-26: Use a stable key instead of array index.Index keys can cause unnecessary re-renders and subtle UI bugs on reordering. Prefer the repository’s stable identifier.
- {displayedRepositories.map((repository, index) => { - return <RepositoryItem key={index} details={repository} /> + {displayedRepositories.map((repository) => { + return <RepositoryItem key={repository.key} details={repository} /> })}
40-40: Verify/non-standard Tailwind class: h-46."h-46" isn’t in Tailwind’s default scale. If not added in your theme, it will be a no-op. Consider an arbitrary value or nearest scale class.
- <div className="flex h-46 w-full flex-col gap-3 rounded-lg border p-4 shadow-sm ease-in-out hover:shadow-md dark:border-gray-700 dark:bg-gray-800"> + <div className="flex h-[11.5rem] w-full flex-col gap-3 rounded-lg border p-4 shadow-sm ease-in-out hover:shadow-md dark:border-gray-700 dark:bg-gray-800">frontend/src/components/ModuleForm.tsx (1)
57-57: Potentially invalid Tailwind utility: justify-normal.Tailwind’s default doesn’t include justify-normal. If not added via plugin/custom utilities, it’s ignored. Use justify-start (or desired value).
- <div className="text-text flex w-full flex-col items-center justify-normal p-5"> + <div className="text-text flex w-full flex-col items-center justify-start p-5">frontend/src/components/ProgramForm.tsx (1)
54-54: Replace nestedmin-h-screenwithmin-h-fullandjustify-normalwithjustify-startin all inner page wrappersInner components (ProgramForm.tsx line 54, SearchPageLayout.tsx 43, ModuleForm.tsx 57, snapshots/page.tsx 65–66, etc.) each use
min-h-screenand the nonstandardjustify-normal. These should defer to the root’smin-h-screen/dvh flex layout by switching tomin-h-fullandjustify-start.frontend/src/components/RecentReleases.tsx (1)
40-43: Use a stable key instead of array index.Index keys can cause incorrect DOM reuse if list order changes. Prefer a deterministic key from the item.
Apply:
- {data.map((item, index) => ( - <div key={index} className="mb-4 w-full rounded-lg bg-gray-200 p-4 dark:bg-gray-700"> + {data.map((item) => ( + <div + key={`${item.organizationName}/${item.repositoryName}/${item.tagName}`} + className="mb-4 w-full rounded-lg bg-gray-200 p-4 dark:bg-gray-700" + >frontend/src/app/snapshots/page.tsx (1)
66-66: Avoid nested 100vh; align with sticky footer layout.Inner container should not be min-h-screen if the page layout provides the flex/min-height scaffold. Use min-h-full and a standard justify value.
Apply:
- <div className="text-text flex min-h-screen w-full flex-col items-center justify-normal p-5"> + <div className="text-text flex min-h-full w-full flex-col items-center justify-start p-5">Architecture tip (no code change here): In app/layout.tsx, ensure:
- body: min-h-dvh flex flex-col
- main: flex-1
This guarantees the footer sticks to the bottom on tall screens without needing 100vh on child pages.frontend/src/components/NavButton.tsx (1)
24-24: No-op Tailwind class reordering — LGTM.Optional: if this renders many times, consider using CSS (group-hover) to avoid state toggles on hover to reduce re-renders.
frontend/src/components/TruncatedText.tsx (1)
40-40: Remove duplicate utilities;truncatealready implies them.
truncatesetsoverflow-hidden text-ellipsis whitespace-nowrap. Keep justtruncate(plusblock), rely on${className}for extras.- className={`block truncate overflow-hidden text-ellipsis whitespace-nowrap ${className}`} + className={`block truncate ${className}`}frontend/src/components/ModeToggle.tsx (1)
25-25: Improve toggle a11y (add aria-pressed) and keep ring token usage consistentExpose pressed state for screen readers; also confirm
--ringtoken exists with Tailwind v4 token setup.Apply:
<Button onPress={darkModeHandler} - className="focus-visible:ring-ring relative h-10 w-10 transform rounded-full bg-[#87a1bc] transition-all duration-200 hover:ring-1 hover:ring-[#b0c7de] hover:ring-offset-0 focus-visible:ring-1 focus-visible:outline-none active:scale-95 disabled:pointer-events-none disabled:opacity-50 dark:bg-slate-900 dark:text-white dark:hover:bg-slate-900/90 dark:hover:ring-[#46576b]" + className="focus-visible:ring-ring relative h-10 w-10 transform rounded-full bg-[#87a1bc] transition-all duration-200 hover:ring-1 hover:ring-[#b0c7de] hover:ring-offset-0 focus-visible:ring-1 focus-visible:outline-none active:scale-95 disabled:pointer-events-none disabled:opacity-50 dark:bg-slate-900 dark:text-white dark:hover:bg-slate-900/90 dark:hover:ring-[#46576b]" isIconOnly={true} aria-label={theme === 'dark' ? 'Enable light mode' : 'Enable dark mode'} + aria-pressed={theme === 'dark'} >frontend/src/app/loading.tsx (1)
1-30: Loading screen: add dark-mode styles and ARIA status; prefer min-h-screenImproves a11y and visual parity in dark mode, avoids iOS toolbar jump.
Apply:
- <div className="flex h-screen w-full items-center justify-center bg-white"> + <div className="flex min-h-screen w-full items-center justify-center bg-white dark:bg-slate-900"> <div className="flex flex-col items-center space-y-4"> - <svg - className="h-12 w-12 animate-spin text-blue-500" + <svg + className="h-12 w-12 animate-spin text-blue-500" + role="status" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" > @@ - <p className="text-sm text-gray-600">Loading...</p> + <p className="text-sm text-gray-600 dark:text-gray-300"> + Loading... + <span className="sr-only">Please wait</span> + </p>frontend/pnpm-workspace.yaml (1)
1-9: pnpm-workspace.yaml appears mis-scoped/mis-specified; verify config keys and file location.
- pnpm-workspace.yaml typically defines packages/catalogs; build controls like “onlyBuiltDependencies”/“ignoredBuiltDependencies” are usually set in .npmrc (hyphenated: only-built-dependencies, never-built-dependencies) or package.json under "pnpm".
- Placing a workspace file under frontend/ may create an unintended nested workspace or be ignored depending on how installs run.
Action: Move these settings to .npmrc or package.json at the workspace root, and ensure correct key names.
frontend/src/components/MultiSearch.tsx (1)
244-247: Add an accessible name to the clear button.Provide an aria-label so screen readers announce the control.
Apply this diff:
- <button + <button + aria-label="Clear search" className="absolute top-1/2 right-2 -translate-y-1/2 rounded-full p-1 text-gray-400 hover:text-gray-600" onClick={handleClearSearch} >Optional: consider
type="search"for the input to gain native semantics and OS-provided clear affordances.frontend/src/app/about/page.tsx (1)
1-8: Confirm intentional simplification of About page content.This reduces the page to static copy; if prior data-driven sections existed, this could be a regression unrelated to the footer fix. Please confirm intent and that internal links/SEO aren’t impacted.
frontend/src/components/MetricsScoreCircle.tsx (1)
63-63: Respect prefers-reduced-motion for the alert pulse.Minor a11y improvement: disable pulse animation when users prefer reduced motion.
Apply this diff:
- <div className="absolute inset-0 animate-pulse rounded-full bg-red-400/20"></div> + <div className="absolute inset-0 animate-pulse motion-reduce:animate-none rounded-full bg-red-400/20"></div>frontend/src/components/TestCard.tsx (1)
8-10: Button should explicitly set type to avoid unintended form submitIf this card is ever placed inside a form, the button will implicitly be type="submit". Set type="button".
- <button className="bg-primary text-primary-foreground hover:bg-primary/80 rounded-md px-4 py-2"> + <button type="button" className="bg-primary text-primary-foreground hover:bg-primary/80 rounded-md px-4 py-2">frontend/src/app/page.tsx (1)
6-8: Avoid hardcoding framework version in UI copy“Next.js 15” may age quickly; prefer generic wording.
- <p className="text-muted-foreground text-lg"> - This is the Home Page built with Next.js 15 (App Router). - </p> + <p className="text-muted-foreground text-lg"> + This is the Home Page built with the Next.js App Router. + </p>schema/utils/schema_validators.py (2)
20-27: Return booleans from format checkers for clarityvalidators.* may return ValidationFailure (falsy) not strictly bool. Coerce explicitly.
@format_checker.checks("email") def check_email_format(value): - return validators.email(value) + return bool(validators.email(value)) @@ @format_checker.checks("uri") def check_uri_format(value): - return validators.url(value) + return bool(validators.url(value))
41-51: Optional: include instance path in errors for easier debuggingReturn e.message loses context. Consider including JSON path.
- except ValidationError as e: - return e.message + except ValidationError as e: + # Example: 'field "email": <message>' + return f'{e.json_path}: {e.message}'frontend/tailwind.config.ts (1)
62-70: Respect reduced motion preferences for infinite animationsOptional UX polish: disable the marquee animation when prefers-reduced-motion is set.
Add in globals.css or here via a utility; example (in CSS):
@media (prefers-reduced-motion: reduce) { .animate-scroll { animation: none !important; } }frontend/src/app/globals.css (2)
347-349: Use theme tokens for dropdown colors for light/dark parityHardcoded bg/text colors bypass your CSS vars. Prefer popover tokens.
-.dropdown-menu { - @apply absolute top-full left-0 mt-2 w-48 rounded-lg bg-white p-3 shadow-lg dark:bg-gray-800; +.dropdown-menu { + @apply absolute top-full left-0 mt-2 w-48 rounded-lg bg-popover text-popover-foreground p-3 shadow-lg; @apply invisible opacity-0 transition-all duration-200 ease-in-out; @apply flex flex-col space-y-2; }
177-187: Respect reduced motion for animationsDisable non-essential animations when users prefer reduced motion.
@keyframes fade-in-out { @@ .animate-fade-in-out { animation: fade-in-out 2s ease-in-out infinite; } + +@media (prefers-reduced-motion: reduce) { + .animate-fade-in-out, + .animate-spin, + .animate-fadeIn, + .animate-scaleIn { + animation: none !important; + } +}Also applies to: 109-111
frontend/lighthouserc.json (1)
1-19: Consider desktop emulation to reflect tall-screen behaviorTo better catch regressions related to tall viewports (e.g., >1100px), add desktop emulation. Also optional: pin a viewport height.
{ "ci": { "assert": { "assertions": { "categories:performance": ["warn", { "minScore": 0.9 }], "categories:accessibility": ["warn", { "minScore": 0.9 }], "categories:best-practices": ["warn", { "minScore": 0.9 }], "categories:seo": ["warn", { "minScore": 0.9 }] } }, "collect": { - "url": ["https://nest.owasp.dev/"], - "numberOfRuns": 3 + "url": ["https://nest.owasp.dev/"], + "numberOfRuns": 3, + "settings": { + "emulatedFormFactor": "desktop" + } }, "upload": { "target": "temporary-public-storage" } } }frontend/Makefile (1)
30-31: LGTM: direct LHCI CLI invocation pinned at a versionClear and reproducible. Optional: mirror desktop emulation locally to match CI.
- @cd frontend && npx -y @lhci/[email protected] autorun --collect.url=http://localhost:3000 + @cd frontend && npx -y @lhci/[email protected] autorun --collect.url=http://localhost:3000 --collect.settings.emulatedFormFactor=desktop.github/workflows/run-ci-cd.yaml (1)
500-504: Scope check: does this belong to the “footer sticks to bottom” PR?This adds/changes CI behavior (LHCI). If the intent is only the footer fix, consider a separate PR.
frontend/src/components/Footer.tsx (2)
12-18: Make Footer composable and avoid template string class mergeExtend native footer props and use clsx to safely merge classes; also pass through {...props}.
'use client' import { faChevronDown, faChevronUp } from '@fortawesome/free-solid-svg-icons' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { Button } from '@heroui/button' import Link from 'next/link' import { useState, useCallback } from 'react' +import clsx from 'clsx' import type { Section } from 'types/section' import { footerIcons } from 'utils/constants' import { footerSections } from 'utils/constants' import { ENVIRONMENT, RELEASE_VERSION } from 'utils/env.client' -// Add className to props -interface FooterProps { - className?: string -} +interface FooterProps extends React.ComponentPropsWithoutRef<'footer'> {} -export default function Footer({ className }: FooterProps) { +export default function Footer({ className, ...props }: FooterProps) { const [openSection, setOpenSection] = useState<string | null>(null) … - return ( - <footer className={`w-full border-t bg-slate-200 dark:bg-slate-800 ${className || ''}`}> + return ( + <footer className={clsx('w-full border-t bg-slate-200 dark:bg-slate-800', className)} {...props}>Also applies to: 25-26
33-36: Use valid, stable IDs in aria-controls/id (titles can contain spaces)Current IDs are derived from titles (e.g., "OWASP Nest"), which can include spaces and non-ideal characters for IDs/ARIA. Slugify to ensure validity and better a11y.
- aria-controls={`footer-section-${section.title}`} + aria-controls={`footer-section-${section.title.replace(/\s+/g, '-').toLowerCase()}`} … - id={`footer-section-${section.title}`} + id={`footer-section-${section.title.replace(/\s+/g, '-').toLowerCase()}`}Also applies to: 47-50
frontend/package.json (2)
68-71: De-duplicate tailwindcss-animate (declared in deps and devDeps)Keep it in devDependencies only (it’s a build-time plugin); remove from dependencies.
"dependencies": { … - "tailwind-merge": "^3.3.1", - "tailwindcss-animate": "^1.0.7" + "tailwind-merge": "^3.3.1" }, "devDependencies": { … "tailwindcss": "^4.1.12", "tailwindcss-animate": "^1.0.7",Also applies to: 116-118
5-13: Wire Tailwind config generation into the buildbuild:tailwind isn’t invoked by build. Add a prebuild hook so CI doesn’t miss it.
"scripts": { "build:tailwind": "ts-node --project tsconfig.tsnode.json scripts/generate-tailwind-config.ts", + "prebuild": "pnpm build:tailwind", "build": "next build", "build:turbo": "next build --turbo",Also applies to: 16-21
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
💡 Knowledge Base configuration:
- MCP integration is disabled by default for public repositories
- Jira integration is disabled by default for public repositories
- Linear integration is disabled by default for public repositories
You can enable these sources in your CodeRabbit configuration.
⛔ Files ignored due to path filters (4)
backend/poetry.lockis excluded by!**/*.lockcspell/pnpm-lock.yamlis excluded by!**/pnpm-lock.yamldocs/poetry.lockis excluded by!**/*.lockfrontend/pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (60)
.github/workflows/run-ci-cd.yaml(1 hunks).github/workflows/run-code-ql.yaml(2 hunks).pre-commit-config.yaml(1 hunks)backend/pyproject.toml(7 hunks)frontend/Makefile(1 hunks)frontend/lighthouserc.json(1 hunks)frontend/package.json(6 hunks)frontend/pnpm-workspace.yaml(1 hunks)frontend/postcss.config.js(1 hunks)frontend/src/app/about/layout.tsx(1 hunks)frontend/src/app/about/page.tsx(1 hunks)frontend/src/app/global-error.tsx(1 hunks)frontend/src/app/globals.css(9 hunks)frontend/src/app/layout.tsx(2 hunks)frontend/src/app/loading.tsx(1 hunks)frontend/src/app/page.tsx(1 hunks)frontend/src/app/snapshots/[id]/page.tsx(1 hunks)frontend/src/app/snapshots/page.tsx(1 hunks)frontend/src/components/Card.tsx(2 hunks)frontend/src/components/CardDetailsPage.tsx(1 hunks)frontend/src/components/Footer.tsx(3 hunks)frontend/src/components/GeneralCompliantComponent.tsx(1 hunks)frontend/src/components/Header.tsx(2 hunks)frontend/src/components/InfoBlock.tsx(1 hunks)frontend/src/components/IssueMetadata.tsx(1 hunks)frontend/src/components/ItemCardList.tsx(1 hunks)frontend/src/components/LoadingSpinner.tsx(1 hunks)frontend/src/components/LoginPageContent.tsx(1 hunks)frontend/src/components/LogoCarousel.tsx(3 hunks)frontend/src/components/MetricsScoreCircle.tsx(1 hunks)frontend/src/components/Modal.tsx(1 hunks)frontend/src/components/ModeToggle.tsx(1 hunks)frontend/src/components/ModuleCard.tsx(1 hunks)frontend/src/components/ModuleForm.tsx(1 hunks)frontend/src/components/MultiSearch.tsx(2 hunks)frontend/src/components/NavButton.tsx(1 hunks)frontend/src/components/NavDropDown.tsx(1 hunks)frontend/src/components/ProgramForm.tsx(1 hunks)frontend/src/components/RecentIssues.tsx(1 hunks)frontend/src/components/RecentReleases.tsx(1 hunks)frontend/src/components/RepositoriesCard.tsx(1 hunks)frontend/src/components/ScrollToTop.tsx(1 hunks)frontend/src/components/Search.tsx(1 hunks)frontend/src/components/SearchPageLayout.tsx(1 hunks)frontend/src/components/SingleModuleCard.tsx(1 hunks)frontend/src/components/SnapshotCard.tsx(1 hunks)frontend/src/components/TestCard.tsx(1 hunks)frontend/src/components/TopContributorsList.tsx(1 hunks)frontend/src/components/TruncatedText.tsx(1 hunks)frontend/src/components/UserCard.tsx(1 hunks)frontend/src/components/UserMenu.tsx(2 hunks)frontend/src/components/skeletons/ApiKeySkelton.tsx(3 hunks)frontend/src/components/skeletons/Card.tsx(2 hunks)frontend/src/sentry.server.config.ts(1 hunks)frontend/src/types/issue.ts(1 hunks)frontend/src/wrappers/provider.tsx(2 hunks)frontend/tailwind.config.ts(2 hunks)frontend/tsconfig.tsnode.json(1 hunks)package.json(1 hunks)schema/utils/schema_validators.py(1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-07-12T17:14:28.536Z
Learnt from: Rajgupta36
PR: OWASP/Nest#1717
File: frontend/src/app/mentorship/programs/[programKey]/edit/page.tsx:90-128
Timestamp: 2025-07-12T17:14:28.536Z
Learning: Both ProgramForm (programCard.tsx) and ModuleForm (mainmoduleCard.tsx) components already implement HTML validation using the `required` attribute on form fields. The browser's native validation prevents form submission and displays error messages when required fields are empty, eliminating the need for additional JavaScript validation before GraphQL mutations.
Applied to files:
frontend/src/components/ProgramForm.tsx
🧬 Code graph analysis (6)
frontend/src/sentry.server.config.ts (1)
frontend/src/utils/env.client.ts (1)
ENVIRONMENT(3-3)
frontend/src/components/UserCard.tsx (1)
backend/apps/mentorship/api/internal/nodes/mentor.py (2)
name(18-20)login(23-25)
frontend/src/components/IssueMetadata.tsx (3)
frontend/src/types/issue.ts (1)
Issue(3-20)frontend/src/utils/dateFormatter.ts (1)
formatDate(1-20)frontend/src/components/TruncatedText.tsx (1)
TruncatedText(3-45)
frontend/src/components/RecentIssues.tsx (2)
frontend/src/types/issue.ts (1)
Issue(3-20)frontend/src/components/IssueMetadata.tsx (1)
IssueMetadata(17-46)
frontend/src/components/Footer.tsx (2)
frontend/src/utils/constants.ts (1)
footerSections(52-104)frontend/src/types/section.ts (1)
Section(3-6)
frontend/src/app/layout.tsx (4)
frontend/src/wrappers/provider.tsx (1)
Providers(19-34)frontend/src/components/Header.tsx (1)
Header(20-248)frontend/src/utils/env.server.ts (1)
IS_GITHUB_AUTH_ENABLED(6-6)frontend/src/utils/env.client.ts (1)
GTM_ID(5-5)
🔇 Additional comments (47)
frontend/src/components/skeletons/ApiKeySkelton.tsx (1)
9-10: LGTM: Tailwind utility reordering onlyClass reordering doesn’t change behavior; rendering and dark-mode tokens remain identical.
Also applies to: 16-16, 18-21, 28-29, 34-35, 37-37, 56-56, 59-59, 62-62, 65-65, 68-68, 71-71, 82-82, 84-85, 87-88
frontend/src/components/skeletons/Card.tsx (2)
20-20: LGTM: container class reorderingOnly order changed; visuals and interactions unaffected.
60-60: LGTM: contributor avatar skeleton class order swapNo functional difference; styling remains equivalent.
frontend/src/components/SnapshotCard.tsx (1)
14-14: No-op Tailwind class reorder — OKReordering utilities here doesn’t change rendering. Looks good.
frontend/src/components/NavDropDown.tsx (1)
69-70: No-op Tailwind class reorder — OKPositioning is unchanged; fine to merge.
frontend/src/components/InfoBlock.tsx (1)
30-30: No-op Tailwind class reorder — OKNo functional change.
frontend/src/components/RepositoriesCard.tsx (1)
40-40: Class reordering is fine.No functional change from moving "flex" ahead of "h-46".
frontend/src/components/ModuleForm.tsx (1)
57-57: Class reordering is fine.No functional change; layout unaffected.
frontend/src/app/snapshots/[id]/page.tsx (1)
113-114: Class reordering is fine.No functional change; margins remain identical.
frontend/src/components/LoadingSpinner.tsx (1)
16-16: Class reordering is fine.Spinner behavior unchanged.
frontend/src/components/CardDetailsPage.tsx (1)
90-92: Whitespace-only change — OKNo functional impact. Safe to keep.
frontend/src/components/ItemCardList.tsx (1)
74-74: Class reorder only — OKNo behavior change.
frontend/src/components/Modal.tsx (1)
57-57: Class reorder only — OKNo functional impact on the Close button.
frontend/src/components/LoginPageContent.tsx (1)
65-65: Class reorder only — OKNo runtime or styling behavior change.
frontend/src/app/global-error.tsx (1)
43-43: No-op Tailwind class reordering — LGTM.frontend/src/components/RecentReleases.tsx (1)
67-67: No-op Tailwind class reordering — LGTM.frontend/src/components/SingleModuleCard.tsx (1)
82-82: Class order change is fine.Purely presentational reordering of Tailwind utilities; no behavior change.
frontend/src/components/GeneralCompliantComponent.tsx (1)
30-30: LGTM — order-only Tailwind tweak.No functional change; positioning remains centered.
frontend/src/components/ModuleCard.tsx (1)
77-77: LGTM — cosmetic class reordering.No impact on layout or behavior.
.github/workflows/run-code-ql.yaml (2)
56-56: Verified analyze action SHA matches intended upstream commit
SHA 96f518a34f7a870018057716cc4d7a5c014bd61c is a valid merge commit dated 2025-08-18T11:45:49Z in the github/codeql-action repo; no changes needed.
32-32: Verify and Align Pinned CodeQL Action VersionThe SHA 96f518a34f7a870018057716cc4d7a5c014bd61c exists upstream (commit date 2025-08-18) but no release tag (e.g. v3.29.10) points at it. If you meant to pin to the official v3.29.10 release, switch to
uses: github/codeql-action/[email protected](or its tag commit SHA); otherwise confirm that this specific merge commit won’t be removed.frontend/src/sentry.server.config.ts (1)
7-7: Sane fallback prevents runtime error when ENVIRONMENT is unsetUsing a default before
.toLowerCase()avoids crashes in local/dev. Looks good.frontend/src/components/UserMenu.tsx (2)
41-41: Class reordering only — no behavioral changeSafe Tailwind order tweak for the loading avatar.
90-91: Dropdown positioning class order change is harmlessNo functional impact; render and A11y attributes remain intact.
frontend/src/components/TopContributorsList.tsx (1)
57-57: Tailwind class reorder is non-functionalNo change to layout/overflow behavior for truncated contributor names.
frontend/src/components/Header.tsx (3)
56-56: Header container class order shuffleNo change to stacking or positioning; safe.
150-152: Mobile menu wrapper class order shuffleNo runtime/visual regression expected; same utilities preserved.
154-155: Padding order swap onlyPurely cosmetic; fine to merge.
frontend/src/components/Search.tsx (4)
73-74: Icon classes reorderedNo effect on positioning; OK.
81-82: Input classes reorderedNo behavioral changes; focus/ring logic unchanged.
85-90: Clear button classes reorderedNo functional change; event handling intact.
69-96: Invert loading conditional UI currently shows the search input when!isLoadedand the<Skeleton>whenisLoaded. IfisLoadedmeans “ready,” swap these branches (or rename the flag to match its behavior).frontend/src/components/Card.tsx (2)
32-32: LGTM: class order tweak on container
No behavior change; safe.
57-57: LGTM: title utility reordering
No behavior change; safe.frontend/postcss.config.js (1)
3-5: Verified Tailwind PostCSS plugin installation and version alignment
@tailwindcss/postcss@^4.1.12 aligns with tailwindcss@^4.1.12 and autoprefixer@^10.4.21 is present.frontend/src/app/loading.tsx (1)
1-30: Scope check: does this address the footer-sticks-to-bottom objective?The PR description mentions updating
layout.tsxwithflex min-h-screen flex-col, but that change isn’t visible here. Please confirmapp/layout.tsxalso setsdisplay: flexandmin-h-screen, and that your<main>usesflex-1, so the footer reliably anchors at the bottom during loading on tall screens.frontend/src/app/about/layout.tsx (1)
1-4: Verify removal of route-level metadata is intentional and aligned with footer fix scope.Dropping the About metadata shifts SEO/OpenGraph to global defaults. If About had custom title/OG before, confirm
app/layout.tsxnow covers it. Also, since this PR’s objective is footer stickiness, please confirm this change isn’t scope creep.frontend/src/components/MultiSearch.tsx (1)
231-233: LGTM: class reordering is a no-op.No behavioral change; safe.
Also applies to: 240-241, 244-249, 252-253
frontend/src/components/MetricsScoreCircle.tsx (1)
54-54: LGTM: Tailwind class reordering only.No functional changes.
Also applies to: 57-57, 58-58, 63-63
frontend/src/components/UserCard.tsx (1)
41-61: Class reordering is no-op; safe to mergeStyling order changes don’t affect rendering. Looks good.
frontend/src/components/LogoCarousel.tsx (1)
25-26: Class reordering only; no functional diffsNo behavior change; safe.
Also applies to: 56-63, 74-75
frontend/src/app/page.tsx (1)
4-8: Verify sticky-footer classes in layout and footer
Ensure the root wrapper infrontend/src/app/layout.tsxincludesmin-h-screen flex flex-col(or equivalent), and that your<footer>element hasmt-autoto stay pinned to the bottom.frontend/src/app/globals.css (1)
225-227: Verify license compliance: hiding map attributionsHiding .leaflet-control-attribution may violate your tile provider/OSM terms.
If needed, restyle instead of hiding, or render custom attributions per provider terms.
frontend/tsconfig.tsnode.json (1)
1-10: LGTMConfig is tight and scoped to the generator script.
frontend/src/components/RecentIssues.tsx (2)
20-21: LGTM: clear visual emphasisIcon styling reads well and remains accessible.
26-27: Good reuse via IssueMetadata; verify parent is a Client ComponentIf the child (IssueMetadata) uses Next hooks, ensure an ancestor has "use client", or the child declares it.
frontend/src/app/layout.tsx (1)
67-75: LGTM: flex layout fixes the sticky footerAdding flex min-h-screen flex-col on body and wrapping content in
correctly pins the footer to the bottom across tall viewports and during loading.
| authors = [ "Arkadii Yakovets <[email protected]>" ] | ||
| readme = "README.md" | ||
|
|
||
| packages = [ { include = "apps" } ] | ||
| packages = [ { include = "apps" } ] | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Duplicate keys in [tool.poetry] and [tool.poetry.dependencies] break TOML parsing
Repeated authors, packages, and django-storages will cause parse errors.
-authors = [ "Arkadii Yakovets <[email protected]>" ]
-
-packages = [ { include = "apps" } ]
+ # (keep a single authors key above)
+ # (keep a single packages key below)
-django-storages = { extras = [ "s3" ], version = "^1.14.4" }
+ # (remove duplicate; keep one django-storages entry)Also applies to: 25-26
🤖 Prompt for AI Agents
In backend/pyproject.toml around lines 10 to 15 (and also lines 25 to 26), there
are duplicate keys (authors, packages and a duplicate dependency entry such as
django-storages) which will break TOML parsing; remove the repeated entries so
each key appears only once: consolidate authors into a single authors = [...]
entry, keep a single packages = [...] entry, and ensure each dependency is
listed only once in [tool.poetry.dependencies] (delete or merge the duplicate
dependency line), then run a TOML validator to confirm the file parses.
| line-length = 99 | ||
| lint.select = [ "ALL" ] | ||
| lint.extend-select = [ "I" ] | ||
| lint.ignore = [ | ||
| "ANN", # https://docs.astral.sh/ruff/rules/#flake8-annotations-ann/ | ||
| "ARG002", # https://docs.astral.sh/ruff/rules/unused-method-argument/ | ||
| "C901", # https://docs.astral.sh/ruff/rules/complex-structure/ | ||
| "COM812", # https://docs.astral.sh/ruff/rules/missing-trailing-comma/ | ||
| "D407", # https://docs.astral.sh/ruff/rules/missing-dashed-underline-after-section/ | ||
| "DJ012", # https://docs.astral.sh/ruff/rules/django-unordered-body-content-in-model/ | ||
| "FIX002", # https://docs.astral.sh/ruff/rules/line-contains-todo/ | ||
| "PLC0415", # https://docs.astral.sh/ruff/rules/import-outside-top-level/ | ||
| "PLR0912", # https://docs.astral.sh/ruff/rules/too-many-branches/ | ||
| "PLR0913", # https://docs.astral.sh/ruff/rules/too-many-arguments/ | ||
| "PLR0915", # https://docs.astral.sh/ruff/rules/too-many-statements/ | ||
| "RUF012", # https://docs.astral.sh/ruff/rules/mutable-class-default/ | ||
| "TD003", # https://docs.astral.sh/ruff/rules/missing-todo-link/ | ||
| ] | ||
| lint.per-file-ignores."**/__init__.py" = [ | ||
| "D104", # https://docs.astral.sh/ruff/rules/undocumented-public-package/ | ||
| "F401", # https://docs.astral.sh/ruff/rules/unused-import/ | ||
| ] | ||
| lint.per-file-ignores."**/management/commands/*.py" = [ | ||
| "D101", # https://docs.astral.sh/ruff/rules/undocumented-public-class/ | ||
| "D102", # https://docs.astral.sh/ruff/rules/undocumented-public-method/ | ||
| "T201", # https://docs.astral.sh/ruff/rules/print/ | ||
| ] | ||
| lint.per-file-ignores."**/migrations/*.py" = [ | ||
| "D100", # https://docs.astral.sh/ruff/rules/undocumented-public-module/ | ||
| "D101", # https://docs.astral.sh/ruff/rules/undocumented-public-class/ | ||
| "D104", # https://docs.astral.sh/ruff/rules/undocumented-public-package/ | ||
| "E501", # https://docs.astral.sh/ruff/rules/line-too-long/ | ||
| "RUF012", # https://docs.astral.sh/ruff/rules/mutable-class-default/ | ||
| ] | ||
| lint.per-file-ignores."**/models/*.py" = [ | ||
| "D106", # https://docs.astral.sh/ruff/rules/undocumented-public-nested-class/ | ||
| ] | ||
| lint.per-file-ignores."**/rest/v1/*.py" = [ | ||
| "ARG001", # https://docs.astral.sh/ruff/rules/unused-function-argument/ | ||
| "B008", # https://docs.astral.sh/ruff/rules/function-call-in-default-argument/ | ||
| ] | ||
| lint.per-file-ignores."**/settings/*.py" = [ | ||
| "RUF012", # https://docs.astral.sh/ruff/rules/mutable-class-default/ | ||
| ] | ||
| lint.per-file-ignores."**/tests/**/*.py" = [ | ||
| "D100", # https://docs.astral.sh/ruff/rules/undocumented-public-module/ | ||
| "D101", # https://docs.astral.sh/ruff/rules/undocumented-public-class/ | ||
| "D102", # https://docs.astral.sh/ruff/rules/undocumented-public-method/ | ||
| "D103", # https://docs.astral.sh/ruff/rules/undocumented-public-function/ | ||
| "D107", # https://docs.astral.sh/ruff/rules/undocumented-public-init/ | ||
| "PLR2004", # https://docs.astral.sh/ruff/rules/magic-value-comparison/ | ||
| "RUF012", # https://docs.astral.sh/ruff/rules/mutable-class-default/ | ||
| "S101", # https://docs.astral.sh/ruff/rules/assert/ | ||
| "SLF001", # https://docs.astral.sh/ruff/rules/private-member-access/ | ||
| ] | ||
| [tool.ruff] | ||
| target-version = "py313" | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Second [tool.ruff] table duplicates the first; remove one
Having two [tool.ruff] blocks with overlapping keys is invalid.
-[tool.ruff]
-target-version = "py313"
-
-line-length = 99
-lint.select = [ "ALL" ]
-lint.extend-select = [ "I" ]
-lint.ignore = [
- "ANN",
- "ARG002",
- "C901",
- "COM812",
- "D407",
- "DJ012",
- "FIX002",
- "PLC0415",
- "PLR0912",
- "PLR0913",
- "PLR0915",
- "RUF012",
- "TD003",
-]
-lint.per-file-ignores."**/__init__.py" = [ "D104", "F401" ]
-lint.per-file-ignores."**/management/commands/*.py" = [ "D101", "D102", "T201" ]
-lint.per-file-ignores."**/migrations/*.py" = [ "D100", "D101", "D104", "E501", "RUF012" ]
-lint.per-file-ignores."**/models/*.py" = [ "D106" ]
-lint.per-file-ignores."**/rest/v1/*.py" = [ "ARG001", "B008" ]
-lint.per-file-ignores."**/settings/*.py" = [ "RUF012" ]
-lint.per-file-ignores."**/tests/**/*.py" = [ "D100","D101","D102","D103","D107","PLR2004","RUF012","S101","SLF001" ]Committable suggestion skipped: line range outside the PR's diff.
🤖 Prompt for AI Agents
In backend/pyproject.toml around lines 70 to 127, there is a duplicate
[tool.ruff] table which conflicts with the earlier [tool.ruff] section; remove
the second duplicate block (or merge any unique keys from it into the first
[tool.ruff] section) so that only a single [tool.ruff] table remains in
pyproject.toml and keys are not repeated.
| "--cov-config=pyproject.toml", | ||
| "--cov-fail-under=80", | ||
| "--cov-precision=2", | ||
| "--cov-report=term-missing", | ||
| "--cov=.", | ||
| "--dist=loadscope", | ||
| "--durations-min=1", | ||
| "--durations=5", | ||
| "--no-cov-on-fail", | ||
| "--numprocesses=auto", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
pytest addopts and filterwarnings duplicated; keep a single set
Dupes increase noise and may confuse tooling.
"--numprocesses=auto",
- "--cov-config=pyproject.toml",
- "--cov-fail-under=80",
- "--cov-precision=2",
- "--cov-report=term-missing",
- "--cov=.",
- "--dist=loadscope",
- "--durations-min=1",
- "--durations=5",
- "--no-cov-on-fail",
- "--numprocesses=auto",
]
@@
- "ignore::DeprecationWarning:pytest_cov",
- "ignore::DeprecationWarning:xdist",
- "ignore::django.conf.RemovedInDjango60Warning:django",
- "ignore::pydantic.warnings.PydanticDeprecatedSince20",Also applies to: 214-218
🤖 Prompt for AI Agents
In backend/pyproject.toml around lines 198-207 (and also duplicated at 214-218),
the pytest addopts and filterwarnings entries are duplicated; open the file,
locate both blocks and remove the redundant copy so each pytest option appears
only once, keeping a single canonical set (merge any differing options into that
one set), and ensure flags like --cov, --dist, --numprocesses, and
filterwarnings are present only in that single block.
| [tool.coverage.run] | ||
| branch = true | ||
| omit = [ | ||
| "__init__.py", | ||
| "**/admin.py", | ||
| "**/apps.py", | ||
| "**/migrations/*", | ||
| "**/mentorship/*", # TODO: work in progress | ||
| "manage.py", | ||
| "settings/*", | ||
| "tests/*", | ||
| "wsgi.py", | ||
| ] | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Duplicate [tool.coverage.run] block
Only one coverage run block should exist.
-[tool.coverage.run]
-branch = true
-omit = [
- "__init__.py",
- "**/admin.py",
- "**/apps.py",
- "**/migrations/*",
- "**/mentorship/*", # TODO: work in progress
- "manage.py",
- "settings/*",
- "tests/*",
- "wsgi.py",
-]📝 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.
| [tool.coverage.run] | |
| branch = true | |
| omit = [ | |
| "__init__.py", | |
| "**/admin.py", | |
| "**/apps.py", | |
| "**/migrations/*", | |
| "**/mentorship/*", # TODO: work in progress | |
| "manage.py", | |
| "settings/*", | |
| "tests/*", | |
| "wsgi.py", | |
| ] | |
| # (Removed duplicate [tool.coverage.run] block) |
🤖 Prompt for AI Agents
In backend/pyproject.toml around lines 235 to 248 there is a duplicate
[tool.coverage.run] block; remove this redundant block (or merge its omit
entries into the single canonical [tool.coverage.run] section elsewhere in the
file) so that only one [tool.coverage.run] table exists, combining any unique
settings/omit patterns into that single section.
| ignore_missing_imports = true | ||
| mypy_path = "backend" | ||
| plugins = [ "strawberry.ext.mypy_plugin" ] | ||
| plugins = [ "strawberry.ext.mypy_plugin" ] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Duplicate mypy plugin and overrides
Remove the extra plugin line and duplicate override block.
-plugins = [ "strawberry.ext.mypy_plugin" ]
@@
-[[tool.mypy.overrides]]
-disable_error_code = [ "attr-defined" ]
-module = [ "apps.*.models.mixins.*", "apps.*.admin.*" ]Also applies to: 259-266
🤖 Prompt for AI Agents
In backend/pyproject.toml around lines 254 (and also duplicate override block at
lines 259-266), there are duplicate entries for the mypy plugin and a duplicated
override block; remove the extra plugins = [ "strawberry.ext.mypy_plugin" ] line
and delete the redundant override block so each plugin and override appears only
once, leaving a single plugins declaration and a single override block as the
authoritative configuration.
| <h3 className="max-w-[250px] text-lg font-semibold text-balance text-gray-900 group-hover:text-blue-400 sm:text-xl dark:text-white"> | ||
| <p>{title}</p> | ||
| </h3> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Fix invalid heading markup (h3 wrapping p)
A heading element must contain phrasing content; a block-level p inside h3 is invalid and hurts a11y/semantics. Inline the title directly.
- <h3 className="max-w-[250px] text-lg font-semibold text-balance text-gray-900 group-hover:text-blue-400 sm:text-xl dark:text-white">
- <p>{title}</p>
- </h3>
+ <h3 className="max-w-[250px] text-lg font-semibold text-balance text-gray-900 group-hover:text-blue-400 sm:text-xl dark:text-white">
+ {title}
+ </h3>📝 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.
| <h3 className="max-w-[250px] text-lg font-semibold text-balance text-gray-900 group-hover:text-blue-400 sm:text-xl dark:text-white"> | |
| <p>{title}</p> | |
| </h3> | |
| <h3 className="max-w-[250px] text-lg font-semibold text-balance text-gray-900 group-hover:text-blue-400 sm:text-xl dark:text-white"> | |
| {title} | |
| </h3> |
🤖 Prompt for AI Agents
In frontend/src/components/SnapshotCard.tsx around lines 14 to 16, the h3
currently wraps a block-level <p> which is invalid HTML; remove the <p> and
inline the title directly inside the h3 (keep the existing className and
interpolation, e.g. replace <p>{title}</p> with {title}) so the heading contains
phrasing content only and preserves semantics/accessibility.
| // 🚫 Apollo temporarily disabled | ||
| // import { ApolloProvider } from '@apollo/client' | ||
| // import apolloClient from 'utils/helpers/apolloClient' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Verification agent
🧩 Analysis chain
Apollo removal: verify no remaining dependencies
Without ApolloProvider, any useQuery/useApolloClient calls will throw. Please verify no Apollo usage remains.
Also applies to: 26-28
🏁 Script executed:
#!/bin/bash
# Find Apollo usage across the repo
rg -nP "(from\s+['\"]@apollo/client['\"]|useQuery\s*\(|useMutation\s*\(|ApolloProvider|gql`)" -C2Length of output: 116
🏁 Script executed:
#!/bin/bash
# Find Apollo usage across the repo with corrected regex quoting
patterns=(
"from\\s+[\"']@apollo/client[\"']"
"useQuery\\s*\\("
"useMutation\\s*\\("
"ApolloProvider"
"gql\`"
)
for p in "${patterns[@]}"; do
echo "Searching for pattern: $p"
rg -nP "$p" -C2 || true
doneLength of output: 54591
Re-enable ApolloProvider or remove all Apollo hook usages: Numerous useQuery/useMutation/useApolloClient calls remain across pages (e.g. frontend/src/app/**) and components (e.g. ModuleForm.tsx, useLogout.ts), so disabling ApolloProvider (provider.tsx lines 9–11 & 26–28) will break the app.
🤖 Prompt for AI Agents
In frontend/src/wrappers/provider.tsx around lines 9–11 and 26–28, the
ApolloProvider import and usage were commented out which will break
components/pages that call useQuery/useMutation/useApolloClient; restore the two
imports (ApolloProvider from '@apollo/client' and apolloClient from
'utils/helpers/apolloClient') and re-wrap the app children with <ApolloProvider
client={apolloClient}>...</ApolloProvider> in the component return, ensuring the
import paths are correct and the apolloClient instance is initialized before
rendering.
| background: 'hsl(var(--background))', | ||
| foreground: 'hsl(var(--foreground))', | ||
| border: 'hsl(var(--border))', | ||
| text: 'hsl(var(--text))', | ||
| 'owasp-blue': '#98AFC7', | ||
| card: { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Verification agent
🧩 Analysis chain
Undefined CSS var --text; alias or remove to avoid invalid hsl(var(--text))
globals.css doesn’t define --text. This will yield invalid color at runtime.
colors: {
background: 'hsl(var(--background))',
foreground: 'hsl(var(--foreground))',
border: 'hsl(var(--border))',
- text: 'hsl(var(--text))',
+ // Alias to foreground to preserve any usage of text-*
+ text: 'hsl(var(--foreground))',
'owasp-blue': '#98AFC7',Run to confirm no stray --text token is defined and to find any text-text usages:
🏁 Script executed:
#!/bin/bash
rg -nP '\-\-text\s*:' frontend/src/app/globals.css || true
rg -n 'text-text' frontend || trueLength of output: 639
Alias undefined CSS variable --text in Tailwind config Replace text: 'hsl(var(--text))' with text: 'hsl(var(--foreground))' so existing .text-text classes (used in four components) yield valid colors at runtime.
🤖 Prompt for AI Agents
In frontend/tailwind.config.ts around lines 14 to 19, the Tailwind color alias
uses an undefined CSS variable `--text` (text: 'hsl(var(--text))'), causing
`.text-text` classes to produce invalid colors; change that entry to reference
the existing foreground variable (text: 'hsl(var(--foreground))') so
`.text-text` resolves to a valid color at runtime.
| { | ||
| "name": "nest-milestones", | ||
| "version": "1.0.0", | ||
| "description": "<div align=\"center\">", | ||
| "main": "index.js", | ||
| "directories": { | ||
| "doc": "docs" | ||
| }, | ||
| "scripts": { | ||
| "test": "echo \"Error: no test specified\" && exit 1" | ||
| }, | ||
| "repository": { | ||
| "type": "git", | ||
| "url": "git+https://github.com/OUMIMANDAL/Nest-milestones.git" | ||
| }, | ||
| "keywords": [], | ||
| "author": "", | ||
| "license": "ISC", | ||
| "bugs": { | ||
| "url": "https://github.com/OUMIMANDAL/Nest-milestones/issues" | ||
| }, | ||
| "homepage": "https://github.com/OUMIMANDAL/Nest-milestones#readme", | ||
| "dependencies": { | ||
| "next": "^15.4.6", | ||
| "react": "^19.1.1", | ||
| "react-dom": "^19.1.1" | ||
| } | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Verification agent
🧩 Analysis chain
Remove root package.json — unrelated app scaffold, wrong repo metadata, and conflicting Next/React versions
This introduces a second app at repo root with Next 15/React 19 and links to a different GitHub project. It’s unrelated to fixing the footer and risks tooling conflicts.
Please drop this file from the PR. If you intended a separate example app, move it to its own repo/PR.
To confirm no stray manifests remain:
🏁 Script executed:
#!/bin/bash
# List all package.json files (excluding node_modules)
fd -a package.json -E node_modulesLength of output: 148
🏁 Script executed:
#!/bin/bash
# Inspect the first 20 lines of cspell and frontend package.json
head -n 20 cspell/package.json
echo "---- frontend/package.json ----"
head -n 20 frontend/package.jsonLength of output: 1455
🏁 Script executed:
#!/bin/bash
# Inspect the first 30 lines of root package.json
head -n 30 package.jsonLength of output: 679
Remove root package.json
This manifest for “nest-milestones” (Next 15/React 19) is unrelated to the repo’s frontend and will conflict with existing tooling; delete it or move it to its own repository.
🤖 Prompt for AI Agents
package.json lines 1-28: This root package.json belongs to an unrelated
Next/React project and will conflict with the repository; remove the file from
the repo (git rm package.json) or move it into its own repository, then update
or remove any references to it in CI/CD, root-level scripts, workspace configs,
and README; if you move it, preserve commit history (git mv to new repo or
export), and ensure the repository root has the correct package.json for this
project (or none) to prevent tooling conflicts.
| return Registry().with_resource( | ||
| COMMON_JSON, | ||
| Resource.from_contents( | ||
| json.load( | ||
| Path.open(f"{Path(__file__).parent.parent.resolve()}/{COMMON_JSON}"), | ||
| ), | ||
| ), | ||
| ) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix file loading: Path.open misused; use Path().open or importlib.resources
Path.open is an instance method; calling it as a static with a string will fail. Also wrap IO in a context manager.
Apply:
-def get_registry():
- return Registry().with_resource(
- COMMON_JSON,
- Resource.from_contents(
- json.load(
- Path.open(f"{Path(__file__).parent.parent.resolve()}/{COMMON_JSON}"),
- ),
- ),
- )
+def get_registry():
+ common_path = Path(__file__).resolve().parent.parent / COMMON_JSON
+ with common_path.open("r", encoding="utf-8") as f:
+ common = json.load(f)
+ return Registry().with_resource(
+ COMMON_JSON,
+ Resource.from_contents(common),
+ )📝 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.
| return Registry().with_resource( | |
| COMMON_JSON, | |
| Resource.from_contents( | |
| json.load( | |
| Path.open(f"{Path(__file__).parent.parent.resolve()}/{COMMON_JSON}"), | |
| ), | |
| ), | |
| ) | |
| def get_registry(): | |
| common_path = Path(__file__).resolve().parent.parent / COMMON_JSON | |
| with common_path.open("r", encoding="utf-8") as f: | |
| common = json.load(f) | |
| return Registry().with_resource( | |
| COMMON_JSON, | |
| Resource.from_contents(common), | |
| ) |
🤖 Prompt for AI Agents
In schema/utils/schema_validators.py around lines 31 to 38, the code incorrectly
calls Path.open as a static method with a string and does not use a context
manager; replace that with a proper Path object for the file (e.g.
Path(__file__).parent.parent / COMMON_JSON) and open it with a context manager
(with path.open('r') as f: json.load(f)), or alternatively load the resource via
importlib.resources.open_text, then pass the loaded JSON to
Resource.from_contents; ensure file handles are closed by using the with block.


This PR fixes the homepage container flexibility issue:
flex min-h-screen flex-colinlayout.tsxpackage.json, scripts, or lock filesFixes #2033