Skip to content

Implement login and signup UI with form validation and toggle functio…#1

Merged
Bassal-11 merged 2 commits into
mainfrom
development
Jun 4, 2026
Merged

Implement login and signup UI with form validation and toggle functio…#1
Bassal-11 merged 2 commits into
mainfrom
development

Conversation

@Bassal-11

@Bassal-11 Bassal-11 commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

…nality

Summary by CodeRabbit

  • New Features
    • Implemented a complete login and sign-up interface
    • Added ability to toggle between login and sign-up modes
    • Added password visibility toggle
    • Added name field for sign-up
    • Added loading state during form submission
    • Automatic redirect to home page after successful submission

@coderabbitai

coderabbitai Bot commented Jun 4, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@Bassal-11, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 43 minutes and 12 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

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.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e7cbacac-13d6-435f-b6c4-4bf954aea5ec

📥 Commits

Reviewing files that changed from the base of the PR and between 4bd4bd6 and 25a43ec.

📒 Files selected for processing (1)
  • client/src/pages/Login.tsx
📝 Walkthrough

Walkthrough

The Login component was replaced with a full authentication page. The new implementation uses React state to manage login/signup mode, form fields (name, email, password), password visibility, and loading state. It conditionally renders a name input for signup, toggles password visibility, and submits the form with a 1-second redirect to the home page after setting a loading flag.

Changes

Login Page Implementation

Layer / File(s) Summary
Login form and authentication UI
client/src/pages/Login.tsx
The Login component replaces its placeholder with a stateful sign-in/sign-up form. State tracks mode toggle, form fields, password visibility, and loading. The submit handler prevents default submission, sets loading, and redirects after a timeout. The layout conditionally shows name input for signup, includes a password toggle, displays a loading spinner, and uses Tailwind styling with hero section and branding.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 A form springs to life with fields in a row,

Login or signup, let the credentials flow!

Password eyes toggle, a loading spinner spins,

The journey begins where authentication wins! ✨

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: implementing a login and signup UI component with form handling and password visibility toggle functionality in the Login.tsx file.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch development

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.

@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: 9

🧹 Nitpick comments (3)
client/src/pages/Login.tsx (3)

62-71: 🏗️ Heavy lift

Consider adding client-side validation for better UX.

The form relies solely on HTML5 validation (required, type='email'). Consider adding:

  • Minimum length validation for name (e.g., 2 characters)
  • Email format validation with helpful error messages
  • Password strength requirements (min 8 characters, complexity rules)
  • Visual feedback for validation errors

This improves user experience by catching errors before submission and providing clear guidance.

💡 Example validation approach

You could add state for errors:

const [errors, setErrors] = useState({ name: '', email: '', password: '' });

And validate in handleSubmit or on blur:

const validateForm = () => {
    const newErrors = { name: '', email: '', password: '' };
    if (!isLogin && name.length < 2) newErrors.name = 'Name must be at least 2 characters';
    if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) newErrors.email = 'Invalid email format';
    if (password.length < 8) newErrors.password = 'Password must be at least 8 characters';
    setErrors(newErrors);
    return !Object.values(newErrors).some(err => err);
};

Then display errors below each input.

Also applies to: 80-89, 96-104

🤖 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 `@client/src/pages/Login.tsx` around lines 62 - 71, Add client-side validation
to the Login component: create an errors state (e.g., errors and setErrors) and
implement a validateForm function that checks name (min 2 chars when
registering), email (regex format), and password (min 8 chars + optional
complexity) and returns a boolean; call validateForm from handleSubmit and
onBlur/onChange for each input to set errors and prevent submission when
invalid; update the JSX around the name input (value={name}, onChange={setName})
and the email/password inputs to render inline error messages and visual error
styles when errors.name / errors.email / errors.password are populated so users
get immediate, clear feedback.

119-119: 💤 Low value

Remove duplicate w-full class.

The className contains w-full twice and has extra spaces.

