@sudobility/sider_ui 0.0.3
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 +8 -0
- package/dist/components/dashboard/DashboardSidebar.d.ts +2 -0
- package/dist/components/dashboard/DashboardSidebar.d.ts.map +1 -0
- package/dist/components/dashboard/DashboardSidebar.js +27 -0
- package/dist/components/dashboard/DashboardSidebar.js.map +1 -0
- package/dist/components/data/DataTable.d.ts +12 -0
- package/dist/components/data/DataTable.d.ts.map +1 -0
- package/dist/components/data/DataTable.js +5 -0
- package/dist/components/data/DataTable.js.map +1 -0
- package/dist/components/data/JsonViewer.d.ts +5 -0
- package/dist/components/data/JsonViewer.d.ts.map +1 -0
- package/dist/components/data/JsonViewer.js +9 -0
- package/dist/components/data/JsonViewer.js.map +1 -0
- package/dist/components/data/secretSegments.d.ts +5 -0
- package/dist/components/data/secretSegments.d.ts.map +1 -0
- package/dist/components/data/secretSegments.js +15 -0
- package/dist/components/data/secretSegments.js.map +1 -0
- package/dist/components/states/index.d.ts +14 -0
- package/dist/components/states/index.d.ts.map +1 -0
- package/dist/components/states/index.js +25 -0
- package/dist/components/states/index.js.map +1 -0
- package/dist/context/config.d.ts +29 -0
- package/dist/context/config.d.ts.map +1 -0
- package/dist/context/config.js +22 -0
- package/dist/context/config.js.map +1 -0
- package/dist/context/routing.d.ts +35 -0
- package/dist/context/routing.d.ts.map +1 -0
- package/dist/context/routing.js +27 -0
- package/dist/context/routing.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/pages/CaptureBatchDetailPage.d.ts +2 -0
- package/dist/pages/CaptureBatchDetailPage.d.ts.map +1 -0
- package/dist/pages/CaptureBatchDetailPage.js +24 -0
- package/dist/pages/CaptureBatchDetailPage.js.map +1 -0
- package/dist/pages/CaptureBatchesPage.d.ts +2 -0
- package/dist/pages/CaptureBatchesPage.d.ts.map +1 -0
- package/dist/pages/CaptureBatchesPage.js +26 -0
- package/dist/pages/CaptureBatchesPage.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 +43 -0
- package/dist/pages/DashboardOverview.js.map +1 -0
- package/dist/pages/MyToolsPage.d.ts +2 -0
- package/dist/pages/MyToolsPage.d.ts.map +1 -0
- package/dist/pages/MyToolsPage.js +30 -0
- package/dist/pages/MyToolsPage.js.map +1 -0
- package/dist/pages/SiteDetailPage.d.ts +2 -0
- package/dist/pages/SiteDetailPage.d.ts.map +1 -0
- package/dist/pages/SiteDetailPage.js +54 -0
- package/dist/pages/SiteDetailPage.js.map +1 -0
- package/dist/pages/SitesPage.d.ts +2 -0
- package/dist/pages/SitesPage.d.ts.map +1 -0
- package/dist/pages/SitesPage.js +26 -0
- package/dist/pages/SitesPage.js.map +1 -0
- package/dist/pages/ToolDetailPage.d.ts +2 -0
- package/dist/pages/ToolDetailPage.d.ts.map +1 -0
- package/dist/pages/ToolDetailPage.js +20 -0
- package/dist/pages/ToolDetailPage.js.map +1 -0
- package/package.json +50 -0
package/README.md
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# @sudobility/sider_ui
|
|
2
|
+
|
|
3
|
+
Shared Sider dashboard UI. Host apps must:
|
|
4
|
+
|
|
5
|
+
1. Wrap pages in `<SiderUiProvider networkClient token apiUrl>` and a
|
|
6
|
+
`<RoutingProvider>` fed by their router (see sider_app / sider_extension).
|
|
7
|
+
2. Add this package to Tailwind content globs:
|
|
8
|
+
`'./node_modules/@sudobility/sider_ui/dist/**/*.js'`
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardSidebar.d.ts","sourceRoot":"","sources":["../../../src/components/dashboard/DashboardSidebar.tsx"],"names":[],"mappings":"AAOA,wBAAgB,gBAAgB,gCA8C/B"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useRoutes, useSiderRouting } from '../../context/routing';
|
|
3
|
+
export function DashboardSidebar() {
|
|
4
|
+
const routes = useRoutes();
|
|
5
|
+
const { pathname, navigate } = useSiderRouting();
|
|
6
|
+
const sections = [
|
|
7
|
+
{
|
|
8
|
+
title: 'My data',
|
|
9
|
+
items: [
|
|
10
|
+
{ label: 'Overview', path: routes.home() },
|
|
11
|
+
{ label: 'Capture batches', path: routes.captureBatches() },
|
|
12
|
+
{ label: 'My tools', path: routes.myTools() },
|
|
13
|
+
],
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
title: 'Registry',
|
|
17
|
+
items: [{ label: 'Sites', path: routes.sites() }],
|
|
18
|
+
},
|
|
19
|
+
];
|
|
20
|
+
return (_jsx("nav", { className: "flex h-full w-56 flex-col gap-4 border-r border-border bg-card p-3", children: sections.map(section => (_jsxs("div", { children: [_jsx("p", { className: "px-2 pb-1 text-xs font-semibold uppercase text-muted-foreground", children: section.title }), section.items.map(item => {
|
|
21
|
+
const active = pathname.endsWith(item.path);
|
|
22
|
+
return (_jsx("button", { onClick: () => navigate(item.path), className: `block w-full rounded-md px-2 py-1.5 text-left text-sm ${active
|
|
23
|
+
? 'bg-primary text-primary-foreground'
|
|
24
|
+
: 'text-foreground hover:bg-muted'}`, children: item.label }, item.path));
|
|
25
|
+
})] }, section.title))) }));
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=DashboardSidebar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardSidebar.js","sourceRoot":"","sources":["../../../src/components/dashboard/DashboardSidebar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAOnE,MAAM,UAAU,gBAAgB;IAC9B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,eAAe,EAAE,CAAC;IAEjD,MAAM,QAAQ,GAA0C;QACtD;YACE,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE;gBACL,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE;gBAC1C,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,CAAC,cAAc,EAAE,EAAE;gBAC3D,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE;aAC9C;SACF;QACD;YACE,KAAK,EAAE,UAAU;YACjB,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;SAClD;KACF,CAAC;IAEF,OAAO,CACL,cAAK,SAAS,EAAC,oEAAoE,YAChF,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CACvB,0BACE,YAAG,SAAS,EAAC,iEAAiE,YAC3E,OAAO,CAAC,KAAK,GACZ,EACH,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;oBACxB,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC5C,OAAO,CACL,iBAEE,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAClC,SAAS,EAAE,yDACT,MAAM;4BACJ,CAAC,CAAC,oCAAoC;4BACtC,CAAC,CAAC,gCACN,EAAE,YAED,IAAI,CAAC,KAAK,IARN,IAAI,CAAC,IAAI,CASP,CACV,CAAC;gBACJ,CAAC,CAAC,KAnBM,OAAO,CAAC,KAAK,CAoBjB,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export interface Column<T> {
|
|
3
|
+
key: string;
|
|
4
|
+
header: string;
|
|
5
|
+
render?: (row: T) => ReactNode;
|
|
6
|
+
}
|
|
7
|
+
export declare function DataTable<T extends Record<string, unknown>>({ columns, rows, onRowClick, }: {
|
|
8
|
+
columns: Column<T>[];
|
|
9
|
+
rows: T[];
|
|
10
|
+
onRowClick?: (row: T) => void;
|
|
11
|
+
}): import("react").JSX.Element;
|
|
12
|
+
//# sourceMappingURL=DataTable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../src/components/data/DataTable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,MAAM,CAAC,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,SAAS,CAAC;CAChC;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC3D,OAAO,EACP,IAAI,EACJ,UAAU,GACX,EAAE;IACD,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACrB,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC;CAC/B,+BA+BA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
export function DataTable({ columns, rows, onRowClick, }) {
|
|
3
|
+
return (_jsx("div", { className: "overflow-x-auto rounded-lg border border-border", children: _jsxs("table", { className: "w-full text-left text-sm", children: [_jsx("thead", { className: "bg-muted/50 text-xs uppercase text-muted-foreground", children: _jsx("tr", { children: columns.map(c => (_jsx("th", { className: "px-3 py-2 font-medium", children: c.header }, c.key))) }) }), _jsx("tbody", { children: rows.map((row, i) => (_jsx("tr", { onClick: onRowClick ? () => onRowClick(row) : undefined, className: `border-t border-border ${onRowClick ? 'cursor-pointer hover:bg-muted/40' : ''}`, children: columns.map(c => (_jsx("td", { className: "px-3 py-2 text-foreground", children: c.render ? c.render(row) : String(row[c.key] ?? '') }, c.key))) }, i))) })] }) }));
|
|
4
|
+
}
|
|
5
|
+
//# sourceMappingURL=DataTable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataTable.js","sourceRoot":"","sources":["../../../src/components/data/DataTable.tsx"],"names":[],"mappings":";AAQA,MAAM,UAAU,SAAS,CAAoC,EAC3D,OAAO,EACP,IAAI,EACJ,UAAU,GAKX;IACC,OAAO,CACL,cAAK,SAAS,EAAC,iDAAiD,YAC9D,iBAAO,SAAS,EAAC,0BAA0B,aACzC,gBAAO,SAAS,EAAC,qDAAqD,YACpE,uBACG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAChB,aAAgB,SAAS,EAAC,uBAAuB,YAC9C,CAAC,CAAC,MAAM,IADF,CAAC,CAAC,GAAG,CAET,CACN,CAAC,GACC,GACC,EACR,0BACG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CACpB,aAEE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,EACvD,SAAS,EAAE,0BAA0B,UAAU,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,EAAE,EAAE,YAE1F,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAChB,aAAgB,SAAS,EAAC,2BAA2B,YAClD,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAD7C,CAAC,CAAC,GAAG,CAET,CACN,CAAC,IARG,CAAC,CASH,CACN,CAAC,GACI,IACF,GACJ,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JsonViewer.d.ts","sourceRoot":"","sources":["../../../src/components/data/JsonViewer.tsx"],"names":[],"mappings":"AAEA,qEAAqE;AACrE,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,+BAgBvD"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { splitSecretSegments } from './secretSegments';
|
|
3
|
+
/** Pretty-prints JSON with {{secret:…}} placeholders highlighted. */
|
|
4
|
+
export function JsonViewer({ value }) {
|
|
5
|
+
const text = typeof value === 'string' ? value : JSON.stringify(value, null, 2);
|
|
6
|
+
const segments = splitSecretSegments(text ?? 'null');
|
|
7
|
+
return (_jsx("pre", { className: "max-h-96 overflow-auto rounded-lg border border-border bg-muted/30 p-3 text-xs leading-5 text-foreground", children: segments.map((s, i) => s.isSecret ? (_jsx("mark", { className: "rounded bg-warning/25 px-0.5 font-semibold text-warning", children: s.text }, i)) : (_jsx("span", { children: s.text }, i))) }));
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=JsonViewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JsonViewer.js","sourceRoot":"","sources":["../../../src/components/data/JsonViewer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,qEAAqE;AACrE,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAsB;IACtD,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAChF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC;IACrD,OAAO,CACL,cAAK,SAAS,EAAC,0GAA0G,YACtH,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACrB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CACX,eAAc,SAAS,EAAC,yDAAyD,YAC9E,CAAC,CAAC,IAAI,IADE,CAAC,CAEL,CACR,CAAC,CAAC,CAAC,CACF,yBAAe,CAAC,CAAC,IAAI,IAAV,CAAC,CAAiB,CAC9B,CACF,GACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secretSegments.d.ts","sourceRoot":"","sources":["../../../src/components/data/secretSegments.ts"],"names":[],"mappings":"AAEA,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,EAAE,CAUvF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const SECRET_RE = /\{\{secret:[^}]+\}\}/g;
|
|
2
|
+
export function splitSecretSegments(text) {
|
|
3
|
+
const out = [];
|
|
4
|
+
let last = 0;
|
|
5
|
+
for (const m of text.matchAll(SECRET_RE)) {
|
|
6
|
+
if (m.index > last)
|
|
7
|
+
out.push({ text: text.slice(last, m.index), isSecret: false });
|
|
8
|
+
out.push({ text: m[0], isSecret: true });
|
|
9
|
+
last = m.index + m[0].length;
|
|
10
|
+
}
|
|
11
|
+
if (last < text.length || out.length === 0)
|
|
12
|
+
out.push({ text: text.slice(last), isSecret: false });
|
|
13
|
+
return out;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=secretSegments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secretSegments.js","sourceRoot":"","sources":["../../../src/components/data/secretSegments.ts"],"names":[],"mappings":"AAAA,MAAM,SAAS,GAAG,uBAAuB,CAAC;AAE1C,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,GAAG,GAA0C,EAAE,CAAC;IACtD,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,CAAC,KAAM,GAAG,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACpF,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,IAAI,GAAG,CAAC,CAAC,KAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAChC,CAAC;IACD,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAClG,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare function LoadingState({ label }: {
|
|
2
|
+
label?: string;
|
|
3
|
+
}): import("react").JSX.Element;
|
|
4
|
+
export declare function EmptyState({ title, hint }: {
|
|
5
|
+
title: string;
|
|
6
|
+
hint?: string;
|
|
7
|
+
}): import("react").JSX.Element;
|
|
8
|
+
export declare function ErrorState({ error }: {
|
|
9
|
+
error: unknown;
|
|
10
|
+
}): import("react").JSX.Element;
|
|
11
|
+
export declare function StatusBadge({ status }: {
|
|
12
|
+
status: string;
|
|
13
|
+
}): import("react").JSX.Element;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/states/index.tsx"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,EAAE,KAAkB,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,+BAEtE;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,+BAO3E;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,+BAOvD;AAYD,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,+BAOzD"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
export function LoadingState({ label = 'Loading…' }) {
|
|
3
|
+
return _jsx("div", { className: "p-6 text-sm text-muted-foreground", children: label });
|
|
4
|
+
}
|
|
5
|
+
export function EmptyState({ title, hint }) {
|
|
6
|
+
return (_jsxs("div", { className: "rounded-lg border border-border bg-card p-8 text-center", children: [_jsx("p", { className: "text-sm font-medium text-foreground", children: title }), hint ? _jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: hint }) : null] }));
|
|
7
|
+
}
|
|
8
|
+
export function ErrorState({ error }) {
|
|
9
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
10
|
+
return (_jsx("div", { className: "rounded-lg border border-destructive/40 bg-destructive/10 p-4 text-sm text-destructive", children: msg }));
|
|
11
|
+
}
|
|
12
|
+
const STATUS_STYLES = {
|
|
13
|
+
trusted: 'bg-success/15 text-success',
|
|
14
|
+
provisional: 'bg-warning/15 text-warning',
|
|
15
|
+
flagged: 'bg-destructive/15 text-destructive',
|
|
16
|
+
uploaded: 'bg-info/15 text-info',
|
|
17
|
+
distilled: 'bg-success/15 text-success',
|
|
18
|
+
buffering: 'bg-muted text-muted-foreground',
|
|
19
|
+
discarded: 'bg-muted text-muted-foreground',
|
|
20
|
+
};
|
|
21
|
+
export function StatusBadge({ status }) {
|
|
22
|
+
const style = STATUS_STYLES[status] ?? 'bg-muted text-muted-foreground';
|
|
23
|
+
return (_jsx("span", { className: `inline-block rounded-full px-2 py-0.5 text-xs font-medium ${style}`, children: status }));
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/states/index.tsx"],"names":[],"mappings":";AAAA,MAAM,UAAU,YAAY,CAAC,EAAE,KAAK,GAAG,UAAU,EAAsB;IACrE,OAAO,cAAK,SAAS,EAAC,mCAAmC,YAAE,KAAK,GAAO,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,EAAoC;IAC1E,OAAO,CACL,eAAK,SAAS,EAAC,yDAAyD,aACtE,YAAG,SAAS,EAAC,qCAAqC,YAAE,KAAK,GAAK,EAC7D,IAAI,CAAC,CAAC,CAAC,YAAG,SAAS,EAAC,oCAAoC,YAAE,IAAI,GAAK,CAAC,CAAC,CAAC,IAAI,IACvE,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAsB;IACtD,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnE,OAAO,CACL,cAAK,SAAS,EAAC,wFAAwF,YACpG,GAAG,GACA,CACP,CAAC;AACJ,CAAC;AAED,MAAM,aAAa,GAA2B;IAC5C,OAAO,EAAE,4BAA4B;IACrC,WAAW,EAAE,4BAA4B;IACzC,OAAO,EAAE,oCAAoC;IAC7C,QAAQ,EAAE,sBAAsB;IAChC,SAAS,EAAE,4BAA4B;IACvC,SAAS,EAAE,gCAAgC;IAC3C,SAAS,EAAE,gCAAgC;CAC5C,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,EAAE,MAAM,EAAsB;IACxD,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,gCAAgC,CAAC;IACxE,OAAO,CACL,eAAM,SAAS,EAAE,6DAA6D,KAAK,EAAE,YAClF,MAAM,GACF,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type ComponentType, type ReactNode } from 'react';
|
|
2
|
+
import type { NetworkClient } from '@sudobility/types';
|
|
3
|
+
export interface SEOHeadProps {
|
|
4
|
+
title: string;
|
|
5
|
+
description: string;
|
|
6
|
+
keywords?: string[];
|
|
7
|
+
ogType?: 'website' | 'article';
|
|
8
|
+
noIndex?: boolean;
|
|
9
|
+
structuredData?: Record<string, unknown> | Record<string, unknown>[];
|
|
10
|
+
}
|
|
11
|
+
export interface SiderUiConfig {
|
|
12
|
+
networkClient: NetworkClient;
|
|
13
|
+
/** Firebase ID token; empty string when unauthenticated. */
|
|
14
|
+
token: string;
|
|
15
|
+
/** API base URL, e.g. `http://localhost:8090`. */
|
|
16
|
+
apiUrl: string;
|
|
17
|
+
SeoHead?: ComponentType<SEOHeadProps>;
|
|
18
|
+
}
|
|
19
|
+
export declare function SiderUiProvider({ children, networkClient, token, apiUrl, SeoHead, }: SiderUiConfig & {
|
|
20
|
+
children: ReactNode;
|
|
21
|
+
}): import("react").JSX.Element;
|
|
22
|
+
export declare function useSiderUiConfig(): SiderUiConfig;
|
|
23
|
+
export declare function useSiderApi(): {
|
|
24
|
+
networkClient: NetworkClient;
|
|
25
|
+
token: string;
|
|
26
|
+
baseUrl: string;
|
|
27
|
+
};
|
|
28
|
+
export declare function SEOHead(props: SEOHeadProps): import("react").JSX.Element | null;
|
|
29
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/context/config.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC/F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;CACtE;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,aAAa,CAAC;IAC7B,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;CACvC;AAID,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,aAAa,EACb,KAAK,EACL,MAAM,EACN,OAAO,GACR,EAAE,aAAa,GAAG;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAMzC;AAED,wBAAgB,gBAAgB,IAAI,aAAa,CAIhD;AAED,wBAAgB,WAAW,IAAI;IAAE,aAAa,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAG9F;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,sCAG1C"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useMemo } from 'react';
|
|
3
|
+
const SiderUiConfigContext = createContext(null);
|
|
4
|
+
export function SiderUiProvider({ children, networkClient, token, apiUrl, SeoHead, }) {
|
|
5
|
+
const value = useMemo(() => ({ networkClient, token, apiUrl, SeoHead }), [networkClient, token, apiUrl, SeoHead]);
|
|
6
|
+
return _jsx(SiderUiConfigContext.Provider, { value: value, children: children });
|
|
7
|
+
}
|
|
8
|
+
export function useSiderUiConfig() {
|
|
9
|
+
const ctx = useContext(SiderUiConfigContext);
|
|
10
|
+
if (!ctx)
|
|
11
|
+
throw new Error('Sider UI: components must be rendered inside <SiderUiProvider>');
|
|
12
|
+
return ctx;
|
|
13
|
+
}
|
|
14
|
+
export function useSiderApi() {
|
|
15
|
+
const { networkClient, token, apiUrl } = useSiderUiConfig();
|
|
16
|
+
return { networkClient, token, baseUrl: apiUrl };
|
|
17
|
+
}
|
|
18
|
+
export function SEOHead(props) {
|
|
19
|
+
const { SeoHead } = useSiderUiConfig();
|
|
20
|
+
return SeoHead ? _jsx(SeoHead, { ...props }) : null;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/context/config.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAsC,MAAM,OAAO,CAAC;AAqB/F,MAAM,oBAAoB,GAAG,aAAa,CAAuB,IAAI,CAAC,CAAC;AAEvE,MAAM,UAAU,eAAe,CAAC,EAC9B,QAAQ,EACR,aAAa,EACb,KAAK,EACL,MAAM,EACN,OAAO,GACiC;IACxC,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EACjD,CAAC,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CACxC,CAAC;IACF,OAAO,KAAC,oBAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAAiC,CAAC;AACjG,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,GAAG,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;IAC7C,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IAC5F,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAC5D,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAmB;IACzC,MAAM,EAAE,OAAO,EAAE,GAAG,gBAAgB,EAAE,CAAC;IACvC,OAAO,OAAO,CAAC,CAAC,CAAC,KAAC,OAAO,OAAK,KAAK,GAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export interface NavigateOptions {
|
|
3
|
+
replace?: boolean;
|
|
4
|
+
}
|
|
5
|
+
type Id = string | number;
|
|
6
|
+
/** Host-owned URL topology. All builders return app-relative paths. */
|
|
7
|
+
export interface SiderRoutes {
|
|
8
|
+
home(): string;
|
|
9
|
+
captureBatches(): string;
|
|
10
|
+
captureBatch(batchId: Id): string;
|
|
11
|
+
myTools(): string;
|
|
12
|
+
sites(): string;
|
|
13
|
+
site(siteId: Id): string;
|
|
14
|
+
tool(toolId: Id): string;
|
|
15
|
+
}
|
|
16
|
+
export interface SiderRouting {
|
|
17
|
+
params: Record<string, string | undefined>;
|
|
18
|
+
pathname: string;
|
|
19
|
+
navigate: (path: string, options?: NavigateOptions) => void;
|
|
20
|
+
currentLanguage: string;
|
|
21
|
+
switchLanguage?: (lang: string) => void;
|
|
22
|
+
routes: SiderRoutes;
|
|
23
|
+
}
|
|
24
|
+
export declare function RoutingProvider({ children, params, pathname, navigate, currentLanguage, switchLanguage, routes, }: SiderRouting & {
|
|
25
|
+
children: ReactNode;
|
|
26
|
+
}): import("react").JSX.Element;
|
|
27
|
+
export declare function useSiderRouting(): SiderRouting;
|
|
28
|
+
export declare function useRoutes(): SiderRoutes;
|
|
29
|
+
export declare function useRouteParams<T extends Record<string, string | undefined> = Record<string, string | undefined>>(): T;
|
|
30
|
+
export declare function Redirect({ to, replace }: {
|
|
31
|
+
to: string;
|
|
32
|
+
replace?: boolean;
|
|
33
|
+
}): null;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=routing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../src/context/routing.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEtF,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,KAAK,EAAE,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1B,uEAAuE;AACvE,MAAM,WAAW,WAAW;IAC1B,IAAI,IAAI,MAAM,CAAC;IACf,cAAc,IAAI,MAAM,CAAC;IACzB,YAAY,CAAC,OAAO,EAAE,EAAE,GAAG,MAAM,CAAC;IAClC,OAAO,IAAI,MAAM,CAAC;IAClB,KAAK,IAAI,MAAM,CAAC;IAChB,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,MAAM,CAAC;IACzB,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;IAC5D,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,MAAM,EAAE,WAAW,CAAC;CACrB;AAID,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,eAAe,EACf,cAAc,EACd,MAAM,GACP,EAAE,YAAY,GAAG;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAMxC;AAED,wBAAgB,eAAe,IAAI,YAAY,CAI9C;AAED,wBAAgB,SAAS,IAAI,WAAW,CAEvC;AAED,wBAAgB,cAAc,CAC5B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,KAC9E,CAAC,CAEL;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAc,EAAE,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,QAMjF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useEffect, useMemo } from 'react';
|
|
3
|
+
const RoutingContext = createContext(null);
|
|
4
|
+
export function RoutingProvider({ children, params, pathname, navigate, currentLanguage, switchLanguage, routes, }) {
|
|
5
|
+
const value = useMemo(() => ({ params, pathname, navigate, currentLanguage, switchLanguage, routes }), [params, pathname, navigate, currentLanguage, switchLanguage, routes]);
|
|
6
|
+
return _jsx(RoutingContext.Provider, { value: value, children: children });
|
|
7
|
+
}
|
|
8
|
+
export function useSiderRouting() {
|
|
9
|
+
const ctx = useContext(RoutingContext);
|
|
10
|
+
if (!ctx)
|
|
11
|
+
throw new Error('Sider UI: components must be rendered inside <RoutingProvider>');
|
|
12
|
+
return ctx;
|
|
13
|
+
}
|
|
14
|
+
export function useRoutes() {
|
|
15
|
+
return useSiderRouting().routes;
|
|
16
|
+
}
|
|
17
|
+
export function useRouteParams() {
|
|
18
|
+
return useSiderRouting().params;
|
|
19
|
+
}
|
|
20
|
+
export function Redirect({ to, replace = true }) {
|
|
21
|
+
const { navigate } = useSiderRouting();
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
navigate(to, { replace });
|
|
24
|
+
}, [to, replace, navigate]);
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=routing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing.js","sourceRoot":"","sources":["../../src/context/routing.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAkB,MAAM,OAAO,CAAC;AA4BtF,MAAM,cAAc,GAAG,aAAa,CAAsB,IAAI,CAAC,CAAC;AAEhE,MAAM,UAAU,eAAe,CAAC,EAC9B,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,eAAe,EACf,cAAc,EACd,MAAM,GACiC;IACvC,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,EAC/E,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,CAAC,CACtE,CAAC;IACF,OAAO,KAAC,cAAc,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAA2B,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IAC5F,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,eAAe,EAAE,CAAC,MAAM,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,cAAc;IAG5B,OAAO,eAAe,EAAE,CAAC,MAAW,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,GAAG,IAAI,EAAqC;IAChF,MAAM,EAAE,QAAQ,EAAE,GAAG,eAAe,EAAE,CAAC;IACvC,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5B,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC5B,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export * from './context/config';
|
|
2
|
+
export * from './context/routing';
|
|
3
|
+
export * from './components/states';
|
|
4
|
+
export * from './components/data/DataTable';
|
|
5
|
+
export * from './components/data/JsonViewer';
|
|
6
|
+
export * from './components/data/secretSegments';
|
|
7
|
+
export * from './components/dashboard/DashboardSidebar';
|
|
8
|
+
export * from './pages/DashboardOverview';
|
|
9
|
+
export * from './pages/CaptureBatchesPage';
|
|
10
|
+
export * from './pages/CaptureBatchDetailPage';
|
|
11
|
+
export * from './pages/MyToolsPage';
|
|
12
|
+
export * from './pages/SitesPage';
|
|
13
|
+
export * from './pages/SiteDetailPage';
|
|
14
|
+
export * from './pages/ToolDetailPage';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kCAAkC,CAAC;AACjD,cAAc,yCAAyC,CAAC;AACxD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export * from './context/config';
|
|
2
|
+
export * from './context/routing';
|
|
3
|
+
export * from './components/states';
|
|
4
|
+
export * from './components/data/DataTable';
|
|
5
|
+
export * from './components/data/JsonViewer';
|
|
6
|
+
export * from './components/data/secretSegments';
|
|
7
|
+
export * from './components/dashboard/DashboardSidebar';
|
|
8
|
+
export * from './pages/DashboardOverview';
|
|
9
|
+
export * from './pages/CaptureBatchesPage';
|
|
10
|
+
export * from './pages/CaptureBatchDetailPage';
|
|
11
|
+
export * from './pages/MyToolsPage';
|
|
12
|
+
export * from './pages/SitesPage';
|
|
13
|
+
export * from './pages/SiteDetailPage';
|
|
14
|
+
export * from './pages/ToolDetailPage';
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kCAAkC,CAAC;AACjD,cAAc,yCAAyC,CAAC;AACxD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CaptureBatchDetailPage.d.ts","sourceRoot":"","sources":["../../src/pages/CaptureBatchDetailPage.tsx"],"names":[],"mappings":"AAgDA,wBAAgB,sBAAsB,gCA8BrC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { useMyCaptureBatch } from '@sudobility/sider_client';
|
|
4
|
+
import { useSiderApi } from '../context/config';
|
|
5
|
+
import { useRouteParams } from '../context/routing';
|
|
6
|
+
import { EmptyState, ErrorState, LoadingState, StatusBadge } from '../components/states';
|
|
7
|
+
import { JsonViewer } from '../components/data/JsonViewer';
|
|
8
|
+
function ObservationRow({ obs }) {
|
|
9
|
+
const [open, setOpen] = useState(false);
|
|
10
|
+
return (_jsxs("div", { className: "rounded-lg border border-border bg-card", children: [_jsxs("button", { onClick: () => setOpen(o => !o), className: "flex w-full items-center gap-3 px-3 py-2 text-left text-sm", children: [_jsx("span", { className: "font-mono text-xs font-semibold text-primary", children: obs.method }), _jsx("span", { className: "flex-1 truncate font-mono text-xs text-foreground", children: obs.url }), _jsxs("span", { className: "text-xs text-muted-foreground", children: [obs.status, " \u00B7 ", obs.timingMs, "ms"] })] }), open ? (_jsxs("div", { className: "flex flex-col gap-2 border-t border-border p-3", children: [_jsx("p", { className: "text-xs font-semibold text-muted-foreground", children: "Request headers" }), _jsx(JsonViewer, { value: obs.requestHeaders }), obs.requestBody !== undefined && obs.requestBody !== null ? (_jsxs(_Fragment, { children: [_jsx("p", { className: "text-xs font-semibold text-muted-foreground", children: "Request body (tokenized)" }), _jsx(JsonViewer, { value: obs.requestBody })] })) : null, obs.responseBody !== undefined && obs.responseBody !== null ? (_jsxs(_Fragment, { children: [_jsx("p", { className: "text-xs font-semibold text-muted-foreground", children: "Response body (tokenized)" }), _jsx(JsonViewer, { value: obs.responseBody })] })) : null, _jsx("p", { className: "text-xs font-semibold text-muted-foreground", children: "Context" }), _jsx(JsonViewer, { value: obs.context })] })) : null] }));
|
|
11
|
+
}
|
|
12
|
+
export function CaptureBatchDetailPage() {
|
|
13
|
+
const { networkClient, baseUrl, token } = useSiderApi();
|
|
14
|
+
const { batchId } = useRouteParams();
|
|
15
|
+
const { data, isLoading, error } = useMyCaptureBatch(networkClient, baseUrl, token, batchId ?? null);
|
|
16
|
+
if (isLoading)
|
|
17
|
+
return _jsx(LoadingState, {});
|
|
18
|
+
if (error)
|
|
19
|
+
return _jsx(ErrorState, { error: error });
|
|
20
|
+
if (!data)
|
|
21
|
+
return _jsx(EmptyState, { title: "Batch not found" });
|
|
22
|
+
return (_jsxs("div", { className: "flex flex-col gap-4 p-6", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-lg font-semibold text-foreground", children: data.batch.siteName }), _jsxs("p", { className: "text-sm text-muted-foreground", children: [data.batch.siteOrigin, " \u00B7 ", data.batch.observationCount, " observations \u00B7", ' ', _jsx(StatusBadge, { status: data.batch.status })] })] }), _jsx("div", { className: "flex flex-col gap-2", children: data.observations.map(obs => (_jsx(ObservationRow, { obs: obs }, obs.id))) })] }));
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=CaptureBatchDetailPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CaptureBatchDetailPage.js","sourceRoot":"","sources":["../../src/pages/CaptureBatchDetailPage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CaptureBatchesPage.d.ts","sourceRoot":"","sources":["../../src/pages/CaptureBatchesPage.tsx"],"names":[],"mappings":"AAMA,wBAAgB,kBAAkB,gCAkCjC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMyCaptureBatches } from '@sudobility/sider_client';
|
|
3
|
+
import { useSiderApi } from '../context/config';
|
|
4
|
+
import { useRoutes, useSiderRouting } from '../context/routing';
|
|
5
|
+
import { EmptyState, ErrorState, LoadingState, StatusBadge } from '../components/states';
|
|
6
|
+
import { DataTable } from '../components/data/DataTable';
|
|
7
|
+
export function CaptureBatchesPage() {
|
|
8
|
+
const { networkClient, baseUrl, token } = useSiderApi();
|
|
9
|
+
const routes = useRoutes();
|
|
10
|
+
const { navigate } = useSiderRouting();
|
|
11
|
+
const { data, isLoading, error } = useMyCaptureBatches(networkClient, baseUrl, token);
|
|
12
|
+
if (isLoading)
|
|
13
|
+
return _jsx(LoadingState, {});
|
|
14
|
+
if (error)
|
|
15
|
+
return _jsx(ErrorState, { error: error });
|
|
16
|
+
if (!data?.length)
|
|
17
|
+
return (_jsx("div", { className: "p-6", children: _jsx(EmptyState, { title: "No capture batches", hint: "Start learning mode on a site in the extension." }) }));
|
|
18
|
+
return (_jsxs("div", { className: "flex flex-col gap-4 p-6", children: [_jsx("h1", { className: "text-lg font-semibold text-foreground", children: "Capture batches" }), _jsx(DataTable, { columns: [
|
|
19
|
+
{ key: 'siteName', header: 'Site' },
|
|
20
|
+
{ key: 'siteOrigin', header: 'Origin' },
|
|
21
|
+
{ key: 'observationCount', header: 'Observations' },
|
|
22
|
+
{ key: 'status', header: 'Status', render: r => _jsx(StatusBadge, { status: String(r.status) }) },
|
|
23
|
+
{ key: 'createdAt', header: 'Uploaded' },
|
|
24
|
+
], rows: data, onRowClick: r => navigate(routes.captureBatch(String(r.id))) })] }));
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=CaptureBatchesPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CaptureBatchesPage.js","sourceRoot":"","sources":["../../src/pages/CaptureBatchesPage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,MAAM,UAAU,kBAAkB;IAChC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,WAAW,EAAE,CAAC;IACxD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,EAAE,QAAQ,EAAE,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,mBAAmB,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAEtF,IAAI,SAAS;QAAE,OAAO,KAAC,YAAY,KAAG,CAAC;IACvC,IAAI,KAAK;QAAE,OAAO,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;IAC/C,IAAI,CAAC,IAAI,EAAE,MAAM;QACf,OAAO,CACL,cAAK,SAAS,EAAC,KAAK,YAClB,KAAC,UAAU,IACT,KAAK,EAAC,oBAAoB,EAC1B,IAAI,EAAC,iDAAiD,GACtD,GACE,CACP,CAAC;IAEJ,OAAO,CACL,eAAK,SAAS,EAAC,yBAAyB,aACtC,aAAI,SAAS,EAAC,uCAAuC,gCAAqB,EAC1E,KAAC,SAAS,IACR,OAAO,EAAE;oBACP,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE;oBACnC,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE;oBACvC,EAAE,GAAG,EAAE,kBAAkB,EAAE,MAAM,EAAE,cAAc,EAAE;oBACnD,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAC,WAAW,IAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAI,EAAE;oBAC3F,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE;iBACzC,EACD,IAAI,EAAE,IAA4C,EAClD,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAC5D,IACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardOverview.d.ts","sourceRoot":"","sources":["../../src/pages/DashboardOverview.tsx"],"names":[],"mappings":"AAeA,wBAAgB,iBAAiB,gCAiEhC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMe, useMyCaptureBatches, useMyTools } from '@sudobility/sider_client';
|
|
3
|
+
import { useSiderApi } from '../context/config';
|
|
4
|
+
import { useRoutes, useSiderRouting } from '../context/routing';
|
|
5
|
+
import { EmptyState, ErrorState, LoadingState, StatusBadge } from '../components/states';
|
|
6
|
+
import { DataTable } from '../components/data/DataTable';
|
|
7
|
+
function Stat({ label, value }) {
|
|
8
|
+
return (_jsxs("div", { className: "rounded-lg border border-border bg-card p-4", children: [_jsx("p", { className: "text-2xl font-semibold text-foreground", children: value }), _jsx("p", { className: "text-xs text-muted-foreground", children: label })] }));
|
|
9
|
+
}
|
|
10
|
+
export function DashboardOverview() {
|
|
11
|
+
const { networkClient, baseUrl, token } = useSiderApi();
|
|
12
|
+
const routes = useRoutes();
|
|
13
|
+
const { navigate } = useSiderRouting();
|
|
14
|
+
const me = useMe(networkClient, baseUrl, token);
|
|
15
|
+
const batches = useMyCaptureBatches(networkClient, baseUrl, token);
|
|
16
|
+
const myTools = useMyTools(networkClient, baseUrl, token);
|
|
17
|
+
if (me.isLoading)
|
|
18
|
+
return _jsx(LoadingState, {});
|
|
19
|
+
if (me.error)
|
|
20
|
+
return _jsx(ErrorState, { error: me.error });
|
|
21
|
+
if (!me.data)
|
|
22
|
+
return _jsx(EmptyState, { title: "No profile yet", hint: "Sign in and learn a site first." });
|
|
23
|
+
const recent = (batches.data ?? []).slice(0, 5);
|
|
24
|
+
return (_jsxs("div", { className: "flex flex-col gap-6 p-6", children: [_jsx("h1", { className: "text-lg font-semibold text-foreground", children: "Overview" }), _jsxs("div", { className: "grid grid-cols-2 gap-3 md:grid-cols-4", children: [_jsx(Stat, { label: "Capture batches", value: me.data.batchCount }), _jsx(Stat, { label: "Observations", value: me.data.observationCount }), _jsx(Stat, { label: "Tools contributed", value: me.data.toolsContributed }), _jsx(Stat, { label: "Trusted tools", value: me.data.trustedToolsContributed })] }), _jsxs("section", { children: [_jsx("h2", { className: "pb-2 text-sm font-semibold text-foreground", children: "Recent batches" }), recent.length === 0 ? (_jsx(EmptyState, { title: "No captures yet", hint: "Use the extension's learning mode on a site." })) : (_jsx(DataTable, { columns: [
|
|
25
|
+
{ key: 'siteName', header: 'Site' },
|
|
26
|
+
{ key: 'observationCount', header: 'Observations' },
|
|
27
|
+
{
|
|
28
|
+
key: 'status',
|
|
29
|
+
header: 'Status',
|
|
30
|
+
render: r => _jsx(StatusBadge, { status: String(r.status) }),
|
|
31
|
+
},
|
|
32
|
+
{ key: 'createdAt', header: 'When' },
|
|
33
|
+
], rows: recent, onRowClick: r => navigate(routes.captureBatch(String(r.id))) }))] }), _jsxs("section", { children: [_jsx("h2", { className: "pb-2 text-sm font-semibold text-foreground", children: "My tools" }), (myTools.data ?? []).length === 0 ? (_jsx(EmptyState, { title: "No tool contributions yet" })) : (_jsx(DataTable, { columns: [
|
|
34
|
+
{ key: 'name', header: 'Tool' },
|
|
35
|
+
{
|
|
36
|
+
key: 'status',
|
|
37
|
+
header: 'Status',
|
|
38
|
+
render: r => _jsx(StatusBadge, { status: String(r.status) }),
|
|
39
|
+
},
|
|
40
|
+
{ key: 'corroboratingUserCount', header: 'Corroborations' },
|
|
41
|
+
], rows: (myTools.data ?? []), onRowClick: r => navigate(routes.tool(String(r.toolId))) }))] })] }));
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=DashboardOverview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardOverview.js","sourceRoot":"","sources":["../../src/pages/DashboardOverview.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MyToolsPage.d.ts","sourceRoot":"","sources":["../../src/pages/MyToolsPage.tsx"],"names":[],"mappings":"AAMA,wBAAgB,WAAW,gCAoC1B"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMyTools } from '@sudobility/sider_client';
|
|
3
|
+
import { useSiderApi } from '../context/config';
|
|
4
|
+
import { useRoutes, useSiderRouting } from '../context/routing';
|
|
5
|
+
import { EmptyState, ErrorState, LoadingState, StatusBadge } from '../components/states';
|
|
6
|
+
import { DataTable } from '../components/data/DataTable';
|
|
7
|
+
export function MyToolsPage() {
|
|
8
|
+
const { networkClient, baseUrl, token } = useSiderApi();
|
|
9
|
+
const routes = useRoutes();
|
|
10
|
+
const { navigate } = useSiderRouting();
|
|
11
|
+
const { data, isLoading, error } = useMyTools(networkClient, baseUrl, token);
|
|
12
|
+
if (isLoading)
|
|
13
|
+
return _jsx(LoadingState, {});
|
|
14
|
+
if (error)
|
|
15
|
+
return _jsx(ErrorState, { error: error });
|
|
16
|
+
if (!data?.length)
|
|
17
|
+
return (_jsx("div", { className: "p-6", children: _jsx(EmptyState, { title: "No tool contributions yet" }) }));
|
|
18
|
+
return (_jsxs("div", { className: "flex flex-col gap-4 p-6", children: [_jsx("h1", { className: "text-lg font-semibold text-foreground", children: "My tools" }), _jsx(DataTable, { columns: [
|
|
19
|
+
{ key: 'name', header: 'Tool' },
|
|
20
|
+
{ key: 'safetyClass', header: 'Safety' },
|
|
21
|
+
{ key: 'status', header: 'Status', render: r => _jsx(StatusBadge, { status: String(r.status) }) },
|
|
22
|
+
{ key: 'corroboratingUserCount', header: 'Corroborations' },
|
|
23
|
+
{
|
|
24
|
+
key: 'agreesWithCurrent',
|
|
25
|
+
header: 'My vote',
|
|
26
|
+
render: r => r.agreesWithCurrent ? 'matches stored recipe' : 'differs from stored recipe',
|
|
27
|
+
},
|
|
28
|
+
], rows: data, onRowClick: r => navigate(routes.tool(String(r.toolId))) })] }));
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=MyToolsPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MyToolsPage.js","sourceRoot":"","sources":["../../src/pages/MyToolsPage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,MAAM,UAAU,WAAW;IACzB,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,WAAW,EAAE,CAAC;IACxD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,EAAE,QAAQ,EAAE,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAE7E,IAAI,SAAS;QAAE,OAAO,KAAC,YAAY,KAAG,CAAC;IACvC,IAAI,KAAK;QAAE,OAAO,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;IAC/C,IAAI,CAAC,IAAI,EAAE,MAAM;QACf,OAAO,CACL,cAAK,SAAS,EAAC,KAAK,YAClB,KAAC,UAAU,IAAC,KAAK,EAAC,2BAA2B,GAAG,GAC5C,CACP,CAAC;IAEJ,OAAO,CACL,eAAK,SAAS,EAAC,yBAAyB,aACtC,aAAI,SAAS,EAAC,uCAAuC,yBAAc,EACnE,KAAC,SAAS,IACR,OAAO,EAAE;oBACP,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;oBAC/B,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE;oBACxC,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAC,WAAW,IAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAI,EAAE;oBAC3F,EAAE,GAAG,EAAE,wBAAwB,EAAE,MAAM,EAAE,gBAAgB,EAAE;oBAC3D;wBACE,GAAG,EAAE,mBAAmB;wBACxB,MAAM,EAAE,SAAS;wBACjB,MAAM,EAAE,CAAC,CAAC,EAAE,CACV,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,4BAA4B;qBAC/E;iBACF,EACD,IAAI,EAAE,IAA4C,EAClD,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GACxD,IACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SiteDetailPage.d.ts","sourceRoot":"","sources":["../../src/pages/SiteDetailPage.tsx"],"names":[],"mappings":"AAiBA,wBAAgB,cAAc,gCA6H7B"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { useSite, useSiteGraph, useSiteSlots, useSiteTemplates, useToolCatalog, } from '@sudobility/sider_client';
|
|
4
|
+
import { useSiderApi } from '../context/config';
|
|
5
|
+
import { useRouteParams, useRoutes, useSiderRouting } from '../context/routing';
|
|
6
|
+
import { EmptyState, ErrorState, LoadingState, StatusBadge } from '../components/states';
|
|
7
|
+
import { DataTable } from '../components/data/DataTable';
|
|
8
|
+
import { JsonViewer } from '../components/data/JsonViewer';
|
|
9
|
+
const TABS = ['templates', 'tools', 'slots', 'graph', 'ux'];
|
|
10
|
+
export function SiteDetailPage() {
|
|
11
|
+
const { networkClient, baseUrl, token } = useSiderApi();
|
|
12
|
+
const { siteId } = useRouteParams();
|
|
13
|
+
const routes = useRoutes();
|
|
14
|
+
const { navigate } = useSiderRouting();
|
|
15
|
+
const [tab, setTab] = useState('templates');
|
|
16
|
+
const site = useSite(networkClient, baseUrl, token, siteId ?? null);
|
|
17
|
+
const templates = useSiteTemplates(networkClient, baseUrl, token, siteId ?? null);
|
|
18
|
+
const catalog = useToolCatalog(networkClient, baseUrl, token, siteId ?? null, {
|
|
19
|
+
includeProvisional: true,
|
|
20
|
+
includeFlagged: true,
|
|
21
|
+
});
|
|
22
|
+
const slots = useSiteSlots(networkClient, baseUrl, token, siteId ?? null);
|
|
23
|
+
const graph = useSiteGraph(networkClient, baseUrl, token, siteId ?? null);
|
|
24
|
+
if (site.isLoading)
|
|
25
|
+
return _jsx(LoadingState, {});
|
|
26
|
+
if (site.error)
|
|
27
|
+
return _jsx(ErrorState, { error: site.error });
|
|
28
|
+
if (!site.data)
|
|
29
|
+
return _jsx(EmptyState, { title: "Site not found" });
|
|
30
|
+
return (_jsxs("div", { className: "flex flex-col gap-4 p-6", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-lg font-semibold text-foreground", children: site.data.name }), _jsx("p", { className: "text-sm text-muted-foreground", children: site.data.origin })] }), _jsx("div", { className: "flex gap-1 border-b border-border", children: TABS.map(t => (_jsx("button", { onClick: () => setTab(t), className: `px-3 py-1.5 text-sm capitalize ${tab === t
|
|
31
|
+
? 'border-b-2 border-primary font-medium text-foreground'
|
|
32
|
+
: 'text-muted-foreground hover:text-foreground'}`, children: t === 'ux' ? 'UX recipes' : t === 'slots' ? 'Secret slots' : t }, t))) }), tab === 'templates' &&
|
|
33
|
+
(templates.data?.length ? (_jsx("div", { className: "flex flex-col gap-2", children: templates.data.map(t => (_jsxs("details", { className: "rounded-lg border border-border bg-card p-3", children: [_jsxs("summary", { className: "cursor-pointer text-sm text-foreground", children: [_jsx("span", { className: "font-mono text-xs font-semibold text-primary", children: t.method }), ' ', _jsx("span", { className: "font-mono text-xs", children: t.pathTemplate })] }), _jsx(JsonViewer, { value: t })] }, t.id))) })) : (_jsx(EmptyState, { title: "No endpoint templates yet" }))), tab === 'tools' &&
|
|
34
|
+
(catalog.data?.tools?.length ? (_jsx(DataTable, { columns: [
|
|
35
|
+
{ key: 'name', header: 'Tool' },
|
|
36
|
+
{ key: 'safetyClass', header: 'Safety' },
|
|
37
|
+
{
|
|
38
|
+
key: 'status',
|
|
39
|
+
header: 'Status',
|
|
40
|
+
render: r => _jsx(StatusBadge, { status: String(r.status) }),
|
|
41
|
+
},
|
|
42
|
+
{ key: 'corroboratingUserCount', header: 'Corroborations' },
|
|
43
|
+
], rows: (catalog.data.tools ?? []), onRowClick: r => navigate(routes.tool(String(r.id))) })) : (_jsx(EmptyState, { title: "No tools yet" }))), tab === 'slots' &&
|
|
44
|
+
(slots.data?.length ? (_jsx("div", { className: "flex flex-col gap-2", children: slots.data.map(s => (_jsxs("details", { className: "rounded-lg border border-border bg-card p-3", children: [_jsxs("summary", { className: "cursor-pointer font-mono text-xs text-foreground", children: [s.id, " \u2014 ", s.kind, " / ", s.role] }), _jsx(JsonViewer, { value: s })] }, s.id))) })) : (_jsx(EmptyState, { title: "No secret slots", hint: "Definitions only \u2014 values never exist server-side." }))), tab === 'graph' &&
|
|
45
|
+
(graph.data?.length ? (_jsx(DataTable, { columns: [
|
|
46
|
+
{ key: 'fromTemplateId', header: 'From template' },
|
|
47
|
+
{ key: 'fromJsonPath', header: 'Output path' },
|
|
48
|
+
{ key: 'toTemplateId', header: 'To template' },
|
|
49
|
+
{ key: 'toParam', header: 'Input param' },
|
|
50
|
+
{ key: 'confidence', header: 'Confidence' },
|
|
51
|
+
], rows: graph.data })) : (_jsx(EmptyState, { title: "No graph edges", hint: "Graph building is not implemented server-side yet." }))), tab === 'ux' &&
|
|
52
|
+
(catalog.data?.uxRecipes?.length ? (_jsx(JsonViewer, { value: catalog.data.uxRecipes })) : (_jsx(EmptyState, { title: "No UX recipes" })))] }));
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=SiteDetailPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SiteDetailPage.js","sourceRoot":"","sources":["../../src/pages/SiteDetailPage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SitesPage.d.ts","sourceRoot":"","sources":["../../src/pages/SitesPage.tsx"],"names":[],"mappings":"AAMA,wBAAgB,SAAS,gCA+BxB"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useSites } from '@sudobility/sider_client';
|
|
3
|
+
import { useSiderApi } from '../context/config';
|
|
4
|
+
import { useRoutes, useSiderRouting } from '../context/routing';
|
|
5
|
+
import { EmptyState, ErrorState, LoadingState } from '../components/states';
|
|
6
|
+
import { DataTable } from '../components/data/DataTable';
|
|
7
|
+
export function SitesPage() {
|
|
8
|
+
const { networkClient, baseUrl, token } = useSiderApi();
|
|
9
|
+
const routes = useRoutes();
|
|
10
|
+
const { navigate } = useSiderRouting();
|
|
11
|
+
const { data, isLoading, error } = useSites(networkClient, baseUrl, token);
|
|
12
|
+
if (isLoading)
|
|
13
|
+
return _jsx(LoadingState, {});
|
|
14
|
+
if (error)
|
|
15
|
+
return _jsx(ErrorState, { error: error });
|
|
16
|
+
if (!data?.length)
|
|
17
|
+
return (_jsx("div", { className: "p-6", children: _jsx(EmptyState, { title: "No sites learned yet" }) }));
|
|
18
|
+
return (_jsxs("div", { className: "flex flex-col gap-4 p-6", children: [_jsx("h1", { className: "text-lg font-semibold text-foreground", children: "Registry \u2014 sites" }), _jsx(DataTable, { columns: [
|
|
19
|
+
{ key: 'name', header: 'Site' },
|
|
20
|
+
{ key: 'origin', header: 'Origin' },
|
|
21
|
+
{ key: 'toolCount', header: 'Tools' },
|
|
22
|
+
{ key: 'trustedToolCount', header: 'Trusted' },
|
|
23
|
+
{ key: 'contributorCount', header: 'Contributors' },
|
|
24
|
+
], rows: data, onRowClick: r => navigate(routes.site(String(r.id))) })] }));
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=SitesPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SitesPage.js","sourceRoot":"","sources":["../../src/pages/SitesPage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,MAAM,UAAU,SAAS;IACvB,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,WAAW,EAAE,CAAC;IACxD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,EAAE,QAAQ,EAAE,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAE3E,IAAI,SAAS;QAAE,OAAO,KAAC,YAAY,KAAG,CAAC;IACvC,IAAI,KAAK;QAAE,OAAO,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;IAC/C,IAAI,CAAC,IAAI,EAAE,MAAM;QACf,OAAO,CACL,cAAK,SAAS,EAAC,KAAK,YAClB,KAAC,UAAU,IAAC,KAAK,EAAC,sBAAsB,GAAG,GACvC,CACP,CAAC;IAEJ,OAAO,CACL,eAAK,SAAS,EAAC,yBAAyB,aACtC,aAAI,SAAS,EAAC,uCAAuC,sCAAsB,EAC3E,KAAC,SAAS,IACR,OAAO,EAAE;oBACP,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;oBAC/B,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE;oBACnC,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE;oBACrC,EAAE,GAAG,EAAE,kBAAkB,EAAE,MAAM,EAAE,SAAS,EAAE;oBAC9C,EAAE,GAAG,EAAE,kBAAkB,EAAE,MAAM,EAAE,cAAc,EAAE;iBACpD,EACD,IAAI,EAAE,IAA4C,EAClD,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GACpD,IACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolDetailPage.d.ts","sourceRoot":"","sources":["../../src/pages/ToolDetailPage.tsx"],"names":[],"mappings":"AAMA,wBAAgB,cAAc,gCAoC7B"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useToolDetail } from '@sudobility/sider_client';
|
|
3
|
+
import { useSiderApi } from '../context/config';
|
|
4
|
+
import { useRouteParams } from '../context/routing';
|
|
5
|
+
import { EmptyState, ErrorState, LoadingState, StatusBadge } from '../components/states';
|
|
6
|
+
import { JsonViewer } from '../components/data/JsonViewer';
|
|
7
|
+
export function ToolDetailPage() {
|
|
8
|
+
const { networkClient, baseUrl, token } = useSiderApi();
|
|
9
|
+
const { toolId } = useRouteParams();
|
|
10
|
+
const { data, isLoading, error } = useToolDetail(networkClient, baseUrl, token, toolId ?? null);
|
|
11
|
+
if (isLoading)
|
|
12
|
+
return _jsx(LoadingState, {});
|
|
13
|
+
if (error)
|
|
14
|
+
return _jsx(ErrorState, { error: error });
|
|
15
|
+
if (!data)
|
|
16
|
+
return _jsx(EmptyState, { title: "Tool not found" });
|
|
17
|
+
const { tool, corroboration } = data;
|
|
18
|
+
return (_jsxs("div", { className: "flex flex-col gap-4 p-6", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-lg font-semibold text-foreground", children: tool.name }), _jsxs("p", { className: "text-sm text-muted-foreground", children: [tool.description, " \u00B7 ", _jsx(StatusBadge, { status: tool.status }), " \u00B7 ", tool.safetyClass, " \u00B7 v", tool.version] })] }), _jsxs("section", { children: [_jsxs("h2", { className: "pb-2 text-sm font-semibold text-foreground", children: ["Corroboration (", corroboration.distinctUsers, " users, trust threshold", ' ', corroboration.trustThreshold, ")"] }), _jsx(JsonViewer, { value: corroboration.hashCounts })] }), _jsxs("section", { children: [_jsx("h2", { className: "pb-2 text-sm font-semibold text-foreground", children: "Input schema" }), _jsx(JsonViewer, { value: tool.inputSchema })] }), _jsxs("section", { children: [_jsx("h2", { className: "pb-2 text-sm font-semibold text-foreground", children: "Invocation recipe" }), _jsx(JsonViewer, { value: tool.recipe })] })] }));
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=ToolDetailPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolDetailPage.js","sourceRoot":"","sources":["../../src/pages/ToolDetailPage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,MAAM,UAAU,cAAc;IAC5B,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,WAAW,EAAE,CAAC;IACxD,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,EAAuB,CAAC;IACzD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,aAAa,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC;IAEhG,IAAI,SAAS;QAAE,OAAO,KAAC,YAAY,KAAG,CAAC;IACvC,IAAI,KAAK;QAAE,OAAO,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;IAC/C,IAAI,CAAC,IAAI;QAAE,OAAO,KAAC,UAAU,IAAC,KAAK,EAAC,gBAAgB,GAAG,CAAC;IAExD,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IACrC,OAAO,CACL,eAAK,SAAS,EAAC,yBAAyB,aACtC,0BACE,aAAI,SAAS,EAAC,uCAAuC,YAAE,IAAI,CAAC,IAAI,GAAM,EACtE,aAAG,SAAS,EAAC,+BAA+B,aACzC,IAAI,CAAC,WAAW,cAAI,KAAC,WAAW,IAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAI,cAAI,IAAI,CAAC,WAAW,eAC5E,IAAI,CAAC,OAAO,IACX,IACA,EACN,8BACE,cAAI,SAAS,EAAC,4CAA4C,gCACxC,aAAa,CAAC,aAAa,6BAAyB,GAAG,EACtE,aAAa,CAAC,cAAc,SAC1B,EACL,KAAC,UAAU,IAAC,KAAK,EAAE,aAAa,CAAC,UAAU,GAAI,IACvC,EACV,8BACE,aAAI,SAAS,EAAC,4CAA4C,6BAAkB,EAC5E,KAAC,UAAU,IAAC,KAAK,EAAE,IAAI,CAAC,WAAW,GAAI,IAC/B,EACV,8BACE,aAAI,SAAS,EAAC,4CAA4C,kCAAuB,EACjF,KAAC,UAAU,IAAC,KAAK,EAAE,IAAI,CAAC,MAAM,GAAI,IAC1B,IACN,CACP,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sudobility/sider_ui",
|
|
3
|
+
"version": "0.0.3",
|
|
4
|
+
"description": "Sider shared UI — dashboard pages and components for sider_app and sider_extension.",
|
|
5
|
+
"license": "BUSL-1.1",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"files": [
|
|
10
|
+
"dist/**/*"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc -p tsconfig.build.json",
|
|
14
|
+
"build:watch": "tsc -p tsconfig.build.json --watch",
|
|
15
|
+
"clean": "rm -rf dist",
|
|
16
|
+
"prepublishOnly": "bun run clean && bun run build",
|
|
17
|
+
"typecheck": "tsc --noEmit",
|
|
18
|
+
"test": "vitest run --passWithNoTests",
|
|
19
|
+
"verify": "bun run typecheck && bun run test"
|
|
20
|
+
},
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"access": "restricted"
|
|
23
|
+
},
|
|
24
|
+
"peerDependencies": {
|
|
25
|
+
"@heroicons/react": ">=2",
|
|
26
|
+
"@sudobility/components": "^5.0.97",
|
|
27
|
+
"@sudobility/design": "^1.1.46",
|
|
28
|
+
"@sudobility/sider_client": "^0.1.2",
|
|
29
|
+
"@sudobility/sider_types": "^0.0.5",
|
|
30
|
+
"@sudobility/types": "^1.9.62",
|
|
31
|
+
"@tanstack/react-query": ">=5",
|
|
32
|
+
"react": ">=18",
|
|
33
|
+
"react-dom": ">=18"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@heroicons/react": "^2.2.0",
|
|
37
|
+
"@sudobility/components": "^5.0.97",
|
|
38
|
+
"@sudobility/design": "^1.1.46",
|
|
39
|
+
"@sudobility/sider_client": "^0.1.2",
|
|
40
|
+
"@sudobility/sider_types": "^0.0.5",
|
|
41
|
+
"@sudobility/types": "^1.9.62",
|
|
42
|
+
"@tanstack/react-query": "^5.90.5",
|
|
43
|
+
"@types/react": "^18.3.12",
|
|
44
|
+
"eslint": "^9.0.0",
|
|
45
|
+
"react": "^18.3.1",
|
|
46
|
+
"react-dom": "^18.3.1",
|
|
47
|
+
"typescript": "^5.9.3",
|
|
48
|
+
"vitest": "^4.0.0"
|
|
49
|
+
}
|
|
50
|
+
}
|