@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.
- package/README.md +83 -0
- package/dist/components/bundles/AddToBundleButton.d.ts +8 -0
- package/dist/components/bundles/AddToBundleButton.d.ts.map +1 -0
- package/dist/components/bundles/AddToBundleButton.js +64 -0
- package/dist/components/bundles/AddToBundleButton.js.map +1 -0
- package/dist/components/cells/BundleCell.d.ts +10 -0
- package/dist/components/cells/BundleCell.d.ts.map +1 -0
- package/dist/components/cells/BundleCell.js +8 -0
- package/dist/components/cells/BundleCell.js.map +1 -0
- package/dist/components/cells/InteractionCell.d.ts +17 -0
- package/dist/components/cells/InteractionCell.d.ts.map +1 -0
- package/dist/components/cells/InteractionCell.js +13 -0
- package/dist/components/cells/InteractionCell.js.map +1 -0
- package/dist/components/cells/ListCell.d.ts +29 -0
- package/dist/components/cells/ListCell.d.ts.map +1 -0
- package/dist/components/cells/ListCell.js +19 -0
- package/dist/components/cells/ListCell.js.map +1 -0
- package/dist/components/cells/PersonaCell.d.ts +10 -0
- package/dist/components/cells/PersonaCell.d.ts.map +1 -0
- package/dist/components/cells/PersonaCell.js +7 -0
- package/dist/components/cells/PersonaCell.js.map +1 -0
- package/dist/components/cells/ScaffoldCell.d.ts +12 -0
- package/dist/components/cells/ScaffoldCell.d.ts.map +1 -0
- package/dist/components/cells/ScaffoldCell.js +10 -0
- package/dist/components/cells/ScaffoldCell.js.map +1 -0
- package/dist/components/cells/ScenarioCell.d.ts +12 -0
- package/dist/components/cells/ScenarioCell.d.ts.map +1 -0
- package/dist/components/cells/ScenarioCell.js +8 -0
- package/dist/components/cells/ScenarioCell.js.map +1 -0
- package/dist/components/cells/SurfaceCell.d.ts +14 -0
- package/dist/components/cells/SurfaceCell.d.ts.map +1 -0
- package/dist/components/cells/SurfaceCell.js +23 -0
- package/dist/components/cells/SurfaceCell.js.map +1 -0
- package/dist/components/cells/index.d.ts +9 -0
- package/dist/components/cells/index.d.ts.map +1 -0
- package/dist/components/cells/index.js +9 -0
- package/dist/components/cells/index.js.map +1 -0
- package/dist/components/cells/scaffoldMeta.d.ts +6 -0
- package/dist/components/cells/scaffoldMeta.d.ts.map +1 -0
- package/dist/components/cells/scaffoldMeta.js +47 -0
- package/dist/components/cells/scaffoldMeta.js.map +1 -0
- package/dist/components/dashboard/DashboardSidebar.d.ts +6 -0
- package/dist/components/dashboard/DashboardSidebar.d.ts.map +1 -0
- package/dist/components/dashboard/DashboardSidebar.js +163 -0
- package/dist/components/dashboard/DashboardSidebar.js.map +1 -0
- package/dist/components/data/DataTable.d.ts +16 -0
- package/dist/components/data/DataTable.d.ts.map +1 -0
- package/dist/components/data/DataTable.js +54 -0
- package/dist/components/data/DataTable.js.map +1 -0
- package/dist/components/data/JsonViewer.d.ts +6 -0
- package/dist/components/data/JsonViewer.d.ts.map +1 -0
- package/dist/components/data/JsonViewer.js +5 -0
- package/dist/components/data/JsonViewer.js.map +1 -0
- package/dist/components/data/index.d.ts +3 -0
- package/dist/components/data/index.d.ts.map +1 -0
- package/dist/components/data/index.js +3 -0
- package/dist/components/data/index.js.map +1 -0
- package/dist/components/forms/SelectField.d.ts +22 -0
- package/dist/components/forms/SelectField.d.ts.map +1 -0
- package/dist/components/forms/SelectField.js +14 -0
- package/dist/components/forms/SelectField.js.map +1 -0
- package/dist/components/navigation/BackLink.d.ts +7 -0
- package/dist/components/navigation/BackLink.d.ts.map +1 -0
- package/dist/components/navigation/BackLink.js +6 -0
- package/dist/components/navigation/BackLink.js.map +1 -0
- package/dist/components/pages/PagesListView.d.ts +12 -0
- package/dist/components/pages/PagesListView.d.ts.map +1 -0
- package/dist/components/pages/PagesListView.js +19 -0
- package/dist/components/pages/PagesListView.js.map +1 -0
- package/dist/components/pages/PagesMapView.d.ts +15 -0
- package/dist/components/pages/PagesMapView.d.ts.map +1 -0
- package/dist/components/pages/PagesMapView.js +232 -0
- package/dist/components/pages/PagesMapView.js.map +1 -0
- package/dist/components/scanner/EventLog.d.ts +8 -0
- package/dist/components/scanner/EventLog.d.ts.map +1 -0
- package/dist/components/scanner/EventLog.js +18 -0
- package/dist/components/scanner/EventLog.js.map +1 -0
- package/dist/components/scanner/LiveCounters.d.ts +9 -0
- package/dist/components/scanner/LiveCounters.d.ts.map +1 -0
- package/dist/components/scanner/LiveCounters.js +33 -0
- package/dist/components/scanner/LiveCounters.js.map +1 -0
- package/dist/components/scanner/PhaseIndicator.d.ts +6 -0
- package/dist/components/scanner/PhaseIndicator.d.ts.map +1 -0
- package/dist/components/scanner/PhaseIndicator.js +31 -0
- package/dist/components/scanner/PhaseIndicator.js.map +1 -0
- package/dist/components/scanner/RunSummaryCard.d.ts +12 -0
- package/dist/components/scanner/RunSummaryCard.d.ts.map +1 -0
- package/dist/components/scanner/RunSummaryCard.js +7 -0
- package/dist/components/scanner/RunSummaryCard.js.map +1 -0
- package/dist/components/scanner/ScanForm.d.ts +9 -0
- package/dist/components/scanner/ScanForm.d.ts.map +1 -0
- package/dist/components/scanner/ScanForm.js +31 -0
- package/dist/components/scanner/ScanForm.js.map +1 -0
- package/dist/components/scanner/ScanProgressPanel.d.ts +16 -0
- package/dist/components/scanner/ScanProgressPanel.d.ts.map +1 -0
- package/dist/components/scanner/ScanProgressPanel.js +8 -0
- package/dist/components/scanner/ScanProgressPanel.js.map +1 -0
- package/dist/components/scanner/StatusBadge.d.ts +7 -0
- package/dist/components/scanner/StatusBadge.d.ts.map +1 -0
- package/dist/components/scanner/StatusBadge.js +65 -0
- package/dist/components/scanner/StatusBadge.js.map +1 -0
- package/dist/components/scanner/index.d.ts +8 -0
- package/dist/components/scanner/index.d.ts.map +1 -0
- package/dist/components/scanner/index.js +8 -0
- package/dist/components/scanner/index.js.map +1 -0
- package/dist/components/scenarios/AddScenarioForm.d.ts +14 -0
- package/dist/components/scenarios/AddScenarioForm.d.ts.map +1 -0
- package/dist/components/scenarios/AddScenarioForm.js +43 -0
- package/dist/components/scenarios/AddScenarioForm.js.map +1 -0
- package/dist/components/scripts/ScriptPanel.d.ts +17 -0
- package/dist/components/scripts/ScriptPanel.d.ts.map +1 -0
- package/dist/components/scripts/ScriptPanel.js +32 -0
- package/dist/components/scripts/ScriptPanel.js.map +1 -0
- package/dist/components/states/index.d.ts +19 -0
- package/dist/components/states/index.d.ts.map +1 -0
- package/dist/components/states/index.js +16 -0
- package/dist/components/states/index.js.map +1 -0
- package/dist/config/priorityConfig.d.ts +12 -0
- package/dist/config/priorityConfig.d.ts.map +1 -0
- package/dist/config/priorityConfig.js +39 -0
- package/dist/config/priorityConfig.js.map +1 -0
- package/dist/context/config.d.ts +53 -0
- package/dist/context/config.d.ts.map +1 -0
- package/dist/context/config.js +32 -0
- package/dist/context/config.js.map +1 -0
- package/dist/context/routing.d.ts +42 -0
- package/dist/context/routing.d.ts.map +1 -0
- package/dist/context/routing.js +33 -0
- package/dist/context/routing.js.map +1 -0
- package/dist/hooks/useDashboardEnvironmentContext.d.ts +15 -0
- package/dist/hooks/useDashboardEnvironmentContext.d.ts.map +1 -0
- package/dist/hooks/useDashboardEnvironmentContext.js +89 -0
- package/dist/hooks/useDashboardEnvironmentContext.js.map +1 -0
- package/dist/hooks/useEnvBasePath.d.ts +8 -0
- package/dist/hooks/useEnvBasePath.d.ts.map +1 -0
- package/dist/hooks/useEnvBasePath.js +12 -0
- package/dist/hooks/useEnvBasePath.js.map +1 -0
- package/dist/hooks/useLocalizedNavigate.d.ts +12 -0
- package/dist/hooks/useLocalizedNavigate.d.ts.map +1 -0
- package/dist/hooks/useLocalizedNavigate.js +14 -0
- package/dist/hooks/useLocalizedNavigate.js.map +1 -0
- package/dist/index.d.ts +49 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +66 -0
- package/dist/index.js.map +1 -0
- package/dist/pages/BundleDetailPage.d.ts +2 -0
- package/dist/pages/BundleDetailPage.d.ts.map +1 -0
- package/dist/pages/BundleDetailPage.js +155 -0
- package/dist/pages/BundleDetailPage.js.map +1 -0
- package/dist/pages/BundlesPage.d.ts +2 -0
- package/dist/pages/BundlesPage.d.ts.map +1 -0
- package/dist/pages/BundlesPage.js +61 -0
- package/dist/pages/BundlesPage.js.map +1 -0
- package/dist/pages/DashboardOverview.d.ts +2 -0
- package/dist/pages/DashboardOverview.d.ts.map +1 -0
- package/dist/pages/DashboardOverview.js +179 -0
- package/dist/pages/DashboardOverview.js.map +1 -0
- package/dist/pages/FindingsListPage.d.ts +2 -0
- package/dist/pages/FindingsListPage.d.ts.map +1 -0
- package/dist/pages/FindingsListPage.js +160 -0
- package/dist/pages/FindingsListPage.js.map +1 -0
- package/dist/pages/PageDetailPage.d.ts +2 -0
- package/dist/pages/PageDetailPage.d.ts.map +1 -0
- package/dist/pages/PageDetailPage.js +120 -0
- package/dist/pages/PageDetailPage.js.map +1 -0
- package/dist/pages/PageGraphPage.d.ts +3 -0
- package/dist/pages/PageGraphPage.d.ts.map +1 -0
- package/dist/pages/PageGraphPage.js +72 -0
- package/dist/pages/PageGraphPage.js.map +1 -0
- package/dist/pages/PageStateDetailPage.d.ts +2 -0
- package/dist/pages/PageStateDetailPage.d.ts.map +1 -0
- package/dist/pages/PageStateDetailPage.js +69 -0
- package/dist/pages/PageStateDetailPage.js.map +1 -0
- package/dist/pages/PagesPage.d.ts +2 -0
- package/dist/pages/PagesPage.d.ts.map +1 -0
- package/dist/pages/PagesPage.js +83 -0
- package/dist/pages/PagesPage.js.map +1 -0
- package/dist/pages/PatternsPage.d.ts +2 -0
- package/dist/pages/PatternsPage.d.ts.map +1 -0
- package/dist/pages/PatternsPage.js +102 -0
- package/dist/pages/PatternsPage.js.map +1 -0
- package/dist/pages/PersonasPage.d.ts +2 -0
- package/dist/pages/PersonasPage.d.ts.map +1 -0
- package/dist/pages/PersonasPage.js +151 -0
- package/dist/pages/PersonasPage.js.map +1 -0
- package/dist/pages/RunRedirect.d.ts +2 -0
- package/dist/pages/RunRedirect.d.ts.map +1 -0
- package/dist/pages/RunRedirect.js +25 -0
- package/dist/pages/RunRedirect.js.map +1 -0
- package/dist/pages/RunSurfaceRunDetailPage.d.ts +2 -0
- package/dist/pages/RunSurfaceRunDetailPage.d.ts.map +1 -0
- package/dist/pages/RunSurfaceRunDetailPage.js +38 -0
- package/dist/pages/RunSurfaceRunDetailPage.js.map +1 -0
- package/dist/pages/RunSurfaceRunsPage.d.ts +2 -0
- package/dist/pages/RunSurfaceRunsPage.d.ts.map +1 -0
- package/dist/pages/RunSurfaceRunsPage.js +35 -0
- package/dist/pages/RunSurfaceRunsPage.js.map +1 -0
- package/dist/pages/RunTestInteractionRunDetailPage.d.ts +2 -0
- package/dist/pages/RunTestInteractionRunDetailPage.d.ts.map +1 -0
- package/dist/pages/RunTestInteractionRunDetailPage.js +55 -0
- package/dist/pages/RunTestInteractionRunDetailPage.js.map +1 -0
- package/dist/pages/RunTestInteractionRunsPage.d.ts +2 -0
- package/dist/pages/RunTestInteractionRunsPage.d.ts.map +1 -0
- package/dist/pages/RunTestInteractionRunsPage.js +38 -0
- package/dist/pages/RunTestInteractionRunsPage.js.map +1 -0
- package/dist/pages/RunnerGraphPage.d.ts +3 -0
- package/dist/pages/RunnerGraphPage.d.ts.map +1 -0
- package/dist/pages/RunnerGraphPage.js +86 -0
- package/dist/pages/RunnerGraphPage.js.map +1 -0
- package/dist/pages/ScaffoldDetailPage.d.ts +2 -0
- package/dist/pages/ScaffoldDetailPage.d.ts.map +1 -0
- package/dist/pages/ScaffoldDetailPage.js +56 -0
- package/dist/pages/ScaffoldDetailPage.js.map +1 -0
- package/dist/pages/ScaffoldsPage.d.ts +2 -0
- package/dist/pages/ScaffoldsPage.d.ts.map +1 -0
- package/dist/pages/ScaffoldsPage.js +35 -0
- package/dist/pages/ScaffoldsPage.js.map +1 -0
- package/dist/pages/ScanProgressPage.d.ts +2 -0
- package/dist/pages/ScanProgressPage.d.ts.map +1 -0
- package/dist/pages/ScanProgressPage.js +30 -0
- package/dist/pages/ScanProgressPage.js.map +1 -0
- package/dist/pages/SchedulesPage.d.ts +2 -0
- package/dist/pages/SchedulesPage.d.ts.map +1 -0
- package/dist/pages/SchedulesPage.js +165 -0
- package/dist/pages/SchedulesPage.js.map +1 -0
- package/dist/pages/StartScanPage.d.ts +2 -0
- package/dist/pages/StartScanPage.d.ts.map +1 -0
- package/dist/pages/StartScanPage.js +97 -0
- package/dist/pages/StartScanPage.js.map +1 -0
- package/dist/pages/TestInteractionDetailPage.d.ts +2 -0
- package/dist/pages/TestInteractionDetailPage.d.ts.map +1 -0
- package/dist/pages/TestInteractionDetailPage.js +60 -0
- package/dist/pages/TestInteractionDetailPage.js.map +1 -0
- package/dist/pages/TestInteractionsPage.d.ts +2 -0
- package/dist/pages/TestInteractionsPage.d.ts.map +1 -0
- package/dist/pages/TestInteractionsPage.js +96 -0
- package/dist/pages/TestInteractionsPage.js.map +1 -0
- package/dist/pages/TestRunDetailPage.d.ts +2 -0
- package/dist/pages/TestRunDetailPage.d.ts.map +1 -0
- package/dist/pages/TestRunDetailPage.js +81 -0
- package/dist/pages/TestRunDetailPage.js.map +1 -0
- package/dist/pages/TestRunsListPage.d.ts +2 -0
- package/dist/pages/TestRunsListPage.d.ts.map +1 -0
- package/dist/pages/TestRunsListPage.js +18 -0
- package/dist/pages/TestRunsListPage.js.map +1 -0
- package/dist/pages/TestScenarioDetailPage.d.ts +2 -0
- package/dist/pages/TestScenarioDetailPage.d.ts.map +1 -0
- package/dist/pages/TestScenarioDetailPage.js +101 -0
- package/dist/pages/TestScenarioDetailPage.js.map +1 -0
- package/dist/pages/TestScenariosPage.d.ts +2 -0
- package/dist/pages/TestScenariosPage.d.ts.map +1 -0
- package/dist/pages/TestScenariosPage.js +73 -0
- package/dist/pages/TestScenariosPage.js.map +1 -0
- package/dist/pages/TestSurfaceDetailPage.d.ts +2 -0
- package/dist/pages/TestSurfaceDetailPage.d.ts.map +1 -0
- package/dist/pages/TestSurfaceDetailPage.js +33 -0
- package/dist/pages/TestSurfaceDetailPage.js.map +1 -0
- package/dist/pages/TestSurfacesListPage.d.ts +2 -0
- package/dist/pages/TestSurfacesListPage.d.ts.map +1 -0
- package/dist/pages/TestSurfacesListPage.js +73 -0
- package/dist/pages/TestSurfacesListPage.js.map +1 -0
- package/dist/utils/formatDateTime.d.ts +13 -0
- package/dist/utils/formatDateTime.d.ts.map +1 -0
- package/dist/utils/formatDateTime.js +27 -0
- package/dist/utils/formatDateTime.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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"}
|