From a8c2d9610102d98266b305a699d25f3d8dcbecc2 Mon Sep 17 00:00:00 2001 From: Aditya Gambhir <67105262+Aditya-gam@users.noreply.github.com> Date: Tue, 23 Dec 2025 13:50:18 -0800 Subject: [PATCH 01/21] fix: override global dark mode styles for Project Status cards text color --- .../WeeklyProjectSummary.jsx | 5 +- .../WeeklyProjectSummary.module.css | 72 +++++++++++++++++++ 2 files changed, 73 insertions(+), 4 deletions(-) diff --git a/src/components/BMDashboard/WeeklyProjectSummary/WeeklyProjectSummary.jsx b/src/components/BMDashboard/WeeklyProjectSummary/WeeklyProjectSummary.jsx index c91ed659d1..b4e0c951bc 100644 --- a/src/components/BMDashboard/WeeklyProjectSummary/WeeklyProjectSummary.jsx +++ b/src/components/BMDashboard/WeeklyProjectSummary/WeeklyProjectSummary.jsx @@ -223,10 +223,7 @@ function WeeklyProjectSummary() { > {button.value} -
+
{button.change}
diff --git a/src/components/BMDashboard/WeeklyProjectSummary/WeeklyProjectSummary.module.css b/src/components/BMDashboard/WeeklyProjectSummary/WeeklyProjectSummary.module.css index 72b99d0f14..277122a6a7 100644 --- a/src/components/BMDashboard/WeeklyProjectSummary/WeeklyProjectSummary.module.css +++ b/src/components/BMDashboard/WeeklyProjectSummary/WeeklyProjectSummary.module.css @@ -437,6 +437,11 @@ font-weight: 600; } +.weeklyStatusChange { + color: #1b2a41; + font-size: clamp(12px, 1.2vw, 14px); +} + /* ---------------- RESPONSIVE BREAKPOINTS ---------------- */ @media (min-width: 1600px) { .projectStatusGrid { @@ -466,4 +471,71 @@ .projectStatusGrid { grid-template-columns: repeat(1, 1fr); } +} + +/* ---------------- OVERRIDE GLOBAL DARK MODE FOR PROJECT STATUS CARDS ---------------- */ +/* These rules override the global dark mode text color rules specifically for Project Status cards */ +/* Using high specificity selectors to ensure they take precedence over global !important rules */ +/* The global CSS uses body.dark-mode * and body.bm-dashboard-dark * with !important, */ +/* so we need selectors with higher specificity (more elements) and also use !important */ + +/* Target all text elements within Project Status cards - most specific selector */ +:global(body.dark-mode) .weeklyProjectSummaryContainer .projectStatusGrid .statusCard div.weeklyCardTitle, +:global(body.bm-dashboard-dark) .weeklyProjectSummaryContainer .projectStatusGrid .statusCard div.weeklyCardTitle, +:global(body.dark-mode) .weeklyProjectSummaryContainer .projectStatusGrid .statusCard span.weeklyStatusValue, +:global(body.bm-dashboard-dark) .weeklyProjectSummaryContainer .projectStatusGrid .statusCard span.weeklyStatusValue, +:global(body.dark-mode) .weeklyProjectSummaryContainer .projectStatusGrid .statusCard div.weekly-status-change, +:global(body.bm-dashboard-dark) .weeklyProjectSummaryContainer .projectStatusGrid .statusCard div.weekly-status-change { + color: #1b2a41 !important; +} + +/* Also target with class selectors for maximum specificity */ +:global(body.dark-mode) .weeklyProjectSummaryContainer .projectStatusGrid .statusCard .weeklyCardTitle, +:global(body.bm-dashboard-dark) .weeklyProjectSummaryContainer .projectStatusGrid .statusCard .weeklyCardTitle { + color: #1b2a41 !important; +} + +:global(body.dark-mode) .weeklyProjectSummaryContainer .projectStatusGrid .statusCard .weeklyStatusValue, +:global(body.bm-dashboard-dark) .weeklyProjectSummaryContainer .projectStatusGrid .statusCard .weeklyStatusValue { + color: #1b2a41 !important; +} + +:global(body.dark-mode) .weeklyProjectSummaryContainer .projectStatusGrid .statusCard .weekly-status-change, +:global(body.bm-dashboard-dark) .weeklyProjectSummaryContainer .projectStatusGrid .statusCard .weekly-status-change { + color: #1b2a41 !important; +} + +/* Target the statusCard container and all children with universal selector */ +:global(body.dark-mode) .weeklyProjectSummaryContainer .projectStatusGrid .statusCard, +:global(body.bm-dashboard-dark) .weeklyProjectSummaryContainer .projectStatusGrid .statusCard { + color: #1b2a41 !important; +} + +:global(body.dark-mode) .weeklyProjectSummaryContainer .projectStatusGrid .statusCard *, +:global(body.bm-dashboard-dark) .weeklyProjectSummaryContainer .projectStatusGrid .statusCard * { + color: #1b2a41 !important; +} + +/* Additional specific selectors for p, span, div elements within status cards */ +:global(body.dark-mode) .weeklyProjectSummaryContainer .projectStatusGrid .statusCard p, +:global(body.dark-mode) .weeklyProjectSummaryContainer .projectStatusGrid .statusCard span, +:global(body.dark-mode) .weeklyProjectSummaryContainer .projectStatusGrid .statusCard div, +:global(body.bm-dashboard-dark) .weeklyProjectSummaryContainer .projectStatusGrid .statusCard p, +:global(body.bm-dashboard-dark) .weeklyProjectSummaryContainer .projectStatusGrid .statusCard span, +:global(body.bm-dashboard-dark) .weeklyProjectSummaryContainer .projectStatusGrid .statusCard div { + color: #1b2a41 !important; +} + +/* Target the weeklyStatusChange class specifically */ +:global(body.dark-mode) .weeklyProjectSummaryContainer .projectStatusGrid .statusCard .weeklyStatusChange, +:global(body.bm-dashboard-dark) .weeklyProjectSummaryContainer .projectStatusGrid .statusCard .weeklyStatusChange, +:global(body.dark-mode) .weeklyProjectSummaryContainer .projectStatusGrid .statusCard .weekly-status-change, +:global(body.bm-dashboard-dark) .weeklyProjectSummaryContainer .projectStatusGrid .statusCard .weekly-status-change { + color: #1b2a41 !important; +} + +/* Extra specific selectors including intermediate containers for maximum specificity */ +:global(body.dark-mode) .weeklyProjectSummaryContainer .weeklyProjectSummaryDashboardCategoryContent .projectStatusGrid .statusCard *, +:global(body.bm-dashboard-dark) .weeklyProjectSummaryContainer .weeklyProjectSummaryDashboardCategoryContent .projectStatusGrid .statusCard * { + color: #1b2a41 !important; } \ No newline at end of file From 576a5bbeea2694ff0056d3b951e416b5ba28af4e Mon Sep 17 00:00:00 2001 From: Aditya Gambhir <67105262+Aditya-gam@users.noreply.github.com> Date: Tue, 23 Dec 2025 13:57:44 -0800 Subject: [PATCH 02/21] fix: set filter box background color in Tools and Equipment Tracking dark mode --- .../ToolStatusDonutChart.module.css | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/src/components/BMDashboard/WeeklyProjectSummary/ToolStatusDonutChart/ToolStatusDonutChart.module.css b/src/components/BMDashboard/WeeklyProjectSummary/ToolStatusDonutChart/ToolStatusDonutChart.module.css index 5ec32569f4..2e40b4c069 100644 --- a/src/components/BMDashboard/WeeklyProjectSummary/ToolStatusDonutChart/ToolStatusDonutChart.module.css +++ b/src/components/BMDashboard/WeeklyProjectSummary/ToolStatusDonutChart/ToolStatusDonutChart.module.css @@ -74,6 +74,65 @@ text-align: center; } +/* Select element styles */ +.filterItem select { + padding: 8px 12px; + border: 1px solid #ccc; + border-radius: 4px; + font-size: 14px; + background-color: #fff; + color: #000; + min-width: 200px; + appearance: none; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m1 6 7 7 7-7'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right 0.75rem center; + background-size: 16px 12px; + padding-right: 2.25rem; +} + +.filterItem select:focus { + outline: none; + border-color: #3b82f6; + box-shadow: 0 0 0 0.2rem rgba(59, 130, 246, 0.25); +} + +/* Dark mode select styles - override global dark mode rules */ +/* Using high specificity selectors to override body.dark-mode * rule */ +:global(body.dark-mode) .toolDonutWrapper .toolDonutFilters .filterItem select, +:global(body.bm-dashboard-dark) .toolDonutWrapper .toolDonutFilters .filterItem select, +.toolDonutWrapperDark .toolDonutFilters .filterItem select { + background-color: #2b3344 !important; + border-color: #3a506b !important; + color: #ffffff !important; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m1 6 7 7 7-7'/%3e%3c/svg%3e") !important; +} + +:global(body.dark-mode) .toolDonutWrapper .toolDonutFilters .filterItem select:focus, +:global(body.bm-dashboard-dark) .toolDonutWrapper .toolDonutFilters .filterItem select:focus, +.toolDonutWrapperDark .toolDonutFilters .filterItem select:focus { + background-color: #2b3344 !important; + border-color: #4a6072 !important; + color: #ffffff !important; + box-shadow: 0 0 0 0.2rem rgba(74, 96, 114, 0.25) !important; +} + +:global(body.dark-mode) .toolDonutWrapper .toolDonutFilters .filterItem select option, +:global(body.bm-dashboard-dark) .toolDonutWrapper .toolDonutFilters .filterItem select option, +.toolDonutWrapperDark .toolDonutFilters .filterItem select option { + background-color: #2b3344 !important; + color: #ffffff !important; +} + +/* Additional specific selectors to ensure override */ +:global(body.dark-mode) .toolDonutWrapper .filterItem select, +:global(body.bm-dashboard-dark) .toolDonutWrapper .filterItem select { + background-color: #2b3344 !important; + border-color: #3a506b !important; + color: #ffffff !important; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m1 6 7 7 7-7'/%3e%3c/svg%3e") !important; +} + /* Responsive adjustments for donut chart */ @media (max-width: 768px) { .toolDonutFilters { @@ -84,5 +143,10 @@ .filterItem { width: 100%; } + + .filterItem select { + width: 100%; + min-width: unset; + } } From 5c84b360752fd43c9f3b8d013fa0a2c540402189 Mon Sep 17 00:00:00 2001 From: Aditya Gambhir <67105262+Aditya-gam@users.noreply.github.com> Date: Tue, 23 Dec 2025 14:06:57 -0800 Subject: [PATCH 03/21] fix: implement dark mode for Supplier Performance chart and filters --- .../SupplierPerformanceGraph.jsx | 71 +++++++++++++------ .../WeeklyProjectSummary.module.css | 45 ++++++++++++ 2 files changed, 96 insertions(+), 20 deletions(-) diff --git a/src/components/BMDashboard/WeeklyProjectSummary/SupplierPerformanceGraph.jsx b/src/components/BMDashboard/WeeklyProjectSummary/SupplierPerformanceGraph.jsx index ff9196383e..c04a092605 100644 --- a/src/components/BMDashboard/WeeklyProjectSummary/SupplierPerformanceGraph.jsx +++ b/src/components/BMDashboard/WeeklyProjectSummary/SupplierPerformanceGraph.jsx @@ -12,7 +12,7 @@ import { LabelList, Label, } from 'recharts'; -import { useDispatch } from 'react-redux'; +import { useDispatch, useSelector } from 'react-redux'; import { Input } from 'reactstrap'; import { fetchSupplierProjects, fetchSupplierPerformance } from '../../../actions/summaryDashboard'; @@ -47,6 +47,7 @@ const getDateRangeOptions = () => { const SupplierPerformanceDashboard = function({ className, height = 420, onDataLoaded }) { const dispatch = useDispatch(); + const darkMode = useSelector(state => state.theme.darkMode); const [supplierData, setSupplierData] = useState([]); const [projects, setProjects] = useState([]); @@ -126,7 +127,7 @@ const SupplierPerformanceDashboard = function({ className, height = 420, onDataL title: { fontSize: 24, fontWeight: 700, - color: '#2D3748', + color: darkMode ? '#f7fafc' : '#2D3748', margin: 0, }, rightControls: { @@ -142,36 +143,39 @@ const SupplierPerformanceDashboard = function({ className, height = 420, onDataL controlLabel: { fontSize: 14, fontWeight: 600, - color: '#4A5568', + color: darkMode ? '#e2e8f0' : '#4A5568', marginBottom: 2, }, controlValue: { fontSize: 14, - color: '#718096', + color: darkMode ? '#cbd5e0' : '#718096', fontWeight: 500, }, select: { minWidth: 140, fontSize: 14, + backgroundColor: darkMode ? '#2b3344' : '#FFFFFF', + borderColor: darkMode ? '#3a506b' : '#ced4da', + color: darkMode ? '#ffffff' : '#212529', }, card: { - border: '1px solid #E2E8F0', + border: darkMode ? '1px solid #3a506b' : '1px solid #E2E8F0', borderRadius: 8, padding: 20, - background: '#FFFFFF', - boxShadow: '0 1px 3px rgba(0, 0, 0, 0.1)', + background: darkMode ? '#253342' : '#FFFFFF', + boxShadow: darkMode ? '0 1px 3px rgba(0, 0, 0, 0.3)' : '0 1px 3px rgba(0, 0, 0, 0.1)', }, message: { textAlign: 'center', padding: 32, - color: '#718096', + color: darkMode ? '#cbd5e0' : '#718096', fontSize: 16, }, chartContainer: { marginTop: 8, }, }), - [className], + [className, darkMode], ); // Y-axis domain to match the image (50-100) @@ -183,14 +187,16 @@ const SupplierPerformanceDashboard = function({ className, height = 420, onDataL return (
-

{`${label}`}

+

+ {`${label}`} +

{`On-Time Delivery: ${payload[0].value}%`}

); @@ -200,7 +206,10 @@ const SupplierPerformanceDashboard = function({ className, height = 420, onDataL return (
-
+

Supplier Performance by On-Time Delivery %

@@ -211,6 +220,7 @@ const SupplierPerformanceDashboard = function({ className, height = 420, onDataL value={selectedDateRange} onChange={e => setSelectedDateRange(e.target.value)} style={styles.select} + className="supplier-performance-select" aria-label="Date Range" > {getDateRangeOptions().map(option => ( @@ -227,6 +237,7 @@ const SupplierPerformanceDashboard = function({ className, height = 420, onDataL value={selectedProject} onChange={e => setSelectedProject(e.target.value)} style={styles.select} + className="supplier-performance-select" aria-label="Project" > @@ -249,7 +260,7 @@ const SupplierPerformanceDashboard = function({ className, height = 420, onDataL (supplierData && supplierData.length > 0 ? ( - + - + } /> @@ -284,7 +311,11 @@ const SupplierPerformanceDashboard = function({ className, height = 420, onDataL `${value}`} /> diff --git a/src/components/BMDashboard/WeeklyProjectSummary/WeeklyProjectSummary.module.css b/src/components/BMDashboard/WeeklyProjectSummary/WeeklyProjectSummary.module.css index 277122a6a7..626ee170bc 100644 --- a/src/components/BMDashboard/WeeklyProjectSummary/WeeklyProjectSummary.module.css +++ b/src/components/BMDashboard/WeeklyProjectSummary/WeeklyProjectSummary.module.css @@ -538,4 +538,49 @@ :global(body.dark-mode) .weeklyProjectSummaryContainer .weeklyProjectSummaryDashboardCategoryContent .projectStatusGrid .statusCard *, :global(body.bm-dashboard-dark) .weeklyProjectSummaryContainer .weeklyProjectSummaryDashboardCategoryContent .projectStatusGrid .statusCard * { color: #1b2a41 !important; +} + +/* ---------------- SUPPLIER PERFORMANCE DARK MODE STYLES ---------------- */ +/* Style reactstrap Input select elements in Supplier Performance component */ +/* Using high specificity to override global body.dark-mode .form-control rules */ +:global(body.dark-mode) .supplier-performance-card-dark select.form-control, +:global(body.bm-dashboard-dark) .supplier-performance-card-dark select.form-control, +:global(body.dark-mode) .supplier-performance-card-dark select, +:global(body.bm-dashboard-dark) .supplier-performance-card-dark select, +:global(body.dark-mode) .supplier-performance-card-dark .supplier-performance-select, +:global(body.bm-dashboard-dark) .supplier-performance-card-dark .supplier-performance-select, +:global(body.dark-mode) .supplier-performance-card-dark .supplier-performance-select.form-control, +:global(body.bm-dashboard-dark) .supplier-performance-card-dark .supplier-performance-select.form-control { + background-color: #2b3344 !important; + border-color: #3a506b !important; + color: #ffffff !important; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m1 6 7 7 7-7'/%3e%3c/svg%3e") !important; + background-repeat: no-repeat !important; + background-position: right 0.75rem center !important; + background-size: 16px 12px !important; + padding-right: 2.25rem !important; +} + +:global(body.dark-mode) .supplier-performance-card-dark select.form-control:focus, +:global(body.bm-dashboard-dark) .supplier-performance-card-dark select.form-control:focus, +:global(body.dark-mode) .supplier-performance-card-dark select:focus, +:global(body.bm-dashboard-dark) .supplier-performance-card-dark select:focus, +:global(body.dark-mode) .supplier-performance-card-dark .supplier-performance-select:focus, +:global(body.bm-dashboard-dark) .supplier-performance-card-dark .supplier-performance-select:focus, +:global(body.dark-mode) .supplier-performance-card-dark .supplier-performance-select.form-control:focus, +:global(body.bm-dashboard-dark) .supplier-performance-card-dark .supplier-performance-select.form-control:focus { + background-color: #2b3344 !important; + border-color: #4a6072 !important; + color: #ffffff !important; + box-shadow: 0 0 0 0.2rem rgba(74, 96, 114, 0.25) !important; +} + +:global(body.dark-mode) .supplier-performance-card-dark select.form-control option, +:global(body.bm-dashboard-dark) .supplier-performance-card-dark select.form-control option, +:global(body.dark-mode) .supplier-performance-card-dark select option, +:global(body.bm-dashboard-dark) .supplier-performance-card-dark select option, +:global(body.dark-mode) .supplier-performance-card-dark .supplier-performance-select option, +:global(body.bm-dashboard-dark) .supplier-performance-card-dark .supplier-performance-select option { + background-color: #2b3344 !important; + color: #ffffff !important; } \ No newline at end of file From 5580ac464a4658e1eb429c8c19a00836f676c6a8 Mon Sep 17 00:00:00 2001 From: Aditya Gambhir <67105262+Aditya-gam@users.noreply.github.com> Date: Tue, 23 Dec 2025 14:21:52 -0800 Subject: [PATCH 04/21] fix: implement dark mode styling for date range filters in Injury Severity chart --- .../InjuryCategoryBarChart.jsx | 169 +++++++++++-- .../InjuryCategoryBarChart.module.css | 223 +++++++++++++++++- 2 files changed, 365 insertions(+), 27 deletions(-) diff --git a/src/components/BMDashboard/WeeklyProjectSummary/GroupedBarGraphInjurySeverity/InjuryCategoryBarChart.jsx b/src/components/BMDashboard/WeeklyProjectSummary/GroupedBarGraphInjurySeverity/InjuryCategoryBarChart.jsx index 2a7070ff71..7958cf9dd0 100644 --- a/src/components/BMDashboard/WeeklyProjectSummary/GroupedBarGraphInjurySeverity/InjuryCategoryBarChart.jsx +++ b/src/components/BMDashboard/WeeklyProjectSummary/GroupedBarGraphInjurySeverity/InjuryCategoryBarChart.jsx @@ -130,6 +130,106 @@ function InjuryCategoryBarChart() { const showLabels = seriesProjectIds.length <= 4; + const selectStyles = useMemo( + () => ({ + control: base => ({ + ...base, + backgroundColor: darkMode ? '#2b3344' : '#fff', + borderColor: darkMode ? '#3a506b' : '#ccc', + color: darkMode ? '#fff' : '#000', + minHeight: 38, + boxShadow: 'none', + borderRadius: 4, + '&:hover': { + borderColor: darkMode ? '#4a6072' : '#999', + }, + }), + menu: base => ({ + ...base, + backgroundColor: darkMode ? '#2b3344' : '#fff', + borderColor: darkMode ? '#3a506b' : '#ccc', + zIndex: 9999, + }), + menuList: base => ({ + ...base, + backgroundColor: darkMode ? '#2b3344' : '#fff', + color: darkMode ? '#fff' : '#000', + padding: 0, + }), + option: (base, state) => ({ + ...base, + backgroundColor: state.isSelected + ? darkMode + ? '#4a6072' + : '#0d55b3' + : state.isFocused + ? darkMode + ? '#3a506b' + : '#deebff' + : darkMode + ? '#2b3344' + : '#fff', + color: state.isSelected ? '#fff' : darkMode ? '#fff' : '#000', + cursor: 'pointer', + '&:active': { + backgroundColor: darkMode ? '#4a6072' : '#0d55b3', + }, + }), + multiValue: base => ({ + ...base, + backgroundColor: darkMode ? '#3a506b' : '#e2e7ee', + borderRadius: 4, + }), + multiValueLabel: base => ({ + ...base, + color: darkMode ? '#fff' : '#333', + fontSize: 12, + padding: '2px 6px', + }), + multiValueRemove: base => ({ + ...base, + color: darkMode ? '#fff' : '#333', + '&:hover': { + backgroundColor: darkMode ? '#5a7082' : '#ffbdad', + color: '#fff', + }, + borderRadius: 4, + padding: 2, + }), + singleValue: base => ({ + ...base, + color: darkMode ? '#fff' : base.color, + }), + input: base => ({ + ...base, + color: darkMode ? '#fff' : base.color, + }), + placeholder: base => ({ + ...base, + color: darkMode ? '#cbd5e0' : '#999', + }), + indicatorSeparator: base => ({ + ...base, + backgroundColor: darkMode ? '#3a506b' : '#ccc', + }), + dropdownIndicator: base => ({ + ...base, + color: darkMode ? '#fff' : '#666', + '&:hover': { + color: darkMode ? '#fff' : '#333', + }, + }), + clearIndicator: base => ({ + ...base, + color: darkMode ? '#fff' : '#666', + '&:hover': { + color: darkMode ? '#fff' : '#333', + }, + }), + }), + [darkMode], + ); + return (
@@ -150,6 +250,7 @@ function InjuryCategoryBarChart() { value={projectNameFilter} onChange={setProjectNameFilter} placeholder="All names" + styles={selectStyles} />
@@ -165,6 +266,7 @@ function InjuryCategoryBarChart() { value={severityFilter} onChange={setSeverityFilter} placeholder="All severities" + styles={selectStyles} />
@@ -180,6 +282,7 @@ function InjuryCategoryBarChart() { value={injuryTypeFilter} onChange={setInjuryTypeFilter} placeholder="All types" + styles={selectStyles} />
@@ -187,32 +290,58 @@ function InjuryCategoryBarChart() { - +
+ +
- +
+ +
diff --git a/src/components/BMDashboard/WeeklyProjectSummary/GroupedBarGraphInjurySeverity/InjuryCategoryBarChart.module.css b/src/components/BMDashboard/WeeklyProjectSummary/GroupedBarGraphInjurySeverity/InjuryCategoryBarChart.module.css index 0e9d9cf263..d8e8456cfd 100644 --- a/src/components/BMDashboard/WeeklyProjectSummary/GroupedBarGraphInjurySeverity/InjuryCategoryBarChart.module.css +++ b/src/components/BMDashboard/WeeklyProjectSummary/GroupedBarGraphInjurySeverity/InjuryCategoryBarChart.module.css @@ -66,33 +66,242 @@ padding: 1rem; } +/* High specificity selectors to override global dark mode rules */ +:global(body.dark-mode) .darkMode .injury-select__control, +:global(body.bm-dashboard-dark) .darkMode .injury-select__control, .darkMode .injury-select__control { - background-color: #2b3e59 !important; + background-color: #2b3344 !important; color: white !important; - border-color: #555 !important; + border-color: #3a506b !important; +} + +.darkMode .injury-select__control:hover { + border-color: #4a6072 !important; +} + +.darkMode .injury-select__control--is-focused { + border-color: #4a6072 !important; + box-shadow: 0 0 0 1px #4a6072 !important; } .darkMode .injury-select__single-value, .darkMode .injury-select__multi-value__label, -.darkMode .injury-select__input-container { +.darkMode .injury-select__input-container, +.darkMode .injury-select__input-container input { color: white !important; } +.darkMode .injury-select__placeholder { + color: #cbd5e0 !important; +} + .darkMode .injury-select__menu { - background-color: #2b3e59 !important; + background-color: #2b3344 !important; + color: white !important; + border-color: #3a506b !important; +} + +.darkMode .injury-select__option { + background-color: #2b3344 !important; + color: white !important; +} + +.darkMode .injury-select__option--is-focused { + background-color: #3a506b !important; + color: white !important; +} + +.darkMode .injury-select__option--is-selected { + background-color: #4a6072 !important; color: white !important; } .darkMode .injury-select__option:hover { - color: black !important; + background-color: #3a506b !important; + color: white !important; +} + +.darkMode .injury-select__multi-value { + background-color: #3a506b !important; +} + +.darkMode .injury-select__multi-value__label { + color: white !important; +} + +.darkMode .injury-select__multi-value__remove { + color: white !important; +} + +.darkMode .injury-select__multi-value__remove:hover { + background-color: #5a7082 !important; + color: white !important; +} + +.darkMode .injury-select__indicator-separator { + background-color: #3a506b !important; +} + +.darkMode .injury-select__dropdown-indicator { + color: white !important; +} + +.darkMode .injury-select__dropdown-indicator:hover { + color: white !important; +} + +.darkMode .injury-select__clear-indicator { + color: white !important; +} + +.darkMode .injury-select__clear-indicator:hover { + color: white !important; +} + +/* DatePicker wrapper */ +.date-picker-wrapper { + width: 100%; +} + +.injury-date-picker-wrapper { + width: 100%; } +/* High specificity selectors for DatePicker inputs - targeting all possible selectors */ +/* Using injury-chart-container in the chain for maximum specificity */ +:global(body.dark-mode) .injury-chart-container.darkMode .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input, +:global(body.bm-dashboard-dark) .injury-chart-container.darkMode .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input, +:global(body.dark-mode) .injury-chart-container.darkMode .date-picker-wrapper .react-datepicker-wrapper .react-datepicker__input-container input, +:global(body.bm-dashboard-dark) .injury-chart-container.darkMode .date-picker-wrapper .react-datepicker-wrapper .react-datepicker__input-container input, +:global(body.dark-mode) .darkMode .injury-chart-container .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input, +:global(body.bm-dashboard-dark) .darkMode .injury-chart-container .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input, +:global(body.dark-mode) .darkMode .injury-chart-container .date-picker-wrapper .react-datepicker-wrapper .react-datepicker__input-container input, +:global(body.bm-dashboard-dark) .darkMode .injury-chart-container .date-picker-wrapper .react-datepicker-wrapper .react-datepicker__input-container input, +:global(body.dark-mode) .darkMode .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input, +:global(body.bm-dashboard-dark) .darkMode .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input, +:global(body.dark-mode) .darkMode .date-picker-wrapper .react-datepicker__input-container input, +:global(body.bm-dashboard-dark) .darkMode .date-picker-wrapper .react-datepicker__input-container input, +:global(body.dark-mode) .darkMode .injury-date-picker-wrapper .react-datepicker__input-container input, +:global(body.bm-dashboard-dark) .darkMode .injury-date-picker-wrapper .react-datepicker__input-container input, +:global(body.dark-mode) .darkMode .react-datepicker-wrapper .react-datepicker__input-container input, +:global(body.bm-dashboard-dark) .darkMode .react-datepicker-wrapper .react-datepicker__input-container input, +:global(body.dark-mode) .darkMode .react-datepicker__input-container input, +:global(body.bm-dashboard-dark) .darkMode .react-datepicker__input-container input, +.injury-chart-container.darkMode .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input, +.injury-chart-container.darkMode .date-picker-wrapper .react-datepicker-wrapper .react-datepicker__input-container input, +.darkMode .injury-chart-container .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input, +.darkMode .injury-chart-container .date-picker-wrapper .react-datepicker-wrapper .react-datepicker__input-container input, +.darkMode .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input, +.darkMode .date-picker-wrapper .react-datepicker__input-container input, +.darkMode .injury-date-picker-wrapper .react-datepicker__input-container input, +.darkMode .react-datepicker-wrapper .react-datepicker__input-container input, .darkMode .react-datepicker__input-container input { - background-color: #2b3e59 !important; + background-color: #2b3344 !important; color: white !important; - border: 1px solid #555; + border: 1px solid #3a506b !important; padding: 0.5rem; border-radius: 4px; + width: 100%; +} + +/* Target input elements directly within the wrapper - including wrapperClassName */ +:global(body.dark-mode) .injury-chart-container.darkMode .date-picker-wrapper .injury-date-picker-wrapper input, +:global(body.bm-dashboard-dark) .injury-chart-container.darkMode .date-picker-wrapper .injury-date-picker-wrapper input, +:global(body.dark-mode) .darkMode .injury-chart-container .date-picker-wrapper .injury-date-picker-wrapper input, +:global(body.bm-dashboard-dark) .darkMode .injury-chart-container .date-picker-wrapper .injury-date-picker-wrapper input, +:global(body.dark-mode) .darkMode .date-picker-wrapper .injury-date-picker-wrapper input, +:global(body.bm-dashboard-dark) .darkMode .date-picker-wrapper .injury-date-picker-wrapper input, +:global(body.dark-mode) .darkMode .injury-date-picker-wrapper input, +:global(body.bm-dashboard-dark) .darkMode .injury-date-picker-wrapper input, +.injury-chart-container.darkMode .date-picker-wrapper .injury-date-picker-wrapper input, +.darkMode .injury-chart-container .date-picker-wrapper .injury-date-picker-wrapper input, +.darkMode .date-picker-wrapper .injury-date-picker-wrapper input, +.darkMode .injury-date-picker-wrapper input { + background-color: #2b3344 !important; + color: white !important; + border: 1px solid #3a506b !important; + padding: 0.5rem; + border-radius: 4px; + width: 100%; +} + +/* Target inputs with react-datepicker-ignore-onclickoutside class */ +:global(body.dark-mode) .injury-chart-container.darkMode .date-picker-wrapper .injury-date-picker-wrapper input.react-datepicker-ignore-onclickoutside, +:global(body.bm-dashboard-dark) .injury-chart-container.darkMode .date-picker-wrapper .injury-date-picker-wrapper input.react-datepicker-ignore-onclickoutside, +:global(body.dark-mode) .darkMode .injury-chart-container .date-picker-wrapper .injury-date-picker-wrapper input.react-datepicker-ignore-onclickoutside, +:global(body.bm-dashboard-dark) .darkMode .injury-chart-container .date-picker-wrapper .injury-date-picker-wrapper input.react-datepicker-ignore-onclickoutside, +:global(body.dark-mode) .darkMode .date-picker-wrapper .injury-date-picker-wrapper input.react-datepicker-ignore-onclickoutside, +:global(body.bm-dashboard-dark) .darkMode .date-picker-wrapper .injury-date-picker-wrapper input.react-datepicker-ignore-onclickoutside, +.injury-chart-container.darkMode .date-picker-wrapper .injury-date-picker-wrapper input.react-datepicker-ignore-onclickoutside, +.darkMode .injury-chart-container .date-picker-wrapper .injury-date-picker-wrapper input.react-datepicker-ignore-onclickoutside, +.darkMode .date-picker-wrapper .injury-date-picker-wrapper input.react-datepicker-ignore-onclickoutside { + background-color: #2b3344 !important; + color: white !important; + border: 1px solid #3a506b !important; + padding: 0.5rem; + border-radius: 4px; + width: 100%; +} + +/* Placeholder styles */ +:global(body.dark-mode) .injury-chart-container.darkMode .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input::placeholder, +:global(body.bm-dashboard-dark) .injury-chart-container.darkMode .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input::placeholder, +:global(body.dark-mode) .darkMode .injury-chart-container .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input::placeholder, +:global(body.bm-dashboard-dark) .darkMode .injury-chart-container .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input::placeholder, +:global(body.dark-mode) .darkMode .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input::placeholder, +:global(body.bm-dashboard-dark) .darkMode .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input::placeholder, +:global(body.dark-mode) .darkMode .date-picker-wrapper .react-datepicker__input-container input::placeholder, +:global(body.bm-dashboard-dark) .darkMode .date-picker-wrapper .react-datepicker__input-container input::placeholder, +:global(body.dark-mode) .darkMode .injury-date-picker-wrapper input::placeholder, +:global(body.bm-dashboard-dark) .darkMode .injury-date-picker-wrapper input::placeholder, +.injury-chart-container.darkMode .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input::placeholder, +.darkMode .injury-chart-container .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input::placeholder, +.darkMode .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input::placeholder, +.darkMode .date-picker-wrapper .react-datepicker__input-container input::placeholder, +.darkMode .injury-date-picker-wrapper input::placeholder, +.darkMode .date-picker-wrapper .injury-date-picker-wrapper input::placeholder { + color: #cbd5e0 !important; +} + +/* Focus styles */ +:global(body.dark-mode) .injury-chart-container.darkMode .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input:focus, +:global(body.bm-dashboard-dark) .injury-chart-container.darkMode .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input:focus, +:global(body.dark-mode) .darkMode .injury-chart-container .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input:focus, +:global(body.bm-dashboard-dark) .darkMode .injury-chart-container .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input:focus, +:global(body.dark-mode) .darkMode .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input:focus, +:global(body.bm-dashboard-dark) .darkMode .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input:focus, +:global(body.dark-mode) .darkMode .date-picker-wrapper .react-datepicker__input-container input:focus, +:global(body.bm-dashboard-dark) .darkMode .date-picker-wrapper .react-datepicker__input-container input:focus, +:global(body.dark-mode) .darkMode .react-datepicker__input-container input:focus, +:global(body.bm-dashboard-dark) .darkMode .react-datepicker__input-container input:focus, +:global(body.dark-mode) .injury-chart-container.darkMode .date-picker-wrapper .injury-date-picker-wrapper input:focus, +:global(body.bm-dashboard-dark) .injury-chart-container.darkMode .date-picker-wrapper .injury-date-picker-wrapper input:focus, +:global(body.dark-mode) .darkMode .injury-chart-container .date-picker-wrapper .injury-date-picker-wrapper input:focus, +:global(body.bm-dashboard-dark) .darkMode .injury-chart-container .date-picker-wrapper .injury-date-picker-wrapper input:focus, +:global(body.dark-mode) .darkMode .date-picker-wrapper .injury-date-picker-wrapper input:focus, +:global(body.bm-dashboard-dark) .darkMode .date-picker-wrapper .injury-date-picker-wrapper input:focus, +:global(body.dark-mode) .darkMode .injury-date-picker-wrapper input:focus, +:global(body.bm-dashboard-dark) .darkMode .injury-date-picker-wrapper input:focus, +:global(body.dark-mode) .injury-chart-container.darkMode .date-picker-wrapper .injury-date-picker-wrapper input.react-datepicker-ignore-onclickoutside:focus, +:global(body.bm-dashboard-dark) .injury-chart-container.darkMode .date-picker-wrapper .injury-date-picker-wrapper input.react-datepicker-ignore-onclickoutside:focus, +:global(body.dark-mode) .darkMode .injury-chart-container .date-picker-wrapper .injury-date-picker-wrapper input.react-datepicker-ignore-onclickoutside:focus, +:global(body.bm-dashboard-dark) .darkMode .injury-chart-container .date-picker-wrapper .injury-date-picker-wrapper input.react-datepicker-ignore-onclickoutside:focus, +:global(body.dark-mode) .darkMode .date-picker-wrapper .injury-date-picker-wrapper input.react-datepicker-ignore-onclickoutside:focus, +:global(body.bm-dashboard-dark) .darkMode .date-picker-wrapper .injury-date-picker-wrapper input.react-datepicker-ignore-onclickoutside:focus, +.injury-chart-container.darkMode .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input:focus, +.darkMode .injury-chart-container .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input:focus, +.darkMode .date-picker-wrapper .injury-date-picker-wrapper .react-datepicker__input-container input:focus, +.darkMode .date-picker-wrapper .react-datepicker__input-container input:focus, +.darkMode .injury-date-picker-wrapper input:focus, +.darkMode .date-picker-wrapper .injury-date-picker-wrapper input:focus, +.injury-chart-container.darkMode .date-picker-wrapper .injury-date-picker-wrapper input.react-datepicker-ignore-onclickoutside:focus, +.darkMode .injury-chart-container .date-picker-wrapper .injury-date-picker-wrapper input.react-datepicker-ignore-onclickoutside:focus, +.darkMode .date-picker-wrapper .injury-date-picker-wrapper input.react-datepicker-ignore-onclickoutside:focus { + background-color: #2b3344 !important; + border-color: #4a6072 !important; + color: white !important; + box-shadow: 0 0 0 0.2rem rgba(74, 96, 114, 0.25) !important; + outline: none !important; } .darkMode .error { From 05fb476c95979d814351fda95da1bd3248398201 Mon Sep 17 00:00:00 2001 From: Aditya Gambhir <67105262+Aditya-gam@users.noreply.github.com> Date: Tue, 23 Dec 2025 14:41:13 -0800 Subject: [PATCH 05/21] fix: improve dark mode styling for Project Risk Profile Overview - Update filter dropdowns to use #2b3344 background and #fff text in dark mode - Change chart container background from #1e1e1e to #253342 in dark mode - Set axes labels to #fff in dark mode for better visibility - Refactor nested ternary operations for improved code readability - Add high-specificity CSS selectors to prevent style overrides --- .../ProjectRiskProfileOverview.jsx | 120 ++++++++++- .../ProjectRiskProfileOverview.module.css | 201 +++++++++++++++--- 2 files changed, 284 insertions(+), 37 deletions(-) diff --git a/src/components/BMDashboard/WeeklyProjectSummary/ProjectRiskProfileOverview.jsx b/src/components/BMDashboard/WeeklyProjectSummary/ProjectRiskProfileOverview.jsx index 8c7fbd4063..71f63a3f0b 100644 --- a/src/components/BMDashboard/WeeklyProjectSummary/ProjectRiskProfileOverview.jsx +++ b/src/components/BMDashboard/WeeklyProjectSummary/ProjectRiskProfileOverview.jsx @@ -1,4 +1,4 @@ -import { useState, useEffect, useRef } from 'react'; +import { useState, useEffect, useRef, useMemo } from 'react'; import { BarChart, Bar, @@ -72,6 +72,109 @@ export default function ProjectRiskProfileOverview() { return `${selectedDates.length} selected`; }; + const selectStyles = useMemo( + () => ({ + control: base => ({ + ...base, + backgroundColor: darkMode ? '#2b3344' : '#fff', + borderColor: darkMode ? '#3a506b' : '#ccc', + color: darkMode ? '#fff' : '#000', + minHeight: 34, + boxShadow: 'none', + borderRadius: 4, + '&:hover': { + borderColor: darkMode ? '#4a6072' : '#999', + }, + }), + menu: base => ({ + ...base, + backgroundColor: darkMode ? '#2b3344' : '#fff', + borderColor: darkMode ? '#3a506b' : '#ccc', + zIndex: 9999, + }), + menuList: base => ({ + ...base, + backgroundColor: darkMode ? '#2b3344' : '#fff', + color: darkMode ? '#fff' : '#000', + padding: 0, + }), + option: (base, state) => { + let backgroundColor; + if (state.isSelected) { + backgroundColor = darkMode ? '#4a6072' : '#0d55b3'; + } else if (state.isFocused) { + backgroundColor = darkMode ? '#3a506b' : '#deebff'; + } else { + backgroundColor = darkMode ? '#2b3344' : '#fff'; + } + + const textColor = state.isSelected || darkMode ? '#fff' : '#000'; + + return { + ...base, + backgroundColor, + color: textColor, + cursor: 'pointer', + '&:active': { + backgroundColor: darkMode ? '#4a6072' : '#0d55b3', + }, + }; + }, + multiValue: base => ({ + ...base, + backgroundColor: darkMode ? '#3a506b' : '#e2e7ee', + borderRadius: 4, + }), + multiValueLabel: base => ({ + ...base, + color: darkMode ? '#fff' : '#333', + fontSize: 12, + padding: '2px 6px', + }), + multiValueRemove: base => ({ + ...base, + color: darkMode ? '#fff' : '#333', + '&:hover': { + backgroundColor: darkMode ? '#5a7082' : '#ffbdad', + color: '#fff', + }, + borderRadius: 4, + padding: 2, + }), + singleValue: base => ({ + ...base, + color: darkMode ? '#fff' : base.color, + }), + input: base => ({ + ...base, + color: darkMode ? '#fff' : base.color, + }), + placeholder: base => ({ + ...base, + color: darkMode ? '#cbd5e0' : '#999', + }), + indicatorSeparator: base => ({ + ...base, + backgroundColor: darkMode ? '#3a506b' : '#ccc', + }), + dropdownIndicator: base => ({ + ...base, + color: darkMode ? '#fff' : '#666', + '&:hover': { + color: darkMode ? '#fff' : '#333', + }, + }), + clearIndicator: base => ({ + ...base, + color: darkMode ? '#fff' : '#666', + '&:hover': { + color: darkMode ? '#fff' : '#333', + }, + }), + }), + [darkMode], + ); + if (loading) return
Loading project risk profiles...
; if (error) return
{error}
; @@ -104,6 +207,7 @@ export default function ProjectRiskProfileOverview() { closeMenuOnSelect={false} hideSelectedOptions={false} components={{ IndicatorSeparator: () => null, ClearIndicator: () => null }} + styles={selectStyles} />
)} @@ -132,6 +236,7 @@ export default function ProjectRiskProfileOverview() { closeMenuOnSelect={false} hideSelectedOptions={false} components={{ IndicatorSeparator: () => null, ClearIndicator: () => null }} + styles={selectStyles} /> )} @@ -151,8 +256,17 @@ export default function ProjectRiskProfileOverview() { barGap={8} > - - + + diff --git a/src/components/BMDashboard/WeeklyProjectSummary/ProjectRiskProfileOverview.module.css b/src/components/BMDashboard/WeeklyProjectSummary/ProjectRiskProfileOverview.module.css index 3d6393ea8c..2611e8a0db 100644 --- a/src/components/BMDashboard/WeeklyProjectSummary/ProjectRiskProfileOverview.module.css +++ b/src/components/BMDashboard/WeeklyProjectSummary/ProjectRiskProfileOverview.module.css @@ -47,7 +47,14 @@ } .darkMode .dropdownLabel { - color: #ddd; + color: #fff; +} + +/* High specificity selectors for dark mode labels */ +:global(body.dark-mode) .wrapper.darkMode .dropdownLabel, +:global(body.bm-dashboard-dark) .wrapper.darkMode .dropdownLabel, +.wrapper.darkMode .dropdownLabel { + color: #fff !important; } .dropdownButton { @@ -69,13 +76,28 @@ } .darkMode .dropdownButton { - color: #eee; - background: #2b2b2b; - border: 1px solid #555; + color: #fff; + background: #2b3344; + border: 1px solid #3a506b; } .darkMode .dropdownButton:hover { - background: #3a3a3a; + background: #3a506b; +} + +/* High specificity selectors for dropdown button in dark mode */ +:global(body.dark-mode) .wrapper.darkMode .dropdownButton, +:global(body.bm-dashboard-dark) .wrapper.darkMode .dropdownButton, +.wrapper.darkMode .dropdownButton { + color: #fff !important; + background: #2b3344 !important; + border-color: #3a506b !important; +} + +:global(body.dark-mode) .wrapper.darkMode .dropdownButton:hover, +:global(body.bm-dashboard-dark) .wrapper.darkMode .dropdownButton:hover, +.wrapper.darkMode .dropdownButton:hover { + background: #3a506b !important; } .dropdownMenu { @@ -92,11 +114,18 @@ } .darkMode .dropdownMenu { - background: #2c2c2c; + background: #2b3344; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.5); } -/* React-select overrides */ +/* High specificity selectors for dropdown menu in dark mode */ +:global(body.dark-mode) .wrapper.darkMode .dropdownMenu, +:global(body.bm-dashboard-dark) .wrapper.darkMode .dropdownMenu, +.wrapper.darkMode .dropdownMenu { + background: #2b3344 !important; +} + +/* React-select overrides - Base styles */ .customSelect__control { font-size: 14px; min-height: 34px; @@ -105,22 +134,12 @@ box-shadow: none; } -.darkMode .customSelect__control { - color: #eee; - background: #2c2c2c; -} - .customSelect__multi-value { background: #e6f7ff; font-size: 12px; margin: 2px; } -.darkMode .customSelect__multi-value { - background: #444; - color: #eee; -} - .customSelect__option { color: #000; background-color: #fff; @@ -130,17 +149,140 @@ background-color: #f0f0f0; } -.darkMode .customSelect__option { - color: #eee; - background-color: #2c2c2c; +.customSelect__menu { + z-index: 9999; } -.darkMode .customSelect__option:hover { - background-color: #3a3a3a; +/* High specificity selectors for react-select in dark mode */ +/* Control (the main select input) */ +:global(body.dark-mode) .wrapper.darkMode .customSelect__control, +:global(body.bm-dashboard-dark) .wrapper.darkMode .customSelect__control, +.wrapper.darkMode .customSelect__control, +:global(body.dark-mode) .darkMode .wrapper .customSelect__control, +:global(body.bm-dashboard-dark) .darkMode .wrapper .customSelect__control, +.darkMode .wrapper .customSelect__control { + background-color: #2b3344 !important; + color: #fff !important; + border-color: #3a506b !important; } -.customSelect__menu { - z-index: 9999; +.wrapper.darkMode .customSelect__control:hover, +.darkMode .wrapper .customSelect__control:hover { + border-color: #4a6072 !important; +} + +.wrapper.darkMode .customSelect__control--is-focused, +.darkMode .wrapper .customSelect__control--is-focused { + border-color: #4a6072 !important; + box-shadow: 0 0 0 1px #4a6072 !important; +} + +/* Menu (dropdown menu) */ +:global(body.dark-mode) .wrapper.darkMode .customSelect__menu, +:global(body.bm-dashboard-dark) .wrapper.darkMode .customSelect__menu, +.wrapper.darkMode .customSelect__menu, +:global(body.dark-mode) .darkMode .wrapper .customSelect__menu, +:global(body.bm-dashboard-dark) .darkMode .wrapper .customSelect__menu, +.darkMode .wrapper .customSelect__menu { + background-color: #2b3344 !important; + color: #fff !important; + border-color: #3a506b !important; +} + +/* Menu list */ +.wrapper.darkMode .customSelect__menu-list, +.darkMode .wrapper .customSelect__menu-list { + background-color: #2b3344 !important; + color: #fff !important; +} + +/* Option */ +.wrapper.darkMode .customSelect__option, +.darkMode .wrapper .customSelect__option { + background-color: #2b3344 !important; + color: #fff !important; +} + +.wrapper.darkMode .customSelect__option--is-focused, +.darkMode .wrapper .customSelect__option--is-focused { + background-color: #3a506b !important; + color: #fff !important; +} + +.wrapper.darkMode .customSelect__option--is-selected, +.darkMode .wrapper .customSelect__option--is-selected { + background-color: #4a6072 !important; + color: #fff !important; +} + +.wrapper.darkMode .customSelect__option:hover, +.darkMode .wrapper .customSelect__option:hover { + background-color: #3a506b !important; + color: #fff !important; +} + +/* Multi-value */ +.wrapper.darkMode .customSelect__multi-value, +.darkMode .wrapper .customSelect__multi-value { + background-color: #3a506b !important; +} + +.wrapper.darkMode .customSelect__multi-value__label, +.darkMode .wrapper .customSelect__multi-value__label { + color: #fff !important; +} + +.wrapper.darkMode .customSelect__multi-value__remove, +.darkMode .wrapper .customSelect__multi-value__remove { + color: #fff !important; +} + +.wrapper.darkMode .customSelect__multi-value__remove:hover, +.darkMode .wrapper .customSelect__multi-value__remove:hover { + background-color: #5a7082 !important; + color: #fff !important; +} + +/* Single value and input */ +.wrapper.darkMode .customSelect__single-value, +.darkMode .wrapper .customSelect__single-value, +.wrapper.darkMode .customSelect__input-container, +.darkMode .wrapper .customSelect__input-container, +.wrapper.darkMode .customSelect__input-container input, +.darkMode .wrapper .customSelect__input-container input { + color: #fff !important; +} + +/* Placeholder */ +.wrapper.darkMode .customSelect__placeholder, +.darkMode .wrapper .customSelect__placeholder { + color: #cbd5e0 !important; +} + +/* Indicators */ +.wrapper.darkMode .customSelect__indicator-separator, +.darkMode .wrapper .customSelect__indicator-separator { + background-color: #3a506b !important; +} + +.wrapper.darkMode .customSelect__dropdown-indicator, +.darkMode .wrapper .customSelect__dropdown-indicator { + color: #fff !important; +} + +.wrapper.darkMode .customSelect__dropdown-indicator:hover, +.darkMode .wrapper .customSelect__dropdown-indicator:hover { + color: #fff !important; +} + +.wrapper.darkMode .customSelect__clear-indicator, +.darkMode .wrapper .customSelect__clear-indicator { + color: #fff !important; +} + +.wrapper.darkMode .customSelect__clear-indicator:hover, +.darkMode .wrapper .customSelect__clear-indicator:hover { + color: #fff !important; } .error { @@ -154,20 +296,11 @@ /* ===================== DARK MODE ===================== */ .darkMode .container { - background: #1e1e1e; + background: #253342; box-shadow: 0 2px 8px #111; color: #eee; } -.darkMode .dropdownButton { - color: #ccc; -} - -.darkMode .dropdownMenu { - background: #2c2c2c; - box-shadow: 0 2px 8px #000; -} - .darkMode .heading { color: #eee; } From 6ab9116f93b3aecbffe71e7f5fcf7ef07ce612c1 Mon Sep 17 00:00:00 2001 From: Aditya Gambhir <67105262+Aditya-gam@users.noreply.github.com> Date: Tue, 23 Dec 2025 14:53:04 -0800 Subject: [PATCH 06/21] fix: improve dark mode styling for Longest Open Issues chart - Update container background from #121212 to #253342 in dark mode - Change chart background to #253342 in dark mode - Set axes labels to #fff for better visibility - Update filter dropdowns and date pickers to use #2b3344 background and #fff text - Add high-specificity CSS selectors to prevent style overrides - Refactor nested ternary operations for improved code readability --- .../BMDashboard/Issues/issueChart.module.css | 195 ++++++++++++++++-- .../BMDashboard/Issues/openIssueCharts.jsx | 129 +++++++++--- 2 files changed, 282 insertions(+), 42 deletions(-) diff --git a/src/components/BMDashboard/Issues/issueChart.module.css b/src/components/BMDashboard/Issues/issueChart.module.css index bf6d4d6a38..f8ad99711a 100644 --- a/src/components/BMDashboard/Issues/issueChart.module.css +++ b/src/components/BMDashboard/Issues/issueChart.module.css @@ -183,6 +183,12 @@ .chartContainer { width: 100%; height: 500px; + background: #fff; + border-radius: 8px; +} + +.chartContainerDark { + background: #253342; } /* Container for entire chart section */ @@ -206,9 +212,16 @@ width: 50vw; /* full viewport width */ padding: 20px; box-sizing: border-box; /* include padding in width */ - background: #121212; + background: #253342 !important; box-shadow: 0 4px 12px rgba(0,0,0,0.9); - color: #ccd1dc; + color: #fff; +} + +/* High specificity selectors to ensure container background is not overridden */ +:global(body.dark-mode) .issueChartContainerDark, +:global(body.bm-dashboard-dark) .issueChartContainerDark, +.issueChartContainerDark { + background: #253342 !important; } /* Chart title */ @@ -252,7 +265,7 @@ .dateLabelDark { font-size: 14px; font-weight: 500; - color: #cfd7e3; + color: #fff; } /* Date picker */ @@ -270,9 +283,9 @@ } .dateDark { - background: #22272e; - color: #cfd7e3; - border-color: #3d444d; + background: #2b3344 !important; + color: #fff !important; + border-color: #3a506b !important; } /* React select */ @@ -286,40 +299,125 @@ font-size: 18px; } -/* DARK MODE CONTROL */ +/* DARK MODE CONTROL - High specificity selectors */ +:global(body.dark-mode) .issueChartContainerDark .select__control, +:global(body.bm-dashboard-dark) .issueChartContainerDark .select__control, +.issueChartContainerDark .select__control, +:global(body.dark-mode) .issueChartContainerDark .controlDark, +:global(body.bm-dashboard-dark) .issueChartContainerDark .controlDark, .controlDark { - background: #22272e !important; - border-color: #3d444d !important; - color: #cfd7e3 !important; + background: #2b3344 !important; + border-color: #3a506b !important; + color: #fff !important; +} + +.issueChartContainerDark .select__control:hover, +.issueChartContainerDark .controlDark:hover { + border-color: #4a6072 !important; +} + +.issueChartContainerDark .select__control--is-focused, +.issueChartContainerDark .controlDark--is-focused { + border-color: #4a6072 !important; + box-shadow: 0 0 0 1px #4a6072 !important; } /* VALUE TEXT */ +:global(body.dark-mode) .issueChartContainerDark .select__single-value, +:global(body.bm-dashboard-dark) .issueChartContainerDark .select__single-value, +.issueChartContainerDark .select__single-value, +:global(body.dark-mode) .issueChartContainerDark .select__input-container, +:global(body.bm-dashboard-dark) .issueChartContainerDark .select__input-container, +.issueChartContainerDark .select__input-container, +:global(body.dark-mode) .issueChartContainerDark .select__input-container input, +:global(body.bm-dashboard-dark) .issueChartContainerDark .select__input-container input, +.issueChartContainerDark .select__input-container input, .valueDark { - color: #cfd7e3 !important; + color: #fff !important; } /* MENU */ +:global(body.dark-mode) .issueChartContainerDark .select__menu, +:global(body.bm-dashboard-dark) .issueChartContainerDark .select__menu, +.issueChartContainerDark .select__menu, .menuDark { - background: #22272e !important; + background: #2b3344 !important; + border-color: #3a506b !important; } -/* OPTIONS — keep only base default color */ +/* OPTIONS */ +:global(body.dark-mode) .issueChartContainerDark .select__option, +:global(body.bm-dashboard-dark) .issueChartContainerDark .select__option, +.issueChartContainerDark .select__option, .optionDark { - color: #cfd7e3 !important; + color: #fff !important; +} + +.issueChartContainerDark .select__option--is-focused, +.issueChartContainerDark .optionDark--is-focused { + background-color: #3a506b !important; + color: #fff !important; +} + +.issueChartContainerDark .select__option--is-selected, +.issueChartContainerDark .optionDark--is-selected { + background-color: #4a6072 !important; + color: #fff !important; } /* MULTI VALUE */ +:global(body.dark-mode) .issueChartContainerDark .select__multi-value, +:global(body.bm-dashboard-dark) .issueChartContainerDark .select__multi-value, +.issueChartContainerDark .select__multi-value, .multiValueDark { - background: #3a3f45 !important; - color: #cfd7e3 !important; + background: #3a506b !important; + color: #fff !important; } +:global(body.dark-mode) .issueChartContainerDark .select__multi-value__label, +:global(body.bm-dashboard-dark) .issueChartContainerDark .select__multi-value__label, +.issueChartContainerDark .select__multi-value__label, .multiValueLabelDark { - color: #cfd7e3 !important; + color: #fff !important; } +:global(body.dark-mode) .issueChartContainerDark .select__multi-value__remove, +:global(body.bm-dashboard-dark) .issueChartContainerDark .select__multi-value__remove, +.issueChartContainerDark .select__multi-value__remove, .multiValueRemoveDark { - color: #cfd7e3 !important; + color: #fff !important; +} + +.issueChartContainerDark .select__multi-value__remove:hover, +.issueChartContainerDark .multiValueRemoveDark:hover { + background-color: #5a7082 !important; + color: #fff !important; +} + +/* PLACEHOLDER */ +.issueChartContainerDark .select__placeholder { + color: #cbd5e0 !important; +} + +/* INDICATORS */ +.issueChartContainerDark .select__indicator-separator { + background-color: #3a506b !important; +} + +.issueChartContainerDark .select__dropdown-indicator { + color: #fff !important; +} + +.issueChartContainerDark .select__dropdown-indicator:hover { + color: #fff !important; +} + +.issueChartContainerDark .select__clear-indicator { + color: #fff !important; +} + +.issueChartContainerDark .select__clear-indicator:hover { + color: #fff !important; } /* ===== LIGHT MODE ===== */ @@ -374,6 +472,67 @@ font-size: 16px; } +.issueChartContainerDark .rowLabel { + color: #fff; +} + + +/* High specificity selectors for DatePicker inputs in dark mode */ +:global(body.dark-mode) .issueChartContainerDark .dateField .react-datepicker__input-container input, +:global(body.bm-dashboard-dark) .issueChartContainerDark .dateField .react-datepicker__input-container input, +:global(body.dark-mode) .issueChartContainerDark .dateField .react-datepicker-wrapper .react-datepicker__input-container input, +:global(body.bm-dashboard-dark) .issueChartContainerDark .dateField .react-datepicker-wrapper .react-datepicker__input-container input, +:global(body.dark-mode) .issueChartContainerDark .dateField input, +:global(body.bm-dashboard-dark) .issueChartContainerDark .dateField input, +:global(body.dark-mode) .issueChartContainerDark .dateDark, +:global(body.bm-dashboard-dark) .issueChartContainerDark .dateDark, +.issueChartContainerDark .dateField .react-datepicker__input-container input, +.issueChartContainerDark .dateField .react-datepicker-wrapper .react-datepicker__input-container input, +.issueChartContainerDark .dateField input, +.issueChartContainerDark .dateDark { + background-color: #2b3344 !important; + color: #fff !important; + border: 1px solid #3a506b !important; +} + +/* DatePicker input with react-datepicker-ignore-onclickoutside */ +:global(body.dark-mode) .issueChartContainerDark .dateField input.react-datepicker-ignore-onclickoutside, +:global(body.bm-dashboard-dark) .issueChartContainerDark .dateField input.react-datepicker-ignore-onclickoutside, +:global(body.dark-mode) .issueChartContainerDark .dateField .react-datepicker-wrapper input.react-datepicker-ignore-onclickoutside, +:global(body.bm-dashboard-dark) .issueChartContainerDark .dateField .react-datepicker-wrapper input.react-datepicker-ignore-onclickoutside, +.issueChartContainerDark .dateField input.react-datepicker-ignore-onclickoutside, +.issueChartContainerDark .dateField .react-datepicker-wrapper input.react-datepicker-ignore-onclickoutside { + background-color: #2b3344 !important; + color: #fff !important; + border: 1px solid #3a506b !important; +} + +/* DatePicker placeholder */ +:global(body.dark-mode) .issueChartContainerDark .dateField .react-datepicker__input-container input::placeholder, +:global(body.bm-dashboard-dark) .issueChartContainerDark .dateField .react-datepicker__input-container input::placeholder, +:global(body.dark-mode) .issueChartContainerDark .dateField input::placeholder, +:global(body.bm-dashboard-dark) .issueChartContainerDark .dateField input::placeholder, +.issueChartContainerDark .dateField .react-datepicker__input-container input::placeholder, +.issueChartContainerDark .dateField input::placeholder { + color: #cbd5e0 !important; +} + +/* DatePicker focus state */ +:global(body.dark-mode) .issueChartContainerDark .dateField .react-datepicker__input-container input:focus, +:global(body.bm-dashboard-dark) .issueChartContainerDark .dateField .react-datepicker__input-container input:focus, +:global(body.dark-mode) .issueChartContainerDark .dateField input:focus, +:global(body.bm-dashboard-dark) .issueChartContainerDark .dateField input:focus, +:global(body.dark-mode) .issueChartContainerDark .dateDark:focus, +:global(body.bm-dashboard-dark) .issueChartContainerDark .dateDark:focus, +.issueChartContainerDark .dateField .react-datepicker__input-container input:focus, +.issueChartContainerDark .dateField input:focus, +.issueChartContainerDark .dateDark:focus { + background-color: #2b3344 !important; + border-color: #4a6072 !important; + color: #fff !important; + box-shadow: 0 0 0 0.2rem rgba(74, 96, 114, 0.25) !important; + outline: none !important; +} /* Responsive */ @media (max-width: 650px) { diff --git a/src/components/BMDashboard/Issues/openIssueCharts.jsx b/src/components/BMDashboard/Issues/openIssueCharts.jsx index 729cc19032..9a8af20167 100644 --- a/src/components/BMDashboard/Issues/openIssueCharts.jsx +++ b/src/components/BMDashboard/Issues/openIssueCharts.jsx @@ -122,7 +122,7 @@ function IssueCharts() { const labelClass = `${styles.issueChartLabel} ${darkMode ? styles.issueChartLabelDark : ''}`; return ( -
+

Longest Open Issues

{/* Chart */} -
+
{normalizedIssues.length === 0 ? (

No issues found.

) : ( - + Date: Tue, 23 Dec 2025 15:13:40 -0800 Subject: [PATCH 07/21] fix: correct placeholder text color in Most Frequent Keywords date filters - Set date range filter placeholder text color to #fff in dark mode - Add high-specificity CSS selectors to prevent style overrides - Target both direct className and react-datepicker wrapper structures --- .../MostFrequentKeywords.module.css | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/components/BMDashboard/WeeklyProjectSummary/MostFrequentKeywords/MostFrequentKeywords.module.css b/src/components/BMDashboard/WeeklyProjectSummary/MostFrequentKeywords/MostFrequentKeywords.module.css index 6349ed7b4b..96a4db494e 100644 --- a/src/components/BMDashboard/WeeklyProjectSummary/MostFrequentKeywords/MostFrequentKeywords.module.css +++ b/src/components/BMDashboard/WeeklyProjectSummary/MostFrequentKeywords/MostFrequentKeywords.module.css @@ -123,3 +123,30 @@ background-color: #3a506b !important; color: #ffffff !important; } + +/* DatePicker input and placeholder text color in dark mode */ +:global(body.dark-mode) .mfkContainer.darkMode .react-datepicker__input-container input, +:global(body.bm-dashboard-dark) .mfkContainer.darkMode .react-datepicker__input-container input, +:global(body.dark-mode) .mfkContainer.darkMode .react-datepicker-wrapper .react-datepicker__input-container input, +:global(body.bm-dashboard-dark) .mfkContainer.darkMode .react-datepicker-wrapper .react-datepicker__input-container input, +:global(body.dark-mode) .mfkContainer.darkMode .mfkDatepicker, +:global(body.bm-dashboard-dark) .mfkContainer.darkMode .mfkDatepicker, +.mfkContainer.darkMode .react-datepicker__input-container input, +.mfkContainer.darkMode .react-datepicker-wrapper .react-datepicker__input-container input, +.mfkContainer.darkMode .mfkDatepicker { + color: #fff !important; +} + +/* DatePicker placeholder text color in dark mode */ +:global(body.dark-mode) .mfkContainer.darkMode .mfkDatepicker::placeholder, +:global(body.bm-dashboard-dark) .mfkContainer.darkMode .mfkDatepicker::placeholder, +:global(body.dark-mode) .mfkContainer.darkMode .react-datepicker__input-container input::placeholder, +:global(body.bm-dashboard-dark) .mfkContainer.darkMode .react-datepicker__input-container input::placeholder, +:global(body.dark-mode) .mfkContainer.darkMode .react-datepicker-wrapper .react-datepicker__input-container input::placeholder, +:global(body.bm-dashboard-dark) .mfkContainer.darkMode .react-datepicker-wrapper .react-datepicker__input-container input::placeholder, +.mfkContainer.darkMode .mfkDatepicker::placeholder, +.mfkContainer.darkMode .react-datepicker__input-container input::placeholder, +.mfkContainer.darkMode .react-datepicker-wrapper .react-datepicker__input-container input::placeholder, +.mfkContainer.darkMode .react-datepicker-wrapper input::placeholder { + color: #fff !important; +} From ef4fb63ea27310b95d3be336e52cedb9698d7e2f Mon Sep 17 00:00:00 2001 From: Aditya Gambhir <67105262+Aditya-gam@users.noreply.github.com> Date: Tue, 23 Dec 2025 18:23:18 -0800 Subject: [PATCH 08/21] fix: add dark mode support for Planned vs Actual Cost chart filters - Add dark mode styles for select and date input filters with #2b3344 background and #fff text - Use high-specificity CSS selectors to prevent style overrides from global styles - Add white dropdown arrow for select elements in dark mode - Create CSS module to replace inline styles for better maintainability --- .../Financials/ExpenseBarChart.jsx | 76 +++----- .../Financials/ExpenseBarChart.module.css | 162 ++++++++++++++++++ 2 files changed, 188 insertions(+), 50 deletions(-) create mode 100644 src/components/BMDashboard/WeeklyProjectSummary/Financials/ExpenseBarChart.module.css diff --git a/src/components/BMDashboard/WeeklyProjectSummary/Financials/ExpenseBarChart.jsx b/src/components/BMDashboard/WeeklyProjectSummary/Financials/ExpenseBarChart.jsx index cdb816e463..69ceb35b78 100644 --- a/src/components/BMDashboard/WeeklyProjectSummary/Financials/ExpenseBarChart.jsx +++ b/src/components/BMDashboard/WeeklyProjectSummary/Financials/ExpenseBarChart.jsx @@ -1,10 +1,13 @@ import { BarChart, Bar, XAxis, YAxis, LabelList, ResponsiveContainer } from 'recharts'; import { useState, useEffect } from 'react'; +import { useSelector } from 'react-redux'; +import styles from './ExpenseBarChart.module.css'; const categories = ['Plumbing', 'Electrical', 'Structural', 'Mechanical']; const projects = ['Project A', 'Project B', 'Project C']; export default function ExpenseBarChart() { + const darkMode = useSelector(state => state.theme?.darkMode); const [projectId, setProjectId] = useState(''); const [categoryFilter, setCategoryFilter] = useState('ALL'); const [startDate, setStartDate] = useState(''); @@ -90,33 +93,19 @@ export default function ExpenseBarChart() { }, [projectId, categoryFilter, startDate, endDate]); return ( -
-
-

Planned vs Actual Cost

- {errorMessage && ( -
- {errorMessage} -
- )} +
+
+

Planned vs Actual Cost

+ {errorMessage &&
{errorMessage}
}
-
-