From be0a7d9633f748468a7b3047259ad2f2c2482f12 Mon Sep 17 00:00:00 2001 From: Abd-std Date: Mon, 27 Apr 2026 17:15:20 +0100 Subject: [PATCH] feat: Add ShipmentHeader component and ShipmentDetail page - Create reusable StatusBadge component with TypeScript support - Build responsive ShipmentHeader with shipment ID, status, sender/receiver details, dates, and action buttons - Add ShipmentDetail page that uses ShipmentHeader component - Update routing to include /dashboard/shipments/:id route - Implement accessibility features with semantic HTML and ARIA labels - Add responsive design for desktop and mobile layouts - Follow existing design system patterns and CSS custom properties --- frontend/package-lock.json | 31 ++- frontend/src/App.tsx | 5 + .../components/ui/StatusBadge/StatusBadge.css | 29 +++ .../components/ui/StatusBadge/StatusBadge.tsx | 50 ++++ .../src/components/ui/StatusBadge/index.ts | 2 + .../src/pages/Shipment/ShipmentDetail.tsx | 65 +++++ .../ShipmentHeader/ShipmentHeader.css | 242 ++++++++++++++++++ .../ShipmentHeader/ShipmentHeader.tsx | 121 +++++++++ frontend/tsconfig.tsbuildinfo | 2 +- 9 files changed, 537 insertions(+), 10 deletions(-) create mode 100644 frontend/src/components/ui/StatusBadge/StatusBadge.css create mode 100644 frontend/src/components/ui/StatusBadge/StatusBadge.tsx create mode 100644 frontend/src/components/ui/StatusBadge/index.ts create mode 100644 frontend/src/pages/Shipment/ShipmentDetail.tsx create mode 100644 frontend/src/pages/Shipment/sections/ShipmentHeader/ShipmentHeader.css create mode 100644 frontend/src/pages/Shipment/sections/ShipmentHeader/ShipmentHeader.tsx diff --git a/frontend/package-lock.json b/frontend/package-lock.json index c3ccf74..82421e2 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -137,6 +137,7 @@ "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -499,6 +500,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=20.19.0" }, @@ -539,6 +541,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=20.19.0" } @@ -1784,8 +1787,7 @@ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -1933,6 +1935,7 @@ "integrity": "sha512-BH7YwL6rA93ReqeQS1c4bsPpcfOmJasG+Fkr6Y59q83f9M1WcBRHR2vM+P9eOisYRcN3ujQoiZY8uk5W+1WL8w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -1943,6 +1946,7 @@ "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -1953,6 +1957,7 @@ "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "^19.2.0" } @@ -2008,6 +2013,7 @@ "integrity": "sha512-IgSWvLobTDOjnaxAfDTIHaECbkNlAlKv2j5SjpB2v7QHKv1FIfjwMy8FsDbVfDX/KjmCmYICcw7uGaXLhtsLNg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.56.0", "@typescript-eslint/types": "8.56.0", @@ -2383,6 +2389,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2433,7 +2440,6 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -2576,6 +2582,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -3019,8 +3026,7 @@ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/dunder-proto": { "version": "1.0.1", @@ -3189,6 +3195,7 @@ "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -3884,6 +3891,7 @@ "integrity": "sha512-0+MoQNYyr2rBHqO1xilltfDjV9G7ymYGlAUazgcDLQaUf8JDHbuGwsxN6U9qWaElZ4w1B2r7yEGIL3GdeW3Rug==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@acemir/cssom": "^0.9.31", "@asamuzakjp/dom-selector": "^6.8.1", @@ -4038,7 +4046,6 @@ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "lz-string": "bin/bin.js" } @@ -4280,6 +4287,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -4332,7 +4340,6 @@ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -4348,7 +4355,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -4377,6 +4383,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -4386,6 +4393,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -4405,6 +4413,7 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", "license": "MIT", + "peer": true, "dependencies": { "@types/use-sync-external-store": "^0.0.6", "use-sync-external-store": "^1.4.0" @@ -4519,7 +4528,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/redux-thunk": { "version": "3.1.0", @@ -4864,6 +4874,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -4967,6 +4978,7 @@ "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", @@ -5248,6 +5260,7 @@ "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index d1ec78a..566a8e7 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -5,6 +5,7 @@ import Login from './pages/auth/Login/Login'; import ForgotPassword from './pages/auth/ForgotPassword/ForgotPassword'; import CompanyDashboard from './pages/dashboard/Company/CompanyDashboard'; import Shipments from './pages/Shipments/Shipments'; +import ShipmentDetail from './pages/Shipment/ShipmentDetail'; import BlockchainLedger from './pages/BlockchainLedger/BlockchainLedger'; import Settlements from './pages/Settlements/Settlements'; import Analytics from './pages/Analytics/Analytics'; @@ -48,6 +49,10 @@ const router = createBrowserRouter([ path: '/dashboard/shipments', element: , }, + { + path: '/dashboard/shipments/:id', + element: , + }, { path: '/dashboard/shipments/create', element: , diff --git a/frontend/src/components/ui/StatusBadge/StatusBadge.css b/frontend/src/components/ui/StatusBadge/StatusBadge.css new file mode 100644 index 0000000..e14a8ba --- /dev/null +++ b/frontend/src/components/ui/StatusBadge/StatusBadge.css @@ -0,0 +1,29 @@ +.status-badge { + display: inline-block; + padding: 4px 10px; + border-radius: 99px; + font-size: 11px; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.025em; +} + +.status-in-transit { + background-color: rgba(59, 130, 246, 0.1); + color: #60a5fa; +} + +.status-delivered { + background-color: rgba(16, 185, 129, 0.1); + color: #34d399; +} + +.status-pending { + background-color: rgba(245, 158, 11, 0.1); + color: #fbbf24; +} + +.status-cancelled { + background-color: rgba(239, 68, 68, 0.1); + color: #f87171; +} \ No newline at end of file diff --git a/frontend/src/components/ui/StatusBadge/StatusBadge.tsx b/frontend/src/components/ui/StatusBadge/StatusBadge.tsx new file mode 100644 index 0000000..491ccc4 --- /dev/null +++ b/frontend/src/components/ui/StatusBadge/StatusBadge.tsx @@ -0,0 +1,50 @@ +import React from 'react'; +import './StatusBadge.css'; + +export type ShipmentStatus = + | 'In Transit' + | 'Delivered' + | 'Pending Approval' + | 'Cancelled' + | 'Picked Up' + | 'At Checkpoint' + | 'Out for Delivery'; + +export interface StatusBadgeProps { + status: ShipmentStatus; + className?: string; +} + +export const StatusBadge: React.FC = ({ + status, + className = '' +}) => { + const getStatusClassName = (status: ShipmentStatus): string => { + switch (status) { + case 'In Transit': + case 'Picked Up': + case 'At Checkpoint': + case 'Out for Delivery': + return 'status-in-transit'; + case 'Delivered': + return 'status-delivered'; + case 'Pending Approval': + return 'status-pending'; + case 'Cancelled': + return 'status-cancelled'; + default: + return 'status-in-transit'; + } + }; + + return ( + + {status} + + ); +}; + +export default StatusBadge; \ No newline at end of file diff --git a/frontend/src/components/ui/StatusBadge/index.ts b/frontend/src/components/ui/StatusBadge/index.ts new file mode 100644 index 0000000..66736cf --- /dev/null +++ b/frontend/src/components/ui/StatusBadge/index.ts @@ -0,0 +1,2 @@ +export { StatusBadge, type StatusBadgeProps, type ShipmentStatus } from './StatusBadge'; +export { default } from './StatusBadge'; \ No newline at end of file diff --git a/frontend/src/pages/Shipment/ShipmentDetail.tsx b/frontend/src/pages/Shipment/ShipmentDetail.tsx new file mode 100644 index 0000000..df52ccf --- /dev/null +++ b/frontend/src/pages/Shipment/ShipmentDetail.tsx @@ -0,0 +1,65 @@ +import React from 'react'; +import { useParams } from 'react-router-dom'; +import ShipmentHeader from './sections/ShipmentHeader/ShipmentHeader'; +import { ShipmentStatus } from '../../components/ui/StatusBadge'; + +// Mock data for demonstration +const MOCK_SHIPMENT_DATA = { + id: 'SHP-2024-001234', + status: 'In Transit' as ShipmentStatus, + sender: { + name: 'Acme Corporation', + address: '123 Business Ave, New York, NY 10001', + }, + receiver: { + name: 'Global Logistics Ltd', + address: '456 Commerce St, Los Angeles, CA 90210', + }, + createdAt: '2024-04-15T10:30:00Z', + expectedDelivery: '2024-04-22T16:00:00Z', +}; + +const ShipmentDetail: React.FC = () => { + const { id } = useParams<{ id: string }>(); + + // In a real app, you would fetch shipment data based on the ID + const shipmentData = MOCK_SHIPMENT_DATA; + + const handleTrack = () => { + console.log('Tracking shipment:', id); + // Implement tracking functionality + }; + + const handleDownloadProof = () => { + console.log('Downloading proof for shipment:', id); + // Implement download proof functionality + }; + + const handleShare = () => { + console.log('Sharing shipment:', id); + // Implement share functionality + }; + + return ( +
+ + + {/* Additional shipment detail sections would go here */} +
+ Additional shipment details and tracking information will be displayed here. +
+
+ ); +}; + +export default ShipmentDetail; \ No newline at end of file diff --git a/frontend/src/pages/Shipment/sections/ShipmentHeader/ShipmentHeader.css b/frontend/src/pages/Shipment/sections/ShipmentHeader/ShipmentHeader.css new file mode 100644 index 0000000..23f7747 --- /dev/null +++ b/frontend/src/pages/Shipment/sections/ShipmentHeader/ShipmentHeader.css @@ -0,0 +1,242 @@ +.shipment-header { + background-color: var(--bg-card); + border: 1px solid var(--border-color); + border-radius: 16px; + padding: 24px; + margin-bottom: 24px; +} + +.shipment-header-content { + display: grid; + grid-template-columns: auto 1fr auto; + gap: 32px; + align-items: start; +} + +/* Left Section - Shipment ID and Status */ +.shipment-header-left { + min-width: 200px; +} + +.shipment-id-section { + display: flex; + flex-direction: column; + gap: 12px; +} + +.shipment-id { + font-size: 28px; + font-weight: 700; + color: var(--text-primary); + margin: 0; + letter-spacing: -0.025em; +} + +/* Center Section - Parties and Dates */ +.shipment-header-center { + display: flex; + flex-direction: column; + gap: 24px; + min-width: 0; /* Allow shrinking */ +} + +.shipment-parties { + display: flex; + align-items: center; + gap: 24px; +} + +.party-info { + flex: 1; + min-width: 0; /* Allow text truncation */ +} + +.party-label { + font-size: 12px; + font-weight: 600; + color: var(--text-secondary); + text-transform: uppercase; + letter-spacing: 0.05em; + margin: 0 0 8px 0; +} + +.party-name { + font-size: 16px; + font-weight: 600; + color: var(--text-primary); + margin: 0 0 4px 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.party-address { + font-size: 14px; + color: var(--text-secondary); + margin: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.route-arrow { + color: var(--accent-blue); + flex-shrink: 0; +} + +.shipment-dates { + display: flex; + gap: 32px; +} + +.date-info { + display: flex; + flex-direction: column; + gap: 4px; +} + +.date-label { + font-size: 12px; + font-weight: 600; + color: var(--text-secondary); + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.date-value { + font-size: 14px; + font-weight: 500; + color: var(--text-primary); +} + +/* Right Section - Action Buttons */ +.shipment-header-right { + min-width: 200px; +} + +.action-buttons { + display: flex; + flex-direction: column; + gap: 8px; +} + +.action-btn { + display: flex; + align-items: center; + gap: 8px; + padding: 10px 16px; + border-radius: 8px; + font-size: 14px; + font-weight: 500; + border: none; + cursor: pointer; + transition: all 0.2s ease; + white-space: nowrap; +} + +.action-btn:hover { + transform: translateY(-1px); +} + +.action-btn:active { + transform: translateY(0); +} + +.action-btn.primary { + background-color: var(--accent-blue); + color: white; +} + +.action-btn.primary:hover { + background-color: #2563eb; +} + +.action-btn.secondary { + background-color: transparent; + color: var(--text-secondary); + border: 1px solid var(--border-color); +} + +.action-btn.secondary:hover { + background-color: var(--bg-card-header); + color: var(--text-primary); + border-color: var(--accent-blue); +} + +/* Mobile Responsive */ +@media (max-width: 1024px) { + .shipment-header-content { + grid-template-columns: 1fr; + gap: 24px; + } + + .shipment-header-left { + min-width: auto; + } + + .shipment-id-section { + flex-direction: row; + align-items: center; + justify-content: space-between; + } + + .shipment-parties { + flex-direction: column; + gap: 16px; + align-items: stretch; + } + + .route-arrow { + align-self: center; + transform: rotate(90deg); + } + + .party-info { + text-align: center; + } + + .party-name, + .party-address { + white-space: normal; + overflow: visible; + text-overflow: unset; + } + + .shipment-dates { + justify-content: space-between; + } + + .shipment-header-right { + min-width: auto; + } + + .action-buttons { + flex-direction: row; + gap: 12px; + } + + .action-btn { + flex: 1; + justify-content: center; + } +} + +@media (max-width: 640px) { + .shipment-header { + padding: 16px; + } + + .shipment-id { + font-size: 24px; + } + + .shipment-dates { + flex-direction: column; + gap: 16px; + } + + .action-buttons { + flex-direction: column; + gap: 8px; + } +} \ No newline at end of file diff --git a/frontend/src/pages/Shipment/sections/ShipmentHeader/ShipmentHeader.tsx b/frontend/src/pages/Shipment/sections/ShipmentHeader/ShipmentHeader.tsx new file mode 100644 index 0000000..c8e6bbf --- /dev/null +++ b/frontend/src/pages/Shipment/sections/ShipmentHeader/ShipmentHeader.tsx @@ -0,0 +1,121 @@ +import React from 'react'; +import { Download, Share2, MapPin } from 'lucide-react'; +import { StatusBadge, ShipmentStatus } from '../../../../components/ui/StatusBadge/StatusBadge'; +import './ShipmentHeader.css'; + +export interface ShipmentHeaderProps { + shipmentId: string; + status: ShipmentStatus; + sender: { + name: string; + address: string; + }; + receiver: { + name: string; + address: string; + }; + createdAt: string; + expectedDelivery: string; + onTrack?: () => void; + onDownloadProof?: () => void; + onShare?: () => void; +} + +export const ShipmentHeader: React.FC = ({ + shipmentId, + status, + sender, + receiver, + createdAt, + expectedDelivery, + onTrack = () => console.log('Track clicked'), + onDownloadProof = () => console.log('Download Proof clicked'), + onShare = () => console.log('Share clicked'), +}) => { + const formatDate = (dateString: string): string => { + const date = new Date(dateString); + return date.toLocaleDateString('en-US', { + year: 'numeric', + month: 'short', + day: 'numeric', + }); + }; + + return ( +
+
+ {/* Left Section - Shipment ID and Status */} +
+
+

#{shipmentId}

+ +
+
+ + {/* Center Section - Sender and Receiver Details */} +
+
+
+

From

+

{sender.name}

+

{sender.address}

+
+ +
+ +
+ +
+

To

+

{receiver.name}

+

{receiver.address}

+
+
+ +
+
+ Created: + {formatDate(createdAt)} +
+
+ Expected Delivery: + {formatDate(expectedDelivery)} +
+
+
+ + {/* Right Section - Action Buttons */} +
+
+ + + +
+
+
+
+ ); +}; + +export default ShipmentHeader; \ No newline at end of file diff --git a/frontend/tsconfig.tsbuildinfo b/frontend/tsconfig.tsbuildinfo index 8f0f169..9f994e6 100644 --- a/frontend/tsconfig.tsbuildinfo +++ b/frontend/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"root":["./src/app.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/landingpage/landingpage.tsx","./src/landingpage/sections/hero/hero.tsx","./src/landingpage/sections/howitworks/howitworks.tsx","./src/landingpage/sections/whynavin/whynavin.tsx","./src/components/navbar/navbar.tsx","./src/components/auth/protectedroute/protectedroute.test.tsx","./src/components/auth/protectedroute/protectedroute.tsx","./src/components/auth/walletconnectbutton/walletconnectbutton.tsx","./src/components/dashboard/charts/deliverysuccesschart/deliverysuccesschart.test.tsx","./src/components/dashboard/charts/deliverysuccesschart/deliverysuccesschart.tsx","./src/components/dashboard/charts/deliverysuccesschart/mockdeliverydata.ts","./src/components/dashboard/charts/shipmentvolumechart/shipmentvolumechart.test.tsx","./src/components/dashboard/charts/shipmentvolumechart/shipmentvolumechart.tsx","./src/components/dashboard/charts/shipmentvolumechart/mockvolumedata.ts","./src/components/layout/dashboardlayout.tsx","./src/components/layout/topheader/topheader.tsx","./src/components/shipment/statusupdate/statusupdate.test.tsx","./src/components/shipment/statusupdate/statusupdate.tsx","./src/components/shipment/trackingtimeline/trackingtimeline.example.tsx","./src/components/shipment/trackingtimeline/trackingtimeline.test.tsx","./src/components/shipment/trackingtimeline/trackingtimeline.tsx","./src/hooks/useauth.ts","./src/pages/analytics/analytics.tsx","./src/pages/blockchainledger/blockchainledger.tsx","./src/pages/helpcenter/helpcenter.tsx","./src/pages/home/home.tsx","./src/pages/landingpage/sections/features/features.tsx","./src/pages/settings/settings.tsx","./src/pages/settlements/settlements.tsx","./src/pages/shipments/shipments.tsx","./src/pages/auth/forgotpassword/forgotpassword.tsx","./src/pages/auth/login/login.tsx","./src/pages/auth/signup/signup.tsx","./src/pages/dashboard/dashboard.tsx","./src/pages/dashboard/company/companydashboard.tsx","./src/pages/dashboard/company/createshipment/createshipment.tsx","./src/pages/dashboard/company/recentshipments/recentshipments.test.tsx","./src/pages/dashboard/company/recentshipments/recentshipments.tsx","./src/pages/dashboard/company/recentshipments/mockshipments.ts","./src/pages/dashboard/company/settings/companysettings.tsx","./src/pages/dashboard/company/usermanagement/usermanagement.tsx","./src/pages/dashboard/customer/customerdashboard.tsx","./src/pages/dashboard/customer/activeshipments/activeshipments.tsx","./src/test/app.test.tsx","./src/test/setup.ts"],"version":"5.9.3"} \ No newline at end of file +{"root":["./src/app.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/landingpage/landingpage.tsx","./src/landingpage/sections/hero/hero.tsx","./src/landingpage/sections/howitworks/howitworks.tsx","./src/landingpage/sections/whynavin/whynavin.tsx","./src/components/navbar/navbar.tsx","./src/components/auth/protectedroute/protectedroute.test.tsx","./src/components/auth/protectedroute/protectedroute.tsx","./src/components/auth/walletconnectbutton/walletconnectbutton.tsx","./src/components/dashboard/charts/deliverysuccesschart/deliverysuccesschart.test.tsx","./src/components/dashboard/charts/deliverysuccesschart/deliverysuccesschart.tsx","./src/components/dashboard/charts/deliverysuccesschart/mockdeliverydata.ts","./src/components/dashboard/charts/shipmentvolumechart/shipmentvolumechart.test.tsx","./src/components/dashboard/charts/shipmentvolumechart/shipmentvolumechart.tsx","./src/components/dashboard/charts/shipmentvolumechart/mockvolumedata.ts","./src/components/layout/dashboardlayout.tsx","./src/components/layout/topheader/topheader.tsx","./src/components/shipment/statusupdate/statusupdate.test.tsx","./src/components/shipment/statusupdate/statusupdate.tsx","./src/components/shipment/trackingtimeline/trackingtimeline.example.tsx","./src/components/shipment/trackingtimeline/trackingtimeline.test.tsx","./src/components/shipment/trackingtimeline/trackingtimeline.tsx","./src/components/ui/statusbadge/statusbadge.tsx","./src/components/ui/statusbadge/index.ts","./src/hooks/useauth.ts","./src/pages/analytics/analytics.tsx","./src/pages/blockchainledger/blockchainledger.tsx","./src/pages/helpcenter/helpcenter.tsx","./src/pages/home/home.tsx","./src/pages/landingpage/sections/features/features.tsx","./src/pages/settings/settings.tsx","./src/pages/settlements/settlements.tsx","./src/pages/shipment/shipmentdetail.tsx","./src/pages/shipment/sections/shipmentheader/shipmentheader.tsx","./src/pages/shipments/shipments.tsx","./src/pages/auth/forgotpassword/forgotpassword.tsx","./src/pages/auth/login/login.tsx","./src/pages/auth/signup/signup.tsx","./src/pages/dashboard/dashboard.tsx","./src/pages/dashboard/company/companydashboard.tsx","./src/pages/dashboard/company/createshipment/createshipment.tsx","./src/pages/dashboard/company/recentshipments/recentshipments.test.tsx","./src/pages/dashboard/company/recentshipments/recentshipments.tsx","./src/pages/dashboard/company/recentshipments/mockshipments.ts","./src/pages/dashboard/company/settings/companysettings.tsx","./src/pages/dashboard/company/usermanagement/usermanagement.tsx","./src/pages/dashboard/customer/customerdashboard.tsx","./src/pages/dashboard/customer/activeshipments/activeshipments.tsx","./src/test/app.test.tsx","./src/test/setup.ts"],"version":"5.9.3"} \ No newline at end of file