@burdenoff/microfe-assethandler 2026.1107.2 → 2026.1108.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.
Files changed (1325) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +4 -5
  2. package/dist/assethandler/AssetHandlerRoot.d.ts +0 -2
  3. package/dist/assethandler/AssetHandlerRoot.js +25 -26
  4. package/dist/assethandler/AssetHandlerRoot.js.map +1 -1
  5. package/dist/assethandler/AssetHandlerRoutes.d.ts +1 -2
  6. package/dist/assethandler/AssetHandlerRoutes.js +1 -2
  7. package/dist/assethandler/AssetHandlerRoutes.js.map +1 -1
  8. package/dist/assethandler/admin/AdminContext.d.ts +0 -2
  9. package/dist/assethandler/admin/AdminContext.js +1 -2
  10. package/dist/assethandler/admin/AdminContext.js.map +1 -1
  11. package/dist/assethandler/admin/AdminPage.d.ts +0 -2
  12. package/dist/assethandler/admin/AdminPage.js +8 -9
  13. package/dist/assethandler/admin/AdminPage.js.map +1 -1
  14. package/dist/assethandler/admin/AdminRoot.d.ts +0 -2
  15. package/dist/assethandler/admin/AdminRoot.js +20 -21
  16. package/dist/assethandler/admin/AdminRoot.js.map +1 -1
  17. package/dist/assethandler/admin/adminOperations.d.ts +0 -1
  18. package/dist/assethandler/admin/adminOperations.js +2 -3
  19. package/dist/assethandler/admin/adminOperations.js.map +1 -1
  20. package/dist/assethandler/components/ActivityTimeline.d.ts +1 -2
  21. package/dist/assethandler/components/ActivityTimeline.js +3 -4
  22. package/dist/assethandler/components/ActivityTimeline.js.map +1 -1
  23. package/dist/assethandler/components/AssetTag.d.ts +1 -2
  24. package/dist/assethandler/components/AssetTag.js +0 -1
  25. package/dist/assethandler/components/AssetTag.js.map +1 -1
  26. package/dist/assethandler/components/AttachmentsPanel.d.ts +1 -2
  27. package/dist/assethandler/components/AttachmentsPanel.js +1 -2
  28. package/dist/assethandler/components/AttachmentsPanel.js.map +1 -1
  29. package/dist/assethandler/components/CameraTagScanner.d.ts +1 -2
  30. package/dist/assethandler/components/CameraTagScanner.js +2 -3
  31. package/dist/assethandler/components/CameraTagScanner.js.map +1 -1
  32. package/dist/assethandler/components/ChartCard.d.ts +1 -3
  33. package/dist/assethandler/components/ChartCard.js +1 -2
  34. package/dist/assethandler/components/ChartCard.js.map +1 -1
  35. package/dist/assethandler/components/CommentsPanel.d.ts +1 -2
  36. package/dist/assethandler/components/CommentsPanel.js +3 -8
  37. package/dist/assethandler/components/CommentsPanel.js.map +1 -1
  38. package/dist/assethandler/components/FieldWorkOrderItem.d.ts +1 -3
  39. package/dist/assethandler/components/FieldWorkOrderItem.js +10 -15
  40. package/dist/assethandler/components/FieldWorkOrderItem.js.map +1 -1
  41. package/dist/assethandler/components/ListEmptyState.d.ts +1 -3
  42. package/dist/assethandler/components/NotFoundState.d.ts +1 -3
  43. package/dist/assethandler/components/NotFoundState.js +1 -2
  44. package/dist/assethandler/components/NotFoundState.js.map +1 -1
  45. package/dist/assethandler/components/Pagination.d.ts +1 -2
  46. package/dist/assethandler/components/Pagination.js +1 -2
  47. package/dist/assethandler/components/Pagination.js.map +1 -1
  48. package/dist/assethandler/components/RelatedRunbooksPanel.d.ts +1 -2
  49. package/dist/assethandler/components/RelatedRunbooksPanel.js +3 -8
  50. package/dist/assethandler/components/RelatedRunbooksPanel.js.map +1 -1
  51. package/dist/assethandler/components/SectionHeader.d.ts +1 -3
  52. package/dist/assethandler/components/SectionHeader.js +1 -2
  53. package/dist/assethandler/components/SectionHeader.js.map +1 -1
  54. package/dist/assethandler/components/StatTile.d.ts +1 -3
  55. package/dist/assethandler/components/StatTile.js +1 -2
  56. package/dist/assethandler/components/StatTile.js.map +1 -1
  57. package/dist/assethandler/components/charts/BarsChart.d.ts +1 -3
  58. package/dist/assethandler/components/charts/BarsChart.js +33 -34
  59. package/dist/assethandler/components/charts/BarsChart.js.map +1 -1
  60. package/dist/assethandler/components/charts/ChartParts.d.ts +5 -7
  61. package/dist/assethandler/components/charts/ChartParts.js +28 -29
  62. package/dist/assethandler/components/charts/ChartParts.js.map +1 -1
  63. package/dist/assethandler/components/charts/DonutChart.d.ts +1 -3
  64. package/dist/assethandler/components/charts/DonutChart.js +16 -17
  65. package/dist/assethandler/components/charts/DonutChart.js.map +1 -1
  66. package/dist/assethandler/components/charts/ProgressMeter.d.ts +1 -3
  67. package/dist/assethandler/components/charts/ProgressMeter.js +7 -8
  68. package/dist/assethandler/components/charts/ProgressMeter.js.map +1 -1
  69. package/dist/assethandler/components/charts/RadialGauge.d.ts +1 -3
  70. package/dist/assethandler/components/charts/RadialGauge.js +16 -17
  71. package/dist/assethandler/components/charts/RadialGauge.js.map +1 -1
  72. package/dist/assethandler/components/charts/Sparkline.d.ts +1 -2
  73. package/dist/assethandler/components/charts/Sparkline.js +25 -26
  74. package/dist/assethandler/components/charts/Sparkline.js.map +1 -1
  75. package/dist/assethandler/components/charts/TrendChart.d.ts +1 -3
  76. package/dist/assethandler/components/charts/TrendChart.js +38 -39
  77. package/dist/assethandler/components/charts/TrendChart.js.map +1 -1
  78. package/dist/assethandler/components/charts/chartTheme.d.ts +0 -1
  79. package/dist/assethandler/components/charts/chartTheme.js +1 -2
  80. package/dist/assethandler/components/charts/chartTheme.js.map +1 -1
  81. package/dist/assethandler/components/charts/index.d.ts +0 -1
  82. package/dist/assethandler/components/charts/index.js +8 -7
  83. package/dist/assethandler/components/index.d.ts +0 -1
  84. package/dist/assethandler/components/index.js +18 -17
  85. package/dist/assethandler/hooks/useAssetHandlerNavigate.d.ts +0 -2
  86. package/dist/assethandler/hooks/useAssetHandlerNavigate.js +3 -3
  87. package/dist/assethandler/hooks/useAssetHandlerNavigate.js.map +1 -1
  88. package/dist/assethandler/hooks/useCopy.d.ts +0 -1
  89. package/dist/assethandler/hooks/useCopy.js +1 -2
  90. package/dist/assethandler/hooks/useCopy.js.map +1 -1
  91. package/dist/assethandler/hooks/useFieldQueue.d.ts +0 -2
  92. package/dist/assethandler/hooks/useFieldQueue.js +26 -28
  93. package/dist/assethandler/hooks/useFieldQueue.js.map +1 -1
  94. package/dist/assethandler/hooks/useMaintenancePlans.d.ts +0 -2
  95. package/dist/assethandler/hooks/useMaintenancePlans.js +2 -3
  96. package/dist/assethandler/hooks/useMaintenancePlans.js.map +1 -1
  97. package/dist/assethandler/hooks/useTr.d.ts +0 -1
  98. package/dist/assethandler/hooks/useTr.js +1 -2
  99. package/dist/assethandler/hooks/useTr.js.map +1 -1
  100. package/dist/assethandler/index.d.ts +0 -1
  101. package/dist/assethandler/index.js +5 -4
  102. package/dist/assethandler/ops/MaintenancePlanDialog.d.ts +1 -3
  103. package/dist/assethandler/ops/MaintenancePlanDialog.js +1 -2
  104. package/dist/assethandler/ops/MaintenancePlanDialog.js.map +1 -1
  105. package/dist/assethandler/ops/NewWorkOrderDialog.d.ts +1 -2
  106. package/dist/assethandler/ops/NewWorkOrderDialog.js +1 -2
  107. package/dist/assethandler/ops/NewWorkOrderDialog.js.map +1 -1
  108. package/dist/assethandler/ops/ScheduleMaintenanceDialog.d.ts +1 -2
  109. package/dist/assethandler/ops/ScheduleMaintenanceDialog.js +1 -2
  110. package/dist/assethandler/ops/ScheduleMaintenanceDialog.js.map +1 -1
  111. package/dist/assethandler/pages/AiPredictionsPage.d.ts +1 -2
  112. package/dist/assethandler/pages/AiPredictionsPage.js +5 -6
  113. package/dist/assethandler/pages/AiPredictionsPage.js.map +1 -1
  114. package/dist/assethandler/pages/AnalyticsPage.d.ts +1 -2
  115. package/dist/assethandler/pages/AnalyticsPage.js +4 -5
  116. package/dist/assethandler/pages/AnalyticsPage.js.map +1 -1
  117. package/dist/assethandler/pages/AssetsAssetCategoriesPage.d.ts +1 -2
  118. package/dist/assethandler/pages/AssetsAssetCategoriesPage.js +4 -5
  119. package/dist/assethandler/pages/AssetsAssetCategoriesPage.js.map +1 -1
  120. package/dist/assethandler/pages/AssetsAssetCheckInOutPage.d.ts +1 -2
  121. package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js +89 -98
  122. package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js.map +1 -1
  123. package/dist/assethandler/pages/AssetsAssetCreatePage.d.ts +1 -2
  124. package/dist/assethandler/pages/AssetsAssetCreatePage.js +161 -162
  125. package/dist/assethandler/pages/AssetsAssetCreatePage.js.map +1 -1
  126. package/dist/assethandler/pages/AssetsAssetDetailPage.d.ts +0 -2
  127. package/dist/assethandler/pages/AssetsAssetDetailPage.js +68 -69
  128. package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
  129. package/dist/assethandler/pages/AssetsAssetListPage.d.ts +1 -2
  130. package/dist/assethandler/pages/AssetsAssetListPage.js +11 -12
  131. package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
  132. package/dist/assethandler/pages/AssetsAssetTrackingPage.d.ts +1 -2
  133. package/dist/assethandler/pages/AssetsAssetTrackingPage.js +4 -5
  134. package/dist/assethandler/pages/AssetsAssetTrackingPage.js.map +1 -1
  135. package/dist/assethandler/pages/CmdbBrowserPage.d.ts +1 -2
  136. package/dist/assethandler/pages/CmdbBrowserPage.js +33 -34
  137. package/dist/assethandler/pages/CmdbBrowserPage.js.map +1 -1
  138. package/dist/assethandler/pages/DashboardPage.d.ts +1 -2
  139. package/dist/assethandler/pages/DashboardPage.js +5 -6
  140. package/dist/assethandler/pages/DashboardPage.js.map +1 -1
  141. package/dist/assethandler/pages/DigitalTwinPage.d.ts +1 -2
  142. package/dist/assethandler/pages/DigitalTwinPage.js +37 -46
  143. package/dist/assethandler/pages/DigitalTwinPage.js.map +1 -1
  144. package/dist/assethandler/pages/DiscoveryJobsPage.d.ts +0 -2
  145. package/dist/assethandler/pages/DiscoveryJobsPage.js +36 -41
  146. package/dist/assethandler/pages/DiscoveryJobsPage.js.map +1 -1
  147. package/dist/assethandler/pages/EsgDashboardPage.d.ts +0 -2
  148. package/dist/assethandler/pages/EsgDashboardPage.js +184 -185
  149. package/dist/assethandler/pages/EsgDashboardPage.js.map +1 -1
  150. package/dist/assethandler/pages/FieldModePage.d.ts +1 -2
  151. package/dist/assethandler/pages/FieldModePage.js +104 -109
  152. package/dist/assethandler/pages/FieldModePage.js.map +1 -1
  153. package/dist/assethandler/pages/FinanceBudgetDetailPage.d.ts +1 -2
  154. package/dist/assethandler/pages/FinanceBudgetDetailPage.js +9 -18
  155. package/dist/assethandler/pages/FinanceBudgetDetailPage.js.map +1 -1
  156. package/dist/assethandler/pages/FinanceFinanceHubPage.d.ts +1 -2
  157. package/dist/assethandler/pages/FinanceFinanceHubPage.js +44 -81
  158. package/dist/assethandler/pages/FinanceFinanceHubPage.js.map +1 -1
  159. package/dist/assethandler/pages/FinanceInvoiceDetailPage.d.ts +1 -2
  160. package/dist/assethandler/pages/FinanceInvoiceDetailPage.js +16 -17
  161. package/dist/assethandler/pages/FinanceInvoiceDetailPage.js.map +1 -1
  162. package/dist/assethandler/pages/ForecastingAlertsPage.d.ts +1 -2
  163. package/dist/assethandler/pages/ForecastingAlertsPage.js +5 -6
  164. package/dist/assethandler/pages/ForecastingAlertsPage.js.map +1 -1
  165. package/dist/assethandler/pages/IotDevicesPage.d.ts +1 -2
  166. package/dist/assethandler/pages/IotDevicesPage.js +188 -193
  167. package/dist/assethandler/pages/IotDevicesPage.js.map +1 -1
  168. package/dist/assethandler/pages/ItilChangeDetailPage.d.ts +1 -2
  169. package/dist/assethandler/pages/ItilChangeDetailPage.js +4 -5
  170. package/dist/assethandler/pages/ItilChangeDetailPage.js.map +1 -1
  171. package/dist/assethandler/pages/ItilChangeManagementPage.d.ts +1 -2
  172. package/dist/assethandler/pages/ItilChangeManagementPage.js +139 -140
  173. package/dist/assethandler/pages/ItilChangeManagementPage.js.map +1 -1
  174. package/dist/assethandler/pages/ItilDialogs.d.ts +3 -4
  175. package/dist/assethandler/pages/ItilDialogs.js +4 -17
  176. package/dist/assethandler/pages/ItilDialogs.js.map +1 -1
  177. package/dist/assethandler/pages/ItilIncidentDetailPage.d.ts +0 -2
  178. package/dist/assethandler/pages/ItilIncidentDetailPage.js +11 -18
  179. package/dist/assethandler/pages/ItilIncidentDetailPage.js.map +1 -1
  180. package/dist/assethandler/pages/ItilIncidentManagementPage.d.ts +1 -2
  181. package/dist/assethandler/pages/ItilIncidentManagementPage.js +25 -26
  182. package/dist/assethandler/pages/ItilIncidentManagementPage.js.map +1 -1
  183. package/dist/assethandler/pages/ItilItilhubPage.d.ts +1 -2
  184. package/dist/assethandler/pages/ItilItilhubPage.js +4 -5
  185. package/dist/assethandler/pages/ItilItilhubPage.js.map +1 -1
  186. package/dist/assethandler/pages/ItilProblemDetailPage.d.ts +1 -2
  187. package/dist/assethandler/pages/ItilProblemDetailPage.js +1 -2
  188. package/dist/assethandler/pages/ItilProblemDetailPage.js.map +1 -1
  189. package/dist/assethandler/pages/ItilProblemManagementPage.d.ts +1 -2
  190. package/dist/assethandler/pages/ItilProblemManagementPage.js +31 -32
  191. package/dist/assethandler/pages/ItilProblemManagementPage.js.map +1 -1
  192. package/dist/assethandler/pages/KnowledgeBasePage.d.ts +1 -2
  193. package/dist/assethandler/pages/KnowledgeBasePage.js +128 -129
  194. package/dist/assethandler/pages/KnowledgeBasePage.js.map +1 -1
  195. package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.d.ts +1 -2
  196. package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js +123 -124
  197. package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js.map +1 -1
  198. package/dist/assethandler/pages/MaintenanceMaintenancePlansPage.d.ts +1 -2
  199. package/dist/assethandler/pages/MaintenanceMaintenancePlansPage.js +117 -128
  200. package/dist/assethandler/pages/MaintenanceMaintenancePlansPage.js.map +1 -1
  201. package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.d.ts +1 -2
  202. package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js +186 -187
  203. package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js.map +1 -1
  204. package/dist/assethandler/pages/OperationsMaintenanceDetailPage.d.ts +1 -2
  205. package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js +5 -6
  206. package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js.map +1 -1
  207. package/dist/assethandler/pages/OperationsOperationsHubPage.d.ts +1 -2
  208. package/dist/assethandler/pages/OperationsOperationsHubPage.js +205 -206
  209. package/dist/assethandler/pages/OperationsOperationsHubPage.js.map +1 -1
  210. package/dist/assethandler/pages/OperationsWorkOrderDetailPage.d.ts +1 -2
  211. package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js +30 -37
  212. package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js.map +1 -1
  213. package/dist/assethandler/pages/PhysicalAuditsPage.d.ts +1 -2
  214. package/dist/assethandler/pages/PhysicalAuditsPage.js +29 -30
  215. package/dist/assethandler/pages/PhysicalAuditsPage.js.map +1 -1
  216. package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.d.ts +1 -2
  217. package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js +4 -5
  218. package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js.map +1 -1
  219. package/dist/assethandler/pages/ProvenancePage.d.ts +0 -2
  220. package/dist/assethandler/pages/ProvenancePage.js +40 -40
  221. package/dist/assethandler/pages/ProvenancePage.js.map +1 -1
  222. package/dist/assethandler/pages/ReportsDashboardPage.d.ts +1 -2
  223. package/dist/assethandler/pages/ReportsDashboardPage.js +66 -67
  224. package/dist/assethandler/pages/ReportsDashboardPage.js.map +1 -1
  225. package/dist/assethandler/pages/SamLicensesPage.d.ts +1 -2
  226. package/dist/assethandler/pages/SamLicensesPage.js +92 -96
  227. package/dist/assethandler/pages/SamLicensesPage.js.map +1 -1
  228. package/dist/assethandler/pages/SecurityComplianceDetailPage.d.ts +1 -2
  229. package/dist/assethandler/pages/SecurityComplianceDetailPage.js +15 -22
  230. package/dist/assethandler/pages/SecurityComplianceDetailPage.js.map +1 -1
  231. package/dist/assethandler/pages/SecurityPolicyDetailPage.d.ts +0 -2
  232. package/dist/assethandler/pages/SecurityPolicyDetailPage.js +14 -21
  233. package/dist/assethandler/pages/SecurityPolicyDetailPage.js.map +1 -1
  234. package/dist/assethandler/pages/SecuritySecurityEventDetailPage.d.ts +1 -2
  235. package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js +1 -2
  236. package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js.map +1 -1
  237. package/dist/assethandler/pages/SecuritySecurityHubPage.d.ts +1 -2
  238. package/dist/assethandler/pages/SecuritySecurityHubPage.js +41 -66
  239. package/dist/assethandler/pages/SecuritySecurityHubPage.js.map +1 -1
  240. package/dist/assethandler/pages/TransactionsTransactionDetailPage.d.ts +1 -2
  241. package/dist/assethandler/pages/TransactionsTransactionDetailPage.js +24 -25
  242. package/dist/assethandler/pages/TransactionsTransactionDetailPage.js.map +1 -1
  243. package/dist/assethandler/pages/TransactionsTransactionListPage.d.ts +1 -2
  244. package/dist/assethandler/pages/TransactionsTransactionListPage.js +4 -5
  245. package/dist/assethandler/pages/TransactionsTransactionListPage.js.map +1 -1
  246. package/dist/assethandler/providers/AssetHandlerProvider.d.ts +0 -2
  247. package/dist/assethandler/providers/AssetHandlerProvider.js +45 -46
  248. package/dist/assethandler/providers/AssetHandlerProvider.js.map +1 -1
  249. package/dist/assethandler/store/assethandlerStore.d.ts +0 -1
  250. package/dist/assethandler/store/assethandlerStore.js +1 -2
  251. package/dist/assethandler/store/assethandlerStore.js.map +1 -1
  252. package/dist/assethandler/types/index.d.ts +0 -2
  253. package/dist/assethandler/utils/categoryPresentation.d.ts +0 -1
  254. package/dist/assethandler/utils/categoryPresentation.js +1 -2
  255. package/dist/assethandler/utils/categoryPresentation.js.map +1 -1
  256. package/dist/assethandler/utils/cn.d.ts +0 -2
  257. package/dist/assethandler/utils/cn.js +2 -3
  258. package/dist/assethandler/utils/cn.js.map +1 -1
  259. package/dist/assethandler/utils/csv.d.ts +0 -1
  260. package/dist/assethandler/utils/csv.js +2 -3
  261. package/dist/assethandler/utils/csv.js.map +1 -1
  262. package/dist/assethandler/utils/fieldAssetCache.d.ts +0 -2
  263. package/dist/assethandler/utils/fieldAssetCache.js +16 -17
  264. package/dist/assethandler/utils/fieldAssetCache.js.map +1 -1
  265. package/dist/assethandler/utils/fieldQueue.d.ts +0 -1
  266. package/dist/assethandler/utils/fieldQueue.js +6 -7
  267. package/dist/assethandler/utils/fieldQueue.js.map +1 -1
  268. package/dist/assethandler/utils/fieldWorkOrders.d.ts +0 -2
  269. package/dist/assethandler/utils/fieldWorkOrders.js +3 -4
  270. package/dist/assethandler/utils/fieldWorkOrders.js.map +1 -1
  271. package/dist/assethandler/utils/i18n.d.ts +0 -2
  272. package/dist/assethandler/utils/i18n.js +1 -2
  273. package/dist/assethandler/utils/i18n.js.map +1 -1
  274. package/dist/assethandler/utils/knowledgeBase.d.ts +0 -2
  275. package/dist/assethandler/utils/knowledgeBase.js +1 -2
  276. package/dist/assethandler/utils/knowledgeBase.js.map +1 -1
  277. package/dist/assethandler/utils/meter.d.ts +0 -1
  278. package/dist/assethandler/utils/meter.js +2 -3
  279. package/dist/assethandler/utils/meter.js.map +1 -1
  280. package/dist/assethandler/utils/money.d.ts +0 -1
  281. package/dist/assethandler/utils/money.js +0 -1
  282. package/dist/assethandler/utils/money.js.map +1 -1
  283. package/dist/assethandler/utils/navigation.d.ts +0 -1
  284. package/dist/assethandler/utils/navigation.js +1 -2
  285. package/dist/assethandler/utils/navigation.js.map +1 -1
  286. package/dist/assethandler/utils/printAssetTag.d.ts +0 -1
  287. package/dist/assethandler/utils/printAssetTag.js +1 -2
  288. package/dist/assethandler/utils/printAssetTag.js.map +1 -1
  289. package/dist/assethandler/utils/tco.d.ts +0 -1
  290. package/dist/assethandler/utils/tco.js +1 -2
  291. package/dist/assethandler/utils/tco.js.map +1 -1
  292. package/dist/assethandler/utils/toast.d.ts +0 -1
  293. package/dist/assethandler/utils/toast.js +1 -2
  294. package/dist/assethandler/utils/toast.js.map +1 -1
  295. package/dist/assethandler/utils/utilization.d.ts +0 -1
  296. package/dist/assethandler/utils/utilization.js +1 -2
  297. package/dist/assethandler/utils/utilization.js.map +1 -1
  298. package/dist/config/assistantUsecases.d.ts +0 -1
  299. package/dist/dev/main.d.ts +0 -2
  300. package/dist/generated/wspace-operations.d.ts +189 -94
  301. package/dist/generated/wspace-types.d.ts +4 -24
  302. package/dist/index.d.ts +0 -1
  303. package/dist/node_modules/clsx/dist/clsx.js +8 -7
  304. package/dist/node_modules/clsx/dist/clsx.js.map +1 -1
  305. package/dist/node_modules/d3-array/dist/d3-array.js +204 -0
  306. package/dist/node_modules/d3-array/dist/d3-array.js.map +1 -0
  307. package/dist/node_modules/d3-color/dist/d3-color.js +388 -0
  308. package/dist/node_modules/d3-color/dist/d3-color.js.map +1 -0
  309. package/dist/node_modules/d3-format/dist/d3-format.js +186 -0
  310. package/dist/node_modules/d3-format/dist/d3-format.js.map +1 -0
  311. package/dist/node_modules/d3-interpolate/dist/d3-interpolate.js +185 -0
  312. package/dist/node_modules/d3-interpolate/dist/d3-interpolate.js.map +1 -0
  313. package/dist/node_modules/d3-path/{src/path.js → dist/d3-path.js} +39 -14
  314. package/dist/node_modules/d3-path/dist/d3-path.js.map +1 -0
  315. package/dist/node_modules/d3-scale/dist/d3-scale.js +622 -0
  316. package/dist/node_modules/d3-scale/dist/d3-scale.js.map +1 -0
  317. package/dist/node_modules/d3-shape/dist/d3-shape.js +901 -0
  318. package/dist/node_modules/d3-shape/dist/d3-shape.js.map +1 -0
  319. package/dist/node_modules/d3-time/dist/d3-time.js +241 -0
  320. package/dist/node_modules/d3-time/dist/d3-time.js.map +1 -0
  321. package/dist/node_modules/d3-time-format/{src/locale.js → dist/d3-time-format.js} +229 -174
  322. package/dist/node_modules/d3-time-format/dist/d3-time-format.js.map +1 -0
  323. package/dist/node_modules/decimal.js-light/decimal.js +33 -30
  324. package/dist/node_modules/decimal.js-light/decimal.js.map +1 -1
  325. package/dist/node_modules/dijkstrajs/dijkstra.js +1 -2
  326. package/dist/node_modules/dijkstrajs/dijkstra.js.map +1 -1
  327. package/dist/node_modules/eventemitter3/index.js +2 -3
  328. package/dist/node_modules/eventemitter3/index.js.map +1 -1
  329. package/dist/node_modules/fast-equals/dist/es/index.js +5 -6
  330. package/dist/node_modules/fast-equals/dist/es/index.js.map +1 -1
  331. package/dist/node_modules/jsqr/dist/jsQR.js +6 -9
  332. package/dist/node_modules/jsqr/dist/jsQR.js.map +1 -1
  333. package/dist/node_modules/lodash/_DataView.js +4 -5
  334. package/dist/node_modules/lodash/_DataView.js.map +1 -1
  335. package/dist/node_modules/lodash/_Hash.js +1 -2
  336. package/dist/node_modules/lodash/_Hash.js.map +1 -1
  337. package/dist/node_modules/lodash/_ListCache.js +1 -2
  338. package/dist/node_modules/lodash/_ListCache.js.map +1 -1
  339. package/dist/node_modules/lodash/_Map.js +4 -5
  340. package/dist/node_modules/lodash/_Map.js.map +1 -1
  341. package/dist/node_modules/lodash/_MapCache.js +1 -2
  342. package/dist/node_modules/lodash/_MapCache.js.map +1 -1
  343. package/dist/node_modules/lodash/_Promise.js +4 -5
  344. package/dist/node_modules/lodash/_Promise.js.map +1 -1
  345. package/dist/node_modules/lodash/_Set.js +4 -5
  346. package/dist/node_modules/lodash/_Set.js.map +1 -1
  347. package/dist/node_modules/lodash/_SetCache.js +1 -2
  348. package/dist/node_modules/lodash/_SetCache.js.map +1 -1
  349. package/dist/node_modules/lodash/_Stack.js +1 -2
  350. package/dist/node_modules/lodash/_Stack.js.map +1 -1
  351. package/dist/node_modules/lodash/_Symbol.js +1 -2
  352. package/dist/node_modules/lodash/_Symbol.js.map +1 -1
  353. package/dist/node_modules/lodash/_Uint8Array.js +1 -2
  354. package/dist/node_modules/lodash/_Uint8Array.js.map +1 -1
  355. package/dist/node_modules/lodash/_WeakMap.js +4 -5
  356. package/dist/node_modules/lodash/_WeakMap.js.map +1 -1
  357. package/dist/node_modules/lodash/_apply.js +1 -2
  358. package/dist/node_modules/lodash/_apply.js.map +1 -1
  359. package/dist/node_modules/lodash/_arrayEvery.js +1 -2
  360. package/dist/node_modules/lodash/_arrayEvery.js.map +1 -1
  361. package/dist/node_modules/lodash/_arrayFilter.js +1 -2
  362. package/dist/node_modules/lodash/_arrayFilter.js.map +1 -1
  363. package/dist/node_modules/lodash/_arrayIncludes.js +1 -2
  364. package/dist/node_modules/lodash/_arrayIncludes.js.map +1 -1
  365. package/dist/node_modules/lodash/_arrayIncludesWith.js +1 -2
  366. package/dist/node_modules/lodash/_arrayIncludesWith.js.map +1 -1
  367. package/dist/node_modules/lodash/_arrayLikeKeys.js +5 -6
  368. package/dist/node_modules/lodash/_arrayLikeKeys.js.map +1 -1
  369. package/dist/node_modules/lodash/_arrayMap.js +1 -2
  370. package/dist/node_modules/lodash/_arrayMap.js.map +1 -1
  371. package/dist/node_modules/lodash/_arrayPush.js +1 -2
  372. package/dist/node_modules/lodash/_arrayPush.js.map +1 -1
  373. package/dist/node_modules/lodash/_arraySome.js +1 -2
  374. package/dist/node_modules/lodash/_arraySome.js.map +1 -1
  375. package/dist/node_modules/lodash/_asciiToArray.js +1 -2
  376. package/dist/node_modules/lodash/_asciiToArray.js.map +1 -1
  377. package/dist/node_modules/lodash/_assocIndexOf.js +1 -2
  378. package/dist/node_modules/lodash/_assocIndexOf.js.map +1 -1
  379. package/dist/node_modules/lodash/_baseAssignValue.js +1 -2
  380. package/dist/node_modules/lodash/_baseAssignValue.js.map +1 -1
  381. package/dist/node_modules/lodash/_baseEach.js +1 -2
  382. package/dist/node_modules/lodash/_baseEach.js.map +1 -1
  383. package/dist/node_modules/lodash/_baseEvery.js +1 -2
  384. package/dist/node_modules/lodash/_baseEvery.js.map +1 -1
  385. package/dist/node_modules/lodash/_baseExtremum.js +1 -2
  386. package/dist/node_modules/lodash/_baseExtremum.js.map +1 -1
  387. package/dist/node_modules/lodash/_baseFindIndex.js +1 -2
  388. package/dist/node_modules/lodash/_baseFindIndex.js.map +1 -1
  389. package/dist/node_modules/lodash/_baseFlatten.js +1 -2
  390. package/dist/node_modules/lodash/_baseFlatten.js.map +1 -1
  391. package/dist/node_modules/lodash/_baseFor.js +1 -2
  392. package/dist/node_modules/lodash/_baseFor.js.map +1 -1
  393. package/dist/node_modules/lodash/_baseForOwn.js +4 -5
  394. package/dist/node_modules/lodash/_baseForOwn.js.map +1 -1
  395. package/dist/node_modules/lodash/_baseGet.js +1 -2
  396. package/dist/node_modules/lodash/_baseGet.js.map +1 -1
  397. package/dist/node_modules/lodash/_baseGetAllKeys.js +4 -5
  398. package/dist/node_modules/lodash/_baseGetAllKeys.js.map +1 -1
  399. package/dist/node_modules/lodash/_baseGetTag.js +1 -2
  400. package/dist/node_modules/lodash/_baseGetTag.js.map +1 -1
  401. package/dist/node_modules/lodash/_baseGt.js +1 -2
  402. package/dist/node_modules/lodash/_baseGt.js.map +1 -1
  403. package/dist/node_modules/lodash/_baseHasIn.js +1 -2
  404. package/dist/node_modules/lodash/_baseHasIn.js.map +1 -1
  405. package/dist/node_modules/lodash/_baseIndexOf.js +1 -2
  406. package/dist/node_modules/lodash/_baseIndexOf.js.map +1 -1
  407. package/dist/node_modules/lodash/_baseIsArguments.js +1 -2
  408. package/dist/node_modules/lodash/_baseIsArguments.js.map +1 -1
  409. package/dist/node_modules/lodash/_baseIsEqual.js +4 -5
  410. package/dist/node_modules/lodash/_baseIsEqual.js.map +1 -1
  411. package/dist/node_modules/lodash/_baseIsEqualDeep.js +10 -11
  412. package/dist/node_modules/lodash/_baseIsEqualDeep.js.map +1 -1
  413. package/dist/node_modules/lodash/_baseIsMatch.js +1 -2
  414. package/dist/node_modules/lodash/_baseIsMatch.js.map +1 -1
  415. package/dist/node_modules/lodash/_baseIsNaN.js +1 -2
  416. package/dist/node_modules/lodash/_baseIsNaN.js.map +1 -1
  417. package/dist/node_modules/lodash/_baseIsNative.js +5 -6
  418. package/dist/node_modules/lodash/_baseIsNative.js.map +1 -1
  419. package/dist/node_modules/lodash/_baseIsTypedArray.js +4 -5
  420. package/dist/node_modules/lodash/_baseIsTypedArray.js.map +1 -1
  421. package/dist/node_modules/lodash/_baseIteratee.js +6 -7
  422. package/dist/node_modules/lodash/_baseIteratee.js.map +1 -1
  423. package/dist/node_modules/lodash/_baseKeys.js +1 -2
  424. package/dist/node_modules/lodash/_baseKeys.js.map +1 -1
  425. package/dist/node_modules/lodash/_baseLt.js +1 -2
  426. package/dist/node_modules/lodash/_baseLt.js.map +1 -1
  427. package/dist/node_modules/lodash/_baseMap.js +4 -5
  428. package/dist/node_modules/lodash/_baseMap.js.map +1 -1
  429. package/dist/node_modules/lodash/_baseMatches.js +1 -2
  430. package/dist/node_modules/lodash/_baseMatches.js.map +1 -1
  431. package/dist/node_modules/lodash/_baseMatchesProperty.js +7 -8
  432. package/dist/node_modules/lodash/_baseMatchesProperty.js.map +1 -1
  433. package/dist/node_modules/lodash/_baseOrderBy.js +11 -12
  434. package/dist/node_modules/lodash/_baseOrderBy.js.map +1 -1
  435. package/dist/node_modules/lodash/_baseProperty.js +1 -2
  436. package/dist/node_modules/lodash/_baseProperty.js.map +1 -1
  437. package/dist/node_modules/lodash/_basePropertyDeep.js +1 -2
  438. package/dist/node_modules/lodash/_basePropertyDeep.js.map +1 -1
  439. package/dist/node_modules/lodash/_baseRange.js +1 -2
  440. package/dist/node_modules/lodash/_baseRange.js.map +1 -1
  441. package/dist/node_modules/lodash/_baseRest.js +1 -2
  442. package/dist/node_modules/lodash/_baseRest.js.map +1 -1
  443. package/dist/node_modules/lodash/_baseSetToString.js +5 -6
  444. package/dist/node_modules/lodash/_baseSetToString.js.map +1 -1
  445. package/dist/node_modules/lodash/_baseSlice.js +1 -2
  446. package/dist/node_modules/lodash/_baseSlice.js.map +1 -1
  447. package/dist/node_modules/lodash/_baseSome.js +1 -2
  448. package/dist/node_modules/lodash/_baseSome.js.map +1 -1
  449. package/dist/node_modules/lodash/_baseSortBy.js +1 -2
  450. package/dist/node_modules/lodash/_baseSortBy.js.map +1 -1
  451. package/dist/node_modules/lodash/_baseTimes.js +1 -2
  452. package/dist/node_modules/lodash/_baseTimes.js.map +1 -1
  453. package/dist/node_modules/lodash/_baseToString.js +6 -7
  454. package/dist/node_modules/lodash/_baseToString.js.map +1 -1
  455. package/dist/node_modules/lodash/_baseTrim.js +1 -2
  456. package/dist/node_modules/lodash/_baseTrim.js.map +1 -1
  457. package/dist/node_modules/lodash/_baseUnary.js +1 -2
  458. package/dist/node_modules/lodash/_baseUnary.js.map +1 -1
  459. package/dist/node_modules/lodash/_baseUniq.js +7 -8
  460. package/dist/node_modules/lodash/_baseUniq.js.map +1 -1
  461. package/dist/node_modules/lodash/_cacheHas.js +1 -2
  462. package/dist/node_modules/lodash/_cacheHas.js.map +1 -1
  463. package/dist/node_modules/lodash/_castPath.js +1 -2
  464. package/dist/node_modules/lodash/_castPath.js.map +1 -1
  465. package/dist/node_modules/lodash/_castSlice.js +1 -2
  466. package/dist/node_modules/lodash/_castSlice.js.map +1 -1
  467. package/dist/node_modules/lodash/_compareAscending.js +1 -2
  468. package/dist/node_modules/lodash/_compareAscending.js.map +1 -1
  469. package/dist/node_modules/lodash/_compareMultiple.js +1 -2
  470. package/dist/node_modules/lodash/_compareMultiple.js.map +1 -1
  471. package/dist/node_modules/lodash/_coreJsData.js +1 -2
  472. package/dist/node_modules/lodash/_coreJsData.js.map +1 -1
  473. package/dist/node_modules/lodash/_createBaseEach.js +1 -2
  474. package/dist/node_modules/lodash/_createBaseEach.js.map +1 -1
  475. package/dist/node_modules/lodash/_createBaseFor.js +1 -2
  476. package/dist/node_modules/lodash/_createBaseFor.js.map +1 -1
  477. package/dist/node_modules/lodash/_createCaseFirst.js +6 -7
  478. package/dist/node_modules/lodash/_createCaseFirst.js.map +1 -1
  479. package/dist/node_modules/lodash/_createFind.js +5 -6
  480. package/dist/node_modules/lodash/_createFind.js.map +1 -1
  481. package/dist/node_modules/lodash/_createRange.js +4 -5
  482. package/dist/node_modules/lodash/_createRange.js.map +1 -1
  483. package/dist/node_modules/lodash/_createSet.js +6 -7
  484. package/dist/node_modules/lodash/_createSet.js.map +1 -1
  485. package/dist/node_modules/lodash/_defineProperty.js +1 -2
  486. package/dist/node_modules/lodash/_defineProperty.js.map +1 -1
  487. package/dist/node_modules/lodash/_equalArrays.js +1 -2
  488. package/dist/node_modules/lodash/_equalArrays.js.map +1 -1
  489. package/dist/node_modules/lodash/_equalByTag.js +5 -6
  490. package/dist/node_modules/lodash/_equalByTag.js.map +1 -1
  491. package/dist/node_modules/lodash/_equalObjects.js +1 -2
  492. package/dist/node_modules/lodash/_equalObjects.js.map +1 -1
  493. package/dist/node_modules/lodash/_freeGlobal.js +1 -2
  494. package/dist/node_modules/lodash/_freeGlobal.js.map +1 -1
  495. package/dist/node_modules/lodash/_getAllKeys.js +1 -2
  496. package/dist/node_modules/lodash/_getAllKeys.js.map +1 -1
  497. package/dist/node_modules/lodash/_getMapData.js +1 -2
  498. package/dist/node_modules/lodash/_getMapData.js.map +1 -1
  499. package/dist/node_modules/lodash/_getMatchData.js +4 -5
  500. package/dist/node_modules/lodash/_getMatchData.js.map +1 -1
  501. package/dist/node_modules/lodash/_getNative.js +1 -2
  502. package/dist/node_modules/lodash/_getNative.js.map +1 -1
  503. package/dist/node_modules/lodash/_getPrototype.js +1 -2
  504. package/dist/node_modules/lodash/_getPrototype.js.map +1 -1
  505. package/dist/node_modules/lodash/_getRawTag.js +1 -2
  506. package/dist/node_modules/lodash/_getRawTag.js.map +1 -1
  507. package/dist/node_modules/lodash/_getSymbols.js +1 -2
  508. package/dist/node_modules/lodash/_getSymbols.js.map +1 -1
  509. package/dist/node_modules/lodash/_getTag.js +9 -10
  510. package/dist/node_modules/lodash/_getTag.js.map +1 -1
  511. package/dist/node_modules/lodash/_getValue.js +1 -2
  512. package/dist/node_modules/lodash/_getValue.js.map +1 -1
  513. package/dist/node_modules/lodash/_hasPath.js +8 -9
  514. package/dist/node_modules/lodash/_hasPath.js.map +1 -1
  515. package/dist/node_modules/lodash/_hasUnicode.js +1 -2
  516. package/dist/node_modules/lodash/_hasUnicode.js.map +1 -1
  517. package/dist/node_modules/lodash/_hashClear.js +1 -2
  518. package/dist/node_modules/lodash/_hashClear.js.map +1 -1
  519. package/dist/node_modules/lodash/_hashDelete.js +1 -2
  520. package/dist/node_modules/lodash/_hashDelete.js.map +1 -1
  521. package/dist/node_modules/lodash/_hashGet.js +1 -2
  522. package/dist/node_modules/lodash/_hashGet.js.map +1 -1
  523. package/dist/node_modules/lodash/_hashHas.js +1 -2
  524. package/dist/node_modules/lodash/_hashHas.js.map +1 -1
  525. package/dist/node_modules/lodash/_hashSet.js +1 -2
  526. package/dist/node_modules/lodash/_hashSet.js.map +1 -1
  527. package/dist/node_modules/lodash/_isFlattenable.js +5 -6
  528. package/dist/node_modules/lodash/_isFlattenable.js.map +1 -1
  529. package/dist/node_modules/lodash/_isIndex.js +6 -7
  530. package/dist/node_modules/lodash/_isIndex.js.map +1 -1
  531. package/dist/node_modules/lodash/_isIterateeCall.js +5 -6
  532. package/dist/node_modules/lodash/_isIterateeCall.js.map +1 -1
  533. package/dist/node_modules/lodash/_isKey.js +1 -2
  534. package/dist/node_modules/lodash/_isKey.js.map +1 -1
  535. package/dist/node_modules/lodash/_isKeyable.js +1 -2
  536. package/dist/node_modules/lodash/_isKeyable.js.map +1 -1
  537. package/dist/node_modules/lodash/_isMasked.js +1 -2
  538. package/dist/node_modules/lodash/_isMasked.js.map +1 -1
  539. package/dist/node_modules/lodash/_isPrototype.js +1 -2
  540. package/dist/node_modules/lodash/_isPrototype.js.map +1 -1
  541. package/dist/node_modules/lodash/_isStrictComparable.js +1 -2
  542. package/dist/node_modules/lodash/_isStrictComparable.js.map +1 -1
  543. package/dist/node_modules/lodash/_listCacheClear.js +1 -2
  544. package/dist/node_modules/lodash/_listCacheClear.js.map +1 -1
  545. package/dist/node_modules/lodash/_listCacheDelete.js +1 -2
  546. package/dist/node_modules/lodash/_listCacheDelete.js.map +1 -1
  547. package/dist/node_modules/lodash/_listCacheGet.js +1 -2
  548. package/dist/node_modules/lodash/_listCacheGet.js.map +1 -1
  549. package/dist/node_modules/lodash/_listCacheHas.js +1 -2
  550. package/dist/node_modules/lodash/_listCacheHas.js.map +1 -1
  551. package/dist/node_modules/lodash/_listCacheSet.js +1 -2
  552. package/dist/node_modules/lodash/_listCacheSet.js.map +1 -1
  553. package/dist/node_modules/lodash/_mapCacheClear.js +1 -2
  554. package/dist/node_modules/lodash/_mapCacheClear.js.map +1 -1
  555. package/dist/node_modules/lodash/_mapCacheDelete.js +1 -2
  556. package/dist/node_modules/lodash/_mapCacheDelete.js.map +1 -1
  557. package/dist/node_modules/lodash/_mapCacheGet.js +1 -2
  558. package/dist/node_modules/lodash/_mapCacheGet.js.map +1 -1
  559. package/dist/node_modules/lodash/_mapCacheHas.js +1 -2
  560. package/dist/node_modules/lodash/_mapCacheHas.js.map +1 -1
  561. package/dist/node_modules/lodash/_mapCacheSet.js +1 -2
  562. package/dist/node_modules/lodash/_mapCacheSet.js.map +1 -1
  563. package/dist/node_modules/lodash/_mapToArray.js +1 -2
  564. package/dist/node_modules/lodash/_mapToArray.js.map +1 -1
  565. package/dist/node_modules/lodash/_matchesStrictComparable.js +2 -3
  566. package/dist/node_modules/lodash/_matchesStrictComparable.js.map +1 -1
  567. package/dist/node_modules/lodash/_memoizeCapped.js +1 -2
  568. package/dist/node_modules/lodash/_memoizeCapped.js.map +1 -1
  569. package/dist/node_modules/lodash/_nativeCreate.js +1 -2
  570. package/dist/node_modules/lodash/_nativeCreate.js.map +1 -1
  571. package/dist/node_modules/lodash/_nativeKeys.js +1 -2
  572. package/dist/node_modules/lodash/_nativeKeys.js.map +1 -1
  573. package/dist/node_modules/lodash/_nodeUtil.js +1 -2
  574. package/dist/node_modules/lodash/_nodeUtil.js.map +1 -1
  575. package/dist/node_modules/lodash/_objectToString.js +1 -2
  576. package/dist/node_modules/lodash/_objectToString.js.map +1 -1
  577. package/dist/node_modules/lodash/_overArg.js +1 -2
  578. package/dist/node_modules/lodash/_overArg.js.map +1 -1
  579. package/dist/node_modules/lodash/_overRest.js +1 -2
  580. package/dist/node_modules/lodash/_overRest.js.map +1 -1
  581. package/dist/node_modules/lodash/_root.js +1 -2
  582. package/dist/node_modules/lodash/_root.js.map +1 -1
  583. package/dist/node_modules/lodash/_setCacheAdd.js +4 -6
  584. package/dist/node_modules/lodash/_setCacheAdd.js.map +1 -1
  585. package/dist/node_modules/lodash/_setCacheHas.js +1 -2
  586. package/dist/node_modules/lodash/_setCacheHas.js.map +1 -1
  587. package/dist/node_modules/lodash/_setToArray.js +1 -2
  588. package/dist/node_modules/lodash/_setToArray.js.map +1 -1
  589. package/dist/node_modules/lodash/_setToString.js +1 -2
  590. package/dist/node_modules/lodash/_setToString.js.map +1 -1
  591. package/dist/node_modules/lodash/_shortOut.js +8 -9
  592. package/dist/node_modules/lodash/_shortOut.js.map +1 -1
  593. package/dist/node_modules/lodash/_stackClear.js +1 -2
  594. package/dist/node_modules/lodash/_stackClear.js.map +1 -1
  595. package/dist/node_modules/lodash/_stackDelete.js +1 -2
  596. package/dist/node_modules/lodash/_stackDelete.js.map +1 -1
  597. package/dist/node_modules/lodash/_stackGet.js +1 -2
  598. package/dist/node_modules/lodash/_stackGet.js.map +1 -1
  599. package/dist/node_modules/lodash/_stackHas.js +1 -2
  600. package/dist/node_modules/lodash/_stackHas.js.map +1 -1
  601. package/dist/node_modules/lodash/_stackSet.js +1 -2
  602. package/dist/node_modules/lodash/_stackSet.js.map +1 -1
  603. package/dist/node_modules/lodash/_strictIndexOf.js +1 -2
  604. package/dist/node_modules/lodash/_strictIndexOf.js.map +1 -1
  605. package/dist/node_modules/lodash/_stringToArray.js +4 -5
  606. package/dist/node_modules/lodash/_stringToArray.js.map +1 -1
  607. package/dist/node_modules/lodash/_stringToPath.js +1 -2
  608. package/dist/node_modules/lodash/_stringToPath.js.map +1 -1
  609. package/dist/node_modules/lodash/_toKey.js +2 -3
  610. package/dist/node_modules/lodash/_toKey.js.map +1 -1
  611. package/dist/node_modules/lodash/_toSource.js +1 -2
  612. package/dist/node_modules/lodash/_toSource.js.map +1 -1
  613. package/dist/node_modules/lodash/_trimmedEndIndex.js +1 -2
  614. package/dist/node_modules/lodash/_trimmedEndIndex.js.map +1 -1
  615. package/dist/node_modules/lodash/_unicodeToArray.js +1 -2
  616. package/dist/node_modules/lodash/_unicodeToArray.js.map +1 -1
  617. package/dist/node_modules/lodash/constant.js +1 -2
  618. package/dist/node_modules/lodash/constant.js.map +1 -1
  619. package/dist/node_modules/lodash/debounce.js +1 -2
  620. package/dist/node_modules/lodash/debounce.js.map +1 -1
  621. package/dist/node_modules/lodash/eq.js +1 -2
  622. package/dist/node_modules/lodash/eq.js.map +1 -1
  623. package/dist/node_modules/lodash/every.js +7 -8
  624. package/dist/node_modules/lodash/every.js.map +1 -1
  625. package/dist/node_modules/lodash/find.js +1 -2
  626. package/dist/node_modules/lodash/find.js.map +1 -1
  627. package/dist/node_modules/lodash/findIndex.js +4 -5
  628. package/dist/node_modules/lodash/findIndex.js.map +1 -1
  629. package/dist/node_modules/lodash/flatMap.js +1 -2
  630. package/dist/node_modules/lodash/flatMap.js.map +1 -1
  631. package/dist/node_modules/lodash/get.js +1 -2
  632. package/dist/node_modules/lodash/get.js.map +1 -1
  633. package/dist/node_modules/lodash/hasIn.js +1 -2
  634. package/dist/node_modules/lodash/hasIn.js.map +1 -1
  635. package/dist/node_modules/lodash/identity.js +1 -2
  636. package/dist/node_modules/lodash/identity.js.map +1 -1
  637. package/dist/node_modules/lodash/isArguments.js +4 -5
  638. package/dist/node_modules/lodash/isArguments.js.map +1 -1
  639. package/dist/node_modules/lodash/isArray.js +1 -2
  640. package/dist/node_modules/lodash/isArray.js.map +1 -1
  641. package/dist/node_modules/lodash/isArrayLike.js +1 -2
  642. package/dist/node_modules/lodash/isArrayLike.js.map +1 -1
  643. package/dist/node_modules/lodash/isBoolean.js +1 -2
  644. package/dist/node_modules/lodash/isBoolean.js.map +1 -1
  645. package/dist/node_modules/lodash/isBuffer.js +1 -2
  646. package/dist/node_modules/lodash/isBuffer.js.map +1 -1
  647. package/dist/node_modules/lodash/isEqual.js +1 -2
  648. package/dist/node_modules/lodash/isEqual.js.map +1 -1
  649. package/dist/node_modules/lodash/isFunction.js +1 -2
  650. package/dist/node_modules/lodash/isFunction.js.map +1 -1
  651. package/dist/node_modules/lodash/isLength.js +4 -6
  652. package/dist/node_modules/lodash/isLength.js.map +1 -1
  653. package/dist/node_modules/lodash/isNaN.js +1 -2
  654. package/dist/node_modules/lodash/isNaN.js.map +1 -1
  655. package/dist/node_modules/lodash/isNil.js +1 -2
  656. package/dist/node_modules/lodash/isNil.js.map +1 -1
  657. package/dist/node_modules/lodash/isNumber.js +1 -2
  658. package/dist/node_modules/lodash/isNumber.js.map +1 -1
  659. package/dist/node_modules/lodash/isObject.js +1 -2
  660. package/dist/node_modules/lodash/isObject.js.map +1 -1
  661. package/dist/node_modules/lodash/isObjectLike.js +1 -2
  662. package/dist/node_modules/lodash/isObjectLike.js.map +1 -1
  663. package/dist/node_modules/lodash/isPlainObject.js +4 -5
  664. package/dist/node_modules/lodash/isPlainObject.js.map +1 -1
  665. package/dist/node_modules/lodash/isString.js +4 -5
  666. package/dist/node_modules/lodash/isString.js.map +1 -1
  667. package/dist/node_modules/lodash/isSymbol.js +1 -2
  668. package/dist/node_modules/lodash/isSymbol.js.map +1 -1
  669. package/dist/node_modules/lodash/isTypedArray.js +1 -2
  670. package/dist/node_modules/lodash/isTypedArray.js.map +1 -1
  671. package/dist/node_modules/lodash/keys.js +1 -2
  672. package/dist/node_modules/lodash/keys.js.map +1 -1
  673. package/dist/node_modules/lodash/last.js +1 -2
  674. package/dist/node_modules/lodash/last.js.map +1 -1
  675. package/dist/node_modules/lodash/map.js +6 -7
  676. package/dist/node_modules/lodash/map.js.map +1 -1
  677. package/dist/node_modules/lodash/mapValues.js +4 -5
  678. package/dist/node_modules/lodash/mapValues.js.map +1 -1
  679. package/dist/node_modules/lodash/max.js +5 -6
  680. package/dist/node_modules/lodash/max.js.map +1 -1
  681. package/dist/node_modules/lodash/maxBy.js +5 -6
  682. package/dist/node_modules/lodash/maxBy.js.map +1 -1
  683. package/dist/node_modules/lodash/memoize.js +1 -2
  684. package/dist/node_modules/lodash/memoize.js.map +1 -1
  685. package/dist/node_modules/lodash/min.js +5 -6
  686. package/dist/node_modules/lodash/min.js.map +1 -1
  687. package/dist/node_modules/lodash/minBy.js +4 -5
  688. package/dist/node_modules/lodash/minBy.js.map +1 -1
  689. package/dist/node_modules/lodash/noop.js +1 -2
  690. package/dist/node_modules/lodash/noop.js.map +1 -1
  691. package/dist/node_modules/lodash/now.js +1 -2
  692. package/dist/node_modules/lodash/now.js.map +1 -1
  693. package/dist/node_modules/lodash/property.js +6 -7
  694. package/dist/node_modules/lodash/property.js.map +1 -1
  695. package/dist/node_modules/lodash/range.js +1 -2
  696. package/dist/node_modules/lodash/range.js.map +1 -1
  697. package/dist/node_modules/lodash/some.js +7 -8
  698. package/dist/node_modules/lodash/some.js.map +1 -1
  699. package/dist/node_modules/lodash/sortBy.js +1 -2
  700. package/dist/node_modules/lodash/sortBy.js.map +1 -1
  701. package/dist/node_modules/lodash/stubArray.js +1 -2
  702. package/dist/node_modules/lodash/stubArray.js.map +1 -1
  703. package/dist/node_modules/lodash/stubFalse.js +1 -2
  704. package/dist/node_modules/lodash/stubFalse.js.map +1 -1
  705. package/dist/node_modules/lodash/throttle.js +4 -5
  706. package/dist/node_modules/lodash/throttle.js.map +1 -1
  707. package/dist/node_modules/lodash/toFinite.js +2 -3
  708. package/dist/node_modules/lodash/toFinite.js.map +1 -1
  709. package/dist/node_modules/lodash/toInteger.js +1 -2
  710. package/dist/node_modules/lodash/toInteger.js.map +1 -1
  711. package/dist/node_modules/lodash/toNumber.js +4 -5
  712. package/dist/node_modules/lodash/toNumber.js.map +1 -1
  713. package/dist/node_modules/lodash/toString.js +1 -2
  714. package/dist/node_modules/lodash/toString.js.map +1 -1
  715. package/dist/node_modules/lodash/uniqBy.js +1 -2
  716. package/dist/node_modules/lodash/uniqBy.js.map +1 -1
  717. package/dist/node_modules/lodash/upperFirst.js +1 -2
  718. package/dist/node_modules/lodash/upperFirst.js.map +1 -1
  719. package/dist/node_modules/object-assign/index.js +1 -2
  720. package/dist/node_modules/object-assign/index.js.map +1 -1
  721. package/dist/node_modules/prop-types/checkPropTypes.js +1 -2
  722. package/dist/node_modules/prop-types/checkPropTypes.js.map +1 -1
  723. package/dist/node_modules/prop-types/factoryWithThrowingShims.js +1 -2
  724. package/dist/node_modules/prop-types/factoryWithThrowingShims.js.map +1 -1
  725. package/dist/node_modules/prop-types/factoryWithTypeCheckers.js +3 -3
  726. package/dist/node_modules/prop-types/factoryWithTypeCheckers.js.map +1 -1
  727. package/dist/node_modules/prop-types/index.js +1 -2
  728. package/dist/node_modules/prop-types/index.js.map +1 -1
  729. package/dist/node_modules/prop-types/lib/ReactPropTypesSecret.js +1 -2
  730. package/dist/node_modules/prop-types/lib/ReactPropTypesSecret.js.map +1 -1
  731. package/dist/node_modules/prop-types/lib/has.js +1 -2
  732. package/dist/node_modules/prop-types/lib/has.js.map +1 -1
  733. package/dist/node_modules/prop-types/node_modules/react-is/cjs/react-is.development.js +1 -2
  734. package/dist/node_modules/prop-types/node_modules/react-is/cjs/react-is.development.js.map +1 -1
  735. package/dist/node_modules/prop-types/node_modules/react-is/cjs/react-is.production.min.js +1 -2
  736. package/dist/node_modules/prop-types/node_modules/react-is/cjs/react-is.production.min.js.map +1 -1
  737. package/dist/node_modules/prop-types/node_modules/react-is/index.js +2 -3
  738. package/dist/node_modules/prop-types/node_modules/react-is/index.js.map +1 -1
  739. package/dist/node_modules/qrcode/lib/browser.js +1 -2
  740. package/dist/node_modules/qrcode/lib/browser.js.map +1 -1
  741. package/dist/node_modules/qrcode/lib/can-promise.js +1 -2
  742. package/dist/node_modules/qrcode/lib/can-promise.js.map +1 -1
  743. package/dist/node_modules/qrcode/lib/core/alignment-pattern.js +1 -2
  744. package/dist/node_modules/qrcode/lib/core/alignment-pattern.js.map +1 -1
  745. package/dist/node_modules/qrcode/lib/core/alphanumeric-data.js +3 -4
  746. package/dist/node_modules/qrcode/lib/core/alphanumeric-data.js.map +1 -1
  747. package/dist/node_modules/qrcode/lib/core/bit-buffer.js +1 -2
  748. package/dist/node_modules/qrcode/lib/core/bit-buffer.js.map +1 -1
  749. package/dist/node_modules/qrcode/lib/core/bit-matrix.js +1 -2
  750. package/dist/node_modules/qrcode/lib/core/bit-matrix.js.map +1 -1
  751. package/dist/node_modules/qrcode/lib/core/byte-data.js +2 -3
  752. package/dist/node_modules/qrcode/lib/core/byte-data.js.map +1 -1
  753. package/dist/node_modules/qrcode/lib/core/error-correction-code.js +1 -2
  754. package/dist/node_modules/qrcode/lib/core/error-correction-code.js.map +1 -1
  755. package/dist/node_modules/qrcode/lib/core/error-correction-level.js +1 -2
  756. package/dist/node_modules/qrcode/lib/core/error-correction-level.js.map +1 -1
  757. package/dist/node_modules/qrcode/lib/core/finder-pattern.js +1 -2
  758. package/dist/node_modules/qrcode/lib/core/finder-pattern.js.map +1 -1
  759. package/dist/node_modules/qrcode/lib/core/format-info.js +1 -2
  760. package/dist/node_modules/qrcode/lib/core/format-info.js.map +1 -1
  761. package/dist/node_modules/qrcode/lib/core/galois-field.js +2 -3
  762. package/dist/node_modules/qrcode/lib/core/galois-field.js.map +1 -1
  763. package/dist/node_modules/qrcode/lib/core/kanji-data.js +6 -7
  764. package/dist/node_modules/qrcode/lib/core/kanji-data.js.map +1 -1
  765. package/dist/node_modules/qrcode/lib/core/mask-pattern.js +1 -2
  766. package/dist/node_modules/qrcode/lib/core/mask-pattern.js.map +1 -1
  767. package/dist/node_modules/qrcode/lib/core/mode.js +1 -2
  768. package/dist/node_modules/qrcode/lib/core/mode.js.map +1 -1
  769. package/dist/node_modules/qrcode/lib/core/numeric-data.js +1 -2
  770. package/dist/node_modules/qrcode/lib/core/numeric-data.js.map +1 -1
  771. package/dist/node_modules/qrcode/lib/core/polynomial.js +1 -2
  772. package/dist/node_modules/qrcode/lib/core/polynomial.js.map +1 -1
  773. package/dist/node_modules/qrcode/lib/core/qrcode.js +5 -6
  774. package/dist/node_modules/qrcode/lib/core/qrcode.js.map +1 -1
  775. package/dist/node_modules/qrcode/lib/core/reed-solomon-encoder.js +1 -2
  776. package/dist/node_modules/qrcode/lib/core/reed-solomon-encoder.js.map +1 -1
  777. package/dist/node_modules/qrcode/lib/core/regex.js +1 -2
  778. package/dist/node_modules/qrcode/lib/core/regex.js.map +1 -1
  779. package/dist/node_modules/qrcode/lib/core/segments.js +9 -10
  780. package/dist/node_modules/qrcode/lib/core/segments.js.map +1 -1
  781. package/dist/node_modules/qrcode/lib/core/utils.js +1 -2
  782. package/dist/node_modules/qrcode/lib/core/utils.js.map +1 -1
  783. package/dist/node_modules/qrcode/lib/core/version-check.js +1 -2
  784. package/dist/node_modules/qrcode/lib/core/version-check.js.map +1 -1
  785. package/dist/node_modules/qrcode/lib/core/version.js +6 -7
  786. package/dist/node_modules/qrcode/lib/core/version.js.map +1 -1
  787. package/dist/node_modules/qrcode/lib/renderer/canvas.js +3 -4
  788. package/dist/node_modules/qrcode/lib/renderer/canvas.js.map +1 -1
  789. package/dist/node_modules/qrcode/lib/renderer/svg-tag.js +1 -2
  790. package/dist/node_modules/qrcode/lib/renderer/svg-tag.js.map +1 -1
  791. package/dist/node_modules/qrcode/lib/renderer/utils.js +2 -3
  792. package/dist/node_modules/qrcode/lib/renderer/utils.js.map +1 -1
  793. package/dist/node_modules/react-is/cjs/react-is.development.js +31 -32
  794. package/dist/node_modules/react-is/cjs/react-is.development.js.map +1 -1
  795. package/dist/node_modules/react-is/cjs/react-is.production.min.js +1 -2
  796. package/dist/node_modules/react-is/cjs/react-is.production.min.js.map +1 -1
  797. package/dist/node_modules/react-is/index.js +2 -3
  798. package/dist/node_modules/react-is/index.js.map +1 -1
  799. package/dist/node_modules/react-smooth/es6/Animate.js +31 -39
  800. package/dist/node_modules/react-smooth/es6/Animate.js.map +1 -1
  801. package/dist/node_modules/react-smooth/es6/AnimateManager.js +2 -5
  802. package/dist/node_modules/react-smooth/es6/AnimateManager.js.map +1 -1
  803. package/dist/node_modules/react-smooth/es6/configUpdate.js +1 -2
  804. package/dist/node_modules/react-smooth/es6/configUpdate.js.map +1 -1
  805. package/dist/node_modules/react-smooth/es6/easing.js +1 -2
  806. package/dist/node_modules/react-smooth/es6/easing.js.map +1 -1
  807. package/dist/node_modules/react-smooth/es6/index.js +1 -2
  808. package/dist/node_modules/react-smooth/es6/index.js.map +1 -1
  809. package/dist/node_modules/react-smooth/es6/setRafTimeout.js +1 -2
  810. package/dist/node_modules/react-smooth/es6/setRafTimeout.js.map +1 -1
  811. package/dist/node_modules/react-smooth/es6/util.js +17 -16
  812. package/dist/node_modules/react-smooth/es6/util.js.map +1 -1
  813. package/dist/node_modules/recharts/es6/cartesian/Area.js +95 -96
  814. package/dist/node_modules/recharts/es6/cartesian/Area.js.map +1 -1
  815. package/dist/node_modules/recharts/es6/cartesian/Bar.js +100 -101
  816. package/dist/node_modules/recharts/es6/cartesian/Bar.js.map +1 -1
  817. package/dist/node_modules/recharts/es6/cartesian/Brush.js +23 -24
  818. package/dist/node_modules/recharts/es6/cartesian/Brush.js.map +1 -1
  819. package/dist/node_modules/recharts/es6/cartesian/CartesianAxis.js +58 -65
  820. package/dist/node_modules/recharts/es6/cartesian/CartesianAxis.js.map +1 -1
  821. package/dist/node_modules/recharts/es6/cartesian/CartesianGrid.js +33 -34
  822. package/dist/node_modules/recharts/es6/cartesian/CartesianGrid.js.map +1 -1
  823. package/dist/node_modules/recharts/es6/cartesian/ErrorBar.js +17 -18
  824. package/dist/node_modules/recharts/es6/cartesian/ErrorBar.js.map +1 -1
  825. package/dist/node_modules/recharts/es6/cartesian/Line.js +76 -77
  826. package/dist/node_modules/recharts/es6/cartesian/Line.js.map +1 -1
  827. package/dist/node_modules/recharts/es6/cartesian/ReferenceArea.js +28 -29
  828. package/dist/node_modules/recharts/es6/cartesian/ReferenceArea.js.map +1 -1
  829. package/dist/node_modules/recharts/es6/cartesian/ReferenceDot.js +22 -23
  830. package/dist/node_modules/recharts/es6/cartesian/ReferenceDot.js.map +1 -1
  831. package/dist/node_modules/recharts/es6/cartesian/ReferenceLine.js +28 -29
  832. package/dist/node_modules/recharts/es6/cartesian/ReferenceLine.js.map +1 -1
  833. package/dist/node_modules/recharts/es6/cartesian/XAxis.js +8 -9
  834. package/dist/node_modules/recharts/es6/cartesian/XAxis.js.map +1 -1
  835. package/dist/node_modules/recharts/es6/cartesian/YAxis.js +8 -9
  836. package/dist/node_modules/recharts/es6/cartesian/YAxis.js.map +1 -1
  837. package/dist/node_modules/recharts/es6/cartesian/getEquidistantTicks.js +5 -6
  838. package/dist/node_modules/recharts/es6/cartesian/getEquidistantTicks.js.map +1 -1
  839. package/dist/node_modules/recharts/es6/cartesian/getTicks.js +7 -8
  840. package/dist/node_modules/recharts/es6/cartesian/getTicks.js.map +1 -1
  841. package/dist/node_modules/recharts/es6/chart/AccessibilityManager.js +1 -4
  842. package/dist/node_modules/recharts/es6/chart/AccessibilityManager.js.map +1 -1
  843. package/dist/node_modules/recharts/es6/chart/AreaChart.js +5 -6
  844. package/dist/node_modules/recharts/es6/chart/AreaChart.js.map +1 -1
  845. package/dist/node_modules/recharts/es6/chart/BarChart.js +7 -8
  846. package/dist/node_modules/recharts/es6/chart/BarChart.js.map +1 -1
  847. package/dist/node_modules/recharts/es6/chart/LineChart.js +5 -6
  848. package/dist/node_modules/recharts/es6/chart/LineChart.js.map +1 -1
  849. package/dist/node_modules/recharts/es6/chart/PieChart.js +11 -12
  850. package/dist/node_modules/recharts/es6/chart/PieChart.js.map +1 -1
  851. package/dist/node_modules/recharts/es6/chart/RadialBarChart.js +11 -12
  852. package/dist/node_modules/recharts/es6/chart/RadialBarChart.js.map +1 -1
  853. package/dist/node_modules/recharts/es6/chart/generateCategoricalChart.js +534 -533
  854. package/dist/node_modules/recharts/es6/chart/generateCategoricalChart.js.map +1 -1
  855. package/dist/node_modules/recharts/es6/component/Cell.js +1 -2
  856. package/dist/node_modules/recharts/es6/component/Cell.js.map +1 -1
  857. package/dist/node_modules/recharts/es6/component/Cursor.js +16 -17
  858. package/dist/node_modules/recharts/es6/component/Cursor.js.map +1 -1
  859. package/dist/node_modules/recharts/es6/component/DefaultLegendContent.js +27 -28
  860. package/dist/node_modules/recharts/es6/component/DefaultLegendContent.js.map +1 -1
  861. package/dist/node_modules/recharts/es6/component/DefaultTooltipContent.js +11 -12
  862. package/dist/node_modules/recharts/es6/component/DefaultTooltipContent.js.map +1 -1
  863. package/dist/node_modules/recharts/es6/component/Label.js +78 -79
  864. package/dist/node_modules/recharts/es6/component/Label.js.map +1 -1
  865. package/dist/node_modules/recharts/es6/component/LabelList.js +16 -17
  866. package/dist/node_modules/recharts/es6/component/LabelList.js.map +1 -1
  867. package/dist/node_modules/recharts/es6/component/Legend.js +25 -22
  868. package/dist/node_modules/recharts/es6/component/Legend.js.map +1 -1
  869. package/dist/node_modules/recharts/es6/component/ResponsiveContainer.js +14 -15
  870. package/dist/node_modules/recharts/es6/component/ResponsiveContainer.js.map +1 -1
  871. package/dist/node_modules/recharts/es6/component/Text.js +17 -20
  872. package/dist/node_modules/recharts/es6/component/Text.js.map +1 -1
  873. package/dist/node_modules/recharts/es6/component/Tooltip.js +16 -17
  874. package/dist/node_modules/recharts/es6/component/Tooltip.js.map +1 -1
  875. package/dist/node_modules/recharts/es6/component/TooltipBoundingBox.js +1 -2
  876. package/dist/node_modules/recharts/es6/component/TooltipBoundingBox.js.map +1 -1
  877. package/dist/node_modules/recharts/es6/container/Layer.js +3 -4
  878. package/dist/node_modules/recharts/es6/container/Layer.js.map +1 -1
  879. package/dist/node_modules/recharts/es6/container/Surface.js +3 -4
  880. package/dist/node_modules/recharts/es6/container/Surface.js.map +1 -1
  881. package/dist/node_modules/recharts/es6/context/chartLayoutContext.js +20 -20
  882. package/dist/node_modules/recharts/es6/context/chartLayoutContext.js.map +1 -1
  883. package/dist/node_modules/recharts/es6/polar/Pie.js +102 -106
  884. package/dist/node_modules/recharts/es6/polar/Pie.js.map +1 -1
  885. package/dist/node_modules/recharts/es6/polar/PolarAngleAxis.js +28 -29
  886. package/dist/node_modules/recharts/es6/polar/PolarAngleAxis.js.map +1 -1
  887. package/dist/node_modules/recharts/es6/polar/PolarRadiusAxis.js +36 -39
  888. package/dist/node_modules/recharts/es6/polar/PolarRadiusAxis.js.map +1 -1
  889. package/dist/node_modules/recharts/es6/polar/RadialBar.js +78 -79
  890. package/dist/node_modules/recharts/es6/polar/RadialBar.js.map +1 -1
  891. package/dist/node_modules/recharts/es6/shape/Cross.js +3 -4
  892. package/dist/node_modules/recharts/es6/shape/Cross.js.map +1 -1
  893. package/dist/node_modules/recharts/es6/shape/Curve.js +38 -49
  894. package/dist/node_modules/recharts/es6/shape/Curve.js.map +1 -1
  895. package/dist/node_modules/recharts/es6/shape/Dot.js +2 -3
  896. package/dist/node_modules/recharts/es6/shape/Dot.js.map +1 -1
  897. package/dist/node_modules/recharts/es6/shape/Polygon.js +3 -4
  898. package/dist/node_modules/recharts/es6/shape/Polygon.js.map +1 -1
  899. package/dist/node_modules/recharts/es6/shape/Rectangle.js +8 -9
  900. package/dist/node_modules/recharts/es6/shape/Rectangle.js.map +1 -1
  901. package/dist/node_modules/recharts/es6/shape/Sector.js +33 -34
  902. package/dist/node_modules/recharts/es6/shape/Sector.js.map +1 -1
  903. package/dist/node_modules/recharts/es6/shape/Symbols.js +26 -34
  904. package/dist/node_modules/recharts/es6/shape/Symbols.js.map +1 -1
  905. package/dist/node_modules/recharts/es6/shape/Trapezoid.js +8 -9
  906. package/dist/node_modules/recharts/es6/shape/Trapezoid.js.map +1 -1
  907. package/dist/node_modules/recharts/es6/util/ActiveShapeUtils.js +20 -21
  908. package/dist/node_modules/recharts/es6/util/ActiveShapeUtils.js.map +1 -1
  909. package/dist/node_modules/recharts/es6/util/BarUtils.js +10 -11
  910. package/dist/node_modules/recharts/es6/util/BarUtils.js.map +1 -1
  911. package/dist/node_modules/recharts/es6/util/CartesianUtils.js +32 -33
  912. package/dist/node_modules/recharts/es6/util/CartesianUtils.js.map +1 -1
  913. package/dist/node_modules/recharts/es6/util/ChartUtils.js +231 -236
  914. package/dist/node_modules/recharts/es6/util/ChartUtils.js.map +1 -1
  915. package/dist/node_modules/recharts/es6/util/CssPrefixUtils.js +1 -2
  916. package/dist/node_modules/recharts/es6/util/CssPrefixUtils.js.map +1 -1
  917. package/dist/node_modules/recharts/es6/util/DOMUtils.js +1 -2
  918. package/dist/node_modules/recharts/es6/util/DOMUtils.js.map +1 -1
  919. package/dist/node_modules/recharts/es6/util/DataUtils.js +7 -8
  920. package/dist/node_modules/recharts/es6/util/DataUtils.js.map +1 -1
  921. package/dist/node_modules/recharts/es6/util/DetectReferenceElementsDomain.js +20 -21
  922. package/dist/node_modules/recharts/es6/util/DetectReferenceElementsDomain.js.map +1 -1
  923. package/dist/node_modules/recharts/es6/util/Events.js +0 -1
  924. package/dist/node_modules/recharts/es6/util/Events.js.map +1 -1
  925. package/dist/node_modules/recharts/es6/util/Global.js +0 -1
  926. package/dist/node_modules/recharts/es6/util/Global.js.map +1 -1
  927. package/dist/node_modules/recharts/es6/util/IfOverflowMatches.js +1 -2
  928. package/dist/node_modules/recharts/es6/util/IfOverflowMatches.js.map +1 -1
  929. package/dist/node_modules/recharts/es6/util/LogUtils.js +9 -8
  930. package/dist/node_modules/recharts/es6/util/LogUtils.js.map +1 -1
  931. package/dist/node_modules/recharts/es6/util/PolarUtils.js +5 -6
  932. package/dist/node_modules/recharts/es6/util/PolarUtils.js.map +1 -1
  933. package/dist/node_modules/recharts/es6/util/RadialBarUtils.js +2 -3
  934. package/dist/node_modules/recharts/es6/util/RadialBarUtils.js.map +1 -1
  935. package/dist/node_modules/recharts/es6/util/ReactUtils.js +10 -11
  936. package/dist/node_modules/recharts/es6/util/ReactUtils.js.map +1 -1
  937. package/dist/node_modules/recharts/es6/util/ReduceCSSCalc.js +4 -5
  938. package/dist/node_modules/recharts/es6/util/ReduceCSSCalc.js.map +1 -1
  939. package/dist/node_modules/recharts/es6/util/ShallowEqual.js +1 -2
  940. package/dist/node_modules/recharts/es6/util/ShallowEqual.js.map +1 -1
  941. package/dist/node_modules/recharts/es6/util/TickUtils.js +4 -4
  942. package/dist/node_modules/recharts/es6/util/TickUtils.js.map +1 -1
  943. package/dist/node_modules/recharts/es6/util/calculateViewBox.js +0 -1
  944. package/dist/node_modules/recharts/es6/util/calculateViewBox.js.map +1 -1
  945. package/dist/node_modules/recharts/es6/util/cursor/getCursorPoints.js +7 -6
  946. package/dist/node_modules/recharts/es6/util/cursor/getCursorPoints.js.map +1 -1
  947. package/dist/node_modules/recharts/es6/util/cursor/getCursorRectangle.js +1 -2
  948. package/dist/node_modules/recharts/es6/util/cursor/getCursorRectangle.js.map +1 -1
  949. package/dist/node_modules/recharts/es6/util/cursor/getRadialCursorPoints.js +1 -2
  950. package/dist/node_modules/recharts/es6/util/cursor/getRadialCursorPoints.js.map +1 -1
  951. package/dist/node_modules/recharts/es6/util/getEveryNthWithCondition.js +1 -2
  952. package/dist/node_modules/recharts/es6/util/getEveryNthWithCondition.js.map +1 -1
  953. package/dist/node_modules/recharts/es6/util/getLegendProps.js +9 -10
  954. package/dist/node_modules/recharts/es6/util/getLegendProps.js.map +1 -1
  955. package/dist/node_modules/recharts/es6/util/isDomainSpecifiedByUser.js +1 -2
  956. package/dist/node_modules/recharts/es6/util/isDomainSpecifiedByUser.js.map +1 -1
  957. package/dist/node_modules/recharts/es6/util/payload/getUniqPayload.js +4 -5
  958. package/dist/node_modules/recharts/es6/util/payload/getUniqPayload.js.map +1 -1
  959. package/dist/node_modules/recharts/es6/util/tooltip/translate.js +3 -4
  960. package/dist/node_modules/recharts/es6/util/tooltip/translate.js.map +1 -1
  961. package/dist/node_modules/recharts/es6/util/types.js +1 -2
  962. package/dist/node_modules/recharts/es6/util/types.js.map +1 -1
  963. package/dist/node_modules/recharts-scale/es6/getNiceTickValues.js +2 -3
  964. package/dist/node_modules/recharts-scale/es6/getNiceTickValues.js.map +1 -1
  965. package/dist/node_modules/recharts-scale/es6/index.js +1 -1
  966. package/dist/node_modules/recharts-scale/es6/util/arithmetic.js +1 -2
  967. package/dist/node_modules/recharts-scale/es6/util/arithmetic.js.map +1 -1
  968. package/dist/node_modules/recharts-scale/es6/util/utils.js +3 -4
  969. package/dist/node_modules/recharts-scale/es6/util/utils.js.map +1 -1
  970. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +134 -151
  971. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -1
  972. package/dist/node_modules/tiny-invariant/dist/esm/tiny-invariant.js +2 -3
  973. package/dist/node_modules/tiny-invariant/dist/esm/tiny-invariant.js.map +1 -1
  974. package/dist/node_modules/victory-vendor/es/d3-scale.js +28 -45
  975. package/dist/node_modules/victory-vendor/es/d3-scale.js.map +1 -1
  976. package/dist/services/createSandboxAssistantTransport.d.ts +0 -1
  977. package/dist/services/createSandboxAssistantTransport.js +1 -2
  978. package/dist/services/createSandboxAssistantTransport.js.map +1 -1
  979. package/dist/stories/ListEmptyState.stories.d.ts +0 -2
  980. package/dist/stories/SectionHeader.stories.d.ts +0 -2
  981. package/dist/stories/StatTile.stories.d.ts +0 -2
  982. package/dist/test/helpers.d.ts +12 -0
  983. package/dist/test/mocks/fe-libs-ui.d.ts +123 -0
  984. package/dist/test/mocks/feature-flags.d.ts +5 -0
  985. package/dist/test/mocks/i18n-provider.d.ts +3 -0
  986. package/dist/test/mocks/sonner.d.ts +6 -0
  987. package/dist/test/setup.d.ts +0 -2
  988. package/dist/types/assistant.d.ts +0 -2
  989. package/dist/utils/pageContext.d.ts +0 -1
  990. package/dist/utils/pageContext.js +2 -3
  991. package/dist/utils/pageContext.js.map +1 -1
  992. package/package.json +84 -65
  993. package/dist/assethandler/AssetHandlerRoot.d.ts.map +0 -1
  994. package/dist/assethandler/AssetHandlerRoutes.d.ts.map +0 -1
  995. package/dist/assethandler/admin/AdminContext.d.ts.map +0 -1
  996. package/dist/assethandler/admin/AdminPage.d.ts.map +0 -1
  997. package/dist/assethandler/admin/AdminRoot.d.ts.map +0 -1
  998. package/dist/assethandler/admin/adminOperations.d.ts.map +0 -1
  999. package/dist/assethandler/components/ActivityTimeline.d.ts.map +0 -1
  1000. package/dist/assethandler/components/AssetTag.d.ts.map +0 -1
  1001. package/dist/assethandler/components/AttachmentsPanel.d.ts.map +0 -1
  1002. package/dist/assethandler/components/CameraTagScanner.d.ts.map +0 -1
  1003. package/dist/assethandler/components/ChartCard.d.ts.map +0 -1
  1004. package/dist/assethandler/components/CommentsPanel.d.ts.map +0 -1
  1005. package/dist/assethandler/components/FieldWorkOrderItem.d.ts.map +0 -1
  1006. package/dist/assethandler/components/ListEmptyState.d.ts.map +0 -1
  1007. package/dist/assethandler/components/NotFoundState.d.ts.map +0 -1
  1008. package/dist/assethandler/components/Pagination.d.ts.map +0 -1
  1009. package/dist/assethandler/components/RelatedRunbooksPanel.d.ts.map +0 -1
  1010. package/dist/assethandler/components/SectionHeader.d.ts.map +0 -1
  1011. package/dist/assethandler/components/StatTile.d.ts.map +0 -1
  1012. package/dist/assethandler/components/charts/BarsChart.d.ts.map +0 -1
  1013. package/dist/assethandler/components/charts/ChartParts.d.ts.map +0 -1
  1014. package/dist/assethandler/components/charts/DonutChart.d.ts.map +0 -1
  1015. package/dist/assethandler/components/charts/ProgressMeter.d.ts.map +0 -1
  1016. package/dist/assethandler/components/charts/RadialGauge.d.ts.map +0 -1
  1017. package/dist/assethandler/components/charts/Sparkline.d.ts.map +0 -1
  1018. package/dist/assethandler/components/charts/TrendChart.d.ts.map +0 -1
  1019. package/dist/assethandler/components/charts/chartTheme.d.ts.map +0 -1
  1020. package/dist/assethandler/components/charts/index.d.ts.map +0 -1
  1021. package/dist/assethandler/components/index.d.ts.map +0 -1
  1022. package/dist/assethandler/hooks/useAssetHandlerNavigate.d.ts.map +0 -1
  1023. package/dist/assethandler/hooks/useCopy.d.ts.map +0 -1
  1024. package/dist/assethandler/hooks/useFieldQueue.d.ts.map +0 -1
  1025. package/dist/assethandler/hooks/useMaintenancePlans.d.ts.map +0 -1
  1026. package/dist/assethandler/hooks/useTr.d.ts.map +0 -1
  1027. package/dist/assethandler/index.d.ts.map +0 -1
  1028. package/dist/assethandler/ops/MaintenancePlanDialog.d.ts.map +0 -1
  1029. package/dist/assethandler/ops/NewWorkOrderDialog.d.ts.map +0 -1
  1030. package/dist/assethandler/ops/ScheduleMaintenanceDialog.d.ts.map +0 -1
  1031. package/dist/assethandler/pages/AiPredictionsPage.d.ts.map +0 -1
  1032. package/dist/assethandler/pages/AnalyticsPage.d.ts.map +0 -1
  1033. package/dist/assethandler/pages/AssetsAssetCategoriesPage.d.ts.map +0 -1
  1034. package/dist/assethandler/pages/AssetsAssetCheckInOutPage.d.ts.map +0 -1
  1035. package/dist/assethandler/pages/AssetsAssetCreatePage.d.ts.map +0 -1
  1036. package/dist/assethandler/pages/AssetsAssetDetailPage.d.ts.map +0 -1
  1037. package/dist/assethandler/pages/AssetsAssetListPage.d.ts.map +0 -1
  1038. package/dist/assethandler/pages/AssetsAssetTrackingPage.d.ts.map +0 -1
  1039. package/dist/assethandler/pages/CmdbBrowserPage.d.ts.map +0 -1
  1040. package/dist/assethandler/pages/DashboardPage.d.ts.map +0 -1
  1041. package/dist/assethandler/pages/DigitalTwinPage.d.ts.map +0 -1
  1042. package/dist/assethandler/pages/DiscoveryJobsPage.d.ts.map +0 -1
  1043. package/dist/assethandler/pages/EsgDashboardPage.d.ts.map +0 -1
  1044. package/dist/assethandler/pages/FieldModePage.d.ts.map +0 -1
  1045. package/dist/assethandler/pages/FinanceBudgetDetailPage.d.ts.map +0 -1
  1046. package/dist/assethandler/pages/FinanceFinanceHubPage.d.ts.map +0 -1
  1047. package/dist/assethandler/pages/FinanceInvoiceDetailPage.d.ts.map +0 -1
  1048. package/dist/assethandler/pages/ForecastingAlertsPage.d.ts.map +0 -1
  1049. package/dist/assethandler/pages/IotDevicesPage.d.ts.map +0 -1
  1050. package/dist/assethandler/pages/ItilChangeDetailPage.d.ts.map +0 -1
  1051. package/dist/assethandler/pages/ItilChangeManagementPage.d.ts.map +0 -1
  1052. package/dist/assethandler/pages/ItilDialogs.d.ts.map +0 -1
  1053. package/dist/assethandler/pages/ItilIncidentDetailPage.d.ts.map +0 -1
  1054. package/dist/assethandler/pages/ItilIncidentManagementPage.d.ts.map +0 -1
  1055. package/dist/assethandler/pages/ItilItilhubPage.d.ts.map +0 -1
  1056. package/dist/assethandler/pages/ItilProblemDetailPage.d.ts.map +0 -1
  1057. package/dist/assethandler/pages/ItilProblemManagementPage.d.ts.map +0 -1
  1058. package/dist/assethandler/pages/KnowledgeBasePage.d.ts.map +0 -1
  1059. package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.d.ts.map +0 -1
  1060. package/dist/assethandler/pages/MaintenanceMaintenancePlansPage.d.ts.map +0 -1
  1061. package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.d.ts.map +0 -1
  1062. package/dist/assethandler/pages/OperationsMaintenanceDetailPage.d.ts.map +0 -1
  1063. package/dist/assethandler/pages/OperationsOperationsHubPage.d.ts.map +0 -1
  1064. package/dist/assethandler/pages/OperationsWorkOrderDetailPage.d.ts.map +0 -1
  1065. package/dist/assethandler/pages/PhysicalAuditsPage.d.ts.map +0 -1
  1066. package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.d.ts.map +0 -1
  1067. package/dist/assethandler/pages/ProvenancePage.d.ts.map +0 -1
  1068. package/dist/assethandler/pages/ReportsDashboardPage.d.ts.map +0 -1
  1069. package/dist/assethandler/pages/SamLicensesPage.d.ts.map +0 -1
  1070. package/dist/assethandler/pages/SecurityComplianceDetailPage.d.ts.map +0 -1
  1071. package/dist/assethandler/pages/SecurityPolicyDetailPage.d.ts.map +0 -1
  1072. package/dist/assethandler/pages/SecuritySecurityEventDetailPage.d.ts.map +0 -1
  1073. package/dist/assethandler/pages/SecuritySecurityHubPage.d.ts.map +0 -1
  1074. package/dist/assethandler/pages/TransactionsTransactionDetailPage.d.ts.map +0 -1
  1075. package/dist/assethandler/pages/TransactionsTransactionListPage.d.ts.map +0 -1
  1076. package/dist/assethandler/providers/AssetHandlerProvider.d.ts.map +0 -1
  1077. package/dist/assethandler/store/assethandlerStore.d.ts.map +0 -1
  1078. package/dist/assethandler/types/index.d.ts.map +0 -1
  1079. package/dist/assethandler/utils/categoryPresentation.d.ts.map +0 -1
  1080. package/dist/assethandler/utils/cn.d.ts.map +0 -1
  1081. package/dist/assethandler/utils/csv.d.ts.map +0 -1
  1082. package/dist/assethandler/utils/fieldAssetCache.d.ts.map +0 -1
  1083. package/dist/assethandler/utils/fieldQueue.d.ts.map +0 -1
  1084. package/dist/assethandler/utils/fieldWorkOrders.d.ts.map +0 -1
  1085. package/dist/assethandler/utils/i18n.d.ts.map +0 -1
  1086. package/dist/assethandler/utils/knowledgeBase.d.ts.map +0 -1
  1087. package/dist/assethandler/utils/meter.d.ts.map +0 -1
  1088. package/dist/assethandler/utils/money.d.ts.map +0 -1
  1089. package/dist/assethandler/utils/navigation.d.ts.map +0 -1
  1090. package/dist/assethandler/utils/printAssetTag.d.ts.map +0 -1
  1091. package/dist/assethandler/utils/tco.d.ts.map +0 -1
  1092. package/dist/assethandler/utils/toast.d.ts.map +0 -1
  1093. package/dist/assethandler/utils/utilization.d.ts.map +0 -1
  1094. package/dist/config/assistantUsecases.d.ts.map +0 -1
  1095. package/dist/dev/main.d.ts.map +0 -1
  1096. package/dist/generated/wspace-operations.d.ts.map +0 -1
  1097. package/dist/generated/wspace-types.d.ts.map +0 -1
  1098. package/dist/index.d.ts.map +0 -1
  1099. package/dist/node_modules/d3-array/src/ascending.js +0 -8
  1100. package/dist/node_modules/d3-array/src/ascending.js.map +0 -1
  1101. package/dist/node_modules/d3-array/src/bisect.js +0 -10
  1102. package/dist/node_modules/d3-array/src/bisect.js.map +0 -1
  1103. package/dist/node_modules/d3-array/src/bisector.js +0 -43
  1104. package/dist/node_modules/d3-array/src/bisector.js.map +0 -1
  1105. package/dist/node_modules/d3-array/src/descending.js +0 -8
  1106. package/dist/node_modules/d3-array/src/descending.js.map +0 -1
  1107. package/dist/node_modules/d3-array/src/max.js +0 -14
  1108. package/dist/node_modules/d3-array/src/max.js.map +0 -1
  1109. package/dist/node_modules/d3-array/src/min.js +0 -14
  1110. package/dist/node_modules/d3-array/src/min.js.map +0 -1
  1111. package/dist/node_modules/d3-array/src/number.js +0 -15
  1112. package/dist/node_modules/d3-array/src/number.js.map +0 -1
  1113. package/dist/node_modules/d3-array/src/quantile.js +0 -25
  1114. package/dist/node_modules/d3-array/src/quantile.js.map +0 -1
  1115. package/dist/node_modules/d3-array/src/quickselect.js +0 -26
  1116. package/dist/node_modules/d3-array/src/quickselect.js.map +0 -1
  1117. package/dist/node_modules/d3-array/src/range.js +0 -10
  1118. package/dist/node_modules/d3-array/src/range.js.map +0 -1
  1119. package/dist/node_modules/d3-array/src/sort.js +0 -17
  1120. package/dist/node_modules/d3-array/src/sort.js.map +0 -1
  1121. package/dist/node_modules/d3-array/src/ticks.js +0 -34
  1122. package/dist/node_modules/d3-array/src/ticks.js.map +0 -1
  1123. package/dist/node_modules/d3-color/src/color.js +0 -291
  1124. package/dist/node_modules/d3-color/src/color.js.map +0 -1
  1125. package/dist/node_modules/d3-color/src/define.js +0 -13
  1126. package/dist/node_modules/d3-color/src/define.js.map +0 -1
  1127. package/dist/node_modules/d3-format/src/defaultLocale.js +0 -15
  1128. package/dist/node_modules/d3-format/src/defaultLocale.js.map +0 -1
  1129. package/dist/node_modules/d3-format/src/exponent.js +0 -9
  1130. package/dist/node_modules/d3-format/src/exponent.js.map +0 -1
  1131. package/dist/node_modules/d3-format/src/formatDecimal.js +0 -13
  1132. package/dist/node_modules/d3-format/src/formatDecimal.js.map +0 -1
  1133. package/dist/node_modules/d3-format/src/formatGroup.js +0 -11
  1134. package/dist/node_modules/d3-format/src/formatGroup.js.map +0 -1
  1135. package/dist/node_modules/d3-format/src/formatNumerals.js +0 -12
  1136. package/dist/node_modules/d3-format/src/formatNumerals.js.map +0 -1
  1137. package/dist/node_modules/d3-format/src/formatPrefixAuto.js +0 -13
  1138. package/dist/node_modules/d3-format/src/formatPrefixAuto.js.map +0 -1
  1139. package/dist/node_modules/d3-format/src/formatRounded.js +0 -12
  1140. package/dist/node_modules/d3-format/src/formatRounded.js.map +0 -1
  1141. package/dist/node_modules/d3-format/src/formatSpecifier.js +0 -29
  1142. package/dist/node_modules/d3-format/src/formatSpecifier.js.map +0 -1
  1143. package/dist/node_modules/d3-format/src/formatTrim.js +0 -20
  1144. package/dist/node_modules/d3-format/src/formatTrim.js.map +0 -1
  1145. package/dist/node_modules/d3-format/src/formatTypes.js +0 -23
  1146. package/dist/node_modules/d3-format/src/formatTypes.js.map +0 -1
  1147. package/dist/node_modules/d3-format/src/identity.js +0 -8
  1148. package/dist/node_modules/d3-format/src/identity.js.map +0 -1
  1149. package/dist/node_modules/d3-format/src/locale.js +0 -86
  1150. package/dist/node_modules/d3-format/src/locale.js.map +0 -1
  1151. package/dist/node_modules/d3-format/src/precisionFixed.js +0 -9
  1152. package/dist/node_modules/d3-format/src/precisionFixed.js.map +0 -1
  1153. package/dist/node_modules/d3-format/src/precisionPrefix.js +0 -9
  1154. package/dist/node_modules/d3-format/src/precisionPrefix.js.map +0 -1
  1155. package/dist/node_modules/d3-format/src/precisionRound.js +0 -9
  1156. package/dist/node_modules/d3-format/src/precisionRound.js.map +0 -1
  1157. package/dist/node_modules/d3-interpolate/src/array.js +0 -15
  1158. package/dist/node_modules/d3-interpolate/src/array.js.map +0 -1
  1159. package/dist/node_modules/d3-interpolate/src/basis.js +0 -16
  1160. package/dist/node_modules/d3-interpolate/src/basis.js.map +0 -1
  1161. package/dist/node_modules/d3-interpolate/src/basisClosed.js +0 -13
  1162. package/dist/node_modules/d3-interpolate/src/basisClosed.js.map +0 -1
  1163. package/dist/node_modules/d3-interpolate/src/color.js +0 -25
  1164. package/dist/node_modules/d3-interpolate/src/color.js.map +0 -1
  1165. package/dist/node_modules/d3-interpolate/src/constant.js +0 -6
  1166. package/dist/node_modules/d3-interpolate/src/constant.js.map +0 -1
  1167. package/dist/node_modules/d3-interpolate/src/date.js +0 -11
  1168. package/dist/node_modules/d3-interpolate/src/date.js.map +0 -1
  1169. package/dist/node_modules/d3-interpolate/src/number.js +0 -10
  1170. package/dist/node_modules/d3-interpolate/src/number.js.map +0 -1
  1171. package/dist/node_modules/d3-interpolate/src/numberArray.js +0 -16
  1172. package/dist/node_modules/d3-interpolate/src/numberArray.js.map +0 -1
  1173. package/dist/node_modules/d3-interpolate/src/object.js +0 -14
  1174. package/dist/node_modules/d3-interpolate/src/object.js.map +0 -1
  1175. package/dist/node_modules/d3-interpolate/src/piecewise.js +0 -14
  1176. package/dist/node_modules/d3-interpolate/src/piecewise.js.map +0 -1
  1177. package/dist/node_modules/d3-interpolate/src/rgb.js +0 -19
  1178. package/dist/node_modules/d3-interpolate/src/rgb.js.map +0 -1
  1179. package/dist/node_modules/d3-interpolate/src/round.js +0 -10
  1180. package/dist/node_modules/d3-interpolate/src/round.js.map +0 -1
  1181. package/dist/node_modules/d3-interpolate/src/string.js +0 -28
  1182. package/dist/node_modules/d3-interpolate/src/string.js.map +0 -1
  1183. package/dist/node_modules/d3-interpolate/src/value.js +0 -18
  1184. package/dist/node_modules/d3-interpolate/src/value.js.map +0 -1
  1185. package/dist/node_modules/d3-path/src/path.js.map +0 -1
  1186. package/dist/node_modules/d3-scale/src/band.js +0 -52
  1187. package/dist/node_modules/d3-scale/src/band.js.map +0 -1
  1188. package/dist/node_modules/d3-scale/src/constant.js +0 -10
  1189. package/dist/node_modules/d3-scale/src/constant.js.map +0 -1
  1190. package/dist/node_modules/d3-scale/src/continuous.js +0 -73
  1191. package/dist/node_modules/d3-scale/src/continuous.js.map +0 -1
  1192. package/dist/node_modules/d3-scale/src/diverging.js +0 -82
  1193. package/dist/node_modules/d3-scale/src/diverging.js.map +0 -1
  1194. package/dist/node_modules/d3-scale/src/identity.js +0 -20
  1195. package/dist/node_modules/d3-scale/src/identity.js.map +0 -1
  1196. package/dist/node_modules/d3-scale/src/init.js +0 -29
  1197. package/dist/node_modules/d3-scale/src/init.js.map +0 -1
  1198. package/dist/node_modules/d3-scale/src/linear.js +0 -36
  1199. package/dist/node_modules/d3-scale/src/linear.js.map +0 -1
  1200. package/dist/node_modules/d3-scale/src/log.js +0 -77
  1201. package/dist/node_modules/d3-scale/src/log.js.map +0 -1
  1202. package/dist/node_modules/d3-scale/src/nice.js +0 -10
  1203. package/dist/node_modules/d3-scale/src/nice.js.map +0 -1
  1204. package/dist/node_modules/d3-scale/src/number.js +0 -8
  1205. package/dist/node_modules/d3-scale/src/number.js.map +0 -1
  1206. package/dist/node_modules/d3-scale/src/ordinal.js +0 -31
  1207. package/dist/node_modules/d3-scale/src/ordinal.js.map +0 -1
  1208. package/dist/node_modules/d3-scale/src/pow.js +0 -37
  1209. package/dist/node_modules/d3-scale/src/pow.js.map +0 -1
  1210. package/dist/node_modules/d3-scale/src/quantile.js +0 -37
  1211. package/dist/node_modules/d3-scale/src/quantile.js.map +0 -1
  1212. package/dist/node_modules/d3-scale/src/quantize.js +0 -33
  1213. package/dist/node_modules/d3-scale/src/quantize.js.map +0 -1
  1214. package/dist/node_modules/d3-scale/src/radial.js +0 -39
  1215. package/dist/node_modules/d3-scale/src/radial.js.map +0 -1
  1216. package/dist/node_modules/d3-scale/src/sequential.js +0 -67
  1217. package/dist/node_modules/d3-scale/src/sequential.js.map +0 -1
  1218. package/dist/node_modules/d3-scale/src/sequentialQuantile.js +0 -30
  1219. package/dist/node_modules/d3-scale/src/sequentialQuantile.js.map +0 -1
  1220. package/dist/node_modules/d3-scale/src/symlog.js +0 -30
  1221. package/dist/node_modules/d3-scale/src/symlog.js.map +0 -1
  1222. package/dist/node_modules/d3-scale/src/threshold.js +0 -25
  1223. package/dist/node_modules/d3-scale/src/threshold.js.map +0 -1
  1224. package/dist/node_modules/d3-scale/src/tickFormat.js +0 -31
  1225. package/dist/node_modules/d3-scale/src/tickFormat.js.map +0 -1
  1226. package/dist/node_modules/d3-scale/src/time.js +0 -47
  1227. package/dist/node_modules/d3-scale/src/time.js.map +0 -1
  1228. package/dist/node_modules/d3-scale/src/utcTime.js +0 -19
  1229. package/dist/node_modules/d3-scale/src/utcTime.js.map +0 -1
  1230. package/dist/node_modules/d3-shape/src/area.js +0 -55
  1231. package/dist/node_modules/d3-shape/src/area.js.map +0 -1
  1232. package/dist/node_modules/d3-shape/src/array.js +0 -8
  1233. package/dist/node_modules/d3-shape/src/array.js.map +0 -1
  1234. package/dist/node_modules/d3-shape/src/constant.js +0 -10
  1235. package/dist/node_modules/d3-shape/src/constant.js.map +0 -1
  1236. package/dist/node_modules/d3-shape/src/curve/basis.js +0 -49
  1237. package/dist/node_modules/d3-shape/src/curve/basis.js.map +0 -1
  1238. package/dist/node_modules/d3-shape/src/curve/basisClosed.js +0 -50
  1239. package/dist/node_modules/d3-shape/src/curve/basisClosed.js.map +0 -1
  1240. package/dist/node_modules/d3-shape/src/curve/basisOpen.js +0 -46
  1241. package/dist/node_modules/d3-shape/src/curve/basisOpen.js.map +0 -1
  1242. package/dist/node_modules/d3-shape/src/curve/bump.js +0 -40
  1243. package/dist/node_modules/d3-shape/src/curve/bump.js.map +0 -1
  1244. package/dist/node_modules/d3-shape/src/curve/linear.js +0 -36
  1245. package/dist/node_modules/d3-shape/src/curve/linear.js.map +0 -1
  1246. package/dist/node_modules/d3-shape/src/curve/linearClosed.js +0 -25
  1247. package/dist/node_modules/d3-shape/src/curve/linearClosed.js.map +0 -1
  1248. package/dist/node_modules/d3-shape/src/curve/monotone.js +0 -94
  1249. package/dist/node_modules/d3-shape/src/curve/monotone.js.map +0 -1
  1250. package/dist/node_modules/d3-shape/src/curve/natural.js +0 -39
  1251. package/dist/node_modules/d3-shape/src/curve/natural.js.map +0 -1
  1252. package/dist/node_modules/d3-shape/src/curve/step.js +0 -47
  1253. package/dist/node_modules/d3-shape/src/curve/step.js.map +0 -1
  1254. package/dist/node_modules/d3-shape/src/line.js +0 -30
  1255. package/dist/node_modules/d3-shape/src/line.js.map +0 -1
  1256. package/dist/node_modules/d3-shape/src/math.js +0 -8
  1257. package/dist/node_modules/d3-shape/src/math.js.map +0 -1
  1258. package/dist/node_modules/d3-shape/src/noop.js +0 -6
  1259. package/dist/node_modules/d3-shape/src/noop.js.map +0 -1
  1260. package/dist/node_modules/d3-shape/src/offset/expand.js +0 -15
  1261. package/dist/node_modules/d3-shape/src/offset/expand.js.map +0 -1
  1262. package/dist/node_modules/d3-shape/src/offset/none.js +0 -8
  1263. package/dist/node_modules/d3-shape/src/offset/none.js.map +0 -1
  1264. package/dist/node_modules/d3-shape/src/offset/silhouette.js +0 -15
  1265. package/dist/node_modules/d3-shape/src/offset/silhouette.js.map +0 -1
  1266. package/dist/node_modules/d3-shape/src/offset/wiggle.js +0 -21
  1267. package/dist/node_modules/d3-shape/src/offset/wiggle.js.map +0 -1
  1268. package/dist/node_modules/d3-shape/src/order/none.js +0 -9
  1269. package/dist/node_modules/d3-shape/src/order/none.js.map +0 -1
  1270. package/dist/node_modules/d3-shape/src/path.js +0 -19
  1271. package/dist/node_modules/d3-shape/src/path.js.map +0 -1
  1272. package/dist/node_modules/d3-shape/src/point.js +0 -11
  1273. package/dist/node_modules/d3-shape/src/point.js.map +0 -1
  1274. package/dist/node_modules/d3-shape/src/stack.js +0 -34
  1275. package/dist/node_modules/d3-shape/src/stack.js.map +0 -1
  1276. package/dist/node_modules/d3-shape/src/symbol/circle.js +0 -10
  1277. package/dist/node_modules/d3-shape/src/symbol/circle.js.map +0 -1
  1278. package/dist/node_modules/d3-shape/src/symbol/cross.js +0 -10
  1279. package/dist/node_modules/d3-shape/src/symbol/cross.js.map +0 -1
  1280. package/dist/node_modules/d3-shape/src/symbol/diamond.js +0 -10
  1281. package/dist/node_modules/d3-shape/src/symbol/diamond.js.map +0 -1
  1282. package/dist/node_modules/d3-shape/src/symbol/square.js +0 -10
  1283. package/dist/node_modules/d3-shape/src/symbol/square.js.map +0 -1
  1284. package/dist/node_modules/d3-shape/src/symbol/star.js +0 -15
  1285. package/dist/node_modules/d3-shape/src/symbol/star.js.map +0 -1
  1286. package/dist/node_modules/d3-shape/src/symbol/triangle.js +0 -10
  1287. package/dist/node_modules/d3-shape/src/symbol/triangle.js.map +0 -1
  1288. package/dist/node_modules/d3-shape/src/symbol/wye.js +0 -10
  1289. package/dist/node_modules/d3-shape/src/symbol/wye.js.map +0 -1
  1290. package/dist/node_modules/d3-shape/src/symbol.js +0 -23
  1291. package/dist/node_modules/d3-shape/src/symbol.js.map +0 -1
  1292. package/dist/node_modules/d3-time/src/day.js +0 -21
  1293. package/dist/node_modules/d3-time/src/day.js.map +0 -1
  1294. package/dist/node_modules/d3-time/src/duration.js +0 -6
  1295. package/dist/node_modules/d3-time/src/duration.js.map +0 -1
  1296. package/dist/node_modules/d3-time/src/hour.js +0 -19
  1297. package/dist/node_modules/d3-time/src/hour.js.map +0 -1
  1298. package/dist/node_modules/d3-time/src/interval.js +0 -28
  1299. package/dist/node_modules/d3-time/src/interval.js.map +0 -1
  1300. package/dist/node_modules/d3-time/src/millisecond.js +0 -14
  1301. package/dist/node_modules/d3-time/src/millisecond.js.map +0 -1
  1302. package/dist/node_modules/d3-time/src/minute.js +0 -19
  1303. package/dist/node_modules/d3-time/src/minute.js.map +0 -1
  1304. package/dist/node_modules/d3-time/src/month.js +0 -18
  1305. package/dist/node_modules/d3-time/src/month.js.map +0 -1
  1306. package/dist/node_modules/d3-time/src/second.js +0 -13
  1307. package/dist/node_modules/d3-time/src/second.js.map +0 -1
  1308. package/dist/node_modules/d3-time/src/ticks.js +0 -125
  1309. package/dist/node_modules/d3-time/src/ticks.js.map +0 -1
  1310. package/dist/node_modules/d3-time/src/week.js +0 -25
  1311. package/dist/node_modules/d3-time/src/week.js.map +0 -1
  1312. package/dist/node_modules/d3-time/src/year.js +0 -26
  1313. package/dist/node_modules/d3-time/src/year.js.map +0 -1
  1314. package/dist/node_modules/d3-time-format/src/defaultLocale.js +0 -62
  1315. package/dist/node_modules/d3-time-format/src/defaultLocale.js.map +0 -1
  1316. package/dist/node_modules/d3-time-format/src/locale.js.map +0 -1
  1317. package/dist/node_modules/internmap/src/index.js +0 -40
  1318. package/dist/node_modules/internmap/src/index.js.map +0 -1
  1319. package/dist/services/createSandboxAssistantTransport.d.ts.map +0 -1
  1320. package/dist/stories/ListEmptyState.stories.d.ts.map +0 -1
  1321. package/dist/stories/SectionHeader.stories.d.ts.map +0 -1
  1322. package/dist/stories/StatTile.stories.d.ts.map +0 -1
  1323. package/dist/test/setup.d.ts.map +0 -1
  1324. package/dist/types/assistant.d.ts.map +0 -1
  1325. package/dist/utils/pageContext.d.ts.map +0 -1
