Skip to content

Commit 645ce99

Browse files
resolving dark mode errors
1 parent dba7de6 commit 645ce99

3 files changed

Lines changed: 66 additions & 235 deletions

File tree

Lines changed: 47 additions & 209 deletions
Original file line numberDiff line numberDiff line change
@@ -1,243 +1,81 @@
1-
/* Dark mode button styles */
2-
.dark-mode-button {
3-
cursor: pointer;
4-
padding: 0;
1+
/* --- Root Wrapper --- */
2+
.darkModeButton {
3+
display: inline-block;
4+
background: transparent !important;
55
}
66

7-
.red-asterisk {
8-
color: #e00000;
9-
font-weight: bold;
7+
/* Neutralize menu/row hover effects */
8+
.isDarkState, .isDarkState:hover {
9+
background-color: transparent !important;
1010
}
1111

12-
.dark-mode .close {
13-
color: white;
14-
opacity: 1;
15-
}
16-
17-
.dark-mode .close:hover {
18-
color: #f0f0f0;
19-
opacity: 1;
20-
}
21-
/* Custom styles for datepicker in darkMode */
22-
.dark-mode .react-datepicker {
23-
background-color: #3A506B;
24-
color: #ffffff;
25-
}
26-
.dark-mode .react-datepicker__header {
27-
background-color: #1C2541;
28-
border-bottom: 1px solid #555555;
29-
}
30-
.dark-mode .react-datepicker__current-month {
31-
color: #ffffff;
32-
}
33-
.dark-mode .react-datepicker__navigation--previous::before,
34-
.dark-mode .react-datepicker__navigation--next::before {
35-
border-color: #ffffff;
36-
}
37-
.dark-mode .react-datepicker__month-container {
38-
background-color: #3A506B;
39-
}
40-
.dark-mode .react-datepicker__day,
41-
.dark-mode .react-datepicker__time-name {
42-
color: #ffffff;
43-
}
44-
.dark-mode .react-datepicker__day-name {
45-
background-color: #1C2541;
46-
color: #ffffff;
47-
}
48-
.dark-mode .react-datepicker__day--selected,
49-
.dark-mode .react-datepicker__day--in-selecting-range,
50-
.dark-mode .react-datepicker__day--in-range,
51-
.dark-mode .react-datepicker__day:hover {
52-
background-color: #1C2541;
53-
color: #ffffff;
54-
}
55-
.dark-mode .react-datepicker__navigation {
56-
background: none;
57-
}
58-
.dark-mode .react-datepicker__navigation::before {
59-
border-color: #ffffff;
60-
}
61-
62-
.no-hover tr:hover {
63-
background-color: inherit !important;
64-
color: inherit !important;
65-
}
66-
67-
.hover-effect-reports-page-dark-mode:hover {
68-
background-color: #1C2541;
69-
color: #ffffff;
70-
}
71-
72-
/* Dark mode for DayPicker (AddTaskModal) */
73-
.dark-mode .DayPicker {
74-
background-color: #3A506B;
75-
color: #ffffff;
76-
}
77-
/* .dark-mode .DayPicker-wrapper {
78-
background-color: #1C2541;
79-
} */
80-
.dark-mode .DayPicker-Caption {
81-
color: #ffffff;
82-
}
83-
.dark-mode .DayPicker-NavButton {
84-
/* background: none; */
85-
}
86-
.dark-mode .DayPicker-Month {
87-
background-color: #3A506B;
88-
}
89-
.dark-mode .DayPicker-NavButton--prev::before,
90-
.dark-mode .DayPicker-NavButton--next::before {
91-
border-color: #ffffff;
92-
}
93-
.dark-mode .DayPicker-Day {
94-
color: #ffffff;
95-
}
96-
.dark-mode .DayPicker-Weekday {
97-
color: #ffffff;
98-
}
99-
.dark-mode .DayPicker-Day:hover {
100-
background-color: #1C2541 !important; /* Remove background color on hover */
101-
color: #ffffff !important; /* Ensure text color remains white */
102-
}
103-
.dark-mode tr:hover{
104-
background-color: #2f4157;
105-
}
106-
107-
/* DARK MODE BUTTON */
108-
109-
.darkModeSliderContainer {
12+
/* --- Shared Slider Logic --- */
13+
.sliderContainerDark, .sliderContainerLight {
11014
width: 120px;
11115
height: 30px;
11216
border-radius: 20px;
11317
display: flex;
114-
justify-content: flex-start;
11518
align-items: center;
116-
background-color: #1C2541;
11719
position: relative;
118-
transition: background-color 1000ms ease-in-out;
20+
transition: background-color 0.4s ease;
21+
}
22+
23+
.sliderContainerDark { background-color: #1C2541; }
24+
.sliderContainerLight {
25+
background-color: #e3e3e3;
26+
border: 1px solid #d4d4d4;
11927
}
12028

121-
.sunHoverIcon, .nightIcon {
29+
/* --- Icons --- */
30+
.iconSun, .iconSunHover, .iconNight, .iconNightHover {
12231
height: 25px;
12332
padding: 2px;
12433
border-radius: 50%;
125-
margin: 0 4px 0 3px;
12634
background: white;
12735
position: absolute;
128-
transition: opacity 1000ms ease-in-out, margin-left 1000ms ease-in-out;
36+
transition: all 500ms ease-in-out;
12937
}
13038

131-
.nightIcon {
132-
opacity: 0;
39+
/* --- Text Visibility Logic --- */
40+
.labelDark, .labelLight, .labelDarkHover, .labelLightHover {
41+
font-size: 13px;
42+
font-weight: 500;
43+
transition: opacity 500ms ease, color 0.2s ease;
13344
}
13445

135-
.darkModeText {
136-
margin-left: 32px;
137-
color: #f0f0f0;
138-
opacity: 1;
139-
transition: color 500ms ease-in-out, opacity 200ms linear 800ms;
140-
}
46+
.labelDark { margin-left: 32px; color: #f0f0f0; opacity: 1; }
47+
.labelLight { margin-left: 6px; color: #151515; opacity: 1; }
14148

142-
.lightModeHoverText {
143-
opacity: 0;
144-
color: #151515;
49+
.labelLightHover, .labelDarkHover {
14550
position: absolute;
146-
margin-left: 6px;
147-
transition: opacity 100ms linear, transition-delay 300ms linear;
148-
}
149-
150-
.darkModeSliderContainer:hover {
151-
background-color: white;
152-
}
153-
154-
.darkModeSliderContainer:hover .darkModeText {
155-
color: black;
15651
opacity: 0;
157-
transition: color 500ms ease-in-out, opacity 0s linear;
158-
}
159-
160-
.darkModeSliderContainer:hover .sunHoverIcon {
161-
opacity: 0;
162-
margin-left: 75%;
163-
}
164-
165-
.darkModeSliderContainer:hover .nightIcon {
166-
opacity: 1;
167-
margin-left: 75%;
168-
}
169-
170-
.darkModeSliderContainer:hover .lightModeHoverText {
171-
opacity: 1;
172-
transition: opacity 200ms linear 800ms;
173-
}
174-
175-
/* LIGHT MODE BUTTON */
176-
177-
.lightModeSliderContainer {
178-
width: 120px;
179-
height: 30px;
180-
border: 1px solid rgb(212, 212, 212);
181-
border-radius: 20px;
182-
display: flex;
183-
justify-content: flex-start;
184-
align-items: center;
185-
background-color: #e3e3e3;
186-
position: relative;
187-
transition: background-color 1000ms ease-in-out;
18852
}
18953

190-
.sunIcon, .nightHoverIcon {
191-
height: 25px;
192-
padding: 2px;
193-
border-radius: 50%;
194-
margin: 0 4px 0 3px;
195-
background: white;
196-
position: absolute;
197-
margin-left: 75%;
198-
box-shadow: 1px -1px 1px black;
199-
transition: opacity 1000ms ease-in-out, margin-left 1000ms ease-in-out;
200-
}
54+
.labelLightHover { margin-left: 6px; color: #151515; }
55+
.labelDarkHover { margin-left: 32px; color: #ffffff; }
20156

202-
.nightHoverIcon {
203-
opacity: 0;
204-
}
57+
/* --- Hover States (Dark) --- */
58+
.sliderContainerDark:hover { background-color: #ffffff; }
20559

206-
.lightModeText {
207-
margin-left: 6px;
208-
color: #151515;
209-
opacity: 1;
210-
transition: opacity 100ms linear 800ms;
211-
}
60+
.sliderContainerDark:hover .labelDark { opacity: 0; }
61+
.sliderContainerDark:hover .labelLightHover { opacity: 1; }
21262

213-
.darkModeHoverText {
214-
color: white;
215-
opacity: 0;
216-
position: absolute;
217-
margin-left: 32px;
218-
transition: opacity 100ms linear, transition-delay 300ms linear;
219-
}
63+
.sliderContainerDark:hover .iconSunHover { opacity: 0; left: 90px; }
64+
.sliderContainerDark:hover .iconNight { opacity: 1; left: 90px; }
22065

221-
.lightModeSliderContainer:hover {
222-
background-color: #1C2541;
223-
}
66+
/* --- Hover States (Light) --- */
67+
.sliderContainerLight:hover { background-color: #1C2541; }
22468

225-
.lightModeSliderContainer:hover .lightModeText {
226-
opacity: 0;
227-
transition: opacity 200ms linear 0s;
228-
}
69+
.sliderContainerLight:hover .labelLight { opacity: 0; }
70+
.sliderContainerLight:hover .labelDarkHover { opacity: 1; }
22971

230-
.lightModeSliderContainer:hover .sunIcon {
231-
opacity: 0;
232-
margin-left: 2px;
233-
}
72+
.sliderContainerLight:hover .iconSun { opacity: 0; left: 4px; }
73+
.sliderContainerLight:hover .iconNightHover { opacity: 1; left: 4px; }
23474

235-
.lightModeSliderContainer:hover .nightHoverIcon {
236-
opacity: 1;
237-
margin-left: 2px;
238-
}
75+
/* Initialization positions */
76+
.iconSun, .iconNightHover { left: 90px; }
77+
.iconNight, .iconSunHover { left: 4px; }
23978

240-
.lightModeSliderContainer:hover .darkModeHoverText {
241-
opacity: 1;
242-
transition: opacity 200ms linear 800ms;
243-
}
79+
.sliderContainerDark:hover .labelLightHover{
80+
color: #151515 !important;
81+
}
Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useState, useEffect } from 'react';
22
import { useSelector, useDispatch } from 'react-redux';
3-
import './index.css';
3+
import styles from './DarkMode.module.css'; // Access classes via 'styles'
44
import { Tooltip } from 'reactstrap';
55
import sunIcon from './images/sunIcon.png';
66
import nightIcon from './images/nightIcon.png';
@@ -15,7 +15,6 @@ function DarkModeButton() {
1515
dispatch({ type: 'TOGGLE_THEME' });
1616
};
1717

18-
// Listen for localStorage changes from other tabs
1918
useEffect(() => {
2019
const handleStorageChange = event => {
2120
if (event.key === 'darkMode' && !updatingTheme) {
@@ -27,23 +26,17 @@ function DarkModeButton() {
2726
};
2827

2928
window.addEventListener('storage', handleStorageChange);
30-
return () => {
31-
window.removeEventListener('storage', handleStorageChange);
32-
};
33-
}, [darkMode, dispatch]);
29+
return () => window.removeEventListener('storage', handleStorageChange);
30+
}, [darkMode, dispatch, updatingTheme]);
3431

3532
useEffect(() => {
3633
setUpdatingTheme(true);
3734
localStorage.setItem('darkMode', darkMode);
38-
// Reset the flag after a small delay (to ensure the storage event won't fire in the same tab)
39-
setTimeout(() => {
40-
setUpdatingTheme(false);
41-
}, 100);
35+
const timer = setTimeout(() => setUpdatingTheme(false), 100);
36+
return () => clearTimeout(timer);
4237
}, [darkMode]);
4338

44-
const toggleTooltip = () => {
45-
setTooltipOpen(!tooltipOpen);
46-
};
39+
const toggleTooltip = () => setTooltipOpen(!tooltipOpen);
4740

4841
return (
4942
<>
@@ -58,7 +51,7 @@ function DarkModeButton() {
5851
<div
5952
role="button"
6053
tabIndex={0}
61-
className={`dark-mode-button ${darkMode ? 'dark-mode' : ''}`}
54+
className={`${styles.darkModeButton} ${darkMode ? styles.isDarkState : ''}`}
6255
onClick={toggleDarkMode}
6356
onKeyDown={(e) => {
6457
if (e.key === 'Enter' || e.key === ' ') {
@@ -70,23 +63,23 @@ function DarkModeButton() {
7063
style={{ cursor: 'pointer', border: 'none', background: 'none', padding: 0 }}
7164
>
7265
{darkMode ? (
73-
<div className="darkModeSliderContainer">
74-
<img src={nightIcon} alt="Night Icon" className="nightIcon" />
75-
<img src={sunIcon} alt="Sun Icon" className="sunHoverIcon" />
76-
<span className="darkModeText">Dark Mode</span>
77-
<span className="lightModeHoverText">Light Mode</span>
66+
<div className={styles.sliderContainerDark}>
67+
<img src={nightIcon} alt="Night" className={styles.iconNight} />
68+
<img src={sunIcon} alt="Sun" className={styles.iconSunHover} />
69+
<span className={styles.labelDark}>Dark Mode</span>
70+
<span className={styles.labelLightHover}>Light Mode</span>
7871
</div>
7972
) : (
80-
<div className="lightModeSliderContainer">
81-
<img src={sunIcon} alt="Sun Icon" className="sunIcon" />
82-
<img src={nightIcon} alt="Night Icon" className="nightHoverIcon" />
83-
<span className="lightModeText">Light Mode</span>
84-
<span className="darkModeHoverText">Dark Mode</span>
73+
<div className={styles.sliderContainerLight}>
74+
<img src={sunIcon} alt="Sun" className={styles.iconSun} />
75+
<img src={nightIcon} alt="Night" className={styles.iconNightHover} />
76+
<span className={styles.labelLight}>Light Mode</span>
77+
<span className={styles.labelDarkHover}>Dark Mode</span>
8578
</div>
8679
)}
8780
</div>
8881
</>
8982
);
9083
}
9184

92-
export default DarkModeButton;
85+
export default DarkModeButton;

src/components/Header/Header.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@ export function Header(props) {
406406
const viewingUser = JSON.parse(window.sessionStorage.getItem('viewingUser'));
407407
return (
408408
<div className={`${styles.headerWrapper}`} data-testid="header">
409-
<Navbar className={`py-3 ${styles.navbar}`} color="dark" dark expand="xl">
409+
<Navbar className={`py-3 ${styles.navbar}`} color="dark" dark expand={true}>
410410
{logoutPopup && <Logout open={logoutPopup} setLogoutPopup={setLogoutPopup} />}
411411
{showPromotionsPopup && <DisplayBox onClose={() => setShowPromotionsPopup(false)} />}
412412

0 commit comments

Comments
 (0)