diff --git a/src/App.jsx b/src/App.jsx index 74cc6bc..b7d605a 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -12,7 +12,7 @@ const load = (factory) => { -
+
} diff --git a/src/components/StatCard.jsx b/src/components/StatCard.jsx index b750bb2..808ac8f 100644 --- a/src/components/StatCard.jsx +++ b/src/components/StatCard.jsx @@ -8,7 +8,7 @@ export default function StatCard({ title, value, icon: Icon, color = 'primary', // Map theme colors to CSS values const colorMap = { - primary: { main: '#C01227', light: 'rgba(192, 18, 39, 0.04)', border: 'rgba(192, 18, 39, 0.1)' }, + primary: { main: '#0A1317', light: 'rgba(10, 19, 23, 0.04)', border: 'rgba(10, 19, 23, 0.1)' }, secondary: { main: '#475569', light: 'rgba(71, 85, 105, 0.04)', border: 'rgba(71, 85, 105, 0.1)' }, success: { main: '#10b981', light: 'rgba(16, 185, 129, 0.04)', border: 'rgba(16, 185, 129, 0.1)' }, warning: { main: '#f59e0b', light: 'rgba(245, 158, 11, 0.04)', border: 'rgba(245, 158, 11, 0.1)' }, @@ -54,8 +54,8 @@ export default function StatCard({ title, value, icon: Icon, color = 'primary', display: 'flex', alignItems: 'center', justifyContent: 'center', - backgroundColor: 'rgba(192, 18, 39, 0.08)', - color: '#C01227' + backgroundColor: 'rgba(10, 19, 23, 0.08)', + color: '#0A1317' }} > diff --git a/src/components/TablePagination.jsx b/src/components/TablePagination.jsx new file mode 100644 index 0000000..c56aada --- /dev/null +++ b/src/components/TablePagination.jsx @@ -0,0 +1,44 @@ +import { Button } from '@astryxdesign/core/Button'; + +// ==============================|| SHARED TABLE PAGINATION BAR ||============================== // +// Rows-per-page select + "x-y of z" + Prev/Next, used by every list/table page. +// `total` is the count of the page's own unit of pagination (rows for most +// pages, groups for Survey's company-grouped view) — the caller still owns +// its page/rpp state and slicing. + +export default function TablePagination({ page, rpp, total, onPageChange, onRppChange, unitLabel = 'Rows' }) { + const lastPage = Math.max(0, Math.ceil(total / rpp) - 1); + return ( +
+
+ {unitLabel} per page: + +
+ + {total === 0 ? '0-0' : `${page * rpp + 1}-${Math.min((page + 1) * rpp, total)}`} of {total} + +
+
+
+ ); +} diff --git a/src/index.css b/src/index.css index 64282c5..ad0a25c 100644 --- a/src/index.css +++ b/src/index.css @@ -21,13 +21,13 @@ --color-text-primary: #0A1317; --color-text-secondary: #4E606F; --color-text-disabled: #A4B0BC; - --color-text-accent: #C01227; + --color-text-accent: #0A1317; /* Icon tokens */ --color-icon-primary: #0A1317; --color-icon-secondary: #4E606F; --color-icon-disabled: #A4B0BC; - --color-icon-accent: #C01227; + --color-icon-accent: #0A1317; /* Border tokens */ --color-border: rgba(5, 54, 89, 0.1); @@ -44,11 +44,18 @@ --color-track: #CCD3DB; --color-shadow: rgba(5, 54, 89, 0.1); - /* Brand accent — Doormile red, replaces the theme-neutral default */ - --color-accent: #C01227; - --color-accent-muted: rgba(192, 18, 39, 0.12); + /* Brand accent — black/white, replaces the theme-neutral default. Hover and + active states resolve to this token, so it drives the black hover fills + site-wide (see @astryxdesign/core Badge/Button/etc. :hover rules). */ + --color-accent: #0A1317; + --color-accent-muted: rgba(10, 19, 23, 0.12); --color-on-accent: #ffffff; + /* "red" Badge variant (StatusChip/TabLabelCount) — kept monochrome, matches + the neutral tokens so no red renders anywhere in the UI. */ + --color-background-red: rgba(5, 54, 89, 0.1); + --color-text-red: #0A1317; + /* App-level overrides */ background-color: #f8fafc; color: #0f172a; @@ -104,8 +111,8 @@ input:not(.search-bar-input):not([class]), select:not([class]) { } input:not(.search-bar-input):not([class]):focus, select:not([class]):focus, textarea:not([class]):focus { - border-color: #C01227 !important; - box-shadow: 0 0 0 3px rgba(192, 18, 39, 0.12) !important; + border-color: #0A1317 !important; + box-shadow: 0 0 0 3px rgba(10, 19, 23, 0.12) !important; } /* Premium Select Dropdown Styling */ @@ -135,8 +142,8 @@ select:not([class]) { } .search-bar-form:focus-within { - border-color: #C01227; - box-shadow: 0 0 0 4px rgba(192, 18, 39, 0.12), 0 10px 15px -3px rgba(0, 0, 0, 0.05); + border-color: #0A1317; + box-shadow: 0 0 0 4px rgba(10, 19, 23, 0.12), 0 10px 15px -3px rgba(0, 0, 0, 0.05); max-width: 380px; /* Expand slightly on focus for premium desktop feel */ } diff --git a/src/layout/MainLayout/Header.jsx b/src/layout/MainLayout/Header.jsx index a160bca..a20ae17 100644 --- a/src/layout/MainLayout/Header.jsx +++ b/src/layout/MainLayout/Header.jsx @@ -15,7 +15,7 @@ export default function Header({ isSidebarCollapsed }) { try { const storedUser = localStorage.getItem('user'); if (storedUser) storedUserObj = JSON.parse(storedUser); - } catch (e) {} + } catch (e) { } const [activeUserName, setActiveUserName] = useState(storedUserObj.name || 'Admin'); @@ -45,12 +45,12 @@ export default function Header({ isSidebarCollapsed }) { logo={ } headingHref="/dashboard" diff --git a/src/layout/MainLayout/Sidebar.jsx b/src/layout/MainLayout/Sidebar.jsx index f5305b2..3dc7e22 100644 --- a/src/layout/MainLayout/Sidebar.jsx +++ b/src/layout/MainLayout/Sidebar.jsx @@ -79,17 +79,17 @@ export default function Sidebar({ isCollapsed, onCollapsedChange }) { height: 18px !important; } .doormile-side-nav .astryx-side-nav-item[aria-label]:hover { - background-color: rgba(192, 18, 39, 0.08) !important; + background-color: rgba(10, 19, 23, 0.08) !important; } .doormile-side-nav .astryx-side-nav-item[aria-label]:focus-visible { - outline: 2px solid rgba(192, 18, 39, 0.4); + outline: 2px solid rgba(10, 19, 23, 0.4); outline-offset: 2px; } .doormile-side-nav .astryx-side-nav-item[aria-label][data-selected='selected'] { - background-color: rgba(192, 18, 39, 0.12) !important; + background-color: rgba(10, 19, 23, 0.12) !important; } .doormile-side-nav .astryx-side-nav-item[aria-label][data-selected='selected'] .astryx-icon { - color: #C01227 !important; + color: #0A1317 !important; } /* Expanded rows: rounded hover/selected states with a left accent @@ -107,37 +107,37 @@ export default function Sidebar({ isCollapsed, onCollapsedChange }) { position: relative; margin-inline: 2px; height: auto; - padding-block: 8px !important; + padding-block: 12px !important; transition: background-color 0.15s ease, transform 0.15s ease; } .doormile-side-nav .astryx-side-nav-item:not([aria-label])::before { content: ''; position: absolute; left: -2px; - top: 8px; - bottom: 8px; + top: 12px; + bottom: 12px; width: 3px; border-radius: 3px; - background-color: #C01227; + background-color: #0A1317; opacity: 0; transition: opacity 0.15s ease; } .doormile-side-nav .astryx-side-nav-item:not([aria-label]):hover { - background-color: rgba(192, 18, 39, 0.05) !important; + background-color: rgba(10, 19, 23, 0.05) !important; transform: translateX(2px); } .doormile-side-nav .astryx-side-nav-item:not([aria-label]):focus-visible { - outline: 2px solid rgba(192, 18, 39, 0.4); + outline: 2px solid rgba(10, 19, 23, 0.4); outline-offset: 2px; } .doormile-side-nav .astryx-side-nav-item:not([aria-label])[data-selected='selected'] { - background-color: rgba(192, 18, 39, 0.08) !important; + background-color: rgba(10, 19, 23, 0.08) !important; } .doormile-side-nav .astryx-side-nav-item:not([aria-label])[data-selected='selected']::before { opacity: 1; } .doormile-side-nav .astryx-side-nav-item:not([aria-label])[data-selected='selected'] .astryx-icon { - color: #C01227 !important; + color: #0A1317 !important; } /* Astryx's sticky-bottom footer wrapper (the toggle button's direct @@ -150,19 +150,18 @@ export default function Sidebar({ isCollapsed, onCollapsedChange }) { padding-block: 8px !important; } - /* Collapse/expand toggle (the "<" / ">" chevron button). It sits - right on the sidebar's edge, so the default square ghost-button - hover clips against that border and looks broken. Give it a - clean circular hover detached from the edge instead. */ + /* Collapse/expand toggle (the "<" / ">" chevron button). Give it a + clean circular hover, centered on the same axis as the nav icons + above it (the rail's own 8px inline padding already keeps it clear + of the sidebar's edge, so no extra offset is needed here). */ .doormile-side-nav button[aria-label*="sidebar"], .doormile-side-nav button[aria-label*="navigation"] { border-radius: 50% !important; transition: background-color 0.15s ease !important; - transform: translateX(-6px) !important; } .doormile-side-nav button[aria-label*="sidebar"]:hover, .doormile-side-nav button[aria-label*="navigation"]:hover { - background-color: rgba(192, 18, 39, 0.08) !important; + background-color: rgba(10, 19, 23, 0.08) !important; } `} diff --git a/src/pages/Dashboard.jsx b/src/pages/Dashboard.jsx index 1160798..c4c3a90 100644 --- a/src/pages/Dashboard.jsx +++ b/src/pages/Dashboard.jsx @@ -19,6 +19,7 @@ import { Table, proportional, pixel } from '@astryxdesign/core/Table'; import { Badge } from '@astryxdesign/core/Badge'; import { Text, Heading } from '@astryxdesign/core/Text'; import { Banner } from '@astryxdesign/core/Banner'; +import { Divider } from '@astryxdesign/core/Divider'; import PageHeader from '@/components/PageHeader'; import StatCard from '@/components/StatCard'; @@ -56,7 +57,7 @@ function Panel({ icon: Icon, title, action, color = 'primary', noPadding = false alignItems: 'center', padding: '10px 16px', borderBottom: '1px solid rgba(5, 54, 89, 0.06)', - background: 'linear-gradient(90deg, rgba(192, 18, 39, 0.03) 0%, rgba(255, 255, 255, 0) 100%)', + background: 'linear-gradient(90deg, rgba(10, 19, 23, 0.03) 0%, rgba(255, 255, 255, 0) 100%)', gap: '10px', flexWrap: 'wrap' }} @@ -69,8 +70,8 @@ function Panel({ icon: Icon, title, action, color = 'primary', noPadding = false display: 'flex', alignItems: 'center', justifyContent: 'center', - backgroundColor: 'rgba(192, 18, 39, 0.08)', - color: '#C01227', + backgroundColor: 'rgba(10, 19, 23, 0.08)', + color: '#0A1317', flexShrink: 0 }} > @@ -210,8 +211,8 @@ export default function Dashboard() { width: '150px' }} onFocus={(e) => { - e.target.style.borderColor = '#C01227'; - e.target.style.boxShadow = '0 0 0 3px rgba(192, 18, 39, 0.12)'; + e.target.style.borderColor = '#0A1317'; + e.target.style.boxShadow = '0 0 0 3px rgba(10, 19, 23, 0.12)'; }} onBlur={(e) => { e.target.style.borderColor = 'rgba(5, 54, 89, 0.12)'; @@ -225,7 +226,7 @@ export default function Dashboard() {
-
+
@@ -241,20 +242,25 @@ export default function Dashboard() { } + endContent={
)} -
+ {/* Overview section */} + Overview +
- - - + + +
- {/* Main dashboard panels */} -
+ + + {/* Clients section */} + Clients +
{/* Recent Clients */}
@@ -265,7 +271,7 @@ export default function Dashboard() { noPadding action={recent.length > 0 && (
+
+ + + {/* Team section */} + Team +
{/* Business Type bar chart */} -
+
{byType.length === 0 ? ( @@ -336,7 +348,7 @@ export default function Dashboard() {
{/* App Users */} -
+
) : ( -
- {team.slice(0, 6).map((u) => ( +
+ {team.map((u) => (
diff --git a/src/pages/Settings.jsx b/src/pages/Settings.jsx index d1f6ce9..73dccf5 100644 --- a/src/pages/Settings.jsx +++ b/src/pages/Settings.jsx @@ -22,6 +22,7 @@ import { TextInput } from '@astryxdesign/core/TextInput'; import { Selector } from '@astryxdesign/core/Selector'; import { Switch } from '@astryxdesign/core/Switch'; import { Badge } from '@astryxdesign/core/Badge'; +import { Divider } from '@astryxdesign/core/Divider'; import PageHeader from '@/components/PageHeader'; @@ -98,15 +99,15 @@ function Section({ icon: Icon, title, subtitle, danger = false, children }) { alignItems: 'center', padding: '18px 24px', borderBottom: '1px solid rgba(5, 54, 89, 0.06)', - background: danger ? 'linear-gradient(90deg, rgba(239, 68, 68, 0.04) 0%, #ffffff 72%)' : 'linear-gradient(90deg, rgba(192, 18, 39, 0.04) 0%, #ffffff 72%)', + background: danger ? 'linear-gradient(90deg, rgba(239, 68, 68, 0.04) 0%, #ffffff 72%)' : 'linear-gradient(90deg, rgba(10, 19, 23, 0.04) 0%, #ffffff 72%)', gap: '12px' }} > -
+
- {title} + {title} {subtitle && {subtitle}}
@@ -117,22 +118,25 @@ function Section({ icon: Icon, title, subtitle, danger = false, children }) { function Row({ label, description, controlAlign = 'stretch', children }) { return ( -
-
- {label} - {description && {description}} + <> +
+
+ {label} + {description && {description}} +
+
+ {children} +
-
- {children} -
-
+ + ); } @@ -270,9 +274,9 @@ export default function Settings() { - +
-
+
@@ -300,12 +304,12 @@ export default function Settings() { gap: '20px', alignItems: 'center', padding: '24px', - background: 'linear-gradient(90deg, rgba(192, 18, 39, 0.05) 0%, #ffffff 75%)', + background: 'linear-gradient(90deg, rgba(10, 19, 23, 0.05) 0%, #ffffff 75%)', flexWrap: 'wrap' }} >
{logoUrl ? ( Organisation logo @@ -456,8 +460,8 @@ export default function Settings() { grid-column: span 1 !important; } } - .settings-row:last-child { - border-bottom: none !important; + .settings-row-divider:last-child { + display: none; } `}
diff --git a/src/pages/auth/Login.jsx b/src/pages/auth/Login.jsx index 45286c4..91cbd32 100644 --- a/src/pages/auth/Login.jsx +++ b/src/pages/auth/Login.jsx @@ -60,7 +60,7 @@ export default function Login() { style={{ position: 'absolute', inset: 0, - background: 'linear-gradient(180deg, rgba(15,23,42,0.6) 0%, rgba(192, 18, 39, 0.8) 100%)' + background: 'linear-gradient(180deg, rgba(15,23,42,0.6) 0%, rgba(10, 19, 23, 0.8) 100%)' }} /> diff --git a/src/pages/bookings/Bookings.jsx b/src/pages/bookings/Bookings.jsx index 71c74df..5a23935 100644 --- a/src/pages/bookings/Bookings.jsx +++ b/src/pages/bookings/Bookings.jsx @@ -18,6 +18,7 @@ import PageHeader from '@/components/PageHeader'; import EmptyState from '@/components/EmptyState'; import StatusChip from '@/components/StatusChip'; import TabLabelCount from '@/components/TabLabelCount'; +import TablePagination from '@/components/TablePagination'; import { fetchClients } from '@/utils/apiClient'; import ClientFormDialog from '../tenants/ClientFormDialog'; @@ -225,7 +226,7 @@ function BookingFormDialog({ open, onClose, onSave, clients, surveys }) { {/* Customer Details */}
-
Customer Details
+
Customer Details
@@ -258,7 +259,7 @@ function BookingFormDialog({ open, onClose, onSave, clients, surveys }) { {/* Assigned Provider */}
-
Assigned Provider (From Survey)
+
Assigned Provider (From Survey)
-
Pickup Location
+
Pickup Location
@@ -287,7 +288,7 @@ function BookingFormDialog({ open, onClose, onSave, clients, surveys }) { {/* Delivery Destination */}
-
Delivery Destination
+
Delivery Destination
@@ -305,7 +306,7 @@ function BookingFormDialog({ open, onClose, onSave, clients, surveys }) { {/* Parcel Details */}
-
Parcel Details
+
Parcel Details
@@ -349,7 +350,7 @@ function BookingFormDialog({ open, onClose, onSave, clients, surveys }) { {/* Price & Insurance */}
-
Price & Insurance
+
Price & Insurance
{quoteInfo && ( @@ -388,7 +389,7 @@ function BookingFormDialog({ open, onClose, onSave, clients, surveys }) { {/* Additional info */}
-
Additional Information
+
Additional Information
-
+
) : displayBookings.length === 0 ? ( @@ -616,37 +617,7 @@ export default function Bookings() { )} {!loading && displayBookings.length > 0 && ( -
-
- Rows per page: - -
- - {displayBookings.length === 0 ? '0-0' : `${page * rpp + 1}-${Math.min((page + 1) * rpp, displayBookings.length)}`} of {displayBookings.length} - -
-
-
+ )} diff --git a/src/pages/maintenance/ComingSoon.jsx b/src/pages/maintenance/ComingSoon.jsx index d3c70a4..3f8c804 100644 --- a/src/pages/maintenance/ComingSoon.jsx +++ b/src/pages/maintenance/ComingSoon.jsx @@ -43,11 +43,11 @@ export default function ComingSoon() { width: '84px', padding: '16px 0', borderRadius: '12px', - backgroundColor: 'rgba(192, 18, 39, 0.08)', - border: '1px solid rgba(192, 18, 39, 0.2)' + backgroundColor: 'rgba(10, 19, 23, 0.08)', + border: '1px solid rgba(10, 19, 23, 0.2)' }} > -
+
{String(c.value).padStart(2, '0')}
@@ -55,7 +55,7 @@ export default function ComingSoon() {
{i < COUNTDOWN.length - 1 && ( -
:
+
:
)}
))} diff --git a/src/pages/maintenance/Error404.jsx b/src/pages/maintenance/Error404.jsx index 8ff0025..a344bff 100644 --- a/src/pages/maintenance/Error404.jsx +++ b/src/pages/maintenance/Error404.jsx @@ -20,10 +20,10 @@ export default function Error404() { }} >
- + 404 -
+
Page Not Found
diff --git a/src/pages/maintenance/Error500.jsx b/src/pages/maintenance/Error500.jsx index 7291077..1d65a85 100644 --- a/src/pages/maintenance/Error500.jsx +++ b/src/pages/maintenance/Error500.jsx @@ -20,10 +20,10 @@ export default function Error500() { }} >
- + 500 -
+
Internal Server Error
diff --git a/src/pages/maintenance/UnderConstruction.jsx b/src/pages/maintenance/UnderConstruction.jsx index 9cf9e6d..0cf1860 100644 --- a/src/pages/maintenance/UnderConstruction.jsx +++ b/src/pages/maintenance/UnderConstruction.jsx @@ -25,8 +25,8 @@ export default function UnderConstruction() { width: '110px', height: '110px', borderRadius: '50%', - backgroundColor: 'rgba(192, 18, 39, 0.08)', - color: '#C01227', + backgroundColor: 'rgba(10, 19, 23, 0.08)', + color: '#0A1317', display: 'flex', alignItems: 'center', justifyContent: 'center' diff --git a/src/pages/pricing/Pricing.jsx b/src/pages/pricing/Pricing.jsx index 3d26d4b..cdfb96c 100644 --- a/src/pages/pricing/Pricing.jsx +++ b/src/pages/pricing/Pricing.jsx @@ -140,7 +140,7 @@ function PricingFormDialog({ open, onClose, onSave, initialData, isCell = false, {error && } {isCell ? ( - + Updating rate for
{formData.company} @@ -445,7 +445,7 @@ export default function Pricing() { setLocationsOpen(!locationsOpen)} >
-
+
{(selectedProvider || 'A')[0].toUpperCase()}
@@ -552,9 +552,9 @@ export default function Pricing() { {/* Pricing Data Matrix */} -
+
-
+
@@ -572,7 +572,7 @@ export default function Pricing() { {loading ? (
-
+
) : providerZones.length === 0 ? ( @@ -621,7 +621,7 @@ export default function Pricing() { border: 1px solid rgba(5, 54, 89, 0.1); background-color: #ffffff; box-shadow: 0 2px 6px rgba(15, 23, 42, 0.12); - color: #C01227; + color: #0A1317; cursor: pointer; opacity: 0; pointer-events: none; @@ -632,14 +632,14 @@ export default function Pricing() { pointer-events: auto; } .matrix-cell-edit:hover { - background-color: rgba(192, 18, 39, 0.08) !important; + background-color: rgba(10, 19, 23, 0.08) !important; } .location-card { transition: border-color 0.15s ease, box-shadow 0.15s ease; } .location-card:hover { - border-color: rgba(192, 18, 39, 0.3) !important; - box-shadow: 0 4px 12px rgba(192, 18, 39, 0.08); + border-color: rgba(10, 19, 23, 0.3) !important; + box-shadow: 0 4px 12px rgba(10, 19, 23, 0.08); } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } `} diff --git a/src/pages/survey/Survey.jsx b/src/pages/survey/Survey.jsx index ac1129b..ac9f395 100644 --- a/src/pages/survey/Survey.jsx +++ b/src/pages/survey/Survey.jsx @@ -34,6 +34,7 @@ import { Banner } from '@astryxdesign/core/Banner'; import PageHeader from '@/components/PageHeader'; import StatCard from '@/components/StatCard'; import EmptyState from '@/components/EmptyState'; +import TablePagination from '@/components/TablePagination'; function isQuoted(row) { return !!(row.rate_per_kg && !String(row.rate_per_kg).toLowerCase().includes('not answered')); @@ -99,8 +100,8 @@ function Field({ label, children }) { function SectionCard({ icon: Icon, title, children }) { return (
-
- +
+ {title}
{children}
@@ -320,7 +321,7 @@ function SurveyFormDialog({ open, onClose, onSave, initialData }) {
- SERVICEABLE PINCODES + SERVICEABLE PINCODES
{(formData.pincodes || []).map((pincode, index) => ( @@ -347,7 +348,7 @@ function SurveyFormDialog({ open, onClose, onSave, initialData }) { {/* Pricing slabs */}
- PRICING SLABS (OPTIONAL) + PRICING SLABS (OPTIONAL)
{(formData.slabs || []).map((slab, index) => ( @@ -419,11 +420,11 @@ function BranchCard({ row, onEdit, onDelete, users }) { }} className="branch-card" > -
setOpen(!open)}> +
setOpen(!open)}> {/* Left: Location & Contact */} -
-
+
+
@@ -442,8 +443,8 @@ function BranchCard({ row, onEdit, onDelete, users }) {
{/* Middle: Rates */} -
-
+
+
Rate/kg
@@ -534,9 +535,9 @@ function BranchCard({ row, onEdit, onDelete, users }) { fontSize: '0.7rem', fontWeight: 600, borderRadius: '4px', - color: '#c01227', - border: '1px solid rgba(192, 18, 39, 0.2)', - backgroundColor: 'rgba(192, 18, 39, 0.05)', + color: '#0a1317', + border: '1px solid rgba(10, 19, 23, 0.2)', + backgroundColor: 'rgba(10, 19, 23, 0.05)', textDecoration: 'none', display: 'inline-flex', alignItems: 'center', @@ -589,7 +590,7 @@ function CompanyGroup({ companyName, branches, onEdit, onDelete, users, isLast } onClick={() => setOpen(!open)} >
-
+
{(companyName || 'A')[0].toUpperCase()}
@@ -680,8 +681,8 @@ export default function Survey() { } }; - const filtered = data.filter(r => - (r.company || '').toLowerCase().includes(search.toLowerCase()) || + const filtered = data.filter(r => + (r.company || '').toLowerCase().includes(search.toLowerCase()) || (r.area || '').toLowerCase().includes(search.toLowerCase()) || (r.phone || '').toLowerCase().includes(search.toLowerCase()) ); @@ -798,38 +799,7 @@ export default function Survey() {
)} - {/* Pagination Section */} -
-
- Companies per page: - -
- - {companyKeys.length === 0 ? '0-0' : `${page * rowsPerPage + 1}-${Math.min((page + 1) * rowsPerPage, companyKeys.length)}`} of {companyKeys.length} - -
-
-
+ [ { key: '_rowNumber', - header:
S.No
, + header:
S.No
, width: pixel(72), renderCell: (r) => (
@@ -146,20 +147,20 @@ export default function TeamUsers() { }, { key: 'name', - header:
User
, + header:
User
, width: proportional(2), renderCell: (r) => ( -
+
) }, { key: 'email', - header:
Email
, + header:
Email
, width: proportional(2), renderCell: (r) => ( -
+
{r.email ? ( @@ -171,10 +172,10 @@ export default function TeamUsers() { }, { key: 'phone', - header:
Phone
, + header:
Phone
, width: proportional(1), renderCell: (r) => ( -
+
{r.phone ? ( @@ -186,17 +187,17 @@ export default function TeamUsers() { }, { key: 'role', - header:
Role
, + header:
Role
, width: pixel(140), renderCell: (r) => ( -
+
) }, { key: 'actions', - header:
Actions
, + header:
Actions
, width: pixel(120), align: 'end', renderCell: (r) => ( @@ -277,8 +278,8 @@ export default function TeamUsers() { style={{ padding: '16px 0', cursor: 'pointer', - borderBottom: tab === i ? '2px solid #C01227' : '2px solid transparent', - color: tab === i ? '#C01227' : '#64748b', + borderBottom: tab === i ? '2px solid #0A1317' : '2px solid transparent', + color: tab === i ? '#0A1317' : '#64748b', fontWeight: tab === i ? 600 : 500, fontSize: '0.875rem', transition: 'all 0.2s' @@ -301,7 +302,7 @@ export default function TeamUsers() { {loading ? (
-
+
) : paged.length === 0 ? ( @@ -320,38 +321,7 @@ export default function TeamUsers() {
)} - {/* Pagination bar */} -
-
- Rows per page: - -
- - {filtered.length === 0 ? '0-0' : `${page * rpp + 1}-${Math.min((page + 1) * rpp, filtered.length)}`} of {filtered.length} - -
-
-
+ -
- +
+ {title}
{children}
@@ -116,7 +117,7 @@ function SectionCard({ icon: Icon, title, accent = 'primary', children }) { function StatTile({ label, value, icon: Icon }) { return (
-
+
@@ -147,7 +148,7 @@ function ClientDetail({ row, onEdit }) { alignItems: 'center', padding: '14px 20px', borderBottom: '1px solid #e2e8f0', - background: 'linear-gradient(90deg, rgba(192, 18, 39, 0.05) 0%, #ffffff 75%)', + background: 'linear-gradient(90deg, rgba(10, 19, 23, 0.05) 0%, #ffffff 75%)', flexWrap: 'wrap', gap: '12px' }} @@ -201,7 +202,7 @@ function ClientDetail({ row, onEdit }) {
{stops.map((stop, idx) => ( - {idx > 0 && } + {idx > 0 && } ))} @@ -242,9 +243,9 @@ function ClientDetail({ row, onEdit }) { fontSize: '0.75rem', fontWeight: 600, borderRadius: '20px', - color: '#C01227', - border: '1px solid rgba(192, 18, 39, 0.1)', - backgroundColor: 'rgba(192, 18, 39, 0.05)', + color: '#0A1317', + border: '1px solid rgba(10, 19, 23, 0.1)', + backgroundColor: 'rgba(10, 19, 23, 0.05)', textDecoration: 'none' }} > @@ -289,7 +290,7 @@ function ClientRow({ row, onEdit, onDelete }) { onClick={() => setOpen((o) => !o)} style={{ cursor: 'pointer', - backgroundColor: open ? 'rgba(192, 18, 39, 0.02)' : undefined + backgroundColor: open ? 'rgba(10, 19, 23, 0.02)' : undefined }} > @@ -301,7 +302,7 @@ function ClientRow({ row, onEdit, onDelete }) { - + {row.logicalId} @@ -342,7 +343,7 @@ function ClientRow({ row, onEdit, onDelete }) {
- +
@@ -514,8 +515,8 @@ export default function Tenants() { width: '150px' }} onFocus={(e) => { - e.target.style.borderColor = '#C01227'; - e.target.style.boxShadow = '0 0 0 3px rgba(192, 18, 39, 0.12)'; + e.target.style.borderColor = '#0A1317'; + e.target.style.boxShadow = '0 0 0 3px rgba(10, 19, 23, 0.12)'; }} onBlur={(e) => { e.target.style.borderColor = 'rgba(5, 54, 89, 0.12)'; @@ -552,8 +553,8 @@ export default function Tenants() { style={{ padding: '16px 0', cursor: 'pointer', - borderBottom: tab === i ? '2px solid #C01227' : '2px solid transparent', - color: tab === i ? '#C01227' : '#64748b', + borderBottom: tab === i ? '2px solid #0A1317' : '2px solid transparent', + color: tab === i ? '#0A1317' : '#64748b', fontWeight: tab === i ? 600 : 500, fontSize: '0.875rem', transition: 'all 0.2s' @@ -573,7 +574,7 @@ export default function Tenants() { {loading ? (
-
+
) : paged.length === 0 ? ( @@ -604,38 +605,7 @@ export default function Tenants() { )} - {/* Pagination bar */} -
-
- Rows per page: - -
- - {filtered.length === 0 ? '0-0' : `${page * rpp + 1}-${Math.min((page + 1) * rpp, filtered.length)}`} of {filtered.length} - -
-
-
+