@burdenoff/microfe-movethewheels 2026.703.4 → 2026.703.6

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.
Files changed (150) hide show
  1. package/dist/{AIAssistantPage-3YOnHO9Y.js → AIAssistantPage-BmILdHgO.js} +16 -15
  2. package/dist/AnalyticsPage-BSlsiSDE.js +194 -0
  3. package/dist/{CreateOrderPage-DRAgGo9i.js → CreateOrderPage-DaCgVaO3.js} +40 -40
  4. package/dist/{CustomerDetailsPage-BCeMmOFe.js → CustomerDetailsPage-DErpbafW.js} +71 -71
  5. package/dist/CustomersPage-C1lRU6xs.js +205 -0
  6. package/dist/DashboardPage-Q5-5EKAU.js +542 -0
  7. package/dist/{DataTable-XvUcTjwi.js → DataTable-KjzbwnRL.js} +31 -31
  8. package/dist/{DocumentsCard-U2lSe-cn.js → DocumentsCard-T9y6cv4-.js} +25 -25
  9. package/dist/{DriverDetailsPage-BQrYd_Lp.js → DriverDetailsPage-DnHGkDC7.js} +64 -64
  10. package/dist/DriversPage-C0ujWVOn.js +221 -0
  11. package/dist/FinancePage-CA2XEgsQ.js +175 -0
  12. package/dist/{FleetPage-3ZHsB-TN.js → FleetPage-DrvXW7wK.js} +22 -22
  13. package/dist/{FormError-cuLV2jVD.js → FormError-CRsMP7TQ.js} +1 -1
  14. package/dist/{ImportExportPage-C6f7DqhM.js → ImportExportPage-Cac9HjFx.js} +12 -12
  15. package/dist/InventoryPage-Ezf4gqKI.js +259 -0
  16. package/dist/LiveTrackingPage-CzbVwDqK.js +429 -0
  17. package/dist/{MarketplacePage-Bh_2ns4v.js → MarketplacePage-BHDmSQmo.js} +116 -116
  18. package/dist/MetricCard-DQlDNqmK.js +191 -0
  19. package/dist/{Notice-CSoDYKw9.js → Notice-GmA7JDR3.js} +2 -2
  20. package/dist/{OrderDetailsPage-zCj0lW0j.js → OrderDetailsPage-CR0Wc1aN.js} +58 -58
  21. package/dist/OrdersListPage-C8Bu6wXM.js +386 -0
  22. package/dist/{PageLayout-D4LDHJJq.js → PageLayout-DX1Ou6V6.js} +164 -134
  23. package/dist/{ProductDetailsPage-wsxAQkA0.js → ProductDetailsPage-B_ns2MOe.js} +55 -55
  24. package/dist/ProductsPage-c92BsEoA.js +186 -0
  25. package/dist/ReportsPage-CPLXtLT2.js +377 -0
  26. package/dist/{RouteDetailsPage-DyMJE9AS.js → RouteDetailsPage-DOfcRiFv.js} +208 -181
  27. package/dist/{RoutesPage-Dtc669yc.js → RoutesPage-BZGublby.js} +12 -12
  28. package/dist/{SettingsPage-CpH9xhQg.js → SettingsPage-5cweX_xh.js} +15 -15
  29. package/dist/Sparkline-zSXvG6vA.js +16729 -0
  30. package/dist/{StatusBadge-C87mDpDP.js → StatusBadge-oZjownr1.js} +7 -7
  31. package/dist/TrackingPage-Ln9qVflK.js +368 -0
  32. package/dist/{VehicleDetailsPage-DldYNsYV.js → VehicleDetailsPage-CrkzE0dN.js} +53 -53
  33. package/dist/VehiclesPage-CTQWH7af.js +184 -0
  34. package/dist/{WarehouseDetailsPage-CMG7or6G.js → WarehouseDetailsPage-CwDLaG65.js} +64 -64
  35. package/dist/WarehousesPage-KW02DvZg.js +182 -0
  36. package/dist/{arrow-left-n48Y-Wis.js → arrow-left-DJDw_Yqv.js} +1 -1
  37. package/dist/{arrow-right-Q3XQpTPR.js → arrow-right-Cb2fLTPJ.js} +1 -1
  38. package/dist/{arrow-up-xNF1zJUG.js → arrow-up-PxaOIyiT.js} +1 -1
  39. package/dist/{box-Eu05PXDh.js → box-hSJVtvGf.js} +1 -1
  40. package/dist/boxes-DDnxEkT5.js +54 -0
  41. package/dist/{chart-column-ouzgxIv_.js → chart-column-xXgAZvRl.js} +1 -1
  42. package/dist/charts-CfCwQg6o.js +2018 -0
  43. package/dist/{chevron-left-B2_r0Elx.js → chevron-left-dhEGJYdh.js} +1 -1
  44. package/dist/{chevron-right-eV4LjaSi.js → chevron-right-Cud2NDvm.js} +1 -1
  45. package/dist/chunk-BdsCSvBP.js +20 -0
  46. package/dist/{circle-alert-Bzh2DBSF.js → circle-alert-Rx0p3D5w.js} +1 -1
  47. package/dist/circle-check-BCxRFdFo.js +13 -0
  48. package/dist/{circle-check-big-CGMSpQmD.js → circle-check-big-BcIJ8xjx.js} +1 -1
  49. package/dist/{clock-Bl3ptexL.js → clock-B2_YxJgB.js} +1 -1
  50. package/dist/{dollar-sign-CAVU95SO.js → dollar-sign-CQmAICv4.js} +1 -1
  51. package/dist/{download-C5NbvVDc.js → download-CG4Tponq.js} +1 -1
  52. package/dist/{file-text-D-1uvLZG.js → file-text-CzH-zMub.js} +1 -1
  53. package/dist/{filter-DUfUg6BO.js → filter-C0u2Lwfn.js} +1 -1
  54. package/dist/{fuel-B6_lnKDs.js → fuel-C2KELcM-.js} +1 -1
  55. package/dist/index.css +2 -0
  56. package/dist/index.js +214 -225
  57. package/dist/{map-C-M-FQLR.js → map-FuPu5aTw.js} +1 -1
  58. package/dist/{map-pin-Dznl5l40.js → map-pin-czpLv9uy.js} +1 -1
  59. package/dist/mapMarkers-NCV9MRKR.js +28 -0
  60. package/dist/maps-D9m7PKrs.js +5070 -0
  61. package/dist/{navigation-BJSJl-VG.js → navigation-D5_pdCSS.js} +1 -1
  62. package/dist/{package-CcRttV2N.js → package-B0sdi6lU.js} +1 -1
  63. package/dist/{phone-DVSZHt_j.js → phone-V2nuzPu9.js} +1 -1
  64. package/dist/{plus-C_XZDwBz.js → plus-BqQxkfoU.js} +1 -1
  65. package/dist/{refresh-cw-CfgN67l3.js → refresh-cw-CEOAPEcV.js} +1 -1
  66. package/dist/route-CZWcW-Dw.js +22 -0
  67. package/dist/{save-DJE8Fpdv.js → save-DDFvrxWl.js} +1 -1
  68. package/dist/{search-D_VyGcZT.js → search-D7Ya6jxj.js} +1 -1
  69. package/dist/{square-pen-D-6JYrVQ.js → square-pen-DoZZS4Lw.js} +1 -1
  70. package/dist/{star-BpRlUZuU.js → star-B7PgVu5j.js} +1 -1
  71. package/dist/{store-B-8HMuyZ.js → store-YVzcIG4A.js} +1 -1
  72. package/dist/{trash-2-8vmv-XV_.js → trash-2-BegnBzwI.js} +1 -1
  73. package/dist/{trending-up-Dz6PqPRj.js → trending-up-DBd3XNdb.js} +1 -1
  74. package/dist/{triangle-alert-D7Y3J_4z.js → triangle-alert-Bxk3Kgs6.js} +1 -1
  75. package/dist/{truck-D-y2IDzv.js → truck-Clrn0oHp.js} +1 -1
  76. package/dist/{upload-CHZofOqb.js → upload-Df5JmMwH.js} +1 -1
  77. package/dist/{useAssistant-DVW4QgQb.js → useAssistant-Cb8nnIVC.js} +11 -28
  78. package/dist/{useCustomers-BPW4__PR.js → useCustomers-Dq2IR2HQ.js} +1 -1
  79. package/dist/{useFleet-ChBkxAd6.js → useFleet-CapnWBcA.js} +1 -1
  80. package/dist/{useImportExport-DrPDHEDK.js → useImportExport-BoGzrlJy.js} +1 -1
  81. package/dist/{useInventory-CAAVMRp6.js → useInventory-Ci6M2d9f.js} +1 -1
  82. package/dist/{useOrders-B465S2nt.js → useOrders-BuQU1OHX.js} +1 -1
  83. package/dist/{useReports-jQ3GpNOm.js → useReports-DIx8W7CO.js} +1 -1
  84. package/dist/{useRoutes-hS3d5-xr.js → useRoutes-D7EvI_pm.js} +1 -1
  85. package/dist/{useSettings-BB8X2RLh.js → useSettings-BhX251UQ.js} +6 -6
  86. package/dist/{useTracking-RjGz9PZG.js → useTracking-C40jmZ6W.js} +3 -3
  87. package/dist/{user-DzfTn4dE.js → user-BlcJrbtE.js} +1 -1
  88. package/dist/{user-check-BEKRCi7v.js → user-check-DtnQmimP.js} +1 -1
  89. package/dist/{users-CCrq-w0C.js → users-Cvwko-Dx.js} +1 -1
  90. package/dist/{warehouse-CaqfmMKh.js → warehouse-LWLVTk6G.js} +1 -1
  91. package/dist/{wrench-q_rgJfaP.js → wrench-Cme0RbyR.js} +1 -1
  92. package/dist/{x-tMeDMcCw.js → x-D8C9Pg5V.js} +1 -1
  93. package/package.json +5 -1
  94. package/src/movethewheels/components/GlassPanel.tsx +71 -0
  95. package/src/movethewheels/components/MetricCard.tsx +171 -73
  96. package/src/movethewheels/components/StatusBadge.tsx +7 -6
  97. package/src/movethewheels/components/charts/ChartShell.tsx +78 -0
  98. package/src/movethewheels/components/charts/Sparkline.tsx +85 -0
  99. package/src/movethewheels/components/charts/StatusDonut.tsx +115 -0
  100. package/src/movethewheels/components/charts/TrendChart.tsx +179 -0
  101. package/src/movethewheels/components/charts/VolumeBar.tsx +97 -0
  102. package/src/movethewheels/components/charts/chartTokens.ts +43 -0
  103. package/src/movethewheels/components/charts/index.ts +9 -0
  104. package/src/movethewheels/components/index.ts +44 -1
  105. package/src/movethewheels/components/maps/LogisticsMap.tsx +94 -0
  106. package/src/movethewheels/components/maps/MapCanvas.tsx +118 -0
  107. package/src/movethewheels/components/maps/RouteMap.tsx +71 -0
  108. package/src/movethewheels/components/maps/TrackingMap.tsx +102 -0
  109. package/src/movethewheels/components/maps/index.ts +16 -0
  110. package/src/movethewheels/components/maps/leaflet-setup.ts +124 -0
  111. package/src/movethewheels/components/maps/map-markers.css +121 -0
  112. package/src/movethewheels/hooks/useAnalytics.ts +14 -4
  113. package/src/movethewheels/pages/AnalyticsPage.tsx +93 -73
  114. package/src/movethewheels/pages/CreateOrderPage.tsx +4 -4
  115. package/src/movethewheels/pages/CustomersPage.tsx +29 -20
  116. package/src/movethewheels/pages/DashboardPage.tsx +238 -12
  117. package/src/movethewheels/pages/DriverDetailsPage.tsx +1 -1
  118. package/src/movethewheels/pages/DriversPage.tsx +35 -24
  119. package/src/movethewheels/pages/FinancePage.tsx +68 -30
  120. package/src/movethewheels/pages/InventoryPage.tsx +15 -3
  121. package/src/movethewheels/pages/LiveTrackingPage.tsx +124 -16
  122. package/src/movethewheels/pages/OrdersListPage.tsx +46 -38
  123. package/src/movethewheels/pages/ProductsPage.tsx +28 -24
  124. package/src/movethewheels/pages/ReportsPage.tsx +23 -0
  125. package/src/movethewheels/pages/RouteDetailsPage.tsx +46 -7
  126. package/src/movethewheels/pages/SettingsPage.tsx +2 -2
  127. package/src/movethewheels/pages/TrackingPage.tsx +76 -6
  128. package/src/movethewheels/pages/VehicleDetailsPage.tsx +1 -1
  129. package/src/movethewheels/pages/VehiclesPage.tsx +34 -24
  130. package/src/movethewheels/pages/WarehouseDetailsPage.tsx +1 -1
  131. package/src/movethewheels/pages/WarehousesPage.tsx +28 -22
  132. package/src/movethewheels/types/index.ts +1 -1
  133. package/src/movethewheels/utils/graphqlClient.ts +81 -31
  134. package/src/movethewheels/utils/mapMarkers.ts +58 -0
  135. package/dist/AnalyticsPage-CMpI1070.js +0 -215
  136. package/dist/CustomersPage-CaNBMXmM.js +0 -172
  137. package/dist/DashboardPage-DIKlXde3.js +0 -387
  138. package/dist/DriversPage-PYmdFiby.js +0 -176
  139. package/dist/FinancePage-Cwh9Bw4M.js +0 -136
  140. package/dist/InventoryPage-DpiqVu1v.js +0 -253
  141. package/dist/LiveTrackingPage-FAzzlVnX.js +0 -379
  142. package/dist/MetricCard-CVBVpu7o.js +0 -146
  143. package/dist/OrdersListPage-CAMsuUck.js +0 -384
  144. package/dist/ProductsPage-DC5qDLfz.js +0 -180
  145. package/dist/ReportsPage-BwUJ37eO.js +0 -356
  146. package/dist/TrackingPage-DaNEFG_h.js +0 -325
  147. package/dist/VehiclesPage-BFw13iMt.js +0 -176
  148. package/dist/WarehousesPage-Wkytnt86.js +0 -173
  149. package/dist/useAnalytics-D7HW2XRb.js +0 -347
  150. /package/dist/{formatters-BQr-aR5W.js → formatters-FWJDwTFv.js} +0 -0
