@sudobility/testomniac_ui 0.0.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 (266) hide show
  1. package/README.md +83 -0
  2. package/dist/components/bundles/AddToBundleButton.d.ts +8 -0
  3. package/dist/components/bundles/AddToBundleButton.d.ts.map +1 -0
  4. package/dist/components/bundles/AddToBundleButton.js +64 -0
  5. package/dist/components/bundles/AddToBundleButton.js.map +1 -0
  6. package/dist/components/cells/BundleCell.d.ts +10 -0
  7. package/dist/components/cells/BundleCell.d.ts.map +1 -0
  8. package/dist/components/cells/BundleCell.js +8 -0
  9. package/dist/components/cells/BundleCell.js.map +1 -0
  10. package/dist/components/cells/InteractionCell.d.ts +17 -0
  11. package/dist/components/cells/InteractionCell.d.ts.map +1 -0
  12. package/dist/components/cells/InteractionCell.js +13 -0
  13. package/dist/components/cells/InteractionCell.js.map +1 -0
  14. package/dist/components/cells/ListCell.d.ts +29 -0
  15. package/dist/components/cells/ListCell.d.ts.map +1 -0
  16. package/dist/components/cells/ListCell.js +19 -0
  17. package/dist/components/cells/ListCell.js.map +1 -0
  18. package/dist/components/cells/PersonaCell.d.ts +10 -0
  19. package/dist/components/cells/PersonaCell.d.ts.map +1 -0
  20. package/dist/components/cells/PersonaCell.js +7 -0
  21. package/dist/components/cells/PersonaCell.js.map +1 -0
  22. package/dist/components/cells/ScaffoldCell.d.ts +12 -0
  23. package/dist/components/cells/ScaffoldCell.d.ts.map +1 -0
  24. package/dist/components/cells/ScaffoldCell.js +10 -0
  25. package/dist/components/cells/ScaffoldCell.js.map +1 -0
  26. package/dist/components/cells/ScenarioCell.d.ts +12 -0
  27. package/dist/components/cells/ScenarioCell.d.ts.map +1 -0
  28. package/dist/components/cells/ScenarioCell.js +8 -0
  29. package/dist/components/cells/ScenarioCell.js.map +1 -0
  30. package/dist/components/cells/SurfaceCell.d.ts +14 -0
  31. package/dist/components/cells/SurfaceCell.d.ts.map +1 -0
  32. package/dist/components/cells/SurfaceCell.js +23 -0
  33. package/dist/components/cells/SurfaceCell.js.map +1 -0
  34. package/dist/components/cells/index.d.ts +9 -0
  35. package/dist/components/cells/index.d.ts.map +1 -0
  36. package/dist/components/cells/index.js +9 -0
  37. package/dist/components/cells/index.js.map +1 -0
  38. package/dist/components/cells/scaffoldMeta.d.ts +6 -0
  39. package/dist/components/cells/scaffoldMeta.d.ts.map +1 -0
  40. package/dist/components/cells/scaffoldMeta.js +47 -0
  41. package/dist/components/cells/scaffoldMeta.js.map +1 -0
  42. package/dist/components/dashboard/DashboardSidebar.d.ts +6 -0
  43. package/dist/components/dashboard/DashboardSidebar.d.ts.map +1 -0
  44. package/dist/components/dashboard/DashboardSidebar.js +163 -0
  45. package/dist/components/dashboard/DashboardSidebar.js.map +1 -0
  46. package/dist/components/data/DataTable.d.ts +16 -0
  47. package/dist/components/data/DataTable.d.ts.map +1 -0
  48. package/dist/components/data/DataTable.js +54 -0
  49. package/dist/components/data/DataTable.js.map +1 -0
  50. package/dist/components/data/JsonViewer.d.ts +6 -0
  51. package/dist/components/data/JsonViewer.d.ts.map +1 -0
  52. package/dist/components/data/JsonViewer.js +5 -0
  53. package/dist/components/data/JsonViewer.js.map +1 -0
  54. package/dist/components/data/index.d.ts +3 -0
  55. package/dist/components/data/index.d.ts.map +1 -0
  56. package/dist/components/data/index.js +3 -0
  57. package/dist/components/data/index.js.map +1 -0
  58. package/dist/components/forms/SelectField.d.ts +22 -0
  59. package/dist/components/forms/SelectField.d.ts.map +1 -0
  60. package/dist/components/forms/SelectField.js +14 -0
  61. package/dist/components/forms/SelectField.js.map +1 -0
  62. package/dist/components/navigation/BackLink.d.ts +7 -0
  63. package/dist/components/navigation/BackLink.d.ts.map +1 -0
  64. package/dist/components/navigation/BackLink.js +6 -0
  65. package/dist/components/navigation/BackLink.js.map +1 -0
  66. package/dist/components/pages/PagesListView.d.ts +12 -0
  67. package/dist/components/pages/PagesListView.d.ts.map +1 -0
  68. package/dist/components/pages/PagesListView.js +19 -0
  69. package/dist/components/pages/PagesListView.js.map +1 -0
  70. package/dist/components/pages/PagesMapView.d.ts +15 -0
  71. package/dist/components/pages/PagesMapView.d.ts.map +1 -0
  72. package/dist/components/pages/PagesMapView.js +232 -0
  73. package/dist/components/pages/PagesMapView.js.map +1 -0
  74. package/dist/components/scanner/EventLog.d.ts +8 -0
  75. package/dist/components/scanner/EventLog.d.ts.map +1 -0
  76. package/dist/components/scanner/EventLog.js +18 -0
  77. package/dist/components/scanner/EventLog.js.map +1 -0
  78. package/dist/components/scanner/LiveCounters.d.ts +9 -0
  79. package/dist/components/scanner/LiveCounters.d.ts.map +1 -0
  80. package/dist/components/scanner/LiveCounters.js +33 -0
  81. package/dist/components/scanner/LiveCounters.js.map +1 -0
  82. package/dist/components/scanner/PhaseIndicator.d.ts +6 -0
  83. package/dist/components/scanner/PhaseIndicator.d.ts.map +1 -0
  84. package/dist/components/scanner/PhaseIndicator.js +31 -0
  85. package/dist/components/scanner/PhaseIndicator.js.map +1 -0
  86. package/dist/components/scanner/RunSummaryCard.d.ts +12 -0
  87. package/dist/components/scanner/RunSummaryCard.d.ts.map +1 -0
  88. package/dist/components/scanner/RunSummaryCard.js +7 -0
  89. package/dist/components/scanner/RunSummaryCard.js.map +1 -0
  90. package/dist/components/scanner/ScanForm.d.ts +9 -0
  91. package/dist/components/scanner/ScanForm.d.ts.map +1 -0
  92. package/dist/components/scanner/ScanForm.js +31 -0
  93. package/dist/components/scanner/ScanForm.js.map +1 -0
  94. package/dist/components/scanner/ScanProgressPanel.d.ts +16 -0
  95. package/dist/components/scanner/ScanProgressPanel.d.ts.map +1 -0
  96. package/dist/components/scanner/ScanProgressPanel.js +8 -0
  97. package/dist/components/scanner/ScanProgressPanel.js.map +1 -0
  98. package/dist/components/scanner/StatusBadge.d.ts +7 -0
  99. package/dist/components/scanner/StatusBadge.d.ts.map +1 -0
  100. package/dist/components/scanner/StatusBadge.js +65 -0
  101. package/dist/components/scanner/StatusBadge.js.map +1 -0
  102. package/dist/components/scanner/index.d.ts +8 -0
  103. package/dist/components/scanner/index.d.ts.map +1 -0
  104. package/dist/components/scanner/index.js +8 -0
  105. package/dist/components/scanner/index.js.map +1 -0
  106. package/dist/components/scenarios/AddScenarioForm.d.ts +14 -0
  107. package/dist/components/scenarios/AddScenarioForm.d.ts.map +1 -0
  108. package/dist/components/scenarios/AddScenarioForm.js +43 -0
  109. package/dist/components/scenarios/AddScenarioForm.js.map +1 -0
  110. package/dist/components/scripts/ScriptPanel.d.ts +17 -0
  111. package/dist/components/scripts/ScriptPanel.d.ts.map +1 -0
  112. package/dist/components/scripts/ScriptPanel.js +32 -0
  113. package/dist/components/scripts/ScriptPanel.js.map +1 -0
  114. package/dist/components/states/index.d.ts +19 -0
  115. package/dist/components/states/index.d.ts.map +1 -0
  116. package/dist/components/states/index.js +16 -0
  117. package/dist/components/states/index.js.map +1 -0
  118. package/dist/config/priorityConfig.d.ts +12 -0
  119. package/dist/config/priorityConfig.d.ts.map +1 -0
  120. package/dist/config/priorityConfig.js +39 -0
  121. package/dist/config/priorityConfig.js.map +1 -0
  122. package/dist/context/config.d.ts +53 -0
  123. package/dist/context/config.d.ts.map +1 -0
  124. package/dist/context/config.js +32 -0
  125. package/dist/context/config.js.map +1 -0
  126. package/dist/context/routing.d.ts +42 -0
  127. package/dist/context/routing.d.ts.map +1 -0
  128. package/dist/context/routing.js +33 -0
  129. package/dist/context/routing.js.map +1 -0
  130. package/dist/hooks/useDashboardEnvironmentContext.d.ts +15 -0
  131. package/dist/hooks/useDashboardEnvironmentContext.d.ts.map +1 -0
  132. package/dist/hooks/useDashboardEnvironmentContext.js +89 -0
  133. package/dist/hooks/useDashboardEnvironmentContext.js.map +1 -0
  134. package/dist/hooks/useEnvBasePath.d.ts +8 -0
  135. package/dist/hooks/useEnvBasePath.d.ts.map +1 -0
  136. package/dist/hooks/useEnvBasePath.js +12 -0
  137. package/dist/hooks/useEnvBasePath.js.map +1 -0
  138. package/dist/hooks/useLocalizedNavigate.d.ts +12 -0
  139. package/dist/hooks/useLocalizedNavigate.d.ts.map +1 -0
  140. package/dist/hooks/useLocalizedNavigate.js +14 -0
  141. package/dist/hooks/useLocalizedNavigate.js.map +1 -0
  142. package/dist/index.d.ts +49 -0
  143. package/dist/index.d.ts.map +1 -0
  144. package/dist/index.js +66 -0
  145. package/dist/index.js.map +1 -0
  146. package/dist/pages/BundleDetailPage.d.ts +2 -0
  147. package/dist/pages/BundleDetailPage.d.ts.map +1 -0
  148. package/dist/pages/BundleDetailPage.js +155 -0
  149. package/dist/pages/BundleDetailPage.js.map +1 -0
  150. package/dist/pages/BundlesPage.d.ts +2 -0
  151. package/dist/pages/BundlesPage.d.ts.map +1 -0
  152. package/dist/pages/BundlesPage.js +61 -0
  153. package/dist/pages/BundlesPage.js.map +1 -0
  154. package/dist/pages/DashboardOverview.d.ts +2 -0
  155. package/dist/pages/DashboardOverview.d.ts.map +1 -0
  156. package/dist/pages/DashboardOverview.js +179 -0
  157. package/dist/pages/DashboardOverview.js.map +1 -0
  158. package/dist/pages/FindingsListPage.d.ts +2 -0
  159. package/dist/pages/FindingsListPage.d.ts.map +1 -0
  160. package/dist/pages/FindingsListPage.js +160 -0
  161. package/dist/pages/FindingsListPage.js.map +1 -0
  162. package/dist/pages/PageDetailPage.d.ts +2 -0
  163. package/dist/pages/PageDetailPage.d.ts.map +1 -0
  164. package/dist/pages/PageDetailPage.js +120 -0
  165. package/dist/pages/PageDetailPage.js.map +1 -0
  166. package/dist/pages/PageGraphPage.d.ts +3 -0
  167. package/dist/pages/PageGraphPage.d.ts.map +1 -0
  168. package/dist/pages/PageGraphPage.js +72 -0
  169. package/dist/pages/PageGraphPage.js.map +1 -0
  170. package/dist/pages/PageStateDetailPage.d.ts +2 -0
  171. package/dist/pages/PageStateDetailPage.d.ts.map +1 -0
  172. package/dist/pages/PageStateDetailPage.js +69 -0
  173. package/dist/pages/PageStateDetailPage.js.map +1 -0
  174. package/dist/pages/PagesPage.d.ts +2 -0
  175. package/dist/pages/PagesPage.d.ts.map +1 -0
  176. package/dist/pages/PagesPage.js +83 -0
  177. package/dist/pages/PagesPage.js.map +1 -0
  178. package/dist/pages/PatternsPage.d.ts +2 -0
  179. package/dist/pages/PatternsPage.d.ts.map +1 -0
  180. package/dist/pages/PatternsPage.js +102 -0
  181. package/dist/pages/PatternsPage.js.map +1 -0
  182. package/dist/pages/PersonasPage.d.ts +2 -0
  183. package/dist/pages/PersonasPage.d.ts.map +1 -0
  184. package/dist/pages/PersonasPage.js +151 -0
  185. package/dist/pages/PersonasPage.js.map +1 -0
  186. package/dist/pages/RunRedirect.d.ts +2 -0
  187. package/dist/pages/RunRedirect.d.ts.map +1 -0
  188. package/dist/pages/RunRedirect.js +25 -0
  189. package/dist/pages/RunRedirect.js.map +1 -0
  190. package/dist/pages/RunSurfaceRunDetailPage.d.ts +2 -0
  191. package/dist/pages/RunSurfaceRunDetailPage.d.ts.map +1 -0
  192. package/dist/pages/RunSurfaceRunDetailPage.js +38 -0
  193. package/dist/pages/RunSurfaceRunDetailPage.js.map +1 -0
  194. package/dist/pages/RunSurfaceRunsPage.d.ts +2 -0
  195. package/dist/pages/RunSurfaceRunsPage.d.ts.map +1 -0
  196. package/dist/pages/RunSurfaceRunsPage.js +35 -0
  197. package/dist/pages/RunSurfaceRunsPage.js.map +1 -0
  198. package/dist/pages/RunTestInteractionRunDetailPage.d.ts +2 -0
  199. package/dist/pages/RunTestInteractionRunDetailPage.d.ts.map +1 -0
  200. package/dist/pages/RunTestInteractionRunDetailPage.js +55 -0
  201. package/dist/pages/RunTestInteractionRunDetailPage.js.map +1 -0
  202. package/dist/pages/RunTestInteractionRunsPage.d.ts +2 -0
  203. package/dist/pages/RunTestInteractionRunsPage.d.ts.map +1 -0
  204. package/dist/pages/RunTestInteractionRunsPage.js +38 -0
  205. package/dist/pages/RunTestInteractionRunsPage.js.map +1 -0
  206. package/dist/pages/RunnerGraphPage.d.ts +3 -0
  207. package/dist/pages/RunnerGraphPage.d.ts.map +1 -0
  208. package/dist/pages/RunnerGraphPage.js +86 -0
  209. package/dist/pages/RunnerGraphPage.js.map +1 -0
  210. package/dist/pages/ScaffoldDetailPage.d.ts +2 -0
  211. package/dist/pages/ScaffoldDetailPage.d.ts.map +1 -0
  212. package/dist/pages/ScaffoldDetailPage.js +56 -0
  213. package/dist/pages/ScaffoldDetailPage.js.map +1 -0
  214. package/dist/pages/ScaffoldsPage.d.ts +2 -0
  215. package/dist/pages/ScaffoldsPage.d.ts.map +1 -0
  216. package/dist/pages/ScaffoldsPage.js +35 -0
  217. package/dist/pages/ScaffoldsPage.js.map +1 -0
  218. package/dist/pages/ScanProgressPage.d.ts +2 -0
  219. package/dist/pages/ScanProgressPage.d.ts.map +1 -0
  220. package/dist/pages/ScanProgressPage.js +30 -0
  221. package/dist/pages/ScanProgressPage.js.map +1 -0
  222. package/dist/pages/SchedulesPage.d.ts +2 -0
  223. package/dist/pages/SchedulesPage.d.ts.map +1 -0
  224. package/dist/pages/SchedulesPage.js +165 -0
  225. package/dist/pages/SchedulesPage.js.map +1 -0
  226. package/dist/pages/StartScanPage.d.ts +2 -0
  227. package/dist/pages/StartScanPage.d.ts.map +1 -0
  228. package/dist/pages/StartScanPage.js +97 -0
  229. package/dist/pages/StartScanPage.js.map +1 -0
  230. package/dist/pages/TestInteractionDetailPage.d.ts +2 -0
  231. package/dist/pages/TestInteractionDetailPage.d.ts.map +1 -0
  232. package/dist/pages/TestInteractionDetailPage.js +60 -0
  233. package/dist/pages/TestInteractionDetailPage.js.map +1 -0
  234. package/dist/pages/TestInteractionsPage.d.ts +2 -0
  235. package/dist/pages/TestInteractionsPage.d.ts.map +1 -0
  236. package/dist/pages/TestInteractionsPage.js +96 -0
  237. package/dist/pages/TestInteractionsPage.js.map +1 -0
  238. package/dist/pages/TestRunDetailPage.d.ts +2 -0
  239. package/dist/pages/TestRunDetailPage.d.ts.map +1 -0
  240. package/dist/pages/TestRunDetailPage.js +81 -0
  241. package/dist/pages/TestRunDetailPage.js.map +1 -0
  242. package/dist/pages/TestRunsListPage.d.ts +2 -0
  243. package/dist/pages/TestRunsListPage.d.ts.map +1 -0
  244. package/dist/pages/TestRunsListPage.js +18 -0
  245. package/dist/pages/TestRunsListPage.js.map +1 -0
  246. package/dist/pages/TestScenarioDetailPage.d.ts +2 -0
  247. package/dist/pages/TestScenarioDetailPage.d.ts.map +1 -0
  248. package/dist/pages/TestScenarioDetailPage.js +101 -0
  249. package/dist/pages/TestScenarioDetailPage.js.map +1 -0
  250. package/dist/pages/TestScenariosPage.d.ts +2 -0
  251. package/dist/pages/TestScenariosPage.d.ts.map +1 -0
  252. package/dist/pages/TestScenariosPage.js +73 -0
  253. package/dist/pages/TestScenariosPage.js.map +1 -0
  254. package/dist/pages/TestSurfaceDetailPage.d.ts +2 -0
  255. package/dist/pages/TestSurfaceDetailPage.d.ts.map +1 -0
  256. package/dist/pages/TestSurfaceDetailPage.js +33 -0
  257. package/dist/pages/TestSurfaceDetailPage.js.map +1 -0
  258. package/dist/pages/TestSurfacesListPage.d.ts +2 -0
  259. package/dist/pages/TestSurfacesListPage.d.ts.map +1 -0
  260. package/dist/pages/TestSurfacesListPage.js +73 -0
  261. package/dist/pages/TestSurfacesListPage.js.map +1 -0
  262. package/dist/utils/formatDateTime.d.ts +13 -0
  263. package/dist/utils/formatDateTime.d.ts.map +1 -0
  264. package/dist/utils/formatDateTime.js +27 -0
  265. package/dist/utils/formatDateTime.js.map +1 -0
  266. package/package.json +72 -0
