@semiont/cli 0.4.21 → 0.4.22
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/dist/cli.mjs +24356 -23305
- package/dist/frontend/dist/assets/{CookiePreferences-CWvTznuy.js → CookiePreferences-CPbRK2Nf.js} +2 -2
- package/dist/frontend/dist/assets/{CookiePreferences-CWvTznuy.js.map → CookiePreferences-CPbRK2Nf.js.map} +1 -1
- package/dist/frontend/dist/assets/{PdfAnnotationCanvas.client-6ZGFEN2N-Dnq2pEeZ.js → PdfAnnotationCanvas.client-5QESNO5H-CprYrfHh.js} +2 -2
- package/dist/frontend/dist/assets/PdfAnnotationCanvas.client-5QESNO5H-CprYrfHh.js.map +1 -0
- package/dist/frontend/dist/assets/ToolbarPanels-CPoZvoTB.js +2 -0
- package/dist/frontend/dist/assets/ToolbarPanels-CPoZvoTB.js.map +1 -0
- package/dist/frontend/dist/assets/client-CCxdaxo8.js +2 -0
- package/dist/frontend/dist/assets/client-CCxdaxo8.js.map +1 -0
- package/dist/frontend/dist/assets/client-CPOjL49o.js +2 -0
- package/dist/frontend/dist/assets/client-CPOjL49o.js.map +1 -0
- package/dist/frontend/dist/assets/{client-9KMfqezG.js → client-D04WIU14.js} +2 -2
- package/dist/frontend/dist/assets/{client-9KMfqezG.js.map → client-D04WIU14.js.map} +1 -1
- package/dist/frontend/dist/assets/{client-Bvrf4lLa.js → client-kS15_T5U.js} +2 -2
- package/dist/frontend/dist/assets/{client-Bvrf4lLa.js.map → client-kS15_T5U.js.map} +1 -1
- package/dist/frontend/dist/assets/index-Bsr9DJ3G.js +169 -0
- package/dist/frontend/dist/assets/index-Bsr9DJ3G.js.map +1 -0
- package/dist/frontend/dist/assets/layout-B-lufx1s.js +2 -0
- package/dist/frontend/dist/assets/layout-B-lufx1s.js.map +1 -0
- package/dist/frontend/dist/assets/layout-BWesrQWr.js +2 -0
- package/dist/frontend/dist/assets/{layout-easR0slx.js.map → layout-BWesrQWr.js.map} +1 -1
- package/dist/frontend/dist/assets/{layout-BgHlzaj1.js → layout-DqFHhLVw.js} +2 -2
- package/dist/frontend/dist/assets/layout-DqFHhLVw.js.map +1 -0
- package/dist/frontend/dist/assets/layout-w9wtEpkI.js +2 -0
- package/dist/frontend/dist/assets/layout-w9wtEpkI.js.map +1 -0
- package/dist/frontend/dist/assets/{not-found-nC4IaXPt.js → not-found-C0HTZoKU.js} +2 -2
- package/dist/frontend/dist/assets/{not-found-nC4IaXPt.js.map → not-found-C0HTZoKU.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-8zC_t3l-.js → page--QmNUvGH.js} +2 -2
- package/dist/frontend/dist/assets/{page-8zC_t3l-.js.map → page--QmNUvGH.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-DB1HZ_Jr.js → page-BIyG0SOs.js} +2 -2
- package/dist/frontend/dist/assets/{page-DB1HZ_Jr.js.map → page-BIyG0SOs.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-DoqFVg4p.js → page-BMeXKClk.js} +2 -2
- package/dist/frontend/dist/assets/{page-DoqFVg4p.js.map → page-BMeXKClk.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-jr_Rqa0A.js → page-BS88Xh4W.js} +2 -2
- package/dist/frontend/dist/assets/page-BS88Xh4W.js.map +1 -0
- package/dist/frontend/dist/assets/{page-By8BIN8Q.js → page-BkEdFy5p.js} +2 -2
- package/dist/frontend/dist/assets/{page-By8BIN8Q.js.map → page-BkEdFy5p.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-BDMxGD5Z.js → page-BoFYscYi.js} +2 -2
- package/dist/frontend/dist/assets/{page-BDMxGD5Z.js.map → page-BoFYscYi.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-btIB2WK4.js → page-BzkBmeDS.js} +2 -2
- package/dist/frontend/dist/assets/page-BzkBmeDS.js.map +1 -0
- package/dist/frontend/dist/assets/{page-BwiRQxa7.js → page-C43cKrO_.js} +2 -2
- package/dist/frontend/dist/assets/{page-BwiRQxa7.js.map → page-C43cKrO_.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-BD9EKRMV.js → page-CHCWv8gH.js} +2 -2
- package/dist/frontend/dist/assets/{page-BD9EKRMV.js.map → page-CHCWv8gH.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-CTvUxWH5.js → page-CN1zC8Ky.js} +2 -2
- package/dist/frontend/dist/assets/{page-CTvUxWH5.js.map → page-CN1zC8Ky.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-DBoIW_-n.js → page-CPL87vBZ.js} +2 -2
- package/dist/frontend/dist/assets/{page-DBoIW_-n.js.map → page-CPL87vBZ.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-CQsfujTh.js → page-CU11Rd_F.js} +2 -2
- package/dist/frontend/dist/assets/{page-CQsfujTh.js.map → page-CU11Rd_F.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-kLVTeA46.js → page-CryPHwXI.js} +2 -2
- package/dist/frontend/dist/assets/{page-kLVTeA46.js.map → page-CryPHwXI.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-DWS9ulKD.js → page-DYOj954J.js} +2 -2
- package/dist/frontend/dist/assets/{page-DWS9ulKD.js.map → page-DYOj954J.js.map} +1 -1
- package/dist/frontend/dist/assets/page-Du1JP0jA.js +2 -0
- package/dist/frontend/dist/assets/{page-D8JSCVFI.js.map → page-Du1JP0jA.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-C8zOqZ8M.js → page-Dvw2I_gp.js} +2 -2
- package/dist/frontend/dist/assets/{page-C8zOqZ8M.js.map → page-Dvw2I_gp.js.map} +1 -1
- package/dist/frontend/dist/assets/{page-ChjwiTJ8.js → page-JI9gNkHU.js} +2 -2
- package/dist/frontend/dist/assets/page-JI9gNkHU.js.map +1 -0
- package/dist/frontend/dist/assets/{page-DEHEdU59.js → page-haUujHsJ.js} +2 -2
- package/dist/frontend/dist/assets/{page-DEHEdU59.js.map → page-haUujHsJ.js.map} +1 -1
- package/dist/frontend/dist/assets/{privacy-mpF0jllH.js → privacy-CZ8NTWnp.js} +2 -2
- package/dist/frontend/dist/assets/{privacy-mpF0jllH.js.map → privacy-CZ8NTWnp.js.map} +1 -1
- package/dist/frontend/dist/assets/{routing-BmJG4tNe.js → routing-D4iNsc7y.js} +2 -2
- package/dist/frontend/dist/assets/{routing-BmJG4tNe.js.map → routing-D4iNsc7y.js.map} +1 -1
- package/dist/frontend/dist/assets/{routing-JYkXODZK.js → routing-DCIgrT7s.js} +2 -2
- package/dist/frontend/dist/assets/{routing-JYkXODZK.js.map → routing-DCIgrT7s.js.map} +1 -1
- package/dist/frontend/dist/assets/web-Ua5dIRkZ.js +2 -0
- package/dist/frontend/dist/assets/web-Ua5dIRkZ.js.map +1 -0
- package/dist/frontend/dist/index.html +1 -1
- package/dist/frontend/package.json +1 -1
- package/package.json +8 -7
- package/dist/frontend/dist/assets/PdfAnnotationCanvas.client-6ZGFEN2N-Dnq2pEeZ.js.map +0 -1
- package/dist/frontend/dist/assets/ToolbarPanels-DQrfch_k.js +0 -2
- package/dist/frontend/dist/assets/ToolbarPanels-DQrfch_k.js.map +0 -1
- package/dist/frontend/dist/assets/client-D9qa8fAn.js +0 -2
- package/dist/frontend/dist/assets/client-D9qa8fAn.js.map +0 -1
- package/dist/frontend/dist/assets/client-kIBNRH2w.js +0 -2
- package/dist/frontend/dist/assets/client-kIBNRH2w.js.map +0 -1
- package/dist/frontend/dist/assets/index-DaA8-3Y1.js +0 -169
- package/dist/frontend/dist/assets/index-DaA8-3Y1.js.map +0 -1
- package/dist/frontend/dist/assets/layout-BLGpzYwk.js +0 -2
- package/dist/frontend/dist/assets/layout-BLGpzYwk.js.map +0 -1
- package/dist/frontend/dist/assets/layout-BgHlzaj1.js.map +0 -1
- package/dist/frontend/dist/assets/layout-Dj1MEjN6.js +0 -2
- package/dist/frontend/dist/assets/layout-Dj1MEjN6.js.map +0 -1
- package/dist/frontend/dist/assets/layout-easR0slx.js +0 -2
- package/dist/frontend/dist/assets/page-ChjwiTJ8.js.map +0 -1
- package/dist/frontend/dist/assets/page-D8JSCVFI.js +0 -2
- package/dist/frontend/dist/assets/page-btIB2WK4.js.map +0 -1
- package/dist/frontend/dist/assets/page-jr_Rqa0A.js.map +0 -1
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
|
|
12
12
|
<link rel="manifest" href="/favicons/site.webmanifest" />
|
|
13
13
|
<meta name="theme-color" content="#00FFFF" />
|
|
14
|
-
<script type="module" crossorigin src="/assets/index-
|
|
14
|
+
<script type="module" crossorigin src="/assets/index-Bsr9DJ3G.js"></script>
|
|
15
15
|
<link rel="modulepreload" crossorigin href="/assets/vendor-DJo4KD8w.js">
|
|
16
16
|
<link rel="modulepreload" crossorigin href="/assets/i18n-BbpF47i1.js">
|
|
17
17
|
<link rel="stylesheet" crossorigin href="/assets/index-fHqJXd_A.css">
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@semiont/cli",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.22",
|
|
4
4
|
"description": "Semiont CLI - Unified environment management tool",
|
|
5
5
|
"_comment": "AWS SDK dependencies (@aws-sdk/*) are only used by platforms/aws",
|
|
6
6
|
"type": "module",
|
|
@@ -47,12 +47,13 @@
|
|
|
47
47
|
"test:watch:unit": "vitest --watch --config vitest.config.unit.ts"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@semiont/api-client": "0.4.
|
|
51
|
-
"@semiont/content": "0.4.
|
|
52
|
-
"@semiont/core": "0.4.
|
|
53
|
-
"@semiont/event-sourcing": "0.4.
|
|
54
|
-
"@semiont/graph": "0.4.
|
|
55
|
-
"@semiont/
|
|
50
|
+
"@semiont/api-client": "0.4.22",
|
|
51
|
+
"@semiont/content": "0.4.22",
|
|
52
|
+
"@semiont/core": "0.4.22",
|
|
53
|
+
"@semiont/event-sourcing": "0.4.22",
|
|
54
|
+
"@semiont/graph": "0.4.22",
|
|
55
|
+
"@semiont/sdk": "0.4.22",
|
|
56
|
+
"@semiont/make-meaning": "0.4.22",
|
|
56
57
|
"arg": "^5.0.2",
|
|
57
58
|
"argon2": "^0.44.0",
|
|
58
59
|
"express": "^5.2.1",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PdfAnnotationCanvas.client-6ZGFEN2N-Dnq2pEeZ.js","sources":["../../../../packages/react-ui/dist/PdfAnnotationCanvas.client-6ZGFEN2N.mjs"],"sourcesContent":["'use client';\n\"use client\";\nimport \"./chunk-D4GAAQMM.mjs\";\n\n// src/components/pdf-annotation/PdfAnnotationCanvas.tsx\nimport { useRef, useState, useCallback, useEffect, useMemo } from \"react\";\nimport { createHoverHandlers, getTargetSelector } from \"@semiont/api-client\";\n\n// src/lib/pdf-coordinates.ts\nfunction canvasToPdfCoordinates(canvasRect, page, _pageWidth, pageHeight, scale = 1) {\n const x1 = Math.min(canvasRect.startX, canvasRect.endX);\n const y1 = Math.min(canvasRect.startY, canvasRect.endY);\n const x2 = Math.max(canvasRect.startX, canvasRect.endX);\n const y2 = Math.max(canvasRect.startY, canvasRect.endY);\n const pdfX = x1 / scale;\n const pdfWidth = (x2 - x1) / scale;\n const pdfY = pageHeight - y2 / scale;\n const pdfHeight = (y2 - y1) / scale;\n return {\n page,\n x: Math.round(pdfX),\n y: Math.round(pdfY),\n width: Math.round(pdfWidth),\n height: Math.round(pdfHeight)\n };\n}\nfunction pdfToCanvasCoordinates(pdfCoord, pageHeight, scale = 1) {\n const canvasX = pdfCoord.x * scale;\n const canvasWidth = pdfCoord.width * scale;\n const canvasY = (pageHeight - pdfCoord.y - pdfCoord.height) * scale;\n const canvasHeight = pdfCoord.height * scale;\n return {\n x: canvasX,\n y: canvasY,\n width: canvasWidth,\n height: canvasHeight\n };\n}\nfunction createFragmentSelector(coord) {\n return `page=${coord.page}&viewrect=${coord.x},${coord.y},${coord.width},${coord.height}`;\n}\nfunction parseFragmentSelector(fragment) {\n try {\n const pageMatch = fragment.match(/page=(\\d+)/);\n if (!pageMatch) return null;\n const page = parseInt(pageMatch[1], 10);\n const viewrectMatch = fragment.match(/viewrect=([\\d.]+),([\\d.]+),([\\d.]+),([\\d.]+)/);\n if (!viewrectMatch) return null;\n return {\n page,\n x: parseFloat(viewrectMatch[1]),\n y: parseFloat(viewrectMatch[2]),\n width: parseFloat(viewrectMatch[3]),\n height: parseFloat(viewrectMatch[4])\n };\n } catch {\n return null;\n }\n}\nfunction getPageFromFragment(fragment) {\n const match = fragment.match(/page=(\\d+)/);\n return match ? parseInt(match[1], 10) : null;\n}\n\n// src/lib/browser-pdfjs.ts\nasync function ensurePdfJs() {\n if (typeof window !== \"undefined\" && window.pdfjsLib) {\n return window.pdfjsLib;\n }\n return new Promise((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.src = \"/pdfjs/pdf.min.mjs\";\n script.type = \"module\";\n script.onload = () => {\n const pdfjsLib = window.pdfjsLib;\n if (!pdfjsLib) {\n reject(new Error(\"PDF.js loaded but pdfjsLib not available\"));\n return;\n }\n pdfjsLib.GlobalWorkerOptions.workerSrc = \"/pdfjs/pdf.worker.min.mjs\";\n resolve(pdfjsLib);\n };\n script.onerror = () => {\n reject(new Error(\"Failed to load PDF.js from /pdfjs/pdf.min.mjs\"));\n };\n document.head.appendChild(script);\n });\n}\nasync function loadPdfDocument(url) {\n const pdfjsLib = await ensurePdfJs();\n const loadingTask = pdfjsLib.getDocument({ url });\n return loadingTask.promise;\n}\nasync function renderPdfPageToDataUrl(page, scale = 1) {\n const viewport = page.getViewport({ scale });\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\");\n if (!context) {\n throw new Error(\"Failed to get 2D context\");\n }\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n const renderTask = page.render({\n canvasContext: context,\n viewport\n });\n await renderTask.promise;\n return {\n dataUrl: canvas.toDataURL(\"image/png\"),\n width: viewport.width,\n height: viewport.height\n };\n}\n\n// src/components/pdf-annotation/PdfAnnotationCanvas.tsx\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nfunction getMotivationColor(motivation) {\n if (!motivation) {\n return { stroke: \"rgb(156, 163, 175)\", fill: \"rgba(156, 163, 175, 0.2)\" };\n }\n switch (motivation) {\n case \"highlighting\":\n return { stroke: \"rgb(250, 204, 21)\", fill: \"rgba(250, 204, 21, 0.3)\" };\n case \"linking\":\n return { stroke: \"rgb(59, 130, 246)\", fill: \"rgba(59, 130, 246, 0.2)\" };\n case \"assessing\":\n return { stroke: \"rgb(239, 68, 68)\", fill: \"rgba(239, 68, 68, 0.2)\" };\n case \"commenting\":\n return { stroke: \"rgb(255, 255, 255)\", fill: \"rgba(255, 255, 255, 0.2)\" };\n default:\n return { stroke: \"rgb(156, 163, 175)\", fill: \"rgba(156, 163, 175, 0.2)\" };\n }\n}\nfunction PdfAnnotationCanvas({\n pdfUrl,\n existingAnnotations = [],\n drawingMode,\n selectedMotivation,\n session,\n hoveredAnnotationId,\n selectedAnnotationId,\n hoverDelayMs = 150\n}) {\n const [pdfDoc, setPdfDoc] = useState(null);\n const [numPages, setNumPages] = useState(0);\n const [pageNumber, setPageNumber] = useState(1);\n const [pageImageUrl, setPageImageUrl] = useState(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState(null);\n const [pageDimensions, setPageDimensions] = useState(null);\n const [displayDimensions, setDisplayDimensions] = useState(null);\n const [scale] = useState(1.5);\n const [isDrawing, setIsDrawing] = useState(false);\n const [selection, setSelection] = useState(null);\n const containerRef = useRef(null);\n const imageRef = useRef(null);\n useEffect(() => {\n let cancelled = false;\n async function loadPdf() {\n try {\n setIsLoading(true);\n setError(null);\n const doc = await loadPdfDocument(pdfUrl);\n if (cancelled) return;\n setPdfDoc(doc);\n setNumPages(doc.numPages);\n setIsLoading(false);\n } catch (err) {\n if (cancelled) return;\n console.error(\"Error loading PDF:\", err);\n setError(\"Failed to load PDF\");\n setIsLoading(false);\n }\n }\n loadPdf();\n return () => {\n cancelled = true;\n };\n }, [pdfUrl]);\n useEffect(() => {\n if (!pdfDoc) return;\n let cancelled = false;\n const doc = pdfDoc;\n async function loadPage() {\n try {\n const page = await doc.getPage(pageNumber);\n if (cancelled) return;\n const viewport = page.getViewport({ scale: 1 });\n setPageDimensions({\n width: viewport.width,\n height: viewport.height\n });\n const { dataUrl } = await renderPdfPageToDataUrl(page, scale);\n if (cancelled) return;\n setPageImageUrl(dataUrl);\n } catch (err) {\n if (cancelled) return;\n console.error(\"Error loading page:\", err);\n setError(\"Failed to load page\");\n }\n }\n loadPage();\n return () => {\n cancelled = true;\n };\n }, [pdfDoc, pageNumber, scale]);\n useEffect(() => {\n const updateDisplayDimensions = () => {\n if (imageRef.current) {\n setDisplayDimensions({\n width: imageRef.current.clientWidth,\n height: imageRef.current.clientHeight\n });\n }\n };\n updateDisplayDimensions();\n let resizeObserver = null;\n try {\n resizeObserver = new ResizeObserver(updateDisplayDimensions);\n if (imageRef.current) {\n resizeObserver.observe(imageRef.current);\n }\n } catch (error2) {\n console.warn(\"ResizeObserver not supported, falling back to window resize listener\");\n window.addEventListener(\"resize\", updateDisplayDimensions);\n }\n return () => {\n if (resizeObserver) {\n resizeObserver.disconnect();\n } else {\n window.removeEventListener(\"resize\", updateDisplayDimensions);\n }\n };\n }, [pageImageUrl]);\n const handleMouseDown = useCallback((e) => {\n if (!drawingMode) return;\n if (!imageRef.current) return;\n const rect = imageRef.current.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n setIsDrawing(true);\n setSelection({\n startX: x,\n startY: y,\n endX: x,\n endY: y\n });\n }, [drawingMode]);\n const handleMouseMove = useCallback((e) => {\n if (!isDrawing || !selection || !imageRef.current) return;\n const rect = imageRef.current.getBoundingClientRect();\n setSelection({\n ...selection,\n endX: e.clientX - rect.left,\n endY: e.clientY - rect.top\n });\n }, [isDrawing, selection]);\n const handleMouseUp = useCallback(() => {\n if (!isDrawing || !selection || !pageDimensions || !displayDimensions || !session) {\n setIsDrawing(false);\n setSelection(null);\n return;\n }\n const dragDistance = Math.sqrt(\n Math.pow(selection.endX - selection.startX, 2) + Math.pow(selection.endY - selection.startY, 2)\n );\n const MIN_DRAG_DISTANCE = 10;\n if (dragDistance < MIN_DRAG_DISTANCE) {\n if (existingAnnotations.length > 0) {\n const clickedAnnotation = pageAnnotations.find((ann) => {\n const fragmentSel = getFragmentSelector(ann.target);\n if (!fragmentSel) return false;\n const pdfCoord2 = parseFragmentSelector(fragmentSel.value);\n if (!pdfCoord2) return false;\n const rect = pdfToCanvasCoordinates(pdfCoord2, pageDimensions.height, 1);\n const scaleX2 = displayDimensions.width / pageDimensions.width;\n const scaleY2 = displayDimensions.height / pageDimensions.height;\n const displayX = rect.x * scaleX2;\n const displayY = rect.y * scaleY2;\n const displayWidth = rect.width * scaleX2;\n const displayHeight = rect.height * scaleY2;\n return selection.endX >= displayX && selection.endX <= displayX + displayWidth && selection.endY >= displayY && selection.endY <= displayY + displayHeight;\n });\n if (clickedAnnotation) {\n session?.client.emit(\"browse:click\", { annotationId: clickedAnnotation.id, motivation: clickedAnnotation.motivation });\n setIsDrawing(false);\n setSelection(null);\n return;\n }\n }\n setIsDrawing(false);\n setSelection(null);\n return;\n }\n const scaleX = pageDimensions.width / displayDimensions.width;\n const scaleY = pageDimensions.height / displayDimensions.height;\n const nativeSelection = {\n startX: selection.startX * scaleX,\n startY: selection.startY * scaleY,\n endX: selection.endX * scaleX,\n endY: selection.endY * scaleY\n };\n const pdfCoord = canvasToPdfCoordinates(\n nativeSelection,\n pageNumber,\n pageDimensions.width,\n pageDimensions.height,\n 1\n // Use scale 1.0 since we already scaled to native coords\n );\n const fragmentSelector = createFragmentSelector(pdfCoord);\n if (selectedMotivation) {\n session.client.emit(\"mark:requested\", {\n selector: {\n type: \"FragmentSelector\",\n conformsTo: \"http://tools.ietf.org/rfc/rfc3778\",\n value: fragmentSelector\n },\n motivation: selectedMotivation\n });\n }\n setIsDrawing(false);\n }, [isDrawing, selection, pageNumber, pageDimensions, displayDimensions, selectedMotivation, existingAnnotations]);\n const getFragmentSelector = (target) => {\n const selector = getTargetSelector(target);\n if (!selector) return null;\n const selectors = Array.isArray(selector) ? selector : [selector];\n const found = selectors.find((s) => s.type === \"FragmentSelector\");\n if (!found || found.type !== \"FragmentSelector\") return null;\n return found;\n };\n const pageAnnotations = existingAnnotations.filter((ann) => {\n const fragmentSel = getFragmentSelector(ann.target);\n if (!fragmentSel) return false;\n const page = getPageFromFragment(fragmentSel.value);\n return page === pageNumber;\n });\n const { handleMouseEnter, handleMouseLeave } = useMemo(\n () => createHoverHandlers((annotationId) => session?.client.emit(\"beckon:hover\", { annotationId }), hoverDelayMs),\n [session, hoverDelayMs]\n );\n const { stroke, fill } = getMotivationColor(selectedMotivation ?? null);\n if (error) {\n return /* @__PURE__ */ jsx(\"div\", { className: \"semiont-pdf-annotation-canvas__error\", children: error });\n }\n return /* @__PURE__ */ jsxs(\"div\", { className: \"semiont-pdf-annotation-canvas\", children: [\n isLoading && /* @__PURE__ */ jsx(\"div\", { className: \"semiont-pdf-annotation-canvas__loading\", children: \"Loading PDF...\" }),\n /* @__PURE__ */ jsxs(\n \"div\",\n {\n ref: containerRef,\n className: \"semiont-pdf-annotation-canvas__container\",\n style: { display: isLoading ? \"none\" : void 0 },\n onMouseDown: handleMouseDown,\n onMouseMove: handleMouseMove,\n onMouseUp: handleMouseUp,\n onMouseLeave: () => {\n if (isDrawing) {\n setIsDrawing(false);\n setSelection(null);\n }\n },\n \"data-drawing-mode\": drawingMode || \"none\",\n children: [\n pageImageUrl && /* @__PURE__ */ jsx(\n \"img\",\n {\n ref: imageRef,\n src: pageImageUrl,\n alt: `PDF page ${pageNumber}`,\n className: \"semiont-pdf-annotation-canvas__image\",\n draggable: false,\n style: { pointerEvents: \"none\" },\n onLoad: () => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n if (imageRef.current) {\n setDisplayDimensions({\n width: imageRef.current.clientWidth,\n height: imageRef.current.clientHeight\n });\n }\n });\n });\n }\n }\n ),\n displayDimensions && pageDimensions && /* @__PURE__ */ jsx(\"div\", { className: \"semiont-pdf-annotation-canvas__overlay-container\", children: /* @__PURE__ */ jsx(\"div\", { className: \"semiont-pdf-annotation-canvas__overlay\", children: /* @__PURE__ */ jsxs(\n \"svg\",\n {\n className: \"semiont-pdf-annotation-canvas__svg\",\n width: displayDimensions.width,\n height: displayDimensions.height,\n children: [\n pageAnnotations.map((ann) => {\n const fragmentSel = getFragmentSelector(ann.target);\n if (!fragmentSel) return null;\n const pdfCoord = parseFragmentSelector(fragmentSel.value);\n if (!pdfCoord) return null;\n const rect = pdfToCanvasCoordinates(pdfCoord, pageDimensions.height, 1);\n const scaleX = displayDimensions.width / pageDimensions.width;\n const scaleY = displayDimensions.height / pageDimensions.height;\n const isHovered = ann.id === hoveredAnnotationId;\n const isSelected = ann.id === selectedAnnotationId;\n const annMotivation = ann.motivation;\n const { stroke: annStroke, fill: annFill } = getMotivationColor(annMotivation);\n return /* @__PURE__ */ jsx(\n \"rect\",\n {\n x: rect.x * scaleX,\n y: rect.y * scaleY,\n width: rect.width * scaleX,\n height: rect.height * scaleY,\n stroke: annStroke,\n strokeWidth: isSelected ? 4 : isHovered ? 3 : 2,\n fill: annFill,\n style: {\n pointerEvents: \"auto\",\n cursor: \"pointer\",\n opacity: isSelected ? 1 : isHovered ? 0.9 : 0.7\n },\n onClick: () => session?.client.emit(\"browse:click\", { annotationId: ann.id, motivation: ann.motivation }),\n onMouseEnter: () => handleMouseEnter(ann.id),\n onMouseLeave: handleMouseLeave\n },\n ann.id\n );\n }),\n selection && (() => {\n const rectX = Math.min(selection.startX, selection.endX);\n const rectY = Math.min(selection.startY, selection.endY);\n const rectWidth = Math.abs(selection.endX - selection.startX);\n const rectHeight = Math.abs(selection.endY - selection.startY);\n return /* @__PURE__ */ jsx(\n \"rect\",\n {\n x: rectX,\n y: rectY,\n width: rectWidth,\n height: rectHeight,\n stroke,\n strokeWidth: 2,\n strokeDasharray: \"5,5\",\n fill,\n pointerEvents: \"none\"\n }\n );\n })()\n ]\n }\n ) }) })\n ]\n }\n ),\n numPages > 0 && /* @__PURE__ */ jsxs(\"div\", { className: \"semiont-pdf-annotation-canvas__controls\", children: [\n /* @__PURE__ */ jsx(\n \"button\",\n {\n disabled: pageNumber <= 1,\n onClick: () => setPageNumber(pageNumber - 1),\n className: \"semiont-pdf-annotation-canvas__button\",\n children: \"Previous\"\n }\n ),\n /* @__PURE__ */ jsxs(\"span\", { className: \"semiont-pdf-annotation-canvas__page-info\", children: [\n \"Page \",\n pageNumber,\n \" of \",\n numPages\n ] }),\n /* @__PURE__ */ jsx(\n \"button\",\n {\n disabled: pageNumber >= numPages,\n onClick: () => setPageNumber(pageNumber + 1),\n className: \"semiont-pdf-annotation-canvas__button\",\n children: \"Next\"\n }\n )\n ] })\n ] });\n}\nexport {\n PdfAnnotationCanvas\n};\n//# sourceMappingURL=PdfAnnotationCanvas.client-6ZGFEN2N.mjs.map"],"names":["canvasToPdfCoordinates","canvasRect","page","_pageWidth","pageHeight","scale","x1","y1","x2","y2","pdfX","pdfWidth","pdfY","pdfHeight","pdfToCanvasCoordinates","pdfCoord","canvasX","canvasWidth","canvasY","canvasHeight","createFragmentSelector","coord","parseFragmentSelector","fragment","pageMatch","viewrectMatch","getPageFromFragment","match","ensurePdfJs","resolve","reject","script","pdfjsLib","loadPdfDocument","url","renderPdfPageToDataUrl","viewport","canvas","context","getMotivationColor","motivation","PdfAnnotationCanvas","pdfUrl","existingAnnotations","drawingMode","selectedMotivation","session","hoveredAnnotationId","selectedAnnotationId","hoverDelayMs","pdfDoc","setPdfDoc","useState","numPages","setNumPages","pageNumber","setPageNumber","pageImageUrl","setPageImageUrl","isLoading","setIsLoading","error","setError","pageDimensions","setPageDimensions","displayDimensions","setDisplayDimensions","isDrawing","setIsDrawing","selection","setSelection","containerRef","useRef","imageRef","useEffect","cancelled","loadPdf","doc","err","loadPage","dataUrl","updateDisplayDimensions","resizeObserver","handleMouseDown","useCallback","rect","x","y","handleMouseMove","handleMouseUp","clickedAnnotation","pageAnnotations","ann","fragmentSel","getFragmentSelector","pdfCoord2","scaleX2","scaleY2","displayX","displayY","displayWidth","displayHeight","scaleX","scaleY","nativeSelection","fragmentSelector","target","selector","getTargetSelector","found","s","handleMouseEnter","handleMouseLeave","useMemo","createHoverHandlers","annotationId","stroke","fill","jsx","jsxs","isHovered","isSelected","annMotivation","annStroke","annFill","rectX","rectY","rectWidth","rectHeight"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{u as O,c as T,e as J,a0 as X,a1 as q,a2 as ee,j as e,a3 as te,a4 as F,a5 as _,a6 as ne,a7 as se,a8 as ae,a9 as ie,aa as oe,k as re,ab as le,ac as ce,ad as de}from"./index-DaA8-3Y1.js";import{r as o}from"./vendor-DJo4KD8w.js";import{u as W,a as me,b as ue}from"./routing-JYkXODZK.js";import{u as K}from"./i18n-BbpF47i1.js";import{a as he,F as ge}from"./XMarkIcon-KMKD47CF.js";function pe({title:a,titleId:t,...r},i){return o.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:i,"aria-labelledby":t},r),a?o.createElement("title",{id:t},a):null,o.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15.75 9V5.25A2.25 2.25 0 0 0 13.5 3h-6a2.25 2.25 0 0 0-2.25 2.25v13.5A2.25 2.25 0 0 0 7.5 21h6a2.25 2.25 0 0 0 2.25-2.25V15m3 0 3-3m0 0-3-3m3 3H9"}))}const xe=o.forwardRef(pe);function fe({title:a,titleId:t,...r},i){return o.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:i,"aria-labelledby":t},r),a?o.createElement("title",{id:t},a):null,o.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"m4.5 12.75 6 6 9-13.5"}))}const ve=o.forwardRef(fe);function je({title:a,titleId:t,...r},i){return o.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:i,"aria-labelledby":t},r),a?o.createElement("title",{id:t},a):null,o.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 4.5v15m7.5-7.5h-15"}))}const be=o.forwardRef(je),H="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiIGZpbGw9IiM2QjcyODAiLz4KPHBhdGggZD0iTTE2IDE2QzE4LjIwOTEgMTYgMjAgMTQuMjA5MSAyMCAxMkMyMCA5Ljc5MDg2IDE4LjIwOTEgOCAxNiA4QzEzLjc5MDkgOCAxMiA5Ljc5MDg2IDEyIDEyQzEyIDE0LjIwOTEgMTMuNzkwOSAxNiAxNiAxNloiIGZpbGw9IiNFNUU3RUIiLz4KPHBhdGggZD0iTTI0IDI1QzI0IDIxLjY4NjMgMjAuNDE4MyAxOSAxNiAxOUMxMS41ODE3IDE5IDggMjEuNjg2MyA4IDI1IiBzdHJva2U9IiNFNUU3RUIiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPg==";function ye(){var E,l;const{t:a}=K(),t=(C,D)=>a(`UserPanel.${C}`,D),r=O(),i=T(r.activeSession$),s=T(i==null?void 0:i.user$)??null,h=(i==null?void 0:i.kb)??null,g=(s==null?void 0:s.name)??((E=s==null?void 0:s.email)==null?void 0:E.split("@")[0])??"User",x=(s==null?void 0:s.image)??null,d=(s==null?void 0:s.domain)||((l=s==null?void 0:s.email)==null?void 0:l.split("@")[1]),b=(s==null?void 0:s.isAdmin)??!1,m=(s==null?void 0:s.isModerator)??!1,f=i==null?void 0:i.client,c=J(()=>X(f)),I=W(),[y,A]=o.useState(!1),{timeRemaining:w}=q(),M=te(w)??"Unknown",S=(()=>{if(!x||y)return H;const C=ee(x);return C||(console.warn("Invalid profile image URL detected, using fallback"),H)})(),k=async()=>{await c.logout(),h&&await r.signOut(h.id),I.push("/")};return e.jsxs("div",{className:"semiont-user-panel",children:[e.jsx("h3",{className:"semiont-user-panel__title",children:t("account")}),h&&e.jsx("div",{style:{padding:"0 0.75rem 0.5rem",fontSize:"0.8rem",color:"var(--semiont-color-neutral-400)"},children:h.label}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("img",{src:S,alt:t("profileAlt",{name:g||t("user")}),width:48,height:48,className:"w-12 h-12 rounded-full object-cover",onError:()=>A(!0)}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"semiont-panel-text",children:g||t("user")}),d&&e.jsxs("div",{className:"semiont-panel-text-secondary",children:["@",d]})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"semiont-panel-label",children:t("session")}),e.jsx("div",{className:"semiont-session-box",children:e.jsx("div",{className:"semiont-panel-hint",children:t("expiresIn",{time:M})})})]}),(b||m)&&e.jsxs("div",{children:[e.jsx("label",{className:"semiont-panel-label",children:t("privileges")}),e.jsxs("div",{className:"space-y-1",children:[b&&e.jsx("div",{className:"semiont-privilege-badge semiont-privilege-badge--admin",children:e.jsx("span",{className:"semiont-privilege-text",children:t("administrator")})}),m&&e.jsx("div",{className:"semiont-privilege-badge semiont-privilege-badge--moderator",children:e.jsx("span",{className:"semiont-privilege-text",children:t("moderator")})})]})]}),e.jsx("div",{className:"semiont-panel-divider",children:e.jsx("button",{onClick:k,className:"semiont-signout-button",children:t("signOut")})})]})]})}const Se={authenticated:"var(--semiont-color-success-500, #22c55e)",expired:"var(--semiont-color-warning-500, #eab308)","signed-out":"var(--semiont-color-neutral-400, #9ca3af)",unreachable:"var(--semiont-color-error-500, #ef4444)"},we={authenticated:"statusConnected",expired:"statusExpired","signed-out":"statusSignedOut",unreachable:"statusUnreachable"};function Ne({status:a,t}){return e.jsx("span",{title:t(we[a]),style:{width:"0.5rem",height:"0.5rem",borderRadius:"50%",backgroundColor:Se[a],flexShrink:0}})}function Ie({t:a,onSubmit:t,onCancel:r,error:i,isSubmitting:s,autoFocus:h,pulsing:g,initialHost:x="localhost",initialPort:d=4e3,initialEmail:b="admin@example.com"}){const[m,f]=o.useState(x),[c,I]=o.useState(String(d)),[y,A]=o.useState(F(x)),[w,M]=o.useState(b),[S,k]=o.useState(""),E=l=>{f(l),A(F(l))};return e.jsxs("div",{className:g?"semiont-panel__login-form--pulsing":"",style:{margin:"0.5rem",padding:"0.75rem",border:"1px solid var(--semiont-color-neutral-200, #e5e7eb)",borderRadius:"var(--semiont-panel-border-radius, 0.5rem)",background:"var(--semiont-bg-secondary, transparent)"},children:[e.jsx("h3",{style:{fontSize:"0.8rem",fontWeight:600,marginBottom:"0.5rem"},children:a("connectTitle")}),e.jsxs("form",{onSubmit:l=>{l.preventDefault(),_(m)&&t(m,parseInt(c,10)||4e3,y,w,S)},style:{display:"flex",flexDirection:"column",gap:"0.5rem"},children:[e.jsxs("select",{value:y,onChange:l=>A(l.target.value),className:"semiont-input",children:[e.jsx("option",{value:"http",children:"HTTP"}),e.jsx("option",{value:"https",children:"HTTPS"})]}),e.jsx("input",{type:"text",value:m,onChange:l=>E(l.target.value),placeholder:"Host",className:"semiont-input",autoFocus:h}),e.jsx("input",{type:"number",value:c,onChange:l=>I(l.target.value),placeholder:"Port",className:"semiont-input"}),m&&!_(m)&&e.jsx("div",{style:{color:"var(--semiont-color-error-500, #ef4444)",fontSize:"0.75rem"},children:a("invalidHost")}),e.jsx("input",{type:"email",value:w,onChange:l=>M(l.target.value),placeholder:"Email",className:"semiont-input"}),e.jsx("input",{type:"password",value:S,onChange:l=>k(l.target.value),placeholder:"Password",className:"semiont-input"}),i&&e.jsx("div",{style:{color:"var(--semiont-color-error-500, #ef4444)",fontSize:"0.75rem"},children:i}),e.jsxs("div",{style:{display:"flex",gap:"0.5rem"},children:[e.jsx("button",{type:"submit",className:"semiont-button semiont-button--primary",style:{flex:1},disabled:s||!_(m),children:a(s?"connecting":"connect")}),e.jsx("button",{type:"button",className:"semiont-button",onClick:r,children:e.jsx(ge,{style:{width:"1rem",height:"1rem"}})})]})]})]})}function Ae({t:a,kb:t,onSubmit:r,onCancel:i,error:s,isSubmitting:h}){const[g,x]=o.useState("");return e.jsxs("form",{onSubmit:d=>{d.preventDefault(),r(g)},style:{padding:"0.5rem 0.75rem",display:"flex",flexDirection:"column",gap:"0.375rem"},children:[e.jsx("div",{style:{fontSize:"0.75rem",color:"var(--semiont-color-neutral-400)"},children:t.email}),e.jsx("input",{type:"password",value:g,onChange:d=>x(d.target.value),placeholder:"Password",className:"semiont-input",style:{fontSize:"0.8rem"},autoFocus:!0}),s&&e.jsx("div",{style:{color:"var(--semiont-color-error-500, #ef4444)",fontSize:"0.75rem"},children:s}),e.jsxs("div",{style:{display:"flex",gap:"0.375rem"},children:[e.jsx("button",{type:"submit",className:"semiont-button semiont-button--primary",style:{flex:1,fontSize:"0.8rem"},disabled:h,children:a(h?"signingIn":"signIn")}),e.jsx("button",{type:"button",className:"semiont-button",onClick:i,style:{fontSize:"0.8rem"},children:a("cancel")})]})]})}async function B(a,t,r,i,s){const h=`${r}://${a}:${t}`,g=new ne({baseUrl:se(h)}),x=await g.authenticatePassword(ae(i),s),d=x.token??x.accessToken,b=x.refreshToken;if(!d)throw new Error("No access token received");if(!b)throw new Error("No refresh token received");let m=`${a}:${t}`,f;try{const c=await g.getStatus({auth:ie(d)});c.projectName&&(m=c.projectName),c.gitBranch&&(f=c.gitBranch)}catch{}return{token:d,refreshToken:b,label:m,...f?{gitBranch:f}:{}}}function Ee(){var U;const{t:a}=K(),t=(n,p)=>a(`KnowledgeBasePanel.${n}`,p),r=O(),i=T(r.kbs$)??[],s=((U=T(r.activeSession$))==null?void 0:U.kb)??null,h=n=>{r.setActiveKb(n)},g=r.addKb.bind(r),x=r.removeKb.bind(r),d=r.updateKb.bind(r),b=(n,p,v)=>{r.signIn(n,p,v)},m=n=>{r.signOut(n)},[f,c]=o.useState(!1),[I,y]=o.useState(null),[A,w]=o.useState(!1),[M,S]=o.useState(null),[k,E]=o.useState(null),[l,C]=o.useState(!1),[D,L]=o.useState(null),[,Z]=o.useState(0);o.useEffect(()=>{i.length===0&&c(!0)},[i.length]),o.useEffect(()=>{const n=setInterval(()=>Z(p=>p+1),3e4);return()=>clearInterval(n)},[]);const G=()=>{c(!0),S(null),y(null)},V=async(n,p,v,j,N)=>{y(null),w(!0);const R=i.find(u=>u.host===n&&u.port===p);if(R){try{const{token:u,refreshToken:P,gitBranch:z}=await B(n,p,v,j,N);d(R.id,{...z?{gitBranch:z}:{}}),b(R.id,u,P),c(!1)}catch(u){y(u instanceof Error?u.message:String(u))}finally{w(!1)}return}try{const{token:u,refreshToken:P,label:z,gitBranch:$}=await B(n,p,v,j,N);g({label:z,host:n,port:p,protocol:v,email:j,...$?{gitBranch:$}:{}},u,P),c(!1)}catch(u){y(u instanceof Error?u.message:String(u))}finally{w(!1)}},Q=async(n,p)=>{const v=i.find(j=>j.id===n);if(v){E(null),C(!0);try{const{token:j,refreshToken:N,label:R,gitBranch:u}=await B(v.host,v.port,v.protocol,v.email,p);d(n,{label:R,...u?{gitBranch:u}:{}}),b(n,j,N),S(null)}catch(j){E(j instanceof Error?j.message:String(j))}finally{C(!1)}}},Y=n=>{r.getKbSessionStatus(n.id)==="authenticated"?h(n.id):(S(n.id),c(!1),E(null))};return e.jsxs("div",{className:"semiont-panel",children:[e.jsx("div",{className:"semiont-panel-header",children:e.jsxs("h2",{className:"semiont-panel-header__title",children:[e.jsx("span",{className:"semiont-panel-header__text",children:t("title")}),e.jsxs("span",{className:"semiont-panel-header__count",children:["(",i.length,")"]})]})}),e.jsxs("div",{className:"semiont-panel__content",children:[e.jsx("div",{className:"semiont-panel__list",children:i.map(n=>{const p=r.getKbSessionStatus(n.id),v=n.id===(s==null?void 0:s.id),j=M===n.id;return e.jsxs("div",{children:[e.jsxs("div",{className:`semiont-panel-item semiont-panel-item--clickable${v?" semiont-panel-item--selected":""}`,style:{display:"flex",flexDirection:"column",gap:"0.25rem",cursor:"pointer",padding:"0.5rem 0.75rem"},onClick:()=>Y(n),children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"0.5rem"},children:[e.jsx(Ne,{status:p,t}),e.jsx("span",{className:"semiont-panel-text",style:{flex:1,fontWeight:500},children:n.label}),v&&e.jsx(ve,{style:{width:"1rem",height:"1rem",color:"var(--semiont-color-primary-500)",flexShrink:0}}),p==="authenticated"&&e.jsx("button",{onClick:N=>{N.stopPropagation(),m(n.id)},title:t("signOut"),style:{background:"none",border:"none",cursor:"pointer",padding:"0.125rem",color:"var(--semiont-color-neutral-400)"},children:e.jsx(xe,{style:{width:"0.875rem",height:"0.875rem"}})}),e.jsx("button",{onClick:N=>{N.stopPropagation(),L(n.id)},title:t("remove"),style:{background:"none",border:"none",cursor:"pointer",padding:"0.125rem",color:"var(--semiont-color-neutral-400)"},children:e.jsx(he,{style:{width:"0.875rem",height:"0.875rem"}})})]}),e.jsxs("span",{className:"semiont-panel-text-secondary",style:{fontSize:"0.7rem",paddingLeft:"1rem"},children:[n.host,":",n.port,n.gitBranch?` · ${n.gitBranch}`:""]})]}),D===n.id&&e.jsxs("div",{style:{padding:"0.5rem 0.75rem",fontSize:"0.8rem",display:"flex",alignItems:"center",gap:"0.5rem",background:"var(--semiont-bg-secondary, #f9fafb)",borderBottom:"1px solid var(--semiont-color-neutral-200, #e5e7eb)"},children:[e.jsx("span",{style:{flex:1,color:"var(--semiont-color-neutral-500)"},children:t("removeConfirm",{label:n.label})}),e.jsx("button",{onClick:()=>{x(n.id),L(null)},className:"semiont-button",style:{fontSize:"0.75rem",padding:"0.2rem 0.5rem",color:"var(--semiont-color-error-500, #ef4444)"},children:t("remove")}),e.jsx("button",{onClick:()=>L(null),className:"semiont-button",style:{fontSize:"0.75rem",padding:"0.2rem 0.5rem"},children:t("cancel")})]}),j&&e.jsx(Ae,{t,kb:n,onSubmit:N=>Q(n.id,N),onCancel:()=>S(null),error:k,isSubmitting:l})]},n.id)})}),f&&e.jsx(Ie,{t,onSubmit:V,onCancel:()=>c(!1),error:I,isSubmitting:A,autoFocus:i.length===0,pulsing:i.length===0})]}),!f&&e.jsx("div",{className:"semiont-panel-footer",children:e.jsxs("button",{onClick:G,className:"semiont-panel-item semiont-panel-item--clickable",style:{width:"100%",display:"flex",alignItems:"center",gap:"0.5rem",color:"var(--semiont-color-primary-600)"},children:[e.jsx(be,{style:{width:"1rem",height:"1rem",flexShrink:0}}),e.jsx("span",{className:"semiont-panel-text",style:{color:"inherit"},children:t("addKnowledgeBase")})]})})]})}function ze({activePanel:a,theme:t,showLineNumbers:r,hoverDelayMs:i,children:s}){const{t:h}=K(),g=T(O().activeSession$),d=!!T(g==null?void 0:g.user$),b=me(),m=W(),f=ue(),[c,I]=o.useTransition(),{width:y,setWidth:A,minWidth:w,maxWidth:M}=oe(),S=o.useCallback(({locale:k})=>{f&&I(()=>{m.replace(f,{locale:k})})},[f,m,I]);return re({"settings:locale-changed":S}),!a||!s&&!le.includes(a)?null:e.jsxs("div",{className:"semiont-toolbar-panels",style:{width:`${y}px`,position:"relative"},children:[e.jsx(ce,{onResize:A,minWidth:w,maxWidth:M,position:"left",ariaLabel:"Resize right panel"}),e.jsxs("div",{className:"semiont-toolbar-panels__content",children:[s,a==="knowledge-base"&&e.jsx(Ee,{}),a==="user"&&(d?e.jsx(ye,{}):e.jsxs("div",{className:"semiont-panel",children:[e.jsx("div",{className:"semiont-panel-header",children:e.jsx("h2",{className:"semiont-panel-header__title",children:e.jsx("span",{className:"semiont-panel-header__text",children:h("UserPanel.account")})})}),e.jsx("div",{className:"semiont-panel__content",style:{padding:"1rem",textAlign:"center"},children:e.jsx("p",{style:{color:"var(--semiont-color-neutral-400)",fontSize:"0.85rem",lineHeight:1.5},children:h("AccountPanel.notAuthenticated")})})]})),a==="settings"&&e.jsx(de,{showLineNumbers:r,theme:t,hoverDelayMs:i,locale:b,isPendingLocaleChange:c})]})]})}export{be as F,ze as T};
|
|
2
|
-
//# sourceMappingURL=ToolbarPanels-DQrfch_k.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ToolbarPanels-DQrfch_k.js","sources":["../../../../node_modules/@heroicons/react/24/outline/esm/ArrowRightStartOnRectangleIcon.js","../../../../node_modules/@heroicons/react/24/outline/esm/CheckIcon.js","../../../../node_modules/@heroicons/react/24/outline/esm/PlusIcon.js","../../src/components/UserPanel.tsx","../../src/components/KnowledgeBasePanel.tsx","../../src/components/toolbar/ToolbarPanels.tsx"],"sourcesContent":["import * as React from \"react\";\nfunction ArrowRightStartOnRectangleIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M15.75 9V5.25A2.25 2.25 0 0 0 13.5 3h-6a2.25 2.25 0 0 0-2.25 2.25v13.5A2.25 2.25 0 0 0 7.5 21h6a2.25 2.25 0 0 0 2.25-2.25V15m3 0 3-3m0 0-3-3m3 3H9\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(ArrowRightStartOnRectangleIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction CheckIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"m4.5 12.75 6 6 9-13.5\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(CheckIcon);\nexport default ForwardRef;","import * as React from \"react\";\nfunction PlusIcon({\n title,\n titleId,\n ...props\n}, svgRef) {\n return /*#__PURE__*/React.createElement(\"svg\", Object.assign({\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n strokeWidth: 1.5,\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\",\n \"data-slot\": \"icon\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, /*#__PURE__*/React.createElement(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n d: \"M12 4.5v15m7.5-7.5h-15\"\n }));\n}\nconst ForwardRef = /*#__PURE__*/ React.forwardRef(PlusIcon);\nexport default ForwardRef;","import React, { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n sanitizeImageURL,\n useSessionExpiry,\n formatTime,\n useSemiont,\n useObservable,\n createSessionVM,\n useViewModel,\n} from '@semiont/react-ui';\nimport { useRouter } from '@/i18n/routing';\n\n// Fallback avatar when image fails to load or is invalid\nconst FALLBACK_AVATAR = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiIGZpbGw9IiM2QjcyODAiLz4KPHBhdGggZD0iTTE2IDE2QzE4LjIwOTEgMTYgMjAgMTQuMjA5MSAyMCAxMkMyMCA5Ljc5MDg2IDE4LjIwOTEgOCAxNiA4QzEzLjc5MDkgOCAxMiA5Ljc5MDg2IDEyIDEyQzEyIDE0LjIwOTEgMTMuNzkwOSAxNiAxNiAxNloiIGZpbGw9IiNFNUU3RUIiLz4KPHBhdGggZD0iTTI0IDI1QzI0IDIxLjY4NjMgMjAuNDE4MyAxOSAxNiAxOUMxMS41ODE3IDE5IDggMjEuNjg2MyA4IDI1IiBzdHJva2U9IiNFNUU3RUIiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPg==';\n\nexport function UserPanel() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`UserPanel.${k}`, p as any) as string;\n const semiont = useSemiont();\n const session = useObservable(semiont.activeSession$);\n const user = useObservable(session?.user$) ?? null;\n const activeKnowledgeBase = session?.kb ?? null;\n const displayName = user?.name ?? user?.email?.split('@')[0] ?? 'User';\n const avatarUrl = user?.image ?? null;\n const userDomain = user?.domain || user?.email?.split('@')[1];\n const isAdmin = user?.isAdmin ?? false;\n const isModerator = user?.isModerator ?? false;\n const apiClient = session?.client;\n const sessionVM = useViewModel(() => createSessionVM(apiClient!));\n const router = useRouter();\n const [imageError, setImageError] = useState(false);\n const { timeRemaining } = useSessionExpiry();\n const sessionTimeFormatted = formatTime(timeRemaining) ?? 'Unknown';\n\n // Sanitize and validate the profile image URL\n const profileImageUrl = (() => {\n if (!avatarUrl || imageError) {\n return FALLBACK_AVATAR;\n }\n\n const sanitized = sanitizeImageURL(avatarUrl);\n if (!sanitized) {\n console.warn('Invalid profile image URL detected, using fallback');\n return FALLBACK_AVATAR;\n }\n\n return sanitized;\n })();\n\n const handleSignOut = async () => {\n await sessionVM.logout();\n if (activeKnowledgeBase) {\n await semiont.signOut(activeKnowledgeBase.id);\n }\n router.push('/');\n };\n\n return (\n <div className=\"semiont-user-panel\">\n <h3 className=\"semiont-user-panel__title\">\n {t('account')}\n </h3>\n\n {activeKnowledgeBase && (\n <div style={{ padding: '0 0.75rem 0.5rem', fontSize: '0.8rem', color: 'var(--semiont-color-neutral-400)' }}>\n {activeKnowledgeBase.label}\n </div>\n )}\n\n <div className=\"space-y-4\">\n {/* User Profile */}\n <div className=\"flex items-center gap-3\">\n <img\n src={profileImageUrl}\n alt={t('profileAlt', { name: displayName || t('user') })}\n width={48}\n height={48}\n className=\"w-12 h-12 rounded-full object-cover\"\n onError={() => setImageError(true)}\n />\n <div className=\"flex-1 min-w-0\">\n <div className=\"semiont-panel-text\">\n {displayName || t('user')}\n </div>\n {userDomain && (\n <div className=\"semiont-panel-text-secondary\">\n @{userDomain}\n </div>\n )}\n </div>\n </div>\n\n {/* Session Info */}\n <div>\n <label className=\"semiont-panel-label\">\n {t('session')}\n </label>\n <div className=\"semiont-session-box\">\n <div className=\"semiont-panel-hint\">\n {t('expiresIn', { time: sessionTimeFormatted })}\n </div>\n </div>\n </div>\n\n {/* Privileges */}\n {(isAdmin || isModerator) && (\n <div>\n <label className=\"semiont-panel-label\">\n {t('privileges')}\n </label>\n <div className=\"space-y-1\">\n {isAdmin && (\n <div className=\"semiont-privilege-badge semiont-privilege-badge--admin\">\n <span className=\"semiont-privilege-text\">\n {t('administrator')}\n </span>\n </div>\n )}\n {isModerator && (\n <div className=\"semiont-privilege-badge semiont-privilege-badge--moderator\">\n <span className=\"semiont-privilege-text\">\n {t('moderator')}\n </span>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Sign Out Button */}\n <div className=\"semiont-panel-divider\">\n <button\n onClick={handleSignOut}\n className=\"semiont-signout-button\"\n >\n {t('signOut')}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { CheckIcon, PlusIcon, ArrowRightStartOnRectangleIcon, XMarkIcon, TrashIcon } from '@heroicons/react/24/outline';\nimport {\n SemiontApiClient,\n defaultProtocol,\n isValidHostname,\n type KnowledgeBase,\n type KbSessionStatus,\n} from '@semiont/api-client';\nimport { baseUrl, email as makeEmail, accessToken } from '@semiont/core';\nimport {\n useSemiont,\n useObservable,\n} from '@semiont/react-ui';\n\ntype T = (key: string, params?: Record<string, unknown>) => string;\n\nconst STATUS_COLORS: Record<KbSessionStatus, string> = {\n authenticated: 'var(--semiont-color-success-500, #22c55e)',\n expired: 'var(--semiont-color-warning-500, #eab308)',\n 'signed-out': 'var(--semiont-color-neutral-400, #9ca3af)',\n unreachable: 'var(--semiont-color-error-500, #ef4444)',\n};\n\nconst STATUS_KEYS: Record<KbSessionStatus, string> = {\n authenticated: 'statusConnected',\n expired: 'statusExpired',\n 'signed-out': 'statusSignedOut',\n unreachable: 'statusUnreachable',\n};\n\nfunction StatusDot({ status, t }: { status: KbSessionStatus; t: T }) {\n return (\n <span\n title={t(STATUS_KEYS[status])}\n style={{\n width: '0.5rem',\n height: '0.5rem',\n borderRadius: '50%',\n backgroundColor: STATUS_COLORS[status],\n flexShrink: 0,\n }}\n />\n );\n}\n\nfunction LoginForm({ t, onSubmit, onCancel, error, isSubmitting, autoFocus, pulsing, initialHost = 'localhost', initialPort = 4000, initialEmail = 'admin@example.com' }: {\n t: T;\n onSubmit: (host: string, port: number, protocol: 'http' | 'https', email: string, password: string) => Promise<void>;\n onCancel: () => void;\n error: string | null;\n isSubmitting: boolean;\n autoFocus?: boolean;\n pulsing?: boolean;\n initialHost?: string;\n initialPort?: number;\n initialEmail?: string;\n}) {\n const [host, setHost] = useState(initialHost);\n const [port, setPort] = useState(String(initialPort));\n const [protocol, setProtocol] = useState<'http' | 'https'>(defaultProtocol(initialHost));\n const [email, setEmail] = useState(initialEmail);\n const [password, setPassword] = useState('');\n\n const handleHostChange = (newHost: string) => {\n setHost(newHost);\n setProtocol(defaultProtocol(newHost));\n };\n\n return (\n <div\n className={pulsing ? 'semiont-panel__login-form--pulsing' : ''}\n style={{\n margin: '0.5rem',\n padding: '0.75rem',\n border: '1px solid var(--semiont-color-neutral-200, #e5e7eb)',\n borderRadius: 'var(--semiont-panel-border-radius, 0.5rem)',\n background: 'var(--semiont-bg-secondary, transparent)',\n }}\n >\n <h3 style={{ fontSize: '0.8rem', fontWeight: 600, marginBottom: '0.5rem' }}>{t('connectTitle')}</h3>\n <form onSubmit={(e) => { e.preventDefault(); if (isValidHostname(host)) onSubmit(host, parseInt(port, 10) || 4000, protocol, email, password); }} style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>\n <select value={protocol} onChange={e => setProtocol(e.target.value as 'http' | 'https')} className=\"semiont-input\">\n <option value=\"http\">HTTP</option>\n <option value=\"https\">HTTPS</option>\n </select>\n <input type=\"text\" value={host} onChange={e => handleHostChange(e.target.value)} placeholder=\"Host\" className=\"semiont-input\" autoFocus={autoFocus} />\n <input type=\"number\" value={port} onChange={e => setPort(e.target.value)} placeholder=\"Port\" className=\"semiont-input\" />\n {host && !isValidHostname(host) && (\n <div style={{ color: 'var(--semiont-color-error-500, #ef4444)', fontSize: '0.75rem' }}>{t('invalidHost')}</div>\n )}\n <input type=\"email\" value={email} onChange={e => setEmail(e.target.value)} placeholder=\"Email\" className=\"semiont-input\" />\n <input type=\"password\" value={password} onChange={e => setPassword(e.target.value)} placeholder=\"Password\" className=\"semiont-input\" />\n {error && <div style={{ color: 'var(--semiont-color-error-500, #ef4444)', fontSize: '0.75rem' }}>{error}</div>}\n <div style={{ display: 'flex', gap: '0.5rem' }}>\n <button type=\"submit\" className=\"semiont-button semiont-button--primary\" style={{ flex: 1 }} disabled={isSubmitting || !isValidHostname(host)}>\n {isSubmitting ? t('connecting') : t('connect')}\n </button>\n <button type=\"button\" className=\"semiont-button\" onClick={onCancel}>\n <XMarkIcon style={{ width: '1rem', height: '1rem' }} />\n </button>\n </div>\n </form>\n </div>\n );\n}\n\nfunction ReauthForm({ t, kb, onSubmit, onCancel, error, isSubmitting }: {\n t: T;\n kb: KnowledgeBase;\n onSubmit: (password: string) => Promise<void>;\n onCancel: () => void;\n error: string | null;\n isSubmitting: boolean;\n}) {\n const [password, setPassword] = useState('');\n\n return (\n <form onSubmit={(e) => { e.preventDefault(); onSubmit(password); }} style={{ padding: '0.5rem 0.75rem', display: 'flex', flexDirection: 'column', gap: '0.375rem' }}>\n <div style={{ fontSize: '0.75rem', color: 'var(--semiont-color-neutral-400)' }}>{kb.email}</div>\n <input type=\"password\" value={password} onChange={e => setPassword(e.target.value)} placeholder=\"Password\" className=\"semiont-input\" style={{ fontSize: '0.8rem' }} autoFocus />\n {error && <div style={{ color: 'var(--semiont-color-error-500, #ef4444)', fontSize: '0.75rem' }}>{error}</div>}\n <div style={{ display: 'flex', gap: '0.375rem' }}>\n <button type=\"submit\" className=\"semiont-button semiont-button--primary\" style={{ flex: 1, fontSize: '0.8rem' }} disabled={isSubmitting}>\n {isSubmitting ? t('signingIn') : t('signIn')}\n </button>\n <button type=\"button\" className=\"semiont-button\" onClick={onCancel} style={{ fontSize: '0.8rem' }}>\n {t('cancel')}\n </button>\n </div>\n </form>\n );\n}\n\nasync function authenticateWithBackend(host: string, port: number, protocol: 'http' | 'https', emailStr: string, password: string): Promise<{ token: string; refreshToken: string; label: string; gitBranch?: string }> {\n const origin = `${protocol}://${host}:${port}`;\n const client = new SemiontApiClient({ baseUrl: baseUrl(origin) });\n\n const authResult = await client.authenticatePassword(makeEmail(emailStr), password);\n const token = (authResult as any).token ?? (authResult as any).accessToken;\n const refreshToken = (authResult as any).refreshToken;\n if (!token) throw new Error('No access token received');\n if (!refreshToken) throw new Error('No refresh token received');\n\n let label = `${host}:${port}`;\n let gitBranch: string | undefined;\n try {\n const status = await client.getStatus({ auth: accessToken(token) });\n if ((status as any).projectName) label = (status as any).projectName;\n if ((status as any).gitBranch) gitBranch = (status as any).gitBranch;\n } catch { /* use default label */ }\n\n return { token, refreshToken, label, ...(gitBranch ? { gitBranch } : {}) };\n}\n\nexport function KnowledgeBasePanel() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`KnowledgeBasePanel.${k}`, p as any) as string;\n const semiont = useSemiont();\n const knowledgeBases = useObservable(semiont.kbs$) ?? [];\n const activeKnowledgeBase = useObservable(semiont.activeSession$)?.kb ?? null;\n const setActiveKnowledgeBase = (id: string) => { void semiont.setActiveKb(id); };\n const addKnowledgeBase = semiont.addKb.bind(semiont);\n const removeKnowledgeBase = semiont.removeKb.bind(semiont);\n const updateKnowledgeBase = semiont.updateKb.bind(semiont);\n const signIn = (id: string, access: string, refresh: string) => { void semiont.signIn(id, access, refresh); };\n const signOut = (id: string) => { void semiont.signOut(id); };\n const [showAddForm, setShowAddForm] = useState(false);\n const [addError, setAddError] = useState<string | null>(null);\n const [addSubmitting, setAddSubmitting] = useState(false);\n const [reauthKbId, setReauthKbId] = useState<string | null>(null);\n const [reauthError, setReauthError] = useState<string | null>(null);\n const [reauthSubmitting, setReauthSubmitting] = useState(false);\n const [confirmRemoveKbId, setConfirmRemoveKbId] = useState<string | null>(null);\n const [, setTick] = useState(0);\n\n useEffect(() => {\n if (knowledgeBases.length === 0) setShowAddForm(true);\n }, [knowledgeBases.length]);\n\n useEffect(() => {\n const interval = setInterval(() => setTick(t => t + 1), 30_000);\n return () => clearInterval(interval);\n }, []);\n\n const openAddForm = () => {\n setShowAddForm(true);\n setReauthKbId(null);\n setAddError(null);\n };\n\n const handleAdd = async (host: string, port: number, protocol: 'http' | 'https', email: string, password: string) => {\n setAddError(null);\n setAddSubmitting(true);\n const existing = knowledgeBases.find(kb => kb.host === host && kb.port === port);\n if (existing) {\n try {\n const { token, refreshToken, gitBranch } = await authenticateWithBackend(host, port, protocol, email, password);\n updateKnowledgeBase(existing.id, { ...(gitBranch ? { gitBranch } : {}) });\n signIn(existing.id, token, refreshToken);\n setShowAddForm(false);\n } catch (err) {\n setAddError(err instanceof Error ? err.message : String(err));\n } finally {\n setAddSubmitting(false);\n }\n return;\n }\n try {\n const { token, refreshToken, label, gitBranch } = await authenticateWithBackend(host, port, protocol, email, password);\n addKnowledgeBase({ label, host, port, protocol, email, ...(gitBranch ? { gitBranch } : {}) }, token, refreshToken);\n setShowAddForm(false);\n } catch (err) {\n setAddError(err instanceof Error ? err.message : String(err));\n } finally {\n setAddSubmitting(false);\n }\n };\n\n const handleReauth = async (kbId: string, password: string) => {\n const kb = knowledgeBases.find(k => k.id === kbId);\n if (!kb) return;\n setReauthError(null);\n setReauthSubmitting(true);\n try {\n const { token, refreshToken, label, gitBranch } = await authenticateWithBackend(kb.host, kb.port, kb.protocol, kb.email, password);\n updateKnowledgeBase(kbId, { label, ...(gitBranch ? { gitBranch } : {}) });\n signIn(kbId, token, refreshToken);\n setReauthKbId(null);\n } catch (err) {\n setReauthError(err instanceof Error ? err.message : String(err));\n } finally {\n setReauthSubmitting(false);\n }\n };\n\n const handleKbClick = (kb: KnowledgeBase) => {\n const status = semiont.getKbSessionStatus(kb.id);\n if (status === 'authenticated') {\n setActiveKnowledgeBase(kb.id);\n } else {\n setReauthKbId(kb.id);\n setShowAddForm(false);\n setReauthError(null);\n }\n };\n\n return (\n <div className=\"semiont-panel\">\n <div className=\"semiont-panel-header\">\n <h2 className=\"semiont-panel-header__title\">\n <span className=\"semiont-panel-header__text\">{t('title')}</span>\n <span className=\"semiont-panel-header__count\">({knowledgeBases.length})</span>\n </h2>\n </div>\n <div className=\"semiont-panel__content\">\n <div className=\"semiont-panel__list\">\n {knowledgeBases.map((kb: KnowledgeBase) => {\n const status = semiont.getKbSessionStatus(kb.id);\n const isActive = kb.id === activeKnowledgeBase?.id;\n const isReauthing = reauthKbId === kb.id;\n\n return (\n <div key={kb.id}>\n <div\n className={`semiont-panel-item semiont-panel-item--clickable${isActive ? ' semiont-panel-item--selected' : ''}`}\n style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem', cursor: 'pointer', padding: '0.5rem 0.75rem' }}\n onClick={() => handleKbClick(kb)}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <StatusDot status={status} t={t} />\n <span className=\"semiont-panel-text\" style={{ flex: 1, fontWeight: 500 }}>{kb.label}</span>\n {isActive && (\n <CheckIcon style={{ width: '1rem', height: '1rem', color: 'var(--semiont-color-primary-500)', flexShrink: 0 }} />\n )}\n {status === 'authenticated' && (\n <button\n onClick={(e) => { e.stopPropagation(); signOut(kb.id); }}\n title={t('signOut')}\n style={{ background: 'none', border: 'none', cursor: 'pointer', padding: '0.125rem', color: 'var(--semiont-color-neutral-400)' }}\n >\n <ArrowRightStartOnRectangleIcon style={{ width: '0.875rem', height: '0.875rem' }} />\n </button>\n )}\n <button\n onClick={(e) => { e.stopPropagation(); setConfirmRemoveKbId(kb.id); }}\n title={t('remove')}\n style={{ background: 'none', border: 'none', cursor: 'pointer', padding: '0.125rem', color: 'var(--semiont-color-neutral-400)' }}\n >\n <TrashIcon style={{ width: '0.875rem', height: '0.875rem' }} />\n </button>\n </div>\n <span className=\"semiont-panel-text-secondary\" style={{ fontSize: '0.7rem', paddingLeft: '1rem' }}>\n {kb.host}:{kb.port}{kb.gitBranch ? ` · ${kb.gitBranch}` : ''}\n </span>\n </div>\n {confirmRemoveKbId === kb.id && (\n <div style={{\n padding: '0.5rem 0.75rem',\n fontSize: '0.8rem',\n display: 'flex',\n alignItems: 'center',\n gap: '0.5rem',\n background: 'var(--semiont-bg-secondary, #f9fafb)',\n borderBottom: '1px solid var(--semiont-color-neutral-200, #e5e7eb)',\n }}>\n <span style={{ flex: 1, color: 'var(--semiont-color-neutral-500)' }}>{t('removeConfirm', { label: kb.label })}</span>\n <button\n onClick={() => { removeKnowledgeBase(kb.id); setConfirmRemoveKbId(null); }}\n className=\"semiont-button\"\n style={{ fontSize: '0.75rem', padding: '0.2rem 0.5rem', color: 'var(--semiont-color-error-500, #ef4444)' }}\n >\n {t('remove')}\n </button>\n <button\n onClick={() => setConfirmRemoveKbId(null)}\n className=\"semiont-button\"\n style={{ fontSize: '0.75rem', padding: '0.2rem 0.5rem' }}\n >\n {t('cancel')}\n </button>\n </div>\n )}\n {isReauthing && (\n <ReauthForm\n t={t}\n kb={kb}\n onSubmit={(password) => handleReauth(kb.id, password)}\n onCancel={() => setReauthKbId(null)}\n error={reauthError}\n isSubmitting={reauthSubmitting}\n />\n )}\n </div>\n );\n })}\n </div>\n\n {showAddForm && (\n <LoginForm\n t={t}\n onSubmit={handleAdd}\n onCancel={() => setShowAddForm(false)}\n error={addError}\n isSubmitting={addSubmitting}\n autoFocus={knowledgeBases.length === 0}\n pulsing={knowledgeBases.length === 0}\n />\n )}\n </div>\n\n {!showAddForm && (\n <div className=\"semiont-panel-footer\">\n <button\n onClick={openAddForm}\n className=\"semiont-panel-item semiont-panel-item--clickable\"\n style={{ width: '100%', display: 'flex', alignItems: 'center', gap: '0.5rem', color: 'var(--semiont-color-primary-600)' }}\n >\n <PlusIcon style={{ width: '1rem', height: '1rem', flexShrink: 0 }} />\n <span className=\"semiont-panel-text\" style={{ color: 'inherit' }}>{t('addKnowledgeBase')}</span>\n </button>\n </div>\n )}\n </div>\n );\n}\n","import React, { useTransition, useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n SettingsPanel,\n ResizeHandle,\n usePanelWidth,\n useEventSubscriptions,\n useSemiont,\n useObservable,\n} from '@semiont/react-ui';\nimport { UserPanel } from '../UserPanel';\nimport { KnowledgeBasePanel } from '../KnowledgeBasePanel';\nimport { useLocale } from '@/i18n/routing';\nimport { usePathname, useRouter } from '@/i18n/routing';\nimport { COMMON_PANELS } from '@semiont/react-ui';\nimport type { ToolbarPanelType } from '@semiont/react-ui';\n\ninterface ToolbarPanelsProps {\n activePanel: ToolbarPanelType | null;\n /** Theme setting */\n theme: 'light' | 'dark' | 'system';\n /** Line numbers setting */\n showLineNumbers: boolean;\n /** Hover delay setting */\n hoverDelayMs: number;\n /** Custom panel content for context-specific panels */\n children?: React.ReactNode;\n}\n\n/**\n * Renders the toolbar panel container with common panels (user, settings)\n * and any context-specific panels passed as children.\n *\n * Settings changes are handled via GlobalSettingsEventBus - no callbacks needed.\n *\n * @example\n * // Simple context (compose, discover, moderate, admin pages)\n * <ToolbarPanels\n * activePanel={activePanel}\n * theme={theme}\n * showLineNumbers={showLineNumbers}\n * />\n *\n * @example\n * // Document context with custom panels\n * <ToolbarPanels\n * activePanel={activePanel}\n * theme={theme}\n * showLineNumbers={showLineNumbers}\n * >\n * {activePanel === 'annotations' && <UnifiedAnnotationsPanel ... />}\n * {activePanel === 'history' && <AnnotationHistory ... />}\n * {activePanel === 'info' && <ResourceInfoPanel ... />}\n * {activePanel === 'collaboration' && <CollaborationPanel ... />}\n * {activePanel === 'jsonld' && <JsonLdPanel ... />}\n * </ToolbarPanels>\n */\nexport function ToolbarPanels({\n activePanel,\n theme,\n showLineNumbers,\n hoverDelayMs,\n children\n}: ToolbarPanelsProps) {\n const { t: _t } = useTranslation();\n const session = useObservable(useSemiont().activeSession$);\n const user = useObservable(session?.user$);\n const isAuthenticated = !!user;\n const locale = useLocale();\n const router = useRouter();\n const pathname = usePathname();\n const [isPending, startTransition] = useTransition();\n\n // Panel width management with localStorage persistence\n const { width, setWidth, minWidth, maxWidth } = usePanelWidth();\n\n // Handle locale change events\n const handleLocaleChanged = useCallback(({ locale: newLocale }: { locale: string }) => {\n if (!pathname) return;\n\n startTransition(() => {\n // The router from @/i18n/routing is locale-aware and will handle the locale prefix\n router.replace(pathname, { locale: newLocale });\n });\n }, [pathname, router, startTransition]);\n\n // Subscribe to locale change events\n useEventSubscriptions({\n 'settings:locale-changed': handleLocaleChanged,\n });\n\n // Don't render container if no panel is active\n if (!activePanel) {\n return null;\n }\n\n // In simple context (no children), only user and settings panels are valid.\n // If a resource-specific panel is still active from a previous route, hide the container.\n if (!children && !COMMON_PANELS.includes(activePanel)) {\n return null;\n }\n\n return (\n <div className=\"semiont-toolbar-panels\" style={{ width: `${width}px`, position: 'relative' }}>\n {/* Resize handle on left edge */}\n <ResizeHandle\n onResize={setWidth}\n minWidth={minWidth}\n maxWidth={maxWidth}\n position=\"left\"\n ariaLabel=\"Resize right panel\"\n />\n\n {/* Custom context-specific panels */}\n <div className=\"semiont-toolbar-panels__content\">\n {children}\n\n {/* Knowledge Base Panel - common to all contexts */}\n {activePanel === 'knowledge-base' && (\n <KnowledgeBasePanel />\n )}\n\n {/* User Panel - requires authentication */}\n {activePanel === 'user' && (\n isAuthenticated ? (\n <UserPanel />\n ) : (\n <div className=\"semiont-panel\">\n <div className=\"semiont-panel-header\">\n <h2 className=\"semiont-panel-header__title\">\n <span className=\"semiont-panel-header__text\">{_t('UserPanel.account')}</span>\n </h2>\n </div>\n <div className=\"semiont-panel__content\" style={{ padding: '1rem', textAlign: 'center' }}>\n <p style={{ color: 'var(--semiont-color-neutral-400)', fontSize: '0.85rem', lineHeight: 1.5 }}>\n {_t('AccountPanel.notAuthenticated')}\n </p>\n </div>\n </div>\n )\n )}\n\n {/* Settings Panel - common to all contexts */}\n {activePanel === 'settings' && (\n <SettingsPanel\n showLineNumbers={showLineNumbers}\n theme={theme}\n hoverDelayMs={hoverDelayMs}\n locale={locale}\n isPendingLocaleChange={isPending}\n />\n )}\n </div>\n </div>\n );\n}\n"],"names":["ArrowRightStartOnRectangleIcon","title","titleId","props","svgRef","React.createElement","ForwardRef","React.forwardRef","CheckIcon","PlusIcon","FALLBACK_AVATAR","UserPanel","_t","useTranslation","k","p","semiont","useSemiont","session","useObservable","user","activeKnowledgeBase","displayName","_a","avatarUrl","userDomain","_b","isAdmin","isModerator","apiClient","sessionVM","useViewModel","createSessionVM","router","useRouter","imageError","setImageError","useState","timeRemaining","useSessionExpiry","sessionTimeFormatted","formatTime","profileImageUrl","sanitized","sanitizeImageURL","handleSignOut","jsxs","jsx","STATUS_COLORS","STATUS_KEYS","StatusDot","status","LoginForm","t","onSubmit","onCancel","error","isSubmitting","autoFocus","pulsing","initialHost","initialPort","initialEmail","host","setHost","port","setPort","protocol","setProtocol","defaultProtocol","email","setEmail","password","setPassword","handleHostChange","newHost","e","isValidHostname","XMarkIcon","ReauthForm","kb","authenticateWithBackend","emailStr","origin","client","SemiontApiClient","baseUrl","authResult","makeEmail","token","refreshToken","label","gitBranch","accessToken","KnowledgeBasePanel","knowledgeBases","setActiveKnowledgeBase","id","addKnowledgeBase","removeKnowledgeBase","updateKnowledgeBase","signIn","access","refresh","signOut","showAddForm","setShowAddForm","addError","setAddError","addSubmitting","setAddSubmitting","reauthKbId","setReauthKbId","reauthError","setReauthError","reauthSubmitting","setReauthSubmitting","confirmRemoveKbId","setConfirmRemoveKbId","setTick","useEffect","interval","openAddForm","handleAdd","existing","err","handleReauth","kbId","handleKbClick","isActive","isReauthing","TrashIcon","ToolbarPanels","activePanel","theme","showLineNumbers","hoverDelayMs","children","isAuthenticated","locale","useLocale","pathname","usePathname","isPending","startTransition","useTransition","width","setWidth","minWidth","maxWidth","usePanelWidth","handleLocaleChanged","useCallback","newLocale","useEventSubscriptions","COMMON_PANELS","ResizeHandle","SettingsPanel"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{c as s,u as L,g as R,e as k,h as M,i as P,k as y,j as A,y as S,T as B,z as F}from"./index-DaA8-3Y1.js";import{r}from"./vendor-DJo4KD8w.js";import{T as V}from"./ToolbarPanels-DQrfch_k.js";import{u as j}from"./i18n-BbpF47i1.js";import"./routing-JYkXODZK.js";import"./XMarkIcon-KMKD47CF.js";function _(){var c;const{t:h}=j(),e=(o,n)=>h(`AdminExchange.${o}`,n),i=(c=s(L().activeSession$))==null?void 0:c.client,u=R(),t=k(()=>F(u,()=>i.backupKnowledgeBase(),(o,n)=>i.restoreKnowledgeBase(o,n))),d=s(t.browse.activePanel$)??null,b=s(t.selectedFile$)??null,g=s(t.preview$)??null,x=s(t.isExporting$)??!1,v=s(t.isImporting$)??!1,E=s(t.importPhase$)??null,f=s(t.importMessage$),C=s(t.importResult$),{theme:w,setTheme:l}=M(),{showLineNumbers:I,toggleLineNumbers:p}=P();y({"settings:theme-changed":r.useCallback(({theme:o})=>l(o),[l]),"settings:line-numbers-toggled":r.useCallback(()=>p(),[p])});const T=r.useCallback(async()=>{const{blob:o,filename:n}=await t.doExport(),m=URL.createObjectURL(o),a=document.createElement("a");a.href=m,a.download=n,a.click(),URL.revokeObjectURL(m)},[t]),$=r.useCallback(async()=>{await t.doImport()},[t]);return A.jsx(S,{onExport:T,isExporting:x,onFileSelected:t.selectFile,onImport:$,onCancelImport:t.cancelImport,selectedFile:b,preview:g,isImporting:v,importPhase:E,importMessage:f,importResult:C,theme:w,showLineNumbers:I,activePanel:d,translations:{title:e("title"),subtitle:e("subtitle"),export:{title:e("exportTitle"),description:e("exportDescription"),exportButton:e("exportButton"),exporting:e("exporting")},import:{title:e("importTitle"),description:e("importDescription"),dropzoneLabel:e("dropzoneLabel"),dropzoneActive:e("dropzoneActive"),detectedFormat:e("detectedFormat"),statsPreview:e("statsPreview"),importButton:e("importButton"),importing:e("importing"),importConfirmTitle:e("importConfirmTitle"),importConfirmMessage:e("importConfirmMessage"),confirmImport:e("confirmImport"),cancelImport:e("cancelImport")},progress:{phaseStarted:e("phaseStarted"),phaseEntityTypes:e("phaseEntityTypes"),phaseResources:e("phaseResources"),phaseAnnotations:e("phaseAnnotations"),phaseComplete:e("phaseComplete"),phaseError:e("phaseError"),hashChainValid:e("hashChainValid"),hashChainInvalid:e("hashChainInvalid"),streams:e("streams"),events:e("events"),blobs:e("blobs")}},ToolbarPanels:V,Toolbar:B})}export{_ as default};
|
|
2
|
-
//# sourceMappingURL=client-D9qa8fAn.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client-D9qa8fAn.js","sources":["../../src/app/[locale]/admin/exchange/client.tsx"],"sourcesContent":["import { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n Toolbar,\n useTheme,\n useShellVM,\n useObservable,\n useLineNumbers,\n useEventSubscriptions,\n useSemiont,\n useViewModel,\n AdminExchangePage,\n} from '@semiont/react-ui';\nimport { createExchangeVM } from '@semiont/api-client';\nimport { ToolbarPanels } from '@/components/toolbar/ToolbarPanels';\n\nexport default function AdminExchangeClient() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`AdminExchange.${k}`, p as any) as string;\n const client = useObservable(useSemiont().activeSession$)?.client;\n\n const browseVM = useShellVM();\n const vm = useViewModel(() => createExchangeVM(\n browseVM,\n () => client!.backupKnowledgeBase(),\n (file, opts) => client!.restoreKnowledgeBase(file, opts),\n ));\n\n const activePanel = useObservable(vm.browse.activePanel$) ?? null;\n const selectedFile = useObservable(vm.selectedFile$) ?? null;\n const preview = useObservable(vm.preview$) ?? null;\n const isExporting = useObservable(vm.isExporting$) ?? false;\n const isImporting = useObservable(vm.isImporting$) ?? false;\n const importPhase = useObservable(vm.importPhase$) ?? null;\n const importMessage = useObservable(vm.importMessage$);\n const importResult = useObservable(vm.importResult$);\n\n const { theme, setTheme } = useTheme();\n const { showLineNumbers, toggleLineNumbers } = useLineNumbers();\n\n useEventSubscriptions({\n 'settings:theme-changed': useCallback(({ theme }: { theme: 'light' | 'dark' | 'system' }) => setTheme(theme), [setTheme]),\n 'settings:line-numbers-toggled': useCallback(() => toggleLineNumbers(), [toggleLineNumbers]),\n });\n\n const handleExport = useCallback(async () => {\n const { blob, filename } = await vm.doExport();\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n }, [vm]);\n\n const handleImport = useCallback(async () => {\n await vm.doImport();\n }, [vm]);\n\n return (\n <AdminExchangePage\n onExport={handleExport}\n isExporting={isExporting}\n onFileSelected={vm.selectFile}\n onImport={handleImport}\n onCancelImport={vm.cancelImport}\n selectedFile={selectedFile}\n preview={preview}\n isImporting={isImporting}\n importPhase={importPhase}\n importMessage={importMessage}\n importResult={importResult}\n theme={theme}\n showLineNumbers={showLineNumbers}\n activePanel={activePanel}\n translations={{\n title: t('title'),\n subtitle: t('subtitle'),\n export: {\n title: t('exportTitle'),\n description: t('exportDescription'),\n exportButton: t('exportButton'),\n exporting: t('exporting'),\n },\n import: {\n title: t('importTitle'),\n description: t('importDescription'),\n dropzoneLabel: t('dropzoneLabel'),\n dropzoneActive: t('dropzoneActive'),\n detectedFormat: t('detectedFormat'),\n statsPreview: t('statsPreview'),\n importButton: t('importButton'),\n importing: t('importing'),\n importConfirmTitle: t('importConfirmTitle'),\n importConfirmMessage: t('importConfirmMessage'),\n confirmImport: t('confirmImport'),\n cancelImport: t('cancelImport'),\n },\n progress: {\n phaseStarted: t('phaseStarted'),\n phaseEntityTypes: t('phaseEntityTypes'),\n phaseResources: t('phaseResources'),\n phaseAnnotations: t('phaseAnnotations'),\n phaseComplete: t('phaseComplete'),\n phaseError: t('phaseError'),\n hashChainValid: t('hashChainValid'),\n hashChainInvalid: t('hashChainInvalid'),\n streams: t('streams'),\n events: t('events'),\n blobs: t('blobs'),\n },\n }}\n ToolbarPanels={ToolbarPanels}\n Toolbar={Toolbar}\n />\n );\n}\n"],"names":["AdminExchangeClient","_t","useTranslation","t","k","p","client","_a","useObservable","useSemiont","browseVM","useShellVM","vm","useViewModel","createExchangeVM","file","opts","activePanel","selectedFile","preview","isExporting","isImporting","importPhase","importMessage","importResult","theme","setTheme","useTheme","showLineNumbers","toggleLineNumbers","useLineNumbers","useEventSubscriptions","useCallback","handleExport","blob","filename","url","handleImport","jsx","AdminExchangePage","ToolbarPanels","Toolbar"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{c as s,u as k,g as $,e as M,h as R,i as P,k as S,j as y,L as B,T as F,z as V}from"./index-DaA8-3Y1.js";import{r as a}from"./vendor-DJo4KD8w.js";import{T as j}from"./ToolbarPanels-DQrfch_k.js";import{u as z}from"./i18n-BbpF47i1.js";import"./routing-JYkXODZK.js";import"./XMarkIcon-KMKD47CF.js";function _(){var c;const{t:h}=z(),e=(o,n)=>h(`ModerationLinkedData.${o}`,n),r=(c=s(k().activeSession$))==null?void 0:c.client,u=$(),t=M(()=>V(u,o=>r.exportKnowledgeBase(o),(o,n)=>r.importKnowledgeBase(o,n))),d=s(t.browse.activePanel$)??null,b=s(t.selectedFile$)??null,g=s(t.preview$)??null,x=s(t.isExporting$)??!1,v=s(t.isImporting$)??!1,f=s(t.importPhase$)??null,C=s(t.importMessage$),E=s(t.importResult$),{theme:w,setTheme:l}=R(),{showLineNumbers:I,toggleLineNumbers:p}=P();S({"settings:theme-changed":a.useCallback(({theme:o})=>l(o),[l]),"settings:line-numbers-toggled":a.useCallback(()=>p(),[p])});const L=a.useCallback(async()=>{const{blob:o,filename:n}=await t.doExport(),m=URL.createObjectURL(o),i=document.createElement("a");i.href=m,i.download=n,i.click(),URL.revokeObjectURL(m)},[t]),T=a.useCallback(async()=>{await t.doImport()},[t]);return y.jsx(B,{onExport:L,isExporting:x,onFileSelected:t.selectFile,onImport:T,onCancelImport:t.cancelImport,selectedFile:b,preview:g,isImporting:v,importPhase:f,importMessage:C,importResult:E,theme:w,showLineNumbers:I,activePanel:d,translations:{title:e("title"),subtitle:e("subtitle"),export:{title:e("exportTitle"),description:e("exportDescription"),exportButton:e("exportButton"),exporting:e("exporting")},import:{title:e("importTitle"),description:e("importDescription"),dropzoneLabel:e("dropzoneLabel"),dropzoneActive:e("dropzoneActive"),detectedFormat:e("detectedFormat"),statsPreview:e("statsPreview"),importButton:e("importButton"),importing:e("importing"),importConfirmTitle:e("importConfirmTitle"),importConfirmMessage:e("importConfirmMessage"),confirmImport:e("confirmImport"),cancelImport:e("cancelImport")},progress:{phaseStarted:e("phaseStarted"),phaseEntityTypes:e("phaseEntityTypes"),phaseResources:e("phaseResources"),phaseAnnotations:e("phaseAnnotations"),phaseComplete:e("phaseComplete"),phaseError:e("phaseError"),hashChainValid:e("hashChainValid"),hashChainInvalid:e("hashChainInvalid"),streams:e("streams"),events:e("events"),blobs:e("blobs")}},ToolbarPanels:j,Toolbar:F})}export{_ as default};
|
|
2
|
-
//# sourceMappingURL=client-kIBNRH2w.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client-kIBNRH2w.js","sources":["../../src/app/[locale]/moderate/linked-data/client.tsx"],"sourcesContent":["import { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n Toolbar,\n useTheme,\n useShellVM,\n useObservable,\n useLineNumbers,\n useEventSubscriptions,\n useSemiont,\n useViewModel,\n LinkedDataPage,\n} from '@semiont/react-ui';\nimport { createExchangeVM } from '@semiont/api-client';\nimport { ToolbarPanels } from '@/components/toolbar/ToolbarPanels';\n\nexport default function LinkedDataClient() {\n const { t: _t } = useTranslation();\n const t = (k: string, p?: Record<string, unknown>) => _t(`ModerationLinkedData.${k}`, p as any) as string;\n const client = useObservable(useSemiont().activeSession$)?.client;\n\n const browseVM = useShellVM();\n const vm = useViewModel(() => createExchangeVM(\n browseVM,\n (params) => client!.exportKnowledgeBase(params),\n (file, opts) => client!.importKnowledgeBase(file, opts),\n ));\n\n const activePanel = useObservable(vm.browse.activePanel$) ?? null;\n const selectedFile = useObservable(vm.selectedFile$) ?? null;\n const preview = useObservable(vm.preview$) ?? null;\n const isExporting = useObservable(vm.isExporting$) ?? false;\n const isImporting = useObservable(vm.isImporting$) ?? false;\n const importPhase = useObservable(vm.importPhase$) ?? null;\n const importMessage = useObservable(vm.importMessage$);\n const importResult = useObservable(vm.importResult$);\n\n const { theme, setTheme } = useTheme();\n const { showLineNumbers, toggleLineNumbers } = useLineNumbers();\n\n useEventSubscriptions({\n 'settings:theme-changed': useCallback(({ theme }: { theme: 'light' | 'dark' | 'system' }) => setTheme(theme), [setTheme]),\n 'settings:line-numbers-toggled': useCallback(() => toggleLineNumbers(), [toggleLineNumbers]),\n });\n\n const handleExport = useCallback(async () => {\n const { blob, filename } = await vm.doExport();\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n }, [vm]);\n\n const handleImport = useCallback(async () => {\n await vm.doImport();\n }, [vm]);\n\n return (\n <LinkedDataPage\n onExport={handleExport}\n isExporting={isExporting}\n onFileSelected={vm.selectFile}\n onImport={handleImport}\n onCancelImport={vm.cancelImport}\n selectedFile={selectedFile}\n preview={preview}\n isImporting={isImporting}\n importPhase={importPhase}\n importMessage={importMessage}\n importResult={importResult}\n theme={theme}\n showLineNumbers={showLineNumbers}\n activePanel={activePanel}\n translations={{\n title: t('title'),\n subtitle: t('subtitle'),\n export: {\n title: t('exportTitle'),\n description: t('exportDescription'),\n exportButton: t('exportButton'),\n exporting: t('exporting'),\n },\n import: {\n title: t('importTitle'),\n description: t('importDescription'),\n dropzoneLabel: t('dropzoneLabel'),\n dropzoneActive: t('dropzoneActive'),\n detectedFormat: t('detectedFormat'),\n statsPreview: t('statsPreview'),\n importButton: t('importButton'),\n importing: t('importing'),\n importConfirmTitle: t('importConfirmTitle'),\n importConfirmMessage: t('importConfirmMessage'),\n confirmImport: t('confirmImport'),\n cancelImport: t('cancelImport'),\n },\n progress: {\n phaseStarted: t('phaseStarted'),\n phaseEntityTypes: t('phaseEntityTypes'),\n phaseResources: t('phaseResources'),\n phaseAnnotations: t('phaseAnnotations'),\n phaseComplete: t('phaseComplete'),\n phaseError: t('phaseError'),\n hashChainValid: t('hashChainValid'),\n hashChainInvalid: t('hashChainInvalid'),\n streams: t('streams'),\n events: t('events'),\n blobs: t('blobs'),\n },\n }}\n ToolbarPanels={ToolbarPanels}\n Toolbar={Toolbar}\n />\n );\n}\n"],"names":["LinkedDataClient","_t","useTranslation","t","k","p","client","_a","useObservable","useSemiont","browseVM","useShellVM","vm","useViewModel","createExchangeVM","params","file","opts","activePanel","selectedFile","preview","isExporting","isImporting","importPhase","importMessage","importResult","theme","setTheme","useTheme","showLineNumbers","toggleLineNumbers","useLineNumbers","useEventSubscriptions","useCallback","handleExport","blob","filename","url","a","handleImport","jsx","LinkedDataPage","ToolbarPanels","Toolbar"],"mappings":"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"}
|