@@ -1,4 +1,4 @@
1
- import { lt as e } from "./PageLayout-D4LDHJJq.js";
1
+ import { ut as e } from "./PageLayout-DX1Ou6V6.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/navigation.js
3
3
  var t = e("Navigation", [["polygon", {
4
4
  points: "3 11 22 2 13 21 11 13 3 11",
@@ -1,4 +1,4 @@
1
- import { lt as e } from "./PageLayout-D4LDHJJq.js";
1
+ import { ut as e } from "./PageLayout-DX1Ou6V6.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/package.js
3
3
  var t = e("Package", [
4
4
  ["path", {
@@ -1,4 +1,4 @@
1
- import { lt as e } from "./PageLayout-D4LDHJJq.js";
1
+ import { ut as e } from "./PageLayout-DX1Ou6V6.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/mail.js
3
3
  var t = e("Mail", [["rect", {
4
4
  width: "20",
@@ -1,4 +1,4 @@
1
- import { lt as e } from "./PageLayout-D4LDHJJq.js";
1
+ import { ut as e } from "./PageLayout-DX1Ou6V6.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/plus.js
3
3
  var t = e("Plus", [["path", {
4
4
  d: "M5 12h14",
@@ -1,4 +1,4 @@
1
- import { lt as e } from "./PageLayout-D4LDHJJq.js";
1
+ import { ut as e } from "./PageLayout-DX1Ou6V6.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/refresh-cw.js
3
3
  var t = e("RefreshCw", [
4
4
  ["path", {
@@ -0,0 +1,22 @@
1
+ import { ut as e } from "./PageLayout-DX1Ou6V6.js";
2
+ //#region node_modules/lucide-react/dist/esm/icons/route.js
3
+ var t = e("Route", [
4
+ ["circle", {
5
+ cx: "6",
6
+ cy: "19",
7
+ r: "3",
8
+ key: "1kj8tv"
9
+ }],
10
+ ["path", {
11
+ d: "M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15",
12
+ key: "1d8sl"
13
+ }],
14
+ ["circle", {
15
+ cx: "18",
16
+ cy: "5",
17
+ r: "3",
18
+ key: "gq8acd"
19
+ }]
20
+ ]);
21
+ //#endregion
22
+ export { t };
@@ -1,4 +1,4 @@
1
- import { lt as e } from "./PageLayout-D4LDHJJq.js";
1
+ import { ut as e } from "./PageLayout-DX1Ou6V6.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/save.js
3
3
  var t = e("Save", [
4
4
  ["path", {
@@ -1,4 +1,4 @@
1
- import { lt as e } from "./PageLayout-D4LDHJJq.js";
1
+ import { ut as e } from "./PageLayout-DX1Ou6V6.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/search.js
3
3
  var t = e("Search", [["circle", {
4
4
  cx: "11",
@@ -1,4 +1,4 @@
1
- import { lt as e } from "./PageLayout-D4LDHJJq.js";
1
+ import { ut as e } from "./PageLayout-DX1Ou6V6.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/square-pen.js
3
3
  var t = e("SquarePen", [["path", {
4
4
  d: "M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7",
@@ -1,4 +1,4 @@
1
- import { lt as e } from "./PageLayout-D4LDHJJq.js";
1
+ import { ut as e } from "./PageLayout-DX1Ou6V6.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/star.js
3
3
  var t = e("Star", [["path", {
4
4
  d: "M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",
@@ -1,4 +1,4 @@
1
- import { lt as e } from "./PageLayout-D4LDHJJq.js";
1
+ import { ut as e } from "./PageLayout-DX1Ou6V6.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/store.js
3
3
  var t = e("Store", [
4
4
  ["path", {
@@ -1,4 +1,4 @@
1
- import { lt as e } from "./PageLayout-D4LDHJJq.js";
1
+ import { ut as e } from "./PageLayout-DX1Ou6V6.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/trash-2.js
3
3
  var t = e("Trash2", [
4
4
  ["path", {
@@ -1,4 +1,4 @@
1
- import { lt as e } from "./PageLayout-D4LDHJJq.js";
1
+ import { ut as e } from "./PageLayout-DX1Ou6V6.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/trending-up.js
3
3
  var t = e("TrendingUp", [["polyline", {
4
4
  points: "22 7 13.5 15.5 8.5 10.5 2 17",
@@ -1,4 +1,4 @@
1
- import { lt as e } from "./PageLayout-D4LDHJJq.js";
1
+ import { ut as e } from "./PageLayout-DX1Ou6V6.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/triangle-alert.js
3
3
  var t = e("TriangleAlert", [
4
4
  ["path", {
@@ -1,4 +1,4 @@
1
- import { lt as e } from "./PageLayout-D4LDHJJq.js";
1
+ import { ut as e } from "./PageLayout-DX1Ou6V6.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/truck.js
3
3
  var t = e("Truck", [
4
4
  ["path", {
@@ -1,4 +1,4 @@
1
- import { lt as e } from "./PageLayout-D4LDHJJq.js";
1
+ import { ut as e } from "./PageLayout-DX1Ou6V6.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/upload.js
3
3
  var t = e("Upload", [
4
4
  ["path", {
@@ -1,7 +1,7 @@
1
- import { it as e, lt as t, ot as n } from "./PageLayout-D4LDHJJq.js";
1
+ import { at as e, st as t, ut as n } from "./PageLayout-DX1Ou6V6.js";
2
2
  import { useCallback as r, useMemo as i, useState as a } from "react";
3
3
  //#region node_modules/lucide-react/dist/esm/icons/bot.js
4
- var o = t("Bot", [
4
+ var o = n("Bot", [
5
5
  ["path", {
6
6
  d: "M12 8V4H8",
7
7
  key: "hb8ula"
@@ -30,36 +30,19 @@ var o = t("Bot", [
30
30
  d: "M9 13v2",
31
31
  key: "rq6x2g"
32
32
  }]
33
- ]), s = t("Route", [
34
- ["circle", {
35
- cx: "6",
36
- cy: "19",
37
- r: "3",
38
- key: "1kj8tv"
39
- }],
40
- ["path", {
41
- d: "M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15",
42
- key: "1d8sl"
43
- }],
44
- ["circle", {
45
- cx: "18",
46
- cy: "5",
47
- r: "3",
48
- key: "gq8acd"
49
- }]
50
- ]), c = "\n query MovethewheelsAssistantInsights($question: String!) {\n assistantInsights(question: $question) {\n answer\n generatedAt\n question\n }\n }\n";
51
- function l() {
52
- let { apiGatewayUrl: t, authToken: o, workspaceToken: s, workspaceId: l, tenantId: u, currentUser: d } = n(), [f, p] = a(!1), [m, h] = a(null), g = i(() => ({
53
- apiGatewayUrl: t,
33
+ ]), s = "\n query MovethewheelsAssistantInsights($question: String!) {\n assistantInsights(question: $question) {\n answer\n generatedAt\n question\n }\n }\n";
34
+ function c() {
35
+ let { apiGatewayUrl: n, authToken: o, workspaceToken: c, workspaceId: l, tenantId: u, currentUser: d } = t(), [f, p] = a(!1), [m, h] = a(null), g = i(() => ({
36
+ apiGatewayUrl: n,
54
37
  authToken: o,
55
- workspaceToken: s,
38
+ workspaceToken: c,
56
39
  workspaceId: l,
57
40
  tenantId: u,
58
41
  actorId: d?.id
59
42
  }), [
60
- t,
43
+ n,
61
44
  o,
62
- s,
45
+ c,
63
46
  l,
64
47
  u,
65
48
  d?.id
@@ -68,7 +51,7 @@ function l() {
68
51
  ask: r(async (t) => {
69
52
  p(!0), h(null);
70
53
  try {
71
- return (await e(g, c, { question: t })).assistantInsights;
54
+ return (await e(g, s, { question: t })).assistantInsights;
72
55
  } catch (e) {
73
56
  let t = e instanceof Error ? e : /* @__PURE__ */ Error("Failed to get assistant response");
74
57
  throw h(t), t;
@@ -81,4 +64,4 @@ function l() {
81
64
  };
82
65
  }
83
66
  //#endregion
84
- export { s as n, o as r, l as t };
67
+ export { o as n, c as t };
@@ -1,4 +1,4 @@
1
- import { it as e, ot as t } from "./PageLayout-D4LDHJJq.js";
1
+ import { at as e, st as t } from "./PageLayout-DX1Ou6V6.js";
2
2
  import { useCallback as n, useEffect as r, useMemo as i, useState as a } from "react";
3
3
  //#region src/movethewheels/hooks/useCustomers.ts
4
4
  var o = "\n query ListCustomers($filter: CustomerFilterInput, $pagination: PaginationInput) {\n customers(filter: $filter, pagination: $pagination) {\n id\n name\n email\n phone\n type\n company\n address\n businessLicense\n taxId\n rating\n createdAt\n updatedAt\n deletedAt\n }\n }\n", s = "\n query GetCustomer($id: ID!) {\n customer(id: $id) {\n id\n name\n email\n phone\n type\n company\n address\n businessLicense\n taxId\n rating\n createdAt\n updatedAt\n deletedAt\n }\n }\n", c = "\n mutation CreateCustomer($input: CreateCustomerInput!) {\n createCustomer(input: $input) {\n id\n name\n email\n phone\n type\n company\n address\n businessLicense\n taxId\n rating\n createdAt\n updatedAt\n deletedAt\n }\n }\n", l = "\n mutation UpdateCustomer($id: ID!, $input: UpdateCustomerInput!) {\n updateCustomer(id: $id, input: $input) {\n id\n name\n email\n phone\n type\n company\n address\n businessLicense\n taxId\n rating\n createdAt\n updatedAt\n deletedAt\n }\n }\n", u = "\n mutation DeleteCustomer($id: ID!) {\n deleteCustomer(id: $id)\n }\n";
@@ -1,4 +1,4 @@
1
- import { it as e, ot as t } from "./PageLayout-D4LDHJJq.js";
1
+ import { at as e, st as t } from "./PageLayout-DX1Ou6V6.js";
2
2
  import { useCallback as n, useEffect as r, useMemo as i, useState as a } from "react";
3
3
  //#region src/movethewheels/hooks/useFleet.ts
4
4
  var o = "\n query ListVehicles($filter: VehicleFilterInput, $pagination: PaginationInput) {\n vehicles(filter: $filter, pagination: $pagination) {\n id\n vehicleNumber\n type\n make\n model\n year\n capacity\n status\n currentLocation\n fuelLevel\n mileage\n createdAt\n updatedAt\n }\n }\n", s = "\n query ListDrivers($filter: DriverFilterInput, $pagination: PaginationInput) {\n drivers(filter: $filter, pagination: $pagination) {\n id\n userId\n firstName\n lastName\n employeeId\n licenseNumber\n licenseClass\n licenseExpiry\n status\n currentLocation\n rating\n vehicleId\n createdAt\n }\n }\n", c = "\n query GetVehicle($id: ID!) {\n vehicle(id: $id) {\n id\n vehicleNumber\n type\n make\n model\n year\n capacity\n status\n currentLocation\n fuelLevel\n mileage\n createdAt\n updatedAt\n }\n }\n", l = "\n query GetDriver($id: ID!) {\n driver(id: $id) {\n id\n userId\n firstName\n lastName\n employeeId\n licenseNumber\n licenseClass\n licenseExpiry\n status\n currentLocation\n rating\n vehicleId\n createdAt\n }\n }\n", u = "\n mutation UpdateVehicleStatus($id: ID!, $status: VehicleStatus!) {\n updateVehicleStatus(id: $id, status: $status) {\n id\n vehicleNumber\n type\n make\n model\n year\n capacity\n status\n currentLocation\n fuelLevel\n mileage\n createdAt\n updatedAt\n }\n }\n", d = "\n mutation AssignDriverVehicle($id: ID!, $vehicleId: ID) {\n assignDriverVehicle(id: $id, vehicleId: $vehicleId) {\n id\n userId\n firstName\n lastName\n employeeId\n licenseNumber\n licenseClass\n licenseExpiry\n status\n currentLocation\n rating\n vehicleId\n createdAt\n }\n }\n", f = "\n mutation UpdateDriverStatus($id: ID!, $status: DriverStatus!) {\n updateDriverStatus(id: $id, status: $status) {\n id\n userId\n firstName\n lastName\n employeeId\n licenseNumber\n licenseClass\n licenseExpiry\n status\n currentLocation\n rating\n vehicleId\n createdAt\n }\n }\n", p = "\n mutation CreateVehicle($input: CreateVehicleInput!) {\n createVehicle(input: $input) {\n id\n vehicleNumber\n type\n make\n model\n year\n capacity\n status\n currentLocation\n fuelLevel\n mileage\n createdAt\n updatedAt\n }\n }\n", m = "\n mutation CreateDriver($input: CreateDriverInput!) {\n createDriver(input: $input) {\n id\n userId\n firstName\n lastName\n employeeId\n licenseNumber\n licenseClass\n licenseExpiry\n status\n currentLocation\n rating\n vehicleId\n createdAt\n }\n }\n", h = "\n query GetFleetStats {\n fleetStats {\n totalVehicles\n activeVehicles\n inTransitVehicles\n maintenanceVehicles\n totalDrivers\n availableDrivers\n onDeliveryDrivers\n avgDriverRating\n }\n }\n";
@@ -1,4 +1,4 @@
1
- import { it as e, ot as t } from "./PageLayout-D4LDHJJq.js";
1
+ import { at as e, st as t } from "./PageLayout-DX1Ou6V6.js";
2
2
  import { useCallback as n, useMemo as r, useState as i } from "react";
3
3
  //#region src/movethewheels/hooks/useImportExport.ts
4
4
  var a = "\n mutation MovethewheelsExportData($input: MovethewheelsExportDataInput!) {\n exportData(input: $input) {\n success\n message\n payload\n }\n }\n", o = "\n mutation MovethewheelsImportData($input: MovethewheelsImportDataInput!) {\n importData(input: $input) {\n success\n message\n payload\n }\n }\n";
@@ -1,4 +1,4 @@
1
- import { it as e, ot as t } from "./PageLayout-D4LDHJJq.js";
1
+ import { at as e, st as t } from "./PageLayout-DX1Ou6V6.js";
2
2
  import { useCallback as n, useEffect as r, useMemo as i, useState as a } from "react";
3
3
  //#region src/movethewheels/hooks/useInventory.ts
4
4
  var o = "\n query ListInventoryItems($filter: InventoryFilterInput, $pagination: PaginationInput) {\n inventoryItems(filter: $filter, pagination: $pagination) {\n id\n productId\n warehouseId\n onHand\n available\n allocated\n damaged\n reorderPoint\n createdAt\n updatedAt\n }\n }\n", s = "\n query ListProducts($filter: ProductFilterInput, $pagination: PaginationInput) {\n products(filter: $filter, pagination: $pagination) {\n id\n sku\n name\n description\n category\n brand\n dimensions\n weight\n value\n hazardous\n fragile\n temperatureControlled\n createdAt\n updatedAt\n }\n }\n", c = "\n query ListWarehouses($filter: WarehouseFilterInput, $pagination: PaginationInput) {\n warehouses(filter: $filter, pagination: $pagination) {\n id\n name\n code\n type\n address\n totalCapacity\n usedCapacity\n createdAt\n }\n }\n", l = "\n query GetProduct($id: ID!) {\n product(id: $id) {\n id\n sku\n name\n description\n category\n brand\n dimensions\n weight\n value\n hazardous\n fragile\n temperatureControlled\n createdAt\n updatedAt\n }\n }\n", u = "\n query GetWarehouse($id: ID!) {\n warehouse(id: $id) {\n id\n name\n code\n type\n address\n totalCapacity\n usedCapacity\n createdAt\n }\n }\n", d = "\n query GetInventoryStats {\n inventoryStats {\n totalOnHand\n totalAvailable\n totalAllocated\n totalDamaged\n lowStockCount\n }\n }\n", f = "\n mutation CreateProduct($input: CreateProductInput!) {\n createProduct(input: $input) {\n id\n sku\n name\n description\n category\n brand\n dimensions\n weight\n value\n hazardous\n fragile\n temperatureControlled\n createdAt\n updatedAt\n }\n }\n", p = "\n mutation CreateWarehouse($input: CreateWarehouseInput!) {\n createWarehouse(input: $input) {\n id\n name\n code\n type\n address\n totalCapacity\n usedCapacity\n createdAt\n }\n }\n", m = "\n mutation AdjustInventoryStock($input: AdjustInventoryStockInput!) {\n adjustInventoryStock(input: $input) {\n id\n productId\n warehouseId\n onHand\n available\n allocated\n damaged\n reorderPoint\n createdAt\n updatedAt\n }\n }\n";
@@ -1,4 +1,4 @@
1
- import { it as e, ot as t } from "./PageLayout-D4LDHJJq.js";
1
+ import { at as e, st as t } from "./PageLayout-DX1Ou6V6.js";
2
2
  import { useCallback as n, useEffect as r, useMemo as i, useState as a } from "react";
3
3
  //#region src/movethewheels/hooks/useOrders.ts
4
4
  var o = "\n query ListMovethewheelsOrders($filter: OrderFilterInput, $pagination: PaginationInput) {\n movethewheelsOrders(filter: $filter, pagination: $pagination) {\n id\n orderNumber\n customerId\n orderType\n status\n priority\n pickupAddress\n deliveryAddress\n items\n pricing\n trackingNumber\n specialInstructions\n scheduledDelivery\n vehicleId\n driverId\n createdAt\n updatedAt\n customer {\n name\n email\n phone\n company\n }\n statusHistory {\n status\n notes\n location\n createdAt\n createdBy\n }\n }\n }\n", s = "\n query GetMovethewheelsOrder($id: ID!) {\n movethewheelsOrder(id: $id) {\n id\n orderNumber\n customerId\n orderType\n status\n priority\n pickupAddress\n deliveryAddress\n items\n pricing\n trackingNumber\n specialInstructions\n scheduledDelivery\n vehicleId\n driverId\n createdAt\n updatedAt\n customer {\n name\n email\n phone\n company\n }\n statusHistory {\n status\n notes\n location\n createdAt\n createdBy\n }\n }\n }\n", c = "\n query GetOrderStatsBundle {\n orderStats {\n total\n pending\n inTransit\n delivered\n cancelled\n failed\n }\n financeMetrics {\n revenue {\n totalRevenue\n averageOrderValue\n }\n }\n }\n", l = "\n mutation CreateMovethewheelsOrder($input: CreateOrderInput!) {\n createMovethewheelsOrder(input: $input) {\n id\n orderNumber\n customerId\n orderType\n status\n priority\n pickupAddress\n deliveryAddress\n items\n pricing\n trackingNumber\n specialInstructions\n scheduledDelivery\n vehicleId\n driverId\n createdAt\n updatedAt\n customer {\n name\n email\n phone\n company\n }\n statusHistory {\n status\n notes\n location\n createdAt\n createdBy\n }\n }\n }\n", u = "\n mutation UpdateMovethewheelsOrder($id: ID!, $input: UpdateOrderInput!) {\n updateMovethewheelsOrder(id: $id, input: $input) {\n id\n orderNumber\n customerId\n orderType\n status\n priority\n pickupAddress\n deliveryAddress\n items\n pricing\n trackingNumber\n specialInstructions\n scheduledDelivery\n vehicleId\n driverId\n createdAt\n updatedAt\n customer {\n name\n email\n phone\n company\n }\n statusHistory {\n status\n notes\n location\n createdAt\n createdBy\n }\n }\n }\n", d = "\n mutation UpdateMovethewheelsOrderStatus($id: ID!, $input: UpdateOrderStatusInput!) {\n updateMovethewheelsOrderStatus(id: $id, input: $input) {\n id\n orderNumber\n customerId\n orderType\n status\n priority\n pickupAddress\n deliveryAddress\n items\n pricing\n trackingNumber\n specialInstructions\n scheduledDelivery\n vehicleId\n driverId\n createdAt\n updatedAt\n customer {\n name\n email\n phone\n company\n }\n statusHistory {\n status\n notes\n location\n createdAt\n createdBy\n }\n }\n }\n", f = "\n mutation DeleteMovethewheelsOrder($id: ID!) {\n deleteMovethewheelsOrder(id: $id)\n }\n";
@@ -1,4 +1,4 @@
1
- import { it as e, ot as t } from "./PageLayout-D4LDHJJq.js";
1
+ import { at as e, st as t } from "./PageLayout-DX1Ou6V6.js";
2
2
  import { useCallback as n, useEffect as r, useMemo as i, useState as a } from "react";
3
3
  //#region src/movethewheels/hooks/useReports.ts
4
4
  var o = "\n id\n name\n description\n type\n status\n schedule\n lastGenerated\n createdAt\n updatedAt\n", s = `
@@ -1,4 +1,4 @@
1
- import { it as e, ot as t } from "./PageLayout-D4LDHJJq.js";
1
+ import { at as e, st as t } from "./PageLayout-DX1Ou6V6.js";
2
2
  import { useCallback as n, useEffect as r, useMemo as i, useState as a } from "react";
3
3
  //#region src/movethewheels/hooks/useRoutes.ts
4
4
  var o = "\n query ListRoutes($filter: RouteFilterInput, $pagination: PaginationInput) {\n routes(filter: $filter, pagination: $pagination) {\n id\n name\n status\n shipmentId\n vehicleId\n driverId\n waypoints\n estimatedDistance\n estimatedDuration\n fuelCost\n actualDistance\n actualDuration\n createdAt\n }\n }\n", s = "\n query GetRoute($id: ID!) {\n route(id: $id) {\n id\n name\n status\n shipmentId\n vehicleId\n driverId\n waypoints\n estimatedDistance\n estimatedDuration\n fuelCost\n actualDistance\n actualDuration\n createdAt\n }\n }\n", c = "\n mutation CreateRoute($input: CreateRouteInput!) {\n createRoute(input: $input) {\n id\n name\n status\n shipmentId\n vehicleId\n driverId\n waypoints\n estimatedDistance\n estimatedDuration\n fuelCost\n actualDistance\n actualDuration\n createdAt\n }\n }\n", l = "\n mutation UpdateRoute($id: ID!, $input: UpdateRouteInput!) {\n updateRoute(id: $id, input: $input) {\n id\n name\n status\n shipmentId\n vehicleId\n driverId\n waypoints\n estimatedDistance\n estimatedDuration\n fuelCost\n actualDistance\n actualDuration\n createdAt\n }\n }\n", u = "\n mutation DeleteRoute($id: ID!) {\n deleteRoute(id: $id)\n }\n", d = "\n mutation OptimizeRoute($id: ID!) {\n optimizeRoute(id: $id) {\n id\n name\n status\n shipmentId\n vehicleId\n driverId\n waypoints\n estimatedDistance\n estimatedDuration\n fuelCost\n actualDistance\n actualDuration\n createdAt\n }\n }\n";
@@ -1,7 +1,7 @@
1
- import { it as e, lt as t, ot as n } from "./PageLayout-D4LDHJJq.js";
1
+ import { at as e, st as t, ut as n } from "./PageLayout-DX1Ou6V6.js";
2
2
  import { useCallback as r, useEffect as i, useMemo as a, useState as o } from "react";
3
3
  //#region node_modules/lucide-react/dist/esm/icons/globe.js
4
- var s = t("Globe", [
4
+ var s = n("Globe", [
5
5
  ["circle", {
6
6
  cx: "12",
7
7
  cy: "12",
@@ -16,7 +16,7 @@ var s = t("Globe", [
16
16
  d: "M2 12h20",
17
17
  key: "9i4pu4"
18
18
  }]
19
- ]), c = t("Settings", [["path", {
19
+ ]), c = n("Settings", [["path", {
20
20
  d: "M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z",
21
21
  key: "1qme2f"
22
22
  }], ["circle", {
@@ -26,15 +26,15 @@ var s = t("Globe", [
26
26
  key: "1v7zrd"
27
27
  }]]), l = "\n query MovethewheelsModuleSettings {\n moduleSettings {\n preferences\n updatedAt\n workspaceId\n }\n }\n", u = "\n mutation UpdateMovethewheelsModuleSettings($input: UpdateMovethewheelsModuleSettingsInput!) {\n updateModuleSettings(input: $input) {\n preferences\n updatedAt\n workspaceId\n }\n }\n";
28
28
  function d() {
29
- let { apiGatewayUrl: t, authToken: s, workspaceToken: c, workspaceId: d, tenantId: f, currentUser: p } = n(), [m, h] = o(null), [g, _] = o(!1), [v, y] = o(!1), [b, x] = o(null), S = a(() => ({
30
- apiGatewayUrl: t,
29
+ let { apiGatewayUrl: n, authToken: s, workspaceToken: c, workspaceId: d, tenantId: f, currentUser: p } = t(), [m, h] = o(null), [g, _] = o(!1), [v, y] = o(!1), [b, x] = o(null), S = a(() => ({
30
+ apiGatewayUrl: n,
31
31
  authToken: s,
32
32
  workspaceToken: c,
33
33
  workspaceId: d,
34
34
  tenantId: f,
35
35
  actorId: p?.id
36
36
  }), [
37
- t,
37
+ n,
38
38
  s,
39
39
  c,
40
40
  d,
@@ -1,6 +1,6 @@
1
- import { it as e, ot as t } from "./PageLayout-D4LDHJJq.js";
2
- import { r as n, t as r } from "./useOrders-B465S2nt.js";
3
- import { a as i, n as a, o, t as s } from "./useFleet-ChBkxAd6.js";
1
+ import { at as e, st as t } from "./PageLayout-DX1Ou6V6.js";
2
+ import { r as n, t as r } from "./useOrders-BuQU1OHX.js";
3
+ import { a as i, n as a, o, t as s } from "./useFleet-CapnWBcA.js";
4
4
  import { useCallback as c, useEffect as l, useMemo as u, useState as d } from "react";
5
5
  //#region src/movethewheels/hooks/useTracking.ts
6
6
  var f = "\n query ListShipments($filter: ShipmentFilterInput, $pagination: PaginationInput) {\n shipments(filter: $filter, pagination: $pagination) {\n id\n shipmentNumber\n orderId\n status\n estimatedDelivery\n }\n }\n", p = "\n query GetShipment($id: ID!) {\n shipment(id: $id) {\n id\n shipmentNumber\n orderId\n status\n estimatedDelivery\n trackingEvents {\n id\n shipmentId\n eventType\n location\n details\n timestamp\n }\n }\n }\n", m = "\n query GetOrderTracking($orderId: ID!) {\n orderTracking(orderId: $orderId) {\n id\n shipmentId\n eventType\n location\n details\n timestamp\n }\n }\n", h = "\n query GetActiveDeliveries {\n activeDeliveries {\n id\n shipmentNumber\n orderId\n status\n estimatedDelivery\n }\n }\n", g = "\n query GetTrackingAlerts {\n trackingAlerts {\n shipmentId\n shipmentNumber\n alertType\n message\n }\n }\n";
@@ -1,4 +1,4 @@
1
- import { lt as e } from "./PageLayout-D4LDHJJq.js";
1
+ import { ut as e } from "./PageLayout-DX1Ou6V6.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/user.js
3
3
  var t = e("User", [["path", {
4
4
  d: "M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",
@@ -1,4 +1,4 @@
1
- import { lt as e } from "./PageLayout-D4LDHJJq.js";
1
+ import { ut as e } from "./PageLayout-DX1Ou6V6.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/user-check.js
3
3
  var t = e("UserCheck", [
4
4
  ["path", {
@@ -1,4 +1,4 @@
1
- import { lt as e } from "./PageLayout-D4LDHJJq.js";
1
+ import { ut as e } from "./PageLayout-DX1Ou6V6.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/users.js
3
3
  var t = e("Users", [
4
4
  ["path", {
@@ -1,4 +1,4 @@
1
- import { lt as e } from "./PageLayout-D4LDHJJq.js";
1
+ import { ut as e } from "./PageLayout-DX1Ou6V6.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/warehouse.js
3
3
  var t = e("Warehouse", [
4
4
  ["path", {
@@ -1,4 +1,4 @@
1
- import { lt as e } from "./PageLayout-D4LDHJJq.js";
1
+ import { ut as e } from "./PageLayout-DX1Ou6V6.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/wrench.js
3
3
  var t = e("Wrench", [["path", {
4
4
  d: "M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z",
@@ -1,4 +1,4 @@
1
- import { lt as e } from "./PageLayout-D4LDHJJq.js";
1
+ import { ut as e } from "./PageLayout-DX1Ou6V6.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/x.js
3
3
  var t = e("X", [["path", {
4
4
  d: "M18 6 6 18",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-movethewheels",
3
- "version": "2026.703.4",
3
+ "version": "2026.703.6",
4
4
  "description": "Burdenoff MoveTheWheels Microfrontend - Logistics & Supply Chain Management Platform",
5
5
  "type": "module",
6
6
  "files": [
@@ -41,12 +41,15 @@
41
41
  "dependencies": {
42
42
  "@apollo/client": "^4.0.11",
43
43
  "@burdenoff/fe-libs": "2026.625.5",
44
+ "@react-leaflet/core": "^3.0.0",
44
45
  "@tanstack/react-query": "^5.90.16",
45
46
  "clsx": "^2.1.1",
46
47
  "graphql": "^16.12.0",
48
+ "leaflet": "^1.9.4",
47
49
  "lucide-react": "^0.468.0",
48
50
  "react": "^19.0.0",
49
51
  "react-dom": "^19.0.0",
52
+ "react-leaflet": "^5.0.0",
50
53
  "react-router-dom": "^7.1.3",
51
54
  "recharts": "^2.15.0",
52
55
  "tailwind-merge": "^3.4.0",
@@ -61,6 +64,7 @@
61
64
  "@graphql-codegen/typescript": "^4.0.0",
62
65
  "@graphql-codegen/typescript-operations": "^4.0.0",
63
66
  "@graphql-codegen/typescript-react-apollo": "^4.0.0",
67
+ "@types/leaflet": "^1.9.12",
64
68
  "@types/react": "^19.0.2",
65
69
  "@types/react-dom": "^19.0.2",
66
70
  "@vitejs/plugin-react": "^4.3.4",
@@ -0,0 +1,71 @@
1
+ import type { HTMLAttributes, ReactNode } from 'react';
2
+ import { GlassCard } from '@burdenoff/fe-libs/ui';
3
+ import { cn } from '../utils/cn';
4
+
5
+ interface GlassPanelProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
6
+ /** Optional panel title rendered in a compact header row. */
7
+ title?: ReactNode;
8
+ /** Optional right-aligned header slot (actions, filters, legend chips). */
9
+ action?: ReactNode;
10
+ /** Optional supporting text under the title. */
11
+ description?: ReactNode;
12
+ /** Inner padding. Defaults to `md`. Use `none` for edge-to-edge (maps/charts). */
13
+ padding?: 'none' | 'sm' | 'md' | 'lg';
14
+ treatment?: 'glass' | 'plain' | 'metric' | 'insight';
15
+ glow?: boolean;
16
+ children?: ReactNode;
17
+ /** Extra classes for the inner content wrapper (below the header). */
18
+ bodyClassName?: string;
19
+ }
20
+
21
+ const paddingClasses: Record<NonNullable<GlassPanelProps['padding']>, string> = {
22
+ none: 'p-0',
23
+ sm: 'p-3',
24
+ md: 'p-4 sm:p-5',
25
+ lg: 'p-6',
26
+ };
27
+
28
+ /**
29
+ * GlassPanel — a translucent, rounded surface wrapper with an optional header
30
+ * (title / description / action). The glassmorphism-lite building block for
31
+ * dashboard sections, map/chart cards, and side rails. Token-based, theme-aware,
32
+ * and follows the fe-libs no-movement hover policy.
33
+ */
34
+ export function GlassPanel({
35
+ title,
36
+ action,
37
+ description,
38
+ padding = 'md',
39
+ treatment = 'glass',
40
+ glow = false,
41
+ className,
42
+ bodyClassName,
43
+ children,
44
+ ...rest
45
+ }: GlassPanelProps) {
46
+ const hasHeader = title != null || action != null || description != null;
47
+
48
+ return (
49
+ <GlassCard
50
+ treatment={treatment}
51
+ glow={glow}
52
+ className={cn('overflow-hidden border-border-seam', className)}
53
+ {...rest}
54
+ >
55
+ {hasHeader && (
56
+ <div className="flex items-start justify-between gap-3 border-b border-border-seam/70 px-4 py-3 sm:px-5">
57
+ <div className="min-w-0 space-y-0.5">
58
+ {title != null && (
59
+ <h3 className="truncate text-sm font-semibold text-text-primary">{title}</h3>
60
+ )}
61
+ {description != null && (
62
+ <p className="text-xs text-text-secondary">{description}</p>
63
+ )}
64
+ </div>
65
+ {action != null && <div className="flex shrink-0 items-center gap-2">{action}</div>}
66
+ </div>
67
+ )}
68
+ <div className={cn(paddingClasses[padding], bodyClassName)}>{children}</div>
69
+ </GlassCard>
70
+ );
71
+ }