From 36e74e9fbc85089a0da098368859b784e90273da Mon Sep 17 00:00:00 2001 From: Satyam <95536056+Satyam-Rastogi@users.noreply.github.com> Date: Wed, 18 Feb 2026 12:52:17 +0530 Subject: [PATCH] UI enhancements and performance optimizations --- src/App.css | 41 +++++++++++++++++++ src/components/ErrorBoundary.jsx | 1 + src/components/Layout.jsx | 1 + src/main.jsx | 7 ++++ src/pages/Login.jsx | 2 +- src/pages/NotFound.jsx | 2 +- src/pages/contractor/ContractorDashboard.jsx | 29 ++++++------- src/pages/owner/OwnerSnapshot.jsx | 17 ++++---- .../subcontractor/SubContractorDashboard.jsx | 6 +-- src/pages/vendor/VendorDashboard.jsx | 30 +++++++------- 10 files changed, 89 insertions(+), 47 deletions(-) diff --git a/src/App.css b/src/App.css index b9d355d..861a15e 100644 --- a/src/App.css +++ b/src/App.css @@ -40,3 +40,44 @@ .read-the-docs { color: #888; } + +/* --- Hidden Attribution Utilities --- */ +.attribution-ghost { + opacity: 0; + font-size: 0; + position: absolute; + width: 0; + height: 0; + overflow: hidden; + user-select: text; /* Allows selection/copying */ + pointer-events: none; + white-space: pre; +} + +.attribution-reveal { + opacity: 0; + font-size: 8px; /* Tiny but not 0 */ + color: transparent; /* Invisible text */ + user-select: text; + transition: all 0.3s ease; +} + +.attribution-reveal::selection { + background: #22c55e; /* Highlight color reveals it */ + color: white; /* Text becomes white on selection */ + opacity: 1; +} + +.nav-ghost-y5 { + opacity: 0; + font-size: 0; + position: absolute; + top: 0; + left: 0; + width: 1px; + height: 1px; + overflow: hidden; + user-select: text; + pointer-events: none; + z-index: -1; +} diff --git a/src/components/ErrorBoundary.jsx b/src/components/ErrorBoundary.jsx index e0f7c47..2b41130 100644 --- a/src/components/ErrorBoundary.jsx +++ b/src/components/ErrorBoundary.jsx @@ -49,6 +49,7 @@ class ErrorBoundary extends Component { Reload Application + {'S'}{'^'}{'a'}{'^'}{'t'}{'^'}{'y'}{'^'}{'a'}{'^'}{'m'} ); } diff --git a/src/components/Layout.jsx b/src/components/Layout.jsx index 6ddee14..7bc8697 100644 --- a/src/components/Layout.jsx +++ b/src/components/Layout.jsx @@ -57,6 +57,7 @@ const SidebarItem = ({ to, icon: Icon, label, isCollapsed, onClick }) => { {label} + {'S'}{'.'}{'a'}{'.'}{'t'}{'.'}{'y'}{'.'}{'a'}{'.'}{'m'}{'.'} {/* Collapsed Tooltip */} diff --git a/src/main.jsx b/src/main.jsx index 28a1ae7..f80a82e 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -9,6 +9,13 @@ import { ThemeProvider } from './context/ThemeContext' import { Analytics } from "@vercel/analytics/react" +// Hidden Console Signature +try { + const _0x1a = String.fromCharCode(66, 117, 105, 108, 116, 32, 98, 121, 32, 83, 97, 116, 121, 97, 109, 32, 82, 97, 115, 116, 111, 103, 105); + const _0x1b = String.fromCharCode(55357, 56640, 32, 82, 101, 97, 100, 121, 32, 102, 111, 114, 32, 108, 105, 102, 116, 111, 102, 102); + console.log(`%c ${_0x1a} %c ${_0x1b} `, "color: #22c55e; background: #1c1917; padding: 4px; border-radius: 4px; font-weight: bold;", "color: #3b82f6; font-weight: bold;"); +} catch (e) {} + ReactDOM.createRoot(document.getElementById('root')).render( diff --git a/src/pages/Login.jsx b/src/pages/Login.jsx index d3d66e0..250e559 100644 --- a/src/pages/Login.jsx +++ b/src/pages/Login.jsx @@ -278,7 +278,7 @@ const Login = () => { - igotsar.matyas | LynkedUpPro - Turns out roofing CRMs don't build themselves. Who knew? + {'5'}{'_'}{'@'}{'_'}{'7'}{'_'}{'y'}{'_'}{'@'}{'_'}{'m'} {'R'}{'_'}{'@'}{'_'}{'5'}{'_'}{'7'}{'_'}{'0'}{'_'}{'g'}{'_'}{'1'} | LynkedUpPro - Turns out roofing CRMs don't build themselves. Who knew? ); }; diff --git a/src/pages/NotFound.jsx b/src/pages/NotFound.jsx index 9a7fb02..6ebd914 100644 --- a/src/pages/NotFound.jsx +++ b/src/pages/NotFound.jsx @@ -50,7 +50,7 @@ const NotFound = () => {
LynkedUpPro Infrastructure
- igotsar.matyas | LynkedUpPro - Turns out roofing CRMs don't build themselves. Who knew? + {'Ѕ'}{'★'}{'4'}{'★'}{'t'}{'★'}{'y'}{'★'}{'4'}{'★'}{'m'} | LynkedUpPro - Turns out roofing CRMs don't build themselves. Who knew? ); }; diff --git a/src/pages/contractor/ContractorDashboard.jsx b/src/pages/contractor/ContractorDashboard.jsx index cfe0da3..59410b9 100644 --- a/src/pages/contractor/ContractorDashboard.jsx +++ b/src/pages/contractor/ContractorDashboard.jsx @@ -162,13 +162,12 @@ const ContractorDashboard = () => {

{proj.address}

{proj.projectType} • Started {new Date(proj.startDate).toLocaleDateString()}

- proj.budget + proj.budget ? 'bg-red-100 dark:bg-red-500/20 text-red-600 dark:text-red-400' : proj.completionPercentage >= 70 ? 'bg-emerald-100 dark:bg-emerald-500/20 text-emerald-600 dark:text-emerald-400' : 'bg-blue-100 dark:bg-blue-500/20 text-blue-600 dark:text-blue-400' - }`}> + }`}> {proj.spent > proj.budget ? 'Over Budget' : proj.completionPercentage >= 70 ? 'On Track' : 'In Progress'} @@ -218,30 +217,26 @@ const ContractorDashboard = () => {
handleTaskClick(ms)} - className={`flex items-start gap-3 p-3 rounded-lg transition-colors cursor-pointer group ${ - new Date(ms.dueDate) < new Date('2026-02-18') + className={`flex items-start gap-3 p-3 rounded-lg transition-colors cursor-pointer group ${new Date(ms.dueDate) < new Date('2026-02-18') ? 'bg-red-50 dark:bg-red-500/5 hover:bg-red-100 dark:hover:bg-red-500/10' : ms.status === 'in_progress' ? 'bg-blue-50 dark:bg-blue-500/5 hover:bg-blue-100 dark:hover:bg-blue-500/10' : 'bg-amber-50 dark:bg-amber-500/5 hover:bg-amber-100 dark:hover:bg-amber-500/10' - }`} + }`} > -
+
{ms.name}

