Skip to content

Profile page header#1863

Merged
ragnep merged 19 commits intomainfrom
profile-page-header
Feb 3, 2026
Merged

Profile page header#1863
ragnep merged 19 commits intomainfrom
profile-page-header

Conversation

@ragnep
Copy link
Copy Markdown
Contributor

@ragnep ragnep commented Jan 29, 2026

Summary by CodeRabbit

  • New Features

    • Banner editor with image upload, preview, image/gradient tabs, and inline validation.
    • Reusable image upload/validation UI (drag‑and‑drop, 2MB limit, accepted formats) exposed across settings.
    • About section adds "See more"/"See less" for long statements.
  • Style

    • Adjusted responsive paddings, header layout, avatar/banner sizing, button colors, and modal backdrop blur.
    • Name/header layout updated for improved responsive presentation.
  • Tests

    • Component tests updated to exercise expanded name props (level/profile-enabled).

Signed-off-by: ragnep <ragneinfo@gmail.com>
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jan 29, 2026

Caution

Review failed

The pull request is closed.

📝 Walkthrough

Walkthrough

Adds image upload utilities and inputs, introduces banner helpers to distinguish image URLs vs hex colors, restructures the user page header layout (banner, pfp, name variants, follow/stats/about blocks), updates several UI/styling choices across header and settings components, and adjusts tests to exercise the expanded name API.

Changes

Cohort / File(s) Summary
Image upload hook & inputs
components/user/settings/useImageUpload.ts, components/user/settings/UserSettingsImgSelectFile.tsx, components/user/settings/UserSettingsBannerImageInput.tsx
New useImageUpload hook and updated image-select components: centralized validation (2MB), drag/drop handlers, error/shake state, preview support, and unified onFileChange/setFile flows using Next.js Image.
Banner helpers
helpers/profile-banner.helpers.ts
New helpers: isBannerImageUrl(), getBannerImageUrl(), getBannerColorValue() to detect banner image URLs and validate hex color strings.
Header layout & banner flow
components/user/user-page-header/UserPageHeaderClient.tsx, components/user/user-page-header/banner/UserPageHeaderBanner.tsx, components/user/user-page-header/banner/UserPageHeaderEditBanner.tsx
Reorganized header layout (separate banner, PFP, name/title/meta, follow area), derives banner colors via helper, conditional image vs gradient banner rendering, and refactored banner edit modal with image/gradient modes and upload integration.
Name API & profile-enabled consolidation
components/user/user-page-header/name/UserPageHeaderName.tsx, components/user/user-page-header/UserPageHeaderProfileEnabledAt.tsx, __tests__/components/user/user-page-header/name/UserPageHeaderName.test.tsx
UserPageHeaderName API extended to accept level, profileEnabledAt, and variant and now renders title/meta variants; removed UserPageHeaderProfileEnabledAt; tests updated to pass new props.
PFP & wrapper adjustments
components/user/user-page-header/pfp/UserPageHeaderPfp.tsx, components/user/user-page-header/pfp/UserPageHeaderPfpWrapper.tsx
Reduced displayed PFP size, updated wrapper/overlay classes and structure, and adjusted absent-PFP fallback styling.
About edits & statement behavior
components/user/user-page-header/about/UserPageHeaderAbout.tsx, components/user/user-page-header/about/UserPageHeaderAboutEdit.tsx, components/user/user-page-header/about/UserPageHeaderAboutStatement.tsx
Reworked statement layout and edit affordance, moved edit button, breakpoint tweaks for textarea, and added client-side expand/collapse with "See more/less" toggle.
Profile utilities & propagation
helpers/ProfileHelpers.ts, components/waves/CreateDropContent.tsx, components/waves/drops/reaction-utils.ts
Replaced direct banner values with getBannerColorValue() when deriving banner color fields for consolidated profile and wave/drop utilities.
Layout, styling, and small UI tweaks
components/user/layout/UserPageLayout.tsx, components/user/utils/UserFollowBtn.tsx, components/user/utils/level/UserLevel.tsx, components/user/utils/stats/UserStatsRow.tsx, components/user/user-page-header/name/classification/UserPageClassificationWrapper.tsx, components/user/user-page-header/name/classification/UserPageHeaderEditClassification.tsx, components/user/user-page-header/name/UserPageHeaderEditName.tsx, components/user/user-page-header/pfp/UserPageHeaderEditPfp.tsx, components/user/user-page-header/stats/UserPageHeaderStats.tsx
Responsive padding changes, follow button color update, reduced level ring thickness, stats typography/color updates, modal backdrop blur tweaks, classification wrapper class tweak, and other presentation adjustments.
Image validation exports
components/user/settings/imageValidation.ts
New ACCEPTED_FORMATS_DISPLAY and isValidImageType exports for centralized image-type validation used by upload flows.

