diff --git a/apps/edr-freight-web/backoffice/src/components/bookings/BookingRequestsHeader.tsx b/apps/edr-freight-web/backoffice/src/components/bookings/BookingRequestsHeader.tsx
index 0195efe11..3d6eeb398 100644
--- a/apps/edr-freight-web/backoffice/src/components/bookings/BookingRequestsHeader.tsx
+++ b/apps/edr-freight-web/backoffice/src/components/bookings/BookingRequestsHeader.tsx
@@ -11,14 +11,11 @@ import {
RefreshCw,
} from "lucide-react";
-import { freightBrand } from "@/theme/freight-brand";
import type {
BookingListSummaryMetrics,
BookingListSummaryTabs,
} from "@/services/bookings.service";
-const HERO_GRADIENT = `linear-gradient(135deg, ${freightBrand.primaryDark} 0%, ${freightBrand.primary} 48%, ${freightBrand.primaryLight} 120%)`;
-
/** Lifecycle stages for the pipeline distribution bar (in flow order). */
const PIPELINE_STAGES: Array<{
key: keyof BookingListSummaryTabs;
@@ -26,13 +23,18 @@ const PIPELINE_STAGES: Array<{
color: string;
}> = [
{ key: "intake", label: "Intake", color: "#38bdf8" },
- { key: "in_approval", label: "Approval", color: "#fbbf24" },
- { key: "approved_contract", label: "Contract", color: "#a78bfa" },
+ { key: "in_approval", label: "Approval", color: "#f59e0b" },
+ { key: "approved_contract", label: "Contract", color: "#8b5cf6" },
{ key: "payment", label: "Payment", color: "#fb923c" },
- { key: "operations", label: "Operations", color: "#2dd4bf" },
- { key: "completed", label: "Completed", color: "#86efac" },
+ { key: "operations", label: "Operations", color: "#14b8a6" },
+ { key: "completed", label: "Completed", color: "#22c55e" },
];
+const CARD_STYLE = {
+ background: "var(--mantine-color-gray-0)",
+ border: "1px solid var(--mantine-color-gray-2)",
+} as const;
+
export interface BookingRequestsHeaderProps {
metrics?: BookingListSummaryMetrics;
tabs?: BookingListSummaryTabs;
@@ -59,74 +61,40 @@ export function BookingRequestsHeader({
style={{
position: "relative",
overflow: "hidden",
- background: HERO_GRADIENT,
- boxShadow: freightBrand.shadow,
+ background: "#ffffff",
+ border: "1px solid var(--mantine-color-gray-2)",
+ boxShadow: "0 1px 3px rgba(15,23,42,0.04)",
}}
>
- {/* decorative glows */}
-
-
-
-
+
-
+
Operations
-
+
Booking Requests
-
+
Track every booking from submission through approval, payment, and
dispatch — prioritize what needs action.
- }
- onClick={onCreate}
- >
+ } onClick={onCreate}>
Create booking
}
loading={isFetching}
onClick={onRefresh}
- style={{ background: "rgba(255,255,255,0.15)" }}
>
Refresh
@@ -134,19 +102,14 @@ export function BookingRequestsHeader({
-
+
-
+
{tabs ? : null}
@@ -173,36 +131,31 @@ export function BookingRequestsHeader({
/** Compact ring gauge with the stat icon at its center. */
function MiniDonut({
pct,
- color = "white",
+ color,
children,
size = 52,
stroke = 5,
}: {
pct?: number | null;
- color?: string;
+ color: string;
children: ReactNode;
size?: number;
stroke?: number;
}) {
const radius = (size - stroke) / 2;
const circumference = 2 * Math.PI * radius;
- const clamped =
- pct != null ? Math.min(100, Math.max(0, Math.round(pct))) : null;
+ const clamped = pct != null ? Math.min(100, Math.max(0, Math.round(pct))) : null;
const dash = clamped != null ? (clamped / 100) * circumference : 0;
return (
-
+
+
+ {/* RIGHT — sticky summary */}
+
+
+
+
+
+
+
+ Summary
+
+
+
+
+ {freightType === "BULK" ? "Bulk" : "Container"}
+
+
+ {tradeDirection}
+
+ {isGovernment ? (
+
+ Government
+
+ ) : null}
+ {isHazardous ? (
+ }>
+ Hazardous
+
+ ) : null}
+
+
+
+ {freightType === "CONTAINER" ? (
+ <>
+
+
+ >
+ ) : null}
+
+
+ y.value === originYardId)?.label ?? "—"} → ${
+ yards.find((y) => y.value === destinationYardId)?.label ?? "—"
+ }`
+ : "Not set"
+ }
+ />
+
+
+
+ {sameYard ? (
+
+
+ Origin and destination must differ.
+
+ ) : null}
+
+
+
+
+
+
+
+
+
+ {isGovernment
+ ? "Government bookings skip the commercial 3-hour hold and enter the priority lane."
+ : "Overweight container lines are allowed here and flagged later at scheduling."}
+
+
+
+
+
+
);
}
+
+function SummaryRow({ label, value, strong }: { label: string; value: string; strong?: boolean }) {
+ return (
+
+
+ {label}
+
+
+ {value}
+
+
+ );
+}
diff --git a/apps/edr-freight-web/backoffice/src/pages/trainScheduling/TrainScheduleV2DetailPage.tsx b/apps/edr-freight-web/backoffice/src/pages/trainScheduling/TrainScheduleV2DetailPage.tsx
index 98d671f94..667b36f7f 100644
--- a/apps/edr-freight-web/backoffice/src/pages/trainScheduling/TrainScheduleV2DetailPage.tsx
+++ b/apps/edr-freight-web/backoffice/src/pages/trainScheduling/TrainScheduleV2DetailPage.tsx
@@ -711,52 +711,30 @@ export default function TrainScheduleV2DetailPage() {
style={{
position: "relative",
overflow: "hidden",
- background: scheduleBrand.heroGradient,
- boxShadow: scheduleBrand.shadow,
+ background: "#ffffff",
+ border: "1px solid var(--mantine-color-gray-2)",
+ boxShadow: "0 1px 3px rgba(15,23,42,0.04)",
}}
>
-
-
+
-
+
{schedule.route?.name ?? "Train schedule"}
{schedule.trainNumber ? (
-
+
{schedule.trainNumber}
) : null}
}
@@ -788,8 +765,7 @@ export default function TrainScheduleV2DetailPage() {
) : null}
{["DRAFT", "SCHEDULED"].includes(schedule.status) ? (