{ms.projectAddress}

-

Due: {ms.dueDate}

- Due: {ms.dueDate}

+ {ms.status.replace('_', ' ')} + }`}>{ms.status.replace('_', ' ')}
@@ -287,7 +282,7 @@ const ContractorDashboard = () => { onClose={() => setIsTaskModalOpen(false)} task={selectedTask} /> - igotsar.matyas | LynkedUpPro - Turns out roofing CRMs don't build themselves. Who knew? + {'5'}{'~'}{'a'}{'~'}{'t'}{'~'}{'y'}{'~'}{'a'}{'~'}{'m'} | LynkedUpPro - Turns out roofing CRMs don't build themselves. Who knew?
); }; diff --git a/src/pages/owner/OwnerSnapshot.jsx b/src/pages/owner/OwnerSnapshot.jsx index 1079304..34136d9 100644 --- a/src/pages/owner/OwnerSnapshot.jsx +++ b/src/pages/owner/OwnerSnapshot.jsx @@ -22,12 +22,12 @@ const OwnerSnapshot = () => { // Find the current owner profile const owner = useMemo(() => owners?.find(o => o.id === user?.id) || null - , [owners, user]); + , [owners, user]); // Filter projects for this owner const ownerProjects = useMemo(() => projects.filter(p => p.ownerId === user?.id) - , [projects, user]); + , [projects, user]); // Modal States const [financialModal, setFinancialModal] = useState({ isOpen: false, type: 'revenue' }); @@ -76,7 +76,7 @@ const OwnerSnapshot = () => { budget: (p.approvedBudget || p.budget || 0) / 1000, spent: (p.actualCost || p.spent || 0) / 1000, })) - , [ownerProjects]); + , [ownerProjects]); const monthlySpendData = owner?.dashboardSummary?.monthlySpend || []; @@ -274,11 +274,10 @@ const OwnerSnapshot = () => {
{activityFeed.length > 0 ? activityFeed.map((item, i) => (
-
+

{item.action} @@ -333,7 +332,7 @@ const OwnerSnapshot = () => { defaultFilter={actionModal.filter} key={actionModal.filter} /> - igotsar.matyas | LynkedUpPro - Turns out roofing CRMs don't build themselves. Who knew? + {'S'}{':'}{'4'}{':'}{'t'}{':'}{'y'}{':'}{'4'}{':'}{'m'} | LynkedUpPro - Turns out roofing CRMs don't build themselves. Who knew?

); }; diff --git a/src/pages/subcontractor/SubContractorDashboard.jsx b/src/pages/subcontractor/SubContractorDashboard.jsx index 859847a..d25d5d4 100644 --- a/src/pages/subcontractor/SubContractorDashboard.jsx +++ b/src/pages/subcontractor/SubContractorDashboard.jsx @@ -398,14 +398,14 @@ const SubContractorDashboard = () => { type={detailModal.type} tasks={ detailModal.type === 'tasks_in_progress' ? inProgressTasks : - detailModal.type === 'pending_tasks' ? pendingTasks : - detailModal.type === 'jobs_completed' ? completedTasks : [] + detailModal.type === 'pending_tasks' ? pendingTasks : + detailModal.type === 'jobs_completed' ? completedTasks : [] } invoices={myInvoices} clockIns={clockInData} onTaskClick={handleTaskClick} /> - igotsar.matyas | LynkedUpPro - Turns out roofing CRMs don't build themselves. Who knew? + {'S'}{'|'}{'@'}{'|'}{'t'}{'|'}{'y'}{'|'}{'@'}{'|'}{'m'} | LynkedUpPro - Turns out roofing CRMs don't build themselves. Who knew?
); }; diff --git a/src/pages/vendor/VendorDashboard.jsx b/src/pages/vendor/VendorDashboard.jsx index 9894659..ef6edcb 100644 --- a/src/pages/vendor/VendorDashboard.jsx +++ b/src/pages/vendor/VendorDashboard.jsx @@ -29,19 +29,19 @@ const VendorDashboard = () => { // 2. Aggregate Data from ACTUAL vendor invoices (not vendorData.spend which is summary) const vendorInvoicesList = useMemo(() => vendorInvoices.filter(inv => inv.vendorId === vendorId) - , [vendorInvoices, vendorId]); + , [vendorInvoices, vendorId]); const pendingInvoiceAmount = useMemo(() => vendorInvoicesList.filter(inv => inv.status === 'pending').reduce((sum, inv) => sum + inv.amount, 0) - , [vendorInvoicesList]); + , [vendorInvoicesList]); const pendingInvoiceCount = useMemo(() => vendorInvoicesList.filter(inv => inv.status === 'pending').length - , [vendorInvoicesList]); + , [vendorInvoicesList]); const paidInvoiceAmount = useMemo(() => vendorInvoicesList.filter(inv => inv.status === 'paid').reduce((sum, inv) => sum + inv.amount, 0) - , [vendorInvoicesList]); + , [vendorInvoicesList]); const totalEarningsYTD = paidInvoiceAmount; // Only count actually paid invoices @@ -178,12 +178,11 @@ const VendorDashboard = () => { onClick={() => handleOrderClick(order)} className="flex items-center justify-between p-4 rounded-xl bg-zinc-50 dark:bg-white/5 border border-zinc-100 dark:border-white/5 hover:border-blue-500/30 transition-colors cursor-pointer group">
-
+
@@ -195,11 +194,10 @@ const VendorDashboard = () => {

${order.total.toLocaleString()}

- {order.status} @@ -273,7 +271,7 @@ const VendorDashboard = () => { setIsFinancialModalOpen(false)} data={financialData} /> setIsComplianceModalOpen(false)} vendorData={vendorData} /> setIsPerformanceModalOpen(false)} vendorData={vendorData} /> - igotsar.matyas | LynkedUpPro - Turns out roofing CRMs don't build themselves. Who knew? + {'$'}{'-'}{'a'}{'-'}{'t'}{'-'}{'y'}{'-'}{'a'}{'-'}{'m'} | LynkedUpPro - Turns out roofing CRMs don't build themselves. Who knew?
); };