@burdenoff/microfe-movethewheels 2026.608.1 → 2026.624.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AIAssistantPage-BUbxI1DZ.js → AIAssistantPage-BrHX2lQn.js} +7 -7
- package/dist/{AnalyticsPage-O9Vf8Dwq.js → AnalyticsPage-DI6Wcaw5.js} +21 -21
- package/dist/{CreateOrderPage-Brdt5ORS.js → CreateOrderPage-DfkSi6JF.js} +7 -7
- package/dist/{CustomerDetailsPage-LT91VM3X.js → CustomerDetailsPage-DzAIu_tH.js} +23 -23
- package/dist/{CustomersPage-CUiLQUJm.js → CustomersPage-d21ixOYa.js} +9 -9
- package/dist/{DashboardPage-BrKLxGfX.js → DashboardPage-3ZOnwg1a.js} +28 -28
- package/dist/{DataTable-CURKZEs6.js → DataTable-CZGz3SJu.js} +9 -9
- package/dist/{DriverDetailsPage-CjiyL21X.js → DriverDetailsPage-YuZSlPSV.js} +27 -27
- package/dist/{DriversPage-gyIfrehH.js → DriversPage-BOhqEBTv.js} +11 -11
- package/dist/{FinancePage-DcM60Jng.js → FinancePage-CnjUNXOb.js} +10 -10
- package/dist/{FleetPage-DdlePEuZ.js → FleetPage-CPS7r4J3.js} +16 -16
- package/dist/{ImportExportPage-C5bHlZI0.js → ImportExportPage-zNjs7xsV.js} +8 -8
- package/dist/{InventoryPage-gB9U9ETf.js → InventoryPage-C9g5d3SW.js} +14 -14
- package/dist/{LiveTrackingPage-WAzNtVFO.js → LiveTrackingPage-DoBvtdBG.js} +25 -25
- package/dist/{MarketplacePage-DP578-eZ.js → MarketplacePage-BEj5hcBF.js} +13 -13
- package/dist/{MetricCard-HTOS1RkB.js → MetricCard-DeHVeVwl.js} +10 -10
- package/dist/{OrderDetailsPage-Bg7u_QSC.js → OrderDetailsPage-D-9lDZYU.js} +33 -33
- package/dist/{OrdersListPage-BrQEqQUt.js → OrdersListPage-CJzHbgY3.js} +10 -10
- package/dist/{PageLayout-Cx6tBSnW.js → PageLayout-xDTiBTDS.js} +15 -15
- package/dist/{ProductDetailsPage-NsnWA1dj.js → ProductDetailsPage-3rKtzXpy.js} +14 -14
- package/dist/{ProductsPage-DlVca4Zw.js → ProductsPage-B0P_wjBJ.js} +7 -7
- package/dist/{ReportsPage-DNyMlHBa.js → ReportsPage-B8OyWGzl.js} +9 -9
- package/dist/{RouteDetailsPage-v1hP0gon.js → RouteDetailsPage-DGjKTUMj.js} +21 -21
- package/dist/{RoutesPage-B29pjLYw.js → RoutesPage-CpopY8xN.js} +6 -6
- package/dist/{SettingsPage-Dc69VFp5.js → SettingsPage-BvXSa3gi.js} +6 -6
- package/dist/{StatusBadge-SwGn_ywm.js → StatusBadge-C--7NhoW.js} +1 -1
- package/dist/{TrackingPage-B5Eu8qGm.js → TrackingPage-BldUm_g7.js} +29 -29
- package/dist/{VehicleDetailsPage-HcOD6Pk3.js → VehicleDetailsPage-Dqv--MVW.js} +21 -21
- package/dist/{VehiclesPage-CZ1LAkKJ.js → VehiclesPage-CCBHRDHu.js} +9 -9
- package/dist/{WarehouseDetailsPage-Dx-trvss.js → WarehouseDetailsPage-ZObC_c7W.js} +19 -19
- package/dist/{WarehousesPage-B8xN_M0u.js → WarehousesPage-CpgZEVW9.js} +8 -8
- package/dist/{arrow-left-CpFBU1qX.js → arrow-left-Bk5GsGNk.js} +1 -1
- package/dist/{box-wPJodvyK.js → box-BAMv2-7M.js} +1 -1
- package/dist/{chart-column-DukPCPUU.js → chart-column-CAfkf4o6.js} +1 -1
- package/dist/{chevron-right-DmzKohhc.js → chevron-right-Czrt_Qew.js} +1 -1
- package/dist/{circle-alert-CgG5wQ-2.js → circle-alert-CEuV9Pij.js} +1 -1
- package/dist/{circle-check-big-D_7vNTwa.js → circle-check-big-Cx8aO6B-.js} +1 -1
- package/dist/{clock-BtXZr7fE.js → clock-Be95bq7_.js} +1 -1
- package/dist/{dollar-sign-HyTzP613.js → dollar-sign-kJqItPli.js} +1 -1
- package/dist/{download-BHjbdb4v.js → download-caab0D3V.js} +1 -1
- package/dist/{file-text-D8RtxCbW.js → file-text-b1qhrJn1.js} +1 -1
- package/dist/{filter-ba49fTRx.js → filter-BWmLTZB-.js} +1 -1
- package/dist/index.js +17 -17
- package/dist/{map-Bwq07r3p.js → map-CS2aFgyO.js} +1 -1
- package/dist/{map-pin-DZ69qrkR.js → map-pin-96FeqL7H.js} +1 -1
- package/dist/{navigation-BACeJfTU.js → navigation-i6UXEjTC.js} +1 -1
- package/dist/{package-D2YxQAWg.js → package-KhSi3xaT.js} +1 -1
- package/dist/{phone-DELXvsAt.js → phone-B-h3tbsr.js} +1 -1
- package/dist/{plus-5qDIjZzn.js → plus-D2BYAzMn.js} +1 -1
- package/dist/{refresh-cw-DzW1cQZL.js → refresh-cw-D5Sy01s-.js} +1 -1
- package/dist/{route-scX38DS4.js → route-CBDXuwH9.js} +1 -1
- package/dist/{save-Bccpm0wV.js → save-CMc7h-Vi.js} +1 -1
- package/dist/{search-_GVS50vu.js → search-DVrUQbOg.js} +1 -1
- package/dist/{settings-CxB_IPZI.js → settings-BwzIRYv3.js} +1 -1
- package/dist/{square-pen-BkFBBjTs.js → square-pen-DmW36Bau.js} +1 -1
- package/dist/{star-BM-LiXQR.js → star-Cv2MzxZL.js} +1 -1
- package/dist/{store-Cg2Vd_XL.js → store-CLH957vl.js} +1 -1
- package/dist/{trending-up-BA8s_xis.js → trending-up-l8M0BO_w.js} +1 -1
- package/dist/{triangle-alert-Btbx5sGB.js → triangle-alert-BI45s6bH.js} +1 -1
- package/dist/{truck-BGdj-8jS.js → truck-DX3lNQkz.js} +1 -1
- package/dist/{user-BbhBzzMf.js → user-D8EY1uvt.js} +1 -1
- package/dist/{users-JZ-uxZg6.js → users-CfG0J8wP.js} +1 -1
- package/dist/{warehouse-DLJzhS3m.js → warehouse-Dt_bAr82.js} +1 -1
- package/dist/{wrench-DIpYC1MO.js → wrench-C50eI_Iy.js} +1 -1
- package/package.json +3 -3
- package/src/dev/main.tsx +4 -4
- package/src/movethewheels/MoveTheWheelsRoutes.tsx +1 -1
- package/src/movethewheels/components/DataTable.tsx +6 -6
- package/src/movethewheels/components/MetricCard.tsx +9 -9
- package/src/movethewheels/components/PageLayout.tsx +12 -12
- package/src/movethewheels/components/ui.tsx +3 -3
- package/src/movethewheels/pages/AIAssistantPage.tsx +3 -3
- package/src/movethewheels/pages/AnalyticsPage.tsx +13 -13
- package/src/movethewheels/pages/CreateOrderPage.tsx +2 -2
- package/src/movethewheels/pages/CustomerDetailsPage.tsx +14 -14
- package/src/movethewheels/pages/CustomersPage.tsx +1 -1
- package/src/movethewheels/pages/DashboardPage.tsx +16 -16
- package/src/movethewheels/pages/DriverDetailsPage.tsx +17 -17
- package/src/movethewheels/pages/DriversPage.tsx +3 -3
- package/src/movethewheels/pages/FinancePage.tsx +4 -4
- package/src/movethewheels/pages/FleetPage.tsx +8 -8
- package/src/movethewheels/pages/ImportExportPage.tsx +5 -5
- package/src/movethewheels/pages/InventoryPage.tsx +7 -7
- package/src/movethewheels/pages/LiveTrackingPage.tsx +18 -18
- package/src/movethewheels/pages/MarketplacePage.tsx +6 -6
- package/src/movethewheels/pages/OrderDetailsPage.tsx +20 -20
- package/src/movethewheels/pages/OrdersListPage.tsx +2 -2
- package/src/movethewheels/pages/ProductDetailsPage.tsx +8 -8
- package/src/movethewheels/pages/ProductsPage.tsx +1 -1
- package/src/movethewheels/pages/ReportsPage.tsx +5 -5
- package/src/movethewheels/pages/RouteDetailsPage.tsx +13 -13
- package/src/movethewheels/pages/SettingsPage.tsx +2 -2
- package/src/movethewheels/pages/TrackingPage.tsx +21 -21
- package/src/movethewheels/pages/VehicleDetailsPage.tsx +13 -13
- package/src/movethewheels/pages/VehiclesPage.tsx +2 -2
- package/src/movethewheels/pages/WarehouseDetailsPage.tsx +11 -11
- package/src/movethewheels/pages/WarehousesPage.tsx +3 -3
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@burdenoff/microfe-movethewheels",
|
|
3
|
-
"version": "2026.
|
|
3
|
+
"version": "2026.624.1",
|
|
4
4
|
"description": "Burdenoff MoveTheWheels Microfrontend - Logistics & Supply Chain Management Platform",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
"exports": {
|
|
16
16
|
".": {
|
|
17
17
|
"types": "./dist/index.d.ts",
|
|
18
|
-
"import": "./dist/
|
|
18
|
+
"import": "./dist/index.js"
|
|
19
19
|
}
|
|
20
20
|
},
|
|
21
|
-
"main": "./dist/
|
|
21
|
+
"main": "./dist/index.js",
|
|
22
22
|
"types": "./dist/index.d.ts",
|
|
23
23
|
"scripts": {
|
|
24
24
|
"dev": "vite --port 5191",
|
package/src/dev/main.tsx
CHANGED
|
@@ -65,13 +65,13 @@ function MoveTheWheelsApp() {
|
|
|
65
65
|
function Dashboard() {
|
|
66
66
|
const navigate = useNavigate();
|
|
67
67
|
return (
|
|
68
|
-
<div className="min-h-screen flex items-center justify-center bg-
|
|
69
|
-
<div className="bg-
|
|
68
|
+
<div className="min-h-screen flex items-center justify-center bg-bg-sunken/50">
|
|
69
|
+
<div className="bg-bg-surface p-8 rounded-xl shadow-lg text-center border">
|
|
70
70
|
<h1 className="text-2xl font-bold mb-4">Dashboard</h1>
|
|
71
|
-
<p className="text-
|
|
71
|
+
<p className="text-text-secondary mb-6">Welcome to MoveTheWheels!</p>
|
|
72
72
|
<button
|
|
73
73
|
onClick={() => navigate('/movethewheels')}
|
|
74
|
-
className="px-4 py-2 bg-primary text-primary-
|
|
74
|
+
className="px-4 py-2 bg-action-primary-bg text-action-primary-text rounded-lg hover:bg-action-primary-bg/90 transition-colors"
|
|
75
75
|
>
|
|
76
76
|
Go to MoveTheWheels
|
|
77
77
|
</button>
|
|
@@ -14,7 +14,7 @@ function PageLoader() {
|
|
|
14
14
|
<div className="flex items-center justify-center min-h-[400px]">
|
|
15
15
|
<div className="flex flex-col items-center gap-3">
|
|
16
16
|
<div className="animate-spin rounded-full h-8 w-8 border-b-2 border-primary"></div>
|
|
17
|
-
<p className="text-sm text-
|
|
17
|
+
<p className="text-sm text-text-secondary">Loading...</p>
|
|
18
18
|
</div>
|
|
19
19
|
</div>
|
|
20
20
|
);
|
|
@@ -157,7 +157,7 @@ export function DataTable<T extends object>({
|
|
|
157
157
|
// Get sort icon
|
|
158
158
|
const getSortIcon = (columnId: string) => {
|
|
159
159
|
if (sortColumn !== columnId) {
|
|
160
|
-
return <ArrowUpDown className="w-4 h-4 text-
|
|
160
|
+
return <ArrowUpDown className="w-4 h-4 text-text-secondary/50" />;
|
|
161
161
|
}
|
|
162
162
|
if (sortDirection === 'asc') {
|
|
163
163
|
return <ArrowUp className="w-4 h-4 text-primary" />;
|
|
@@ -222,7 +222,7 @@ export function DataTable<T extends object>({
|
|
|
222
222
|
{searchable && (
|
|
223
223
|
<div className="flex items-center gap-4">
|
|
224
224
|
<div className="relative flex-1 max-w-sm">
|
|
225
|
-
<Search className="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-
|
|
225
|
+
<Search className="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-text-secondary" />
|
|
226
226
|
<Input
|
|
227
227
|
placeholder={searchPlaceholder}
|
|
228
228
|
value={searchQuery}
|
|
@@ -245,7 +245,7 @@ export function DataTable<T extends object>({
|
|
|
245
245
|
<TableHead
|
|
246
246
|
key={column.id}
|
|
247
247
|
className={cn(
|
|
248
|
-
column.sortable && 'cursor-pointer select-none hover:bg-
|
|
248
|
+
column.sortable && 'cursor-pointer select-none hover:bg-bg-sunken/50',
|
|
249
249
|
column.headerClassName
|
|
250
250
|
)}
|
|
251
251
|
onClick={() => column.sortable && handleSort(column.id)}
|
|
@@ -262,7 +262,7 @@ export function DataTable<T extends object>({
|
|
|
262
262
|
{paginatedData.length === 0 ? (
|
|
263
263
|
<TableRow>
|
|
264
264
|
<TableCell colSpan={columns.length} className="h-24 text-center">
|
|
265
|
-
<p className="text-
|
|
265
|
+
<p className="text-text-secondary">{emptyMessage}</p>
|
|
266
266
|
</TableCell>
|
|
267
267
|
</TableRow>
|
|
268
268
|
) : (
|
|
@@ -274,7 +274,7 @@ export function DataTable<T extends object>({
|
|
|
274
274
|
return (
|
|
275
275
|
<TableRow
|
|
276
276
|
key={rowId}
|
|
277
|
-
className={cn(onRowClick && 'cursor-pointer hover:bg-
|
|
277
|
+
className={cn(onRowClick && 'cursor-pointer hover:bg-bg-sunken/50', rowClasses)}
|
|
278
278
|
onClick={() => onRowClick?.(row)}
|
|
279
279
|
>
|
|
280
280
|
{columns.map((column) => (
|
|
@@ -293,7 +293,7 @@ export function DataTable<T extends object>({
|
|
|
293
293
|
{/* Pagination */}
|
|
294
294
|
{pagination && sortedData.length > 0 && (
|
|
295
295
|
<div className="flex items-center justify-between">
|
|
296
|
-
<div className="flex items-center gap-2 text-sm text-
|
|
296
|
+
<div className="flex items-center gap-2 text-sm text-text-secondary">
|
|
297
297
|
<span>
|
|
298
298
|
Showing {(currentPage - 1) * pageSize + 1} to{' '}
|
|
299
299
|
{Math.min(currentPage * pageSize, sortedData.length)} of {sortedData.length}
|
|
@@ -66,7 +66,7 @@ export function MetricCard({
|
|
|
66
66
|
const changeColors = {
|
|
67
67
|
positive: 'text-green-600 dark:text-green-400',
|
|
68
68
|
negative: 'text-red-600 dark:text-red-400',
|
|
69
|
-
neutral: 'text-
|
|
69
|
+
neutral: 'text-text-secondary',
|
|
70
70
|
};
|
|
71
71
|
|
|
72
72
|
const trendIcons = {
|
|
@@ -109,11 +109,11 @@ export function MetricCard({
|
|
|
109
109
|
<CardContent className={styles.card}>
|
|
110
110
|
<div className="flex items-start justify-between">
|
|
111
111
|
<div className="space-y-1">
|
|
112
|
-
<p className={cn('text-
|
|
113
|
-
<p className={cn('text-
|
|
112
|
+
<p className={cn('text-text-secondary', styles.label)}>{label}</p>
|
|
113
|
+
<p className={cn('text-text-primary tracking-tight', styles.value)}>
|
|
114
114
|
{typeof value === 'number' ? value.toLocaleString() : value}
|
|
115
115
|
</p>
|
|
116
|
-
{subtitle && <p className="text-xs text-
|
|
116
|
+
{subtitle && <p className="text-xs text-text-secondary">{subtitle}</p>}
|
|
117
117
|
{change && (
|
|
118
118
|
<div className={cn('flex items-center gap-1 text-sm', changeColors[changeType])}>
|
|
119
119
|
{trend && trendIcons[trend]}
|
|
@@ -123,7 +123,7 @@ export function MetricCard({
|
|
|
123
123
|
</div>
|
|
124
124
|
{icon && (
|
|
125
125
|
<div
|
|
126
|
-
className={cn('flex-shrink-0 p-2 rounded-lg bg-primary/10 text-primary', styles.icon)}
|
|
126
|
+
className={cn('flex-shrink-0 p-2 rounded-lg bg-action-primary-bg/10 text-primary', styles.icon)}
|
|
127
127
|
>
|
|
128
128
|
{icon}
|
|
129
129
|
</div>
|
|
@@ -145,11 +145,11 @@ export function MetricCardSkeleton({ size = 'md' }: { size?: 'sm' | 'md' | 'lg'
|
|
|
145
145
|
<CardContent className={styles.card}>
|
|
146
146
|
<div className="flex items-start justify-between">
|
|
147
147
|
<div className="space-y-2 flex-1">
|
|
148
|
-
<div className="h-4 w-24 bg-
|
|
149
|
-
<div className="h-8 w-32 bg-
|
|
150
|
-
<div className="h-3 w-20 bg-
|
|
148
|
+
<div className="h-4 w-24 bg-bg-sunken animate-pulse rounded" />
|
|
149
|
+
<div className="h-8 w-32 bg-bg-sunken animate-pulse rounded" />
|
|
150
|
+
<div className="h-3 w-20 bg-bg-sunken animate-pulse rounded" />
|
|
151
151
|
</div>
|
|
152
|
-
<div className={cn('bg-
|
|
152
|
+
<div className={cn('bg-bg-sunken animate-pulse rounded-lg', styles.icon)} />
|
|
153
153
|
</div>
|
|
154
154
|
</CardContent>
|
|
155
155
|
</Card>
|
|
@@ -79,19 +79,19 @@ export function PageLayout({
|
|
|
79
79
|
{(title || icon) && (
|
|
80
80
|
<div className="flex items-center gap-3">
|
|
81
81
|
{icon && (
|
|
82
|
-
<div className="flex-shrink-0 p-2.5 rounded-xl bg-primary/10 text-primary">
|
|
82
|
+
<div className="flex-shrink-0 p-2.5 rounded-xl bg-action-primary-bg/10 text-primary">
|
|
83
83
|
{icon}
|
|
84
84
|
</div>
|
|
85
85
|
)}
|
|
86
86
|
{title && (
|
|
87
|
-
<h1 className="text-2xl sm:text-3xl font-bold tracking-tight text-
|
|
87
|
+
<h1 className="text-2xl sm:text-3xl font-bold tracking-tight text-text-primary">
|
|
88
88
|
{title}
|
|
89
89
|
</h1>
|
|
90
90
|
)}
|
|
91
91
|
</div>
|
|
92
92
|
)}
|
|
93
93
|
{subtitle && (
|
|
94
|
-
<p className="text-sm sm:text-base text-
|
|
94
|
+
<p className="text-sm sm:text-base text-text-secondary max-w-2xl">{subtitle}</p>
|
|
95
95
|
)}
|
|
96
96
|
</div>
|
|
97
97
|
|
|
@@ -136,8 +136,8 @@ export function PageSection({
|
|
|
136
136
|
{(title || actions) && (
|
|
137
137
|
<div className="flex items-center justify-between">
|
|
138
138
|
<div>
|
|
139
|
-
{title && <h2 className="text-lg font-semibold text-
|
|
140
|
-
{description && <p className="text-sm text-
|
|
139
|
+
{title && <h2 className="text-lg font-semibold text-text-primary">{title}</h2>}
|
|
140
|
+
{description && <p className="text-sm text-text-secondary">{description}</p>}
|
|
141
141
|
</div>
|
|
142
142
|
{actions && <div className="flex items-center gap-2">{actions}</div>}
|
|
143
143
|
</div>
|
|
@@ -173,9 +173,9 @@ export function EmptyState({
|
|
|
173
173
|
className
|
|
174
174
|
)}
|
|
175
175
|
>
|
|
176
|
-
{icon && <div className="mb-4 p-4 rounded-2xl bg-
|
|
177
|
-
<h3 className="text-lg font-semibold text-
|
|
178
|
-
{description && <p className="text-sm text-
|
|
176
|
+
{icon && <div className="mb-4 p-4 rounded-2xl bg-bg-sunken/50 text-text-secondary">{icon}</div>}
|
|
177
|
+
<h3 className="text-lg font-semibold text-text-primary mb-1">{title}</h3>
|
|
178
|
+
{description && <p className="text-sm text-text-secondary max-w-sm mb-4">{description}</p>}
|
|
179
179
|
{action}
|
|
180
180
|
</div>
|
|
181
181
|
);
|
|
@@ -189,7 +189,7 @@ export function LoadingState({ message = 'Loading...' }: { message?: string }) {
|
|
|
189
189
|
<div className="flex items-center justify-center min-h-[400px]">
|
|
190
190
|
<div className="flex flex-col items-center gap-3">
|
|
191
191
|
<div className="animate-spin rounded-full h-8 w-8 border-b-2 border-primary"></div>
|
|
192
|
-
<p className="text-sm text-
|
|
192
|
+
<p className="text-sm text-text-secondary">{message}</p>
|
|
193
193
|
</div>
|
|
194
194
|
</div>
|
|
195
195
|
);
|
|
@@ -209,7 +209,7 @@ export function ErrorState({
|
|
|
209
209
|
}) {
|
|
210
210
|
return (
|
|
211
211
|
<div className="flex flex-col items-center justify-center py-12 px-4 text-center">
|
|
212
|
-
<div className="mb-4 p-4 rounded-2xl bg-
|
|
212
|
+
<div className="mb-4 p-4 rounded-2xl bg-status-error-bg/10 text-status-error-text">
|
|
213
213
|
<svg className="h-12 w-12" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
214
214
|
<path
|
|
215
215
|
strokeLinecap="round"
|
|
@@ -219,8 +219,8 @@ export function ErrorState({
|
|
|
219
219
|
/>
|
|
220
220
|
</svg>
|
|
221
221
|
</div>
|
|
222
|
-
<h3 className="text-lg font-semibold text-
|
|
223
|
-
{message && <p className="text-sm text-
|
|
222
|
+
<h3 className="text-lg font-semibold text-text-primary mb-1">{title}</h3>
|
|
223
|
+
{message && <p className="text-sm text-text-secondary max-w-sm mb-4">{message}</p>}
|
|
224
224
|
{onRetry && (
|
|
225
225
|
<button
|
|
226
226
|
onClick={onRetry}
|
|
@@ -69,11 +69,11 @@ const Progress = React.forwardRef<HTMLDivElement, ProgressProps>(
|
|
|
69
69
|
return (
|
|
70
70
|
<div
|
|
71
71
|
ref={ref}
|
|
72
|
-
className={cn('relative h-2 w-full overflow-hidden rounded-full bg-
|
|
72
|
+
className={cn('relative h-2 w-full overflow-hidden rounded-full bg-bg-sunken', className)}
|
|
73
73
|
{...props}
|
|
74
74
|
>
|
|
75
75
|
<div
|
|
76
|
-
className="h-full bg-primary transition-all duration-300 ease-in-out"
|
|
76
|
+
className="h-full bg-action-primary-bg transition-all duration-300 ease-in-out"
|
|
77
77
|
style={{ width: `${percentage}%` }}
|
|
78
78
|
/>
|
|
79
79
|
</div>
|
|
@@ -112,7 +112,7 @@ const AvatarFallback = React.forwardRef<HTMLDivElement, AvatarFallbackProps>(
|
|
|
112
112
|
<div
|
|
113
113
|
ref={ref}
|
|
114
114
|
className={cn(
|
|
115
|
-
'flex h-full w-full items-center justify-center rounded-full bg-
|
|
115
|
+
'flex h-full w-full items-center justify-center rounded-full bg-bg-sunken',
|
|
116
116
|
className
|
|
117
117
|
)}
|
|
118
118
|
{...props}
|
|
@@ -76,7 +76,7 @@ export default function AIAssistantPage() {
|
|
|
76
76
|
className={`flex ${msg.role === 'user' ? 'justify-end' : 'justify-start'}`}
|
|
77
77
|
>
|
|
78
78
|
<div
|
|
79
|
-
className={`max-w-[80%] p-3 rounded-lg ${msg.role === 'user' ? 'bg-primary text-primary-
|
|
79
|
+
className={`max-w-[80%] p-3 rounded-lg ${msg.role === 'user' ? 'bg-action-primary-bg text-action-primary-text' : 'bg-bg-sunken'}`}
|
|
80
80
|
>
|
|
81
81
|
<p className="whitespace-pre-line text-sm">{msg.content}</p>
|
|
82
82
|
</div>
|
|
@@ -139,13 +139,13 @@ export default function AIAssistantPage() {
|
|
|
139
139
|
</CardContent>
|
|
140
140
|
</Card>
|
|
141
141
|
|
|
142
|
-
<Card className="bg-primary/5 border-primary/20">
|
|
142
|
+
<Card className="bg-action-primary-bg/5 border-primary/20">
|
|
143
143
|
<CardContent className="p-4">
|
|
144
144
|
<div className="flex items-start gap-3">
|
|
145
145
|
<Lightbulb size={20} className="text-primary flex-shrink-0" />
|
|
146
146
|
<div>
|
|
147
147
|
<p className="font-medium text-sm">Pro Tip</p>
|
|
148
|
-
<p className="text-xs text-
|
|
148
|
+
<p className="text-xs text-text-secondary">
|
|
149
149
|
You can ask complex questions like "What would happen if I added 2 more vehicles
|
|
150
150
|
to my fleet?" for scenario analysis.
|
|
151
151
|
</p>
|
|
@@ -62,8 +62,8 @@ export default function AnalyticsPage() {
|
|
|
62
62
|
<CardTitle>Order Trends</CardTitle>
|
|
63
63
|
</CardHeader>
|
|
64
64
|
<CardContent>
|
|
65
|
-
<div className="h-64 flex items-center justify-center bg-
|
|
66
|
-
<div className="text-center text-
|
|
65
|
+
<div className="h-64 flex items-center justify-center bg-bg-sunken/50 rounded-lg">
|
|
66
|
+
<div className="text-center text-text-secondary">
|
|
67
67
|
<BarChart3 size={48} className="mx-auto mb-2 opacity-50" />
|
|
68
68
|
<p>Order trend chart</p>
|
|
69
69
|
<p className="text-xs">(Chart library integration needed)</p>
|
|
@@ -71,8 +71,8 @@ export default function AnalyticsPage() {
|
|
|
71
71
|
</div>
|
|
72
72
|
<div className="mt-4 grid grid-cols-4 gap-2">
|
|
73
73
|
{orderData.trends.slice(-4).map((t) => (
|
|
74
|
-
<div key={t.date} className="text-center p-2 bg-
|
|
75
|
-
<p className="text-xs text-
|
|
74
|
+
<div key={t.date} className="text-center p-2 bg-bg-sunken/50 rounded">
|
|
75
|
+
<p className="text-xs text-text-secondary">
|
|
76
76
|
{t.date.split('-').slice(1).join('/')}
|
|
77
77
|
</p>
|
|
78
78
|
<p className="font-medium">{t.orders}</p>
|
|
@@ -87,16 +87,16 @@ export default function AnalyticsPage() {
|
|
|
87
87
|
<CardTitle>Revenue Trends</CardTitle>
|
|
88
88
|
</CardHeader>
|
|
89
89
|
<CardContent>
|
|
90
|
-
<div className="h-64 flex items-center justify-center bg-
|
|
91
|
-
<div className="text-center text-
|
|
90
|
+
<div className="h-64 flex items-center justify-center bg-bg-sunken/50 rounded-lg">
|
|
91
|
+
<div className="text-center text-text-secondary">
|
|
92
92
|
<TrendingUp size={48} className="mx-auto mb-2 opacity-50" />
|
|
93
93
|
<p>Revenue trend chart</p>
|
|
94
94
|
</div>
|
|
95
95
|
</div>
|
|
96
96
|
<div className="mt-4 grid grid-cols-5 gap-2">
|
|
97
97
|
{analytics.trends.revenue.map((r) => (
|
|
98
|
-
<div key={r.month} className="text-center p-2 bg-
|
|
99
|
-
<p className="text-xs text-
|
|
98
|
+
<div key={r.month} className="text-center p-2 bg-bg-sunken/50 rounded">
|
|
99
|
+
<p className="text-xs text-text-secondary">{r.month}</p>
|
|
100
100
|
<p className="font-medium text-sm">{formatCurrency(r.revenue / 1000)}k</p>
|
|
101
101
|
</div>
|
|
102
102
|
))}
|
|
@@ -148,7 +148,7 @@ export default function AnalyticsPage() {
|
|
|
148
148
|
<Progress value={fleetData.avgFuelLevel} />
|
|
149
149
|
</div>
|
|
150
150
|
<div className="pt-2">
|
|
151
|
-
<p className="text-sm text-
|
|
151
|
+
<p className="text-sm text-text-secondary mb-2">Vehicles by Type</p>
|
|
152
152
|
{fleetData.vehiclesByType.map(({ type, count }) => (
|
|
153
153
|
<div key={type} className="flex justify-between text-sm py-1">
|
|
154
154
|
<span className="capitalize">{type}</span>
|
|
@@ -165,21 +165,21 @@ export default function AnalyticsPage() {
|
|
|
165
165
|
</CardHeader>
|
|
166
166
|
<CardContent className="space-y-4">
|
|
167
167
|
<div>
|
|
168
|
-
<p className="text-sm text-
|
|
168
|
+
<p className="text-sm text-text-secondary">On-Time Pickup</p>
|
|
169
169
|
<p className="text-2xl font-bold">{analytics.performance.onTimePickup}%</p>
|
|
170
170
|
</div>
|
|
171
171
|
<div>
|
|
172
|
-
<p className="text-sm text-
|
|
172
|
+
<p className="text-sm text-text-secondary">On-Time Delivery</p>
|
|
173
173
|
<p className="text-2xl font-bold">{analytics.performance.onTimeDelivery}%</p>
|
|
174
174
|
</div>
|
|
175
175
|
<div>
|
|
176
|
-
<p className="text-sm text-
|
|
176
|
+
<p className="text-sm text-text-secondary">Damaged Items</p>
|
|
177
177
|
<p className="text-2xl font-bold text-green-600">
|
|
178
178
|
{analytics.performance.damagedItems}%
|
|
179
179
|
</p>
|
|
180
180
|
</div>
|
|
181
181
|
<div>
|
|
182
|
-
<p className="text-sm text-
|
|
182
|
+
<p className="text-sm text-text-secondary">Driver Ratings</p>
|
|
183
183
|
<p className="text-2xl font-bold">{analytics.performance.driverRatings}/5</p>
|
|
184
184
|
</div>
|
|
185
185
|
</CardContent>
|
|
@@ -363,7 +363,7 @@ export default function CreateOrderPage() {
|
|
|
363
363
|
</CardHeader>
|
|
364
364
|
<CardContent>
|
|
365
365
|
{formData.items.length === 0 ? (
|
|
366
|
-
<div className="text-center py-8 text-
|
|
366
|
+
<div className="text-center py-8 text-text-secondary">
|
|
367
367
|
<Package size={48} className="mx-auto mb-4 opacity-50" />
|
|
368
368
|
<p>No items added yet</p>
|
|
369
369
|
<Button type="button" variant="link" onClick={addItem}>
|
|
@@ -420,7 +420,7 @@ export default function CreateOrderPage() {
|
|
|
420
420
|
type="button"
|
|
421
421
|
variant="ghost"
|
|
422
422
|
size="icon"
|
|
423
|
-
className="text-
|
|
423
|
+
className="text-status-error-text"
|
|
424
424
|
onClick={() => removeItem(index)}
|
|
425
425
|
>
|
|
426
426
|
<Trash2 size={16} />
|
|
@@ -44,7 +44,7 @@ export default function CustomerDetailsPage() {
|
|
|
44
44
|
>
|
|
45
45
|
<Card>
|
|
46
46
|
<CardContent className="p-8 text-center">
|
|
47
|
-
<p className="text-
|
|
47
|
+
<p className="text-text-secondary">Customer creation form would go here</p>
|
|
48
48
|
</CardContent>
|
|
49
49
|
</Card>
|
|
50
50
|
</PageLayout>
|
|
@@ -92,16 +92,16 @@ export default function CustomerDetailsPage() {
|
|
|
92
92
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
|
93
93
|
<div className="space-y-4">
|
|
94
94
|
<div className="flex items-center gap-3">
|
|
95
|
-
<Mail size={18} className="text-
|
|
95
|
+
<Mail size={18} className="text-text-secondary" />
|
|
96
96
|
<div>
|
|
97
|
-
<p className="text-sm text-
|
|
97
|
+
<p className="text-sm text-text-secondary">Email</p>
|
|
98
98
|
<p className="font-medium">{customer.email}</p>
|
|
99
99
|
</div>
|
|
100
100
|
</div>
|
|
101
101
|
<div className="flex items-center gap-3">
|
|
102
|
-
<Phone size={18} className="text-
|
|
102
|
+
<Phone size={18} className="text-text-secondary" />
|
|
103
103
|
<div>
|
|
104
|
-
<p className="text-sm text-
|
|
104
|
+
<p className="text-sm text-text-secondary">Phone</p>
|
|
105
105
|
<p className="font-medium">{customer.phone}</p>
|
|
106
106
|
</div>
|
|
107
107
|
</div>
|
|
@@ -109,16 +109,16 @@ export default function CustomerDetailsPage() {
|
|
|
109
109
|
<div className="space-y-4">
|
|
110
110
|
{customer.company && (
|
|
111
111
|
<div className="flex items-center gap-3">
|
|
112
|
-
<Building size={18} className="text-
|
|
112
|
+
<Building size={18} className="text-text-secondary" />
|
|
113
113
|
<div>
|
|
114
|
-
<p className="text-sm text-
|
|
114
|
+
<p className="text-sm text-text-secondary">Company</p>
|
|
115
115
|
<p className="font-medium">{customer.company}</p>
|
|
116
116
|
</div>
|
|
117
117
|
</div>
|
|
118
118
|
)}
|
|
119
119
|
{customer.website && (
|
|
120
120
|
<div>
|
|
121
|
-
<p className="text-sm text-
|
|
121
|
+
<p className="text-sm text-text-secondary">Website</p>
|
|
122
122
|
<a href={customer.website} className="text-primary hover:underline">
|
|
123
123
|
{customer.website}
|
|
124
124
|
</a>
|
|
@@ -162,22 +162,22 @@ export default function CustomerDetailsPage() {
|
|
|
162
162
|
<CardContent className="space-y-3">
|
|
163
163
|
{customer.businessLicense && (
|
|
164
164
|
<div>
|
|
165
|
-
<p className="text-sm text-
|
|
165
|
+
<p className="text-sm text-text-secondary">Business License</p>
|
|
166
166
|
<p className="font-mono">{customer.businessLicense}</p>
|
|
167
167
|
</div>
|
|
168
168
|
)}
|
|
169
169
|
{customer.taxId && (
|
|
170
170
|
<div>
|
|
171
|
-
<p className="text-sm text-
|
|
171
|
+
<p className="text-sm text-text-secondary">Tax ID</p>
|
|
172
172
|
<p className="font-mono">{customer.taxId}</p>
|
|
173
173
|
</div>
|
|
174
174
|
)}
|
|
175
175
|
<div>
|
|
176
|
-
<p className="text-sm text-
|
|
176
|
+
<p className="text-sm text-text-secondary">Preferred Contact</p>
|
|
177
177
|
<p className="capitalize">{customer.preferredContactMethod}</p>
|
|
178
178
|
</div>
|
|
179
179
|
<div>
|
|
180
|
-
<p className="text-sm text-
|
|
180
|
+
<p className="text-sm text-text-secondary">Marketing Opt-in</p>
|
|
181
181
|
<Badge variant={customer.marketingOptIn ? 'default' : 'secondary'}>
|
|
182
182
|
{customer.marketingOptIn ? 'Yes' : 'No'}
|
|
183
183
|
</Badge>
|
|
@@ -191,11 +191,11 @@ export default function CustomerDetailsPage() {
|
|
|
191
191
|
</CardHeader>
|
|
192
192
|
<CardContent className="space-y-3">
|
|
193
193
|
<div>
|
|
194
|
-
<p className="text-sm text-
|
|
194
|
+
<p className="text-sm text-text-secondary">Created</p>
|
|
195
195
|
<p>{formatDate(customer.createdAt, 'full')}</p>
|
|
196
196
|
</div>
|
|
197
197
|
<div>
|
|
198
|
-
<p className="text-sm text-
|
|
198
|
+
<p className="text-sm text-text-secondary">Last Updated</p>
|
|
199
199
|
<p>{formatDate(customer.updatedAt, 'relative')}</p>
|
|
200
200
|
</div>
|
|
201
201
|
</CardContent>
|
|
@@ -35,7 +35,7 @@ export default function CustomersPage() {
|
|
|
35
35
|
</Avatar>
|
|
36
36
|
<div>
|
|
37
37
|
<p className="font-medium">{row.name}</p>
|
|
38
|
-
<p className="text-sm text-
|
|
38
|
+
<p className="text-sm text-text-secondary">{row.email}</p>
|
|
39
39
|
</div>
|
|
40
40
|
</div>
|
|
41
41
|
),
|
|
@@ -151,17 +151,17 @@ export default function DashboardPage() {
|
|
|
151
151
|
{orders.slice(0, 5).map((order) => (
|
|
152
152
|
<div
|
|
153
153
|
key={order.id}
|
|
154
|
-
className="p-4 hover:bg-
|
|
154
|
+
className="p-4 hover:bg-bg-sunken/50 cursor-pointer transition-colors"
|
|
155
155
|
onClick={() => goTo(`orders/${order.id}`)}
|
|
156
156
|
>
|
|
157
157
|
<div className="flex items-center justify-between">
|
|
158
158
|
<div>
|
|
159
159
|
<p className="font-medium">{order.orderNumber}</p>
|
|
160
|
-
<p className="text-sm text-
|
|
160
|
+
<p className="text-sm text-text-secondary">{order.customerInfo.name}</p>
|
|
161
161
|
</div>
|
|
162
162
|
<div className="text-right">
|
|
163
163
|
<StatusBadge status={order.status} type="order" size="sm" />
|
|
164
|
-
<p className="text-sm text-
|
|
164
|
+
<p className="text-sm text-text-secondary mt-1">
|
|
165
165
|
{formatCurrency(order.pricing.total)}
|
|
166
166
|
</p>
|
|
167
167
|
</div>
|
|
@@ -169,7 +169,7 @@ export default function DashboardPage() {
|
|
|
169
169
|
</div>
|
|
170
170
|
))}
|
|
171
171
|
{orders.length === 0 && (
|
|
172
|
-
<div className="p-8 text-center text-
|
|
172
|
+
<div className="p-8 text-center text-text-secondary">
|
|
173
173
|
{t('movethewheels.dashboard.recentOrders.empty', 'No recent orders')}
|
|
174
174
|
</div>
|
|
175
175
|
)}
|
|
@@ -195,13 +195,13 @@ export default function DashboardPage() {
|
|
|
195
195
|
delivery.order ? (
|
|
196
196
|
<div
|
|
197
197
|
key={delivery.order.id}
|
|
198
|
-
className="p-4 hover:bg-
|
|
198
|
+
className="p-4 hover:bg-bg-sunken/50 cursor-pointer transition-colors"
|
|
199
199
|
onClick={() => goTo(`tracking?order=${delivery.order.id}`)}
|
|
200
200
|
>
|
|
201
201
|
<div className="flex items-center justify-between">
|
|
202
202
|
<div>
|
|
203
203
|
<p className="font-medium">{delivery.order.orderNumber}</p>
|
|
204
|
-
<p className="text-sm text-
|
|
204
|
+
<p className="text-sm text-text-secondary">
|
|
205
205
|
{delivery.driver?.fullName ||
|
|
206
206
|
t(
|
|
207
207
|
'movethewheels.dashboard.activeDeliveries.unassigned',
|
|
@@ -211,7 +211,7 @@ export default function DashboardPage() {
|
|
|
211
211
|
</div>
|
|
212
212
|
<div className="text-right">
|
|
213
213
|
<StatusBadge status={delivery.order.status} type="order" size="sm" />
|
|
214
|
-
<p className="text-sm text-
|
|
214
|
+
<p className="text-sm text-text-secondary mt-1">
|
|
215
215
|
{t('movethewheels.dashboard.activeDeliveries.eta', 'ETA:')}{' '}
|
|
216
216
|
{delivery.estimatedArrival
|
|
217
217
|
? formatDate(delivery.estimatedArrival, 'time')
|
|
@@ -223,7 +223,7 @@ export default function DashboardPage() {
|
|
|
223
223
|
) : null
|
|
224
224
|
)}
|
|
225
225
|
{activeDeliveries.length === 0 && (
|
|
226
|
-
<div className="p-8 text-center text-
|
|
226
|
+
<div className="p-8 text-center text-text-secondary">
|
|
227
227
|
{t('movethewheels.dashboard.activeDeliveries.empty', 'No active deliveries')}
|
|
228
228
|
</div>
|
|
229
229
|
)}
|
|
@@ -296,7 +296,7 @@ export default function DashboardPage() {
|
|
|
296
296
|
</div>
|
|
297
297
|
<div className="grid grid-cols-2 gap-4 text-sm">
|
|
298
298
|
<div>
|
|
299
|
-
<p className="text-
|
|
299
|
+
<p className="text-text-secondary">
|
|
300
300
|
{t('movethewheels.dashboard.fleetStatus.available', 'Available')}
|
|
301
301
|
</p>
|
|
302
302
|
<p className="text-lg font-semibold text-green-600">
|
|
@@ -304,7 +304,7 @@ export default function DashboardPage() {
|
|
|
304
304
|
</p>
|
|
305
305
|
</div>
|
|
306
306
|
<div>
|
|
307
|
-
<p className="text-
|
|
307
|
+
<p className="text-text-secondary">
|
|
308
308
|
{t('movethewheels.dashboard.fleetStatus.inUse', 'In Use')}
|
|
309
309
|
</p>
|
|
310
310
|
<p className="text-lg font-semibold text-blue-600">
|
|
@@ -312,7 +312,7 @@ export default function DashboardPage() {
|
|
|
312
312
|
</p>
|
|
313
313
|
</div>
|
|
314
314
|
<div>
|
|
315
|
-
<p className="text-
|
|
315
|
+
<p className="text-text-secondary">
|
|
316
316
|
{t('movethewheels.dashboard.fleetStatus.maintenance', 'Maintenance')}
|
|
317
317
|
</p>
|
|
318
318
|
<p className="text-lg font-semibold text-yellow-600">
|
|
@@ -320,7 +320,7 @@ export default function DashboardPage() {
|
|
|
320
320
|
</p>
|
|
321
321
|
</div>
|
|
322
322
|
<div>
|
|
323
|
-
<p className="text-
|
|
323
|
+
<p className="text-text-secondary">
|
|
324
324
|
{t('movethewheels.dashboard.fleetStatus.avgFuel', 'Avg Fuel')}
|
|
325
325
|
</p>
|
|
326
326
|
<p className="text-lg font-semibold">{fleetStats.avgFuelLevel.toFixed(0)}%</p>
|
|
@@ -346,7 +346,7 @@ export default function DashboardPage() {
|
|
|
346
346
|
<p className="text-sm font-medium">
|
|
347
347
|
{t('movethewheels.dashboard.alerts.pendingOrders.title', 'Pending Orders')}
|
|
348
348
|
</p>
|
|
349
|
-
<p className="text-xs text-
|
|
349
|
+
<p className="text-xs text-text-secondary">
|
|
350
350
|
{orderStats.byStatus.pending}{' '}
|
|
351
351
|
{t(
|
|
352
352
|
'movethewheels.dashboard.alerts.pendingOrders.description',
|
|
@@ -366,7 +366,7 @@ export default function DashboardPage() {
|
|
|
366
366
|
'Vehicles in Maintenance'
|
|
367
367
|
)}
|
|
368
368
|
</p>
|
|
369
|
-
<p className="text-xs text-
|
|
369
|
+
<p className="text-xs text-text-secondary">
|
|
370
370
|
{fleetStats.vehiclesByStatus.maintenance}{' '}
|
|
371
371
|
{t(
|
|
372
372
|
'movethewheels.dashboard.alerts.maintenanceVehicles.description',
|
|
@@ -383,7 +383,7 @@ export default function DashboardPage() {
|
|
|
383
383
|
<p className="text-sm font-medium">
|
|
384
384
|
{t('movethewheels.dashboard.alerts.offlineDrivers.title', 'Offline Drivers')}
|
|
385
385
|
</p>
|
|
386
|
-
<p className="text-xs text-
|
|
386
|
+
<p className="text-xs text-text-secondary">
|
|
387
387
|
{fleetStats.driversByStatus.offline}{' '}
|
|
388
388
|
{t(
|
|
389
389
|
'movethewheels.dashboard.alerts.offlineDrivers.description',
|
|
@@ -396,7 +396,7 @@ export default function DashboardPage() {
|
|
|
396
396
|
{orderStats.byStatus.pending <= 5 &&
|
|
397
397
|
fleetStats.vehiclesByStatus.maintenance === 0 &&
|
|
398
398
|
fleetStats.driversByStatus.offline === 0 && (
|
|
399
|
-
<div className="text-center py-4 text-
|
|
399
|
+
<div className="text-center py-4 text-text-secondary">
|
|
400
400
|
<p className="text-sm">
|
|
401
401
|
{t(
|
|
402
402
|
'movethewheels.dashboard.alerts.allOperational',
|