Sequence Diagram(s)

sequenceDiagram
    participant User as User
    participant UI as BannerImageInput / ImgSelect
    participant Hook as useImageUpload
    participant Header as UserPageHeaderClient
    participant Upload as multiPartUpload
    participant API as ProfileMutation/API

    User->>UI: drag/select file
    UI->>Hook: onFileChange(file)
    Hook->>Hook: validate type & size
    alt invalid
        Hook-->>UI: error + shake
        UI-->>User: show validation error
    else valid
        Hook-->>Header: setFile(file)
        Header-->>UI: show preview
        User->>Header: save/submit banner change
        Header->>Upload: multiPartUpload(file)
        Upload-->>Header: uploadedImageUrl
        Header->>API: mutate profile (banner_1 = uploadedImageUrl or gradient)
        API-->>Header: mutation result
        Header-->>User: update UI with new banner
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Poem

🐰 A rabbit hopped in with a file and a cheer,
Dragged, dropped, previewed — colors and photos appear,
Names split to title and meta, tidy and bright,
Banners choose image or hex in gentle light,
Hop, click, save — the profile feels just right!

🚥 Pre-merge checks | ✅ 1 | ❌ 2
❌ Failed checks (1 warning, 1 inconclusive)
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.
Title check ❓ Inconclusive The title 'Profile page header' is vague and does not convey specific information about the changeset's primary modifications. Use a more descriptive title that captures the main changes, such as 'Refactor user profile header layout with banner image support and responsive styling' or 'Update profile header with banner colors, image upload, and improved name display'.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch profile-page-header

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 and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In `@components/user/settings/UserSettingsBannerImageInput.tsx`:
- Around line 52-69: The drag state can remain true after a file is dropped;
modify handleDrop to call setDragging(false) (before/after invoking
onFileChange) so the UI highlight is cleared on drop; locate the handleDrop
function and add setDragging(false) alongside the existing
e.preventDefault/e.stopPropagation and onFileChange usage (handleDrag already
handles drop, but ensure handleDrop explicitly resets dragging).

In `@components/user/user-page-header/about/UserPageHeaderAbout.tsx`:
- Around line 52-61: The outer <button> in UserPageHeaderAbout.tsx wraps the
UserPageHeaderAboutStatement component (which itself renders a "See more"
<button>), creating nested interactive elements; replace the outer element with
a non-button wrapper (e.g., a div or span) that preserves button semantics by
keeping the onClick handler (onEditClick), aria-label, className, and adding
role="button", tabIndex={0}, and an onKeyDown handler that triggers onEditClick
for Enter/Space so keyboard users still activate it; target the wrapper around
UserPageHeaderAboutStatement in UserPageHeaderAbout.tsx and keep
UserPageHeaderAboutStatement unchanged.