♻️ Cleanup
-                            className=' flex flex-center w-full py-3 bg-green-950 w-full text-white font-semibold rounded-xl hover:bg-green-900 transition-colors disabled:opacity-50'
+                            className='flex flex-center w-full py-3 bg-green-950 text-white font-semibold rounded-xl hover:bg-green-900 transition-colors disabled:opacity-50'
🤖 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 `@client/src/pages/Login.tsx` at line 119, In the Login component, clean up the
JSX className string that currently includes duplicate and extra spaces: remove
the second duplicate "w-full" and trim redundant spaces in the className prop
(the string containing 'flex flex-center w-full py-3 bg-green-950 w-full
text-white font-semibold rounded-xl hover:bg-green-900 transition-colors
disabled:opacity-50') so it contains each utility only once and has normal
spacing.

29-29: 💤 Low value

Remove redundant aria-label when alt is present.

The aria-label attribute is redundant when the alt attribute already provides the same description. Screen readers will use alt by default for images.

♻️ Proposed cleanup
                 <img
                     src={heroSectionData.hero_image}
                     alt='background image for login'
-                    aria-label=' background image for login'
                     className=' absolute inset-0 object-cover h-full bg-center opacity-10 '
                 />
🤖 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 `@client/src/pages/Login.tsx` at line 29, In the Login component's JSX image
element remove the redundant aria-label attribute (aria-label=' background image
for login') since the alt attribute already provides the description; update the
image element in Login.tsx to keep only the alt prop and delete the aria-label
to avoid duplicate accessible names for screen readers.
🤖 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 `@client/src/pages/Login.tsx`:
- Around line 15-21: The login handler handleSubmit currently only fakes a
redirect; replace that with a real authentication flow: call your backend login
endpoint (e.g., POST /api/auth/login) with the form credentials, handle success
by storing the returned token/session securely (prefer httpOnly cookie via
server Set-Cookie or, if client-side, use secure storage and short-lived
tokens), and setLoading(false) only after the response; on failure
setLoading(false) and surface error messages. Also implement actual auth checks
in the ProtectedRoute component so it reads the auth state/token (call a
validate or /me endpoint or verify cookie) and redirects unauthenticated users
to the login page. Ensure you add try/catch around the network call in
handleSubmit to handle network/server errors and display error feedback to the
user.
- Around line 1-5: The Login component is using window.location.href = '/' which
causes a full reload; import useNavigate from 'react-router-dom' at the top and
replace the direct window.location assignment with the navigate('/') call from
the hook (call const navigate = useNavigate() inside the Login component and use
navigate('/') where the redirect currently occurs) so navigation is handled
client-side without losing React Router state.
- Line 46: In the <p> JSX element in Login.tsx the className string is malformed
(' text-sm text-app-text-light"')—remove the stray double quote and normalize
the quotes so the prop is a valid string (e.g., className="text-sm
text-app-text-light" or className='text-sm text-app-text-light'); update the <p>
element in the Login component accordingly to fix the syntax error.
- Around line 105-113: The password visibility toggle button in the Login
component is missing accessibility attributes; update the button (the element
that calls setShowPassword and renders EyeIcon/EyeOffIcon based on showPassword)
to include an aria-label that reflects its action ("Show password" when
showPassword is false, "Hide password" when true) and add
aria-pressed={showPassword} so assistive tech knows the toggle state; optionally
include a title prop with the same dynamic text for mouse users.
- Line 48: In the Login component fix the malformed button element by removing
the stray quote in the className value and add an explicit type attribute to
prevent accidental form submission; update the button that calls onClick={() =>
setIsLogin(!isLogin)} so it has a valid className string (no extra quotes) and
type="button".
- Line 91: Update the label for the password field so its htmlFor matches the
input id 'password' (currently htmlFor='email'); locate the label element in
Login.tsx (the label rendered above the password input) and change its htmlFor
to 'password' to restore correct label-input association and accessibility.
- Around line 17-21: The timeout started when calling setTimeout to redirect
should be cleaned up and the loading state reset if the component unmounts or
navigation fails: store the timeout id returned by setTimeout (in the click
handler or a ref/state), call clearTimeout(id) in a useEffect cleanup (or on
unmount), and ensure you setLoading(false) in that cleanup or on error/failure
paths so loading isn't left true; update the handler that calls setLoading(true)
and window.location.href to use this timeout id and tie the cleanup to the
component's lifecycle.
- Around line 18-20: In Login.tsx replace the full-page redirect inside the
setTimeout (the code using window.location.href = '/') with React Router's
client-side navigation: import and call the useNavigate hook in the Login
component (e.g., const navigate = useNavigate()), then inside the existing
setTimeout callback call navigate('/') (or navigate('/', { replace: true }) if
you want to replace history) instead of assigning window.location.href; update
the import at the top to include useNavigate from 'react-router-dom' and ensure
navigate is captured in the component scope where setTimeout runs.
- Line 69: In the Login component change input focus styling by replacing the
Tailwind-like utility 'not-focus:border-app-border' with
'focus:border-app-border' on the input className(s) (e.g., the className string
containing w-full rounded-xl pl-10 pr-4 py-3 text-sm bg-white border
not-focus:border-app-border) so the border color applies on focus; additionally
add basic HTML validation attributes to the relevant inputs (e.g., add
minLength="2" and a simple pattern or type where appropriate for the Name field,
and sensible minLength/pattern for other fields) while keeping required, to
improve client-side validation and visible focus feedback.

---

Nitpick comments:
In `@client/src/pages/Login.tsx`:
- Around line 62-71: Add client-side validation to the Login component: create
an errors state (e.g., errors and setErrors) and implement a validateForm
function that checks name (min 2 chars when registering), email (regex format),
and password (min 8 chars + optional complexity) and returns a boolean; call
validateForm from handleSubmit and onBlur/onChange for each input to set errors
and prevent submission when invalid; update the JSX around the name input
(value={name}, onChange={setName}) and the email/password inputs to render
inline error messages and visual error styles when errors.name / errors.email /
errors.password are populated so users get immediate, clear feedback.
- Line 119: In the Login component, clean up the JSX className string that
currently includes duplicate and extra spaces: remove the second duplicate
"w-full" and trim redundant spaces in the className prop (the string containing
'flex flex-center w-full py-3 bg-green-950 w-full text-white font-semibold
rounded-xl hover:bg-green-900 transition-colors disabled:opacity-50') so it
contains each utility only once and has normal spacing.
- Line 29: In the Login component's JSX image element remove the redundant
aria-label attribute (aria-label=' background image for login') since the alt
attribute already provides the description; update the image element in
Login.tsx to keep only the alt prop and delete the aria-label to avoid duplicate
accessible names for screen readers.
🪄 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: 1aa9c7a3-c7f7-4d6a-80ae-74cecdbf034f

📥 Commits

Reviewing files that changed from the base of the PR and between 515b15e and 4bd4bd6.

📒 Files selected for processing (1)
  • client/src/pages/Login.tsx

Comment thread client/src/pages/Login.tsx
Comment on lines +15 to +21
const handleSubmit = async (e: React.SubmitEvent) => {
e.preventDefault();
setLoading(true);
setTimeout(() => {
window.location.href = '/';
}, 1000);
};

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical | 🏗️ Heavy lift

Authentication logic is missing.

The submit handler only sets a loading state and redirects—there's no actual authentication call to a backend API. This means anyone can access the app without valid credentials. Based on the context snippets, ProtectedRoute is also a stub with no auth enforcement.

This is a critical security gap for production. You'll need to:

  1. Integrate with an authentication API (login/signup endpoints)
  2. Store authentication tokens securely (httpOnly cookies or secure storage)
  3. Implement actual auth checks in ProtectedRoute
  4. Add error handling for failed authentication

Do you want me to open an issue with a template for implementing proper authentication with JWT tokens and protected routes?

🤖 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 `@client/src/pages/Login.tsx` around lines 15 - 21, The login handler
handleSubmit currently only fakes a redirect; replace that with a real
authentication flow: call your backend login endpoint (e.g., POST
/api/auth/login) with the form credentials, handle success by storing the
returned token/session securely (prefer httpOnly cookie via server Set-Cookie
or, if client-side, use secure storage and short-lived tokens), and
setLoading(false) only after the response; on failure setLoading(false) and
surface error messages. Also implement actual auth checks in the ProtectedRoute
component so it reads the auth state/token (call a validate or /me endpoint or
verify cookie) and redirects unauthenticated users to the login page. Ensure you
add try/catch around the network call in handleSubmit to handle network/server
errors and display error feedback to the user.

Comment on lines +17 to +21
setLoading(true);
setTimeout(() => {
window.location.href = '/';
}, 1000);
};

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Add cleanup for setTimeout and reset loading state properly.

The setTimeout is never cleaned up if the component unmounts during the delay, causing a potential memory leak and setState warning. Additionally, the loading state is never reset to false, which could cause issues if navigation fails.

🛡️ Proposed fix with cleanup
     const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
         e.preventDefault();
         setLoading(true);
-        setTimeout(() => {
-            window.location.href = '/';
-        }, 1000);
+        const timeoutId = setTimeout(() => {
+            navigate('/');
+            setLoading(false);
+        }, 1000);
+        
+        // Cleanup function
+        return () => clearTimeout(timeoutId);
     };

Even better, use useEffect for cleanup or handle it with proper async/await patterns when you add real authentication.

🤖 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 `@client/src/pages/Login.tsx` around lines 17 - 21, The timeout started when
calling setTimeout to redirect should be cleaned up and the loading state reset
if the component unmounts or navigation fails: store the timeout id returned by
setTimeout (in the click handler or a ref/state), call clearTimeout(id) in a
useEffect cleanup (or on unmount), and ensure you setLoading(false) in that
cleanup or on error/failure paths so loading isn't left true; update the handler
that calls setLoading(true) and window.location.href to use this timeout id and
tie the cleanup to the component's lifecycle.

Comment thread client/src/pages/Login.tsx
Comment thread client/src/pages/Login.tsx
Comment thread client/src/pages/Login.tsx Outdated
onChange={(e) => setName(e.target.value)}
required
placeholder='Enter your name'
className='w-full rounded-xl pl-10 pr-4 py-3 text-sm bg-white border not-focus:border-app-border transition-all'

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🌐 Web query:

Tailwind CSS v4 not-focus variant documentation and usage

💡 Result:

In Tailwind CSS v4, the not- variant family is a powerful addition that allows you to apply utility classes only when a specific condition is not true [1][2]. The not-focus: variant specifically applies styles to an element when it is not currently focused [1][3]. Usage and Key Concepts: - Conditional Logic: You can use not-focus: to define default states that are automatically overridden when the element gains focus [3]. This reduces the need for manual override logic in your CSS or complex class toggling [3]. - Composable Variants: The not- variant is highly composable. You can combine it with other variants, such as hover:, to create precise interaction states [1][4]. For example, the class hover:not-focus:bg-indigo-700 will apply the background color only when the element is hovered and not focused [1]. - Broad Compatibility: Beyond not-focus:, the not-* prefix supports most standard state variants (e.g., not-hover:, not-active:, not-disabled:) as well as media queries, feature queries, and container queries (e.g., not-md:, not-supports-grid:, not-motion-safe:) [1][2][5][4]. Example: Hover only if not focused By using these modifiers, you can express negative conditions directly in your markup, which often leads to cleaner logic and improved readability compared to traditional cascading override approaches [3].

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE="client/src/pages/Login.tsx"

# Show the relevant section around the Name input and the className line.
nl -ba "$FILE" | sed -n '40,110p'

Repository: React-projects/Instacart---Grocery-Delivery

Length of output: 130


🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE="client/src/pages/Login.tsx"

# Show relevant section around the Name input and className line
cat -n "$FILE" | sed -n '45,95p'

Repository: React-projects/Instacart---Grocery-Delivery

Length of output: 3774


🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE="client/src/pages/Login.tsx"

echo "== Tailwind focus/border usage in this file =="
rg -n "focus:|not-focus:|border-app-border|border-" "$FILE" || true

echo
echo "== Name/email/password validation attributes =="
rg -n "minLength|maxLength|pattern|aria-|required|type='text'|type='email'|type='password'" "$FILE" || true

echo
echo "== handleSubmit and any client-side validation around name/email/password =="
rg -n "handleSubmit|setName|setEmail|setPassword|name\\b|email\\b|password\\b" "$FILE" || true

Repository: React-projects/Instacart---Grocery-Delivery

Length of output: 2559


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Locate where tailwind config lives (common names)
ls -1 | rg -i "tailwind\\.config\\.(js|ts|cjs|mjs|mjs)$" || true
ls -1 | rg -i "postcss\\.config\\.(js|cjs|mjs)$" || true
fd -t f -i "tailwind.config.*" . || true

echo "---- Search for app-border definition ----"
rg -n "app-border" . || true

echo "---- Search for focus border utilities elsewhere in Login page (and nearby components) ----"
rg -n "focus:.*border|focus:.*ring|ring:.*focus" client/src/pages/Login.tsx || true

echo "---- Search for any global/input focus border styles ----"
rg -n "focus.*border|not-focus:.*border|input.*focus|ring.*focus" client/src -S || true

Repository: React-projects/Instacart---Grocery-Delivery

Length of output: 2678


🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE="client/src/index.css"
echo "== client/src/index.css (focus rules) =="
cat -n "$FILE" | sed -n '40,90p'

Repository: React-projects/Instacart---Grocery-Delivery

Length of output: 1349


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Tailwind config files =="
fd -t f -i "tailwind.config.*" . || true

echo
echo "== package.json / Tailwind version =="
fd -t f -i "package.json" client . || true
# If there are multiple, print the ones that mention tailwind
rg -n "\"tailwindcss\"|tailwindcss" -S client package.json . 2>/dev/null || true

echo
echo "== Search for color/app-border mapping in config =="
fd -t f -i "tailwind.config.*" client . | xargs -r rg -n "app-border|border-app-border|--color-app-border|colors" || true

echo
echo "== Any CSS using border-app-border token (to infer mapping) =="
rg -n "border-app-border" client/src index.css client/index.css 2>/dev/null || true

Repository: React-projects/Instacart---Grocery-Delivery

Length of output: 8544


🏁 Script executed:

#!/bin/bash
set -euo pipefail
FILE="client/src/index.css"
cat -n "$FILE" | sed -n '1,60p'

Repository: React-projects/Instacart---Grocery-Delivery

Length of output: 1865


Switch from not-focus: to focus: for clearer input focus styling (and add basic validation).

  • client/src/pages/Login.tsx:69 sets not-focus:border-app-border, so the border color only applies while the input is not focused; since client/src/index.css removes focus outlines (input:focus { outline: none; }), the focused state may have little/no visual feedback.
  • Name (and the other fields using the same pattern) only uses required—no minLength/pattern validation.
Suggested change
-                                            className='w-full rounded-xl pl-10 pr-4 py-3 text-sm bg-white border  not-focus:border-app-border transition-all'
+                                            className='w-full rounded-xl pl-10 pr-4 py-3 text-sm bg-white border border-app-border focus:border-app-green focus:ring-2 focus:ring-app-green/20 transition-all'
📝 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.

Suggested change
className='w-full rounded-xl pl-10 pr-4 py-3 text-sm bg-white border not-focus:border-app-border transition-all'
className='w-full rounded-xl pl-10 pr-4 py-3 text-sm bg-white border border-app-border focus:border-app-green focus:ring-2 focus:ring-app-green/20 transition-all'
🤖 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 `@client/src/pages/Login.tsx` at line 69, In the Login component change input
focus styling by replacing the Tailwind-like utility
'not-focus:border-app-border' with 'focus:border-app-border' on the input
className(s) (e.g., the className string containing w-full rounded-xl pl-10 pr-4
py-3 text-sm bg-white border not-focus:border-app-border) so the border color
applies on focus; additionally add basic HTML validation attributes to the
relevant inputs (e.g., add minLength="2" and a simple pattern or type where
appropriate for the Name field, and sensible minLength/pattern for other fields)
while keeping required, to improve client-side validation and visible focus
feedback.

Comment thread client/src/pages/Login.tsx Outdated
Comment thread client/src/pages/Login.tsx
…ibility

- Import and use useNavigate from react-router-dom for programmatic navigation
- Add type='button' attribute to toggle button to prevent form submission
- Add aria-label attributes to name, email, and password input fields
- Fix duplicate 'w-full' class in submit button
- Fix htmlFor attribute for password label to match input id
- Remove extra quotes from className strings
@Bassal-11 Bassal-11 merged commit fc756f6 into main Jun 4, 2026
1 check passed
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