@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
package/README.md ADDED
@@ -0,0 +1,83 @@
1
+ # @sudobility/testomniac_ui
2
+
3
+ Shared **dashboard UI** for Testomniac apps — the environment-scoped pages
4
+ (test surfaces, runs, findings, pages, scaffolds, patterns, personas, schedules,
5
+ bundles, scenarios, graphs) and their components, extracted from `testomniac_app`
6
+ so they can be reused in `testomniac_extension` and other hosts.
7
+
8
+ The library is **router-agnostic and i18n-free**: it never imports
9
+ `react-router-dom`, `@sudobility/building_blocks`, or app constants. The host
10
+ supplies routing, the API client, and (optionally) SEO via two context
11
+ providers.
12
+
13
+ ## Install
14
+
15
+ ```bash
16
+ bun add @sudobility/testomniac_ui
17
+ ```
18
+
19
+ Peer deps: `react`, `react-dom`, `@tanstack/react-query`, `@tanstack/react-table`,
20
+ `@xyflow/react`, `@heroicons/react`, and `@sudobility/{components,design,testomniac_client,testomniac_lib,testomniac_types,types}`.
21
+
22
+ ## Host integration
23
+
24
+ The library reads everything host-specific from two contexts:
25
+
26
+ | Concern | Provider | Library hook used by pages |
27
+ | --- | --- | --- |
28
+ | API client + auth + SEO | `TestomniacUiProvider` | `useTestomniacApi()` → `{ networkClient, token, baseUrl }`, `<SEOHead/>` |
29
+ | Routing (params + navigate) | `RoutingProvider` | `useRouteParams()`, `useLocalizedNavigate()`, `useEnvBasePath()`, `<Redirect/>` |
30
+
31
+ `TestomniacUiProvider` is mounted once (it carries the network client + token +
32
+ API URL + optional SEO component). `RoutingProvider` is mounted per rendered
33
+ page/route, fed by whatever routing the host uses.
34
+
35
+ ### Web app (react-router)
36
+
37
+ ```tsx
38
+ // Bridge (mounted once, inside the auth provider so useApi resolves)
39
+ <TestomniacUiProvider
40
+ networkClient={networkClient}
41
+ token={token ?? ''}
42
+ apiUrl={API_URL}
43
+ SeoHead={SEOHead} // your Helmet-based component
44
+ >
45
+ <Routes>…</Routes>
46
+ </TestomniacUiProvider>
47
+
48
+ // Per-route adapter (feeds react-router params + navigation into the lib)
49
+ function UiRoute({ children }) {
50
+ const params = useParams();
51
+ const { pathname } = useLocation();
52
+ const navigate = useNavigate();
53
+ return (
54
+ <RoutingProvider
55
+ params={params}
56
+ pathname={pathname}
57
+ currentLanguage={lang}
58
+ navigate={(p, o) => navigate(`/${lang}${p}`, o)}
59
+ >
60
+ {children}
61
+ </RoutingProvider>
62
+ );
63
+ }
64
+
65
+ <Route path="environments/:envId/test-surfaces"
66
+ element={<UiRoute><TestSurfacesListPage /></UiRoute>} />
67
+ ```
68
+
69
+ ### Extension (no router)
70
+
71
+ Provide `RoutingProvider` with state-based params + a `navigate` that updates
72
+ your view state (mount pages under a `MemoryRouter`-free setup; the library
73
+ needs no router). Omit `SeoHead` so `<SEOHead/>` renders nothing.
74
+
75
+ ## Build
76
+
77
+ ```bash
78
+ bun run build # tsc -> dist/ (ESM + .d.ts)
79
+ bun run verify # typecheck + lint + format:check
80
+ ```
81
+
82
+ No bundler, no Tailwind emission — the host app's Tailwind picks up the class
83
+ names (add `node_modules/@sudobility/testomniac_ui` to its `content` globs).
@@ -0,0 +1,8 @@
1
+ type ItemType = 'surface' | 'interaction' | 'scenario';
2
+ interface AddToBundleButtonProps {
3
+ itemType: ItemType;
4
+ itemId: number;
5
+ }
6
+ export declare function AddToBundleButton({ itemType, itemId }: AddToBundleButtonProps): import("react").JSX.Element | null;
7
+ export {};
8
+ //# sourceMappingURL=AddToBundleButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddToBundleButton.d.ts","sourceRoot":"","sources":["../../../src/components/bundles/AddToBundleButton.tsx"],"names":[],"mappings":"AAOA,KAAK,QAAQ,GAAG,SAAS,GAAG,aAAa,GAAG,UAAU,CAAC;AAEvD,UAAU,sBAAsB;IAC9B,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,sBAAsB,sCA4F7E"}
@@ -0,0 +1,64 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useRef, useEffect, useMemo } from 'react';
3
+ import { useMutation } from '@tanstack/react-query';
4
+ import { Button } from '@sudobility/components';
5
+ import { useRunnerTestSurfaceBundles, TestomniacClient } from '@sudobility/testomniac_client';
6
+ import { useTestomniacApi } from '../../context/config';
7
+ import { useDashboardEnvironmentContext } from '../../hooks/useDashboardEnvironmentContext';
8
+ export function AddToBundleButton({ itemType, itemId }) {
9
+ const { networkClient, token, primaryRunner } = useDashboardEnvironmentContext();
10
+ const { baseUrl } = useTestomniacApi();
11
+ const runnerId = primaryRunner?.id ?? 0;
12
+ const [open, setOpen] = useState(false);
13
+ const [feedback, setFeedback] = useState(null);
14
+ const menuRef = useRef(null);
15
+ const { bundles } = useRunnerTestSurfaceBundles({
16
+ networkClient,
17
+ baseUrl,
18
+ runnerId,
19
+ token,
20
+ enabled: !!token && !!primaryRunner,
21
+ });
22
+ const nonDiscoveryBundles = useMemo(() => bundles.filter(b => b.title !== 'Discovery'), [bundles]);
23
+ const client = useMemo(() => new TestomniacClient({ baseUrl, networkClient }), [networkClient, baseUrl]);
24
+ const mutation = useMutation({
25
+ mutationFn: async (bundleId) => {
26
+ if (itemType === 'surface') {
27
+ return client.addSurfaceToBundle(runnerId, bundleId, itemId, token);
28
+ }
29
+ else if (itemType === 'interaction') {
30
+ return client.addInteractionToBundle(runnerId, bundleId, itemId, token);
31
+ }
32
+ else {
33
+ return client.addScenarioToBundle(runnerId, bundleId, itemId, token);
34
+ }
35
+ },
36
+ });
37
+ useEffect(() => {
38
+ if (!open)
39
+ return;
40
+ function handleClickOutside(e) {
41
+ if (menuRef.current && !menuRef.current.contains(e.target)) {
42
+ setOpen(false);
43
+ }
44
+ }
45
+ document.addEventListener('mousedown', handleClickOutside);
46
+ return () => document.removeEventListener('mousedown', handleClickOutside);
47
+ }, [open]);
48
+ const handleSelect = async (bundleId, bundleTitle) => {
49
+ setOpen(false);
50
+ setFeedback(null);
51
+ try {
52
+ await mutation.mutateAsync(bundleId);
53
+ setFeedback(`Added to "${bundleTitle}"`);
54
+ setTimeout(() => setFeedback(null), 3000);
55
+ }
56
+ catch (err) {
57
+ setFeedback(err instanceof Error ? err.message : 'Failed to add to bundle');
58
+ }
59
+ };
60
+ if (!primaryRunner || nonDiscoveryBundles.length === 0)
61
+ return null;
62
+ return (_jsxs("div", { className: "relative", ref: menuRef, children: [_jsx(Button, { type: "button", variant: "outline", onClick: () => setOpen(prev => !prev), disabled: mutation.isPending, children: mutation.isPending ? 'Adding...' : 'Add to Bundle' }), feedback && (_jsx("span", { className: "ml-2 text-xs text-green-600 dark:text-green-400", children: feedback })), open && (_jsx("div", { className: "absolute right-0 top-full z-10 mt-1 w-56 rounded-lg border border-gray-200 bg-white py-1 shadow-lg dark:border-gray-700 dark:bg-gray-800", children: nonDiscoveryBundles.map(bundle => (_jsx("button", { onClick: () => handleSelect(bundle.id, bundle.title), className: "w-full px-3 py-2 text-left text-sm text-gray-700 hover:bg-gray-50 dark:text-gray-300 dark:hover:bg-gray-700", children: bundle.title }, bundle.id))) }))] }));
63
+ }
64
+ //# sourceMappingURL=AddToBundleButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddToBundleButton.js","sourceRoot":"","sources":["../../../src/components/bundles/AddToBundleButton.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { TestSurfaceBundleResponse } from '@sudobility/testomniac_types';
3
+ export interface BundleCellProps {
4
+ bundle: TestSurfaceBundleResponse;
5
+ onClick?: () => void;
6
+ actions?: ReactNode;
7
+ }
8
+ /** Canonical cell for a TestSurfaceBundle — title (with an "auto" tag for the Discovery bundle) and description. */
9
+ export declare function BundleCell({ bundle, onClick, actions }: BundleCellProps): import("react").JSX.Element;
10
+ //# sourceMappingURL=BundleCell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BundleCell.d.ts","sourceRoot":"","sources":["../../../src/components/cells/BundleCell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAG9E,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,yBAAyB,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAED,oHAAoH;AACpH,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,eAAe,+BAoBvE"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ListCell, ChevronRight } from './ListCell';
3
+ /** Canonical cell for a TestSurfaceBundle — title (with an "auto" tag for the Discovery bundle) and description. */
4
+ export function BundleCell({ bundle, onClick, actions }) {
5
+ const isAuto = bundle.title === 'Discovery';
6
+ return (_jsx(ListCell, { title: _jsxs("span", { className: "inline-flex items-center", children: [bundle.title, isAuto && (_jsx("span", { className: "ml-2 rounded bg-gray-100 px-1.5 py-0.5 text-[11px] text-gray-500 dark:bg-gray-700 dark:text-gray-400", children: "auto" }))] }), subtitle: bundle.description || undefined, trailing: onClick ? _jsx(ChevronRight, {}) : undefined, actions: actions, onClick: onClick }));
7
+ }
8
+ //# sourceMappingURL=BundleCell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BundleCell.js","sourceRoot":"","sources":["../../../src/components/cells/BundleCell.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAQpD,oHAAoH;AACpH,MAAM,UAAU,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAmB;IACtE,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,KAAK,WAAW,CAAC;IAC5C,OAAO,CACL,KAAC,QAAQ,IACP,KAAK,EACH,gBAAM,SAAS,EAAC,0BAA0B,aACvC,MAAM,CAAC,KAAK,EACZ,MAAM,IAAI,CACT,eAAM,SAAS,EAAC,sGAAsG,qBAE/G,CACR,IACI,EAET,QAAQ,EAAE,MAAM,CAAC,WAAW,IAAI,SAAS,EACzC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,KAAC,YAAY,KAAG,CAAC,CAAC,CAAC,SAAS,EAChD,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GAChB,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { TestInteractionResponse } from '@sudobility/testomniac_types';
3
+ export interface InteractionCellProps {
4
+ interaction: TestInteractionResponse;
5
+ onClick?: () => void;
6
+ actions?: ReactNode;
7
+ /** Optional leading content (e.g. a step number inside a sequence). */
8
+ leading?: ReactNode;
9
+ }
10
+ /**
11
+ * Canonical cell for a TestInteraction — title over its starting path, with the
12
+ * test-type badge trailing. Matches the Test Interactions screen so the same
13
+ * interaction looks identical everywhere it appears (sequences, bundles,
14
+ * scaffolds, page detail, …).
15
+ */
16
+ export declare function InteractionCell({ interaction, onClick, actions, leading }: InteractionCellProps): import("react").JSX.Element;
17
+ //# sourceMappingURL=InteractionCell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InteractionCell.d.ts","sourceRoot":"","sources":["../../../src/components/cells/InteractionCell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAI5E,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,uBAAuB,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,uEAAuE;IACvE,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,oBAAoB,+BAW/F"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { StatusBadge } from '../scanner/StatusBadge';
3
+ import { ListCell } from './ListCell';
4
+ /**
5
+ * Canonical cell for a TestInteraction — title over its starting path, with the
6
+ * test-type badge trailing. Matches the Test Interactions screen so the same
7
+ * interaction looks identical everywhere it appears (sequences, bundles,
8
+ * scaffolds, page detail, …).
9
+ */
10
+ export function InteractionCell({ interaction, onClick, actions, leading }) {
11
+ return (_jsx(ListCell, { leading: leading, title: interaction.title, subtitle: interaction.startingPath || '/', trailing: _jsx(StatusBadge, { status: interaction.testType }), actions: actions, onClick: onClick }));
12
+ }
13
+ //# sourceMappingURL=InteractionCell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InteractionCell.js","sourceRoot":"","sources":["../../../src/components/cells/InteractionCell.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAUtC;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAwB;IAC9F,OAAO,CACL,KAAC,QAAQ,IACP,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,WAAW,CAAC,KAAK,EACxB,QAAQ,EAAE,WAAW,CAAC,YAAY,IAAI,GAAG,EACzC,QAAQ,EAAE,KAAC,WAAW,IAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,GAAI,EACvD,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GAChB,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface ListCellProps {
3
+ /** Optional leading icon / indicator. */
4
+ leading?: ReactNode;
5
+ /** Primary line (object name). */
6
+ title: ReactNode;
7
+ /** Secondary line (path, description, etc.). */
8
+ subtitle?: ReactNode;
9
+ /** Non-interactive trailing content — badges, status, counts. */
10
+ trailing?: ReactNode;
11
+ /** Interactive trailing content — buttons (Edit/Delete/Remove/menu). */
12
+ actions?: ReactNode;
13
+ /** When provided, the title/subtitle area becomes a clickable button. */
14
+ onClick?: () => void;
15
+ className?: string;
16
+ }
17
+ /**
18
+ * The canonical list/cell layout shared by every object cell.
19
+ *
20
+ * Renders a bordered row with an optional leading icon, a title over an
21
+ * optional subtitle, and a trailing area for badges (`trailing`) and buttons
22
+ * (`actions`). When `onClick` is set, only the title/subtitle area is the
23
+ * clickable target, so `actions` stay independently clickable without needing
24
+ * to stop event propagation.
25
+ */
26
+ export declare function ListCell({ leading, title, subtitle, trailing, actions, onClick, className, }: ListCellProps): import("react").JSX.Element;
27
+ /** Small right-chevron used as a trailing affordance on navigable cells. */
28
+ export declare function ChevronRight(): import("react").JSX.Element;
29
+ //# sourceMappingURL=ListCell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListCell.d.ts","sourceRoot":"","sources":["../../../src/components/cells/ListCell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,kCAAkC;IAClC,KAAK,EAAE,SAAS,CAAC;IACjB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,wEAAwE;IACxE,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,EACvB,OAAO,EACP,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,OAAO,EACP,SAAc,GACf,EAAE,aAAa,+BA0Cf;AAED,4EAA4E;AAC5E,wBAAgB,YAAY,gCAY3B"}
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * The canonical list/cell layout shared by every object cell.
4
+ *
5
+ * Renders a bordered row with an optional leading icon, a title over an
6
+ * optional subtitle, and a trailing area for badges (`trailing`) and buttons
7
+ * (`actions`). When `onClick` is set, only the title/subtitle area is the
8
+ * clickable target, so `actions` stay independently clickable without needing
9
+ * to stop event propagation.
10
+ */
11
+ export function ListCell({ leading, title, subtitle, trailing, actions, onClick, className = '', }) {
12
+ const main = (_jsxs(_Fragment, { children: [leading != null && (_jsx("span", { className: "flex shrink-0 items-center text-gray-400 dark:text-gray-500", children: leading })), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "truncate text-sm font-medium text-gray-900 dark:text-gray-100", children: title }), subtitle != null && subtitle !== '' && (_jsx("div", { className: "mt-0.5 truncate text-xs text-gray-500 dark:text-gray-400", children: subtitle }))] })] }));
13
+ return (_jsxs("div", { className: `flex items-center justify-between gap-3 rounded-lg border border-gray-200 bg-white px-4 py-3 dark:border-gray-700 dark:bg-gray-800 ${onClick ? 'transition-colors hover:bg-gray-50 dark:hover:bg-gray-700/50' : ''} ${className}`, children: [onClick ? (_jsx("button", { type: "button", onClick: onClick, className: "flex min-w-0 flex-1 items-center gap-3 text-left", children: main })) : (_jsx("div", { className: "flex min-w-0 flex-1 items-center gap-3", children: main })), (trailing != null || actions != null) && (_jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [trailing, actions] }))] }));
14
+ }
15
+ /** Small right-chevron used as a trailing affordance on navigable cells. */
16
+ export function ChevronRight() {
17
+ return (_jsx("svg", { className: "h-4 w-4 text-gray-400 dark:text-gray-500", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M9 5l7 7-7 7" }) }));
18
+ }
19
+ //# sourceMappingURL=ListCell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListCell.js","sourceRoot":"","sources":["../../../src/components/cells/ListCell.tsx"],"names":[],"mappings":";AAkBA;;;;;;;;GAQG;AACH,MAAM,UAAU,QAAQ,CAAC,EACvB,OAAO,EACP,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,OAAO,EACP,SAAS,GAAG,EAAE,GACA;IACd,MAAM,IAAI,GAAG,CACX,8BACG,OAAO,IAAI,IAAI,IAAI,CAClB,eAAM,SAAS,EAAC,6DAA6D,YAC1E,OAAO,GACH,CACR,EACD,eAAK,SAAS,EAAC,gBAAgB,aAC7B,cAAK,SAAS,EAAC,+DAA+D,YAAE,KAAK,GAAO,EAC3F,QAAQ,IAAI,IAAI,IAAI,QAAQ,KAAK,EAAE,IAAI,CACtC,cAAK,SAAS,EAAC,0DAA0D,YAAE,QAAQ,GAAO,CAC3F,IACG,IACL,CACJ,CAAC;IAEF,OAAO,CACL,eACE,SAAS,EAAE,sIACT,OAAO,CAAC,CAAC,CAAC,8DAA8D,CAAC,CAAC,CAAC,EAC7E,IAAI,SAAS,EAAE,aAEd,OAAO,CAAC,CAAC,CAAC,CACT,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,kDAAkD,YAE3D,IAAI,GACE,CACV,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,wCAAwC,YAAE,IAAI,GAAO,CACrE,EACA,CAAC,QAAQ,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,CAAC,IAAI,CACxC,eAAK,SAAS,EAAC,kCAAkC,aAC9C,QAAQ,EACR,OAAO,IACJ,CACP,IACG,CACP,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,YAAY;IAC1B,OAAO,CACL,cACE,SAAS,EAAC,0CAA0C,EACpD,IAAI,EAAC,MAAM,EACX,OAAO,EAAC,WAAW,EACnB,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,GAAG,YAEf,eAAM,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,CAAC,EAAC,cAAc,GAAG,GAClE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { PersonaResponse } from '@sudobility/testomniac_types';
3
+ export interface PersonaCellProps {
4
+ persona: PersonaResponse;
5
+ onClick?: () => void;
6
+ actions?: ReactNode;
7
+ }
8
+ /** Canonical cell for a Persona — title over description, with action buttons trailing. */
9
+ export declare function PersonaCell({ persona, onClick, actions }: PersonaCellProps): import("react").JSX.Element;
10
+ //# sourceMappingURL=PersonaCell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PersonaCell.d.ts","sourceRoot":"","sources":["../../../src/components/cells/PersonaCell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAGpE,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,eAAe,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAED,2FAA2F;AAC3F,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,gBAAgB,+BAS1E"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { ListCell } from './ListCell';
3
+ /** Canonical cell for a Persona — title over description, with action buttons trailing. */
4
+ export function PersonaCell({ persona, onClick, actions }) {
5
+ return (_jsx(ListCell, { title: persona.title, subtitle: persona.description || undefined, actions: actions, onClick: onClick }));
6
+ }
7
+ //# sourceMappingURL=PersonaCell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PersonaCell.js","sourceRoot":"","sources":["../../../src/components/cells/PersonaCell.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAQtC,2FAA2F;AAC3F,MAAM,UAAU,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAoB;IACzE,OAAO,CACL,KAAC,QAAQ,IACP,KAAK,EAAE,OAAO,CAAC,KAAK,EACpB,QAAQ,EAAE,OAAO,CAAC,WAAW,IAAI,SAAS,EAC1C,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GAChB,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { ScaffoldResponse } from '@sudobility/testomniac_types';
3
+ export interface ScaffoldCellProps {
4
+ scaffold: ScaffoldResponse;
5
+ /** Number of pages using this scaffold (rendered as the subtitle). */
6
+ pageCount?: number;
7
+ onClick?: () => void;
8
+ actions?: ReactNode;
9
+ }
10
+ /** Canonical cell for a Scaffold — type icon + label, page count, navigable chevron. */
11
+ export declare function ScaffoldCell({ scaffold, pageCount, onClick, actions }: ScaffoldCellProps): import("react").JSX.Element;
12
+ //# sourceMappingURL=ScaffoldCell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScaffoldCell.d.ts","sourceRoot":"","sources":["../../../src/components/cells/ScaffoldCell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAIrE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAED,wFAAwF;AACxF,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,iBAAiB,+BAexF"}
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { ListCell, ChevronRight } from './ListCell';
3
+ import { SCAFFOLD_ICONS, SCAFFOLD_LABELS } from './scaffoldMeta';
4
+ /** Canonical cell for a Scaffold — type icon + label, page count, navigable chevron. */
5
+ export function ScaffoldCell({ scaffold, pageCount, onClick, actions }) {
6
+ return (_jsx(ListCell, { leading: SCAFFOLD_ICONS[scaffold.type], title: SCAFFOLD_LABELS[scaffold.type] ?? scaffold.type, subtitle: pageCount != null && pageCount > 0
7
+ ? `${pageCount} ${pageCount === 1 ? 'page' : 'pages'}`
8
+ : undefined, trailing: onClick ? _jsx(ChevronRight, {}) : undefined, actions: actions, onClick: onClick }));
9
+ }
10
+ //# sourceMappingURL=ScaffoldCell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScaffoldCell.js","sourceRoot":"","sources":["../../../src/components/cells/ScaffoldCell.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAUjE,wFAAwF;AACxF,MAAM,UAAU,YAAY,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAqB;IACvF,OAAO,CACL,KAAC,QAAQ,IACP,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,EACtC,KAAK,EAAE,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,EACtD,QAAQ,EACN,SAAS,IAAI,IAAI,IAAI,SAAS,GAAG,CAAC;YAChC,CAAC,CAAC,GAAG,SAAS,IAAI,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE;YACtD,CAAC,CAAC,SAAS,EAEf,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,KAAC,YAAY,KAAG,CAAC,CAAC,CAAC,SAAS,EAChD,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GAChB,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { TestScenarioResponse } from '@sudobility/testomniac_types';
3
+ export interface ScenarioCellProps {
4
+ scenario: TestScenarioResponse;
5
+ onClick?: () => void;
6
+ actions?: ReactNode;
7
+ /** Overrides the default trailing (device badge) — e.g. to prepend a persona label. */
8
+ trailing?: ReactNode;
9
+ }
10
+ /** Canonical cell for a TestScenario — title over its starting path, device badge trailing. */
11
+ export declare function ScenarioCell({ scenario, onClick, actions, trailing }: ScenarioCellProps): import("react").JSX.Element;
12
+ //# sourceMappingURL=ScenarioCell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScenarioCell.d.ts","sourceRoot":"","sources":["../../../src/components/cells/ScenarioCell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAIzE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,uFAAuF;IACvF,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,+FAA+F;AAC/F,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,iBAAiB,+BAUvF"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { StatusBadge } from '../scanner/StatusBadge';
3
+ import { ListCell } from './ListCell';
4
+ /** Canonical cell for a TestScenario — title over its starting path, device badge trailing. */
5
+ export function ScenarioCell({ scenario, onClick, actions, trailing }) {
6
+ return (_jsx(ListCell, { title: scenario.title, subtitle: scenario.startingPath || '/', trailing: trailing ?? _jsx(StatusBadge, { status: scenario.sizeClass }), actions: actions, onClick: onClick }));
7
+ }
8
+ //# sourceMappingURL=ScenarioCell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScenarioCell.js","sourceRoot":"","sources":["../../../src/components/cells/ScenarioCell.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAUtC,+FAA+F;AAC/F,MAAM,UAAU,YAAY,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAqB;IACtF,OAAO,CACL,KAAC,QAAQ,IACP,KAAK,EAAE,QAAQ,CAAC,KAAK,EACrB,QAAQ,EAAE,QAAQ,CAAC,YAAY,IAAI,GAAG,EACtC,QAAQ,EAAE,QAAQ,IAAI,KAAC,WAAW,IAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,GAAI,EACjE,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GAChB,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { TestSurfaceResponse } from '@sudobility/testomniac_types';
3
+ /** Surface priority is a 0–10 scale (higher = more critical). */
4
+ export declare function SurfacePriorityBadge({ priority }: {
5
+ priority: number;
6
+ }): import("react").JSX.Element;
7
+ export interface SurfaceCellProps {
8
+ surface: TestSurfaceResponse;
9
+ onClick?: () => void;
10
+ actions?: ReactNode;
11
+ }
12
+ /** Canonical cell for a TestSurface — folder icon, title, description/path, priority + device badges. */
13
+ export declare function SurfaceCell({ surface, onClick, actions }: SurfaceCellProps): import("react").JSX.Element;
14
+ //# sourceMappingURL=SurfaceCell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SurfaceCell.d.ts","sourceRoot":"","sources":["../../../src/components/cells/SurfaceCell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAsBxE,iEAAiE;AACjE,wBAAgB,oBAAoB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,+BAmBtE;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAED,yGAAyG;AACzG,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,gBAAgB,+BAgB1E"}
@@ -0,0 +1,23 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { StatusBadge } from '../scanner/StatusBadge';
3
+ import { ListCell } from './ListCell';
4
+ function FolderIcon() {
5
+ return (_jsx("svg", { className: "h-5 w-5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 1.5, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M2.25 12.75V12A2.25 2.25 0 014.5 9.75h15A2.25 2.25 0 0121.75 12v.75m-8.69-6.44l-2.12-2.12a1.5 1.5 0 00-1.06-.44H4.5A2.25 2.25 0 002.25 6v12a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9a2.25 2.25 0 00-2.25-2.25h-5.379a1.5 1.5 0 01-1.06-.44z" }) }));
6
+ }
7
+ /** Surface priority is a 0–10 scale (higher = more critical). */
8
+ export function SurfacePriorityBadge({ priority }) {
9
+ const label = priority >= 8 ? 'critical' : priority >= 5 ? 'high' : priority >= 3 ? 'medium' : 'low';
10
+ const colors = priority >= 8
11
+ ? 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300'
12
+ : priority >= 5
13
+ ? 'bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-300'
14
+ : priority >= 3
15
+ ? 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-300'
16
+ : 'bg-gray-100 text-gray-800 dark:bg-gray-900/30 dark:text-gray-300';
17
+ return (_jsxs("span", { className: `inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${colors}`, children: ["P", priority, " ", label] }));
18
+ }
19
+ /** Canonical cell for a TestSurface — folder icon, title, description/path, priority + device badges. */
20
+ export function SurfaceCell({ surface, onClick, actions }) {
21
+ return (_jsx(ListCell, { leading: _jsx(FolderIcon, {}), title: surface.title, subtitle: surface.description || surface.startingPath || '/', trailing: _jsxs(_Fragment, { children: [_jsx(SurfacePriorityBadge, { priority: surface.priority }), _jsx(StatusBadge, { status: surface.sizeClass })] }), actions: actions, onClick: onClick }));
22
+ }
23
+ //# sourceMappingURL=SurfaceCell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SurfaceCell.js","sourceRoot":"","sources":["../../../src/components/cells/SurfaceCell.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,SAAS,UAAU;IACjB,OAAO,CACL,cACE,SAAS,EAAC,SAAS,EACnB,IAAI,EAAC,MAAM,EACX,OAAO,EAAC,WAAW,EACnB,MAAM,EAAC,cAAc,EACrB,WAAW,EAAE,GAAG,YAEhB,eACE,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,CAAC,EAAC,wPAAwP,GAC1P,GACE,CACP,CAAC;AACJ,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,oBAAoB,CAAC,EAAE,QAAQ,EAAwB;IACrE,MAAM,KAAK,GACT,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;IACzF,MAAM,MAAM,GACV,QAAQ,IAAI,CAAC;QACX,CAAC,CAAC,8DAA8D;QAChE,CAAC,CAAC,QAAQ,IAAI,CAAC;YACb,CAAC,CAAC,0EAA0E;YAC5E,CAAC,CAAC,QAAQ,IAAI,CAAC;gBACb,CAAC,CAAC,0EAA0E;gBAC5E,CAAC,CAAC,kEAAkE,CAAC;IAE7E,OAAO,CACL,gBACE,SAAS,EAAE,yEAAyE,MAAM,EAAE,kBAE1F,QAAQ,OAAG,KAAK,IACb,CACR,CAAC;AACJ,CAAC;AAQD,yGAAyG;AACzG,MAAM,UAAU,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAoB;IACzE,OAAO,CACL,KAAC,QAAQ,IACP,OAAO,EAAE,KAAC,UAAU,KAAG,EACvB,KAAK,EAAE,OAAO,CAAC,KAAK,EACpB,QAAQ,EAAE,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,YAAY,IAAI,GAAG,EAC5D,QAAQ,EACN,8BACE,KAAC,oBAAoB,IAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,GAAI,EACpD,KAAC,WAAW,IAAC,MAAM,EAAE,OAAO,CAAC,SAAS,GAAI,IACzC,EAEL,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GAChB,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ export { ListCell, ChevronRight, type ListCellProps } from './ListCell';
2
+ export { InteractionCell, type InteractionCellProps } from './InteractionCell';
3
+ export { SurfaceCell, SurfacePriorityBadge, type SurfaceCellProps } from './SurfaceCell';
4
+ export { ScenarioCell, type ScenarioCellProps } from './ScenarioCell';
5
+ export { ScaffoldCell, type ScaffoldCellProps } from './ScaffoldCell';
6
+ export { BundleCell, type BundleCellProps } from './BundleCell';
7
+ export { PersonaCell, type PersonaCellProps } from './PersonaCell';
8
+ export { SCAFFOLD_ICONS, SCAFFOLD_LABELS } from './scaffoldMeta';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/cells/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACzF,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export { ListCell, ChevronRight } from './ListCell';
2
+ export { InteractionCell } from './InteractionCell';
3
+ export { SurfaceCell, SurfacePriorityBadge } from './SurfaceCell';
4
+ export { ScenarioCell } from './ScenarioCell';
5
+ export { ScaffoldCell } from './ScaffoldCell';
6
+ export { BundleCell } from './BundleCell';
7
+ export { PersonaCell } from './PersonaCell';
8
+ export { SCAFFOLD_ICONS, SCAFFOLD_LABELS } from './scaffoldMeta';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/cells/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAsB,MAAM,YAAY,CAAC;AACxE,OAAO,EAAE,eAAe,EAA6B,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAyB,MAAM,eAAe,CAAC;AACzF,OAAO,EAAE,YAAY,EAA0B,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,YAAY,EAA0B,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAwB,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,WAAW,EAAyB,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type ReactNode } from 'react';
2
+ /** Human-readable labels for scaffold types. Shared across scaffold cells/pages. */
3
+ export declare const SCAFFOLD_LABELS: Record<string, string>;
4
+ /** Inline icons for scaffold types. Shared across scaffold cells/pages. */
5
+ export declare const SCAFFOLD_ICONS: Record<string, ReactNode>;
6
+ //# sourceMappingURL=scaffoldMeta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffoldMeta.d.ts","sourceRoot":"","sources":["../../../src/components/cells/scaffoldMeta.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,oFAAoF;AACpF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAgBlD,CAAC;AAYF,2EAA2E;AAC3E,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CA4GpD,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /** Human-readable labels for scaffold types. Shared across scaffold cells/pages. */
3
+ export const SCAFFOLD_LABELS = {
4
+ topMenu: 'Top navigation',
5
+ footer: 'Footer',
6
+ breadcrumb: 'Breadcrumb',
7
+ leftMenu: 'Left navigation',
8
+ hamburgerMenu: 'Hamburger menu',
9
+ rightSidebar: 'Right sidebar',
10
+ searchBar: 'Search bar',
11
+ userMenu: 'User menu',
12
+ cookieBanner: 'Cookie banner',
13
+ chatWidget: 'Chat widget',
14
+ socialLinks: 'Social links',
15
+ skipNav: 'Skip navigation',
16
+ languageSwitcher: 'Language switcher',
17
+ announcementBar: 'Announcement bar',
18
+ backToTop: 'Back to top',
19
+ };
20
+ const iconProps = {
21
+ width: 14,
22
+ height: 14,
23
+ viewBox: '0 0 14 14',
24
+ fill: 'none',
25
+ stroke: 'currentColor',
26
+ strokeWidth: 1.5,
27
+ strokeLinecap: 'round',
28
+ };
29
+ /** Inline icons for scaffold types. Shared across scaffold cells/pages. */
30
+ export const SCAFFOLD_ICONS = {
31
+ topMenu: (_jsxs("svg", { ...iconProps, children: [_jsx("rect", { x: "1", y: "1", width: "12", height: "3", rx: "0.5" }), _jsx("line", { x1: "3", y1: "2.5", x2: "5", y2: "2.5" }), _jsx("line", { x1: "6.5", y1: "2.5", x2: "8.5", y2: "2.5" }), _jsx("line", { x1: "10", y1: "2.5", x2: "11", y2: "2.5" })] })),
32
+ footer: (_jsxs("svg", { ...iconProps, children: [_jsx("rect", { x: "1", y: "10", width: "12", height: "3", rx: "0.5" }), _jsx("line", { x1: "3", y1: "11.5", x2: "7", y2: "11.5" })] })),
33
+ breadcrumb: (_jsxs("svg", { ...iconProps, strokeLinejoin: "round", children: [_jsx("polyline", { points: "2,5 4.5,7 2,9" }), _jsx("polyline", { points: "5.5,5 8,7 5.5,9" }), _jsx("polyline", { points: "9,5 11.5,7 9,9" })] })),
34
+ leftMenu: (_jsxs("svg", { ...iconProps, children: [_jsx("rect", { x: "1", y: "1", width: "12", height: "12", rx: "1" }), _jsx("line", { x1: "5", y1: "1", x2: "5", y2: "13" }), _jsx("line", { x1: "2.5", y1: "4", x2: "4", y2: "4" }), _jsx("line", { x1: "2.5", y1: "6.5", x2: "4", y2: "6.5" }), _jsx("line", { x1: "2.5", y1: "9", x2: "4", y2: "9" })] })),
35
+ hamburgerMenu: (_jsxs("svg", { ...iconProps, children: [_jsx("line", { x1: "2", y1: "3.5", x2: "12", y2: "3.5" }), _jsx("line", { x1: "2", y1: "7", x2: "12", y2: "7" }), _jsx("line", { x1: "2", y1: "10.5", x2: "12", y2: "10.5" })] })),
36
+ rightSidebar: (_jsxs("svg", { ...iconProps, children: [_jsx("rect", { x: "1", y: "1", width: "12", height: "12", rx: "1" }), _jsx("line", { x1: "9", y1: "1", x2: "9", y2: "13" }), _jsx("line", { x1: "10", y1: "4", x2: "11.5", y2: "4" }), _jsx("line", { x1: "10", y1: "6.5", x2: "11.5", y2: "6.5" })] })),
37
+ searchBar: (_jsxs("svg", { ...iconProps, children: [_jsx("circle", { cx: "6", cy: "6", r: "4" }), _jsx("line", { x1: "9", y1: "9", x2: "12.5", y2: "12.5" })] })),
38
+ userMenu: (_jsxs("svg", { ...iconProps, children: [_jsx("circle", { cx: "7", cy: "5", r: "2.5" }), _jsx("path", { d: "M2.5 13c0-2.5 2-4.5 4.5-4.5s4.5 2 4.5 4.5" })] })),
39
+ cookieBanner: (_jsxs("svg", { ...iconProps, children: [_jsx("path", { d: "M2 3.5C2 2.67 2.67 2 3.5 2h7c.83 0 1.5.67 1.5 1.5v7c0 .83-.67 1.5-1.5 1.5h-7C2.67 12 2 11.33 2 10.5v-7z" }), _jsx("path", { d: "M5 5.5v0", strokeWidth: "2" }), _jsx("path", { d: "M7 8v0", strokeWidth: "2" }), _jsx("path", { d: "M9.5 5v0", strokeWidth: "2" })] })),
40
+ chatWidget: (_jsx("svg", { ...iconProps, strokeLinejoin: "round", children: _jsx("path", { d: "M2 2.5C2 1.67 2.67 1 3.5 1h7c.83 0 1.5.67 1.5 1.5v5c0 .83-.67 1.5-1.5 1.5H6l-2.5 2.5V9H3.5C2.67 9 2 8.33 2 7.5v-5z" }) })),
41
+ socialLinks: (_jsxs("svg", { ...iconProps, children: [_jsx("circle", { cx: "3", cy: "7", r: "1.5" }), _jsx("circle", { cx: "11", cy: "3.5", r: "1.5" }), _jsx("circle", { cx: "11", cy: "10.5", r: "1.5" }), _jsx("line", { x1: "4.3", y1: "6.3", x2: "9.7", y2: "4.2" }), _jsx("line", { x1: "4.3", y1: "7.7", x2: "9.7", y2: "9.8" })] })),
42
+ skipNav: (_jsxs("svg", { ...iconProps, strokeLinejoin: "round", children: [_jsx("polyline", { points: "2,3 7,7 2,11" }), _jsx("line", { x1: "7", y1: "3", x2: "7", y2: "11" }), _jsx("line", { x1: "10", y1: "3", x2: "10", y2: "11" }), _jsx("polyline", { points: "10,5 12.5,7 10,9" })] })),
43
+ languageSwitcher: (_jsxs("svg", { ...iconProps, children: [_jsx("circle", { cx: "7", cy: "7", r: "5.5" }), _jsx("ellipse", { cx: "7", cy: "7", rx: "2.5", ry: "5.5" }), _jsx("line", { x1: "1.5", y1: "7", x2: "12.5", y2: "7" })] })),
44
+ announcementBar: (_jsxs("svg", { ...iconProps, strokeLinejoin: "round", children: [_jsx("path", { d: "M11 2L4 5H2.5C1.67 5 1 5.67 1 6.5v0c0 .83.67 1.5 1.5 1.5H4l7 3V2z" }), _jsx("line", { x1: "13", y1: "5", x2: "13", y2: "8" }), _jsx("line", { x1: "4", y1: "8", x2: "4.5", y2: "12" })] })),
45
+ backToTop: (_jsxs("svg", { ...iconProps, strokeLinejoin: "round", children: [_jsx("line", { x1: "7", y1: "12", x2: "7", y2: "3" }), _jsx("polyline", { points: "3.5,6 7,2.5 10.5,6" })] })),
46
+ };
47
+ //# sourceMappingURL=scaffoldMeta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffoldMeta.js","sourceRoot":"","sources":["../../../src/components/cells/scaffoldMeta.tsx"],"names":[],"mappings":";AAEA,oFAAoF;AACpF,MAAM,CAAC,MAAM,eAAe,GAA2B;IACrD,OAAO,EAAE,gBAAgB;IACzB,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,YAAY;IACxB,QAAQ,EAAE,iBAAiB;IAC3B,aAAa,EAAE,gBAAgB;IAC/B,YAAY,EAAE,eAAe;IAC7B,SAAS,EAAE,YAAY;IACvB,QAAQ,EAAE,WAAW;IACrB,YAAY,EAAE,eAAe;IAC7B,UAAU,EAAE,aAAa;IACzB,WAAW,EAAE,cAAc;IAC3B,OAAO,EAAE,iBAAiB;IAC1B,gBAAgB,EAAE,mBAAmB;IACrC,eAAe,EAAE,kBAAkB;IACnC,SAAS,EAAE,aAAa;CACzB,CAAC;AAEF,MAAM,SAAS,GAAG;IAChB,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,WAAW;IACpB,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,cAAc;IACtB,WAAW,EAAE,GAAG;IAChB,aAAa,EAAE,OAAgB;CAChC,CAAC;AAEF,2EAA2E;AAC3E,MAAM,CAAC,MAAM,cAAc,GAA8B;IACvD,OAAO,EAAE,CACP,kBAAS,SAAS,aAChB,eAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,GAAG,EAAC,EAAE,EAAC,KAAK,GAAG,EACnD,eAAM,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,KAAK,GAAG,EACxC,eAAM,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,GAAG,EAC5C,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,KAAK,GAAG,IACtC,CACP;IACD,MAAM,EAAE,CACN,kBAAS,SAAS,aAChB,eAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,GAAG,EAAC,EAAE,EAAC,KAAK,GAAG,EACpD,eAAM,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,MAAM,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,MAAM,GAAG,IACtC,CACP;IACD,UAAU,EAAE,CACV,kBAAS,SAAS,EAAE,cAAc,EAAC,OAAO,aACxC,mBAAU,MAAM,EAAC,eAAe,GAAG,EACnC,mBAAU,MAAM,EAAC,iBAAiB,GAAG,EACrC,mBAAU,MAAM,EAAC,gBAAgB,GAAG,IAChC,CACP;IACD,QAAQ,EAAE,CACR,kBAAS,SAAS,aAChB,eAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,GAAG,EAClD,eAAM,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,IAAI,GAAG,EACrC,eAAM,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,GAAG,EACtC,eAAM,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,KAAK,GAAG,EAC1C,eAAM,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,GAAG,IAClC,CACP;IACD,aAAa,EAAE,CACb,kBAAS,SAAS,aAChB,eAAM,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,KAAK,GAAG,EACzC,eAAM,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,GAAG,EACrC,eAAM,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,MAAM,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,MAAM,GAAG,IACvC,CACP;IACD,YAAY,EAAE,CACZ,kBAAS,SAAS,aAChB,eAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,GAAG,EAClD,eAAM,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,IAAI,GAAG,EACrC,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,MAAM,EAAC,EAAE,EAAC,GAAG,GAAG,EACxC,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,MAAM,EAAC,EAAE,EAAC,KAAK,GAAG,IACxC,CACP;IACD,SAAS,EAAE,CACT,kBAAS,SAAS,aAChB,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,GAAG,EAC9B,eAAM,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,MAAM,EAAC,EAAE,EAAC,MAAM,GAAG,IACtC,CACP;IACD,QAAQ,EAAE,CACR,kBAAS,SAAS,aAChB,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,KAAK,GAAG,EAChC,eAAM,CAAC,EAAC,2CAA2C,GAAG,IAClD,CACP;IACD,YAAY,EAAE,CACZ,kBAAS,SAAS,aAChB,eAAM,CAAC,EAAC,yGAAyG,GAAG,EACpH,eAAM,CAAC,EAAC,UAAU,EAAC,WAAW,EAAC,GAAG,GAAG,EACrC,eAAM,CAAC,EAAC,QAAQ,EAAC,WAAW,EAAC,GAAG,GAAG,EACnC,eAAM,CAAC,EAAC,UAAU,EAAC,WAAW,EAAC,GAAG,GAAG,IACjC,CACP;IACD,UAAU,EAAE,CACV,iBAAS,SAAS,EAAE,cAAc,EAAC,OAAO,YACxC,eAAM,CAAC,EAAC,oHAAoH,GAAG,GAC3H,CACP;IACD,WAAW,EAAE,CACX,kBAAS,SAAS,aAChB,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,KAAK,GAAG,EAChC,iBAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,EAAC,KAAK,GAAG,EACnC,iBAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,MAAM,EAAC,CAAC,EAAC,KAAK,GAAG,EACpC,eAAM,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,GAAG,EAC5C,eAAM,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,GAAG,IACxC,CACP;IACD,OAAO,EAAE,CACP,kBAAS,SAAS,EAAE,cAAc,EAAC,OAAO,aACxC,mBAAU,MAAM,EAAC,cAAc,GAAG,EAClC,eAAM,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,IAAI,GAAG,EACrC,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,GAAG,EACvC,mBAAU,MAAM,EAAC,kBAAkB,GAAG,IAClC,CACP;IACD,gBAAgB,EAAE,CAChB,kBAAS,SAAS,aAChB,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,KAAK,GAAG,EAChC,kBAAS,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,GAAG,EAC3C,eAAM,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,MAAM,EAAC,EAAE,EAAC,GAAG,GAAG,IACrC,CACP;IACD,eAAe,EAAE,CACf,kBAAS,SAAS,EAAE,cAAc,EAAC,OAAO,aACxC,eAAM,CAAC,EAAC,mEAAmE,GAAG,EAC9E,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,GAAG,EACtC,eAAM,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,IAAI,GAAG,IACnC,CACP;IACD,SAAS,EAAE,CACT,kBAAS,SAAS,EAAE,cAAc,EAAC,OAAO,aACxC,eAAM,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,GAAG,EACrC,mBAAU,MAAM,EAAC,oBAAoB,GAAG,IACpC,CACP;CACF,CAAC"}
@@ -0,0 +1,6 @@
1
+ interface DashboardSidebarProps {
2
+ entitySlug: string;
3
+ }
4
+ export declare function DashboardSidebar({ entitySlug }: DashboardSidebarProps): import("react").JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=DashboardSidebar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DashboardSidebar.d.ts","sourceRoot":"","sources":["../../../src/components/dashboard/DashboardSidebar.tsx"],"names":[],"mappings":"AAaA,UAAU,qBAAqB;IAC7B,UAAU,EAAE,MAAM,CAAC;CACpB;AAgLD,wBAAgB,gBAAgB,CAAC,EAAE,UAAU,EAAE,EAAE,qBAAqB,+BA2LrE"}