In `@components/user/user-page-header/name/UserPageHeaderName.tsx`:
- Around line 41-43: profileEnabledAt may be a malformed string so new
Date(profileEnabledAt).getTime() can return NaN and produce "Invalid Date";
update the logic that computes profileEnabledLabel (the const
profileEnabledLabel) to first parse the timestamp (e.g., Date.parse or new
Date(profileEnabledAt).getTime()) and guard with a finite check
(Number.isFinite) before calling formatTimestampToMonthYear; if the parsed
timestamp is not finite, set profileEnabledLabel to null so
formatTimestampToMonthYear is only invoked with a valid numeric timestamp.
🧹 Nitpick comments (1)
components/user/user-page-header/about/UserPageHeaderAboutStatement.tsx (1)

20-43: Avoid character-count heuristics for toggle visibility.
Line 20’s length check can miss real truncation on narrow screens, leaving clamped text with no way to expand. Consider detecting actual overflow instead.

🔧 Possible refactor to compute toggle visibility from overflow
-import { useState } from "react";
+import { useLayoutEffect, useRef, useState } from "react";
@@
-  const showToggle = statement.statement_value.length > 240;
+  const contentRef = useRef<HTMLDivElement | null>(null);
+  const [showToggle, setShowToggle] = useState(false);
+  useLayoutEffect(() => {
+    if (expanded) return;
+    const el = contentRef.current;
+    if (!el) return;
+    const compute = () => {
+      setShowToggle(el.scrollHeight > el.clientHeight + 1);
+    };
+    compute();
+    const ro = new ResizeObserver(compute);
+    ro.observe(el);
+    return () => ro.disconnect();
+  }, [statement.statement_value, expanded]);
@@
-      <div
+      <div
+        ref={contentRef}
         className={`tw-mb-0 tw-text-md tw-text-zinc-300 tw-leading-relaxed tw-font-normal tw-whitespace-pre-line ${clampClass}`}
       >

Comment thread components/user/settings/UserSettingsBannerImageInput.tsx Outdated
Comment thread components/user/user-page-header/about/UserPageHeaderAbout.tsx
Comment thread components/user/user-page-header/name/UserPageHeaderName.tsx
Signed-off-by: ragnep <ragneinfo@gmail.com>
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In `@components/user/user-page-header/about/UserPageHeaderAbout.tsx`:
- Around line 50-53: The className in the UserPageHeaderAbout component
currently concatenates without a space so when canEdit is true it yields
"tw-gap-2tw-group" and the group styles don't apply; update the className
expression around the div (the JSX that builds the class string using canEdit)
to include a leading space before "tw-group" (e.g., change the conditional from
? "tw-group" : "" to ? " tw-group" : "") so the final class list is properly
spaced and allows group hover/focus behavior.

In `@components/user/user-page-header/banner/UserPageHeaderBanner.tsx`:
- Around line 36-44: The inline style for backgroundImage in
UserPageHeaderBanner is interpolating scaledBannerUrl directly which can break
CSS or allow injection; update the backgroundImage construction to sanitize the
value with CSS.escape(scaledBannerUrl) before inserting into the url() so the
inline style uses an escaped URL (refer to the backgroundImage property and the
scaledBannerUrl variable in UserPageHeaderBanner.tsx).
🧹 Nitpick comments (4)
components/user/user-page-header/pfp/UserPageHeaderPfpWrapper.tsx (1)

55-55: Redundant background opacity classes.

The overlay has conflicting/redundant classes: tw-bg-black tw-bg-black/50 tw-bg-opacity-50. The tw-bg-black sets a solid black background, while tw-bg-black/50 sets 50% opacity black, and tw-bg-opacity-50 is another opacity modifier. Only tw-bg-black/50 is needed for a semi-transparent black overlay.

Proposed fix
-          <div className="edit-profile tw-absolute tw-inset-0 tw-z-20 tw-rounded-xl tw-bg-black tw-bg-black/50 tw-bg-opacity-50 tw-transition tw-duration-300 tw-ease-out">
+          <div className="edit-profile tw-absolute tw-inset-0 tw-z-20 tw-rounded-xl tw-bg-black/50 tw-transition tw-duration-300 tw-ease-out">
components/user/settings/UserSettingsBannerImageInput.tsx (1)

