@ledgerhq/device-management-kit-devtools-ui 1.1.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 (373) hide show
  1. package/LICENSE.MD +202 -0
  2. package/lib/build/index.d.ts +2 -0
  3. package/lib/build/index.d.ts.map +1 -0
  4. package/lib/build/index.js +2 -0
  5. package/lib/build/index.js.map +1 -0
  6. package/lib/build/src/Dashboard.d.ts +5 -0
  7. package/lib/build/src/Dashboard.d.ts.map +1 -0
  8. package/lib/build/src/Dashboard.js +50 -0
  9. package/lib/build/src/Dashboard.js.map +1 -0
  10. package/lib/build/src/ErrorBoundary.d.ts +15 -0
  11. package/lib/build/src/ErrorBoundary.d.ts.map +1 -0
  12. package/lib/build/src/ErrorBoundary.js +23 -0
  13. package/lib/build/src/ErrorBoundary.js.map +1 -0
  14. package/lib/build/src/PluginEvents.d.ts +9 -0
  15. package/lib/build/src/PluginEvents.d.ts.map +1 -0
  16. package/lib/build/src/PluginEvents.js +2 -0
  17. package/lib/build/src/PluginEvents.js.map +1 -0
  18. package/lib/build/src/components/DashboardFooter.d.ts +8 -0
  19. package/lib/build/src/components/DashboardFooter.d.ts.map +1 -0
  20. package/lib/build/src/components/DashboardFooter.js +31 -0
  21. package/lib/build/src/components/DashboardFooter.js.map +1 -0
  22. package/lib/build/src/components/DashboardNavigationBar.d.ts +16 -0
  23. package/lib/build/src/components/DashboardNavigationBar.d.ts.map +1 -0
  24. package/lib/build/src/components/DashboardNavigationBar.js +85 -0
  25. package/lib/build/src/components/DashboardNavigationBar.js.map +1 -0
  26. package/lib/build/src/components/DebugDrawer.d.ts +18 -0
  27. package/lib/build/src/components/DebugDrawer.d.ts.map +1 -0
  28. package/lib/build/src/components/DebugDrawer.js +69 -0
  29. package/lib/build/src/components/DebugDrawer.js.map +1 -0
  30. package/lib/build/src/components/SplitView.d.ts +12 -0
  31. package/lib/build/src/components/SplitView.d.ts.map +1 -0
  32. package/lib/build/src/components/SplitView.js +50 -0
  33. package/lib/build/src/components/SplitView.js.map +1 -0
  34. package/lib/build/src/hooks/commandDispatcher.d.ts +28 -0
  35. package/lib/build/src/hooks/commandDispatcher.d.ts.map +1 -0
  36. package/lib/build/src/hooks/commandDispatcher.js +38 -0
  37. package/lib/build/src/hooks/commandDispatcher.js.map +1 -0
  38. package/lib/build/src/hooks/connectorMessageHandlers.d.ts +34 -0
  39. package/lib/build/src/hooks/connectorMessageHandlers.d.ts.map +1 -0
  40. package/lib/build/src/hooks/connectorMessageHandlers.js +85 -0
  41. package/lib/build/src/hooks/connectorMessageHandlers.js.map +1 -0
  42. package/lib/build/src/hooks/useConnectorMessages.d.ts +60 -0
  43. package/lib/build/src/hooks/useConnectorMessages.d.ts.map +1 -0
  44. package/lib/build/src/hooks/useConnectorMessages.js +138 -0
  45. package/lib/build/src/hooks/useConnectorMessages.js.map +1 -0
  46. package/lib/build/src/screens/debugDevTools/index.d.ts +17 -0
  47. package/lib/build/src/screens/debugDevTools/index.d.ts.map +1 -0
  48. package/lib/build/src/screens/debugDevTools/index.js +48 -0
  49. package/lib/build/src/screens/debugDevTools/index.js.map +1 -0
  50. package/lib/build/src/screens/inspector/ApduSender.d.ts +10 -0
  51. package/lib/build/src/screens/inspector/ApduSender.d.ts.map +1 -0
  52. package/lib/build/src/screens/inspector/ApduSender.js +118 -0
  53. package/lib/build/src/screens/inspector/ApduSender.js.map +1 -0
  54. package/lib/build/src/screens/inspector/DeviceCard.d.ts +13 -0
  55. package/lib/build/src/screens/inspector/DeviceCard.d.ts.map +1 -0
  56. package/lib/build/src/screens/inspector/DeviceCard.js +52 -0
  57. package/lib/build/src/screens/inspector/DeviceCard.js.map +1 -0
  58. package/lib/build/src/screens/inspector/DeviceDiscoverySection.d.ts +25 -0
  59. package/lib/build/src/screens/inspector/DeviceDiscoverySection.d.ts.map +1 -0
  60. package/lib/build/src/screens/inspector/DeviceDiscoverySection.js +8 -0
  61. package/lib/build/src/screens/inspector/DeviceDiscoverySection.js.map +1 -0
  62. package/lib/build/src/screens/inspector/DiscoveredDeviceCard.d.ts +12 -0
  63. package/lib/build/src/screens/inspector/DiscoveredDeviceCard.d.ts.map +1 -0
  64. package/lib/build/src/screens/inspector/DiscoveredDeviceCard.js +89 -0
  65. package/lib/build/src/screens/inspector/DiscoveredDeviceCard.js.map +1 -0
  66. package/lib/build/src/screens/inspector/MyLedgerProviderControl.d.ts +9 -0
  67. package/lib/build/src/screens/inspector/MyLedgerProviderControl.d.ts.map +1 -0
  68. package/lib/build/src/screens/inspector/MyLedgerProviderControl.js +78 -0
  69. package/lib/build/src/screens/inspector/MyLedgerProviderControl.js.map +1 -0
  70. package/lib/build/src/screens/inspector/SessionsSection.d.ts +20 -0
  71. package/lib/build/src/screens/inspector/SessionsSection.d.ts.map +1 -0
  72. package/lib/build/src/screens/inspector/SessionsSection.js +37 -0
  73. package/lib/build/src/screens/inspector/SessionsSection.js.map +1 -0
  74. package/lib/build/src/screens/inspector/index.d.ts +34 -0
  75. package/lib/build/src/screens/inspector/index.d.ts.map +1 -0
  76. package/lib/build/src/screens/inspector/index.js +26 -0
  77. package/lib/build/src/screens/inspector/index.js.map +1 -0
  78. package/lib/build/src/screens/inspector/styles.d.ts +41 -0
  79. package/lib/build/src/screens/inspector/styles.d.ts.map +1 -0
  80. package/lib/build/src/screens/inspector/styles.js +266 -0
  81. package/lib/build/src/screens/inspector/styles.js.map +1 -0
  82. package/lib/build/src/screens/logger/FilterInput.d.ts +8 -0
  83. package/lib/build/src/screens/logger/FilterInput.d.ts.map +1 -0
  84. package/lib/build/src/screens/logger/FilterInput.js +179 -0
  85. package/lib/build/src/screens/logger/FilterInput.js.map +1 -0
  86. package/lib/build/src/screens/logger/LoggerOptions.d.ts +18 -0
  87. package/lib/build/src/screens/logger/LoggerOptions.d.ts.map +1 -0
  88. package/lib/build/src/screens/logger/LoggerOptions.js +75 -0
  89. package/lib/build/src/screens/logger/LoggerOptions.js.map +1 -0
  90. package/lib/build/src/screens/logger/LoggerToolbar.d.ts +19 -0
  91. package/lib/build/src/screens/logger/LoggerToolbar.d.ts.map +1 -0
  92. package/lib/build/src/screens/logger/LoggerToolbar.js +16 -0
  93. package/lib/build/src/screens/logger/LoggerToolbar.js.map +1 -0
  94. package/lib/build/src/screens/logger/SearchInput.d.ts +15 -0
  95. package/lib/build/src/screens/logger/SearchInput.d.ts.map +1 -0
  96. package/lib/build/src/screens/logger/SearchInput.js +93 -0
  97. package/lib/build/src/screens/logger/SearchInput.js.map +1 -0
  98. package/lib/build/src/screens/logger/filterUtils.d.ts +43 -0
  99. package/lib/build/src/screens/logger/filterUtils.d.ts.map +1 -0
  100. package/lib/build/src/screens/logger/filterUtils.js +125 -0
  101. package/lib/build/src/screens/logger/filterUtils.js.map +1 -0
  102. package/lib/build/src/screens/logger/filterUtils.test.d.ts +2 -0
  103. package/lib/build/src/screens/logger/filterUtils.test.d.ts.map +1 -0
  104. package/lib/build/src/screens/logger/filterUtils.test.js +300 -0
  105. package/lib/build/src/screens/logger/filterUtils.test.js.map +1 -0
  106. package/lib/build/src/screens/logger/index.d.ts +10 -0
  107. package/lib/build/src/screens/logger/index.d.ts.map +1 -0
  108. package/lib/build/src/screens/logger/index.js +86 -0
  109. package/lib/build/src/screens/logger/index.js.map +1 -0
  110. package/lib/build/src/screens/logger/inputStyles.d.ts +18 -0
  111. package/lib/build/src/screens/logger/inputStyles.d.ts.map +1 -0
  112. package/lib/build/src/screens/logger/inputStyles.js +46 -0
  113. package/lib/build/src/screens/logger/inputStyles.js.map +1 -0
  114. package/lib/build/src/screens/logger/logsTable/LogTableCells.d.ts +13 -0
  115. package/lib/build/src/screens/logger/logsTable/LogTableCells.d.ts.map +1 -0
  116. package/lib/build/src/screens/logger/logsTable/LogTableCells.js +61 -0
  117. package/lib/build/src/screens/logger/logsTable/LogTableCells.js.map +1 -0
  118. package/lib/build/src/screens/logger/logsTable/ScrollDownButton.d.ts +8 -0
  119. package/lib/build/src/screens/logger/logsTable/ScrollDownButton.d.ts.map +1 -0
  120. package/lib/build/src/screens/logger/logsTable/ScrollDownButton.js +20 -0
  121. package/lib/build/src/screens/logger/logsTable/ScrollDownButton.js.map +1 -0
  122. package/lib/build/src/screens/logger/logsTable/TableBody.d.ts +13 -0
  123. package/lib/build/src/screens/logger/logsTable/TableBody.d.ts.map +1 -0
  124. package/lib/build/src/screens/logger/logsTable/TableBody.js +58 -0
  125. package/lib/build/src/screens/logger/logsTable/TableBody.js.map +1 -0
  126. package/lib/build/src/screens/logger/logsTable/TableColumns.d.ts +3 -0
  127. package/lib/build/src/screens/logger/logsTable/TableColumns.d.ts.map +1 -0
  128. package/lib/build/src/screens/logger/logsTable/TableColumns.js +44 -0
  129. package/lib/build/src/screens/logger/logsTable/TableColumns.js.map +1 -0
  130. package/lib/build/src/screens/logger/logsTable/TableHeader.d.ts +9 -0
  131. package/lib/build/src/screens/logger/logsTable/TableHeader.d.ts.map +1 -0
  132. package/lib/build/src/screens/logger/logsTable/TableHeader.js +53 -0
  133. package/lib/build/src/screens/logger/logsTable/TableHeader.js.map +1 -0
  134. package/lib/build/src/screens/logger/logsTable/constants.d.ts +21 -0
  135. package/lib/build/src/screens/logger/logsTable/constants.d.ts.map +1 -0
  136. package/lib/build/src/screens/logger/logsTable/constants.js +21 -0
  137. package/lib/build/src/screens/logger/logsTable/constants.js.map +1 -0
  138. package/lib/build/src/screens/logger/logsTable/index.d.ts +11 -0
  139. package/lib/build/src/screens/logger/logsTable/index.d.ts.map +1 -0
  140. package/lib/build/src/screens/logger/logsTable/index.js +116 -0
  141. package/lib/build/src/screens/logger/logsTable/index.js.map +1 -0
  142. package/lib/build/src/screens/logger/logsTable/useColumnSizeVars.d.ts +4 -0
  143. package/lib/build/src/screens/logger/logsTable/useColumnSizeVars.d.ts.map +1 -0
  144. package/lib/build/src/screens/logger/logsTable/useColumnSizeVars.js +17 -0
  145. package/lib/build/src/screens/logger/logsTable/useColumnSizeVars.js.map +1 -0
  146. package/lib/build/src/screens/logger/logsTable/useResizeObserver.d.ts +2 -0
  147. package/lib/build/src/screens/logger/logsTable/useResizeObserver.d.ts.map +1 -0
  148. package/lib/build/src/screens/logger/logsTable/useResizeObserver.js +28 -0
  149. package/lib/build/src/screens/logger/logsTable/useResizeObserver.js.map +1 -0
  150. package/lib/build/src/screens/logger/logsTable/useScrollLogic.d.ts +12 -0
  151. package/lib/build/src/screens/logger/logsTable/useScrollLogic.d.ts.map +1 -0
  152. package/lib/build/src/screens/logger/logsTable/useScrollLogic.js +86 -0
  153. package/lib/build/src/screens/logger/logsTable/useScrollLogic.js.map +1 -0
  154. package/lib/build/src/screens/logger/mapConnectorMessageToLogData.d.ts +6 -0
  155. package/lib/build/src/screens/logger/mapConnectorMessageToLogData.d.ts.map +1 -0
  156. package/lib/build/src/screens/logger/mapConnectorMessageToLogData.js +17 -0
  157. package/lib/build/src/screens/logger/mapConnectorMessageToLogData.js.map +1 -0
  158. package/lib/build/src/screens/logger/types.d.ts +6 -0
  159. package/lib/build/src/screens/logger/types.d.ts.map +1 -0
  160. package/lib/build/src/screens/logger/types.js +2 -0
  161. package/lib/build/src/screens/logger/types.js.map +1 -0
  162. package/lib/build/src/screens/logger/useColumnSizeVars.d.ts +4 -0
  163. package/lib/build/src/screens/logger/useColumnSizeVars.d.ts.map +1 -0
  164. package/lib/build/src/screens/logger/useColumnSizeVars.js +17 -0
  165. package/lib/build/src/screens/logger/useColumnSizeVars.js.map +1 -0
  166. package/lib/build/src/screens/logger/useLogsDataAndOptions.d.ts +12 -0
  167. package/lib/build/src/screens/logger/useLogsDataAndOptions.d.ts.map +1 -0
  168. package/lib/build/src/screens/logger/useLogsDataAndOptions.js +36 -0
  169. package/lib/build/src/screens/logger/useLogsDataAndOptions.js.map +1 -0
  170. package/lib/build/src/screens/logger/useRecentFilters.d.ts +18 -0
  171. package/lib/build/src/screens/logger/useRecentFilters.d.ts.map +1 -0
  172. package/lib/build/src/screens/logger/useRecentFilters.js +96 -0
  173. package/lib/build/src/screens/logger/useRecentFilters.js.map +1 -0
  174. package/lib/build/src/screens/logger/useSearchState.d.ts +24 -0
  175. package/lib/build/src/screens/logger/useSearchState.d.ts.map +1 -0
  176. package/lib/build/src/screens/logger/useSearchState.js +74 -0
  177. package/lib/build/src/screens/logger/useSearchState.js.map +1 -0
  178. package/lib/build/src/shared/NotConnectedMessage.d.ts +9 -0
  179. package/lib/build/src/shared/NotConnectedMessage.d.ts.map +1 -0
  180. package/lib/build/src/shared/NotConnectedMessage.js +30 -0
  181. package/lib/build/src/shared/NotConnectedMessage.js.map +1 -0
  182. package/lib/build/src/shared/PluginEvents.d.ts +9 -0
  183. package/lib/build/src/shared/PluginEvents.d.ts.map +1 -0
  184. package/lib/build/src/shared/PluginEvents.js +2 -0
  185. package/lib/build/src/shared/PluginEvents.js.map +1 -0
  186. package/lib/build/tsconfig.build.tsbuildinfo +1 -0
  187. package/lib/cjs/index.js +2 -0
  188. package/lib/cjs/index.js.map +7 -0
  189. package/lib/cjs/package.json +73 -0
  190. package/lib/cjs/src/Dashboard.js +12 -0
  191. package/lib/cjs/src/Dashboard.js.map +7 -0
  192. package/lib/cjs/src/ErrorBoundary.js +2 -0
  193. package/lib/cjs/src/ErrorBoundary.js.map +7 -0
  194. package/lib/cjs/src/PluginEvents.js +2 -0
  195. package/lib/cjs/src/PluginEvents.js.map +7 -0
  196. package/lib/cjs/src/components/DashboardFooter.js +25 -0
  197. package/lib/cjs/src/components/DashboardFooter.js.map +7 -0
  198. package/lib/cjs/src/components/DashboardNavigationBar.js +64 -0
  199. package/lib/cjs/src/components/DashboardNavigationBar.js.map +7 -0
  200. package/lib/cjs/src/components/DebugDrawer.js +58 -0
  201. package/lib/cjs/src/components/DebugDrawer.js.map +7 -0
  202. package/lib/cjs/src/components/SplitView.js +37 -0
  203. package/lib/cjs/src/components/SplitView.js.map +7 -0
  204. package/lib/cjs/src/hooks/commandDispatcher.js +2 -0
  205. package/lib/cjs/src/hooks/commandDispatcher.js.map +7 -0
  206. package/lib/cjs/src/hooks/connectorMessageHandlers.js +2 -0
  207. package/lib/cjs/src/hooks/connectorMessageHandlers.js.map +7 -0
  208. package/lib/cjs/src/hooks/useConnectorMessages.js +2 -0
  209. package/lib/cjs/src/hooks/useConnectorMessages.js.map +7 -0
  210. package/lib/cjs/src/screens/debugDevTools/index.js +2 -0
  211. package/lib/cjs/src/screens/debugDevTools/index.js.map +7 -0
  212. package/lib/cjs/src/screens/inspector/ApduSender.js +79 -0
  213. package/lib/cjs/src/screens/inspector/ApduSender.js.map +7 -0
  214. package/lib/cjs/src/screens/inspector/DeviceCard.js +2 -0
  215. package/lib/cjs/src/screens/inspector/DeviceCard.js.map +7 -0
  216. package/lib/cjs/src/screens/inspector/DeviceDiscoverySection.js +2 -0
  217. package/lib/cjs/src/screens/inspector/DeviceDiscoverySection.js.map +7 -0
  218. package/lib/cjs/src/screens/inspector/DiscoveredDeviceCard.js +57 -0
  219. package/lib/cjs/src/screens/inspector/DiscoveredDeviceCard.js.map +7 -0
  220. package/lib/cjs/src/screens/inspector/MyLedgerProviderControl.js +40 -0
  221. package/lib/cjs/src/screens/inspector/MyLedgerProviderControl.js.map +7 -0
  222. package/lib/cjs/src/screens/inspector/SessionsSection.js +2 -0
  223. package/lib/cjs/src/screens/inspector/SessionsSection.js.map +7 -0
  224. package/lib/cjs/src/screens/inspector/index.js +9 -0
  225. package/lib/cjs/src/screens/inspector/index.js.map +7 -0
  226. package/lib/cjs/src/screens/inspector/styles.js +179 -0
  227. package/lib/cjs/src/screens/inspector/styles.js.map +7 -0
  228. package/lib/cjs/src/screens/logger/FilterInput.js +85 -0
  229. package/lib/cjs/src/screens/logger/FilterInput.js.map +7 -0
  230. package/lib/cjs/src/screens/logger/LoggerOptions.js +6 -0
  231. package/lib/cjs/src/screens/logger/LoggerOptions.js.map +7 -0
  232. package/lib/cjs/src/screens/logger/LoggerToolbar.js +9 -0
  233. package/lib/cjs/src/screens/logger/LoggerToolbar.js.map +7 -0
  234. package/lib/cjs/src/screens/logger/SearchInput.js +59 -0
  235. package/lib/cjs/src/screens/logger/SearchInput.js.map +7 -0
  236. package/lib/cjs/src/screens/logger/filterUtils.js +2 -0
  237. package/lib/cjs/src/screens/logger/filterUtils.js.map +7 -0
  238. package/lib/cjs/src/screens/logger/filterUtils.test.js +2 -0
  239. package/lib/cjs/src/screens/logger/filterUtils.test.js.map +7 -0
  240. package/lib/cjs/src/screens/logger/index.js +6 -0
  241. package/lib/cjs/src/screens/logger/index.js.map +7 -0
  242. package/lib/cjs/src/screens/logger/inputStyles.js +31 -0
  243. package/lib/cjs/src/screens/logger/inputStyles.js.map +7 -0
  244. package/lib/cjs/src/screens/logger/logsTable/LogTableCells.js +8 -0
  245. package/lib/cjs/src/screens/logger/logsTable/LogTableCells.js.map +7 -0
  246. package/lib/cjs/src/screens/logger/logsTable/ScrollDownButton.js +15 -0
  247. package/lib/cjs/src/screens/logger/logsTable/ScrollDownButton.js.map +7 -0
  248. package/lib/cjs/src/screens/logger/logsTable/TableBody.js +24 -0
  249. package/lib/cjs/src/screens/logger/logsTable/TableBody.js.map +7 -0
  250. package/lib/cjs/src/screens/logger/logsTable/TableColumns.js +2 -0
  251. package/lib/cjs/src/screens/logger/logsTable/TableColumns.js.map +7 -0
  252. package/lib/cjs/src/screens/logger/logsTable/TableHeader.js +33 -0
  253. package/lib/cjs/src/screens/logger/logsTable/TableHeader.js.map +7 -0
  254. package/lib/cjs/src/screens/logger/logsTable/constants.js +2 -0
  255. package/lib/cjs/src/screens/logger/logsTable/constants.js.map +7 -0
  256. package/lib/cjs/src/screens/logger/logsTable/index.js +26 -0
  257. package/lib/cjs/src/screens/logger/logsTable/index.js.map +7 -0
  258. package/lib/cjs/src/screens/logger/logsTable/useColumnSizeVars.js +2 -0
  259. package/lib/cjs/src/screens/logger/logsTable/useColumnSizeVars.js.map +7 -0
  260. package/lib/cjs/src/screens/logger/logsTable/useResizeObserver.js +2 -0
  261. package/lib/cjs/src/screens/logger/logsTable/useResizeObserver.js.map +7 -0
  262. package/lib/cjs/src/screens/logger/logsTable/useScrollLogic.js +2 -0
  263. package/lib/cjs/src/screens/logger/logsTable/useScrollLogic.js.map +7 -0
  264. package/lib/cjs/src/screens/logger/mapConnectorMessageToLogData.js +2 -0
  265. package/lib/cjs/src/screens/logger/mapConnectorMessageToLogData.js.map +7 -0
  266. package/lib/cjs/src/screens/logger/types.js +2 -0
  267. package/lib/cjs/src/screens/logger/types.js.map +7 -0
  268. package/lib/cjs/src/screens/logger/useColumnSizeVars.js +2 -0
  269. package/lib/cjs/src/screens/logger/useColumnSizeVars.js.map +7 -0
  270. package/lib/cjs/src/screens/logger/useLogsDataAndOptions.js +2 -0
  271. package/lib/cjs/src/screens/logger/useLogsDataAndOptions.js.map +7 -0
  272. package/lib/cjs/src/screens/logger/useRecentFilters.js +2 -0
  273. package/lib/cjs/src/screens/logger/useRecentFilters.js.map +7 -0
  274. package/lib/cjs/src/screens/logger/useSearchState.js +2 -0
  275. package/lib/cjs/src/screens/logger/useSearchState.js.map +7 -0
  276. package/lib/cjs/src/shared/NotConnectedMessage.js +24 -0
  277. package/lib/cjs/src/shared/NotConnectedMessage.js.map +7 -0
  278. package/lib/cjs/src/shared/PluginEvents.js +2 -0
  279. package/lib/cjs/src/shared/PluginEvents.js.map +7 -0
  280. package/lib/esm/index.js +2 -0
  281. package/lib/esm/index.js.map +7 -0
  282. package/lib/esm/package.json +73 -0
  283. package/lib/esm/src/Dashboard.js +12 -0
  284. package/lib/esm/src/Dashboard.js.map +7 -0
  285. package/lib/esm/src/ErrorBoundary.js +2 -0
  286. package/lib/esm/src/ErrorBoundary.js.map +7 -0
  287. package/lib/esm/src/PluginEvents.js +1 -0
  288. package/lib/esm/src/PluginEvents.js.map +7 -0
  289. package/lib/esm/src/components/DashboardFooter.js +25 -0
  290. package/lib/esm/src/components/DashboardFooter.js.map +7 -0
  291. package/lib/esm/src/components/DashboardNavigationBar.js +64 -0
  292. package/lib/esm/src/components/DashboardNavigationBar.js.map +7 -0
  293. package/lib/esm/src/components/DebugDrawer.js +58 -0
  294. package/lib/esm/src/components/DebugDrawer.js.map +7 -0
  295. package/lib/esm/src/components/SplitView.js +37 -0
  296. package/lib/esm/src/components/SplitView.js.map +7 -0
  297. package/lib/esm/src/hooks/commandDispatcher.js +2 -0
  298. package/lib/esm/src/hooks/commandDispatcher.js.map +7 -0
  299. package/lib/esm/src/hooks/connectorMessageHandlers.js +2 -0
  300. package/lib/esm/src/hooks/connectorMessageHandlers.js.map +7 -0
  301. package/lib/esm/src/hooks/useConnectorMessages.js +2 -0
  302. package/lib/esm/src/hooks/useConnectorMessages.js.map +7 -0
  303. package/lib/esm/src/screens/debugDevTools/index.js +2 -0
  304. package/lib/esm/src/screens/debugDevTools/index.js.map +7 -0
  305. package/lib/esm/src/screens/inspector/ApduSender.js +79 -0
  306. package/lib/esm/src/screens/inspector/ApduSender.js.map +7 -0
  307. package/lib/esm/src/screens/inspector/DeviceCard.js +2 -0
  308. package/lib/esm/src/screens/inspector/DeviceCard.js.map +7 -0
  309. package/lib/esm/src/screens/inspector/DeviceDiscoverySection.js +2 -0
  310. package/lib/esm/src/screens/inspector/DeviceDiscoverySection.js.map +7 -0
  311. package/lib/esm/src/screens/inspector/DiscoveredDeviceCard.js +57 -0
  312. package/lib/esm/src/screens/inspector/DiscoveredDeviceCard.js.map +7 -0
  313. package/lib/esm/src/screens/inspector/MyLedgerProviderControl.js +40 -0
  314. package/lib/esm/src/screens/inspector/MyLedgerProviderControl.js.map +7 -0
  315. package/lib/esm/src/screens/inspector/SessionsSection.js +2 -0
  316. package/lib/esm/src/screens/inspector/SessionsSection.js.map +7 -0
  317. package/lib/esm/src/screens/inspector/index.js +9 -0
  318. package/lib/esm/src/screens/inspector/index.js.map +7 -0
  319. package/lib/esm/src/screens/inspector/styles.js +179 -0
  320. package/lib/esm/src/screens/inspector/styles.js.map +7 -0
  321. package/lib/esm/src/screens/logger/FilterInput.js +85 -0
  322. package/lib/esm/src/screens/logger/FilterInput.js.map +7 -0
  323. package/lib/esm/src/screens/logger/LoggerOptions.js +6 -0
  324. package/lib/esm/src/screens/logger/LoggerOptions.js.map +7 -0
  325. package/lib/esm/src/screens/logger/LoggerToolbar.js +9 -0
  326. package/lib/esm/src/screens/logger/LoggerToolbar.js.map +7 -0
  327. package/lib/esm/src/screens/logger/SearchInput.js +59 -0
  328. package/lib/esm/src/screens/logger/SearchInput.js.map +7 -0
  329. package/lib/esm/src/screens/logger/filterUtils.js +2 -0
  330. package/lib/esm/src/screens/logger/filterUtils.js.map +7 -0
  331. package/lib/esm/src/screens/logger/filterUtils.test.js +2 -0
  332. package/lib/esm/src/screens/logger/filterUtils.test.js.map +7 -0
  333. package/lib/esm/src/screens/logger/index.js +6 -0
  334. package/lib/esm/src/screens/logger/index.js.map +7 -0
  335. package/lib/esm/src/screens/logger/inputStyles.js +31 -0
  336. package/lib/esm/src/screens/logger/inputStyles.js.map +7 -0
  337. package/lib/esm/src/screens/logger/logsTable/LogTableCells.js +8 -0
  338. package/lib/esm/src/screens/logger/logsTable/LogTableCells.js.map +7 -0
  339. package/lib/esm/src/screens/logger/logsTable/ScrollDownButton.js +15 -0
  340. package/lib/esm/src/screens/logger/logsTable/ScrollDownButton.js.map +7 -0
  341. package/lib/esm/src/screens/logger/logsTable/TableBody.js +24 -0
  342. package/lib/esm/src/screens/logger/logsTable/TableBody.js.map +7 -0
  343. package/lib/esm/src/screens/logger/logsTable/TableColumns.js +2 -0
  344. package/lib/esm/src/screens/logger/logsTable/TableColumns.js.map +7 -0
  345. package/lib/esm/src/screens/logger/logsTable/TableHeader.js +33 -0
  346. package/lib/esm/src/screens/logger/logsTable/TableHeader.js.map +7 -0
  347. package/lib/esm/src/screens/logger/logsTable/constants.js +2 -0
  348. package/lib/esm/src/screens/logger/logsTable/constants.js.map +7 -0
  349. package/lib/esm/src/screens/logger/logsTable/index.js +26 -0
  350. package/lib/esm/src/screens/logger/logsTable/index.js.map +7 -0
  351. package/lib/esm/src/screens/logger/logsTable/useColumnSizeVars.js +2 -0
  352. package/lib/esm/src/screens/logger/logsTable/useColumnSizeVars.js.map +7 -0
  353. package/lib/esm/src/screens/logger/logsTable/useResizeObserver.js +2 -0
  354. package/lib/esm/src/screens/logger/logsTable/useResizeObserver.js.map +7 -0
  355. package/lib/esm/src/screens/logger/logsTable/useScrollLogic.js +2 -0
  356. package/lib/esm/src/screens/logger/logsTable/useScrollLogic.js.map +7 -0
  357. package/lib/esm/src/screens/logger/mapConnectorMessageToLogData.js +2 -0
  358. package/lib/esm/src/screens/logger/mapConnectorMessageToLogData.js.map +7 -0
  359. package/lib/esm/src/screens/logger/types.js +1 -0
  360. package/lib/esm/src/screens/logger/types.js.map +7 -0
  361. package/lib/esm/src/screens/logger/useColumnSizeVars.js +2 -0
  362. package/lib/esm/src/screens/logger/useColumnSizeVars.js.map +7 -0
  363. package/lib/esm/src/screens/logger/useLogsDataAndOptions.js +2 -0
  364. package/lib/esm/src/screens/logger/useLogsDataAndOptions.js.map +7 -0
  365. package/lib/esm/src/screens/logger/useRecentFilters.js +2 -0
  366. package/lib/esm/src/screens/logger/useRecentFilters.js.map +7 -0
  367. package/lib/esm/src/screens/logger/useSearchState.js +2 -0
  368. package/lib/esm/src/screens/logger/useSearchState.js.map +7 -0
  369. package/lib/esm/src/shared/NotConnectedMessage.js +24 -0
  370. package/lib/esm/src/shared/NotConnectedMessage.js.map +7 -0
  371. package/lib/esm/src/shared/PluginEvents.js +1 -0
  372. package/lib/esm/src/shared/PluginEvents.js.map +7 -0
  373. package/package.json +73 -0