@@ -0,0 +1,232 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo, useCallback, useEffect } from 'react';
3
+ import { ReactFlow, Background, Controls, MiniMap, useNodesState, useEdgesState, BezierEdge, MarkerType, Handle, Position, } from '@xyflow/react';
4
+ import '@xyflow/react/dist/style.css';
5
+ import { normalizePath, patternizePath } from '@sudobility/testomniac_lib';
6
+ import { buildArtifactUrl } from '@sudobility/testomniac_client';
7
+ import { useLocalizedNavigate } from '../../hooks/useLocalizedNavigate';
8
+ // --- Constants ---
9
+ const PAGE_NODE_WIDTH = 220;
10
+ const PAGE_NODE_HEIGHT = 180;
11
+ // Vertical distance between row origins. Must exceed PAGE_NODE_HEIGHT so tiles
12
+ // in adjacent depth rows don't overlap; the extra leaves a comfortable gap.
13
+ const ROW_GAP = 280;
14
+ const COL_GAP = 250;
15
+ const MAP_TEST_TYPES = new Set(['navigation', 'interaction']);
16
+ // --- Custom Nodes ---
17
+ function PageNode({ data, }) {
18
+ const borderColor = data.isExternal ? '#f97316' : '#374151';
19
+ return (_jsxs("div", { className: "rounded-lg bg-white text-xs dark:bg-gray-900 overflow-hidden shadow-sm", style: {
20
+ border: `2px solid ${borderColor}`,
21
+ width: PAGE_NODE_WIDTH,
22
+ minHeight: PAGE_NODE_HEIGHT,
23
+ }, children: [_jsx(Handle, { type: "target", position: Position.Top, className: "!bg-gray-400" }), _jsx("div", { className: "bg-gray-100 dark:bg-gray-800 flex items-center justify-center", style: { height: 130 }, children: data.screenshotUrl ? (_jsx("img", { src: data.screenshotUrl, alt: data.label, className: "w-full h-full object-cover object-top", loading: "lazy" })) : (_jsxs("svg", { className: "w-8 h-8 text-gray-300 dark:text-gray-600", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: [_jsx("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }), _jsx("path", { d: "M3 15l5-5 4 4 3-3 6 6" }), _jsx("circle", { cx: "8.5", cy: "8.5", r: "1.5" })] })) }), _jsxs("div", { className: "px-2 py-1.5 text-center border-t border-gray-100 dark:border-gray-700/50", children: [_jsx("span", { className: "block max-w-[190px] truncate text-gray-900 dark:text-gray-100 font-medium", children: data.label }), data.count > 1 && (_jsxs("span", { className: "text-[10px] text-gray-400 dark:text-gray-500", children: [data.count, " URLs"] }))] }), _jsx(Handle, { type: "source", position: Position.Bottom, className: "!bg-gray-400" })] }));
24
+ }
25
+ const nodeTypes = {
26
+ pageNode: PageNode,
27
+ };
28
+ function CurvedEdge(props) {
29
+ return _jsx(BezierEdge, { ...props, pathOptions: { curvature: 0.8 } });
30
+ }
31
+ const edgeTypes = {
32
+ curved: CurvedEdge,
33
+ };
34
+ // --- Helpers ---
35
+ function getConsolidationKey(page) {
36
+ // Always normalize: strip query params / hash, trailing slashes,
37
+ // then collapse dynamic segments so parameterised URLs merge.
38
+ const raw = page.routeKey || page.relativePath;
39
+ const isExternal = page.relativePath.startsWith('http');
40
+ if (isExternal) {
41
+ try {
42
+ const url = new URL(page.relativePath);
43
+ const pathname = url.pathname === '/' ? '' : url.pathname.replace(/\/+$/, '');
44
+ return `${url.host}${patternizePath(pathname)}`;
45
+ }
46
+ catch {
47
+ return page.relativePath;
48
+ }
49
+ }
50
+ const normalized = normalizePath(raw);
51
+ if (normalized)
52
+ return patternizePath(normalized);
53
+ return raw;
54
+ }
55
+ function getPathDepth(path) {
56
+ if (path === '/')
57
+ return 0;
58
+ return path.split('/').filter(Boolean).length;
59
+ }
60
+ export function PagesMapView({ pages, testInteractions, envId, entitySlug, runId, screenshotsByPageId, apiUrl, }) {
61
+ const { navigate } = useLocalizedNavigate();
62
+ const pageBasePath = runId
63
+ ? `/dashboard/${entitySlug}/environments/${envId}/runs/${runId}/pages`
64
+ : `/dashboard/${entitySlug}/environments/${envId}/pages`;
65
+ const { initialNodes, initialEdges, hiddenInteractionCount } = useMemo(() => {
66
+ if (pages.length === 0)
67
+ return { initialNodes: [], initialEdges: [], hiddenInteractionCount: 0 };
68
+ // --- 1. Consolidate pages by routeKey / normalized path ---
69
+ const consolidated = new Map();
70
+ for (const page of pages) {
71
+ const key = getConsolidationKey(page);
72
+ const existing = consolidated.get(key);
73
+ if (existing) {
74
+ existing.pageIds.push(page.id);
75
+ }
76
+ else {
77
+ consolidated.set(key, {
78
+ pageIds: [page.id],
79
+ isExternal: page.relativePath.startsWith('http'),
80
+ });
81
+ }
82
+ }
83
+ const nodeEntries = Array.from(consolidated.entries()).map(([path, data]) => ({
84
+ path,
85
+ ...data,
86
+ depth: getPathDepth(path),
87
+ }));
88
+ // --- 2. Map original page IDs → consolidated path ---
89
+ const pageIdToPath = new Map();
90
+ for (const entry of nodeEntries) {
91
+ for (const pid of entry.pageIds) {
92
+ pageIdToPath.set(pid, entry.path);
93
+ }
94
+ }
95
+ // --- 3. Position nodes by depth (rows) ---
96
+ const depthGroups = new Map();
97
+ for (const entry of nodeEntries) {
98
+ const arr = depthGroups.get(entry.depth) || [];
99
+ arr.push(entry);
100
+ depthGroups.set(entry.depth, arr);
101
+ }
102
+ const sortedDepths = Array.from(depthGroups.keys()).sort((a, b) => a - b);
103
+ const rfNodes = [];
104
+ for (let rowIdx = 0; rowIdx < sortedDepths.length; rowIdx++) {
105
+ const group = depthGroups.get(sortedDepths[rowIdx]);
106
+ group.sort((a, b) => a.path.localeCompare(b.path));
107
+ const totalWidth = group.length * COL_GAP;
108
+ const startX = -totalWidth / 2 + COL_GAP / 2;
109
+ for (let i = 0; i < group.length; i++) {
110
+ const entry = group[i];
111
+ // Find screenshot for first page ID in this group
112
+ let screenshotUrl = null;
113
+ if (screenshotsByPageId && apiUrl) {
114
+ for (const pid of entry.pageIds) {
115
+ const path = screenshotsByPageId.get(pid);
116
+ if (path) {
117
+ screenshotUrl = buildArtifactUrl(apiUrl, path, { thumbnail: true });
118
+ break;
119
+ }
120
+ }
121
+ }
122
+ rfNodes.push({
123
+ id: entry.path,
124
+ type: 'pageNode',
125
+ data: {
126
+ label: entry.path,
127
+ isExternal: entry.isExternal,
128
+ count: entry.pageIds.length,
129
+ pageIds: entry.pageIds,
130
+ screenshotUrl,
131
+ },
132
+ position: {
133
+ x: startX + i * COL_GAP,
134
+ y: rowIdx * ROW_GAP,
135
+ },
136
+ });
137
+ }
138
+ }
139
+ // --- 4. URL hierarchy edges (parent → child) ---
140
+ const pathSet = new Set(nodeEntries.map(n => n.path));
141
+ const rfEdges = [];
142
+ const edgeKeySet = new Set();
143
+ for (const entry of nodeEntries) {
144
+ if (entry.path === '/' || entry.isExternal)
145
+ continue;
146
+ const segments = entry.path.split('/').filter(Boolean);
147
+ for (let i = segments.length - 1; i >= 0; i--) {
148
+ const parentPath = i === 0 ? '/' : '/' + segments.slice(0, i).join('/');
149
+ if (pathSet.has(parentPath)) {
150
+ const key = `${parentPath}\0${entry.path}`;
151
+ edgeKeySet.add(key);
152
+ rfEdges.push({
153
+ id: `h-${rfEdges.length}`,
154
+ source: parentPath,
155
+ target: entry.path,
156
+ type: 'curved',
157
+ style: { stroke: '#94a3b8' },
158
+ markerEnd: {
159
+ type: MarkerType.ArrowClosed,
160
+ color: '#94a3b8',
161
+ },
162
+ });
163
+ break;
164
+ }
165
+ }
166
+ }
167
+ // --- 5. Test interaction edges (cross-page) ---
168
+ let hiddenInteractionCount = 0;
169
+ const interactionCounts = new Map();
170
+ for (const ti of testInteractions) {
171
+ if (!MAP_TEST_TYPES.has(ti.testType))
172
+ continue;
173
+ const sourcePath = ti.pageId != null ? (pageIdToPath.get(ti.pageId) ?? null) : null;
174
+ const targetPath = ti.targetPageId != null ? (pageIdToPath.get(ti.targetPageId) ?? null) : null;
175
+ const src = ti.testType === 'navigation' ? null : sourcePath;
176
+ const tgt = targetPath ?? (ti.testType === 'navigation' ? sourcePath : null);
177
+ if (src && tgt && src !== tgt) {
178
+ const key = `${src}\0${tgt}`;
179
+ const existing = interactionCounts.get(key);
180
+ if (existing) {
181
+ existing.count++;
182
+ }
183
+ else {
184
+ interactionCounts.set(key, { source: src, target: tgt, count: 1 });
185
+ }
186
+ }
187
+ else {
188
+ hiddenInteractionCount++;
189
+ }
190
+ }
191
+ for (const [key, edge] of interactionCounts) {
192
+ if (!edgeKeySet.has(key)) {
193
+ edgeKeySet.add(key);
194
+ rfEdges.push({
195
+ id: `ti-${rfEdges.length}`,
196
+ source: edge.source,
197
+ target: edge.target,
198
+ type: 'smoothstep',
199
+ animated: true,
200
+ style: { stroke: '#60a5fa' },
201
+ label: edge.count > 1 ? String(edge.count) : undefined,
202
+ markerEnd: {
203
+ type: MarkerType.ArrowClosed,
204
+ color: '#60a5fa',
205
+ },
206
+ });
207
+ }
208
+ }
209
+ return {
210
+ initialNodes: rfNodes,
211
+ initialEdges: rfEdges,
212
+ hiddenInteractionCount,
213
+ };
214
+ }, [pages, testInteractions, screenshotsByPageId, apiUrl]);
215
+ const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
216
+ const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
217
+ useEffect(() => {
218
+ setNodes(initialNodes);
219
+ setEdges(initialEdges);
220
+ }, [initialNodes, initialEdges, setNodes, setEdges]);
221
+ const handleNodeDoubleClick = useCallback((_, node) => {
222
+ const pageIds = node.data.pageIds;
223
+ if (pageIds && pageIds.length > 0) {
224
+ navigate(`${pageBasePath}/${pageIds[0]}`);
225
+ }
226
+ }, [navigate, pageBasePath]);
227
+ if (pages.length === 0) {
228
+ return (_jsx("div", { className: "flex h-[500px] items-center justify-center rounded-lg border border-gray-200 bg-gray-50 dark:border-gray-700 dark:bg-gray-800", children: _jsx("p", { className: "text-gray-500 dark:text-gray-400", children: "No page connections to display. Run a scan to discover navigation flows." }) }));
229
+ }
230
+ return (_jsxs("div", { className: "space-y-2", children: [hiddenInteractionCount > 0 && (_jsxs("p", { className: "text-xs text-gray-500 dark:text-gray-400", children: [hiddenInteractionCount, " interaction", hiddenInteractionCount === 1 ? '' : 's', " omitted (no cross-page connection)."] })), _jsx("div", { className: "h-[600px] w-full overflow-hidden rounded-lg border border-gray-200 dark:border-gray-700", children: _jsxs(ReactFlow, { nodes: nodes, edges: edges, nodeTypes: nodeTypes, edgeTypes: edgeTypes, onNodesChange: onNodesChange, onEdgesChange: onEdgesChange, onNodeDoubleClick: handleNodeDoubleClick, fitView: true, className: "bg-gray-50 dark:bg-gray-900", children: [_jsx(Background, {}), _jsx(Controls, {}), _jsx(MiniMap, {})] }) })] }));
231
+ }
232
+ //# sourceMappingURL=PagesMapView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PagesMapView.js","sourceRoot":"","sources":["../../../src/components/pages/PagesMapView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { TestRunStreamEvent } from '@sudobility/testomniac_types';
2
+ interface EventLogProps {
3
+ events: TestRunStreamEvent[];
4
+ maxHeight?: string;
5
+ }
6
+ export declare function EventLog({ events, maxHeight }: EventLogProps): import("react").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=EventLog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventLog.d.ts","sourceRoot":"","sources":["../../../src/components/scanner/EventLog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAEvE,UAAU,aAAa;IACrB,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAmB,EAAE,EAAE,aAAa,+BA4DtE"}
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export function EventLog({ events, maxHeight = '300px' }) {
3
+ const renderPayload = (event) => {
4
+ const payload = event.payload;
5
+ if (event.type === 'finding_created') {
6
+ const title = String(payload.title ?? '');
7
+ const description = String(payload.description ?? '');
8
+ return (_jsxs("div", { className: "space-y-0.5", children: [_jsx("div", { className: "text-red-700 dark:text-red-300", children: title }), description && (_jsx("div", { className: "text-gray-600 dark:text-gray-300 whitespace-pre-wrap break-words", children: description }))] }));
9
+ }
10
+ if (event.type === 'run_failed') {
11
+ const error = String(payload.error ?? payload.status ?? '');
12
+ return (_jsx("div", { className: "text-red-700 dark:text-red-300 whitespace-pre-wrap break-words", children: error || 'Run failed' }));
13
+ }
14
+ return (_jsx("span", { className: "text-gray-600 dark:text-gray-300 break-words", children: JSON.stringify(event.payload) }));
15
+ };
16
+ return (_jsxs("div", { className: "border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden", children: [_jsx("div", { className: "bg-gray-50 dark:bg-gray-800 px-3 py-2 border-b border-gray-200 dark:border-gray-700", children: _jsxs("span", { className: "text-xs font-medium text-gray-500 dark:text-gray-400", children: ["Event Log (", events.length, ")"] }) }), _jsx("div", { className: "overflow-y-auto font-mono text-xs", style: { maxHeight }, children: events.length === 0 ? (_jsx("div", { className: "px-3 py-4 text-center text-gray-400", children: "Waiting for events..." })) : (events.map((event, i) => (_jsxs("div", { className: "px-3 py-1.5 border-b border-gray-100 dark:border-gray-800 last:border-0 hover:bg-gray-50 dark:hover:bg-gray-800/50", children: [_jsx("span", { className: "text-gray-400", children: new Date(event.createdAt).toLocaleTimeString() }), ' ', _jsx("span", { className: "text-blue-600 dark:text-blue-400", children: event.type }), ' ', renderPayload(event)] }, i)))) })] }));
17
+ }
18
+ //# sourceMappingURL=EventLog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventLog.js","sourceRoot":"","sources":["../../../src/components/scanner/EventLog.tsx"],"names":[],"mappings":";AAOA,MAAM,UAAU,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,EAAiB;IACrE,MAAM,aAAa,GAAG,CAAC,KAAyB,EAAE,EAAE;QAClD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAkC,CAAC;QACzD,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAC1C,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YACtD,OAAO,CACL,eAAK,SAAS,EAAC,aAAa,aAC1B,cAAK,SAAS,EAAC,gCAAgC,YAAE,KAAK,GAAO,EAC5D,WAAW,IAAI,CACd,cAAK,SAAS,EAAC,kEAAkE,YAC9E,WAAW,GACR,CACP,IACG,CACP,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;YAC5D,OAAO,CACL,cAAK,SAAS,EAAC,gEAAgE,YAC5E,KAAK,IAAI,YAAY,GAClB,CACP,CAAC;QACJ,CAAC;QAED,OAAO,CACL,eAAM,SAAS,EAAC,8CAA8C,YAC3D,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,GACzB,CACR,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAC,wEAAwE,aACrF,cAAK,SAAS,EAAC,qFAAqF,YAClG,gBAAM,SAAS,EAAC,sDAAsD,4BACxD,MAAM,CAAC,MAAM,SACpB,GACH,EACN,cAAK,SAAS,EAAC,mCAAmC,EAAC,KAAK,EAAE,EAAE,SAAS,EAAE,YACpE,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACrB,cAAK,SAAS,EAAC,qCAAqC,sCAA4B,CACjF,CAAC,CAAC,CAAC,CACF,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CACvB,eAEE,SAAS,EAAC,oHAAoH,aAE9H,eAAM,SAAS,EAAC,eAAe,YAC5B,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,GAC1C,EAAC,GAAG,EACX,eAAM,SAAS,EAAC,kCAAkC,YAAE,KAAK,CAAC,IAAI,GAAQ,EAAC,GAAG,EACzE,aAAa,CAAC,KAAK,CAAC,KAPhB,CAAC,CAQF,CACP,CAAC,CACH,GACG,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ interface LiveCountersProps {
2
+ pagesFound: number;
3
+ pageStatesFound: number;
4
+ testRunsCompleted: number;
5
+ findingsFound: number;
6
+ }
7
+ export declare function LiveCounters({ pagesFound, pageStatesFound, testRunsCompleted, findingsFound, }: LiveCountersProps): import("react").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=LiveCounters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LiveCounters.d.ts","sourceRoot":"","sources":["../../../src/components/scanner/LiveCounters.tsx"],"names":[],"mappings":"AAAA,UAAU,iBAAiB;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;CACvB;AA2DD,wBAAgB,YAAY,CAAC,EAC3B,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,GACd,EAAE,iBAAiB,+BAqCnB"}
@@ -0,0 +1,33 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ const COUNTER_ICONS = {
3
+ Pages: (_jsxs("svg", { className: "w-4 h-4", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", children: [_jsx("rect", { x: "3", y: "2", width: "10", height: "12", rx: "1.5" }), _jsx("path", { d: "M5.5 5.5h5M5.5 8h5M5.5 10.5h3" })] })),
4
+ States: (_jsxs("svg", { className: "w-4 h-4", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", children: [_jsx("rect", { x: "2", y: "2", width: "5", height: "5", rx: "1" }), _jsx("rect", { x: "9", y: "2", width: "5", height: "5", rx: "1" }), _jsx("rect", { x: "2", y: "9", width: "5", height: "5", rx: "1" }), _jsx("rect", { x: "9", y: "9", width: "5", height: "5", rx: "1" })] })),
5
+ 'Case Runs': (_jsx("svg", { className: "w-4 h-4", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("path", { d: "M6 3l5 5-5 5" }) })),
6
+ Findings: (_jsxs("svg", { className: "w-4 h-4", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", children: [_jsx("circle", { cx: "8", cy: "8", r: "6" }), _jsx("path", { d: "M8 5v3.5M8 10.5v.5" })] })),
7
+ };
8
+ export function LiveCounters({ pagesFound, pageStatesFound, testRunsCompleted, findingsFound, }) {
9
+ const counters = [
10
+ {
11
+ label: 'Pages',
12
+ value: pagesFound,
13
+ color: 'text-blue-600 dark:text-blue-400',
14
+ },
15
+ {
16
+ label: 'States',
17
+ value: pageStatesFound,
18
+ color: 'text-purple-600 dark:text-purple-400',
19
+ },
20
+ {
21
+ label: 'Case Runs',
22
+ value: testRunsCompleted,
23
+ color: 'text-green-600 dark:text-green-400',
24
+ },
25
+ {
26
+ label: 'Findings',
27
+ value: findingsFound,
28
+ color: 'text-red-600 dark:text-red-400',
29
+ },
30
+ ];
31
+ return (_jsx("div", { className: "grid grid-cols-4 gap-4", children: counters.map(c => (_jsxs("div", { className: "text-center", children: [_jsx("div", { className: `text-2xl font-bold tabular-nums ${c.color}`, children: c.value }), _jsxs("div", { className: "flex items-center justify-center gap-1 text-xs text-gray-500 dark:text-gray-400 mt-0.5", children: [_jsx("span", { className: c.color, children: COUNTER_ICONS[c.label] }), c.label] })] }, c.label))) }));
32
+ }
33
+ //# sourceMappingURL=LiveCounters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LiveCounters.js","sourceRoot":"","sources":["../../../src/components/scanner/LiveCounters.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface PhaseIndicatorProps {
2
+ currentPhase: string;
3
+ }
4
+ export declare function PhaseIndicator({ currentPhase }: PhaseIndicatorProps): import("react").JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=PhaseIndicator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhaseIndicator.d.ts","sourceRoot":"","sources":["../../../src/components/scanner/PhaseIndicator.tsx"],"names":[],"mappings":"AAwDA,UAAU,mBAAmB;IAC3B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,cAAc,CAAC,EAAE,YAAY,EAAE,EAAE,mBAAmB,+BAgCnE"}
@@ -0,0 +1,31 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ const PHASE_ICONS = {
3
+ scanning: (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", children: [_jsx("circle", { cx: "7", cy: "7", r: "5.5" }), _jsx("path", { d: "M7 7L10.5 3.5" }), _jsx("circle", { cx: "7", cy: "7", r: "1" })] })),
4
+ testing: (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("path", { d: "M5 1.5h4" }), _jsx("path", { d: "M5.5 1.5v3.5L3 11a1.5 1.5 0 0 0 1.3 2h5.4a1.5 1.5 0 0 0 1.3-2L8.5 5V1.5" })] })),
5
+ completed: (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("circle", { cx: "7", cy: "7", r: "5.5" }), _jsx("polyline", { points: "4.5,7 6.5,9 9.5,5" })] })),
6
+ };
7
+ const PHASES = [
8
+ { key: 'scanning', label: 'Scanning' },
9
+ { key: 'testing', label: 'Testing' },
10
+ { key: 'completed', label: 'Complete' },
11
+ ];
12
+ export function PhaseIndicator({ currentPhase }) {
13
+ const currentIndex = PHASES.findIndex(p => p.key === currentPhase);
14
+ return (_jsx("div", { className: "flex items-center gap-1", children: PHASES.map((phase, i) => {
15
+ const isActive = i === currentIndex;
16
+ const isComplete = i < currentIndex;
17
+ const baseClass = 'flex items-center gap-1.5';
18
+ const iconColor = isComplete
19
+ ? 'text-green-500'
20
+ : isActive
21
+ ? 'text-blue-500 animate-pulse'
22
+ : 'text-gray-300 dark:text-gray-600';
23
+ const textClass = isActive
24
+ ? 'text-sm font-medium text-blue-600 dark:text-blue-400'
25
+ : isComplete
26
+ ? 'text-sm text-green-600 dark:text-green-400'
27
+ : 'text-sm text-gray-400 dark:text-gray-500';
28
+ return (_jsxs("div", { className: baseClass, children: [_jsx("span", { className: iconColor, children: PHASE_ICONS[phase.key] }), _jsx("span", { className: textClass, children: phase.label }), i < PHASES.length - 1 && (_jsx("div", { className: "w-4 h-px bg-gray-300 dark:bg-gray-600 mx-1" }))] }, phase.key));
29
+ }) }));
30
+ }
31
+ //# sourceMappingURL=PhaseIndicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhaseIndicator.js","sourceRoot":"","sources":["../../../src/components/scanner/PhaseIndicator.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ interface RunSummaryCardProps {
2
+ runId: number;
3
+ status: string;
4
+ phase?: string | null;
5
+ startedAt?: string | null;
6
+ pagesFound?: number;
7
+ issuesFound?: number;
8
+ onClick?: () => void;
9
+ }
10
+ export declare function RunSummaryCard({ runId, status, phase, startedAt, pagesFound, issuesFound, onClick, }: RunSummaryCardProps): import("react").JSX.Element;
11
+ export {};
12
+ //# sourceMappingURL=RunSummaryCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunSummaryCard.d.ts","sourceRoot":"","sources":["../../../src/components/scanner/RunSummaryCard.tsx"],"names":[],"mappings":"AAGA,UAAU,mBAAmB;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,MAAM,EACN,KAAK,EACL,SAAS,EACT,UAAU,EACV,WAAW,EACX,OAAO,GACR,EAAE,mBAAmB,+BAoBrB"}
@@ -0,0 +1,7 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { Card } from '@sudobility/components';
3
+ import { StatusBadge } from './StatusBadge';
4
+ export function RunSummaryCard({ runId, status, phase, startedAt, pagesFound, issuesFound, onClick, }) {
5
+ return (_jsxs(Card, { variant: "bordered", padding: "md", onClick: onClick, className: "hover:border-blue-300 dark:hover:border-blue-600 cursor-pointer transition-colors", children: [_jsxs("div", { className: "flex items-center justify-between mb-2", children: [_jsxs("span", { className: "text-sm font-medium text-gray-900 dark:text-gray-100", children: ["Run #", runId] }), _jsx(StatusBadge, { status: status })] }), phase && _jsxs("div", { className: "text-xs text-gray-500 dark:text-gray-400 mb-1", children: ["Phase: ", phase] }), _jsxs("div", { className: "flex gap-4 text-xs text-gray-500 dark:text-gray-400", children: [startedAt && _jsx("span", { children: new Date(startedAt).toLocaleDateString() }), pagesFound !== undefined && _jsxs("span", { children: [pagesFound, " pages"] }), issuesFound !== undefined && _jsxs("span", { children: [issuesFound, " issues"] })] })] }));
6
+ }
7
+ //# sourceMappingURL=RunSummaryCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunSummaryCard.js","sourceRoot":"","sources":["../../../src/components/scanner/RunSummaryCard.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAY5C,MAAM,UAAU,cAAc,CAAC,EAC7B,KAAK,EACL,MAAM,EACN,KAAK,EACL,SAAS,EACT,UAAU,EACV,WAAW,EACX,OAAO,GACa;IACpB,OAAO,CACL,MAAC,IAAI,IACH,OAAO,EAAC,UAAU,EAClB,OAAO,EAAC,IAAI,EACZ,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,mFAAmF,aAE7F,eAAK,SAAS,EAAC,wCAAwC,aACrD,gBAAM,SAAS,EAAC,sDAAsD,sBAAO,KAAK,IAAQ,EAC1F,KAAC,WAAW,IAAC,MAAM,EAAE,MAAM,GAAI,IAC3B,EACL,KAAK,IAAI,eAAK,SAAS,EAAC,+CAA+C,wBAAS,KAAK,IAAO,EAC7F,eAAK,SAAS,EAAC,qDAAqD,aACjE,SAAS,IAAI,yBAAO,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,GAAQ,EACpE,UAAU,KAAK,SAAS,IAAI,2BAAO,UAAU,cAAc,EAC3D,WAAW,KAAK,SAAS,IAAI,2BAAO,WAAW,eAAe,IAC3D,IACD,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ interface ScanFormProps {
2
+ onSubmit: (url: string, email?: string) => void;
3
+ isSubmitting?: boolean;
4
+ error?: string | null;
5
+ showEmail?: boolean;
6
+ }
7
+ export declare function ScanForm({ onSubmit, isSubmitting, error, showEmail }: ScanFormProps): import("react").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=ScanForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScanForm.d.ts","sourceRoot":"","sources":["../../../src/components/scanner/ScanForm.tsx"],"names":[],"mappings":"AAIA,UAAU,aAAa;IACrB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,SAAgB,EAAE,EAAE,aAAa,+BAiF1F"}
@@ -0,0 +1,31 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { validateEmailDomain } from '@sudobility/testomniac_lib';
4
+ import { ActionButton, Label } from '@sudobility/components';
5
+ export function ScanForm({ onSubmit, isSubmitting, error, showEmail = true }) {
6
+ const [url, setUrl] = useState('');
7
+ const [email, setEmail] = useState('');
8
+ const [validationError, setValidationError] = useState(null);
9
+ function handleSubmit(e) {
10
+ e.preventDefault();
11
+ setValidationError(null);
12
+ if (!url.trim()) {
13
+ setValidationError('URL is required');
14
+ return;
15
+ }
16
+ try {
17
+ new URL(url);
18
+ }
19
+ catch {
20
+ setValidationError('Please enter a valid URL');
21
+ return;
22
+ }
23
+ if (email && !validateEmailDomain(email, url)) {
24
+ setValidationError('Email domain must match the website domain');
25
+ return;
26
+ }
27
+ onSubmit(url.trim(), email.trim() || undefined);
28
+ }
29
+ return (_jsxs("form", { onSubmit: handleSubmit, className: "space-y-4", children: [_jsxs("div", { children: [_jsx(Label, { htmlFor: "scan-url", className: "mb-1 block", children: "Website URL" }), _jsx("input", { id: "scan-url", type: "url", value: url, onChange: e => setUrl(e.target.value), placeholder: "https://example.com", className: "w-full px-4 py-2.5 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-transparent", disabled: isSubmitting })] }), showEmail && (_jsxs("div", { children: [_jsx(Label, { htmlFor: "scan-email", className: "mb-1 block", children: "Email (optional)" }), _jsx("input", { id: "scan-email", type: "email", value: email, onChange: e => setEmail(e.target.value), placeholder: "you@example.com", className: "w-full px-4 py-2.5 rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-transparent", disabled: isSubmitting }), _jsx("p", { className: "mt-1 text-xs text-gray-500 dark:text-gray-400", children: "Must match the website domain if provided" })] })), (validationError || error) && (_jsx("div", { className: "text-sm text-red-600 dark:text-red-400", children: validationError || error })), _jsx(ActionButton, { type: "submit", variant: "primary", className: "w-full", isLoading: isSubmitting, loadingText: "Starting Scan...", children: "Start Scan" })] }));
30
+ }
31
+ //# sourceMappingURL=ScanForm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScanForm.js","sourceRoot":"","sources":["../../../src/components/scanner/ScanForm.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAS7D,MAAM,UAAU,QAAQ,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,EAAiB;IACzF,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAE5E,SAAS,YAAY,CAAC,CAAY;QAChC,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAEzB,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YAChB,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB,CAAC,0BAA0B,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,IAAI,KAAK,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;YAC9C,kBAAkB,CAAC,4CAA4C,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QAED,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,CACL,gBAAM,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAC,WAAW,aACjD,0BACE,KAAC,KAAK,IAAC,OAAO,EAAC,UAAU,EAAC,SAAS,EAAC,YAAY,4BAExC,EACR,gBACE,EAAE,EAAC,UAAU,EACb,IAAI,EAAC,KAAK,EACV,KAAK,EAAE,GAAG,EACV,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACrC,WAAW,EAAC,qBAAqB,EACjC,SAAS,EAAC,gMAAgM,EAC1M,QAAQ,EAAE,YAAY,GACtB,IACE,EAEL,SAAS,IAAI,CACZ,0BACE,KAAC,KAAK,IAAC,OAAO,EAAC,YAAY,EAAC,SAAS,EAAC,YAAY,iCAE1C,EACR,gBACE,EAAE,EAAC,YAAY,EACf,IAAI,EAAC,OAAO,EACZ,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACvC,WAAW,EAAC,iBAAiB,EAC7B,SAAS,EAAC,gMAAgM,EAC1M,QAAQ,EAAE,YAAY,GACtB,EACF,YAAG,SAAS,EAAC,+CAA+C,0DAExD,IACA,CACP,EAEA,CAAC,eAAe,IAAI,KAAK,CAAC,IAAI,CAC7B,cAAK,SAAS,EAAC,wCAAwC,YAAE,eAAe,IAAI,KAAK,GAAO,CACzF,EAED,KAAC,YAAY,IACX,IAAI,EAAC,QAAQ,EACb,OAAO,EAAC,SAAS,EACjB,SAAS,EAAC,QAAQ,EAClB,SAAS,EAAE,YAAY,EACvB,WAAW,EAAC,kBAAkB,2BAGjB,IACV,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { TestRunStreamEvent } from '@sudobility/testomniac_types';
2
+ interface ScanProgressPanelProps {
3
+ pagesFound: number;
4
+ pageStatesFound: number;
5
+ testRunsCompleted: number;
6
+ findingsFound: number;
7
+ error?: string | null;
8
+ events: TestRunStreamEvent[];
9
+ isConnected: boolean;
10
+ isComplete: boolean;
11
+ latestScreenshotUrl?: string | null;
12
+ currentPageUrl?: string | null;
13
+ }
14
+ export declare function ScanProgressPanel({ pagesFound, pageStatesFound, testRunsCompleted, findingsFound, error, events, isConnected, isComplete, latestScreenshotUrl, currentPageUrl, }: ScanProgressPanelProps): import("react").JSX.Element;
15
+ export {};
16
+ //# sourceMappingURL=ScanProgressPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScanProgressPanel.d.ts","sourceRoot":"","sources":["../../../src/components/scanner/ScanProgressPanel.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAIvE,UAAU,sBAAsB;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,wBAAgB,iBAAiB,CAAC,EAChC,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,KAAK,EACL,MAAM,EACN,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,cAAc,GACf,EAAE,sBAAsB,+BAgDxB"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Alert } from '@sudobility/components';
3
+ import { LiveCounters } from './LiveCounters';
4
+ import { EventLog } from './EventLog';
5
+ export function ScanProgressPanel({ pagesFound, pageStatesFound, testRunsCompleted, findingsFound, error, events, isConnected, isComplete, latestScreenshotUrl, currentPageUrl, }) {
6
+ return (_jsxs("div", { className: "space-y-6", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-sm font-medium text-gray-700 dark:text-gray-300", children: isComplete ? 'Discovery run finished' : 'Running discovery...' }), _jsx("div", { className: "flex items-center gap-2", children: isComplete ? (_jsx("span", { className: "text-sm text-green-600 dark:text-green-400 font-medium", children: "Complete" })) : (_jsx("span", { className: `w-2 h-2 rounded-full ${isConnected ? 'bg-green-500' : 'bg-red-500'}` })) })] }), error && _jsx(Alert, { variant: "error", description: error }), _jsx(LiveCounters, { pagesFound: pagesFound, pageStatesFound: pageStatesFound, testRunsCompleted: testRunsCompleted, findingsFound: findingsFound }), (latestScreenshotUrl || currentPageUrl) && (_jsxs("div", { className: "rounded-lg border border-gray-200 dark:border-gray-700 overflow-hidden", children: [_jsxs("div", { className: "bg-gray-50 dark:bg-gray-800 px-3 py-2 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between", children: [_jsx("span", { className: "text-xs font-medium text-gray-500 dark:text-gray-400", children: "Current Page" }), currentPageUrl && (_jsx("span", { className: "text-xs font-mono text-gray-400 dark:text-gray-500 truncate ml-2 max-w-[300px]", children: currentPageUrl }))] }), latestScreenshotUrl && (_jsx("img", { src: latestScreenshotUrl, alt: "Current discovery page", className: "w-full h-auto" }))] })), _jsx(EventLog, { events: events })] }));
7
+ }
8
+ //# sourceMappingURL=ScanProgressPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScanProgressPanel.js","sourceRoot":"","sources":["../../../src/components/scanner/ScanProgressPanel.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAetC,MAAM,UAAU,iBAAiB,CAAC,EAChC,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,KAAK,EACL,MAAM,EACN,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,cAAc,GACS;IACvB,OAAO,CACL,eAAK,SAAS,EAAC,WAAW,aACxB,eAAK,SAAS,EAAC,mCAAmC,aAChD,eAAM,SAAS,EAAC,sDAAsD,YACnE,UAAU,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,sBAAsB,GAC1D,EACP,cAAK,SAAS,EAAC,yBAAyB,YACrC,UAAU,CAAC,CAAC,CAAC,CACZ,eAAM,SAAS,EAAC,wDAAwD,yBAAgB,CACzF,CAAC,CAAC,CAAC,CACF,eACE,SAAS,EAAE,wBAAwB,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,EAAE,GAChF,CACH,GACG,IACF,EAEL,KAAK,IAAI,KAAC,KAAK,IAAC,OAAO,EAAC,OAAO,EAAC,WAAW,EAAE,KAAK,GAAI,EAEvD,KAAC,YAAY,IACX,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,eAAe,EAChC,iBAAiB,EAAE,iBAAiB,EACpC,aAAa,EAAE,aAAa,GAC5B,EAED,CAAC,mBAAmB,IAAI,cAAc,CAAC,IAAI,CAC1C,eAAK,SAAS,EAAC,wEAAwE,aACrF,eAAK,SAAS,EAAC,uHAAuH,aACpI,eAAM,SAAS,EAAC,sDAAsD,6BAE/D,EACN,cAAc,IAAI,CACjB,eAAM,SAAS,EAAC,gFAAgF,YAC7F,cAAc,GACV,CACR,IACG,EACL,mBAAmB,IAAI,CACtB,cAAK,GAAG,EAAE,mBAAmB,EAAE,GAAG,EAAC,wBAAwB,EAAC,SAAS,EAAC,eAAe,GAAG,CACzF,IACG,CACP,EAED,KAAC,QAAQ,IAAC,MAAM,EAAE,MAAM,GAAI,IACxB,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ interface StatusBadgeProps {
2
+ status: string;
3
+ size?: 'sm' | 'md';
4
+ }
5
+ export declare function StatusBadge({ status, size }: StatusBadgeProps): import("react").JSX.Element;
6
+ export {};
7
+ //# sourceMappingURL=StatusBadge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusBadge.d.ts","sourceRoot":"","sources":["../../../src/components/scanner/StatusBadge.tsx"],"names":[],"mappings":"AAEA,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB;AA4PD,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,IAAW,EAAE,EAAE,gBAAgB,+BAcpE"}