52-52: Consider using specific event types instead of any.

The event handlers use any type which loses type safety. Consider using the appropriate React event types for better type checking.

Proposed fix
-  const handleDrop = (e: any) => {
+  const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {
     e.preventDefault();
     e.stopPropagation();
     if (e?.dataTransfer?.files?.length) {
       onFileChange(e.dataTransfer.files[0]);
     }
   };

-  const handleDrag = (e: any) => {
+  const handleDrag = (e: React.DragEvent<HTMLDivElement>) => {
     e.preventDefault();
     e.stopPropagation();

And for the input onChange:

-          onChange={(e: any) => {
+          onChange={(e: React.ChangeEvent<HTMLInputElement>) => {

Also applies to: 60-60, 148-148

components/user/user-page-header/banner/UserPageHeaderEditBanner.tsx (1)

154-179: Redundant setIsUploading(false) in catch block.

The setIsUploading(false) on line 171 is redundant since the finally block on line 174 will always execute and set it to false. The catch-block call can be removed.

Proposed fix
         } catch (error) {
           const message =
             error instanceof Error
               ? error.message
               : "Failed to upload banner image";
           setToast({
             message,
             type: "error",
           });
-          setIsUploading(false);
           return;
         } finally {
           setIsUploading(false);
         }
components/user/user-page-header/UserPageHeaderClient.tsx (1)

184-202: Consider using a single UserPageHeaderName with variant="full" for simplicity.

Two separate UserPageHeaderName components are rendered with variant="title" and variant="meta". Unless specific layout spacing between them is required, a single component with variant="full" could simplify this section.

If the current layout with tw-mt-2 between title and meta is intentional for specific spacing control, this is fine as-is.

Comment thread components/user/user-page-header/about/UserPageHeaderAbout.tsx
Comment thread components/user/user-page-header/banner/UserPageHeaderBanner.tsx
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@components/user/settings/UserSettingsBannerImageInput.tsx`:
- Around line 34-40: The MIME-type check currently rejects files with empty
file.type; update the validation in UserSettingsBannerImageInput to treat an
empty MIME as a fallback case by deriving a MIME (or a comparable token) from
file.name extension and then checking against ACCEPTED_FORMATS instead of only
file.type; specifically, if file.type is falsy, extract the extension from
file.name (after the last dot), map it to the appropriate image MIME (or
normalize to the extension string format your ACCEPTED_FORMATS uses), then
perform the ACCEPTED_FORMATS lookup and call setToast({type: "error", message:
"Invalid file type"}) only when that combined/derived check fails. Ensure you
reference ACCEPTED_FORMATS, file.type, file.name and the setToast call when
applying the fix.

Comment thread components/user/settings/UserSettingsBannerImageInput.tsx Outdated
Signed-off-by: ragnep <ragneinfo@gmail.com>
Signed-off-by: ragnep <ragneinfo@gmail.com>
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@components/user/settings/UserSettingsImgSelectFile.tsx`:
- Line 41: Remove the dead inputRef from the UserSettingsImgSelectFile
component: delete the declaration const inputRef =
useRef<HTMLInputElement>(null) and remove any ref={inputRef} prop on the file
input element since the hidden input is a child of the label and does not
require programmatic access; ensure no other code in the component references
inputRef before committing the removal.
🧹 Nitpick comments (1)
components/user/settings/useImageUpload.ts (1)

37-38: Consider cleaning up the shake timeout on unmount.

The setTimeout for resetting shake state isn't cleaned up if the component unmounts during the 300ms window. This is a minor concern given the short duration, but for robustness you could use a ref or cleanup function.

♻️ Optional fix using useEffect cleanup pattern
+  const shakeTimeoutRef = useRef<NodeJS.Timeout | null>(null);
+
+  // Cleanup on unmount
+  useEffect(() => {
+    return () => {
+      if (shakeTimeoutRef.current) {
+        clearTimeout(shakeTimeoutRef.current);
+      }
+    };
+  }, []);
+
   const onFileChange = useCallback(
     (file: File) => {
       setError(null);
       // ...
       if (file.size > maxSizeBytes) {
         setError(`File size must be less than ${maxSizeLabel}`);
         setShake(true);
-        setTimeout(() => setShake(false), 300);
+        shakeTimeoutRef.current = setTimeout(() => setShake(false), 300);
         return;
       }

Comment thread components/user/settings/UserSettingsImgSelectFile.tsx Outdated
Signed-off-by: ragnep <ragneinfo@gmail.com>
Signed-off-by: ragnep <ragneinfo@gmail.com>
Signed-off-by: ragnep <ragneinfo@gmail.com>
Signed-off-by: ragnep <ragneinfo@gmail.com>
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

Caution

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

⚠️ Outside diff range comments (1)
components/user/user-page-header/banner/UserPageHeaderEditBanner.tsx (1)

43-44: ⚠️ Potential issue | 🟡 Minor

Modal can be dismissed during save operation.

useClickAway and useKeyPressEvent will close the modal even while isSaving is true, potentially interrupting the upload/save operation. The Cancel button is correctly disabled during save (line 255), but these handlers bypass that protection.

Consider wrapping onClose to check isSaving state:

🛡️ Proposed fix
+ const handleClose = () => {
+   if (isSaving) return;
+   onClose();
+ };
+
  const modalRef = useRef<HTMLDivElement>(null);
- useClickAway(modalRef, onClose);
- useKeyPressEvent("Escape", onClose);
+ useClickAway(modalRef, handleClose);
+ useKeyPressEvent("Escape", handleClose);

Note: Since isSaving depends on isUploading state (line 116), which is set inside the component, you may need to use a ref to track the saving state for the callbacks, or restructure to define handleClose after the state declarations.

🤖 Fix all issues with AI agents
In `@components/user/settings/UserSettingsImgSelectFile.tsx`:
- Around line 19-30: The ALLOWED_EXTENSIONS lookup can miss valid files because
isValidImageType falls back to ALLOWED_EXTENSIONS.has(getFileExtension(file))
without normalizing; update isValidImageType to normalize the extension from
getFileExtension(file) (strip any leading '.' and convert to upper case) before
checking ALLOWED_EXTENSIONS, keeping the existing MIME check against
ACCEPTED_FORMATS unchanged; reference functions/constants: isValidImageType,
getFileExtension, ALLOWED_EXTENSIONS, ACCEPTED_FORMATS.
- Around line 40-50: The circular dependency is caused by isValidImageType,
ACCEPTED_FORMATS, and ACCEPTED_FORMATS_DISPLAY being defined in
UserSettingsImgSelectFile and imported into useImageUpload; extract those three
symbols into a new shared module (e.g., imageValidation.ts) in the same
directory, export them, then update both UserSettingsImgSelectFile.tsx and the
useImageUpload module to import isValidImageType, ACCEPTED_FORMATS, and
ACCEPTED_FORMATS_DISPLAY from the new imageValidation.ts file so both modules
depend on the utility module instead of each other.

In `@components/user/user-page-header/banner/UserPageHeaderEditBanner.tsx`:
- Around line 205-210: The backdrop button currently calls onClose directly
which allows closing during a save; update the button in
UserPageHeaderEditBanner to use the guarded close handler (e.g., handleClose) or
wrap onClose with the save guard (e.g., onClick={() => { if (!isSaving)
onClose(); }}), referencing the existing handleClose/isSaving logic you added
earlier so the backdrop respects the "prevent close while saving" behavior.
🧹 Nitpick comments (1)
components/user/settings/UserSettingsImgSelectFile.tsx (1)

64-70: Add sizes for Next.js Image with fill.

Without sizes, Next.js emits warnings and can’t optimize layout sizing. A fixed container can use a fixed size string.

📐 Suggested update
               <Image
                 src={imageToShow}
                 alt="Profile image"
                 fill
+                sizes="160px"
                 className="tw-rounded-sm tw-object-contain"
               />

Comment thread components/user/settings/UserSettingsImgSelectFile.tsx Outdated
Comment thread components/user/settings/UserSettingsImgSelectFile.tsx
Copy link
Copy Markdown
Collaborator

@GelatoGenesis GelatoGenesis left a comment

Choose a reason for hiding this comment

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

Please address the stuff I mentioned in PR wave. Both the validation and prescaling.

Signed-off-by: ragnep <ragneinfo@gmail.com>
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@components/user/user-page-header/banner/UserPageHeaderBanner.tsx`:
- Around line 45-52: The gradient interpolation uses banner1Color/banner2Color
from getBannerColorValue without validating that non-image strings are safe CSS
colors; update getBannerColorValue (used in UserPageHeaderBanner) to validate
non-image values against a whitelist of allowed color formats (e.g., hex
`#RRGGBB/`#RGB with optional alpha, rgb()/rgba(), hsl()/hsla(), or a controlled
list of CSS color names) and return a safe fallback (e.g., a hard-coded hex)
when validation fails; ensure the component uses these validated/sanitized
banner1Color and banner2Color values for the linear-gradient so untrusted API
strings cannot inject arbitrary CSS or external resources.

Comment thread components/user/user-page-header/banner/UserPageHeaderBanner.tsx
Signed-off-by: ragnep <ragneinfo@gmail.com>
Signed-off-by: ragnep <ragneinfo@gmail.com>
@ragnep ragnep requested a review from GelatoGenesis February 3, 2026 11:35
Signed-off-by: ragnep <ragneinfo@gmail.com>
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

Caution

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

⚠️ Outside diff range comments (1)
components/user/user-page-header/banner/UserPageHeaderEditBanner.tsx (1)

116-121: ⚠️ Potential issue | 🟡 Minor

Inconsistent error handling in onError callback.

The error as string cast on line 118 won't properly extract the message if error is an Error object - it will display [object Object] or similar. The uploadBannerImage function (lines 139-142) handles this correctly; apply the same pattern here.

🛠️ Proposed fix
     onError: (error: unknown) => {
+      const message =
+        error instanceof Error ? error.message : String(error);
       setToast({
-        message: error as string,
+        message,
         type: "error",
       });
     },
🧹 Nitpick comments (1)
components/user/settings/UserSettingsBannerImageInput.tsx (1)

73-75: Consider deriving the displayed formats from ACCEPTED_FORMATS_DISPLAY to avoid drift.

The hardcoded text "JPEG, JPG, PNG, GIF — max 2MB" duplicates information already available from the imported ACCEPTED_FORMATS_DISPLAY constant. If the accepted formats change in imageValidation.ts, this display text won't update automatically, leading to inconsistency between what's shown and what's actually validated.

Suggested refactor to use the constant
                 <p className="tw-text-xs tw-font-normal tw-text-iron-400">
-                  JPEG, JPG, PNG, GIF — max 2MB
+                  {ACCEPTED_FORMATS_DISPLAY.toUpperCase().replaceAll(".", "")} — max 2MB
                 </p>

Alternatively, consider passing maxSizeLabel as a prop or importing it from shared config for full consistency.

Signed-off-by: ragnep <ragneinfo@gmail.com>
Signed-off-by: ragnep <ragneinfo@gmail.com>
Signed-off-by: ragnep <ragneinfo@gmail.com>
@ragnep ragnep merged commit ea8afd1 into main Feb 3, 2026
5 of 6 checks passed
@ragnep ragnep deleted the profile-page-header branch February 3, 2026 12:08
@sonarqubecloud
Copy link
Copy Markdown

sonarqubecloud Bot commented Feb 3, 2026

@coderabbitai coderabbitai Bot mentioned this pull request Feb 16, 2026
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.

2 participants