@@ -0,0 +1,64 @@
1
+ import e from"styled-components";import{jsx as t,jsxs as i}from"react/jsx-runtime";var b=(n=>(n.logs="logs",n.inspector="inspector",n.splitHorizontal="splitHorizontal",n.splitVertical="splitVertical",n))(b||{});const g=e.div`
2
+ display: flex;
3
+ flex-direction: row;
4
+ align-items: center;
5
+ gap: 8px;
6
+ padding: 8px 12px;
7
+ background: #f8f8f8;
8
+ border-bottom: 1px solid #e0e0e0;
9
+ flex-shrink: 0;
10
+ `,s=e.div`
11
+ display: flex;
12
+ flex-direction: row;
13
+ align-items: center;
14
+ gap: 4px;
15
+ `,h=e.div`
16
+ width: 1px;
17
+ height: 24px;
18
+ background: #ddd;
19
+ margin: 0 8px;
20
+ `,d=e.button`
21
+ padding: 6px 12px;
22
+ border: 1px solid ${({$isActive:o})=>o?"#2196F3":"#ddd"};
23
+ border-radius: 4px;
24
+ background: ${({$isActive:o})=>o?"#e3f2fd":"white"};
25
+ color: ${({$isActive:o})=>o?"#1976d2":"#333"};
26
+ font-weight: ${({$isActive:o})=>o?"600":"normal"};
27
+ font-size: 13px;
28
+ cursor: pointer;
29
+ opacity: ${({$isConnected:o})=>o===!1?.5:1};
30
+ transition: all 0.15s ease;
31
+
32
+ &:hover {
33
+ background: ${({$isActive:o})=>o?"#e3f2fd":"#f5f5f5"};
34
+ border-color: ${({$isActive:o})=>o?"#2196F3":"#bbb"};
35
+ }
36
+ `,c=e.button`
37
+ padding: 6px 8px;
38
+ border: 1px solid ${({$isActive:o})=>o?"#2196F3":"#ddd"};
39
+ border-radius: 4px;
40
+ background: ${({$isActive:o})=>o?"#e3f2fd":"white"};
41
+ color: ${({$isActive:o})=>o?"#1976d2":"#666"};
42
+ cursor: pointer;
43
+ display: flex;
44
+ align-items: center;
45
+ justify-content: center;
46
+ transition: all 0.15s ease;
47
+
48
+ &:hover {
49
+ background: ${({$isActive:o})=>o?"#e3f2fd":"#f5f5f5"};
50
+ border-color: ${({$isActive:o})=>o?"#2196F3":"#bbb"};
51
+ }
52
+ `,p=e.span`
53
+ display: inline-block;
54
+ width: 8px;
55
+ height: 8px;
56
+ border-radius: 50%;
57
+ background: ${({$connected:o})=>o?"#4CAF50":"#ff9800"};
58
+ margin-right: 6px;
59
+ `,x=e.span`
60
+ font-size: 12px;
61
+ color: #666;
62
+ margin-right: 4px;
63
+ `,f=()=>i("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"currentColor",children:[t("rect",{x:"2",y:"2",width:"12",height:"5",rx:"1",opacity:"0.6"}),t("rect",{x:"2",y:"9",width:"12",height:"5",rx:"1"})]}),v=()=>i("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"currentColor",children:[t("rect",{x:"2",y:"2",width:"5",height:"12",rx:"1",opacity:"0.6"}),t("rect",{x:"9",y:"2",width:"5",height:"12",rx:"1"})]}),$=({currentScreen:o,onScreenChange:r,isLoggerConnected:a,isInspectorConnected:l})=>i(g,{children:[i(s,{children:[i(d,{$isActive:o==="logs",$isConnected:a,onClick:()=>r("logs"),children:[t(p,{$connected:a}),"Logger"]}),i(d,{$isActive:o==="inspector",$isConnected:l,onClick:()=>r("inspector"),children:[t(p,{$connected:l}),"Inspector"]})]}),t(h,{}),i(s,{children:[t(x,{children:"Split:"}),t(c,{$isActive:o==="splitHorizontal",onClick:()=>r("splitHorizontal"),title:"Split Horizontal (top/bottom)",children:t(f,{})}),t(c,{$isActive:o==="splitVertical",onClick:()=>r("splitVertical"),title:"Split Vertical (left/right)",children:t(v,{})})]})]});export{$ as DashboardNavigationBar,b as DashboardScreen};
64
+ //# sourceMappingURL=DashboardNavigationBar.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/components/DashboardNavigationBar.tsx"],
4
+ "sourcesContent": ["import React from \"react\";\nimport styled from \"styled-components\";\n\nexport enum DashboardScreen {\n logs = \"logs\",\n inspector = \"inspector\",\n splitHorizontal = \"splitHorizontal\",\n splitVertical = \"splitVertical\",\n}\n\nconst NavContainer = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: #f8f8f8;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n`;\n\nconst NavGroup = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 4px;\n`;\n\nconst Divider = styled.div`\n width: 1px;\n height: 24px;\n background: #ddd;\n margin: 0 8px;\n`;\n\nconst NavButton = styled.button<{\n $isActive?: boolean;\n $isConnected?: boolean;\n}>`\n padding: 6px 12px;\n border: 1px solid ${({ $isActive }) => ($isActive ? \"#2196F3\" : \"#ddd\")};\n border-radius: 4px;\n background: ${({ $isActive }) => ($isActive ? \"#e3f2fd\" : \"white\")};\n color: ${({ $isActive }) => ($isActive ? \"#1976d2\" : \"#333\")};\n font-weight: ${({ $isActive }) => ($isActive ? \"600\" : \"normal\")};\n font-size: 13px;\n cursor: pointer;\n opacity: ${({ $isConnected }) => ($isConnected === false ? 0.5 : 1)};\n transition: all 0.15s ease;\n\n &:hover {\n background: ${({ $isActive }) => ($isActive ? \"#e3f2fd\" : \"#f5f5f5\")};\n border-color: ${({ $isActive }) => ($isActive ? \"#2196F3\" : \"#bbb\")};\n }\n`;\n\nconst SplitButton = styled.button<{ $isActive?: boolean }>`\n padding: 6px 8px;\n border: 1px solid ${({ $isActive }) => ($isActive ? \"#2196F3\" : \"#ddd\")};\n border-radius: 4px;\n background: ${({ $isActive }) => ($isActive ? \"#e3f2fd\" : \"white\")};\n color: ${({ $isActive }) => ($isActive ? \"#1976d2\" : \"#666\")};\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.15s ease;\n\n &:hover {\n background: ${({ $isActive }) => ($isActive ? \"#e3f2fd\" : \"#f5f5f5\")};\n border-color: ${({ $isActive }) => ($isActive ? \"#2196F3\" : \"#bbb\")};\n }\n`;\n\nconst ConnectionIndicator = styled.span<{ $connected: boolean }>`\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: ${({ $connected }) => ($connected ? \"#4CAF50\" : \"#ff9800\")};\n margin-right: 6px;\n`;\n\nconst SplitLabel = styled.span`\n font-size: 12px;\n color: #666;\n margin-right: 4px;\n`;\n\n// Simple SVG icons for split buttons\nconst SplitHorizontalIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <rect x=\"2\" y=\"2\" width=\"12\" height=\"5\" rx=\"1\" opacity=\"0.6\" />\n <rect x=\"2\" y=\"9\" width=\"12\" height=\"5\" rx=\"1\" />\n </svg>\n);\n\nconst SplitVerticalIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <rect x=\"2\" y=\"2\" width=\"5\" height=\"12\" rx=\"1\" opacity=\"0.6\" />\n <rect x=\"9\" y=\"2\" width=\"5\" height=\"12\" rx=\"1\" />\n </svg>\n);\n\ntype DashboardNavigationBarProps = {\n currentScreen: DashboardScreen;\n onScreenChange: (screen: DashboardScreen) => void;\n isLoggerConnected: boolean;\n isInspectorConnected: boolean;\n};\n\nexport const DashboardNavigationBar: React.FC<DashboardNavigationBarProps> = ({\n currentScreen,\n onScreenChange,\n isLoggerConnected,\n isInspectorConnected,\n}) => {\n return (\n <NavContainer>\n {/* Main view buttons */}\n <NavGroup>\n <NavButton\n $isActive={currentScreen === DashboardScreen.logs}\n $isConnected={isLoggerConnected}\n onClick={() => onScreenChange(DashboardScreen.logs)}\n >\n <ConnectionIndicator $connected={isLoggerConnected} />\n Logger\n </NavButton>\n <NavButton\n $isActive={currentScreen === DashboardScreen.inspector}\n $isConnected={isInspectorConnected}\n onClick={() => onScreenChange(DashboardScreen.inspector)}\n >\n <ConnectionIndicator $connected={isInspectorConnected} />\n Inspector\n </NavButton>\n </NavGroup>\n\n <Divider />\n\n {/* Split view buttons */}\n <NavGroup>\n <SplitLabel>Split:</SplitLabel>\n <SplitButton\n $isActive={currentScreen === DashboardScreen.splitHorizontal}\n onClick={() => onScreenChange(DashboardScreen.splitHorizontal)}\n title=\"Split Horizontal (top/bottom)\"\n >\n <SplitHorizontalIcon />\n </SplitButton>\n <SplitButton\n $isActive={currentScreen === DashboardScreen.splitVertical}\n onClick={() => onScreenChange(DashboardScreen.splitVertical)}\n title=\"Split Vertical (left/right)\"\n >\n <SplitVerticalIcon />\n </SplitButton>\n </NavGroup>\n </NavContainer>\n );\n};\n"],
5
+ "mappings": "AACA,OAAOA,MAAY,oBA0FjB,OACE,OAAAC,EADF,QAAAC,MAAA,oBAxFK,IAAKC,OACVA,EAAA,KAAO,OACPA,EAAA,UAAY,YACZA,EAAA,gBAAkB,kBAClBA,EAAA,cAAgB,gBAJNA,OAAA,IAOZ,MAAMC,EAAeJ,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWtBK,EAAWL,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAOlBM,EAAUN,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjBO,EAAYP,EAAO;AAAA;AAAA,sBAKH,CAAC,CAAE,UAAAQ,CAAU,IAAOA,EAAY,UAAY,MAAO;AAAA;AAAA,gBAEzD,CAAC,CAAE,UAAAA,CAAU,IAAOA,EAAY,UAAY,OAAQ;AAAA,WACzD,CAAC,CAAE,UAAAA,CAAU,IAAOA,EAAY,UAAY,MAAO;AAAA,iBAC7C,CAAC,CAAE,UAAAA,CAAU,IAAOA,EAAY,MAAQ,QAAS;AAAA;AAAA;AAAA,aAGrD,CAAC,CAAE,aAAAC,CAAa,IAAOA,IAAiB,GAAQ,GAAM,CAAE;AAAA;AAAA;AAAA;AAAA,kBAInD,CAAC,CAAE,UAAAD,CAAU,IAAOA,EAAY,UAAY,SAAU;AAAA,oBACpD,CAAC,CAAE,UAAAA,CAAU,IAAOA,EAAY,UAAY,MAAO;AAAA;AAAA,EAIjEE,EAAcV,EAAO;AAAA;AAAA,sBAEL,CAAC,CAAE,UAAAQ,CAAU,IAAOA,EAAY,UAAY,MAAO;AAAA;AAAA,gBAEzD,CAAC,CAAE,UAAAA,CAAU,IAAOA,EAAY,UAAY,OAAQ;AAAA,WACzD,CAAC,CAAE,UAAAA,CAAU,IAAOA,EAAY,UAAY,MAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAQ5C,CAAC,CAAE,UAAAA,CAAU,IAAOA,EAAY,UAAY,SAAU;AAAA,oBACpD,CAAC,CAAE,UAAAA,CAAU,IAAOA,EAAY,UAAY,MAAO;AAAA;AAAA,EAIjEG,EAAsBX,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,gBAKnB,CAAC,CAAE,WAAAY,CAAW,IAAOA,EAAa,UAAY,SAAU;AAAA;AAAA,EAIlEC,EAAab,EAAO;AAAA;AAAA;AAAA;AAAA,EAOpBc,EAAsB,IAC1BZ,EAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,eACnD,UAAAD,EAAC,QAAK,EAAE,IAAI,EAAE,IAAI,MAAM,KAAK,OAAO,IAAI,GAAG,IAAI,QAAQ,MAAM,EAC7DA,EAAC,QAAK,EAAE,IAAI,EAAE,IAAI,MAAM,KAAK,OAAO,IAAI,GAAG,IAAI,GACjD,EAGIc,EAAoB,IACxBb,EAAC,OAAI,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,eACnD,UAAAD,EAAC,QAAK,EAAE,IAAI,EAAE,IAAI,MAAM,IAAI,OAAO,KAAK,GAAG,IAAI,QAAQ,MAAM,EAC7DA,EAAC,QAAK,EAAE,IAAI,EAAE,IAAI,MAAM,IAAI,OAAO,KAAK,GAAG,IAAI,GACjD,EAUWe,EAAgE,CAAC,CAC5E,cAAAC,EACA,eAAAC,EACA,kBAAAC,EACA,qBAAAC,CACF,IAEIlB,EAACE,EAAA,CAEC,UAAAF,EAACG,EAAA,CACC,UAAAH,EAACK,EAAA,CACC,UAAWU,IAAkB,OAC7B,aAAcE,EACd,QAAS,IAAMD,EAAe,MAAoB,EAElD,UAAAjB,EAACU,EAAA,CAAoB,WAAYQ,EAAmB,EAAE,UAExD,EACAjB,EAACK,EAAA,CACC,UAAWU,IAAkB,YAC7B,aAAcG,EACd,QAAS,IAAMF,EAAe,WAAyB,EAEvD,UAAAjB,EAACU,EAAA,CAAoB,WAAYS,EAAsB,EAAE,aAE3D,GACF,EAEAnB,EAACK,EAAA,EAAQ,EAGTJ,EAACG,EAAA,CACC,UAAAJ,EAACY,EAAA,CAAW,kBAAM,EAClBZ,EAACS,EAAA,CACC,UAAWO,IAAkB,kBAC7B,QAAS,IAAMC,EAAe,iBAA+B,EAC7D,MAAM,gCAEN,SAAAjB,EAACa,EAAA,EAAoB,EACvB,EACAb,EAACS,EAAA,CACC,UAAWO,IAAkB,gBAC7B,QAAS,IAAMC,EAAe,eAA6B,EAC3D,MAAM,8BAEN,SAAAjB,EAACc,EAAA,EAAkB,EACrB,GACF,GACF",
6
+ "names": ["styled", "jsx", "jsxs", "DashboardScreen", "NavContainer", "NavGroup", "Divider", "NavButton", "$isActive", "$isConnected", "SplitButton", "ConnectionIndicator", "$connected", "SplitLabel", "SplitHorizontalIcon", "SplitVerticalIcon", "DashboardNavigationBar", "currentScreen", "onScreenChange", "isLoggerConnected", "isInspectorConnected"]
7
+ }
@@ -0,0 +1,58 @@
1
+ import o from"styled-components";import{DebugDevTools as d}from"../screens/debugDevTools";import{Fragment as x,jsx as r,jsxs as t}from"react/jsx-runtime";const p=o.div`
2
+ position: fixed;
3
+ top: 0;
4
+ left: 0;
5
+ right: 0;
6
+ bottom: 0;
7
+ background: rgba(0, 0, 0, 0.3);
8
+ opacity: ${({$isOpen:e})=>e?1:0};
9
+ visibility: ${({$isOpen:e})=>e?"visible":"hidden"};
10
+ transition:
11
+ opacity 0.2s ease,
12
+ visibility 0.2s ease;
13
+ z-index: 100;
14
+ `,l=o.div`
15
+ position: fixed;
16
+ bottom: 0;
17
+ left: 0;
18
+ right: 0;
19
+ height: 50%;
20
+ background: white;
21
+ border-top: 2px solid #ddd;
22
+ transform: translateY(${({$isOpen:e})=>e?"0":"100%"});
23
+ transition: transform 0.25s ease;
24
+ z-index: 101;
25
+ display: flex;
26
+ flex-direction: column;
27
+ `,g=o.div`
28
+ display: flex;
29
+ flex-direction: row;
30
+ align-items: center;
31
+ justify-content: space-between;
32
+ padding: 8px 16px;
33
+ background: #f5f5f5;
34
+ border-bottom: 1px solid #ddd;
35
+ flex-shrink: 0;
36
+ `,c=o.h4`
37
+ margin: 0;
38
+ font-size: 14px;
39
+ font-weight: 600;
40
+ color: #333;
41
+ `,b=o.button`
42
+ padding: 4px 8px;
43
+ border: none;
44
+ border-radius: 4px;
45
+ background: transparent;
46
+ color: #666;
47
+ font-size: 18px;
48
+ cursor: pointer;
49
+ transition: background 0.15s ease;
50
+
51
+ &:hover {
52
+ background: #e0e0e0;
53
+ }
54
+ `,f=o.div`
55
+ flex: 1;
56
+ overflow: hidden;
57
+ `,w=({isOpen:e,onClose:s,sentMessages:i,receivedMessages:n,sendMessage:a})=>t(x,{children:[r(p,{$isOpen:e,onClick:s}),t(l,{$isOpen:e,children:[t(g,{children:[r(c,{children:"Debug DevTools"}),r(b,{onClick:s,children:"\xD7"})]}),r(f,{children:r(d,{sentMessages:i,receivedMessages:n,sendMessage:a})})]})]});export{w as DebugDrawer};
58
+ //# sourceMappingURL=DebugDrawer.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/components/DebugDrawer.tsx"],
4
+ "sourcesContent": ["/**\n * @file DebugDrawer component\n *\n * A slide-up drawer that displays the Debug DevTools panel.\n * Shows raw sent/received connector messages for debugging purposes.\n */\n\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nimport { DebugDevTools } from \"../screens/debugDevTools\";\nimport { type Message } from \"../shared/PluginEvents\";\n\nconst DrawerOverlay = styled.div<{ $isOpen: boolean }>`\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.3);\n opacity: ${({ $isOpen }) => ($isOpen ? 1 : 0)};\n visibility: ${({ $isOpen }) => ($isOpen ? \"visible\" : \"hidden\")};\n transition:\n opacity 0.2s ease,\n visibility 0.2s ease;\n z-index: 100;\n`;\n\nconst DrawerContainer = styled.div<{ $isOpen: boolean }>`\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n height: 50%;\n background: white;\n border-top: 2px solid #ddd;\n transform: translateY(${({ $isOpen }) => ($isOpen ? \"0\" : \"100%\")});\n transition: transform 0.25s ease;\n z-index: 101;\n display: flex;\n flex-direction: column;\n`;\n\nconst DrawerHeader = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n padding: 8px 16px;\n background: #f5f5f5;\n border-bottom: 1px solid #ddd;\n flex-shrink: 0;\n`;\n\nconst DrawerTitle = styled.h4`\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n`;\n\nconst CloseButton = styled.button`\n padding: 4px 8px;\n border: none;\n border-radius: 4px;\n background: transparent;\n color: #666;\n font-size: 18px;\n cursor: pointer;\n transition: background 0.15s ease;\n\n &:hover {\n background: #e0e0e0;\n }\n`;\n\nconst DrawerContent = styled.div`\n flex: 1;\n overflow: hidden;\n`;\n\ntype DebugDrawerProps = {\n isOpen: boolean;\n onClose: () => void;\n sentMessages: Message[];\n receivedMessages: Message[];\n sendMessage: (type: string, payload: string) => void;\n};\n\nexport const DebugDrawer: React.FC<DebugDrawerProps> = ({\n isOpen,\n onClose,\n sentMessages,\n receivedMessages,\n sendMessage,\n}) => {\n return (\n <>\n <DrawerOverlay $isOpen={isOpen} onClick={onClose} />\n <DrawerContainer $isOpen={isOpen}>\n <DrawerHeader>\n <DrawerTitle>Debug DevTools</DrawerTitle>\n <CloseButton onClick={onClose}>\u00D7</CloseButton>\n </DrawerHeader>\n <DrawerContent>\n <DebugDevTools\n sentMessages={sentMessages}\n receivedMessages={receivedMessages}\n sendMessage={sendMessage}\n />\n </DrawerContent>\n </DrawerContainer>\n </>\n );\n};\n"],
5
+ "mappings": "AAQA,OAAOA,MAAY,oBAEnB,OAAS,iBAAAC,MAAqB,2BAuF1B,mBAAAC,EACE,OAAAC,EAEE,QAAAC,MAHJ,oBApFJ,MAAMC,EAAgBL,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAOhB,CAAC,CAAE,QAAAM,CAAQ,IAAOA,EAAU,EAAI,CAAE;AAAA,gBAC/B,CAAC,CAAE,QAAAA,CAAQ,IAAOA,EAAU,UAAY,QAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAO3DC,EAAkBP,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAQL,CAAC,CAAE,QAAAM,CAAQ,IAAOA,EAAU,IAAM,MAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAO7DE,EAAeR,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWtBS,EAAcT,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAOrBU,EAAcV,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAerBW,EAAgBX,EAAO;AAAA;AAAA;AAAA,EAahBY,EAA0C,CAAC,CACtD,OAAAC,EACA,QAAAC,EACA,aAAAC,EACA,iBAAAC,EACA,YAAAC,CACF,IAEIb,EAAAF,EAAA,CACE,UAAAC,EAACE,EAAA,CAAc,QAASQ,EAAQ,QAASC,EAAS,EAClDV,EAACG,EAAA,CAAgB,QAASM,EACxB,UAAAT,EAACI,EAAA,CACC,UAAAL,EAACM,EAAA,CAAY,0BAAc,EAC3BN,EAACO,EAAA,CAAY,QAASI,EAAS,gBAAC,GAClC,EACAX,EAACQ,EAAA,CACC,SAAAR,EAACF,EAAA,CACC,aAAcc,EACd,iBAAkBC,EAClB,YAAaC,EACf,EACF,GACF,GACF",
6
+ "names": ["styled", "DebugDevTools", "Fragment", "jsx", "jsxs", "DrawerOverlay", "$isOpen", "DrawerContainer", "DrawerHeader", "DrawerTitle", "CloseButton", "DrawerContent", "DebugDrawer", "isOpen", "onClose", "sentMessages", "receivedMessages", "sendMessage"]
7
+ }
@@ -0,0 +1,37 @@
1
+ import{Group as d,Panel as n,Separator as p}from"react-resizable-panels";import t from"styled-components";import{jsx as i,jsxs as m}from"react/jsx-runtime";const h=t(p)`
2
+ background: #e0e0e0;
3
+ transition: background 0.15s ease;
4
+
5
+ &:hover {
6
+ background: #bbb;
7
+ }
8
+
9
+ &[data-resize-handle-active] {
10
+ background: #999;
11
+ }
12
+
13
+ /* Horizontal split: thin horizontal bar between top/bottom panels */
14
+ ${({$direction:e})=>e==="horizontal"&&`
15
+ height: 4px;
16
+ cursor: row-resize;
17
+ `}
18
+
19
+ /* Vertical split: thin vertical bar between left/right panels */
20
+ ${({$direction:e})=>e==="vertical"&&`
21
+ width: 4px;
22
+ cursor: col-resize;
23
+ `}
24
+ `,r=t.div`
25
+ display: flex;
26
+ flex-direction: column;
27
+ height: 100%;
28
+ overflow: hidden;
29
+ `,z=t.div`
30
+ display: flex;
31
+ flex: 1;
32
+ width: 100%;
33
+ height: 100%;
34
+ min-height: 0;
35
+ min-width: 0;
36
+ `,S=({direction:e,first:o,second:a,defaultFirstSize:l="50%",minFirstSize:c="20%",minSecondSize:s="20%"})=>i(z,{children:m(d,{orientation:e==="horizontal"?"vertical":"horizontal",style:{flex:1},children:[i(n,{defaultSize:l,minSize:c,children:i(r,{children:o})}),i(h,{$direction:e}),i(n,{minSize:s,children:i(r,{children:a})})]})});export{S as SplitView};
37
+ //# sourceMappingURL=SplitView.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/components/SplitView.tsx"],
4
+ "sourcesContent": ["import React from \"react\";\nimport { Group, Panel, Separator } from \"react-resizable-panels\";\nimport styled from \"styled-components\";\n\nconst ResizeHandle = styled(Separator)<{\n $direction: \"horizontal\" | \"vertical\";\n}>`\n background: #e0e0e0;\n transition: background 0.15s ease;\n\n &:hover {\n background: #bbb;\n }\n\n &[data-resize-handle-active] {\n background: #999;\n }\n\n /* Horizontal split: thin horizontal bar between top/bottom panels */\n ${({ $direction }) =>\n $direction === \"horizontal\" &&\n `\n height: 4px;\n cursor: row-resize;\n `}\n\n /* Vertical split: thin vertical bar between left/right panels */\n ${({ $direction }) =>\n $direction === \"vertical\" &&\n `\n width: 4px;\n cursor: col-resize;\n `}\n`;\n\nconst PanelContainer = styled.div`\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n`;\n\nconst SplitViewContainer = styled.div`\n display: flex;\n flex: 1;\n width: 100%;\n height: 100%;\n min-height: 0;\n min-width: 0;\n`;\n\ntype SplitViewProps = {\n direction: \"horizontal\" | \"vertical\";\n first: React.ReactNode;\n second: React.ReactNode;\n defaultFirstSize?: number | string;\n minFirstSize?: number | string;\n minSecondSize?: number | string;\n};\n\nexport const SplitView: React.FC<SplitViewProps> = ({\n direction,\n first,\n second,\n defaultFirstSize = \"50%\",\n minFirstSize = \"20%\",\n minSecondSize = \"20%\",\n}) => {\n // react-resizable-panels uses \"horizontal\" for left/right split\n // and \"vertical\" for top/bottom split (opposite of our naming)\n const panelOrientation =\n direction === \"horizontal\" ? \"vertical\" : \"horizontal\";\n\n return (\n <SplitViewContainer>\n <Group orientation={panelOrientation} style={{ flex: 1 }}>\n <Panel defaultSize={defaultFirstSize} minSize={minFirstSize}>\n <PanelContainer>{first}</PanelContainer>\n </Panel>\n <ResizeHandle $direction={direction} />\n <Panel minSize={minSecondSize}>\n <PanelContainer>{second}</PanelContainer>\n </Panel>\n </Group>\n </SplitViewContainer>\n );\n};\n"],
5
+ "mappings": "AACA,OAAS,SAAAA,EAAO,SAAAC,EAAO,aAAAC,MAAiB,yBACxC,OAAOC,MAAY,oBAyEb,OAEI,OAAAC,EAFJ,QAAAC,MAAA,oBAvEN,MAAMC,EAAeH,EAAOD,CAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAejC,CAAC,CAAE,WAAAK,CAAW,IACdA,IAAe,cACf;AAAA;AAAA;AAAA,GAGD;AAAA;AAAA;AAAA,IAGC,CAAC,CAAE,WAAAA,CAAW,IACdA,IAAe,YACf;AAAA;AAAA;AAAA,GAGD;AAAA,EAGGC,EAAiBL,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAOxBM,EAAqBN,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBrBO,EAAsC,CAAC,CAClD,UAAAC,EACA,MAAAC,EACA,OAAAC,EACA,iBAAAC,EAAmB,MACnB,aAAAC,EAAe,MACf,cAAAC,EAAgB,KAClB,IAOIZ,EAACK,EAAA,CACC,SAAAJ,EAACL,EAAA,CAAM,YAJTW,IAAc,aAAe,WAAa,aAIF,MAAO,CAAE,KAAM,CAAE,EACrD,UAAAP,EAACH,EAAA,CAAM,YAAaa,EAAkB,QAASC,EAC7C,SAAAX,EAACI,EAAA,CAAgB,SAAAI,EAAM,EACzB,EACAR,EAACE,EAAA,CAAa,WAAYK,EAAW,EACrCP,EAACH,EAAA,CAAM,QAASe,EACd,SAAAZ,EAACI,EAAA,CAAgB,SAAAK,EAAO,EAC1B,GACF,EACF",
6
+ "names": ["Group", "Panel", "Separator", "styled", "jsx", "jsxs", "ResizeHandle", "$direction", "PanelContainer", "SplitViewContainer", "SplitView", "direction", "first", "second", "defaultFirstSize", "minFirstSize", "minSecondSize"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{INSPECTOR_COMMAND_TYPES as s}from"@ledgerhq/device-management-kit-devtools-core";function m(e){return{startListeningCommand:()=>e.sendMessage(s.START_LISTENING_DEVICES,"{}"),stopListeningCommand:()=>e.sendMessage(s.STOP_LISTENING_DEVICES,"{}"),startDiscoveringCommand:()=>e.sendMessage(s.START_DISCOVERING,"{}"),stopDiscoveringCommand:()=>e.sendMessage(s.STOP_DISCOVERING,"{}"),connectDeviceCommand:(n,r)=>e.sendMessage(s.CONNECT_DEVICE,JSON.stringify({deviceId:n,sessionRefresherOptions:r}))}}function C(e){return{getProviderCommand:()=>e.sendMessage(s.GET_PROVIDER,"{}"),setProviderCommand:n=>e.sendMessage(s.SET_PROVIDER,JSON.stringify({provider:n}))}}let d=0;function g(e){return{sendApduCommand:(n,r)=>{const t=`apdu-${++d}`,a=r.match(/.{1,2}/g)?.map(o=>parseInt(o,16))||[];return e.sendMessage(s.SEND_APDU,JSON.stringify({sessionId:n,apdu:a,requestId:t})),t}}}export{g as createApduCommands,m as createDiscoveryCommands,C as createProviderCommands};
2
+ //# sourceMappingURL=commandDispatcher.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/hooks/commandDispatcher.ts"],
4
+ "sourcesContent": ["import {\n type Connector,\n INSPECTOR_COMMAND_TYPES,\n} from \"@ledgerhq/device-management-kit-devtools-core\";\n\n/**\n * Create discovery-related command dispatchers.\n */\nexport function createDiscoveryCommands(connector: Connector) {\n return {\n startListeningCommand: () =>\n connector.sendMessage(\n INSPECTOR_COMMAND_TYPES.START_LISTENING_DEVICES,\n \"{}\",\n ),\n stopListeningCommand: () =>\n connector.sendMessage(\n INSPECTOR_COMMAND_TYPES.STOP_LISTENING_DEVICES,\n \"{}\",\n ),\n startDiscoveringCommand: () =>\n connector.sendMessage(INSPECTOR_COMMAND_TYPES.START_DISCOVERING, \"{}\"),\n stopDiscoveringCommand: () =>\n connector.sendMessage(INSPECTOR_COMMAND_TYPES.STOP_DISCOVERING, \"{}\"),\n connectDeviceCommand: (\n deviceId: string,\n sessionRefresherOptions?: {\n isRefresherDisabled: boolean;\n pollingInterval?: number;\n },\n ) =>\n connector.sendMessage(\n INSPECTOR_COMMAND_TYPES.CONNECT_DEVICE,\n JSON.stringify({ deviceId, sessionRefresherOptions }),\n ),\n };\n}\n\n/**\n * Create provider-related command dispatchers.\n */\nexport function createProviderCommands(connector: Connector) {\n return {\n getProviderCommand: () =>\n connector.sendMessage(INSPECTOR_COMMAND_TYPES.GET_PROVIDER, \"{}\"),\n setProviderCommand: (value: number) =>\n connector.sendMessage(\n INSPECTOR_COMMAND_TYPES.SET_PROVIDER,\n JSON.stringify({ provider: value }),\n ),\n };\n}\n\nlet apduRequestCounter = 0;\n\n/**\n * Create APDU-related command dispatchers.\n */\nexport function createApduCommands(connector: Connector) {\n return {\n sendApduCommand: (sessionId: string, apduHex: string): string => {\n const requestId = `apdu-${++apduRequestCounter}`;\n // Convert hex string to array of bytes\n const apdu =\n apduHex.match(/.{1,2}/g)?.map((byte) => parseInt(byte, 16)) || [];\n connector.sendMessage(\n INSPECTOR_COMMAND_TYPES.SEND_APDU,\n JSON.stringify({ sessionId, apdu, requestId }),\n );\n return requestId;\n },\n };\n}\n"],
5
+ "mappings": "AAAA,OAEE,2BAAAA,MACK,gDAKA,SAASC,EAAwBC,EAAsB,CAC5D,MAAO,CACL,sBAAuB,IACrBA,EAAU,YACRF,EAAwB,wBACxB,IACF,EACF,qBAAsB,IACpBE,EAAU,YACRF,EAAwB,uBACxB,IACF,EACF,wBAAyB,IACvBE,EAAU,YAAYF,EAAwB,kBAAmB,IAAI,EACvE,uBAAwB,IACtBE,EAAU,YAAYF,EAAwB,iBAAkB,IAAI,EACtE,qBAAsB,CACpBG,EACAC,IAKAF,EAAU,YACRF,EAAwB,eACxB,KAAK,UAAU,CAAE,SAAAG,EAAU,wBAAAC,CAAwB,CAAC,CACtD,CACJ,CACF,CAKO,SAASC,EAAuBH,EAAsB,CAC3D,MAAO,CACL,mBAAoB,IAClBA,EAAU,YAAYF,EAAwB,aAAc,IAAI,EAClE,mBAAqBM,GACnBJ,EAAU,YACRF,EAAwB,aACxB,KAAK,UAAU,CAAE,SAAUM,CAAM,CAAC,CACpC,CACJ,CACF,CAEA,IAAIC,EAAqB,EAKlB,SAASC,EAAmBN,EAAsB,CACvD,MAAO,CACL,gBAAiB,CAACO,EAAmBC,IAA4B,CAC/D,MAAMC,EAAY,QAAQ,EAAEJ,CAAkB,GAExCK,EACJF,EAAQ,MAAM,SAAS,GAAG,IAAKG,GAAS,SAASA,EAAM,EAAE,CAAC,GAAK,CAAC,EAClE,OAAAX,EAAU,YACRF,EAAwB,UACxB,KAAK,UAAU,CAAE,UAAAS,EAAW,KAAAG,EAAM,UAAAD,CAAU,CAAC,CAC/C,EACOA,CACT,CACF,CACF",
6
+ "names": ["INSPECTOR_COMMAND_TYPES", "createDiscoveryCommands", "connector", "deviceId", "sessionRefresherOptions", "createProviderCommands", "value", "apduRequestCounter", "createApduCommands", "sessionId", "apduHex", "requestId", "apdu", "byte"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{mapConnectorMessageToLogData as n}from"../screens/logger/mapConnectorMessageToLogData";function i(t,o){try{const{module:e}=JSON.parse(t);o(s=>new Set([...s,e]))}catch(e){console.error("Failed to parse moduleConnected payload",e)}}function c(t,o,e){const s=n({type:t,payload:o});return s!==null?(e(a=>[...a,s]),!0):!1}function p(t,o){try{const e=JSON.parse(t);o(e)}catch(e){console.error("Failed to parse connectedDevicesUpdate payload",e)}}function d(t,o){try{const{sessionId:e,state:s}=JSON.parse(t);o(a=>new Map(a).set(e,s))}catch(e){console.error("Failed to parse deviceSessionStateUpdate payload",e)}}function l(t,o){try{const e=JSON.parse(t);o(e)}catch(e){console.error("Failed to parse discoveredDevicesUpdate payload",e)}}function v(t,o){try{const{provider:e}=JSON.parse(t);o(e)}catch(e){console.error("Failed to parse providerValue payload",e)}}function S(t,o){try{const e=JSON.parse(t);o(s=>new Map(s).set(e.requestId,e))}catch(e){console.error("Failed to parse apduResponse payload",e)}}export{S as handleApduResponse,p as handleConnectedDevicesUpdate,d as handleDeviceSessionStateUpdate,l as handleDiscoveredDevicesUpdate,c as handleLogMessage,i as handleModuleConnected,v as handleProviderValue};
2
+ //# sourceMappingURL=connectorMessageHandlers.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/hooks/connectorMessageHandlers.ts"],
4
+ "sourcesContent": ["import type { Dispatch, SetStateAction } from \"react\";\nimport {\n type ConnectedDevice,\n type DeviceSessionState,\n type DiscoveredDevice,\n} from \"@ledgerhq/device-management-kit\";\nimport { type DevToolsModule } from \"@ledgerhq/device-management-kit-devtools-core\";\n\nimport { mapConnectorMessageToLogData } from \"../screens/logger/mapConnectorMessageToLogData\";\nimport { type LogData } from \"../screens/logger/types\";\nimport { type ApduResponse } from \"./useConnectorMessages\";\n\n/**\n * Handle module connected handshake message.\n */\nexport function handleModuleConnected(\n payload: string,\n setConnectedModules: Dispatch<SetStateAction<Set<DevToolsModule>>>,\n): void {\n try {\n const { module } = JSON.parse(payload) as { module: DevToolsModule };\n setConnectedModules((prev) => new Set([...prev, module]));\n } catch (e) {\n console.error(\"Failed to parse moduleConnected payload\", e);\n }\n}\n\n/**\n * Handle log message. Returns true if message was a log, false otherwise.\n */\nexport function handleLogMessage(\n type: string,\n payload: string,\n setLogs: Dispatch<SetStateAction<LogData[]>>,\n): boolean {\n const logData = mapConnectorMessageToLogData({ type, payload });\n if (logData !== null) {\n setLogs((prev) => [...prev, logData]);\n return true;\n }\n return false;\n}\n\n/**\n * Handle connected devices update message.\n */\nexport function handleConnectedDevicesUpdate(\n payload: string,\n setConnectedDevices: Dispatch<SetStateAction<ConnectedDevice[]>>,\n): void {\n try {\n const devices = JSON.parse(payload) as ConnectedDevice[];\n setConnectedDevices(devices);\n } catch (e) {\n console.error(\"Failed to parse connectedDevicesUpdate payload\", e);\n }\n}\n\n/**\n * Handle device session state update message.\n */\nexport function handleDeviceSessionStateUpdate(\n payload: string,\n setSessionStates: Dispatch<SetStateAction<Map<string, DeviceSessionState>>>,\n): void {\n try {\n const { sessionId, state } = JSON.parse(payload) as {\n sessionId: string;\n state: DeviceSessionState;\n };\n setSessionStates((prev) => new Map(prev).set(sessionId, state));\n } catch (e) {\n console.error(\"Failed to parse deviceSessionStateUpdate payload\", e);\n }\n}\n\n/**\n * Handle discovered devices update message.\n */\nexport function handleDiscoveredDevicesUpdate(\n payload: string,\n setDiscoveredDevices: Dispatch<SetStateAction<DiscoveredDevice[]>>,\n): void {\n try {\n const devices = JSON.parse(payload) as DiscoveredDevice[];\n setDiscoveredDevices(devices);\n } catch (e) {\n console.error(\"Failed to parse discoveredDevicesUpdate payload\", e);\n }\n}\n\n/**\n * Handle provider value response message.\n */\nexport function handleProviderValue(\n payload: string,\n setProviderValue: Dispatch<SetStateAction<number | null>>,\n): void {\n try {\n const { provider } = JSON.parse(payload) as { provider: number };\n setProviderValue(provider);\n } catch (e) {\n console.error(\"Failed to parse providerValue payload\", e);\n }\n}\n\n/**\n * Handle APDU response message.\n */\nexport function handleApduResponse(\n payload: string,\n setApduResponses: Dispatch<SetStateAction<Map<string, ApduResponse>>>,\n): void {\n try {\n const response = JSON.parse(payload) as ApduResponse;\n setApduResponses((prev) => new Map(prev).set(response.requestId, response));\n } catch (e) {\n console.error(\"Failed to parse apduResponse payload\", e);\n }\n}\n"],
5
+ "mappings": "AAQA,OAAS,gCAAAA,MAAoC,iDAOtC,SAASC,EACdC,EACAC,EACM,CACN,GAAI,CACF,KAAM,CAAE,OAAAC,CAAO,EAAI,KAAK,MAAMF,CAAO,EACrCC,EAAqBE,GAAS,IAAI,IAAI,CAAC,GAAGA,EAAMD,CAAM,CAAC,CAAC,CAC1D,OAAS,EAAG,CACV,QAAQ,MAAM,0CAA2C,CAAC,CAC5D,CACF,CAKO,SAASE,EACdC,EACAL,EACAM,EACS,CACT,MAAMC,EAAUT,EAA6B,CAAE,KAAAO,EAAM,QAAAL,CAAQ,CAAC,EAC9D,OAAIO,IAAY,MACdD,EAASH,GAAS,CAAC,GAAGA,EAAMI,CAAO,CAAC,EAC7B,IAEF,EACT,CAKO,SAASC,EACdR,EACAS,EACM,CACN,GAAI,CACF,MAAMC,EAAU,KAAK,MAAMV,CAAO,EAClCS,EAAoBC,CAAO,CAC7B,OAAS,EAAG,CACV,QAAQ,MAAM,iDAAkD,CAAC,CACnE,CACF,CAKO,SAASC,EACdX,EACAY,EACM,CACN,GAAI,CACF,KAAM,CAAE,UAAAC,EAAW,MAAAC,CAAM,EAAI,KAAK,MAAMd,CAAO,EAI/CY,EAAkBT,GAAS,IAAI,IAAIA,CAAI,EAAE,IAAIU,EAAWC,CAAK,CAAC,CAChE,OAAS,EAAG,CACV,QAAQ,MAAM,mDAAoD,CAAC,CACrE,CACF,CAKO,SAASC,EACdf,EACAgB,EACM,CACN,GAAI,CACF,MAAMN,EAAU,KAAK,MAAMV,CAAO,EAClCgB,EAAqBN,CAAO,CAC9B,OAAS,EAAG,CACV,QAAQ,MAAM,kDAAmD,CAAC,CACpE,CACF,CAKO,SAASO,EACdjB,EACAkB,EACM,CACN,GAAI,CACF,KAAM,CAAE,SAAAC,CAAS,EAAI,KAAK,MAAMnB,CAAO,EACvCkB,EAAiBC,CAAQ,CAC3B,OAAS,EAAG,CACV,QAAQ,MAAM,wCAAyC,CAAC,CAC1D,CACF,CAKO,SAASC,EACdpB,EACAqB,EACM,CACN,GAAI,CACF,MAAMC,EAAW,KAAK,MAAMtB,CAAO,EACnCqB,EAAkBlB,GAAS,IAAI,IAAIA,CAAI,EAAE,IAAImB,EAAS,UAAWA,CAAQ,CAAC,CAC5E,OAAS,EAAG,CACV,QAAQ,MAAM,uCAAwC,CAAC,CACzD,CACF",
6
+ "names": ["mapConnectorMessageToLogData", "handleModuleConnected", "payload", "setConnectedModules", "module", "prev", "handleLogMessage", "type", "setLogs", "logData", "handleConnectedDevicesUpdate", "setConnectedDevices", "devices", "handleDeviceSessionStateUpdate", "setSessionStates", "sessionId", "state", "handleDiscoveredDevicesUpdate", "setDiscoveredDevices", "handleProviderValue", "setProviderValue", "provider", "handleApduResponse", "setApduResponses", "response"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{useCallback as c,useEffect as K,useMemo as v,useState as e}from"react";import{DEVTOOLS_MODULES as l,INSPECTOR_MESSAGE_TYPES as a,MODULE_CONNECTED_MESSAGE_TYPE as j}from"@ledgerhq/device-management-kit-devtools-core";import{createApduCommands as z,createDiscoveryCommands as B,createProviderCommands as F}from"./commandDispatcher";import{handleApduResponse as J,handleConnectedDevicesUpdate as Q,handleDeviceSessionStateUpdate as W,handleDiscoveredDevicesUpdate as X,handleLogMessage as Z,handleModuleConnected as $,handleProviderValue as ee}from"./connectorMessageHandlers";function ie(i){const[C,M]=e([]),[S,E]=e([]),[b,D]=e([]),[g,L]=e(new Set),[A,P]=e([]),[f,R]=e(new Map),[I,r]=e([]),[T,p]=e(!1),[_,u]=e(!1),[O,h]=e(null),[V,U]=e(new Map),o=v(()=>({...i,sendMessage:(d,t)=>{i.sendMessage(d,t),E(s=>[...s,{type:d,payload:t}])}}),[i]);K(()=>{const{unsubscribe:d}=i.listenToMessages((t,s)=>{switch(M(H=>[...H,{type:t,payload:s}]),t){case j:$(s,L);break;case a.CONNECTED_DEVICES_UPDATE:Q(s,P);break;case a.DEVICE_SESSION_STATE_UPDATE:W(s,R);break;case a.DISCOVERED_DEVICES_UPDATE:X(s,r);break;case a.PROVIDER_VALUE:ee(s,h);break;case a.APDU_RESPONSE:J(s,U);break;default:Z(t,s,D);break}});return d},[i]);const n=v(()=>B(o),[o]),m=v(()=>F(o),[o]),k=v(()=>z(o),[o]),N=c(()=>{p(!0),r([]),n.startListeningCommand()},[n]),y=c(()=>{p(!1),r([]),n.stopListeningCommand()},[n]),w=c(()=>{u(!0),r([]),n.startDiscoveringCommand()},[n]),x=c(()=>{u(!1),r([]),n.stopDiscoveringCommand()},[n]),G=c(()=>{D([])},[]),Y=g.has(l.LOGGER),q=g.has(l.DMK_INSPECTOR);return{receivedMessages:C,sentMessages:S,logs:b,connectedModules:g,connectedDevices:A,sessionStates:f,discoveredDevices:I,isListening:T,isActivelyDiscovering:_,isLoggerConnected:Y,isInspectorConnected:q,providerValue:O,apduResponses:V,sendMessage:o.sendMessage,clearLogs:G,startListening:N,stopListening:y,startDiscovering:w,stopDiscovering:x,connectDevice:n.connectDeviceCommand,getProvider:m.getProviderCommand,setProvider:m.setProviderCommand,sendApdu:k.sendApduCommand}}export{ie as useConnectorMessages};
2
+ //# sourceMappingURL=useConnectorMessages.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/hooks/useConnectorMessages.ts"],
4
+ "sourcesContent": ["/**\n * @file useConnectorMessages hook\n *\n * Central hook for managing DevTools connector state and actions.\n * Handles all communication between the Dashboard UI and the client app\n * via the connector (WebSocket or Rozenite).\n */\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport {\n type ConnectedDevice,\n type DeviceSessionState,\n type DiscoveredDevice,\n} from \"@ledgerhq/device-management-kit\";\nimport {\n type Connector,\n DEVTOOLS_MODULES,\n type DevToolsModule,\n INSPECTOR_MESSAGE_TYPES,\n MODULE_CONNECTED_MESSAGE_TYPE,\n} from \"@ledgerhq/device-management-kit-devtools-core\";\n\nimport { type Message } from \"../PluginEvents\";\nimport { type LogData } from \"../screens/logger/types\";\nimport {\n createApduCommands,\n createDiscoveryCommands,\n createProviderCommands,\n} from \"./commandDispatcher\";\nimport {\n handleApduResponse,\n handleConnectedDevicesUpdate,\n handleDeviceSessionStateUpdate,\n handleDiscoveredDevicesUpdate,\n handleLogMessage,\n handleModuleConnected,\n handleProviderValue,\n} from \"./connectorMessageHandlers\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type ApduResponse = {\n requestId: string;\n success: boolean;\n statusCode?: number[];\n data?: number[];\n error?: string;\n};\n\nexport type ConnectorMessagesState = {\n receivedMessages: Message[];\n sentMessages: Message[];\n logs: LogData[];\n connectedModules: Set<DevToolsModule>;\n connectedDevices: ConnectedDevice[];\n sessionStates: Map<string, DeviceSessionState>;\n discoveredDevices: DiscoveredDevice[];\n isListening: boolean;\n isActivelyDiscovering: boolean;\n isLoggerConnected: boolean;\n isInspectorConnected: boolean;\n providerValue: number | null;\n apduResponses: Map<string, ApduResponse>;\n sendMessage: (type: string, payload: string) => void;\n clearLogs: () => void;\n startListening: () => void;\n stopListening: () => void;\n startDiscovering: () => void;\n stopDiscovering: () => void;\n connectDevice: (\n deviceId: string,\n sessionRefresherOptions?: {\n isRefresherDisabled: boolean;\n pollingInterval?: number;\n },\n ) => void;\n getProvider: () => void;\n setProvider: (value: number) => void;\n sendApdu: (sessionId: string, apduHex: string) => string;\n};\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Central hook for managing DevTools connector state and communication.\n *\n * This hook:\n * - Listens to messages from the connector and dispatches them to handlers\n * - Tracks all sent/received messages for debugging\n * - Manages device discovery, sessions, and DMK configuration state\n * - Provides action functions to send commands to the inspector module\n *\n * @param connector - The connector instance (WebSocket or Rozenite)\n * @returns State and actions for the Dashboard UI\n */\nexport function useConnectorMessages(\n connector: Connector,\n): ConnectorMessagesState {\n // === State ===\n const [receivedMessages, setReceivedMessages] = useState<Message[]>([]);\n const [sentMessages, setSentMessages] = useState<Message[]>([]);\n const [logs, setLogs] = useState<LogData[]>([]);\n const [connectedModules, setConnectedModules] = useState<Set<DevToolsModule>>(\n new Set(),\n );\n const [connectedDevices, setConnectedDevices] = useState<ConnectedDevice[]>(\n [],\n );\n const [sessionStates, setSessionStates] = useState<\n Map<string, DeviceSessionState>\n >(new Map());\n const [discoveredDevices, setDiscoveredDevices] = useState<\n DiscoveredDevice[]\n >([]);\n const [isListening, setIsListening] = useState(false);\n const [isActivelyDiscovering, setIsActivelyDiscovering] = useState(false);\n const [providerValue, setProviderValue] = useState<number | null>(null);\n const [apduResponses, setApduResponses] = useState<Map<string, ApduResponse>>(\n new Map(),\n );\n\n // === Tracked Connector (keeps all sent messages in state) ===\n const trackedConnector: Connector = useMemo(\n () => ({\n ...connector,\n sendMessage: (type: string, payload: string) => {\n connector.sendMessage(type, payload);\n setSentMessages((prev) => [...prev, { type, payload }]);\n },\n }),\n [connector],\n );\n\n // === Message Listener ===\n useEffect(() => {\n const { unsubscribe } = connector.listenToMessages((type, payload) => {\n setReceivedMessages((prev) => [...prev, { type, payload }]);\n\n switch (type) {\n case MODULE_CONNECTED_MESSAGE_TYPE:\n handleModuleConnected(payload, setConnectedModules);\n break;\n case INSPECTOR_MESSAGE_TYPES.CONNECTED_DEVICES_UPDATE:\n handleConnectedDevicesUpdate(payload, setConnectedDevices);\n break;\n case INSPECTOR_MESSAGE_TYPES.DEVICE_SESSION_STATE_UPDATE:\n handleDeviceSessionStateUpdate(payload, setSessionStates);\n break;\n case INSPECTOR_MESSAGE_TYPES.DISCOVERED_DEVICES_UPDATE:\n handleDiscoveredDevicesUpdate(payload, setDiscoveredDevices);\n break;\n case INSPECTOR_MESSAGE_TYPES.PROVIDER_VALUE:\n handleProviderValue(payload, setProviderValue);\n break;\n case INSPECTOR_MESSAGE_TYPES.APDU_RESPONSE:\n handleApduResponse(payload, setApduResponses);\n break;\n default:\n // Try to handle as log message\n handleLogMessage(type, payload, setLogs);\n break;\n }\n });\n return unsubscribe;\n }, [connector]);\n\n // === Commands (using tracked connector to log all sent messages) ===\n const discoveryCommands = useMemo(\n () => createDiscoveryCommands(trackedConnector),\n [trackedConnector],\n );\n const providerCommands = useMemo(\n () => createProviderCommands(trackedConnector),\n [trackedConnector],\n );\n const apduCommands = useMemo(\n () => createApduCommands(trackedConnector),\n [trackedConnector],\n );\n\n // === Wrapped Commands (with local state updates) ===\n const startListening = useCallback(() => {\n setIsListening(true);\n setDiscoveredDevices([]);\n discoveryCommands.startListeningCommand();\n }, [discoveryCommands]);\n\n const stopListening = useCallback(() => {\n setIsListening(false);\n setDiscoveredDevices([]);\n discoveryCommands.stopListeningCommand();\n }, [discoveryCommands]);\n\n const startDiscovering = useCallback(() => {\n setIsActivelyDiscovering(true);\n setDiscoveredDevices([]);\n discoveryCommands.startDiscoveringCommand();\n }, [discoveryCommands]);\n\n const stopDiscovering = useCallback(() => {\n setIsActivelyDiscovering(false);\n setDiscoveredDevices([]);\n discoveryCommands.stopDiscoveringCommand();\n }, [discoveryCommands]);\n\n const clearLogs = useCallback(() => {\n setLogs([]);\n }, []);\n\n // === Derived State ===\n const isLoggerConnected = connectedModules.has(DEVTOOLS_MODULES.LOGGER);\n const isInspectorConnected = connectedModules.has(\n DEVTOOLS_MODULES.DMK_INSPECTOR,\n );\n\n return {\n // State\n receivedMessages,\n sentMessages,\n logs,\n connectedModules,\n connectedDevices,\n sessionStates,\n discoveredDevices,\n isListening,\n isActivelyDiscovering,\n isLoggerConnected,\n isInspectorConnected,\n providerValue,\n apduResponses,\n // Actions\n sendMessage: trackedConnector.sendMessage,\n clearLogs,\n startListening,\n stopListening,\n startDiscovering,\n stopDiscovering,\n connectDevice: discoveryCommands.connectDeviceCommand,\n getProvider: providerCommands.getProviderCommand,\n setProvider: providerCommands.setProviderCommand,\n sendApdu: apduCommands.sendApduCommand,\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["useCallback", "useEffect", "useMemo", "useState", "DEVTOOLS_MODULES", "INSPECTOR_MESSAGE_TYPES", "MODULE_CONNECTED_MESSAGE_TYPE", "createApduCommands", "createDiscoveryCommands", "createProviderCommands", "handleApduResponse", "handleConnectedDevicesUpdate", "handleDeviceSessionStateUpdate", "handleDiscoveredDevicesUpdate", "handleLogMessage", "handleModuleConnected", "handleProviderValue", "useConnectorMessages", "connector", "receivedMessages", "setReceivedMessages", "sentMessages", "setSentMessages", "logs", "setLogs", "connectedModules", "setConnectedModules", "connectedDevices", "setConnectedDevices", "sessionStates", "setSessionStates", "discoveredDevices", "setDiscoveredDevices", "isListening", "setIsListening", "isActivelyDiscovering", "setIsActivelyDiscovering", "providerValue", "setProviderValue", "apduResponses", "setApduResponses", "trackedConnector", "type", "payload", "prev", "unsubscribe", "discoveryCommands", "providerCommands", "apduCommands", "startListening", "stopListening", "startDiscovering", "stopDiscovering", "clearLogs", "isLoggerConnected", "isInspectorConnected"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{useMemo as r,useState as d}from"react";import{jsx as e,jsxs as o}from"react/jsx-runtime";const S=({sentMessages:s,receivedMessages:l,sendMessage:p})=>{const[i,n]=d(""),[a,v]=d(""),c=r(()=>[...new Set(s.map(t=>t.type))],[s]),u=r(()=>[...new Set(l.map(t=>t.type))],[l]),f=r(()=>i?s.filter(t=>t.type===i):s,[s,i]),x=r(()=>a?l.filter(t=>t.type===a):l,[l,a]);return o("div",{style:{display:"flex",height:"100vh"},children:[o("div",{style:{flex:1,borderRight:"1px solid #ddd",padding:"16px",boxSizing:"border-box",display:"flex",flexDirection:"column"},children:[e("h2",{children:"sent messages"}),e(m,{onSend:p}),e(g,{types:c,value:i,onChange:n,style:{marginTop:16}}),e("div",{style:{marginTop:16,flex:1,overflowY:"auto"},children:e("ul",{style:{margin:0,padding:0,listStyle:"none"},children:f.map((t,y)=>o("li",{style:{marginBottom:4},children:[o("strong",{children:[t.type,":"]})," ",t.payload]},y))})})]}),o("div",{style:{flex:1,padding:"16px",boxSizing:"border-box",display:"flex",flexDirection:"column"},children:[e("h2",{children:"received messages"}),e(g,{types:u,value:a,onChange:v}),e("div",{style:{marginTop:16,flex:1,overflowY:"auto"},children:e("ul",{style:{margin:0,padding:0,listStyle:"none"},children:x.map((t,y)=>o("li",{style:{marginBottom:4},children:[o("strong",{children:[t.type,":"]})," ",t.payload]},y))})})]})]})},g=({types:s,value:l,onChange:p,style:i})=>o("div",{style:{display:"flex",alignItems:"center",gap:8,...i},children:[e("label",{children:"Filter by type:"}),o("select",{value:l,onChange:n=>p(n.target.value),children:[o("option",{value:"",children:["All (",s.length," types)"]}),s.map(n=>e("option",{value:n,children:n},n))]}),l&&e("button",{onClick:()=>p(""),style:{padding:"2px 8px"},children:"Clear"})]}),m=({onSend:s})=>{const[l,p]=d(""),[i,n]=d("");return o("div",{style:{display:"flex",gap:"8px",alignItems:"center"},children:[e("input",{type:"text",value:l,placeholder:"type",onChange:a=>p(a.target.value),style:{flex:1}}),e("input",{type:"text",value:i,placeholder:"payload",onChange:a=>n(a.target.value),style:{flex:2}}),e("button",{onClick:()=>{l&&i&&(s(l,i),p(""),n(""))},children:"sendMessage"})]})};export{S as DebugDevTools};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/screens/debugDevTools/index.tsx"],
4
+ "sourcesContent": ["/**\n * @file DebugDevTools screen\n *\n * A debugging tool for DevTools developers. Displays raw sent and received\n * connector messages, allows filtering by message type, and provides a way\n * to manually send custom messages for testing.\n */\n\nimport React, { useMemo, useState } from \"react\";\n\nimport { type Message } from \"../../shared/PluginEvents\";\n\ninterface DebugDevToolsMessageProps {\n sentMessages: Message[];\n receivedMessages: Message[];\n sendMessage: (type: string, payload: string) => void;\n}\n\nexport const DebugDevTools: React.FC<DebugDevToolsMessageProps> = ({\n sentMessages,\n receivedMessages,\n sendMessage,\n}) => {\n const [sentFilter, setSentFilter] = useState(\"\");\n const [receivedFilter, setReceivedFilter] = useState(\"\");\n\n const sentMessageTypes = useMemo(\n () => [...new Set(sentMessages.map((m) => m.type))],\n [sentMessages],\n );\n const receivedMessageTypes = useMemo(\n () => [...new Set(receivedMessages.map((m) => m.type))],\n [receivedMessages],\n );\n\n const filteredSentMessages = useMemo(\n () =>\n sentFilter\n ? sentMessages.filter((m) => m.type === sentFilter)\n : sentMessages,\n [sentMessages, sentFilter],\n );\n\n const filteredReceivedMessages = useMemo(\n () =>\n receivedFilter\n ? receivedMessages.filter((m) => m.type === receivedFilter)\n : receivedMessages,\n [receivedMessages, receivedFilter],\n );\n\n return (\n <div style={{ display: \"flex\", height: \"100vh\" }}>\n {/* Left Pane: Sent Messages */}\n <div\n style={{\n flex: 1,\n borderRight: \"1px solid #ddd\",\n padding: \"16px\",\n boxSizing: \"border-box\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <h2>sent messages</h2>\n <MessageSender onSend={sendMessage} />\n <MessageTypeFilter\n types={sentMessageTypes}\n value={sentFilter}\n onChange={setSentFilter}\n style={{ marginTop: 16 }}\n />\n <div style={{ marginTop: 16, flex: 1, overflowY: \"auto\" }}>\n <ul style={{ margin: 0, padding: 0, listStyle: \"none\" }}>\n {filteredSentMessages.map((msg, idx) => (\n <li key={idx} style={{ marginBottom: 4 }}>\n <strong>{msg.type}:</strong> {msg.payload}\n </li>\n ))}\n </ul>\n </div>\n </div>\n {/* Right Pane: Received Messages */}\n <div\n style={{\n flex: 1,\n padding: \"16px\",\n boxSizing: \"border-box\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <h2>received messages</h2>\n <MessageTypeFilter\n types={receivedMessageTypes}\n value={receivedFilter}\n onChange={setReceivedFilter}\n />\n <div style={{ marginTop: 16, flex: 1, overflowY: \"auto\" }}>\n <ul style={{ margin: 0, padding: 0, listStyle: \"none\" }}>\n {filteredReceivedMessages.map((msg, idx) => (\n <li key={idx} style={{ marginBottom: 4 }}>\n <strong>{msg.type}:</strong> {msg.payload}\n </li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n );\n};\n\ninterface MessageTypeFilterProps {\n types: string[];\n value: string;\n onChange: (value: string) => void;\n style?: React.CSSProperties;\n}\n\nconst MessageTypeFilter: React.FC<MessageTypeFilterProps> = ({\n types,\n value,\n onChange,\n style,\n}) => (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, ...style }}>\n <label>Filter by type:</label>\n <select value={value} onChange={(e) => onChange(e.target.value)}>\n <option value=\"\">All ({types.length} types)</option>\n {types.map((type) => (\n <option key={type} value={type}>\n {type}\n </option>\n ))}\n </select>\n {value && (\n <button onClick={() => onChange(\"\")} style={{ padding: \"2px 8px\" }}>\n Clear\n </button>\n )}\n </div>\n);\n\ninterface MessageSenderProps {\n onSend: (type: string, payload: string) => void;\n}\n\nconst MessageSender: React.FC<MessageSenderProps> = ({ onSend }) => {\n const [type, setType] = useState(\"\");\n const [payload, setPayload] = useState(\"\");\n\n return (\n <div style={{ display: \"flex\", gap: \"8px\", alignItems: \"center\" }}>\n <input\n type=\"text\"\n value={type}\n placeholder=\"type\"\n onChange={(e) => setType(e.target.value)}\n style={{ flex: 1 }}\n />\n <input\n type=\"text\"\n value={payload}\n placeholder=\"payload\"\n onChange={(e) => setPayload(e.target.value)}\n style={{ flex: 2 }}\n />\n <button\n onClick={() => {\n if (type && payload) {\n onSend(type, payload);\n setType(\"\");\n setPayload(\"\");\n }\n }}\n >\n sendMessage\n </button>\n </div>\n );\n};\n"],
5
+ "mappings": "AAQA,OAAgB,WAAAA,EAAS,YAAAC,MAAgB,QAwDjC,cAAAC,EAYQ,QAAAC,MAZR,oBA9CD,MAAMC,EAAqD,CAAC,CACjE,aAAAC,EACA,iBAAAC,EACA,YAAAC,CACF,IAAM,CACJ,KAAM,CAACC,EAAYC,CAAa,EAAIR,EAAS,EAAE,EACzC,CAACS,EAAgBC,CAAiB,EAAIV,EAAS,EAAE,EAEjDW,EAAmBZ,EACvB,IAAM,CAAC,GAAG,IAAI,IAAIK,EAAa,IAAKQ,GAAMA,EAAE,IAAI,CAAC,CAAC,EAClD,CAACR,CAAY,CACf,EACMS,EAAuBd,EAC3B,IAAM,CAAC,GAAG,IAAI,IAAIM,EAAiB,IAAKO,GAAMA,EAAE,IAAI,CAAC,CAAC,EACtD,CAACP,CAAgB,CACnB,EAEMS,EAAuBf,EAC3B,IACEQ,EACIH,EAAa,OAAQQ,GAAMA,EAAE,OAASL,CAAU,EAChDH,EACN,CAACA,EAAcG,CAAU,CAC3B,EAEMQ,EAA2BhB,EAC/B,IACEU,EACIJ,EAAiB,OAAQO,GAAMA,EAAE,OAASH,CAAc,EACxDJ,EACN,CAACA,EAAkBI,CAAc,CACnC,EAEA,OACEP,EAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,OAAQ,OAAQ,EAE7C,UAAAA,EAAC,OACC,MAAO,CACL,KAAM,EACN,YAAa,iBACb,QAAS,OACT,UAAW,aACX,QAAS,OACT,cAAe,QACjB,EAEA,UAAAD,EAAC,MAAG,yBAAa,EACjBA,EAACe,EAAA,CAAc,OAAQV,EAAa,EACpCL,EAACgB,EAAA,CACC,MAAON,EACP,MAAOJ,EACP,SAAUC,EACV,MAAO,CAAE,UAAW,EAAG,EACzB,EACAP,EAAC,OAAI,MAAO,CAAE,UAAW,GAAI,KAAM,EAAG,UAAW,MAAO,EACtD,SAAAA,EAAC,MAAG,MAAO,CAAE,OAAQ,EAAG,QAAS,EAAG,UAAW,MAAO,EACnD,SAAAa,EAAqB,IAAI,CAACI,EAAKC,IAC9BjB,EAAC,MAAa,MAAO,CAAE,aAAc,CAAE,EACrC,UAAAA,EAAC,UAAQ,UAAAgB,EAAI,KAAK,KAAC,EAAS,IAAEA,EAAI,UAD3BC,CAET,CACD,EACH,EACF,GACF,EAEAjB,EAAC,OACC,MAAO,CACL,KAAM,EACN,QAAS,OACT,UAAW,aACX,QAAS,OACT,cAAe,QACjB,EAEA,UAAAD,EAAC,MAAG,6BAAiB,EACrBA,EAACgB,EAAA,CACC,MAAOJ,EACP,MAAOJ,EACP,SAAUC,EACZ,EACAT,EAAC,OAAI,MAAO,CAAE,UAAW,GAAI,KAAM,EAAG,UAAW,MAAO,EACtD,SAAAA,EAAC,MAAG,MAAO,CAAE,OAAQ,EAAG,QAAS,EAAG,UAAW,MAAO,EACnD,SAAAc,EAAyB,IAAI,CAACG,EAAKC,IAClCjB,EAAC,MAAa,MAAO,CAAE,aAAc,CAAE,EACrC,UAAAA,EAAC,UAAQ,UAAAgB,EAAI,KAAK,KAAC,EAAS,IAAEA,EAAI,UAD3BC,CAET,CACD,EACH,EACF,GACF,GACF,CAEJ,EASMF,EAAsD,CAAC,CAC3D,MAAAG,EACA,MAAAC,EACA,SAAAC,EACA,MAAAC,CACF,IACErB,EAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,EAAG,GAAGqB,CAAM,EACpE,UAAAtB,EAAC,SAAM,2BAAe,EACtBC,EAAC,UAAO,MAAOmB,EAAO,SAAWG,GAAMF,EAASE,EAAE,OAAO,KAAK,EAC5D,UAAAtB,EAAC,UAAO,MAAM,GAAG,kBAAMkB,EAAM,OAAO,WAAO,EAC1CA,EAAM,IAAKK,GACVxB,EAAC,UAAkB,MAAOwB,EACvB,SAAAA,GADUA,CAEb,CACD,GACH,EACCJ,GACCpB,EAAC,UAAO,QAAS,IAAMqB,EAAS,EAAE,EAAG,MAAO,CAAE,QAAS,SAAU,EAAG,iBAEpE,GAEJ,EAOIN,EAA8C,CAAC,CAAE,OAAAU,CAAO,IAAM,CAClE,KAAM,CAACD,EAAME,CAAO,EAAI3B,EAAS,EAAE,EAC7B,CAAC4B,EAASC,CAAU,EAAI7B,EAAS,EAAE,EAEzC,OACEE,EAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,IAAK,MAAO,WAAY,QAAS,EAC9D,UAAAD,EAAC,SACC,KAAK,OACL,MAAOwB,EACP,YAAY,OACZ,SAAWD,GAAMG,EAAQH,EAAE,OAAO,KAAK,EACvC,MAAO,CAAE,KAAM,CAAE,EACnB,EACAvB,EAAC,SACC,KAAK,OACL,MAAO2B,EACP,YAAY,UACZ,SAAWJ,GAAMK,EAAWL,EAAE,OAAO,KAAK,EAC1C,MAAO,CAAE,KAAM,CAAE,EACnB,EACAvB,EAAC,UACC,QAAS,IAAM,CACTwB,GAAQG,IACVF,EAAOD,EAAMG,CAAO,EACpBD,EAAQ,EAAE,EACVE,EAAW,EAAE,EAEjB,EACD,uBAED,GACF,CAEJ",
6
+ "names": ["useMemo", "useState", "jsx", "jsxs", "DebugDevTools", "sentMessages", "receivedMessages", "sendMessage", "sentFilter", "setSentFilter", "receivedFilter", "setReceivedFilter", "sentMessageTypes", "m", "receivedMessageTypes", "filteredSentMessages", "filteredReceivedMessages", "MessageSender", "MessageTypeFilter", "msg", "idx", "types", "value", "onChange", "style", "e", "type", "onSend", "setType", "payload", "setPayload"]
7
+ }
@@ -0,0 +1,79 @@
1
+ import{useState as i}from"react";import o from"styled-components";import{Fragment as u,jsx as e,jsxs as r}from"react/jsx-runtime";const h=o.div`
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: 8px;
5
+ margin-top: 12px;
6
+ padding-top: 12px;
7
+ border-top: 1px solid #eee;
8
+ `,I=o.div`
9
+ display: flex;
10
+ align-items: center;
11
+ gap: 8px;
12
+ cursor: pointer;
13
+ user-select: none;
14
+ `,A=o.span`
15
+ font-size: 12px;
16
+ color: #666;
17
+ transition: transform 0.15s ease;
18
+ transform: rotate(${({$expanded:t})=>t?"90deg":"0deg"});
19
+ `,S=o.span`
20
+ font-size: 12px;
21
+ font-weight: 600;
22
+ color: #666;
23
+ `,$=o.div`
24
+ display: ${({$expanded:t})=>t?"flex":"none"};
25
+ flex-direction: column;
26
+ gap: 8px;
27
+ `,v=o.div`
28
+ display: flex;
29
+ gap: 8px;
30
+ align-items: center;
31
+ `,D=o.input`
32
+ flex: 1;
33
+ padding: 6px 8px;
34
+ border: 1px solid #ddd;
35
+ border-radius: 4px;
36
+ font-size: 12px;
37
+ font-family: monospace;
38
+
39
+ &:focus {
40
+ outline: none;
41
+ border-color: #2196f3;
42
+ }
43
+
44
+ &::placeholder {
45
+ color: #999;
46
+ }
47
+ `,k=o.button`
48
+ padding: 6px 12px;
49
+ border: none;
50
+ border-radius: 4px;
51
+ background: #2196f3;
52
+ color: white;
53
+ font-size: 12px;
54
+ cursor: pointer;
55
+ transition: all 0.15s ease;
56
+
57
+ &:hover:not(:disabled) {
58
+ background: #1976d2;
59
+ }
60
+
61
+ &:disabled {
62
+ opacity: 0.5;
63
+ cursor: not-allowed;
64
+ }
65
+ `,w=o.div`
66
+ padding: 8px;
67
+ border-radius: 4px;
68
+ background: ${({$success:t})=>t?"#e8f5e9":"#ffebee"};
69
+ border: 1px solid ${({$success:t})=>t?"#c8e6c9":"#ffcdd2"};
70
+ font-size: 12px;
71
+ font-family: monospace;
72
+ `,l=o.span`
73
+ font-weight: 600;
74
+ color: #333;
75
+ `,c=o.span`
76
+ color: #555;
77
+ word-break: break-all;
78
+ `,L=({sessionId:t,onSend:b,responses:m})=>{const[d,R]=i(!1),[a,C]=i(""),[x,y]=i(null),g=()=>{if(!a.trim())return;const n=a.replace(/\s/g,"").toUpperCase();if(!/^[0-9A-F]*$/.test(n)||n.length%2!==0){alert("Invalid hex string. Please enter a valid APDU in hex format (e.g., E0C4000000)");return}const p=b(t,n);y(p)},s=x?m.get(x):null,f=n=>!n||!Array.isArray(n)?"":n.map(p=>p.toString(16).padStart(2,"0").toUpperCase()).join(" ");return r(h,{children:[r(I,{onClick:()=>R(!d),children:[e(A,{$expanded:d,children:"\u25B6"}),e(S,{children:"Send APDU"})]}),r($,{$expanded:d,children:[r(v,{children:[e(D,{type:"text",placeholder:"APDU hex (e.g., E0C4000000)",value:a,onChange:n=>C(n.target.value),onKeyDown:n=>n.key==="Enter"&&g()}),e(k,{onClick:g,disabled:!a.trim(),children:"Send"})]}),s&&e(w,{$success:s.success,children:s.success?r(u,{children:[s.data&&s.data.length>0&&r(u,{children:[e(l,{children:"Data: "}),e(c,{children:f(s.data)}),e("br",{})]}),e(l,{children:"Status: "}),e(c,{children:f(s.statusCode)})]}):r(u,{children:[e(l,{children:"Error: "}),e(c,{children:s.error})]})})]})]})};export{L as ApduSender};
79
+ //# sourceMappingURL=ApduSender.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/screens/inspector/ApduSender.tsx"],
4
+ "sourcesContent": ["import React, { useState } from \"react\";\nimport styled from \"styled-components\";\n\nimport { type ApduResponse } from \"../../hooks/useConnectorMessages\";\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px solid #eee;\n`;\n\nconst Header = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n user-select: none;\n`;\n\nconst ToggleIcon = styled.span<{ $expanded: boolean }>`\n font-size: 12px;\n color: #666;\n transition: transform 0.15s ease;\n transform: rotate(${({ $expanded }) => ($expanded ? \"90deg\" : \"0deg\")});\n`;\n\nconst Title = styled.span`\n font-size: 12px;\n font-weight: 600;\n color: #666;\n`;\n\nconst Content = styled.div<{ $expanded: boolean }>`\n display: ${({ $expanded }) => ($expanded ? \"flex\" : \"none\")};\n flex-direction: column;\n gap: 8px;\n`;\n\nconst InputRow = styled.div`\n display: flex;\n gap: 8px;\n align-items: center;\n`;\n\nconst Input = styled.input`\n flex: 1;\n padding: 6px 8px;\n border: 1px solid #ddd;\n border-radius: 4px;\n font-size: 12px;\n font-family: monospace;\n\n &:focus {\n outline: none;\n border-color: #2196f3;\n }\n\n &::placeholder {\n color: #999;\n }\n`;\n\nconst Button = styled.button`\n padding: 6px 12px;\n border: none;\n border-radius: 4px;\n background: #2196f3;\n color: white;\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s ease;\n\n &:hover:not(:disabled) {\n background: #1976d2;\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n`;\n\nconst ResponseContainer = styled.div<{ $success: boolean }>`\n padding: 8px;\n border-radius: 4px;\n background: ${({ $success }) => ($success ? \"#e8f5e9\" : \"#ffebee\")};\n border: 1px solid ${({ $success }) => ($success ? \"#c8e6c9\" : \"#ffcdd2\")};\n font-size: 12px;\n font-family: monospace;\n`;\n\nconst ResponseLabel = styled.span`\n font-weight: 600;\n color: #333;\n`;\n\nconst ResponseData = styled.span`\n color: #555;\n word-break: break-all;\n`;\n\ntype ApduSenderProps = {\n sessionId: string;\n onSend: (sessionId: string, apduHex: string) => string;\n responses: Map<string, ApduResponse>;\n};\n\nexport const ApduSender: React.FC<ApduSenderProps> = ({\n sessionId,\n onSend,\n responses,\n}) => {\n const [expanded, setExpanded] = useState(false);\n const [apduInput, setApduInput] = useState(\"\");\n const [lastRequestId, setLastRequestId] = useState<string | null>(null);\n\n const handleSend = () => {\n if (!apduInput.trim()) return;\n // Remove spaces and validate hex\n const cleanHex = apduInput.replace(/\\s/g, \"\").toUpperCase();\n if (!/^[0-9A-F]*$/.test(cleanHex) || cleanHex.length % 2 !== 0) {\n alert(\n \"Invalid hex string. Please enter a valid APDU in hex format (e.g., E0C4000000)\",\n );\n return;\n }\n const requestId = onSend(sessionId, cleanHex);\n setLastRequestId(requestId);\n };\n\n const lastResponse = lastRequestId ? responses.get(lastRequestId) : null;\n\n const formatBytes = (bytes: number[] | undefined): string => {\n if (!bytes || !Array.isArray(bytes)) return \"\";\n return bytes\n .map((b) => b.toString(16).padStart(2, \"0\").toUpperCase())\n .join(\" \");\n };\n\n return (\n <Container>\n <Header onClick={() => setExpanded(!expanded)}>\n <ToggleIcon $expanded={expanded}>\u25B6</ToggleIcon>\n <Title>Send APDU</Title>\n </Header>\n <Content $expanded={expanded}>\n <InputRow>\n <Input\n type=\"text\"\n placeholder=\"APDU hex (e.g., E0C4000000)\"\n value={apduInput}\n onChange={(e) => setApduInput(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && handleSend()}\n />\n <Button onClick={handleSend} disabled={!apduInput.trim()}>\n Send\n </Button>\n </InputRow>\n {lastResponse && (\n <ResponseContainer $success={lastResponse.success}>\n {lastResponse.success ? (\n <>\n {lastResponse.data && lastResponse.data.length > 0 && (\n <>\n <ResponseLabel>Data: </ResponseLabel>\n <ResponseData>\n {formatBytes(lastResponse.data)}\n </ResponseData>\n <br />\n </>\n )}\n <ResponseLabel>Status: </ResponseLabel>\n <ResponseData>\n {formatBytes(lastResponse.statusCode)}\n </ResponseData>\n </>\n ) : (\n <>\n <ResponseLabel>Error: </ResponseLabel>\n <ResponseData>{lastResponse.error}</ResponseData>\n </>\n )}\n </ResponseContainer>\n )}\n </Content>\n </Container>\n );\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["useState", "styled", "Fragment", "jsx", "jsxs", "Container", "Header", "ToggleIcon", "$expanded", "Title", "Content", "InputRow", "Input", "Button", "ResponseContainer", "$success", "ResponseLabel", "ResponseData", "ApduSender", "sessionId", "onSend", "responses", "expanded", "setExpanded", "apduInput", "setApduInput", "lastRequestId", "setLastRequestId", "handleSend", "cleanHex", "requestId", "lastResponse", "formatBytes", "bytes", "b", "e"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{ApduSender as u}from"./ApduSender";import{BadgeRow as S,Button as p,Card as l,CardBody as C,CardHeader as m,CardHeaderLeft as g,CardSection as f,CardTitle as T,SectionLabel as D,SmallText as a,StatusBadge as o}from"./styles";import{jsx as t,jsxs as n}from"react/jsx-runtime";const v=e=>e?e.deviceStatus!=="NOT CONNECTED":!0;function y(e){switch(e){case"CONNECTED":return"success";case"LOCKED":return"warning";case"BUSY":return"info";case"NOT CONNECTED":return"error";default:return"neutral"}}function w(e){switch(String(e)){case"ReadyWithSecureChannel":return"success";case"ReadyWithoutSecureChannel":return"info";case"Connected":return"neutral";default:return"neutral"}}function B(e){return String(e).replace(/([a-z])([A-Z])/g,"$1 $2")}const x=({device:e,state:r,onDisconnect:i,onSendApdu:c,apduResponses:d})=>{const s=v(r);return n(l,{$variant:s?"default":"disconnected",children:[n(m,{children:[n(g,{children:[t(T,{children:e.name||"Unknown Device"}),r&&t(o,{$variant:y(r.deviceStatus),children:r.deviceStatus})]}),s&&t(p,{$variant:"danger",onClick:i,children:"Disconnect"})]}),n(C,{children:[n(a,{children:["Session ID: ",e.sessionId]}),n(a,{children:["Model: ",e.modelId]}),n(a,{children:["Transport: ",e.transport]}),n(a,{children:["Type: ",e.type]})]}),r&&n(f,{children:[t(D,{children:"Session State"}),t(S,{children:t(o,{$variant:w(r.sessionStateType),children:B(r.sessionStateType)})}),"currentApp"in r&&r.currentApp&&n(a,{children:["Current App: ",r.currentApp.name," v",r.currentApp.version]}),"firmwareVersion"in r&&r.firmwareVersion&&n(a,{children:["Firmware: ",r.firmwareVersion.os]})]}),s&&t(u,{sessionId:e.sessionId,onSend:c,responses:d})]})};export{x as DeviceCard};
2
+ //# sourceMappingURL=DeviceCard.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/screens/inspector/DeviceCard.tsx"],
4
+ "sourcesContent": ["import React from \"react\";\nimport {\n type ConnectedDevice,\n type DeviceSessionState,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type ApduResponse } from \"../../hooks/useConnectorMessages\";\nimport { ApduSender } from \"./ApduSender\";\nimport {\n BadgeRow,\n Button,\n Card,\n CardBody,\n CardHeader,\n CardHeaderLeft,\n CardSection,\n CardTitle,\n SectionLabel,\n SmallText,\n StatusBadge,\n} from \"./styles\";\n\ntype DeviceCardProps = {\n device: ConnectedDevice;\n state?: DeviceSessionState;\n onDisconnect: () => void;\n onSendApdu: (sessionId: string, apduHex: string) => string;\n apduResponses: Map<string, ApduResponse>;\n};\n\nconst isConnected = (state?: DeviceSessionState): boolean => {\n if (!state) return true; // Assume connected if no state yet\n return state.deviceStatus !== \"NOT CONNECTED\";\n};\n\n/**\n * Map deviceStatus string to a badge variant.\n */\nfunction getDeviceStatusBadgeVariant(\n status: string,\n): \"success\" | \"warning\" | \"error\" | \"info\" | \"neutral\" {\n switch (status) {\n case \"CONNECTED\":\n return \"success\";\n case \"LOCKED\":\n return \"warning\";\n case \"BUSY\":\n return \"info\";\n case \"NOT CONNECTED\":\n return \"error\";\n default:\n return \"neutral\";\n }\n}\n\n/**\n * Map sessionStateType string to a badge variant.\n */\nfunction getSessionStateBadgeVariant(\n stateType: string | number,\n): \"success\" | \"warning\" | \"error\" | \"info\" | \"neutral\" {\n const stateStr = String(stateType);\n switch (stateStr) {\n case \"ReadyWithSecureChannel\":\n return \"success\";\n case \"ReadyWithoutSecureChannel\":\n return \"info\";\n case \"Connected\":\n return \"neutral\";\n default:\n return \"neutral\";\n }\n}\n\n/**\n * Format sessionStateType for display (add spaces before uppercase letters).\n */\nfunction formatSessionStateType(stateType: string | number): string {\n return String(stateType).replace(/([a-z])([A-Z])/g, \"$1 $2\");\n}\n\nexport const DeviceCard: React.FC<DeviceCardProps> = ({\n device,\n state,\n onDisconnect,\n onSendApdu,\n apduResponses,\n}) => {\n const connected = isConnected(state);\n\n return (\n <Card $variant={connected ? \"default\" : \"disconnected\"}>\n <CardHeader>\n <CardHeaderLeft>\n <CardTitle>{device.name || \"Unknown Device\"}</CardTitle>\n {state && (\n <StatusBadge\n $variant={getDeviceStatusBadgeVariant(state.deviceStatus)}\n >\n {state.deviceStatus}\n </StatusBadge>\n )}\n </CardHeaderLeft>\n {connected && (\n <Button $variant=\"danger\" onClick={onDisconnect}>\n Disconnect\n </Button>\n )}\n </CardHeader>\n\n <CardBody>\n <SmallText>Session ID: {device.sessionId}</SmallText>\n <SmallText>Model: {device.modelId}</SmallText>\n <SmallText>Transport: {device.transport}</SmallText>\n <SmallText>Type: {device.type}</SmallText>\n </CardBody>\n\n {state && (\n <CardSection>\n <SectionLabel>Session State</SectionLabel>\n <BadgeRow>\n <StatusBadge\n $variant={getSessionStateBadgeVariant(state.sessionStateType)}\n >\n {formatSessionStateType(state.sessionStateType)}\n </StatusBadge>\n </BadgeRow>\n {\"currentApp\" in state && state.currentApp && (\n <SmallText>\n Current App: {state.currentApp.name} v{state.currentApp.version}\n </SmallText>\n )}\n {\"firmwareVersion\" in state && state.firmwareVersion && (\n <SmallText>Firmware: {state.firmwareVersion.os}</SmallText>\n )}\n </CardSection>\n )}\n\n {connected && (\n <ApduSender\n sessionId={device.sessionId}\n onSend={onSendApdu}\n responses={apduResponses}\n />\n )}\n </Card>\n );\n};\n"],
5
+ "mappings": "AAOA,OAAS,cAAAA,MAAkB,eAC3B,OACE,YAAAC,EACA,UAAAC,EACA,QAAAC,EACA,YAAAC,EACA,cAAAC,EACA,kBAAAC,EACA,eAAAC,EACA,aAAAC,EACA,gBAAAC,EACA,aAAAC,EACA,eAAAC,MACK,WAyEC,OACE,OAAAC,EADF,QAAAC,MAAA,oBA/DR,MAAMC,EAAeC,GACdA,EACEA,EAAM,eAAiB,gBADX,GAOrB,SAASC,EACPC,EACsD,CACtD,OAAQA,EAAQ,CACd,IAAK,YACH,MAAO,UACT,IAAK,SACH,MAAO,UACT,IAAK,OACH,MAAO,OACT,IAAK,gBACH,MAAO,QACT,QACE,MAAO,SACX,CACF,CAKA,SAASC,EACPC,EACsD,CAEtD,OADiB,OAAOA,CAAS,EACf,CAChB,IAAK,yBACH,MAAO,UACT,IAAK,4BACH,MAAO,OACT,IAAK,YACH,MAAO,UACT,QACE,MAAO,SACX,CACF,CAKA,SAASC,EAAuBD,EAAoC,CAClE,OAAO,OAAOA,CAAS,EAAE,QAAQ,kBAAmB,OAAO,CAC7D,CAEO,MAAME,EAAwC,CAAC,CACpD,OAAAC,EACA,MAAAP,EACA,aAAAQ,EACA,WAAAC,EACA,cAAAC,CACF,IAAM,CACJ,MAAMC,EAAYZ,EAAYC,CAAK,EAEnC,OACEF,EAACV,EAAA,CAAK,SAAUuB,EAAY,UAAY,eACtC,UAAAb,EAACR,EAAA,CACC,UAAAQ,EAACP,EAAA,CACC,UAAAM,EAACJ,EAAA,CAAW,SAAAc,EAAO,MAAQ,iBAAiB,EAC3CP,GACCH,EAACD,EAAA,CACC,SAAUK,EAA4BD,EAAM,YAAY,EAEvD,SAAAA,EAAM,aACT,GAEJ,EACCW,GACCd,EAACV,EAAA,CAAO,SAAS,SAAS,QAASqB,EAAc,sBAEjD,GAEJ,EAEAV,EAACT,EAAA,CACC,UAAAS,EAACH,EAAA,CAAU,yBAAaY,EAAO,WAAU,EACzCT,EAACH,EAAA,CAAU,oBAAQY,EAAO,SAAQ,EAClCT,EAACH,EAAA,CAAU,wBAAYY,EAAO,WAAU,EACxCT,EAACH,EAAA,CAAU,mBAAOY,EAAO,MAAK,GAChC,EAECP,GACCF,EAACN,EAAA,CACC,UAAAK,EAACH,EAAA,CAAa,yBAAa,EAC3BG,EAACX,EAAA,CACC,SAAAW,EAACD,EAAA,CACC,SAAUO,EAA4BH,EAAM,gBAAgB,EAE3D,SAAAK,EAAuBL,EAAM,gBAAgB,EAChD,EACF,EACC,eAAgBA,GAASA,EAAM,YAC9BF,EAACH,EAAA,CAAU,0BACKK,EAAM,WAAW,KAAK,KAAGA,EAAM,WAAW,SAC1D,EAED,oBAAqBA,GAASA,EAAM,iBACnCF,EAACH,EAAA,CAAU,uBAAWK,EAAM,gBAAgB,IAAG,GAEnD,EAGDW,GACCd,EAACZ,EAAA,CACC,UAAWsB,EAAO,UAClB,OAAQE,EACR,UAAWC,EACb,GAEJ,CAEJ",
6
+ "names": ["ApduSender", "BadgeRow", "Button", "Card", "CardBody", "CardHeader", "CardHeaderLeft", "CardSection", "CardTitle", "SectionLabel", "SmallText", "StatusBadge", "jsx", "jsxs", "isConnected", "state", "getDeviceStatusBadgeVariant", "status", "getSessionStateBadgeVariant", "stateType", "formatSessionStateType", "DeviceCard", "device", "onDisconnect", "onSendApdu", "apduResponses", "connected"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{DiscoveredDeviceCard as m}from"./DiscoveredDeviceCard";import{Button as c,ButtonGroup as S,DeviceList as y,ItalicNote as b,Section as f,SectionTitle as g,SmallText as n}from"./styles";import{jsx as e,jsxs as s}from"react/jsx-runtime";const B=({discoveredDevices:i,isListening:t,isActivelyDiscovering:o,startListening:a,stopListening:v,startDiscovering:l,stopDiscovering:p,connectDevice:d})=>{const D=t||o;return s(f,{children:[e(g,{children:"Device Discovery"}),s(S,{children:[e(c,{$variant:t?"warning":"primary",$size:"medium",onClick:t?v:a,disabled:o,children:t?"Stop Listening":"Listen for Devices"}),e(c,{$variant:o?"warning":"success",$size:"medium",onClick:o?p:l,disabled:t,children:o?"Stop Discovery":"Start Discovery"})]}),t&&i.length===0&&e(n,{children:"Listening for available devices..."}),o&&i.length===0&&e(n,{children:"Discovering devices..."}),i.length>0&&e(y,{children:i.map(r=>e(m,{device:r,onConnect:u=>d(r.id,u)},r.id))}),!D&&i.length===0&&e(n,{children:'Use "Listen for Devices" to see already-paired devices, or "Start Discovery" to scan for new devices.'}),e(b,{children:"Note: this may not work in web apps due to browser security restrictions. WebHID and WebBLE require a user gesture (click) in the app context to trigger device discovery."})]})};export{B as DeviceDiscoverySection};
2
+ //# sourceMappingURL=DeviceDiscoverySection.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/screens/inspector/DeviceDiscoverySection.tsx"],
4
+ "sourcesContent": ["/**\n * @file DeviceDiscoverySection\n *\n * Section of the Inspector that handles device discovery.\n * Provides buttons to start/stop passive listening and active discovery,\n * and displays the list of discovered devices.\n */\n\nimport React from \"react\";\nimport { type DiscoveredDevice } from \"@ledgerhq/device-management-kit\";\n\nimport { DiscoveredDeviceCard } from \"./DiscoveredDeviceCard\";\nimport {\n Button,\n ButtonGroup,\n DeviceList,\n ItalicNote,\n Section,\n SectionTitle,\n SmallText,\n} from \"./styles\";\n\ntype DeviceDiscoverySectionProps = {\n discoveredDevices: DiscoveredDevice[];\n isListening: boolean;\n isActivelyDiscovering: boolean;\n startListening: () => void;\n stopListening: () => void;\n startDiscovering: () => void;\n stopDiscovering: () => void;\n connectDevice: (\n deviceId: string,\n sessionRefresherOptions?: {\n isRefresherDisabled: boolean;\n pollingInterval?: number;\n },\n ) => void;\n};\n\nexport const DeviceDiscoverySection: React.FC<DeviceDiscoverySectionProps> = ({\n discoveredDevices,\n isListening,\n isActivelyDiscovering,\n startListening,\n stopListening,\n startDiscovering,\n stopDiscovering,\n connectDevice,\n}) => {\n const isAnyDiscoveryActive = isListening || isActivelyDiscovering;\n\n return (\n <Section>\n <SectionTitle>Device Discovery</SectionTitle>\n\n <ButtonGroup>\n <Button\n $variant={isListening ? \"warning\" : \"primary\"}\n $size=\"medium\"\n onClick={isListening ? stopListening : startListening}\n disabled={isActivelyDiscovering}\n >\n {isListening ? \"Stop Listening\" : \"Listen for Devices\"}\n </Button>\n\n <Button\n $variant={isActivelyDiscovering ? \"warning\" : \"success\"}\n $size=\"medium\"\n onClick={isActivelyDiscovering ? stopDiscovering : startDiscovering}\n disabled={isListening}\n >\n {isActivelyDiscovering ? \"Stop Discovery\" : \"Start Discovery\"}\n </Button>\n </ButtonGroup>\n\n {isListening && discoveredDevices.length === 0 && (\n <SmallText>Listening for available devices...</SmallText>\n )}\n {isActivelyDiscovering && discoveredDevices.length === 0 && (\n <SmallText>Discovering devices...</SmallText>\n )}\n\n {discoveredDevices.length > 0 && (\n <DeviceList>\n {discoveredDevices.map((device) => (\n <DiscoveredDeviceCard\n key={device.id}\n device={device}\n onConnect={(options) => connectDevice(device.id, options)}\n />\n ))}\n </DeviceList>\n )}\n\n {!isAnyDiscoveryActive && discoveredDevices.length === 0 && (\n <SmallText>\n Use &quot;Listen for Devices&quot; to see already-paired devices, or\n &quot;Start Discovery&quot; to scan for new devices.\n </SmallText>\n )}\n\n <ItalicNote>\n Note: this may not work in web apps due to browser security\n restrictions. WebHID and WebBLE require a user gesture (click) in the\n app context to trigger device discovery.\n </ItalicNote>\n </Section>\n );\n};\n"],
5
+ "mappings": "AAWA,OAAS,wBAAAA,MAA4B,yBACrC,OACE,UAAAC,EACA,eAAAC,EACA,cAAAC,EACA,cAAAC,EACA,WAAAC,EACA,gBAAAC,EACA,aAAAC,MACK,WAiCD,cAAAC,EAEA,QAAAC,MAFA,oBAdC,MAAMC,EAAgE,CAAC,CAC5E,kBAAAC,EACA,YAAAC,EACA,sBAAAC,EACA,eAAAC,EACA,cAAAC,EACA,iBAAAC,EACA,gBAAAC,EACA,cAAAC,CACF,IAAM,CACJ,MAAMC,EAAuBP,GAAeC,EAE5C,OACEJ,EAACJ,EAAA,CACC,UAAAG,EAACF,EAAA,CAAa,4BAAgB,EAE9BG,EAACP,EAAA,CACC,UAAAM,EAACP,EAAA,CACC,SAAUW,EAAc,UAAY,UACpC,MAAM,SACN,QAASA,EAAcG,EAAgBD,EACvC,SAAUD,EAET,SAAAD,EAAc,iBAAmB,qBACpC,EAEAJ,EAACP,EAAA,CACC,SAAUY,EAAwB,UAAY,UAC9C,MAAM,SACN,QAASA,EAAwBI,EAAkBD,EACnD,SAAUJ,EAET,SAAAC,EAAwB,iBAAmB,kBAC9C,GACF,EAECD,GAAeD,EAAkB,SAAW,GAC3CH,EAACD,EAAA,CAAU,8CAAkC,EAE9CM,GAAyBF,EAAkB,SAAW,GACrDH,EAACD,EAAA,CAAU,kCAAsB,EAGlCI,EAAkB,OAAS,GAC1BH,EAACL,EAAA,CACE,SAAAQ,EAAkB,IAAKS,GACtBZ,EAACR,EAAA,CAEC,OAAQoB,EACR,UAAYC,GAAYH,EAAcE,EAAO,GAAIC,CAAO,GAFnDD,EAAO,EAGd,CACD,EACH,EAGD,CAACD,GAAwBR,EAAkB,SAAW,GACrDH,EAACD,EAAA,CAAU,iHAGX,EAGFC,EAACJ,EAAA,CAAW,sLAIZ,GACF,CAEJ",
6
+ "names": ["DiscoveredDeviceCard", "Button", "ButtonGroup", "DeviceList", "ItalicNote", "Section", "SectionTitle", "SmallText", "jsx", "jsxs", "DeviceDiscoverySection", "discoveredDevices", "isListening", "isActivelyDiscovering", "startListening", "stopListening", "startDiscovering", "stopDiscovering", "connectDevice", "isAnyDiscoveryActive", "device", "options"]
7
+ }
@@ -0,0 +1,57 @@
1
+ import{useCallback as g,useState as p}from"react";import n from"styled-components";import{Button as C,Card as u,CardTitle as v,CollapsibleContent as b,CollapsibleHeader as h,CollapsibleToggle as D,SmallText as a}from"./styles";import{jsx as o,jsxs as e}from"react/jsx-runtime";const w=n.div`
2
+ display: flex;
3
+ gap: 16px;
4
+ `,y=n.div`
5
+ display: flex;
6
+ flex-direction: column;
7
+ flex: 1;
8
+ min-width: 0;
9
+ `,R=n.div`
10
+ display: flex;
11
+ flex-direction: column;
12
+ align-items: flex-end;
13
+ gap: 6px;
14
+ flex-shrink: 0;
15
+ `,I=n.div`
16
+ display: flex;
17
+ flex-direction: column;
18
+ gap: 2px;
19
+ margin-top: 4px;
20
+ `,T=n.span`
21
+ font-size: 11px;
22
+ font-weight: 600;
23
+ color: #888;
24
+ `,k=n.label`
25
+ display: flex;
26
+ align-items: center;
27
+ gap: 6px;
28
+ font-size: 11px;
29
+ color: #555;
30
+ cursor: pointer;
31
+ white-space: nowrap;
32
+ `,O=n.div`
33
+ display: flex;
34
+ align-items: center;
35
+ gap: 6px;
36
+ font-size: 11px;
37
+ color: #555;
38
+ white-space: nowrap;
39
+ `,P=n.input`
40
+ width: 60px;
41
+ padding: 2px 6px;
42
+ border: 1px solid #ddd;
43
+ border-radius: 3px;
44
+ font-size: 11px;
45
+ font-family: monospace;
46
+
47
+ &:focus {
48
+ outline: none;
49
+ border-color: #2196f3;
50
+ }
51
+
52
+ &:disabled {
53
+ opacity: 0.4;
54
+ cursor: not-allowed;
55
+ }
56
+ `,B=({device:l,onConnect:d})=>{const[r,c]=p(!1),[t,f]=p(!1),[s,x]=p(""),m=g(()=>{const i=s?parseInt(s,10):void 0;d({isRefresherDisabled:t,pollingInterval:i&&!isNaN(i)?i:void 0})},[d,t,s]);return o(u,{$variant:"discovered",children:e(w,{children:[e(y,{children:[o(v,{children:l.name||"Unknown Device"}),e(I,{children:[e(a,{children:["ID: ",l.id]}),e(a,{children:["Model: ",l.deviceModel.name]}),e(a,{children:["Transport: ",l.transport]}),l.rssi!==void 0&&l.rssi!==null&&e(a,{children:["Signal: ",l.rssi," dBm"]})]})]}),e(R,{children:[o(C,{$variant:"success",onClick:m,children:"Connect"}),e(h,{onClick:()=>c(!r),children:[o(D,{$expanded:r,children:"\u25B6"}),o(T,{children:"Options"})]}),e(b,{$expanded:r,children:[e(k,{children:[o("input",{type:"checkbox",checked:t,onChange:i=>f(i.target.checked)}),"Disable refresher"]}),e(O,{children:[o("span",{children:"Polling (ms):"}),o(P,{type:"number",min:"1000",placeholder:"1000",value:s,onChange:i=>x(i.target.value),disabled:t})]})]})]})]})})};export{B as DiscoveredDeviceCard};
57
+ //# sourceMappingURL=DiscoveredDeviceCard.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/screens/inspector/DiscoveredDeviceCard.tsx"],
4
+ "sourcesContent": ["import React, { useCallback, useState } from \"react\";\nimport { type DiscoveredDevice } from \"@ledgerhq/device-management-kit\";\nimport styled from \"styled-components\";\n\nimport {\n Button,\n Card,\n CardTitle,\n CollapsibleContent,\n CollapsibleHeader,\n CollapsibleToggle,\n SmallText,\n} from \"./styles\";\n\n// ============================================================================\n// Two-column layout\n// ============================================================================\n\nconst CardColumns = styled.div`\n display: flex;\n gap: 16px;\n`;\n\nconst LeftColumn = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n`;\n\nconst RightColumn = styled.div`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 6px;\n flex-shrink: 0;\n`;\n\nconst DeviceInfo = styled.div`\n display: flex;\n flex-direction: column;\n gap: 2px;\n margin-top: 4px;\n`;\n\n// ============================================================================\n// Compact connect options styled components\n// ============================================================================\n\nconst OptionsLabel = styled.span`\n font-size: 11px;\n font-weight: 600;\n color: #888;\n`;\n\nconst OptionRow = styled.label`\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n color: #555;\n cursor: pointer;\n white-space: nowrap;\n`;\n\nconst PollingRow = styled.div`\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n color: #555;\n white-space: nowrap;\n`;\n\nconst PollingInput = styled.input`\n width: 60px;\n padding: 2px 6px;\n border: 1px solid #ddd;\n border-radius: 3px;\n font-size: 11px;\n font-family: monospace;\n\n &:focus {\n outline: none;\n border-color: #2196f3;\n }\n\n &:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n`;\n\n// ============================================================================\n// Component\n// ============================================================================\n\ntype DiscoveredDeviceCardProps = {\n device: DiscoveredDevice;\n onConnect: (sessionRefresherOptions?: {\n isRefresherDisabled: boolean;\n pollingInterval?: number;\n }) => void;\n};\n\nexport const DiscoveredDeviceCard: React.FC<DiscoveredDeviceCardProps> = ({\n device,\n onConnect,\n}) => {\n const [optionsExpanded, setOptionsExpanded] = useState(false);\n const [isRefresherDisabled, setIsRefresherDisabled] = useState(false);\n const [pollingInterval, setPollingInterval] = useState<string>(\"\");\n\n const handleConnect = useCallback(() => {\n const parsedInterval = pollingInterval\n ? parseInt(pollingInterval, 10)\n : undefined;\n onConnect({\n isRefresherDisabled,\n pollingInterval:\n parsedInterval && !isNaN(parsedInterval) ? parsedInterval : undefined,\n });\n }, [onConnect, isRefresherDisabled, pollingInterval]);\n\n return (\n <Card $variant=\"discovered\">\n <CardColumns>\n <LeftColumn>\n <CardTitle>{device.name || \"Unknown Device\"}</CardTitle>\n <DeviceInfo>\n <SmallText>ID: {device.id}</SmallText>\n <SmallText>Model: {device.deviceModel.name}</SmallText>\n <SmallText>Transport: {device.transport}</SmallText>\n {device.rssi !== undefined && device.rssi !== null && (\n <SmallText>Signal: {device.rssi} dBm</SmallText>\n )}\n </DeviceInfo>\n </LeftColumn>\n\n <RightColumn>\n <Button $variant=\"success\" onClick={handleConnect}>\n Connect\n </Button>\n <CollapsibleHeader\n onClick={() => setOptionsExpanded(!optionsExpanded)}\n >\n <CollapsibleToggle $expanded={optionsExpanded}>\n &#9654;\n </CollapsibleToggle>\n <OptionsLabel>Options</OptionsLabel>\n </CollapsibleHeader>\n <CollapsibleContent $expanded={optionsExpanded}>\n <OptionRow>\n <input\n type=\"checkbox\"\n checked={isRefresherDisabled}\n onChange={(e) => setIsRefresherDisabled(e.target.checked)}\n />\n Disable refresher\n </OptionRow>\n <PollingRow>\n <span>Polling (ms):</span>\n <PollingInput\n type=\"number\"\n min=\"1000\"\n placeholder=\"1000\"\n value={pollingInterval}\n onChange={(e) => setPollingInterval(e.target.value)}\n disabled={isRefresherDisabled}\n />\n </PollingRow>\n </CollapsibleContent>\n </RightColumn>\n </CardColumns>\n </Card>\n );\n};\n"],
5
+ "mappings": "AAAA,OAAgB,eAAAA,EAAa,YAAAC,MAAgB,QAE7C,OAAOC,MAAY,oBAEnB,OACE,UAAAC,EACA,QAAAC,EACA,aAAAC,EACA,sBAAAC,EACA,qBAAAC,EACA,qBAAAC,EACA,aAAAC,MACK,WAoHG,cAAAC,EAEE,QAAAC,MAFF,oBA9GV,MAAMC,EAAcV,EAAO;AAAA;AAAA;AAAA,EAKrBW,EAAaX,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAOpBY,EAAcZ,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQrBa,EAAab,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAWpBc,EAAed,EAAO;AAAA;AAAA;AAAA;AAAA,EAMtBe,EAAYf,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUnBgB,EAAahB,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASpBiB,EAAejB,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+BfkB,EAA4D,CAAC,CACxE,OAAAC,EACA,UAAAC,CACF,IAAM,CACJ,KAAM,CAACC,EAAiBC,CAAkB,EAAIvB,EAAS,EAAK,EACtD,CAACwB,EAAqBC,CAAsB,EAAIzB,EAAS,EAAK,EAC9D,CAAC0B,EAAiBC,CAAkB,EAAI3B,EAAiB,EAAE,EAE3D4B,EAAgB7B,EAAY,IAAM,CACtC,MAAM8B,EAAiBH,EACnB,SAASA,EAAiB,EAAE,EAC5B,OACJL,EAAU,CACR,oBAAAG,EACA,gBACEK,GAAkB,CAAC,MAAMA,CAAc,EAAIA,EAAiB,MAChE,CAAC,CACH,EAAG,CAACR,EAAWG,EAAqBE,CAAe,CAAC,EAEpD,OACEjB,EAACN,EAAA,CAAK,SAAS,aACb,SAAAO,EAACC,EAAA,CACC,UAAAD,EAACE,EAAA,CACC,UAAAH,EAACL,EAAA,CAAW,SAAAgB,EAAO,MAAQ,iBAAiB,EAC5CV,EAACI,EAAA,CACC,UAAAJ,EAACF,EAAA,CAAU,iBAAKY,EAAO,IAAG,EAC1BV,EAACF,EAAA,CAAU,oBAAQY,EAAO,YAAY,MAAK,EAC3CV,EAACF,EAAA,CAAU,wBAAYY,EAAO,WAAU,EACvCA,EAAO,OAAS,QAAaA,EAAO,OAAS,MAC5CV,EAACF,EAAA,CAAU,qBAASY,EAAO,KAAK,QAAI,GAExC,GACF,EAEAV,EAACG,EAAA,CACC,UAAAJ,EAACP,EAAA,CAAO,SAAS,UAAU,QAAS0B,EAAe,mBAEnD,EACAlB,EAACJ,EAAA,CACC,QAAS,IAAMiB,EAAmB,CAACD,CAAe,EAElD,UAAAb,EAACF,EAAA,CAAkB,UAAWe,EAAiB,kBAE/C,EACAb,EAACM,EAAA,CAAa,mBAAO,GACvB,EACAL,EAACL,EAAA,CAAmB,UAAWiB,EAC7B,UAAAZ,EAACM,EAAA,CACC,UAAAP,EAAC,SACC,KAAK,WACL,QAASe,EACT,SAAWM,GAAML,EAAuBK,EAAE,OAAO,OAAO,EAC1D,EAAE,qBAEJ,EACApB,EAACO,EAAA,CACC,UAAAR,EAAC,QAAK,yBAAa,EACnBA,EAACS,EAAA,CACC,KAAK,SACL,IAAI,OACJ,YAAY,OACZ,MAAOQ,EACP,SAAWI,GAAMH,EAAmBG,EAAE,OAAO,KAAK,EAClD,SAAUN,EACZ,GACF,GACF,GACF,GACF,EACF,CAEJ",
6
+ "names": ["useCallback", "useState", "styled", "Button", "Card", "CardTitle", "CollapsibleContent", "CollapsibleHeader", "CollapsibleToggle", "SmallText", "jsx", "jsxs", "CardColumns", "LeftColumn", "RightColumn", "DeviceInfo", "OptionsLabel", "OptionRow", "PollingRow", "PollingInput", "DiscoveredDeviceCard", "device", "onConnect", "optionsExpanded", "setOptionsExpanded", "isRefresherDisabled", "setIsRefresherDisabled", "pollingInterval", "setPollingInterval", "handleConnect", "parsedInterval", "e"]
7
+ }