@@ -4,28 +4,28 @@ import { useMemo as n } from "react";
4
4
  import { ApolloClient as r, HttpLink as i, InMemoryCache as a } from "@apollo/client";
5
5
  import { ApolloProvider as o } from "@apollo/client/react";
6
6
  import { jsx as s } from "react/jsx-runtime";
7
- //#region src/assethandler/admin/AdminRoot.tsx
7
+ // src/assethandler/admin/AdminRoot.tsx
8
8
  var c = ({ children: t, ...c }) => {
9
- let { apiGatewayUrl: l, authToken: u, workspaceToken: d, workspaceId: f, tenantId: p } = c;
9
+ let { apiGatewayUrl: l, authToken: u, workspaceToken: d, workspaceId: f, tenantId: p } = c, m = n(() => new r({
10
+ link: new i({
11
+ uri: l ? `${l}/workspaces/graphql` : "/workspaces/graphql",
12
+ headers: {
13
+ ...u ? { Authorization: `Bearer ${u}` } : {},
14
+ ...d ? { "X-Workspace-Authorization": `Bearer ${d}` } : {},
15
+ ...f ? { "x-workspace-id": f } : {},
16
+ ...p ? { "x-tenant-id": p } : {}
17
+ }
18
+ }),
19
+ cache: new a()
20
+ }), [
21
+ l,
22
+ u,
23
+ d,
24
+ f,
25
+ p
26
+ ]);
10
27
  return /* @__PURE__ */ s(o, {
11
- client: n(() => new r({
12
- link: new i({
13
- uri: l ? `${l}/workspaces/graphql` : "/workspaces/graphql",
14
- headers: {
15
- ...u ? { Authorization: `Bearer ${u}` } : {},
16
- ...d ? { "X-Workspace-Authorization": `Bearer ${d}` } : {},
17
- ...f ? { "x-workspace-id": f } : {},
18
- ...p ? { "x-tenant-id": p } : {}
19
- }
20
- }),
21
- cache: new a()
22
- }), [
23
- l,
24
- u,
25
- d,
26
- f,
27
- p
28
- ]),
28
+ client: m,
29
29
  children: /* @__PURE__ */ s(e.Provider, {
30
30
  value: c,
31
31
  children: t
@@ -35,7 +35,6 @@ var c = ({ children: t, ...c }) => {
35
35
  ...e,
36
36
  children: /* @__PURE__ */ s(t, {})
37
37
  });
38
- //#endregion
39
38
  export { l as AdminRoot };
40
39
 
41
40
  //# sourceMappingURL=AdminRoot.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdminRoot.js","names":[],"sources":["../../../src/assethandler/admin/AdminRoot.tsx"],"sourcesContent":["/**\n * AssetHandler Admin Root\n *\n * Host-contract entry point for the AssetHandler admin surface inside\n * `admin-app` at `/admin/assethandler` (BOFF-3362).\n *\n * Deliberately does NOT reuse `AssetHandlerProvider`: that provider hydrates\n * the whole product store (thirteen bootstrap queries) which an operations\n * console never needs. This provider only builds the workspace-gateway Apollo\n * client and exposes the host context to the admin page.\n */\nimport type { FC, PropsWithChildren } from 'react';\nimport { useMemo } from 'react';\nimport { ApolloClient, HttpLink, InMemoryCache } from '@apollo/client';\nimport { ApolloProvider } from '@apollo/client/react';\n\nimport { AdminContext, type AdminRootProps } from './AdminContext';\nimport { AdminPage } from './AdminPage';\n\nexport type { AdminRootProps } from './AdminContext';\n\nconst AdminProvider: FC<PropsWithChildren<AdminRootProps>> = ({ children, ...props }) => {\n const { apiGatewayUrl, authToken, workspaceToken, workspaceId, tenantId } = props;\n\n const client = useMemo(\n () =>\n new ApolloClient({\n link: new HttpLink({\n uri: apiGatewayUrl ? `${apiGatewayUrl}/workspaces/graphql` : '/workspaces/graphql',\n headers: {\n ...(authToken ? { Authorization: `Bearer ${authToken}` } : {}),\n ...(workspaceToken ? { 'X-Workspace-Authorization': `Bearer ${workspaceToken}` } : {}),\n ...(workspaceId ? { 'x-workspace-id': workspaceId } : {}),\n ...(tenantId ? { 'x-tenant-id': tenantId } : {}),\n },\n }),\n cache: new InMemoryCache(),\n }),\n [apiGatewayUrl, authToken, workspaceToken, workspaceId, tenantId]\n );\n\n // No router here on purpose: admin-app already renders this inside its own\n // <Router>, and nesting another one throws. The page needs no routing —\n // navigation to other admin surfaces goes through the host's `navigate` prop.\n return (\n <ApolloProvider client={client}>\n <AdminContext.Provider value={props}>{children}</AdminContext.Provider>\n </ApolloProvider>\n );\n};\n\nexport const AdminRoot: FC<AdminRootProps> = (props) => (\n <AdminProvider {...props}>\n <AdminPage />\n </AdminProvider>\n);\n"],"mappings":";;;;;;;AAqBA,IAAM,KAAwD,EAAE,aAAU,GAAG,QAAY;CACvF,IAAM,EAAE,kBAAe,cAAW,mBAAgB,gBAAa,gBAAa;CAsB5E,OACE,kBAAC,GAAD;EAAwB,QArBX,QAEX,IAAI,EAAa;GACf,MAAM,IAAI,EAAS;IACjB,KAAK,IAAgB,GAAG,EAAc,uBAAuB;IAC7D,SAAS;KACP,GAAI,IAAY,EAAE,eAAe,UAAU,IAAY,IAAI,CAAC;KAC5D,GAAI,IAAiB,EAAE,6BAA6B,UAAU,IAAiB,IAAI,CAAC;KACpF,GAAI,IAAc,EAAE,kBAAkB,EAAY,IAAI,CAAC;KACvD,GAAI,IAAW,EAAE,eAAe,EAAS,IAAI,CAAC;IAChD;GACF,CAAC;GACD,OAAO,IAAI,EAAc;EAC3B,CAAC,GACH;GAAC;GAAe;GAAW;GAAgB;GAAa;EAAQ,CAOxC;YACtB,kBAAC,EAAa,UAAd;GAAuB,OAAO;GAAQ;EAAgC,CAAA;CACxD,CAAA;AAEpB,GAEa,KAAiC,MAC5C,kBAAC,GAAD;CAAe,GAAI;WACjB,kBAAC,GAAD,CAAY,CAAA;AACC,CAAA"}
1
+ {"version":3,"file":"AdminRoot.js","names":["AdminProvider","props","client","useMemo","ApolloClient","HttpLink","apiGatewayUrl","authToken","workspaceToken","workspaceId","tenantId","InMemoryCache","ApolloProvider","AdminContext","AdminRoot","AdminPage"],"sources":["../../../src/assethandler/admin/AdminRoot.tsx"],"sourcesContent":["/**\n * AssetHandler Admin Root\n *\n * Host-contract entry point for the AssetHandler admin surface inside\n * `admin-app` at `/admin/assethandler` (BOFF-3362).\n *\n * Deliberately does NOT reuse `AssetHandlerProvider`: that provider hydrates\n * the whole product store (thirteen bootstrap queries) which an operations\n * console never needs. This provider only builds the workspace-gateway Apollo\n * client and exposes the host context to the admin page.\n */\nimport type { FC, PropsWithChildren } from 'react';\nimport { useMemo } from 'react';\nimport { ApolloClient, HttpLink, InMemoryCache } from '@apollo/client';\nimport { ApolloProvider } from '@apollo/client/react';\n\nimport { AdminContext, type AdminRootProps } from './AdminContext';\nimport { AdminPage } from './AdminPage';\n\nexport type { AdminRootProps } from './AdminContext';\n\nconst AdminProvider: FC<PropsWithChildren<AdminRootProps>> = ({ children, ...props }) => {\n const { apiGatewayUrl, authToken, workspaceToken, workspaceId, tenantId } = props;\n\n const client = useMemo(\n () =>\n new ApolloClient({\n link: new HttpLink({\n uri: apiGatewayUrl ? `${apiGatewayUrl}/workspaces/graphql` : '/workspaces/graphql',\n headers: {\n ...(authToken ? { Authorization: `Bearer ${authToken}` } : {}),\n ...(workspaceToken ? { 'X-Workspace-Authorization': `Bearer ${workspaceToken}` } : {}),\n ...(workspaceId ? { 'x-workspace-id': workspaceId } : {}),\n ...(tenantId ? { 'x-tenant-id': tenantId } : {}),\n },\n }),\n cache: new InMemoryCache(),\n }),\n [apiGatewayUrl, authToken, workspaceToken, workspaceId, tenantId]\n );\n\n // No router here on purpose: admin-app already renders this inside its own\n // <Router>, and nesting another one throws. The page needs no routing —\n // navigation to other admin surfaces goes through the host's `navigate` prop.\n return (\n <ApolloProvider client={client}>\n <AdminContext.Provider value={props}>{children}</AdminContext.Provider>\n </ApolloProvider>\n );\n};\n\nexport const AdminRoot: FC<AdminRootProps> = (props) => (\n <AdminProvider {...props}>\n <AdminPage />\n </AdminProvider>\n);\n"],"mappings":";;;;;;;AAqBA,IAAMA,KAAwD,EAAE,aAAU,GAAGC,QAAY;CACvF,IAAM,EAAE,kBAAe,cAAW,mBAAgB,gBAAa,gBAAaA,GAEtEC,IAASC,QAEX,IAAIC,EAAa;EACf,MAAM,IAAIC,EAAS;GACjB,KAAKC,IAAgB,GAAGA,EAAc,uBAAuB;GAC7D,SAAS;IACP,GAAIC,IAAY,EAAE,eAAe,UAAUA,IAAY,IAAI,CAAC;IAC5D,GAAIC,IAAiB,EAAE,6BAA6B,UAAUA,IAAiB,IAAI,CAAC;IACpF,GAAIC,IAAc,EAAE,kBAAkBA,EAAY,IAAI,CAAC;IACvD,GAAIC,IAAW,EAAE,eAAeA,EAAS,IAAI,CAAC;GAChD;EACF,CAAC;EACD,OAAO,IAAIC,EAAc;CAC3B,CAAC,GACH;EAACL;EAAeC;EAAWC;EAAgBC;EAAaC;CAAQ,CAClE;CAKA,OACE,kBAACE,GAAD;EAAwB;EACtB,UAAA,kBAACC,EAAa,UAAd;GAAuB,OAAOZ;GAAQ;EAAgC,CAAA;CACxD,CAAA;AAEpB,GAEaa,KAAiC,MAC5C,kBAACd,GAAD;CAAe,GAAIC;CACjB,UAAA,kBAACc,GAAD,CAAY,CAAA;AACC,CAAA"}
@@ -72,4 +72,3 @@ export interface QuotaSummary {
72
72
  * order; anything else follows alphabetically.
73
73
  */
74
74
  export declare function summarizeQuotas(assignments: readonly AdminQuotaAssignment[]): QuotaSummary[];
75
- //# sourceMappingURL=adminOperations.d.ts.map
@@ -1,5 +1,5 @@
1
1
  import { gql as e } from "@apollo/client";
2
- //#region src/assethandler/admin/adminOperations.ts
2
+ // src/assethandler/admin/adminOperations.ts
3
3
  var t = e`
4
4
  query AssetHandlerAdminWorkspaceState($workspaceId: ID!) {
5
5
  assetHandlerAdminWorkspaceState(workspaceId: $workspaceId) {
@@ -112,7 +112,6 @@ function c(e) {
112
112
  };
113
113
  });
114
114
  }
115
- //#endregion
116
- export { n as ADMIN_FEATURE_FLAGS, r as ADMIN_QUOTA_OVERVIEW, t as ADMIN_WORKSPACE_STATE, a as REMOVE_FEATURE_FLAG_OVERRIDE, i as SET_FEATURE_FLAG_OVERRIDE, c as summarizeQuotas };
115
+ export { n as ADMIN_FEATURE_FLAGS, r as ADMIN_QUOTA_OVERVIEW, t as ADMIN_WORKSPACE_STATE, o as ASSETHANDLER_QUOTAS, a as REMOVE_FEATURE_FLAG_OVERRIDE, i as SET_FEATURE_FLAG_OVERRIDE, s as quotaLabel, c as summarizeQuotas };
117
116
 
118
117
  //# sourceMappingURL=adminOperations.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"adminOperations.js","names":[],"sources":["../../../src/assethandler/admin/adminOperations.ts"],"sourcesContent":["/**\n * GraphQL operations for the AssetHandler admin surface (BOFF-3362).\n *\n * Served by `wspace-assethandler-svc`'s admin module (super-admin only).\n * Typed locally rather than through codegen so this surface does not depend on\n * the composed supergraph snapshot being refreshed first.\n */\nimport { gql } from '@apollo/client';\n\nexport const ADMIN_WORKSPACE_STATE = gql`\n query AssetHandlerAdminWorkspaceState($workspaceId: ID!) {\n assetHandlerAdminWorkspaceState(workspaceId: $workspaceId) {\n workspaceId\n assetCount\n openIncidentCount\n openWorkOrderCount\n maintenancePlanCount\n discoveryJobCount\n generatedAt\n }\n }\n`;\n\nexport const ADMIN_FEATURE_FLAGS = gql`\n query AssetHandlerFeatureFlags($workspaceId: ID!) {\n assetHandlerFeatureFlags(workspaceId: $workspaceId) {\n workspaceId\n items {\n key\n defaultValue\n value\n category\n }\n }\n }\n`;\n\nexport const ADMIN_QUOTA_OVERVIEW = gql`\n query AssetHandlerWorkspaceQuotaOverview($workspaceId: ID!) {\n assetHandlerWorkspaceQuotaOverview(workspaceId: $workspaceId) {\n workspaceId\n assignments {\n id\n quotaName\n productId\n limit\n used\n noLimit\n resetPeriod\n isActive\n updatedAt\n }\n }\n }\n`;\n\nexport const SET_FEATURE_FLAG_OVERRIDE = gql`\n mutation SetAssetHandlerFeatureFlagOverride($input: SetAssetHandlerFeatureFlagOverrideInput!) {\n setAssetHandlerFeatureFlagOverride(input: $input) {\n id\n featureFlagId\n workspaceId\n enabled\n allowUserOptIn\n }\n }\n`;\n\nexport const REMOVE_FEATURE_FLAG_OVERRIDE = gql`\n mutation RemoveAssetHandlerFeatureFlagOverride($workspaceId: ID!, $key: String!) {\n removeAssetHandlerFeatureFlagOverride(workspaceId: $workspaceId, key: $key)\n }\n`;\n\nexport interface AdminWorkspaceState {\n workspaceId: string;\n assetCount: number;\n openIncidentCount: number;\n openWorkOrderCount: number;\n maintenancePlanCount: number;\n discoveryJobCount: number;\n generatedAt: string;\n}\n\nexport interface AdminFeatureFlag {\n key: string;\n defaultValue: boolean;\n value: boolean;\n category: string;\n}\n\nexport interface AdminQuotaAssignment {\n id: string;\n quotaName: string;\n productId: string;\n limit: number | null;\n used: number;\n noLimit: boolean;\n resetPeriod: string;\n isActive: boolean;\n updatedAt: string;\n}\n\nexport interface AdminWorkspaceStateData {\n assetHandlerAdminWorkspaceState: AdminWorkspaceState;\n}\n\nexport interface AdminFeatureFlagsData {\n assetHandlerFeatureFlags: { workspaceId: string; items: AdminFeatureFlag[] };\n}\n\nexport interface AdminQuotaOverviewData {\n assetHandlerWorkspaceQuotaOverview: {\n workspaceId: string;\n assignments: AdminQuotaAssignment[];\n };\n}\n\n/** Quotas AssetHandler enforces, with admin-facing labels. */\nexport const ASSETHANDLER_QUOTAS: ReadonlyArray<{ name: string; label: string }> = [\n { name: 'assethandler.assets.count', label: 'Active assets (asset limit)' },\n { name: 'assethandler.work_orders.open', label: 'Open work orders' },\n { name: 'assethandler.cmdb.configuration_items', label: 'CMDB configuration items' },\n { name: 'assethandler.discovery.jobs.monthly', label: 'Discovery jobs / month' },\n { name: 'assethandler.incidents.monthly', label: 'Incidents / month' },\n { name: 'assethandler.maintenance_records.monthly', label: 'Maintenance records / month' },\n { name: 'assethandler.knowledge_articles.monthly', label: 'Knowledge articles / month' },\n { name: 'assethandler.esg_metrics.monthly', label: 'ESG metrics / month' },\n];\n\n/** Human label for a quota name; falls back to the raw name for unknown ones. */\nexport function quotaLabel(name: string): string {\n return ASSETHANDLER_QUOTAS.find((quota) => quota.name === name)?.label ?? name;\n}\n\n/** One line per quota: every active plan row for that quota folded together. */\nexport interface QuotaSummary {\n quotaName: string;\n label: string;\n /** Effective limit; `null` when the quota is unlimited. */\n limit: number | null;\n unlimited: boolean;\n used: number;\n resetPeriod: string;\n}\n\n/**\n * Fold a workspace's active quota assignments into one line per quota.\n *\n * A workspace can hold several active assignments for the same quota (one per\n * subscription). The quota service enforces their combined total: the limits\n * add up, and any unlimited assignment makes the whole quota unlimited. This\n * mirrors that rule so the admin sees the limit that is actually enforced, not\n * a row per subscription. Quotas AssetHandler knows come first, in a stable\n * order; anything else follows alphabetically.\n */\nexport function summarizeQuotas(assignments: readonly AdminQuotaAssignment[]): QuotaSummary[] {\n const byQuota = new Map<string, AdminQuotaAssignment[]>();\n for (const assignment of assignments) {\n if (!assignment.isActive) continue;\n const rows = byQuota.get(assignment.quotaName);\n if (rows) rows.push(assignment);\n else byQuota.set(assignment.quotaName, [assignment]);\n }\n\n const known = ASSETHANDLER_QUOTAS.map((quota) => quota.name);\n const names = [\n ...known.filter((name) => byQuota.has(name)),\n ...[...byQuota.keys()].filter((name) => !known.includes(name)).sort(),\n ];\n\n return names.map((quotaName) => {\n const rows = byQuota.get(quotaName) ?? [];\n const unlimited = rows.some((row) => row.noLimit || row.limit === null);\n return {\n quotaName,\n label: quotaLabel(quotaName),\n limit: unlimited ? null : rows.reduce((sum, row) => sum + (row.limit ?? 0), 0),\n unlimited,\n used: rows.reduce((sum, row) => sum + row.used, 0),\n resetPeriod: [...new Set(rows.map((row) => row.resetPeriod))].join(' / '),\n };\n });\n}\n"],"mappings":";;AASA,IAAa,IAAwB,CAAG;;;;;;;;;;;;GAc3B,IAAsB,CAAG;;;;;;;;;;;;GAczB,IAAuB,CAAG;;;;;;;;;;;;;;;;;GAmB1B,IAA4B,CAAG;;;;;;;;;;GAY/B,IAA+B,CAAG;;;;GAmDlC,IAAsE;CACjF;EAAE,MAAM;EAA6B,OAAO;CAA8B;CAC1E;EAAE,MAAM;EAAiC,OAAO;CAAmB;CACnE;EAAE,MAAM;EAAyC,OAAO;CAA2B;CACnF;EAAE,MAAM;EAAuC,OAAO;CAAyB;CAC/E;EAAE,MAAM;EAAkC,OAAO;CAAoB;CACrE;EAAE,MAAM;EAA4C,OAAO;CAA8B;CACzF;EAAE,MAAM;EAA2C,OAAO;CAA6B;CACvF;EAAE,MAAM;EAAoC,OAAO;CAAsB;AAC3E;AAGA,SAAgB,EAAW,GAAsB;CAC/C,OAAO,EAAoB,MAAM,MAAU,EAAM,SAAS,CAAI,GAAG,SAAS;AAC5E;AAuBA,SAAgB,EAAgB,GAA8D;CAC5F,IAAM,oBAAU,IAAI,IAAoC;CACxD,KAAK,IAAM,KAAc,GAAa;EACpC,IAAI,CAAC,EAAW,UAAU;EAC1B,IAAM,IAAO,EAAQ,IAAI,EAAW,SAAS;EAC7C,AAAI,IAAM,EAAK,KAAK,CAAU,IACzB,EAAQ,IAAI,EAAW,WAAW,CAAC,CAAU,CAAC;CACrD;CAEA,IAAM,IAAQ,EAAoB,KAAK,MAAU,EAAM,IAAI;CAM3D,OAAO,CAJL,GAAG,EAAM,QAAQ,MAAS,EAAQ,IAAI,CAAI,CAAC,GAC3C,GAAG,CAAC,GAAG,EAAQ,KAAK,CAAC,EAAE,QAAQ,MAAS,CAAC,EAAM,SAAS,CAAI,CAAC,EAAE,KAAK,CAG/D,EAAM,KAAK,MAAc;EAC9B,IAAM,IAAO,EAAQ,IAAI,CAAS,KAAK,CAAC,GAClC,IAAY,EAAK,MAAM,MAAQ,EAAI,WAAW,EAAI,UAAU,IAAI;EACtE,OAAO;GACL;GACA,OAAO,EAAW,CAAS;GAC3B,OAAO,IAAY,OAAO,EAAK,QAAQ,GAAK,MAAQ,KAAO,EAAI,SAAS,IAAI,CAAC;GAC7E;GACA,MAAM,EAAK,QAAQ,GAAK,MAAQ,IAAM,EAAI,MAAM,CAAC;GACjD,aAAa,CAAC,GAAG,IAAI,IAAI,EAAK,KAAK,MAAQ,EAAI,WAAW,CAAC,CAAC,EAAE,KAAK,KAAK;EAC1E;CACF,CAAC;AACH"}
1
+ {"version":3,"file":"adminOperations.js","names":["ADMIN_WORKSPACE_STATE","ADMIN_FEATURE_FLAGS","ADMIN_QUOTA_OVERVIEW","SET_FEATURE_FLAG_OVERRIDE","REMOVE_FEATURE_FLAG_OVERRIDE","ASSETHANDLER_QUOTAS","quotaLabel","quota","name","summarizeQuotas","byQuota","assignment","assignments","rows","known","quotaName","unlimited","row","sum"],"sources":["../../../src/assethandler/admin/adminOperations.ts"],"sourcesContent":["/**\n * GraphQL operations for the AssetHandler admin surface (BOFF-3362).\n *\n * Served by `wspace-assethandler-svc`'s admin module (super-admin only).\n * Typed locally rather than through codegen so this surface does not depend on\n * the composed supergraph snapshot being refreshed first.\n */\nimport { gql } from '@apollo/client';\n\nexport const ADMIN_WORKSPACE_STATE = gql`\n query AssetHandlerAdminWorkspaceState($workspaceId: ID!) {\n assetHandlerAdminWorkspaceState(workspaceId: $workspaceId) {\n workspaceId\n assetCount\n openIncidentCount\n openWorkOrderCount\n maintenancePlanCount\n discoveryJobCount\n generatedAt\n }\n }\n`;\n\nexport const ADMIN_FEATURE_FLAGS = gql`\n query AssetHandlerFeatureFlags($workspaceId: ID!) {\n assetHandlerFeatureFlags(workspaceId: $workspaceId) {\n workspaceId\n items {\n key\n defaultValue\n value\n category\n }\n }\n }\n`;\n\nexport const ADMIN_QUOTA_OVERVIEW = gql`\n query AssetHandlerWorkspaceQuotaOverview($workspaceId: ID!) {\n assetHandlerWorkspaceQuotaOverview(workspaceId: $workspaceId) {\n workspaceId\n assignments {\n id\n quotaName\n productId\n limit\n used\n noLimit\n resetPeriod\n isActive\n updatedAt\n }\n }\n }\n`;\n\nexport const SET_FEATURE_FLAG_OVERRIDE = gql`\n mutation SetAssetHandlerFeatureFlagOverride($input: SetAssetHandlerFeatureFlagOverrideInput!) {\n setAssetHandlerFeatureFlagOverride(input: $input) {\n id\n featureFlagId\n workspaceId\n enabled\n allowUserOptIn\n }\n }\n`;\n\nexport const REMOVE_FEATURE_FLAG_OVERRIDE = gql`\n mutation RemoveAssetHandlerFeatureFlagOverride($workspaceId: ID!, $key: String!) {\n removeAssetHandlerFeatureFlagOverride(workspaceId: $workspaceId, key: $key)\n }\n`;\n\nexport interface AdminWorkspaceState {\n workspaceId: string;\n assetCount: number;\n openIncidentCount: number;\n openWorkOrderCount: number;\n maintenancePlanCount: number;\n discoveryJobCount: number;\n generatedAt: string;\n}\n\nexport interface AdminFeatureFlag {\n key: string;\n defaultValue: boolean;\n value: boolean;\n category: string;\n}\n\nexport interface AdminQuotaAssignment {\n id: string;\n quotaName: string;\n productId: string;\n limit: number | null;\n used: number;\n noLimit: boolean;\n resetPeriod: string;\n isActive: boolean;\n updatedAt: string;\n}\n\nexport interface AdminWorkspaceStateData {\n assetHandlerAdminWorkspaceState: AdminWorkspaceState;\n}\n\nexport interface AdminFeatureFlagsData {\n assetHandlerFeatureFlags: { workspaceId: string; items: AdminFeatureFlag[] };\n}\n\nexport interface AdminQuotaOverviewData {\n assetHandlerWorkspaceQuotaOverview: {\n workspaceId: string;\n assignments: AdminQuotaAssignment[];\n };\n}\n\n/** Quotas AssetHandler enforces, with admin-facing labels. */\nexport const ASSETHANDLER_QUOTAS: ReadonlyArray<{ name: string; label: string }> = [\n { name: 'assethandler.assets.count', label: 'Active assets (asset limit)' },\n { name: 'assethandler.work_orders.open', label: 'Open work orders' },\n { name: 'assethandler.cmdb.configuration_items', label: 'CMDB configuration items' },\n { name: 'assethandler.discovery.jobs.monthly', label: 'Discovery jobs / month' },\n { name: 'assethandler.incidents.monthly', label: 'Incidents / month' },\n { name: 'assethandler.maintenance_records.monthly', label: 'Maintenance records / month' },\n { name: 'assethandler.knowledge_articles.monthly', label: 'Knowledge articles / month' },\n { name: 'assethandler.esg_metrics.monthly', label: 'ESG metrics / month' },\n];\n\n/** Human label for a quota name; falls back to the raw name for unknown ones. */\nexport function quotaLabel(name: string): string {\n return ASSETHANDLER_QUOTAS.find((quota) => quota.name === name)?.label ?? name;\n}\n\n/** One line per quota: every active plan row for that quota folded together. */\nexport interface QuotaSummary {\n quotaName: string;\n label: string;\n /** Effective limit; `null` when the quota is unlimited. */\n limit: number | null;\n unlimited: boolean;\n used: number;\n resetPeriod: string;\n}\n\n/**\n * Fold a workspace's active quota assignments into one line per quota.\n *\n * A workspace can hold several active assignments for the same quota (one per\n * subscription). The quota service enforces their combined total: the limits\n * add up, and any unlimited assignment makes the whole quota unlimited. This\n * mirrors that rule so the admin sees the limit that is actually enforced, not\n * a row per subscription. Quotas AssetHandler knows come first, in a stable\n * order; anything else follows alphabetically.\n */\nexport function summarizeQuotas(assignments: readonly AdminQuotaAssignment[]): QuotaSummary[] {\n const byQuota = new Map<string, AdminQuotaAssignment[]>();\n for (const assignment of assignments) {\n if (!assignment.isActive) continue;\n const rows = byQuota.get(assignment.quotaName);\n if (rows) rows.push(assignment);\n else byQuota.set(assignment.quotaName, [assignment]);\n }\n\n const known = ASSETHANDLER_QUOTAS.map((quota) => quota.name);\n const names = [\n ...known.filter((name) => byQuota.has(name)),\n ...[...byQuota.keys()].filter((name) => !known.includes(name)).sort(),\n ];\n\n return names.map((quotaName) => {\n const rows = byQuota.get(quotaName) ?? [];\n const unlimited = rows.some((row) => row.noLimit || row.limit === null);\n return {\n quotaName,\n label: quotaLabel(quotaName),\n limit: unlimited ? null : rows.reduce((sum, row) => sum + (row.limit ?? 0), 0),\n unlimited,\n used: rows.reduce((sum, row) => sum + row.used, 0),\n resetPeriod: [...new Set(rows.map((row) => row.resetPeriod))].join(' / '),\n };\n });\n}\n"],"mappings":";;AASA,IAAaA,IAAwB,CAAG;;;;;;;;;;;;GAc3BC,IAAsB,CAAG;;;;;;;;;;;;GAczBC,IAAuB,CAAG;;;;;;;;;;;;;;;;;GAmB1BC,IAA4B,CAAG;;;;;;;;;;GAY/BC,IAA+B,CAAG;;;;GAmDlCC,IAAsE;CACjF;EAAE,MAAM;EAA6B,OAAO;CAA8B;CAC1E;EAAE,MAAM;EAAiC,OAAO;CAAmB;CACnE;EAAE,MAAM;EAAyC,OAAO;CAA2B;CACnF;EAAE,MAAM;EAAuC,OAAO;CAAyB;CAC/E;EAAE,MAAM;EAAkC,OAAO;CAAoB;CACrE;EAAE,MAAM;EAA4C,OAAO;CAA8B;CACzF;EAAE,MAAM;EAA2C,OAAO;CAA6B;CACvF;EAAE,MAAM;EAAoC,OAAO;CAAsB;AAC3E;AAGA,SAAgBC,EAAW,GAAsB;CAC/C,OAAOD,EAAoB,MAAM,MAAUE,EAAM,SAASC,CAAI,CAAC,EAAE,SAASA;AAC5E;AAuBA,SAAgBC,EAAgB,GAA8D;CAC5F,IAAMC,oBAAU,IAAI,IAAoC;CACxD,KAAK,IAAMC,KAAcC,GAAa;EACpC,IAAI,CAACD,EAAW,UAAU;EAC1B,IAAME,IAAOH,EAAQ,IAAIC,EAAW,SAAS;EAC7C,AAAIE,IAAMA,EAAK,KAAKF,CAAU,IACzBD,EAAQ,IAAIC,EAAW,WAAW,CAACA,CAAU,CAAC;CACrD;CAEA,IAAMG,IAAQT,EAAoB,KAAK,MAAUE,EAAM,IAAI;CAM3D,OAAO,CAJL,GAAGO,EAAM,QAAQ,MAASJ,EAAQ,IAAIF,CAAI,CAAC,GAC3C,GAAG,CAAC,GAAGE,EAAQ,KAAK,CAAC,CAAC,CAAC,QAAQ,MAAS,CAACI,EAAM,SAASN,CAAI,CAAC,CAAC,CAAC,KAAK,CAG/D,CAAA,CAAM,KAAK,MAAc;EAC9B,IAAMK,IAAOH,EAAQ,IAAIK,CAAS,KAAK,CAAC,GAClCC,IAAYH,EAAK,MAAM,MAAQI,EAAI,WAAWA,EAAI,UAAU,IAAI;EACtE,OAAO;GACL;GACA,OAAOX,EAAWS,CAAS;GAC3B,OAAOC,IAAY,OAAOH,EAAK,QAAQ,GAAK,MAAQK,KAAOD,EAAI,SAAS,IAAI,CAAC;GAC7E;GACA,MAAMJ,EAAK,QAAQ,GAAK,MAAQK,IAAMD,EAAI,MAAM,CAAC;GACjD,aAAa,CAAC,GAAG,IAAI,IAAIJ,EAAK,KAAK,MAAQI,EAAI,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK;EAC1E;CACF,CAAC;AACH"}
@@ -12,5 +12,4 @@ export interface ActivityTimelineProps {
12
12
  /** Optional cap on rows shown. Defaults to 20. */
13
13
  limit?: number;
14
14
  }
15
- export declare function ActivityTimeline({ resourceId, limit }: ActivityTimelineProps): import("react").JSX.Element;
16
- //# sourceMappingURL=ActivityTimeline.d.ts.map
15
+ export declare function ActivityTimeline({ resourceId, limit }: ActivityTimelineProps): import('react').JSX.Element;
@@ -7,7 +7,7 @@ import { gql as h } from "@apollo/client";
7
7
  import { useQuery as g } from "@apollo/client/react";
8
8
  import { jsx as _, jsxs as v } from "react/jsx-runtime";
9
9
  import { Card as y, CardContent as b, CardHeader as x, CardTitle as S, IllustratedEmptyState as C } from "@burdenoff/fe-libs/ui";
10
- //#region src/assethandler/components/ActivityTimeline.tsx
10
+ // src/assethandler/components/ActivityTimeline.tsx
11
11
  var w = h`
12
12
  query AssetHandlerResourceActivities($filter: ActivityLogFilter) {
13
13
  getActivities(filter: $filter) {
@@ -154,11 +154,11 @@ function k({ resourceId: i, limit: a = 20 }) {
154
154
  }) : /* @__PURE__ */ _("ol", {
155
155
  className: "space-y-1",
156
156
  children: u.map((e, t) => {
157
- let { Icon: n, tone: r } = D(e.action), i = E[r];
157
+ let { Icon: n, tone: r } = D(e.action), i = E[r], a = t === u.length - 1;
158
158
  return /* @__PURE__ */ v("li", {
159
159
  className: "relative flex gap-3 pb-3",
160
160
  children: [
161
- t === u.length - 1 ? null : /* @__PURE__ */ _("span", {
161
+ a ? null : /* @__PURE__ */ _("span", {
162
162
  className: "absolute left-[0.9375rem] top-8 h-[calc(100%-1rem)] w-px bg-border-subtle",
163
163
  "aria-hidden": "true"
164
164
  }),
@@ -202,7 +202,6 @@ function k({ resourceId: i, limit: a = 20 }) {
202
202
  })
203
203
  }) })] });
204
204
  }
205
- //#endregion
206
205
  export { k as ActivityTimeline };
207
206
 
208
207
  //# sourceMappingURL=ActivityTimeline.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ActivityTimeline.js","names":[],"sources":["../../../src/assethandler/components/ActivityTimeline.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Activity,\n Plus,\n Pencil,\n Trash2,\n CheckCircle2,\n LogOut,\n LogIn,\n RefreshCw,\n Paperclip,\n MessageSquare,\n Wrench,\n ShieldAlert,\n} from 'lucide-react';\nimport { useAssetHandler } from '../providers/AssetHandlerProvider';\nimport { Sparkline } from './charts';\n\n/**\n * Recent activity for a single AssetHandler resource, sourced from the\n * federated wspace-activity-svc `getActivities` query (fed by be-sdk\n * `trackOperation` on the backend). Read-only, with a graceful empty state.\n *\n * The header carries an activity-volume sparkline bucketed from the real\n * timestamps — it only renders when there is enough history to be meaningful,\n * never fabricated.\n */\nexport interface ActivityTimelineProps {\n resourceId: string;\n /** Optional cap on rows shown. Defaults to 20. */\n limit?: number;\n}\n\ninterface ActivityLogNode {\n id: string;\n action: string;\n description?: string | null;\n timestamp: string;\n userId: string;\n resourceType?: string | null;\n}\n\ninterface GetActivitiesResult {\n getActivities: ActivityLogNode[];\n}\n\nconst GET_ACTIVITIES_QUERY = gql`\n query AssetHandlerResourceActivities($filter: ActivityLogFilter) {\n getActivities(filter: $filter) {\n id\n action\n description\n timestamp\n userId\n resourceType\n }\n }\n`;\n\n/** Compact relative time (\"2 hrs ago\"), with the full timestamp on hover. */\nfunction relativeTime(iso: string): string {\n const then = new Date(iso).getTime();\n if (Number.isNaN(then)) return '';\n const diff = Date.now() - then;\n const sec = Math.round(diff / 1000);\n if (sec < 45) return 'just now';\n const min = Math.round(sec / 60);\n if (min < 60) return `${min} min ago`;\n const hr = Math.round(min / 60);\n if (hr < 24) return `${hr} hr${hr === 1 ? '' : 's'} ago`;\n const day = Math.round(hr / 24);\n if (day < 30) return `${day} day${day === 1 ? '' : 's'} ago`;\n return new Date(iso).toLocaleDateString();\n}\n\ntype Tone = 'success' | 'info' | 'warning' | 'error' | 'neutral';\n\nconst TONE_CLASS: Record<Tone, { icon: string; tile: string }> = {\n success: { icon: 'text-status-success-text', tile: 'bg-status-success-bg-subtle' },\n info: { icon: 'text-status-info-text', tile: 'bg-status-info-bg-subtle' },\n warning: { icon: 'text-status-warning-text', tile: 'bg-status-warning-bg-subtle' },\n error: { icon: 'text-status-error-text', tile: 'bg-status-error-bg-subtle' },\n neutral: { icon: 'text-text-secondary', tile: 'bg-bg-sunken' },\n};\n\n/** Map an activity action verb to a node icon + status tone. */\nfunction actionVisual(action: string): { Icon: typeof Activity; tone: Tone } {\n const a = action.toLowerCase();\n if (/(complete|resolve|close|done|approve|pass|success)/.test(a))\n return { Icon: CheckCircle2, tone: 'success' };\n if (/(delete|remove|dispose|retire|archive|reject|fail)/.test(a))\n return { Icon: Trash2, tone: 'error' };\n if (/(check[_.\\s]?out|assign|issue|lend)/.test(a)) return { Icon: LogOut, tone: 'warning' };\n if (/(check[_.\\s]?in|return|receive)/.test(a)) return { Icon: LogIn, tone: 'success' };\n if (/(maintenance|repair|service|calibrat)/.test(a)) return { Icon: Wrench, tone: 'warning' };\n if (/(incident|breach|alert|violation|risk|security)/.test(a))\n return { Icon: ShieldAlert, tone: 'error' };\n if (/(upload|attach|file)/.test(a)) return { Icon: Paperclip, tone: 'info' };\n if (/(comment|note|reply|discuss)/.test(a)) return { Icon: MessageSquare, tone: 'info' };\n if (/(create|add|new|register|provision)/.test(a)) return { Icon: Plus, tone: 'success' };\n if (/(update|edit|change|modify|revise|status)/.test(a)) return { Icon: Pencil, tone: 'info' };\n if (/(sync|refresh|move|transfer|relocat)/.test(a)) return { Icon: RefreshCw, tone: 'info' };\n return { Icon: Activity, tone: 'neutral' };\n}\n\nfunction titleize(action: string): string {\n const s = action.replace(/[._]/g, ' ').trim();\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nexport function ActivityTimeline({ resourceId, limit = 20 }: ActivityTimelineProps) {\n const { workspaceId, currentUser } = useAssetHandler();\n\n const { data, loading } = useQuery<GetActivitiesResult>(GET_ACTIVITIES_QUERY, {\n variables: {\n filter: {\n resourceId,\n resourceType: 'asset',\n productId: 'assethandler',\n ...(workspaceId ? { workspaceId } : {}),\n limit,\n },\n },\n fetchPolicy: 'cache-and-network',\n errorPolicy: 'all',\n skip: !resourceId,\n });\n\n const activities = useMemo(() => data?.getActivities ?? [], [data]);\n\n // Bucket real timestamps into per-day volume for a header sparkline. Only\n // meaningful when there is enough history spanning multiple days — otherwise\n // we omit it rather than draw a flat/fabricated line.\n const volumeSeries = useMemo(() => {\n if (activities.length < 6) return null;\n const DAYS = 14;\n const now = new Date();\n const startOfToday = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();\n const buckets = new Array<number>(DAYS).fill(0);\n let distinctDays = 0;\n const seen = new Set<number>();\n for (const item of activities) {\n const t = new Date(item.timestamp).getTime();\n if (Number.isNaN(t)) continue;\n const dayIndex = DAYS - 1 - Math.floor((startOfToday - t) / 86_400_000);\n if (dayIndex >= 0 && dayIndex < DAYS) {\n buckets[dayIndex] += 1;\n const dayKey = Math.floor(t / 86_400_000);\n if (!seen.has(dayKey)) {\n seen.add(dayKey);\n distinctDays += 1;\n }\n }\n }\n return distinctDays >= 3 ? buckets : null;\n }, [activities]);\n\n const actorLabel = (userId: string): string =>\n currentUser?.id && userId === currentUser.id\n ? currentUser.name ||\n [currentUser.firstName, currentUser.lastName].filter(Boolean).join(' ') ||\n currentUser.username ||\n currentUser.email?.split('@')[0] ||\n 'You'\n : userId === 'system' || userId === 'SYSTEM'\n ? 'System'\n : `Member ${userId.slice(0, 6)}`;\n\n return (\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between gap-3 space-y-0\">\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Activity className=\"h-4 w-4\" />\n Activity\n </CardTitle>\n {volumeSeries ? (\n <div className=\"flex items-center gap-2\" title=\"Activity over the last 14 days\">\n <span className=\"hidden text-xs text-text-secondary sm:inline\">Last 14 days</span>\n <Sparkline\n data={volumeSeries}\n type=\"area\"\n height={28}\n className=\"w-24\"\n ariaLabel=\"Activity volume over the last 14 days\"\n />\n </div>\n ) : null}\n </CardHeader>\n <CardContent>\n {loading && activities.length === 0 ? (\n <div className=\"space-y-2\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div\n key={i}\n className=\"h-12 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer\"\n />\n ))}\n </div>\n ) : activities.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-notifications\"\n title=\"No activity yet\"\n description=\"Changes to this record — updates, status changes and assignments — will show up here.\"\n />\n ) : (\n <ol className=\"space-y-1\">\n {activities.map((item, index) => {\n const { Icon, tone } = actionVisual(item.action);\n const tc = TONE_CLASS[tone];\n const isLast = index === activities.length - 1;\n return (\n <li key={item.id} className=\"relative flex gap-3 pb-3\">\n {/* Connector line between nodes. */}\n {!isLast ? (\n <span\n className=\"absolute left-[0.9375rem] top-8 h-[calc(100%-1rem)] w-px bg-border-subtle\"\n aria-hidden=\"true\"\n />\n ) : null}\n <span\n className={`relative z-10 flex h-8 w-8 shrink-0 items-center justify-center rounded-full ${tc.tile}`}\n aria-hidden=\"true\"\n >\n <Icon className={`h-4 w-4 ${tc.icon}`} />\n </span>\n <div className=\"min-w-0 flex-1 pt-0.5\">\n <p className=\"text-sm font-medium text-text-primary\">{titleize(item.action)}</p>\n {item.description ? (\n <p className=\"truncate text-sm text-text-secondary\" title={item.description}>\n {item.description}\n </p>\n ) : null}\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n <span className=\"font-medium text-text-secondary\">\n {actorLabel(item.userId)}\n </span>{' '}\n ·{' '}\n <span title={new Date(item.timestamp).toLocaleString()}>\n {relativeTime(item.timestamp)}\n </span>\n </p>\n </div>\n </li>\n );\n })}\n </ol>\n )}\n </CardContent>\n </Card>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ActivityTimeline.js","names":["GET_ACTIVITIES_QUERY","relativeTime","then","iso","diff","sec","min","hr","day","TONE_CLASS","actionVisual","a","action","CheckCircle2","Trash2","LogOut","LogIn","Wrench","ShieldAlert","Paperclip","MessageSquare","Plus","Pencil","RefreshCw","Activity","titleize","s","ActivityTimeline","useAssetHandler","useQuery","workspaceId","resourceId","activities","useMemo","data","volumeSeries","now","startOfToday","buckets","distinctDays","seen","item","t","dayIndex","dayKey","actorLabel","currentUser","userId","Card","CardHeader","CardTitle","Sparkline","CardContent","loading","i","IllustratedEmptyState","tc","tone","isLast","index","Icon"],"sources":["../../../src/assethandler/components/ActivityTimeline.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Activity,\n Plus,\n Pencil,\n Trash2,\n CheckCircle2,\n LogOut,\n LogIn,\n RefreshCw,\n Paperclip,\n MessageSquare,\n Wrench,\n ShieldAlert,\n} from 'lucide-react';\nimport { useAssetHandler } from '../providers/AssetHandlerProvider';\nimport { Sparkline } from './charts';\n\n/**\n * Recent activity for a single AssetHandler resource, sourced from the\n * federated wspace-activity-svc `getActivities` query (fed by be-sdk\n * `trackOperation` on the backend). Read-only, with a graceful empty state.\n *\n * The header carries an activity-volume sparkline bucketed from the real\n * timestamps — it only renders when there is enough history to be meaningful,\n * never fabricated.\n */\nexport interface ActivityTimelineProps {\n resourceId: string;\n /** Optional cap on rows shown. Defaults to 20. */\n limit?: number;\n}\n\ninterface ActivityLogNode {\n id: string;\n action: string;\n description?: string | null;\n timestamp: string;\n userId: string;\n resourceType?: string | null;\n}\n\ninterface GetActivitiesResult {\n getActivities: ActivityLogNode[];\n}\n\nconst GET_ACTIVITIES_QUERY = gql`\n query AssetHandlerResourceActivities($filter: ActivityLogFilter) {\n getActivities(filter: $filter) {\n id\n action\n description\n timestamp\n userId\n resourceType\n }\n }\n`;\n\n/** Compact relative time (\"2 hrs ago\"), with the full timestamp on hover. */\nfunction relativeTime(iso: string): string {\n const then = new Date(iso).getTime();\n if (Number.isNaN(then)) return '';\n const diff = Date.now() - then;\n const sec = Math.round(diff / 1000);\n if (sec < 45) return 'just now';\n const min = Math.round(sec / 60);\n if (min < 60) return `${min} min ago`;\n const hr = Math.round(min / 60);\n if (hr < 24) return `${hr} hr${hr === 1 ? '' : 's'} ago`;\n const day = Math.round(hr / 24);\n if (day < 30) return `${day} day${day === 1 ? '' : 's'} ago`;\n return new Date(iso).toLocaleDateString();\n}\n\ntype Tone = 'success' | 'info' | 'warning' | 'error' | 'neutral';\n\nconst TONE_CLASS: Record<Tone, { icon: string; tile: string }> = {\n success: { icon: 'text-status-success-text', tile: 'bg-status-success-bg-subtle' },\n info: { icon: 'text-status-info-text', tile: 'bg-status-info-bg-subtle' },\n warning: { icon: 'text-status-warning-text', tile: 'bg-status-warning-bg-subtle' },\n error: { icon: 'text-status-error-text', tile: 'bg-status-error-bg-subtle' },\n neutral: { icon: 'text-text-secondary', tile: 'bg-bg-sunken' },\n};\n\n/** Map an activity action verb to a node icon + status tone. */\nfunction actionVisual(action: string): { Icon: typeof Activity; tone: Tone } {\n const a = action.toLowerCase();\n if (/(complete|resolve|close|done|approve|pass|success)/.test(a))\n return { Icon: CheckCircle2, tone: 'success' };\n if (/(delete|remove|dispose|retire|archive|reject|fail)/.test(a))\n return { Icon: Trash2, tone: 'error' };\n if (/(check[_.\\s]?out|assign|issue|lend)/.test(a)) return { Icon: LogOut, tone: 'warning' };\n if (/(check[_.\\s]?in|return|receive)/.test(a)) return { Icon: LogIn, tone: 'success' };\n if (/(maintenance|repair|service|calibrat)/.test(a)) return { Icon: Wrench, tone: 'warning' };\n if (/(incident|breach|alert|violation|risk|security)/.test(a))\n return { Icon: ShieldAlert, tone: 'error' };\n if (/(upload|attach|file)/.test(a)) return { Icon: Paperclip, tone: 'info' };\n if (/(comment|note|reply|discuss)/.test(a)) return { Icon: MessageSquare, tone: 'info' };\n if (/(create|add|new|register|provision)/.test(a)) return { Icon: Plus, tone: 'success' };\n if (/(update|edit|change|modify|revise|status)/.test(a)) return { Icon: Pencil, tone: 'info' };\n if (/(sync|refresh|move|transfer|relocat)/.test(a)) return { Icon: RefreshCw, tone: 'info' };\n return { Icon: Activity, tone: 'neutral' };\n}\n\nfunction titleize(action: string): string {\n const s = action.replace(/[._]/g, ' ').trim();\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nexport function ActivityTimeline({ resourceId, limit = 20 }: ActivityTimelineProps) {\n const { workspaceId, currentUser } = useAssetHandler();\n\n const { data, loading } = useQuery<GetActivitiesResult>(GET_ACTIVITIES_QUERY, {\n variables: {\n filter: {\n resourceId,\n resourceType: 'asset',\n productId: 'assethandler',\n ...(workspaceId ? { workspaceId } : {}),\n limit,\n },\n },\n fetchPolicy: 'cache-and-network',\n errorPolicy: 'all',\n skip: !resourceId,\n });\n\n const activities = useMemo(() => data?.getActivities ?? [], [data]);\n\n // Bucket real timestamps into per-day volume for a header sparkline. Only\n // meaningful when there is enough history spanning multiple days — otherwise\n // we omit it rather than draw a flat/fabricated line.\n const volumeSeries = useMemo(() => {\n if (activities.length < 6) return null;\n const DAYS = 14;\n const now = new Date();\n const startOfToday = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();\n const buckets = new Array<number>(DAYS).fill(0);\n let distinctDays = 0;\n const seen = new Set<number>();\n for (const item of activities) {\n const t = new Date(item.timestamp).getTime();\n if (Number.isNaN(t)) continue;\n const dayIndex = DAYS - 1 - Math.floor((startOfToday - t) / 86_400_000);\n if (dayIndex >= 0 && dayIndex < DAYS) {\n buckets[dayIndex] += 1;\n const dayKey = Math.floor(t / 86_400_000);\n if (!seen.has(dayKey)) {\n seen.add(dayKey);\n distinctDays += 1;\n }\n }\n }\n return distinctDays >= 3 ? buckets : null;\n }, [activities]);\n\n const actorLabel = (userId: string): string =>\n currentUser?.id && userId === currentUser.id\n ? currentUser.name ||\n [currentUser.firstName, currentUser.lastName].filter(Boolean).join(' ') ||\n currentUser.username ||\n currentUser.email?.split('@')[0] ||\n 'You'\n : userId === 'system' || userId === 'SYSTEM'\n ? 'System'\n : `Member ${userId.slice(0, 6)}`;\n\n return (\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between gap-3 space-y-0\">\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Activity className=\"h-4 w-4\" />\n Activity\n </CardTitle>\n {volumeSeries ? (\n <div className=\"flex items-center gap-2\" title=\"Activity over the last 14 days\">\n <span className=\"hidden text-xs text-text-secondary sm:inline\">Last 14 days</span>\n <Sparkline\n data={volumeSeries}\n type=\"area\"\n height={28}\n className=\"w-24\"\n ariaLabel=\"Activity volume over the last 14 days\"\n />\n </div>\n ) : null}\n </CardHeader>\n <CardContent>\n {loading && activities.length === 0 ? (\n <div className=\"space-y-2\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div\n key={i}\n className=\"h-12 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer\"\n />\n ))}\n </div>\n ) : activities.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-notifications\"\n title=\"No activity yet\"\n description=\"Changes to this record — updates, status changes and assignments — will show up here.\"\n />\n ) : (\n <ol className=\"space-y-1\">\n {activities.map((item, index) => {\n const { Icon, tone } = actionVisual(item.action);\n const tc = TONE_CLASS[tone];\n const isLast = index === activities.length - 1;\n return (\n <li key={item.id} className=\"relative flex gap-3 pb-3\">\n {/* Connector line between nodes. */}\n {!isLast ? (\n <span\n className=\"absolute left-[0.9375rem] top-8 h-[calc(100%-1rem)] w-px bg-border-subtle\"\n aria-hidden=\"true\"\n />\n ) : null}\n <span\n className={`relative z-10 flex h-8 w-8 shrink-0 items-center justify-center rounded-full ${tc.tile}`}\n aria-hidden=\"true\"\n >\n <Icon className={`h-4 w-4 ${tc.icon}`} />\n </span>\n <div className=\"min-w-0 flex-1 pt-0.5\">\n <p className=\"text-sm font-medium text-text-primary\">{titleize(item.action)}</p>\n {item.description ? (\n <p className=\"truncate text-sm text-text-secondary\" title={item.description}>\n {item.description}\n </p>\n ) : null}\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n <span className=\"font-medium text-text-secondary\">\n {actorLabel(item.userId)}\n </span>{' '}\n ·{' '}\n <span title={new Date(item.timestamp).toLocaleString()}>\n {relativeTime(item.timestamp)}\n </span>\n </p>\n </div>\n </li>\n );\n })}\n </ol>\n )}\n </CardContent>\n </Card>\n );\n}\n"],"mappings":"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"}
@@ -16,5 +16,4 @@ export interface AssetTagProps {
16
16
  * inline styles (plus Tailwind utility classes) so the print document only needs
17
17
  * the base Tailwind reset to look correct.
18
18
  */
19
- export declare function AssetTag({ name, tagId, assetTag, category }: AssetTagProps): import("react").JSX.Element;
20
- //# sourceMappingURL=AssetTag.d.ts.map
19
+ export declare function AssetTag({ name, tagId, assetTag, category }: AssetTagProps): import('react').JSX.Element;
@@ -3,6 +3,5 @@ import { require_browser as e } from "../../node_modules/qrcode/lib/browser.js";
3
3
  import "react";
4
4
  import "react/jsx-runtime";
5
5
  e();
6
- //#endregion
7
6
 
8
7
  //# sourceMappingURL=AssetTag.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AssetTag.js","names":[],"sources":["../../../src/assethandler/components/AssetTag.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport QRCode from 'qrcode';\n\nexport interface AssetTagProps {\n /** Human-readable asset name. */\n name: string;\n /** The scannable tagId (stable, workspace-unique). */\n tagId: string;\n /** Display value for the legacy asset tag / asset number. */\n assetTag: string;\n /** Optional category label shown beneath the name. */\n category?: string;\n}\n\n/**\n * Printable asset tag with a QR code encoding the tagId.\n *\n * The component is intentionally self-contained so it can be rendered inside\n * a print window without pulling in the rest of the application shell. It uses\n * inline styles (plus Tailwind utility classes) so the print document only needs\n * the base Tailwind reset to look correct.\n */\nexport function AssetTag({ name, tagId, assetTag, category }: AssetTagProps) {\n const [dataUrl, setDataUrl] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n void QRCode.toDataURL(tagId, {\n width: 160,\n margin: 2,\n type: 'image/png',\n errorCorrectionLevel: 'M',\n }).then((url) => {\n if (!cancelled) setDataUrl(url);\n });\n return () => {\n cancelled = true;\n };\n }, [tagId]);\n\n return (\n <div className=\"inline-flex flex-col items-center gap-3 rounded-lg border border-border-seam bg-bg-elevated p-5 shadow-sm\">\n <div className=\"text-center\">\n <p className=\"text-base font-semibold text-text-primary\">{name}</p>\n {category ? <p className=\"text-xs capitalize text-text-secondary\">{category}</p> : null}\n </div>\n\n {dataUrl ? (\n <img src={dataUrl} alt={`QR code for asset tag ${assetTag}`} className=\"h-40 w-40\" />\n ) : (\n <div className=\"h-40 w-40 animate-pulse rounded-md bg-bg-sunken\" />\n )}\n\n <div className=\"text-center\">\n <p className=\"font-mono text-sm font-medium text-text-primary\">{assetTag}</p>\n <p className=\"font-mono text-[10px] text-text-secondary\">{tagId}</p>\n </div>\n </div>\n );\n}\n"],"mappings":""}
1
+ {"version":3,"file":"AssetTag.js","names":["require_browser"],"sources":["../../../src/assethandler/components/AssetTag.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport QRCode from 'qrcode';\n\nexport interface AssetTagProps {\n /** Human-readable asset name. */\n name: string;\n /** The scannable tagId (stable, workspace-unique). */\n tagId: string;\n /** Display value for the legacy asset tag / asset number. */\n assetTag: string;\n /** Optional category label shown beneath the name. */\n category?: string;\n}\n\n/**\n * Printable asset tag with a QR code encoding the tagId.\n *\n * The component is intentionally self-contained so it can be rendered inside\n * a print window without pulling in the rest of the application shell. It uses\n * inline styles (plus Tailwind utility classes) so the print document only needs\n * the base Tailwind reset to look correct.\n */\nexport function AssetTag({ name, tagId, assetTag, category }: AssetTagProps) {\n const [dataUrl, setDataUrl] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n void QRCode.toDataURL(tagId, {\n width: 160,\n margin: 2,\n type: 'image/png',\n errorCorrectionLevel: 'M',\n }).then((url) => {\n if (!cancelled) setDataUrl(url);\n });\n return () => {\n cancelled = true;\n };\n }, [tagId]);\n\n return (\n <div className=\"inline-flex flex-col items-center gap-3 rounded-lg border border-border-seam bg-bg-elevated p-5 shadow-sm\">\n <div className=\"text-center\">\n <p className=\"text-base font-semibold text-text-primary\">{name}</p>\n {category ? <p className=\"text-xs capitalize text-text-secondary\">{category}</p> : null}\n </div>\n\n {dataUrl ? (\n <img src={dataUrl} alt={`QR code for asset tag ${assetTag}`} className=\"h-40 w-40\" />\n ) : (\n <div className=\"h-40 w-40 animate-pulse rounded-md bg-bg-sunken\" />\n )}\n\n <div className=\"text-center\">\n <p className=\"font-mono text-sm font-medium text-text-primary\">{assetTag}</p>\n <p className=\"font-mono text-[10px] text-text-secondary\">{tagId}</p>\n </div>\n </div>\n );\n}\n"],"mappings":""}
@@ -13,5 +13,4 @@ export interface AttachmentsPanelProps {
13
13
  entityType: string;
14
14
  entityId: string;
15
15
  }
16
- export declare function AttachmentsPanel({ entityType, entityId }: AttachmentsPanelProps): import("react").JSX.Element;
17
- //# sourceMappingURL=AttachmentsPanel.d.ts.map
16
+ export declare function AttachmentsPanel({ entityType, entityId }: AttachmentsPanelProps): import('react').JSX.Element;
@@ -5,7 +5,7 @@ import { gql as v } from "@apollo/client";
5
5
  import { useMutation as y, useQuery as b } from "@apollo/client/react";
6
6
  import { jsx as x, jsxs as S } from "react/jsx-runtime";
7
7
  import { Button as C, Card as w, CardContent as T, CardHeader as E, CardTitle as D, DropdownMenu as O, DropdownMenuContent as k, DropdownMenuItem as A, DropdownMenuTrigger as j, IllustratedEmptyState as M } from "@burdenoff/fe-libs/ui";
8
- //#region src/assethandler/components/AttachmentsPanel.tsx
8
+ // src/assethandler/components/AttachmentsPanel.tsx
9
9
  var N = v`
10
10
  query AssetHandlerGetFiles($pagination: PaginationInput, $sort: FileSortInput) {
11
11
  getFiles(pagination: $pagination, sort: $sort) {
@@ -372,7 +372,6 @@ function U({ entityType: a, entityId: o }) {
372
372
  ]
373
373
  })] });
374
374
  }
375
- //#endregion
376
375
  export { U as AttachmentsPanel };
377
376
 
378
377
  //# sourceMappingURL=AttachmentsPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AttachmentsPanel.js","names":[],"sources":["../../../src/assethandler/components/AttachmentsPanel.tsx"],"sourcesContent":["import { useMemo, useRef, useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n IllustratedEmptyState,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Paperclip,\n Upload,\n Link2,\n FileText,\n FileSpreadsheet,\n FileArchive,\n FileCode2,\n FileVideo,\n FileAudio,\n Image as ImageIcon,\n File as FileIcon,\n Loader2,\n Download,\n MoreHorizontal,\n} from 'lucide-react';\nimport { notify } from '../utils/toast';\n\n/**\n * Attach and reference files for an AssetHandler entity, backed by the\n * federated wspace-files-svc (same wspace gateway/Apollo client). Fully real (no fabricated data) —\n * lists workspace files via `getFiles`, uploads new files through the\n * `initiateUpload` → presigned PUT → `completeUpload` flow, and mints public\n * share links via `createFileShareLink`. All entries are live data.\n *\n * `entityType`/`entityId` scope the panel to the record it is mounted on and\n * are used for context labelling; uploaded files land in the workspace file\n * store so they can be shared and reused.\n */\nexport interface AttachmentsPanelProps {\n entityType: string;\n entityId: string;\n}\n\ninterface FileNode {\n id: string;\n name: string;\n extension: string;\n mimeType: string;\n size: number;\n downloadUrl?: string | null;\n createdAt: string;\n}\n\ninterface GetFilesResult {\n getFiles: {\n files: FileNode[];\n total: number;\n hasMore: boolean;\n };\n}\n\nconst GET_FILES_QUERY = gql`\n query AssetHandlerGetFiles($pagination: PaginationInput, $sort: FileSortInput) {\n getFiles(pagination: $pagination, sort: $sort) {\n total\n hasMore\n files {\n id\n name\n extension\n mimeType\n size\n downloadUrl\n createdAt\n }\n }\n }\n`;\n\nconst INITIATE_UPLOAD_MUTATION = gql`\n mutation AssetHandlerInitiateUpload($input: InitiateUploadInput!) {\n initiateUpload(input: $input) {\n uploadUrl\n session {\n id\n }\n }\n }\n`;\n\nconst COMPLETE_UPLOAD_MUTATION = gql`\n mutation AssetHandlerCompleteUpload($input: CompleteUploadInput!) {\n completeUpload(input: $input) {\n fileId\n file {\n id\n name\n }\n }\n }\n`;\n\nconst CREATE_SHARE_LINK_MUTATION = gql`\n mutation AssetHandlerCreateFileShareLink($input: CreateShareGrantLinkInput!) {\n createFileShareLink(input: $input) {\n id\n shareUrl\n }\n }\n`;\n\nfunction formatSize(bytes: number): string {\n if (!bytes) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB'];\n const exponent = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1);\n const value = bytes / Math.pow(1024, exponent);\n return `${value.toFixed(exponent === 0 ? 0 : 1)} ${units[exponent]}`;\n}\n\nfunction extensionOf(fileName: string): string {\n const dot = fileName.lastIndexOf('.');\n return dot >= 0 ? fileName.slice(dot + 1).toLowerCase() : 'bin';\n}\n\n/** Compact relative time (\"2 hrs ago\"), with the full timestamp on hover. */\nfunction relativeTime(iso: string): string {\n const then = new Date(iso).getTime();\n if (Number.isNaN(then)) return '';\n const diff = Date.now() - then;\n const sec = Math.round(diff / 1000);\n if (sec < 45) return 'just now';\n const min = Math.round(sec / 60);\n if (min < 60) return `${min} min ago`;\n const hr = Math.round(min / 60);\n if (hr < 24) return `${hr} hr${hr === 1 ? '' : 's'} ago`;\n const day = Math.round(hr / 24);\n if (day < 30) return `${day} day${day === 1 ? '' : 's'} ago`;\n return new Date(iso).toLocaleDateString();\n}\n\ntype FileKind =\n | 'image'\n | 'pdf'\n | 'sheet'\n | 'doc'\n | 'archive'\n | 'code'\n | 'video'\n | 'audio'\n | 'other';\n\n/** Map a file's extension/mime to a recognisable kind for icon + tint. */\nfunction kindOf(file: FileNode): FileKind {\n const mime = (file.mimeType || '').toLowerCase();\n const ext = (file.extension || extensionOf(file.name)).toLowerCase();\n if (\n mime.startsWith('image/') ||\n ['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'avif', 'bmp'].includes(ext)\n )\n return 'image';\n if (mime.startsWith('video/') || ['mp4', 'mov', 'webm', 'avi', 'mkv'].includes(ext))\n return 'video';\n if (mime.startsWith('audio/') || ['mp3', 'wav', 'ogg', 'm4a', 'flac'].includes(ext))\n return 'audio';\n if (mime === 'application/pdf' || ext === 'pdf') return 'pdf';\n if (['xls', 'xlsx', 'csv', 'tsv', 'ods'].includes(ext)) return 'sheet';\n if (['zip', 'rar', '7z', 'tar', 'gz', 'bz2'].includes(ext)) return 'archive';\n if (\n [\n 'js',\n 'ts',\n 'tsx',\n 'jsx',\n 'json',\n 'xml',\n 'yml',\n 'yaml',\n 'html',\n 'css',\n 'sh',\n 'py',\n 'sql',\n ].includes(ext)\n )\n return 'code';\n if (['doc', 'docx', 'txt', 'md', 'rtf', 'odt', 'pages'].includes(ext)) return 'doc';\n return 'other';\n}\n\nconst KIND_STYLE: Record<\n FileKind,\n { Icon: typeof FileText; iconClass: string; tileClass: string }\n> = {\n image: {\n Icon: ImageIcon,\n iconClass: 'text-status-success-text',\n tileClass: 'bg-status-success-bg-subtle',\n },\n pdf: {\n Icon: FileText,\n iconClass: 'text-status-error-text',\n tileClass: 'bg-status-error-bg-subtle',\n },\n sheet: {\n Icon: FileSpreadsheet,\n iconClass: 'text-status-success-text',\n tileClass: 'bg-status-success-bg-subtle',\n },\n doc: {\n Icon: FileText,\n iconClass: 'text-status-info-text',\n tileClass: 'bg-status-info-bg-subtle',\n },\n archive: {\n Icon: FileArchive,\n iconClass: 'text-status-warning-text',\n tileClass: 'bg-status-warning-bg-subtle',\n },\n code: {\n Icon: FileCode2,\n iconClass: 'text-status-info-text',\n tileClass: 'bg-status-info-bg-subtle',\n },\n video: {\n Icon: FileVideo,\n iconClass: 'text-status-info-text',\n tileClass: 'bg-status-info-bg-subtle',\n },\n audio: {\n Icon: FileAudio,\n iconClass: 'text-status-warning-text',\n tileClass: 'bg-status-warning-bg-subtle',\n },\n other: { Icon: FileIcon, iconClass: 'text-text-secondary', tileClass: 'bg-bg-sunken' },\n};\n\n/** File-type badge tile — an inline thumbnail for images, a tinted glyph otherwise. */\nfunction FileBadge({ file }: { file: FileNode }) {\n const kind = kindOf(file);\n const { Icon, iconClass, tileClass } = KIND_STYLE[kind];\n if (kind === 'image' && file.downloadUrl) {\n return (\n <img\n src={file.downloadUrl}\n alt=\"\"\n loading=\"lazy\"\n className=\"h-10 w-10 shrink-0 rounded-lg border border-border-subtle object-cover\"\n />\n );\n }\n return (\n <span\n className={`flex h-10 w-10 shrink-0 items-center justify-center rounded-lg ${tileClass}`}\n aria-hidden=\"true\"\n >\n <Icon className={`h-5 w-5 ${iconClass}`} />\n </span>\n );\n}\n\nexport function AttachmentsPanel({ entityType, entityId }: AttachmentsPanelProps) {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [uploading, setUploading] = useState(false);\n const [sharingId, setSharingId] = useState<string | null>(null);\n\n const { data, loading, refetch } = useQuery<GetFilesResult>(GET_FILES_QUERY, {\n variables: {\n pagination: { limit: 25, offset: 0 },\n sort: { field: 'CREATED_AT', order: 'DESC' },\n },\n fetchPolicy: 'cache-and-network',\n errorPolicy: 'all',\n });\n\n const [initiateUpload] = useMutation<{\n initiateUpload: { uploadUrl?: string | null; session: { id: string } };\n }>(INITIATE_UPLOAD_MUTATION);\n const [completeUpload] = useMutation(COMPLETE_UPLOAD_MUTATION);\n const [createShareLink] = useMutation<{\n createFileShareLink: { id: string; shareUrl?: string | null };\n }>(CREATE_SHARE_LINK_MUTATION);\n\n const files = useMemo(() => data?.getFiles.files ?? [], [data]);\n\n const handleFileSelected = async (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n // Reset the input so selecting the same file again re-triggers change.\n event.target.value = '';\n if (!file) return;\n\n setUploading(true);\n try {\n const initiated = await initiateUpload({\n variables: {\n input: {\n fileName: file.name,\n extension: extensionOf(file.name),\n fileSize: file.size,\n mimeType: file.type || 'application/octet-stream',\n visibility: 'WORKSPACE',\n },\n },\n });\n\n const uploadUrl = initiated.data?.initiateUpload.uploadUrl;\n const sessionId = initiated.data?.initiateUpload.session.id;\n if (!uploadUrl || !sessionId) {\n throw new Error('Upload could not be initialised.');\n }\n\n const putResponse = await fetch(uploadUrl, {\n method: 'PUT',\n body: file,\n headers: { 'Content-Type': file.type || 'application/octet-stream' },\n });\n if (!putResponse.ok) {\n throw new Error(`Storage rejected the upload (HTTP ${putResponse.status}).`);\n }\n\n await completeUpload({\n variables: { input: { sessionId, fileSize: file.size } },\n });\n\n notify.success('File uploaded', `${file.name} is now available on this record.`);\n await refetch();\n } catch (error) {\n notify.error(\n 'Upload failed',\n error instanceof Error ? error.message : 'The file could not be uploaded.'\n );\n } finally {\n setUploading(false);\n }\n };\n\n const handleShare = async (fileId: string) => {\n setSharingId(fileId);\n try {\n const result = await createShareLink({\n variables: { input: { resourceId: fileId, role: 'VIEWER' } },\n });\n const url = result.data?.createFileShareLink.shareUrl;\n if (!url) {\n throw new Error('No share link was returned.');\n }\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(url);\n notify.success('Share link copied', 'A view-only link is on your clipboard.');\n } else {\n notify.info('Share link ready', url);\n }\n } catch (error) {\n notify.error(\n 'Could not create share link',\n error instanceof Error ? error.message : 'Please try again.'\n );\n } finally {\n setSharingId(null);\n }\n };\n\n const total = data?.getFiles.total ?? 0;\n const hasFiles = files.length > 0;\n\n return (\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between gap-2 space-y-0\">\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Paperclip className=\"h-4 w-4\" />\n Attachments\n {total ? (\n <span className=\"text-sm font-normal text-text-secondary\">\n {total} file{total === 1 ? '' : 's'}\n </span>\n ) : null}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <input\n ref={fileInputRef}\n type=\"file\"\n className=\"hidden\"\n onChange={(event) => void handleFileSelected(event)}\n aria-label={`Upload a file for ${entityType} ${entityId}`}\n />\n\n {loading && !hasFiles ? (\n <div className=\"space-y-2\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div\n key={i}\n className=\"h-14 rounded-lg bg-bg-sunken motion-safe:animate-vc-shimmer\"\n />\n ))}\n </div>\n ) : !hasFiles ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No files yet\"\n description=\"Upload photos, receipts, warranties or documents to keep them with this record.\"\n />\n ) : (\n <ul className=\"space-y-1.5\">\n {files.map((file) => {\n const isSharing = sharingId === file.id;\n return (\n <li\n key={file.id}\n className=\"flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-2.5\"\n >\n <FileBadge file={file} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium\" title={file.name}>\n {file.name}\n </p>\n <p className=\"truncate text-xs text-text-secondary\">\n {formatSize(Number(file.size))} · {relativeTime(file.createdAt)}\n </p>\n </div>\n {/* Desktop: inline actions. Mobile: kebab menu to avoid crowding. */}\n <div className=\"hidden items-center gap-1 sm:flex\">\n {file.downloadUrl ? (\n <a\n href={file.downloadUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"rounded-md p-1.5 text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary\"\n aria-label={`Download ${file.name}`}\n title=\"Download\"\n >\n <Download className=\"h-4 w-4\" />\n </a>\n ) : null}\n <button\n type=\"button\"\n disabled={isSharing}\n onClick={() => void handleShare(file.id)}\n className=\"rounded-md p-1.5 text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary disabled:opacity-60\"\n aria-label={`Copy share link for ${file.name}`}\n title=\"Copy share link\"\n >\n {isSharing ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Link2 className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n <div className=\"sm:hidden\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className=\"rounded-md p-1.5 text-text-secondary hover:bg-bg-sunken hover:text-text-primary\"\n aria-label={`Actions for ${file.name}`}\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {file.downloadUrl ? (\n <DropdownMenuItem asChild>\n <a href={file.downloadUrl} target=\"_blank\" rel=\"noreferrer\">\n <Download className=\"mr-2 h-4 w-4\" />\n Download\n </a>\n </DropdownMenuItem>\n ) : null}\n <DropdownMenuItem\n disabled={isSharing}\n onSelect={(e) => {\n e.preventDefault();\n void handleShare(file.id);\n }}\n >\n <Link2 className=\"mr-2 h-4 w-4\" />\n Copy share link\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </li>\n );\n })}\n </ul>\n )}\n\n {/* Prominent full-width primary upload CTA (matches the reference concept). */}\n <Button\n className=\"w-full\"\n disabled={uploading}\n onClick={() => fileInputRef.current?.click()}\n >\n {uploading ? (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : (\n <Upload className=\"mr-2 h-4 w-4\" />\n )}\n {uploading ? 'Uploading…' : 'Upload files'}\n </Button>\n </CardContent>\n </Card>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AttachmentsPanel.js","names":["ImageIcon","FileIcon","GET_FILES_QUERY","INITIATE_UPLOAD_MUTATION","COMPLETE_UPLOAD_MUTATION","CREATE_SHARE_LINK_MUTATION","formatSize","bytes","units","exponent","extensionOf","dot","fileName","relativeTime","then","iso","diff","sec","min","hr","day","kindOf","mime","file","ext","KIND_STYLE","Image","FileText","FileSpreadsheet","FileArchive","FileCode2","FileVideo","FileAudio","File","FileBadge","kind","tileClass","Icon","iconClass","AttachmentsPanel","fileInputRef","useRef","uploading","setUploading","useState","sharingId","setSharingId","useQuery","initiateUpload","useMutation","completeUpload","createShareLink","files","useMemo","data","handleFileSelected","event","initiated","uploadUrl","sessionId","putResponse","notify","refetch","error","handleShare","fileId","url","total","hasFiles","Card","CardHeader","CardTitle","Paperclip","CardContent","entityType","entityId","loading","i","isSharing","Download","Loader2","Link2","DropdownMenu","DropdownMenuTrigger","MoreHorizontal","DropdownMenuContent","DropdownMenuItem","e","IllustratedEmptyState","Button","Upload"],"sources":["../../../src/assethandler/components/AttachmentsPanel.tsx"],"sourcesContent":["import { useMemo, useRef, useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n IllustratedEmptyState,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Paperclip,\n Upload,\n Link2,\n FileText,\n FileSpreadsheet,\n FileArchive,\n FileCode2,\n FileVideo,\n FileAudio,\n Image as ImageIcon,\n File as FileIcon,\n Loader2,\n Download,\n MoreHorizontal,\n} from 'lucide-react';\nimport { notify } from '../utils/toast';\n\n/**\n * Attach and reference files for an AssetHandler entity, backed by the\n * federated wspace-files-svc (same wspace gateway/Apollo client). Fully real (no fabricated data) —\n * lists workspace files via `getFiles`, uploads new files through the\n * `initiateUpload` → presigned PUT → `completeUpload` flow, and mints public\n * share links via `createFileShareLink`. All entries are live data.\n *\n * `entityType`/`entityId` scope the panel to the record it is mounted on and\n * are used for context labelling; uploaded files land in the workspace file\n * store so they can be shared and reused.\n */\nexport interface AttachmentsPanelProps {\n entityType: string;\n entityId: string;\n}\n\ninterface FileNode {\n id: string;\n name: string;\n extension: string;\n mimeType: string;\n size: number;\n downloadUrl?: string | null;\n createdAt: string;\n}\n\ninterface GetFilesResult {\n getFiles: {\n files: FileNode[];\n total: number;\n hasMore: boolean;\n };\n}\n\nconst GET_FILES_QUERY = gql`\n query AssetHandlerGetFiles($pagination: PaginationInput, $sort: FileSortInput) {\n getFiles(pagination: $pagination, sort: $sort) {\n total\n hasMore\n files {\n id\n name\n extension\n mimeType\n size\n downloadUrl\n createdAt\n }\n }\n }\n`;\n\nconst INITIATE_UPLOAD_MUTATION = gql`\n mutation AssetHandlerInitiateUpload($input: InitiateUploadInput!) {\n initiateUpload(input: $input) {\n uploadUrl\n session {\n id\n }\n }\n }\n`;\n\nconst COMPLETE_UPLOAD_MUTATION = gql`\n mutation AssetHandlerCompleteUpload($input: CompleteUploadInput!) {\n completeUpload(input: $input) {\n fileId\n file {\n id\n name\n }\n }\n }\n`;\n\nconst CREATE_SHARE_LINK_MUTATION = gql`\n mutation AssetHandlerCreateFileShareLink($input: CreateShareGrantLinkInput!) {\n createFileShareLink(input: $input) {\n id\n shareUrl\n }\n }\n`;\n\nfunction formatSize(bytes: number): string {\n if (!bytes) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB'];\n const exponent = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1);\n const value = bytes / Math.pow(1024, exponent);\n return `${value.toFixed(exponent === 0 ? 0 : 1)} ${units[exponent]}`;\n}\n\nfunction extensionOf(fileName: string): string {\n const dot = fileName.lastIndexOf('.');\n return dot >= 0 ? fileName.slice(dot + 1).toLowerCase() : 'bin';\n}\n\n/** Compact relative time (\"2 hrs ago\"), with the full timestamp on hover. */\nfunction relativeTime(iso: string): string {\n const then = new Date(iso).getTime();\n if (Number.isNaN(then)) return '';\n const diff = Date.now() - then;\n const sec = Math.round(diff / 1000);\n if (sec < 45) return 'just now';\n const min = Math.round(sec / 60);\n if (min < 60) return `${min} min ago`;\n const hr = Math.round(min / 60);\n if (hr < 24) return `${hr} hr${hr === 1 ? '' : 's'} ago`;\n const day = Math.round(hr / 24);\n if (day < 30) return `${day} day${day === 1 ? '' : 's'} ago`;\n return new Date(iso).toLocaleDateString();\n}\n\ntype FileKind =\n 'image' | 'pdf' | 'sheet' | 'doc' | 'archive' | 'code' | 'video' | 'audio' | 'other';\n\n/** Map a file's extension/mime to a recognisable kind for icon + tint. */\nfunction kindOf(file: FileNode): FileKind {\n const mime = (file.mimeType || '').toLowerCase();\n const ext = (file.extension || extensionOf(file.name)).toLowerCase();\n if (\n mime.startsWith('image/') ||\n ['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'avif', 'bmp'].includes(ext)\n )\n return 'image';\n if (mime.startsWith('video/') || ['mp4', 'mov', 'webm', 'avi', 'mkv'].includes(ext))\n return 'video';\n if (mime.startsWith('audio/') || ['mp3', 'wav', 'ogg', 'm4a', 'flac'].includes(ext))\n return 'audio';\n if (mime === 'application/pdf' || ext === 'pdf') return 'pdf';\n if (['xls', 'xlsx', 'csv', 'tsv', 'ods'].includes(ext)) return 'sheet';\n if (['zip', 'rar', '7z', 'tar', 'gz', 'bz2'].includes(ext)) return 'archive';\n if (\n [\n 'js',\n 'ts',\n 'tsx',\n 'jsx',\n 'json',\n 'xml',\n 'yml',\n 'yaml',\n 'html',\n 'css',\n 'sh',\n 'py',\n 'sql',\n ].includes(ext)\n )\n return 'code';\n if (['doc', 'docx', 'txt', 'md', 'rtf', 'odt', 'pages'].includes(ext)) return 'doc';\n return 'other';\n}\n\nconst KIND_STYLE: Record<\n FileKind,\n { Icon: typeof FileText; iconClass: string; tileClass: string }\n> = {\n image: {\n Icon: ImageIcon,\n iconClass: 'text-status-success-text',\n tileClass: 'bg-status-success-bg-subtle',\n },\n pdf: {\n Icon: FileText,\n iconClass: 'text-status-error-text',\n tileClass: 'bg-status-error-bg-subtle',\n },\n sheet: {\n Icon: FileSpreadsheet,\n iconClass: 'text-status-success-text',\n tileClass: 'bg-status-success-bg-subtle',\n },\n doc: {\n Icon: FileText,\n iconClass: 'text-status-info-text',\n tileClass: 'bg-status-info-bg-subtle',\n },\n archive: {\n Icon: FileArchive,\n iconClass: 'text-status-warning-text',\n tileClass: 'bg-status-warning-bg-subtle',\n },\n code: {\n Icon: FileCode2,\n iconClass: 'text-status-info-text',\n tileClass: 'bg-status-info-bg-subtle',\n },\n video: {\n Icon: FileVideo,\n iconClass: 'text-status-info-text',\n tileClass: 'bg-status-info-bg-subtle',\n },\n audio: {\n Icon: FileAudio,\n iconClass: 'text-status-warning-text',\n tileClass: 'bg-status-warning-bg-subtle',\n },\n other: { Icon: FileIcon, iconClass: 'text-text-secondary', tileClass: 'bg-bg-sunken' },\n};\n\n/** File-type badge tile — an inline thumbnail for images, a tinted glyph otherwise. */\nfunction FileBadge({ file }: { file: FileNode }) {\n const kind = kindOf(file);\n const { Icon, iconClass, tileClass } = KIND_STYLE[kind];\n if (kind === 'image' && file.downloadUrl) {\n return (\n <img\n src={file.downloadUrl}\n alt=\"\"\n loading=\"lazy\"\n className=\"h-10 w-10 shrink-0 rounded-lg border border-border-subtle object-cover\"\n />\n );\n }\n return (\n <span\n className={`flex h-10 w-10 shrink-0 items-center justify-center rounded-lg ${tileClass}`}\n aria-hidden=\"true\"\n >\n <Icon className={`h-5 w-5 ${iconClass}`} />\n </span>\n );\n}\n\nexport function AttachmentsPanel({ entityType, entityId }: AttachmentsPanelProps) {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [uploading, setUploading] = useState(false);\n const [sharingId, setSharingId] = useState<string | null>(null);\n\n const { data, loading, refetch } = useQuery<GetFilesResult>(GET_FILES_QUERY, {\n variables: {\n pagination: { limit: 25, offset: 0 },\n sort: { field: 'CREATED_AT', order: 'DESC' },\n },\n fetchPolicy: 'cache-and-network',\n errorPolicy: 'all',\n });\n\n const [initiateUpload] = useMutation<{\n initiateUpload: { uploadUrl?: string | null; session: { id: string } };\n }>(INITIATE_UPLOAD_MUTATION);\n const [completeUpload] = useMutation(COMPLETE_UPLOAD_MUTATION);\n const [createShareLink] = useMutation<{\n createFileShareLink: { id: string; shareUrl?: string | null };\n }>(CREATE_SHARE_LINK_MUTATION);\n\n const files = useMemo(() => data?.getFiles.files ?? [], [data]);\n\n const handleFileSelected = async (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n // Reset the input so selecting the same file again re-triggers change.\n event.target.value = '';\n if (!file) return;\n\n setUploading(true);\n try {\n const initiated = await initiateUpload({\n variables: {\n input: {\n fileName: file.name,\n extension: extensionOf(file.name),\n fileSize: file.size,\n mimeType: file.type || 'application/octet-stream',\n visibility: 'WORKSPACE',\n },\n },\n });\n\n const uploadUrl = initiated.data?.initiateUpload.uploadUrl;\n const sessionId = initiated.data?.initiateUpload.session.id;\n if (!uploadUrl || !sessionId) {\n throw new Error('Upload could not be initialised.');\n }\n\n const putResponse = await fetch(uploadUrl, {\n method: 'PUT',\n body: file,\n headers: { 'Content-Type': file.type || 'application/octet-stream' },\n });\n if (!putResponse.ok) {\n throw new Error(`Storage rejected the upload (HTTP ${putResponse.status}).`);\n }\n\n await completeUpload({\n variables: { input: { sessionId, fileSize: file.size } },\n });\n\n notify.success('File uploaded', `${file.name} is now available on this record.`);\n await refetch();\n } catch (error) {\n notify.error(\n 'Upload failed',\n error instanceof Error ? error.message : 'The file could not be uploaded.'\n );\n } finally {\n setUploading(false);\n }\n };\n\n const handleShare = async (fileId: string) => {\n setSharingId(fileId);\n try {\n const result = await createShareLink({\n variables: { input: { resourceId: fileId, role: 'VIEWER' } },\n });\n const url = result.data?.createFileShareLink.shareUrl;\n if (!url) {\n throw new Error('No share link was returned.');\n }\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(url);\n notify.success('Share link copied', 'A view-only link is on your clipboard.');\n } else {\n notify.info('Share link ready', url);\n }\n } catch (error) {\n notify.error(\n 'Could not create share link',\n error instanceof Error ? error.message : 'Please try again.'\n );\n } finally {\n setSharingId(null);\n }\n };\n\n const total = data?.getFiles.total ?? 0;\n const hasFiles = files.length > 0;\n\n return (\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between gap-2 space-y-0\">\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Paperclip className=\"h-4 w-4\" />\n Attachments\n {total ? (\n <span className=\"text-sm font-normal text-text-secondary\">\n {total} file{total === 1 ? '' : 's'}\n </span>\n ) : null}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <input\n ref={fileInputRef}\n type=\"file\"\n className=\"hidden\"\n onChange={(event) => void handleFileSelected(event)}\n aria-label={`Upload a file for ${entityType} ${entityId}`}\n />\n\n {loading && !hasFiles ? (\n <div className=\"space-y-2\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div\n key={i}\n className=\"h-14 rounded-lg bg-bg-sunken motion-safe:animate-vc-shimmer\"\n />\n ))}\n </div>\n ) : !hasFiles ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No files yet\"\n description=\"Upload photos, receipts, warranties or documents to keep them with this record.\"\n />\n ) : (\n <ul className=\"space-y-1.5\">\n {files.map((file) => {\n const isSharing = sharingId === file.id;\n return (\n <li\n key={file.id}\n className=\"flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-2.5\"\n >\n <FileBadge file={file} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium\" title={file.name}>\n {file.name}\n </p>\n <p className=\"truncate text-xs text-text-secondary\">\n {formatSize(Number(file.size))} · {relativeTime(file.createdAt)}\n </p>\n </div>\n {/* Desktop: inline actions. Mobile: kebab menu to avoid crowding. */}\n <div className=\"hidden items-center gap-1 sm:flex\">\n {file.downloadUrl ? (\n <a\n href={file.downloadUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"rounded-md p-1.5 text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary\"\n aria-label={`Download ${file.name}`}\n title=\"Download\"\n >\n <Download className=\"h-4 w-4\" />\n </a>\n ) : null}\n <button\n type=\"button\"\n disabled={isSharing}\n onClick={() => void handleShare(file.id)}\n className=\"rounded-md p-1.5 text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary disabled:opacity-60\"\n aria-label={`Copy share link for ${file.name}`}\n title=\"Copy share link\"\n >\n {isSharing ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Link2 className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n <div className=\"sm:hidden\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className=\"rounded-md p-1.5 text-text-secondary hover:bg-bg-sunken hover:text-text-primary\"\n aria-label={`Actions for ${file.name}`}\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {file.downloadUrl ? (\n <DropdownMenuItem asChild>\n <a href={file.downloadUrl} target=\"_blank\" rel=\"noreferrer\">\n <Download className=\"mr-2 h-4 w-4\" />\n Download\n </a>\n </DropdownMenuItem>\n ) : null}\n <DropdownMenuItem\n disabled={isSharing}\n onSelect={(e) => {\n e.preventDefault();\n void handleShare(file.id);\n }}\n >\n <Link2 className=\"mr-2 h-4 w-4\" />\n Copy share link\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </li>\n );\n })}\n </ul>\n )}\n\n {/* Prominent full-width primary upload CTA (matches the reference concept). */}\n <Button\n className=\"w-full\"\n disabled={uploading}\n onClick={() => fileInputRef.current?.click()}\n >\n {uploading ? (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : (\n <Upload className=\"mr-2 h-4 w-4\" />\n )}\n {uploading ? 'Uploading…' : 'Upload files'}\n </Button>\n </CardContent>\n </Card>\n );\n}\n"],"mappings":"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"}
@@ -40,6 +40,5 @@ export interface CameraTagScannerProps {
40
40
  /** Injection point for tests; defaults to the best reader for the browser. */
41
41
  readerFactory?: () => Promise<ScanFrameReader>;
42
42
  }
43
- export declare function CameraTagScanner({ onDetected, onClose, readerFactory, }: CameraTagScannerProps): import("react").JSX.Element;
43
+ export declare function CameraTagScanner({ onDetected, onClose, readerFactory, }: CameraTagScannerProps): import('react').JSX.Element;
44
44
  export {};
45
- //# sourceMappingURL=CameraTagScanner.d.ts.map
@@ -4,7 +4,7 @@ import { useEffect as n, useRef as r, useState as i } from "react";
4
4
  import { CameraOff as a, X as o } from "lucide-react";
5
5
  import { jsx as s, jsxs as c } from "react/jsx-runtime";
6
6
  import { Button as l } from "@burdenoff/fe-libs/ui";
7
- //#region src/assethandler/components/CameraTagScanner.tsx
7
+ // src/assethandler/components/CameraTagScanner.tsx
8
8
  var u = [
9
9
  "qr_code",
10
10
  "code_128",
@@ -159,7 +159,6 @@ function v({ onDetected: e, onClose: u, readerFactory: f = g }) {
159
159
  })]
160
160
  });
161
161
  }
162
- //#endregion
163
- export { v as CameraTagScanner };
162
+ export { v as CameraTagScanner, _ as cameraErrorKind, h as createCanvasReader, g as createFrameReader, m as createNativeReader };
164
163
 
165
164
  //# sourceMappingURL=CameraTagScanner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CameraTagScanner.js","names":[],"sources":["../../../src/assethandler/components/CameraTagScanner.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { CameraOff, X } from 'lucide-react';\nimport { useTr } from '../hooks/useTr';\n\n/**\n * Live camera tag scanner for the field app (BOFF-3952).\n *\n * Uses the platform `BarcodeDetector` where the browser ships it (Chrome and\n * Android WebView, which is what the Capacitor Android shell runs), reading\n * QR codes plus the common 1D symbologies on third-party labels. Elsewhere\n * (iOS Safari / WKWebView, Firefox) it falls back to jsQR, a pure-JS QR\n * decoder that is only loaded on demand. AssetHandler prints QR tags, so both\n * paths read every tag the product generates.\n */\n\ninterface DetectedBarcode {\n rawValue: string;\n}\n\ninterface BarcodeDetectorLike {\n detect(source: CanvasImageSource): Promise<DetectedBarcode[]>;\n}\n\ninterface BarcodeDetectorCtor {\n new (options?: { formats?: string[] }): BarcodeDetectorLike;\n getSupportedFormats?: () => Promise<string[]>;\n}\n\ntype QrDecoder = (\n data: Uint8ClampedArray,\n width: number,\n height: number,\n options?: { inversionAttempts?: 'dontInvert' | 'onlyInvert' | 'attemptBoth' | 'invertFirst' }\n) => { data: string } | null;\n\nconst WANTED_FORMATS = ['qr_code', 'code_128', 'code_39', 'ean_13', 'ean_8', 'data_matrix'];\n\n/** Frames per second the decoder samples; enough to feel instant. */\nconst SAMPLE_INTERVAL_MS = 200;\n\n/** Longest edge of the frame handed to jsQR; larger costs CPU, not accuracy. */\nconst FALLBACK_MAX_EDGE = 640;\n\nexport type ScanFrameReader = (video: HTMLVideoElement) => Promise<string | null>;\n\nfunction nativeDetector(): BarcodeDetectorCtor | null {\n const ctor = (globalThis as { BarcodeDetector?: BarcodeDetectorCtor }).BarcodeDetector;\n return typeof ctor === 'function' ? ctor : null;\n}\n\n/** Builds a frame reader on BarcodeDetector, restricted to formats it supports. */\nexport async function createNativeReader(ctor: BarcodeDetectorCtor): Promise<ScanFrameReader> {\n const supported = (await ctor.getSupportedFormats?.()) ?? WANTED_FORMATS;\n const formats = WANTED_FORMATS.filter((f) => supported.includes(f));\n const detector = new ctor(formats.length > 0 ? { formats } : undefined);\n return async (video) => {\n const codes = await detector.detect(video);\n const value = codes.find((c) => c.rawValue.trim() !== '')?.rawValue;\n return value ?? null;\n };\n}\n\n/** Builds a frame reader that samples the video onto a canvas for jsQR. */\nexport function createCanvasReader(\n decode: QrDecoder,\n canvas: HTMLCanvasElement = document.createElement('canvas')\n): ScanFrameReader {\n return async (video) => {\n const { videoWidth, videoHeight } = video;\n if (!videoWidth || !videoHeight) return null;\n const scale = Math.min(1, FALLBACK_MAX_EDGE / Math.max(videoWidth, videoHeight));\n const width = Math.round(videoWidth * scale);\n const height = Math.round(videoHeight * scale);\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d', { willReadFrequently: true });\n if (!ctx) return null;\n ctx.drawImage(video, 0, 0, width, height);\n const frame = ctx.getImageData(0, 0, width, height);\n return decode(frame.data, width, height, { inversionAttempts: 'attemptBoth' })?.data ?? null;\n };\n}\n\n/** Picks the best available reader for this browser. */\nexport async function createFrameReader(): Promise<ScanFrameReader> {\n const ctor = nativeDetector();\n if (ctor) {\n try {\n return await createNativeReader(ctor);\n } catch {\n // Some builds expose the constructor but reject every format; use jsQR.\n }\n }\n const { default: jsQR } = await import('jsqr');\n return createCanvasReader(jsQR);\n}\n\nexport type CameraErrorKind = 'denied' | 'unavailable' | 'unsupported' | 'failed';\n\nexport function cameraErrorKind(error: unknown): CameraErrorKind {\n const name = error instanceof Error || error instanceof DOMException ? error.name : '';\n if (name === 'NotAllowedError' || name === 'SecurityError') return 'denied';\n if (name === 'NotFoundError' || name === 'OverconstrainedError' || name === 'NotReadableError')\n return 'unavailable';\n return 'failed';\n}\n\nexport interface CameraTagScannerProps {\n onDetected: (value: string) => void;\n onClose: () => void;\n /** Injection point for tests; defaults to the best reader for the browser. */\n readerFactory?: () => Promise<ScanFrameReader>;\n}\n\nexport function CameraTagScanner({\n onDetected,\n onClose,\n readerFactory = createFrameReader,\n}: CameraTagScannerProps) {\n const tr = useTr();\n const videoRef = useRef<HTMLVideoElement>(null);\n const [error, setError] = useState<CameraErrorKind | null>(null);\n const [ready, setReady] = useState(false);\n const onDetectedRef = useRef(onDetected);\n useEffect(() => {\n onDetectedRef.current = onDetected;\n });\n\n useEffect(() => {\n let cancelled = false;\n let stream: MediaStream | null = null;\n let timer: number | undefined;\n\n const stop = () => {\n if (timer !== undefined) window.clearTimeout(timer);\n stream?.getTracks().forEach((track) => track.stop());\n };\n\n const start = async () => {\n if (!navigator.mediaDevices?.getUserMedia) {\n setError('unsupported');\n return;\n }\n try {\n stream = await navigator.mediaDevices.getUserMedia({\n video: { facingMode: { ideal: 'environment' } },\n audio: false,\n });\n } catch (err) {\n if (!cancelled) setError(cameraErrorKind(err));\n return;\n }\n if (cancelled) {\n stop();\n return;\n }\n const video = videoRef.current;\n if (!video) {\n stop();\n return;\n }\n video.srcObject = stream;\n try {\n await video.play();\n } catch {\n // Autoplay can reject while the element is still attaching; frames\n // still arrive because the element is muted and playsInline.\n }\n let read: ScanFrameReader;\n try {\n read = await readerFactory();\n } catch {\n if (!cancelled) setError('failed');\n stop();\n return;\n }\n if (cancelled) return;\n setReady(true);\n\n const tick = async () => {\n if (cancelled) return;\n try {\n const value = await read(video);\n if (value && !cancelled) {\n cancelled = true;\n stop();\n onDetectedRef.current(value);\n return;\n }\n } catch {\n // A single unreadable frame is normal; keep sampling.\n }\n if (!cancelled) timer = window.setTimeout(() => void tick(), SAMPLE_INTERVAL_MS);\n };\n void tick();\n };\n\n void start();\n return () => {\n cancelled = true;\n stop();\n };\n }, [readerFactory]);\n\n const errorCopy: Record<CameraErrorKind, string> = {\n denied: tr(\n 'assethandler.field.camera.denied',\n 'Camera access was blocked. Allow the camera for this app in your browser or device settings, or type the tag below.'\n ),\n unavailable: tr(\n 'assethandler.field.camera.unavailable',\n 'No usable camera was found on this device. Type the tag or use a handheld scanner instead.'\n ),\n unsupported: tr(\n 'assethandler.field.camera.unsupported',\n 'This browser cannot open the camera. Type the tag or use a handheld scanner instead.'\n ),\n failed: tr(\n 'assethandler.field.camera.failed',\n 'The camera could not be started. Close the scanner and try again.'\n ),\n };\n\n return (\n <div\n className=\"relative overflow-hidden rounded-2xl border border-border-seam bg-bg-sunken\"\n data-testid=\"field-camera-scanner\"\n >\n {error ? (\n <div role=\"alert\" className=\"flex flex-col items-center gap-3 p-6 text-center\">\n <CameraOff className=\"h-8 w-8 text-text-secondary\" aria-hidden=\"true\" />\n <p className=\"text-sm text-text-primary\">{errorCopy[error]}</p>\n </div>\n ) : (\n <div className=\"relative aspect-[3/4] w-full sm:aspect-video\">\n <video\n ref={videoRef}\n className=\"h-full w-full object-cover\"\n muted\n playsInline\n autoPlay\n aria-label={tr('assethandler.field.camera.preview', 'Camera preview')}\n />\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0 flex items-center justify-center\"\n >\n <div className=\"h-1/2 w-2/3 rounded-xl border-2 border-action-primary-bg/80\" />\n </div>\n <p\n aria-live=\"polite\"\n className=\"absolute bottom-3 left-0 right-0 text-center text-xs font-medium text-text-primary\"\n >\n {ready\n ? tr('assethandler.field.camera.aim', 'Point the camera at the asset tag')\n : tr('assethandler.field.camera.starting', 'Starting camera…')}\n </p>\n </div>\n )}\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n className=\"absolute right-2 top-2\"\n onClick={onClose}\n aria-label={tr('assethandler.field.camera.close', 'Close scanner')}\n >\n <X className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CameraTagScanner.js","names":["WANTED_FORMATS","SAMPLE_INTERVAL_MS","FALLBACK_MAX_EDGE","nativeDetector","ctor","createNativeReader","supported","formats","f","detector","video","c","createCanvasReader","videoWidth","videoHeight","scale","width","height","ctx","canvas","decode","createFrameReader","jsQR","m","cameraErrorKind","name","error","CameraTagScanner","tr","useTr","videoRef","useRef","setError","useState","ready","setReady","onDetectedRef","onDetected","useEffect","cancelled","stream","timer","stop","track","err","read","readerFactory","tick","value","errorCopy","CameraOff","Button","onClose","X"],"sources":["../../../src/assethandler/components/CameraTagScanner.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { CameraOff, X } from 'lucide-react';\nimport { useTr } from '../hooks/useTr';\n\n/**\n * Live camera tag scanner for the field app (BOFF-3952).\n *\n * Uses the platform `BarcodeDetector` where the browser ships it (Chrome and\n * Android WebView, which is what the Capacitor Android shell runs), reading\n * QR codes plus the common 1D symbologies on third-party labels. Elsewhere\n * (iOS Safari / WKWebView, Firefox) it falls back to jsQR, a pure-JS QR\n * decoder that is only loaded on demand. AssetHandler prints QR tags, so both\n * paths read every tag the product generates.\n */\n\ninterface DetectedBarcode {\n rawValue: string;\n}\n\ninterface BarcodeDetectorLike {\n detect(source: CanvasImageSource): Promise<DetectedBarcode[]>;\n}\n\ninterface BarcodeDetectorCtor {\n new (options?: { formats?: string[] }): BarcodeDetectorLike;\n getSupportedFormats?: () => Promise<string[]>;\n}\n\ntype QrDecoder = (\n data: Uint8ClampedArray,\n width: number,\n height: number,\n options?: { inversionAttempts?: 'dontInvert' | 'onlyInvert' | 'attemptBoth' | 'invertFirst' }\n) => { data: string } | null;\n\nconst WANTED_FORMATS = ['qr_code', 'code_128', 'code_39', 'ean_13', 'ean_8', 'data_matrix'];\n\n/** Frames per second the decoder samples; enough to feel instant. */\nconst SAMPLE_INTERVAL_MS = 200;\n\n/** Longest edge of the frame handed to jsQR; larger costs CPU, not accuracy. */\nconst FALLBACK_MAX_EDGE = 640;\n\nexport type ScanFrameReader = (video: HTMLVideoElement) => Promise<string | null>;\n\nfunction nativeDetector(): BarcodeDetectorCtor | null {\n const ctor = (globalThis as { BarcodeDetector?: BarcodeDetectorCtor }).BarcodeDetector;\n return typeof ctor === 'function' ? ctor : null;\n}\n\n/** Builds a frame reader on BarcodeDetector, restricted to formats it supports. */\nexport async function createNativeReader(ctor: BarcodeDetectorCtor): Promise<ScanFrameReader> {\n const supported = (await ctor.getSupportedFormats?.()) ?? WANTED_FORMATS;\n const formats = WANTED_FORMATS.filter((f) => supported.includes(f));\n const detector = new ctor(formats.length > 0 ? { formats } : undefined);\n return async (video) => {\n const codes = await detector.detect(video);\n const value = codes.find((c) => c.rawValue.trim() !== '')?.rawValue;\n return value ?? null;\n };\n}\n\n/** Builds a frame reader that samples the video onto a canvas for jsQR. */\nexport function createCanvasReader(\n decode: QrDecoder,\n canvas: HTMLCanvasElement = document.createElement('canvas')\n): ScanFrameReader {\n return async (video) => {\n const { videoWidth, videoHeight } = video;\n if (!videoWidth || !videoHeight) return null;\n const scale = Math.min(1, FALLBACK_MAX_EDGE / Math.max(videoWidth, videoHeight));\n const width = Math.round(videoWidth * scale);\n const height = Math.round(videoHeight * scale);\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d', { willReadFrequently: true });\n if (!ctx) return null;\n ctx.drawImage(video, 0, 0, width, height);\n const frame = ctx.getImageData(0, 0, width, height);\n return decode(frame.data, width, height, { inversionAttempts: 'attemptBoth' })?.data ?? null;\n };\n}\n\n/** Picks the best available reader for this browser. */\nexport async function createFrameReader(): Promise<ScanFrameReader> {\n const ctor = nativeDetector();\n if (ctor) {\n try {\n return await createNativeReader(ctor);\n } catch {\n // Some builds expose the constructor but reject every format; use jsQR.\n }\n }\n const { default: jsQR } = await import('jsqr');\n return createCanvasReader(jsQR);\n}\n\nexport type CameraErrorKind = 'denied' | 'unavailable' | 'unsupported' | 'failed';\n\nexport function cameraErrorKind(error: unknown): CameraErrorKind {\n const name = error instanceof Error || error instanceof DOMException ? error.name : '';\n if (name === 'NotAllowedError' || name === 'SecurityError') return 'denied';\n if (name === 'NotFoundError' || name === 'OverconstrainedError' || name === 'NotReadableError')\n return 'unavailable';\n return 'failed';\n}\n\nexport interface CameraTagScannerProps {\n onDetected: (value: string) => void;\n onClose: () => void;\n /** Injection point for tests; defaults to the best reader for the browser. */\n readerFactory?: () => Promise<ScanFrameReader>;\n}\n\nexport function CameraTagScanner({\n onDetected,\n onClose,\n readerFactory = createFrameReader,\n}: CameraTagScannerProps) {\n const tr = useTr();\n const videoRef = useRef<HTMLVideoElement>(null);\n const [error, setError] = useState<CameraErrorKind | null>(null);\n const [ready, setReady] = useState(false);\n const onDetectedRef = useRef(onDetected);\n useEffect(() => {\n onDetectedRef.current = onDetected;\n });\n\n useEffect(() => {\n let cancelled = false;\n let stream: MediaStream | null = null;\n let timer: number | undefined;\n\n const stop = () => {\n if (timer !== undefined) window.clearTimeout(timer);\n stream?.getTracks().forEach((track) => track.stop());\n };\n\n const start = async () => {\n if (!navigator.mediaDevices?.getUserMedia) {\n setError('unsupported');\n return;\n }\n try {\n stream = await navigator.mediaDevices.getUserMedia({\n video: { facingMode: { ideal: 'environment' } },\n audio: false,\n });\n } catch (err) {\n if (!cancelled) setError(cameraErrorKind(err));\n return;\n }\n if (cancelled) {\n stop();\n return;\n }\n const video = videoRef.current;\n if (!video) {\n stop();\n return;\n }\n video.srcObject = stream;\n try {\n await video.play();\n } catch {\n // Autoplay can reject while the element is still attaching; frames\n // still arrive because the element is muted and playsInline.\n }\n let read: ScanFrameReader;\n try {\n read = await readerFactory();\n } catch {\n if (!cancelled) setError('failed');\n stop();\n return;\n }\n if (cancelled) return;\n setReady(true);\n\n const tick = async () => {\n if (cancelled) return;\n try {\n const value = await read(video);\n if (value && !cancelled) {\n cancelled = true;\n stop();\n onDetectedRef.current(value);\n return;\n }\n } catch {\n // A single unreadable frame is normal; keep sampling.\n }\n if (!cancelled) timer = window.setTimeout(() => void tick(), SAMPLE_INTERVAL_MS);\n };\n void tick();\n };\n\n void start();\n return () => {\n cancelled = true;\n stop();\n };\n }, [readerFactory]);\n\n const errorCopy: Record<CameraErrorKind, string> = {\n denied: tr(\n 'assethandler.field.camera.denied',\n 'Camera access was blocked. Allow the camera for this app in your browser or device settings, or type the tag below.'\n ),\n unavailable: tr(\n 'assethandler.field.camera.unavailable',\n 'No usable camera was found on this device. Type the tag or use a handheld scanner instead.'\n ),\n unsupported: tr(\n 'assethandler.field.camera.unsupported',\n 'This browser cannot open the camera. Type the tag or use a handheld scanner instead.'\n ),\n failed: tr(\n 'assethandler.field.camera.failed',\n 'The camera could not be started. Close the scanner and try again.'\n ),\n };\n\n return (\n <div\n className=\"relative overflow-hidden rounded-2xl border border-border-seam bg-bg-sunken\"\n data-testid=\"field-camera-scanner\"\n >\n {error ? (\n <div role=\"alert\" className=\"flex flex-col items-center gap-3 p-6 text-center\">\n <CameraOff className=\"h-8 w-8 text-text-secondary\" aria-hidden=\"true\" />\n <p className=\"text-sm text-text-primary\">{errorCopy[error]}</p>\n </div>\n ) : (\n <div className=\"relative aspect-[3/4] w-full sm:aspect-video\">\n <video\n ref={videoRef}\n className=\"h-full w-full object-cover\"\n muted\n playsInline\n autoPlay\n aria-label={tr('assethandler.field.camera.preview', 'Camera preview')}\n />\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0 flex items-center justify-center\"\n >\n <div className=\"h-1/2 w-2/3 rounded-xl border-2 border-action-primary-bg/80\" />\n </div>\n <p\n aria-live=\"polite\"\n className=\"absolute bottom-3 left-0 right-0 text-center text-xs font-medium text-text-primary\"\n >\n {ready\n ? tr('assethandler.field.camera.aim', 'Point the camera at the asset tag')\n : tr('assethandler.field.camera.starting', 'Starting camera…')}\n </p>\n </div>\n )}\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n className=\"absolute right-2 top-2\"\n onClick={onClose}\n aria-label={tr('assethandler.field.camera.close', 'Close scanner')}\n >\n <X className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import { ComponentType, ReactNode } from 'react';
2
-
3
2
  export interface ChartCardProps {
4
3
  /** Card title (left of the header). */
5
4
  title: ReactNode;
@@ -28,5 +27,4 @@ export interface ChartCardProps {
28
27
  * subtitle, right-aligned actions) for charts and metric panels. Keeps chart
29
28
  * sections visually consistent with the rest of the AssetHandler surfaces.
30
29
  */
31
- export declare function ChartCard({ title, subtitle, actions, icon: Icon, emphasis, footer, bodyClassName, className, children, }: ChartCardProps): import("react").JSX.Element;
32
- //# sourceMappingURL=ChartCard.d.ts.map
30
+ export declare function ChartCard({ title, subtitle, actions, icon: Icon, emphasis, footer, bodyClassName, className, children, }: ChartCardProps): import('react').JSX.Element;
@@ -1,7 +1,7 @@
1
1
  import { cn as e } from "../utils/cn.js";
2
2
  import { Fragment as t, jsx as n, jsxs as r } from "react/jsx-runtime";
3
3
  import { EmphasisPanel as i, GlassCard as a } from "@burdenoff/fe-libs/ui";
4
- //#region src/assethandler/components/ChartCard.tsx
4
+ // src/assethandler/components/ChartCard.tsx
5
5
  function o({ title: o, subtitle: s, actions: c, icon: l, emphasis: u = !1, footer: d, bodyClassName: f, className: p, children: m }) {
6
6
  let h = /* @__PURE__ */ r(t, { children: [
7
7
  /* @__PURE__ */ r("div", {
@@ -44,7 +44,6 @@ function o({ title: o, subtitle: s, actions: c, icon: l, emphasis: u = !1, foote
44
44
  })
45
45
  });
46
46
  }
47
- //#endregion
48
47
  export { o as ChartCard };
49
48
 
50
49
  //# sourceMappingURL=ChartCard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChartCard.js","names":[],"sources":["../../../src/assethandler/components/ChartCard.tsx"],"sourcesContent":["import type { ComponentType, ReactNode } from 'react';\nimport { EmphasisPanel, GlassCard } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/cn';\n\nexport interface ChartCardProps {\n /** Card title (left of the header). */\n title: ReactNode;\n /** Optional supporting line under the title. */\n subtitle?: ReactNode;\n /** Optional controls rendered on the right of the header (toggles, menus). */\n actions?: ReactNode;\n /** Optional leading icon beside the title. */\n icon?: ComponentType<{ className?: string }>;\n /**\n * Render as the page's single hero surface (`EmphasisPanel`) instead of a\n * `GlassCard`. Use at most one per page.\n */\n emphasis?: boolean;\n /** Optional footer row under the body. */\n footer?: ReactNode;\n /** Extra classes for the body wrapper (e.g. spacing around the chart). */\n bodyClassName?: string;\n className?: string;\n children: ReactNode;\n}\n\n/**\n * ChartCard — a GlassCard/EmphasisPanel wrapper with a proper header (title,\n * subtitle, right-aligned actions) for charts and metric panels. Keeps chart\n * sections visually consistent with the rest of the AssetHandler surfaces.\n */\nexport function ChartCard({\n title,\n subtitle,\n actions,\n icon: Icon,\n emphasis = false,\n footer,\n bodyClassName,\n className,\n children,\n}: ChartCardProps) {\n const header = (\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex min-w-0 items-start gap-2\">\n {Icon ? <Icon className=\"mt-0.5 h-4 w-4 shrink-0 text-text-secondary\" /> : null}\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-base font-semibold text-text-primary\">{title}</h3>\n {subtitle ? <p className=\"mt-0.5 text-sm text-text-secondary\">{subtitle}</p> : null}\n </div>\n </div>\n {actions ? <div className=\"flex shrink-0 items-center gap-2\">{actions}</div> : null}\n </div>\n );\n\n const body = (\n <>\n {header}\n <div className={cn('mt-4', bodyClassName)}>{children}</div>\n {footer ? <div className=\"mt-4 border-t border-border-seam pt-3\">{footer}</div> : null}\n </>\n );\n\n if (emphasis) {\n return <EmphasisPanel className={className}>{body}</EmphasisPanel>;\n }\n\n return (\n <GlassCard treatment=\"glass\" className={cn('border-border-seam', className)}>\n <div className=\"p-5\">{body}</div>\n </GlassCard>\n );\n}\n"],"mappings":";;;;AA+BA,SAAgB,EAAU,EACxB,UACA,aACA,YACA,MAAM,GACN,cAAW,IACX,WACA,kBACA,cACA,eACiB;CAcjB,IAAM,IACJ,kBAAA,GAAA,EAAA,UAAA;EAbA,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACG,IAAO,kBAAC,GAAD,EAAM,WAAU,8CAA+C,CAAA,IAAI,MAC3E,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,MAAD;MAAI,WAAU;gBAAsD;KAAU,CAAA,GAC7E,IAAW,kBAAC,KAAD;MAAG,WAAU;gBAAsC;KAAY,CAAA,IAAI,IAC5E;MACF;OACJ,IAAU,kBAAC,OAAD;IAAK,WAAU;cAAoC;GAAa,CAAA,IAAI,IAC5E;GAKF;EACD,kBAAC,OAAD;GAAK,WAAW,EAAG,QAAQ,CAAa;GAAI;EAAc,CAAA;EACzD,IAAS,kBAAC,OAAD;GAAK,WAAU;aAAyC;EAAY,CAAA,IAAI;CAClF,EAAA,CAAA;CAOJ,OAJI,IACK,kBAAC,GAAD;EAA0B;YAAY;CAAoB,CAAA,IAIjE,kBAAC,GAAD;EAAW,WAAU;EAAQ,WAAW,EAAG,sBAAsB,CAAS;YACxE,kBAAC,OAAD;GAAK,WAAU;aAAO;EAAU,CAAA;CACvB,CAAA;AAEf"}
1
+ {"version":3,"file":"ChartCard.js","names":["_Fragment","_jsxs","ChartCard","Icon","body","Fragment","title","subtitle","actions","cn","bodyClassName","footer","emphasis","EmphasisPanel","GlassCard","className"],"sources":["../../../src/assethandler/components/ChartCard.tsx"],"sourcesContent":["import type { ComponentType, ReactNode } from 'react';\nimport { EmphasisPanel, GlassCard } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/cn';\n\nexport interface ChartCardProps {\n /** Card title (left of the header). */\n title: ReactNode;\n /** Optional supporting line under the title. */\n subtitle?: ReactNode;\n /** Optional controls rendered on the right of the header (toggles, menus). */\n actions?: ReactNode;\n /** Optional leading icon beside the title. */\n icon?: ComponentType<{ className?: string }>;\n /**\n * Render as the page's single hero surface (`EmphasisPanel`) instead of a\n * `GlassCard`. Use at most one per page.\n */\n emphasis?: boolean;\n /** Optional footer row under the body. */\n footer?: ReactNode;\n /** Extra classes for the body wrapper (e.g. spacing around the chart). */\n bodyClassName?: string;\n className?: string;\n children: ReactNode;\n}\n\n/**\n * ChartCard — a GlassCard/EmphasisPanel wrapper with a proper header (title,\n * subtitle, right-aligned actions) for charts and metric panels. Keeps chart\n * sections visually consistent with the rest of the AssetHandler surfaces.\n */\nexport function ChartCard({\n title,\n subtitle,\n actions,\n icon: Icon,\n emphasis = false,\n footer,\n bodyClassName,\n className,\n children,\n}: ChartCardProps) {\n const header = (\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex min-w-0 items-start gap-2\">\n {Icon ? <Icon className=\"mt-0.5 h-4 w-4 shrink-0 text-text-secondary\" /> : null}\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-base font-semibold text-text-primary\">{title}</h3>\n {subtitle ? <p className=\"mt-0.5 text-sm text-text-secondary\">{subtitle}</p> : null}\n </div>\n </div>\n {actions ? <div className=\"flex shrink-0 items-center gap-2\">{actions}</div> : null}\n </div>\n );\n\n const body = (\n <>\n {header}\n <div className={cn('mt-4', bodyClassName)}>{children}</div>\n {footer ? <div className=\"mt-4 border-t border-border-seam pt-3\">{footer}</div> : null}\n </>\n );\n\n if (emphasis) {\n return <EmphasisPanel className={className}>{body}</EmphasisPanel>;\n }\n\n return (\n <GlassCard treatment=\"glass\" className={cn('border-border-seam', className)}>\n <div className=\"p-5\">{body}</div>\n </GlassCard>\n );\n}\n"],"mappings":";;;;AA+BA,SAAgBE,EAAU,EACxB,UACA,aACA,YACA,MAAMC,GACN,cAAW,IACX,WACA,kBACA,cACA,eACiB;CAcjB,IAAMC,IACJ,kBAAAJ,GAAA,EAAA,UAAA;EAbAC,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACGE,IAAO,kBAACA,GAAD,EAAM,WAAU,8CAA+C,CAAA,IAAI,MAC3E,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAAC,MAAD;MAAI,WAAU;MAAsD,UAAAG;KAAU,CAAA,GAC7EC,IAAW,kBAAC,KAAD;MAAG,WAAU;MAAsC,UAAAA;KAAY,CAAA,IAAI,IAC5E;IACF,CAAA,CAAA;GACJ,CAAA,GAAAC,IAAU,kBAAC,OAAD;IAAK,WAAU;IAAoC,UAAAA;GAAa,CAAA,IAAI,IAC5E;E,CAKF;EACD,kBAAC,OAAD;GAAK,WAAWC,EAAG,QAAQC,CAAa;GAAI;EAAc,CAAA;EACzDC,IAAS,kBAAC,OAAD;GAAK,WAAU;GAAyC,UAAAA;EAAY,CAAA,IAAI;CAClF,EAAA,CAAA;CAOJ,OAJIC,IACK,kBAACC,GAAD;EAA0B;EAAY,UAAAT;CAAoB,CAAA,IAIjE,kBAACU,GAAD;EAAW,WAAU;EAAQ,WAAWL,EAAG,sBAAsBM,CAAS;EACxE,UAAA,kBAAC,OAAD;GAAK,WAAU;GAAO,UAAAX;EAAU,CAAA;CACvB,CAAA;AAEf"}