@semiont/react-ui 0.4.7 → 0.4.9
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/{PdfAnnotationCanvas.client-LF6DDTCV.mjs → PdfAnnotationCanvas.client-CW6SKH2U.mjs} +7 -25
- package/dist/PdfAnnotationCanvas.client-CW6SKH2U.mjs.map +1 -0
- package/dist/{EventBusContext-DUIMowqQ.d.mts → TranslationManager-CudgH3gw.d.mts} +1 -74
- package/dist/{ar-3URRW77J.mjs → ar-R4CRNXEF.mjs} +3 -2
- package/dist/ar-R4CRNXEF.mjs.map +1 -0
- package/dist/{bn-DCQD3XZ5.mjs → bn-CZKGRHTA.mjs} +3 -2
- package/dist/bn-CZKGRHTA.mjs.map +1 -0
- package/dist/{chunk-XMCUHQ2Y.mjs → chunk-BQJWOK4C.mjs} +15 -34
- package/dist/chunk-BQJWOK4C.mjs.map +1 -0
- package/dist/{chunk-5JZFKRLW.mjs → chunk-HNZOXH4L.mjs} +33 -35
- package/dist/chunk-HNZOXH4L.mjs.map +1 -0
- package/dist/{chunk-PWIVZQ4X.mjs → chunk-HVMAGUFA.mjs} +3 -2
- package/dist/chunk-HVMAGUFA.mjs.map +1 -0
- package/dist/{chunk-4RMWYJUJ.mjs → chunk-OL5UST25.mjs} +31 -31
- package/dist/{cs-23KOZUFE.mjs → cs-4WIB2IHH.mjs} +3 -2
- package/dist/cs-4WIB2IHH.mjs.map +1 -0
- package/dist/{da-OIQ66A42.mjs → da-JWYEUYPX.mjs} +3 -2
- package/dist/da-JWYEUYPX.mjs.map +1 -0
- package/dist/{de-FCCLKE2X.mjs → de-GWUQZGER.mjs} +3 -2
- package/dist/de-GWUQZGER.mjs.map +1 -0
- package/dist/{el-3ADITCGI.mjs → el-DM2GT7P5.mjs} +3 -2
- package/dist/el-DM2GT7P5.mjs.map +1 -0
- package/dist/{en-LNW2A3RA.mjs → en-IUV4ZXKH.mjs} +2 -2
- package/dist/{es-POQEEYIW.mjs → es-6LVQIM3D.mjs} +3 -2
- package/dist/es-6LVQIM3D.mjs.map +1 -0
- package/dist/{fa-RQPXVELG.mjs → fa-IRUJY3QI.mjs} +3 -2
- package/dist/fa-IRUJY3QI.mjs.map +1 -0
- package/dist/{fi-UXOVOUGT.mjs → fi-53FBOEVT.mjs} +3 -2
- package/dist/fi-53FBOEVT.mjs.map +1 -0
- package/dist/{fr-6W2T3R7G.mjs → fr-Q5KY7QL6.mjs} +3 -2
- package/dist/fr-Q5KY7QL6.mjs.map +1 -0
- package/dist/{he-65UHPZIU.mjs → he-HJNKULBY.mjs} +3 -2
- package/dist/he-HJNKULBY.mjs.map +1 -0
- package/dist/{hi-SGJIVPTN.mjs → hi-UYZ4X6CR.mjs} +3 -2
- package/dist/hi-UYZ4X6CR.mjs.map +1 -0
- package/dist/{id-EYJJQCS2.mjs → id-UAQMH6U2.mjs} +3 -2
- package/dist/id-UAQMH6U2.mjs.map +1 -0
- package/dist/index.css +48 -0
- package/dist/index.css.map +1 -1
- package/dist/index.d.mts +176 -125
- package/dist/index.mjs +556 -781
- package/dist/index.mjs.map +1 -1
- package/dist/{it-IZGQEDO7.mjs → it-C7QEBNFA.mjs} +3 -2
- package/dist/it-C7QEBNFA.mjs.map +1 -0
- package/dist/{ja-SR272JSY.mjs → ja-THS6AOSJ.mjs} +3 -2
- package/dist/ja-THS6AOSJ.mjs.map +1 -0
- package/dist/{ko-YWTXVVXE.mjs → ko-XKK3TWQG.mjs} +3 -2
- package/dist/ko-XKK3TWQG.mjs.map +1 -0
- package/dist/{ms-3K2XSJGM.mjs → ms-GSK7LIF7.mjs} +3 -2
- package/dist/ms-GSK7LIF7.mjs.map +1 -0
- package/dist/{nl-YIGP4SLE.mjs → nl-KUBWITGY.mjs} +3 -2
- package/dist/nl-KUBWITGY.mjs.map +1 -0
- package/dist/{no-IFYIL3ND.mjs → no-ECWZUHT6.mjs} +3 -2
- package/dist/no-ECWZUHT6.mjs.map +1 -0
- package/dist/{pl-6MWSASJR.mjs → pl-PLVWSZWS.mjs} +3 -2
- package/dist/pl-PLVWSZWS.mjs.map +1 -0
- package/dist/{pt-NZNN6WUN.mjs → pt-AL74ZTKB.mjs} +3 -2
- package/dist/pt-AL74ZTKB.mjs.map +1 -0
- package/dist/{ro-NF3SMUJS.mjs → ro-WTPHLHGS.mjs} +3 -2
- package/dist/ro-WTPHLHGS.mjs.map +1 -0
- package/dist/{sv-ZHM7GSTD.mjs → sv-QCLI7SG4.mjs} +3 -2
- package/dist/sv-QCLI7SG4.mjs.map +1 -0
- package/dist/test-utils.d.mts +1 -4
- package/dist/test-utils.mjs +4 -6
- package/dist/test-utils.mjs.map +1 -1
- package/dist/{th-LX4NO5BJ.mjs → th-WCKVZU6U.mjs} +3 -2
- package/dist/th-WCKVZU6U.mjs.map +1 -0
- package/dist/{tr-DZ4GDSRR.mjs → tr-2CAFS2XS.mjs} +3 -2
- package/dist/tr-2CAFS2XS.mjs.map +1 -0
- package/dist/{uk-KC5KVVBY.mjs → uk-TDE4JLCY.mjs} +3 -2
- package/dist/uk-TDE4JLCY.mjs.map +1 -0
- package/dist/{vi-KNCR3OXZ.mjs → vi-KKXZ4PCX.mjs} +3 -2
- package/dist/vi-KKXZ4PCX.mjs.map +1 -0
- package/dist/{zh-M2HV2A27.mjs → zh-VH4XN5PV.mjs} +3 -2
- package/dist/zh-VH4XN5PV.mjs.map +1 -0
- package/package.json +1 -1
- package/src/components/Toolbar.tsx +15 -0
- package/src/components/__tests__/AnnotateReferencesProgressWidget.test.tsx +2 -6
- package/src/components/__tests__/Toolbar.test.tsx +2 -6
- package/src/components/annotation/__tests__/AnnotateToolbar.test.tsx +1 -2
- package/src/components/image-annotation/SvgDrawingCanvas.tsx +4 -7
- package/src/components/modals/ConfigureGenerationStep.tsx +54 -60
- package/src/components/modals/ReferenceWizardModal.tsx +3 -3
- package/src/components/navigation/__tests__/ObservableLink.test.tsx +2 -6
- package/src/components/navigation/__tests__/SimpleNavigation.test.tsx +2 -6
- package/src/components/pdf-annotation/PdfAnnotationCanvas.tsx +3 -9
- package/src/components/resource/AnnotateView.tsx +4 -5
- package/src/components/resource/AnnotationHistory.tsx +2 -5
- package/src/components/resource/BrowseView.tsx +2 -3
- package/src/components/resource/HistoryEvent.tsx +3 -3
- package/src/components/resource/__tests__/BrowseView.test.tsx +1 -2
- package/src/components/resource/__tests__/ResourceViewer.mode-switch.test.tsx +8 -8
- package/src/components/resource/event-formatting.ts +22 -19
- package/src/components/resource/panels/__tests__/AssessmentEntry.test.tsx +1 -2
- package/src/components/resource/panels/__tests__/AssessmentPanel.test.tsx +1 -2
- package/src/components/resource/panels/__tests__/AssistSection.test.tsx +0 -2
- package/src/components/resource/panels/__tests__/CommentEntry.test.tsx +1 -2
- package/src/components/resource/panels/__tests__/CommentsPanel.test.tsx +1 -2
- package/src/components/resource/panels/__tests__/HighlightEntry.test.tsx +1 -2
- package/src/components/resource/panels/__tests__/HighlightPanel.annotationProgress.test.tsx +0 -2
- package/src/components/resource/panels/__tests__/ReferenceEntry.test.tsx +1 -2
- package/src/components/resource/panels/__tests__/ReferencesPanel.test.tsx +1 -2
- package/src/components/resource/panels/__tests__/ResourceInfoPanel.test.tsx +1 -2
- package/src/components/resource/panels/__tests__/TagEntry.test.tsx +1 -2
- package/src/components/resource/panels/__tests__/TaggingPanel.test.tsx +1 -2
- package/src/components/settings/__tests__/SettingsPanel.test.tsx +1 -2
- package/src/components/viewers/ImageViewer.tsx +2 -8
- package/src/components/viewers/__tests__/ImageViewer.test.tsx +3 -16
- package/src/features/auth/__tests__/SignInForm.a11y.test.tsx +8 -0
- package/src/features/auth/auth.css +62 -0
- package/src/features/auth/components/SignInForm.tsx +139 -29
- package/src/features/resource-compose/__tests__/ResourceComposePage.test.tsx +2 -6
- package/src/features/resource-discovery/__tests__/ResourceDiscoveryPage.test.tsx +1 -2
- package/src/features/resource-viewer/__tests__/AnnotationCreationPending.test.tsx +1 -2
- package/src/features/resource-viewer/__tests__/AnnotationDeletionIntegration.test.tsx +1 -2
- package/src/features/resource-viewer/__tests__/AnnotationProgressDismissal.test.tsx +1 -2
- package/src/features/resource-viewer/__tests__/BindFlowIntegration.test.tsx +1 -2
- package/src/features/resource-viewer/__tests__/DetectionFlowBug.test.tsx +1 -2
- package/src/features/resource-viewer/__tests__/DetectionFlowIntegration.test.tsx +1 -2
- package/src/features/resource-viewer/__tests__/ResourceMutations.test.tsx +9 -10
- package/src/features/resource-viewer/__tests__/ResourceViewerPage.test.tsx +9 -6
- package/src/features/resource-viewer/__tests__/ToastNotifications.test.tsx +2 -12
- package/src/features/resource-viewer/__tests__/YieldFlowIntegration.test.tsx +1 -2
- package/src/features/resource-viewer/__tests__/annotation-progress-flow.test.tsx +16 -6
- package/src/features/resource-viewer/components/ResourceViewerPage.tsx +45 -75
- package/src/styles/core/forms.css +32 -0
- package/src/styles/core/sliders.css +5 -0
- package/translations/ar.json +3 -2
- package/translations/bn.json +3 -2
- package/translations/cs.json +3 -2
- package/translations/da.json +3 -2
- package/translations/de.json +3 -2
- package/translations/el.json +3 -2
- package/translations/en.json +4 -3
- package/translations/es.json +3 -2
- package/translations/fa.json +3 -2
- package/translations/fi.json +3 -2
- package/translations/fr.json +3 -2
- package/translations/he.json +3 -2
- package/translations/hi.json +3 -2
- package/translations/id.json +3 -2
- package/translations/it.json +3 -2
- package/translations/ja.json +3 -2
- package/translations/ko.json +3 -2
- package/translations/ms.json +3 -2
- package/translations/nl.json +3 -2
- package/translations/no.json +3 -2
- package/translations/pl.json +3 -2
- package/translations/pt.json +3 -2
- package/translations/ro.json +3 -2
- package/translations/sv.json +3 -2
- package/translations/th.json +3 -2
- package/translations/tr.json +3 -2
- package/translations/uk.json +3 -2
- package/translations/vi.json +3 -2
- package/translations/zh.json +3 -2
- package/dist/PdfAnnotationCanvas.client-LF6DDTCV.mjs.map +0 -1
- package/dist/ar-3URRW77J.mjs.map +0 -1
- package/dist/bn-DCQD3XZ5.mjs.map +0 -1
- package/dist/chunk-5JZFKRLW.mjs.map +0 -1
- package/dist/chunk-PWIVZQ4X.mjs.map +0 -1
- package/dist/chunk-XMCUHQ2Y.mjs.map +0 -1
- package/dist/cs-23KOZUFE.mjs.map +0 -1
- package/dist/da-OIQ66A42.mjs.map +0 -1
- package/dist/de-FCCLKE2X.mjs.map +0 -1
- package/dist/el-3ADITCGI.mjs.map +0 -1
- package/dist/es-POQEEYIW.mjs.map +0 -1
- package/dist/fa-RQPXVELG.mjs.map +0 -1
- package/dist/fi-UXOVOUGT.mjs.map +0 -1
- package/dist/fr-6W2T3R7G.mjs.map +0 -1
- package/dist/he-65UHPZIU.mjs.map +0 -1
- package/dist/hi-SGJIVPTN.mjs.map +0 -1
- package/dist/id-EYJJQCS2.mjs.map +0 -1
- package/dist/it-IZGQEDO7.mjs.map +0 -1
- package/dist/ja-SR272JSY.mjs.map +0 -1
- package/dist/ko-YWTXVVXE.mjs.map +0 -1
- package/dist/ms-3K2XSJGM.mjs.map +0 -1
- package/dist/nl-YIGP4SLE.mjs.map +0 -1
- package/dist/no-IFYIL3ND.mjs.map +0 -1
- package/dist/pl-6MWSASJR.mjs.map +0 -1
- package/dist/pt-NZNN6WUN.mjs.map +0 -1
- package/dist/ro-NF3SMUJS.mjs.map +0 -1
- package/dist/sv-ZHM7GSTD.mjs.map +0 -1
- package/dist/th-LX4NO5BJ.mjs.map +0 -1
- package/dist/tr-DZ4GDSRR.mjs.map +0 -1
- package/dist/uk-KC5KVVBY.mjs.map +0 -1
- package/dist/vi-KNCR3OXZ.mjs.map +0 -1
- package/dist/zh-M2HV2A27.mjs.map +0 -1
- /package/dist/{chunk-4RMWYJUJ.mjs.map → chunk-OL5UST25.mjs.map} +0 -0
- /package/dist/{en-LNW2A3RA.mjs.map → en-IUV4ZXKH.mjs.map} +0 -0
package/dist/{PdfAnnotationCanvas.client-LF6DDTCV.mjs → PdfAnnotationCanvas.client-CW6SKH2U.mjs}
RENAMED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
"use client";
|
|
3
3
|
import {
|
|
4
4
|
createHoverHandlers
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-BQJWOK4C.mjs";
|
|
6
|
+
import "./chunk-HNZOXH4L.mjs";
|
|
7
7
|
import "./chunk-D4GAAQMM.mjs";
|
|
8
8
|
|
|
9
9
|
// src/components/pdf-annotation/PdfAnnotationCanvas.tsx
|
|
@@ -90,25 +90,10 @@ async function ensurePdfJs() {
|
|
|
90
90
|
document.head.appendChild(script);
|
|
91
91
|
});
|
|
92
92
|
}
|
|
93
|
-
async function loadPdfDocument(
|
|
93
|
+
async function loadPdfDocument(url) {
|
|
94
94
|
const pdfjsLib = await ensurePdfJs();
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
credentials: "include",
|
|
98
|
-
headers: {
|
|
99
|
-
"Accept": "application/pdf"
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
if (!response.ok) {
|
|
103
|
-
throw new Error(`Failed to fetch PDF: ${response.status} ${response.statusText}`);
|
|
104
|
-
}
|
|
105
|
-
const arrayBuffer = await response.arrayBuffer();
|
|
106
|
-
const loadingTask = pdfjsLib.getDocument({ data: arrayBuffer });
|
|
107
|
-
return loadingTask.promise;
|
|
108
|
-
} else {
|
|
109
|
-
const loadingTask = pdfjsLib.getDocument({ data: source });
|
|
110
|
-
return loadingTask.promise;
|
|
111
|
-
}
|
|
95
|
+
const loadingTask = pdfjsLib.getDocument({ url });
|
|
96
|
+
return loadingTask.promise;
|
|
112
97
|
}
|
|
113
98
|
async function renderPdfPageToDataUrl(page, scale = 1) {
|
|
114
99
|
const viewport = page.getViewport({ scale });
|
|
@@ -151,7 +136,7 @@ function getMotivationColor(motivation) {
|
|
|
151
136
|
}
|
|
152
137
|
}
|
|
153
138
|
function PdfAnnotationCanvas({
|
|
154
|
-
|
|
139
|
+
pdfUrl,
|
|
155
140
|
existingAnnotations = [],
|
|
156
141
|
drawingMode,
|
|
157
142
|
selectedMotivation,
|
|
@@ -160,9 +145,6 @@ function PdfAnnotationCanvas({
|
|
|
160
145
|
selectedAnnotationId,
|
|
161
146
|
hoverDelayMs = 150
|
|
162
147
|
}) {
|
|
163
|
-
const pdfUrl = useMemo(() => {
|
|
164
|
-
return `/api/resources/${resourceUri}`;
|
|
165
|
-
}, [resourceUri]);
|
|
166
148
|
const [pdfDoc, setPdfDoc] = useState(null);
|
|
167
149
|
const [numPages, setNumPages] = useState(0);
|
|
168
150
|
const [pageNumber, setPageNumber] = useState(1);
|
|
@@ -505,4 +487,4 @@ function PdfAnnotationCanvas({
|
|
|
505
487
|
export {
|
|
506
488
|
PdfAnnotationCanvas
|
|
507
489
|
};
|
|
508
|
-
//# sourceMappingURL=PdfAnnotationCanvas.client-
|
|
490
|
+
//# sourceMappingURL=PdfAnnotationCanvas.client-CW6SKH2U.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/pdf-annotation/PdfAnnotationCanvas.tsx","../src/lib/pdf-coordinates.ts","../src/lib/browser-pdfjs.ts"],"sourcesContent":["'use client';\n\nimport React, { useRef, useState, useCallback, useEffect, useMemo } from 'react';\nimport { createHoverHandlers } from '../../hooks/useBeckonFlow';\nimport type { components } from '@semiont/core';\nimport { getTargetSelector } from '@semiont/api-client';\nimport type { SelectionMotivation } from '../annotation/AnnotateToolbar';\nimport type { EventBus } from \"@semiont/core\"\nimport {\n canvasToPdfCoordinates,\n pdfToCanvasCoordinates,\n createFragmentSelector,\n parseFragmentSelector,\n getPageFromFragment,\n type CanvasRectangle\n} from '../../lib/pdf-coordinates';\nimport {\n loadPdfDocument,\n renderPdfPageToDataUrl,\n type PDFDocumentProxy\n} from '../../lib/browser-pdfjs';\nimport './PdfAnnotationCanvas.css';\n\ntype Annotation = components['schemas']['Annotation'];\n\nexport type DrawingMode = 'rectangle' | 'circle' | 'polygon' | null;\n\n/**\n * Get color for annotation based on motivation\n */\nfunction getMotivationColor(motivation: SelectionMotivation | null): { stroke: string; fill: string } {\n if (!motivation) {\n return { stroke: 'rgb(156, 163, 175)', fill: 'rgba(156, 163, 175, 0.2)' };\n }\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}\n\ninterface PdfAnnotationCanvasProps {\n pdfUrl: string;\n existingAnnotations?: Annotation[];\n drawingMode: DrawingMode;\n selectedMotivation?: SelectionMotivation | null;\n eventBus?: EventBus;\n hoveredAnnotationId?: string | null;\n selectedAnnotationId?: string | null;\n hoverDelayMs?: number;\n}\n\n/**\n * PDF annotation canvas with page navigation and rectangle drawing\n *\n * @emits browse:click - Annotation clicked on PDF. Payload: { annotationId: string, motivation: Motivation }\n * @emits mark:requested - New annotation drawn on PDF. Payload: { selector: FragmentSelector, motivation: SelectionMotivation }\n * @emits beckon:hover - Annotation hovered or unhovered. Payload: { annotationId: string | null }\n */\nexport function PdfAnnotationCanvas({\n pdfUrl,\n existingAnnotations = [],\n drawingMode,\n selectedMotivation,\n eventBus,\n hoveredAnnotationId,\n selectedAnnotationId,\n hoverDelayMs = 150\n}: PdfAnnotationCanvasProps) {\n // PDF state\n const [pdfDoc, setPdfDoc] = useState<PDFDocumentProxy | null>(null);\n const [numPages, setNumPages] = useState<number>(0);\n const [pageNumber, setPageNumber] = useState(1);\n const [pageImageUrl, setPageImageUrl] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [pageDimensions, setPageDimensions] = useState<{ width: number; height: number } | null>(null);\n const [displayDimensions, setDisplayDimensions] = useState<{ width: number; height: number } | null>(null);\n const [scale] = useState(1.5); // Fixed scale for better quality\n\n // Drawing state\n const [isDrawing, setIsDrawing] = useState(false);\n const [selection, setSelection] = useState<CanvasRectangle | null>(null);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const imageRef = useRef<HTMLImageElement>(null);\n\n // Load PDF document on mount\n useEffect(() => {\n let cancelled = false;\n\n async function loadPdf() {\n try {\n setIsLoading(true);\n setError(null);\n\n const doc = await loadPdfDocument(pdfUrl);\n\n if (cancelled) return;\n\n setPdfDoc(doc);\n setNumPages(doc.numPages);\n setIsLoading(false);\n } catch (err) {\n if (cancelled) return;\n\n console.error('Error loading PDF:', err);\n setError('Failed to load PDF');\n setIsLoading(false);\n }\n }\n\n loadPdf();\n\n return () => {\n cancelled = true;\n };\n }, [pdfUrl]);\n\n // Load current page when page number changes\n useEffect(() => {\n if (!pdfDoc) return;\n\n let cancelled = false;\n const doc = pdfDoc;\n\n async function loadPage() {\n try {\n const page = await doc.getPage(pageNumber);\n\n if (cancelled) return;\n\n // Get page dimensions (at scale 1.0)\n const viewport = page.getViewport({ scale: 1.0 });\n setPageDimensions({\n width: viewport.width,\n height: viewport.height\n });\n\n // Render page to image\n const { dataUrl } = await renderPdfPageToDataUrl(page, scale);\n\n if (cancelled) return;\n\n setPageImageUrl(dataUrl);\n } catch (err) {\n if (cancelled) return;\n\n console.error('Error loading page:', err);\n setError('Failed to load page');\n }\n }\n\n loadPage();\n\n return () => {\n cancelled = true;\n };\n }, [pdfDoc, pageNumber, scale]);\n\n // Update display dimensions on resize\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\n updateDisplayDimensions();\n\n // Use ResizeObserver to detect image element size changes\n // This catches: sidebar open/close, window resize, font size changes, etc.\n let resizeObserver: ResizeObserver | null = null;\n\n try {\n resizeObserver = new ResizeObserver(updateDisplayDimensions);\n if (imageRef.current) {\n resizeObserver.observe(imageRef.current);\n }\n } catch (error) {\n // Fallback for browsers without ResizeObserver support\n console.warn('ResizeObserver not supported, falling back to window resize listener');\n window.addEventListener('resize', updateDisplayDimensions);\n }\n\n return () => {\n if (resizeObserver) {\n resizeObserver.disconnect();\n } else {\n window.removeEventListener('resize', updateDisplayDimensions);\n }\n };\n }, [pageImageUrl]);\n\n // Mouse event handlers for drawing\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n if (!drawingMode) return;\n if (!imageRef.current) return;\n\n const rect = imageRef.current.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n\n // Clear any previous selection when starting new drawing\n setIsDrawing(true);\n setSelection({\n startX: x,\n startY: y,\n endX: x,\n endY: y\n });\n }, [drawingMode]);\n\n const handleMouseMove = useCallback((e: React.MouseEvent) => {\n if (!isDrawing || !selection || !imageRef.current) return;\n\n const rect = imageRef.current.getBoundingClientRect();\n\n setSelection({\n ...selection,\n endX: e.clientX - rect.left,\n endY: e.clientY - rect.top\n });\n }, [isDrawing, selection]);\n\n const handleMouseUp = useCallback(() => {\n if (!isDrawing || !selection || !pageDimensions || !displayDimensions || !eventBus) {\n setIsDrawing(false);\n setSelection(null);\n return;\n }\n\n // Calculate drag distance\n const dragDistance = Math.sqrt(\n Math.pow(selection.endX - selection.startX, 2) +\n Math.pow(selection.endY - selection.startY, 2)\n );\n\n // Minimum drag threshold in pixels (10px)\n const MIN_DRAG_DISTANCE = 10;\n\n if (dragDistance < MIN_DRAG_DISTANCE) {\n // This was a click, not a drag - check if we clicked an existing annotation\n if (existingAnnotations.length > 0) {\n const clickedAnnotation = pageAnnotations.find(ann => {\n const fragmentSel = getFragmentSelector(ann.target);\n if (!fragmentSel) return false;\n\n const pdfCoord = parseFragmentSelector(fragmentSel.value);\n if (!pdfCoord) return false;\n\n const rect = pdfToCanvasCoordinates(pdfCoord, pageDimensions.height, 1.0);\n\n // Scale to display coordinates\n const scaleX = displayDimensions.width / pageDimensions.width;\n const scaleY = displayDimensions.height / pageDimensions.height;\n\n const displayX = rect.x * scaleX;\n const displayY = rect.y * scaleY;\n const displayWidth = rect.width * scaleX;\n const displayHeight = rect.height * scaleY;\n\n return (\n selection.endX >= displayX &&\n selection.endX <= displayX + displayWidth &&\n selection.endY >= displayY &&\n selection.endY <= displayY + displayHeight\n );\n });\n\n if (clickedAnnotation) {\n eventBus?.get('browse:click').next({ annotationId: clickedAnnotation.id, motivation: clickedAnnotation.motivation });\n setIsDrawing(false);\n setSelection(null);\n return;\n }\n }\n\n // Click on empty space - do nothing\n setIsDrawing(false);\n setSelection(null);\n return;\n }\n\n // This was a drag - create new annotation\n // Scale selection from display coordinates to native page coordinates\n const scaleX = pageDimensions.width / displayDimensions.width;\n const scaleY = pageDimensions.height / displayDimensions.height;\n\n const nativeSelection: CanvasRectangle = {\n startX: selection.startX * scaleX,\n startY: selection.startY * scaleY,\n endX: selection.endX * scaleX,\n endY: selection.endY * scaleY\n };\n\n // Convert canvas coordinates to PDF coordinates\n const pdfCoord = canvasToPdfCoordinates(\n nativeSelection,\n pageNumber,\n pageDimensions.width,\n pageDimensions.height,\n 1.0 // Use scale 1.0 since we already scaled to native coords\n );\n\n // Create FragmentSelector\n const fragmentSelector = createFragmentSelector(pdfCoord);\n\n // Emit annotation:requested event with FragmentSelector\n if (selectedMotivation) {\n eventBus.get('mark:requested').next({\n selector: {\n type: 'FragmentSelector',\n conformsTo: 'http://tools.ietf.org/rfc/rfc3778',\n value: fragmentSelector\n },\n motivation: selectedMotivation\n });\n }\n\n // Keep drawing state active to show preview until annotation is persisted\n // The parent component should clear this by changing drawingMode after save\n setIsDrawing(false);\n // Note: We keep selection so the preview remains visible\n // It will be cleared when drawingMode changes or user starts new selection\n }, [isDrawing, selection, pageNumber, pageDimensions, displayDimensions, selectedMotivation, existingAnnotations]);\n\n // Helper to get FragmentSelector from annotation target\n const getFragmentSelector = (target: Annotation['target']) => {\n const selector = getTargetSelector(target);\n if (!selector) return null;\n const selectors = Array.isArray(selector) ? selector : [selector];\n\n const found = selectors.find(s => s.type === 'FragmentSelector');\n if (!found || found.type !== 'FragmentSelector') return null;\n return found as { type: 'FragmentSelector'; value: string; conformsTo?: string };\n };\n\n // Filter annotations for current page\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\n // Hover handlers with currentHover guard and dwell delay\n const { handleMouseEnter, handleMouseLeave } = useMemo(\n () => createHoverHandlers((annotationId) => eventBus?.get('beckon:hover').next({ annotationId }), hoverDelayMs),\n [eventBus, hoverDelayMs]\n );\n\n // Calculate motivation color\n const { stroke, fill } = getMotivationColor(selectedMotivation ?? null);\n\n if (error) {\n return <div className=\"semiont-pdf-annotation-canvas__error\">{error}</div>;\n }\n\n return (\n <div className=\"semiont-pdf-annotation-canvas\">\n {isLoading && <div className=\"semiont-pdf-annotation-canvas__loading\">Loading PDF...</div>}\n\n <div\n ref={containerRef}\n className=\"semiont-pdf-annotation-canvas__container\"\n style={{ display: isLoading ? 'none' : undefined }}\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 >\n {/* PDF page rendered as image */}\n {pageImageUrl && (\n <img\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 // Use double RAF to ensure layout is complete even in 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\n {/* SVG overlay for annotations */}\n {displayDimensions && pageDimensions && (\n <div className=\"semiont-pdf-annotation-canvas__overlay-container\">\n <div className=\"semiont-pdf-annotation-canvas__overlay\">\n <svg\n className=\"semiont-pdf-annotation-canvas__svg\"\n width={displayDimensions.width}\n height={displayDimensions.height}\n >\n {/* Render existing annotations for this page */}\n {pageAnnotations.map(ann => {\n const fragmentSel = getFragmentSelector(ann.target);\n if (!fragmentSel) return null;\n\n const pdfCoord = parseFragmentSelector(fragmentSel.value);\n if (!pdfCoord) return null;\n\n const rect = pdfToCanvasCoordinates(pdfCoord, pageDimensions.height, 1.0);\n\n // Scale to display coordinates\n const scaleX = displayDimensions.width / pageDimensions.width;\n const scaleY = displayDimensions.height / pageDimensions.height;\n\n const isHovered = ann.id === hoveredAnnotationId;\n const isSelected = ann.id === selectedAnnotationId;\n\n // Get color for this annotation's motivation (not the selected motivation)\n const annMotivation = ann.motivation as SelectionMotivation | null;\n const { stroke: annStroke, fill: annFill } = getMotivationColor(annMotivation);\n\n return (\n <rect\n key={ann.id}\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={() => eventBus?.get('browse:click').next({ annotationId: ann.id, motivation: ann.motivation })}\n onMouseEnter={() => handleMouseEnter(ann.id)}\n onMouseLeave={handleMouseLeave}\n />\n );\n })}\n\n {/* Render current selection while drawing or awaiting save */}\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\n // PDF only supports rectangle shapes (FragmentSelector with viewrect)\n // Circle/polygon are disabled in the UI for PDF media types\n return (\n <rect\n x={rectX}\n y={rectY}\n width={rectWidth}\n height={rectHeight}\n stroke={stroke}\n strokeWidth={2}\n strokeDasharray=\"5,5\"\n fill={fill}\n pointerEvents=\"none\"\n />\n );\n })()}\n </svg>\n </div>\n </div>\n )}\n </div>\n\n {/* Page navigation controls */}\n {numPages > 0 && (\n <div className=\"semiont-pdf-annotation-canvas__controls\">\n <button\n disabled={pageNumber <= 1}\n onClick={() => setPageNumber(pageNumber - 1)}\n className=\"semiont-pdf-annotation-canvas__button\"\n >\n Previous\n </button>\n <span className=\"semiont-pdf-annotation-canvas__page-info\">\n Page {pageNumber} of {numPages}\n </span>\n <button\n disabled={pageNumber >= numPages}\n onClick={() => setPageNumber(pageNumber + 1)}\n className=\"semiont-pdf-annotation-canvas__button\"\n >\n Next\n </button>\n </div>\n )}\n </div>\n );\n}\n","/**\n * PDF Coordinate Utilities\n *\n * Handles coordinate transformations between:\n * - Canvas space (pixels, top-left origin, Y increases downward)\n * - PDF space (points, bottom-left origin, Y increases upward)\n *\n * Based on RFC 3778 PDF Fragment Identifiers:\n * https://tools.ietf.org/html/rfc3778\n */\n\nexport interface Rectangle {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface PdfCoordinate {\n page: number;\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface CanvasRectangle {\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n}\n\n/**\n * Convert canvas coordinates to PDF coordinates\n *\n * Canvas: Origin at top-left, Y increases downward\n * PDF: Origin at bottom-left, Y increases upward\n *\n * @param canvasRect - Rectangle in canvas pixel coordinates\n * @param page - PDF page number (1-indexed)\n * @param pageWidth - PDF page width in points\n * @param pageHeight - PDF page height in points\n * @param scale - Current canvas scale factor\n */\nexport function canvasToPdfCoordinates(\n canvasRect: CanvasRectangle,\n page: number,\n _pageWidth: number,\n pageHeight: number,\n scale: number = 1\n): PdfCoordinate {\n // Normalize rectangle (handle drag in any direction)\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\n // Convert from canvas pixels to PDF points\n const pdfX = x1 / scale;\n const pdfWidth = (x2 - x1) / scale;\n\n // Flip Y coordinate (canvas top-left to PDF bottom-left)\n const pdfY = pageHeight - (y2 / scale);\n const pdfHeight = (y2 - y1) / scale;\n\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}\n\n/**\n * Convert PDF coordinates to canvas coordinates\n *\n * @param pdfCoord - Coordinates in PDF space\n * @param pageHeight - PDF page height in points\n * @param scale - Current canvas scale factor\n */\nexport function pdfToCanvasCoordinates(\n pdfCoord: PdfCoordinate,\n pageHeight: number,\n scale: number = 1\n): Rectangle {\n // Convert from PDF points to canvas pixels\n const canvasX = pdfCoord.x * scale;\n const canvasWidth = pdfCoord.width * scale;\n\n // Flip Y coordinate (PDF bottom-left to canvas top-left)\n const canvasY = (pageHeight - pdfCoord.y - pdfCoord.height) * scale;\n const canvasHeight = pdfCoord.height * scale;\n\n return {\n x: canvasX,\n y: canvasY,\n width: canvasWidth,\n height: canvasHeight\n };\n}\n\n/**\n * Generate RFC 3778 FragmentSelector value\n *\n * Format: page=N&viewrect=left,top,width,height\n * All coordinates in PDF points\n */\nexport function createFragmentSelector(coord: PdfCoordinate): string {\n return `page=${coord.page}&viewrect=${coord.x},${coord.y},${coord.width},${coord.height}`;\n}\n\n/**\n * Parse RFC 3778 FragmentSelector value\n *\n * @param fragment - Fragment string like \"page=5&viewrect=100,200,300,400\"\n * @returns Parsed PDF coordinates or null if invalid\n */\nexport function parseFragmentSelector(fragment: string): PdfCoordinate | null {\n try {\n // Parse page number\n const pageMatch = fragment.match(/page=(\\d+)/);\n if (!pageMatch) return null;\n const page = parseInt(pageMatch[1], 10);\n\n // Parse viewrect coordinates\n const viewrectMatch = fragment.match(/viewrect=([\\d.]+),([\\d.]+),([\\d.]+),([\\d.]+)/);\n if (!viewrectMatch) return null;\n\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}\n\n/**\n * Extract page number from FragmentSelector\n */\nexport function getPageFromFragment(fragment: string): number | null {\n const match = fragment.match(/page=(\\d+)/);\n return match ? parseInt(match[1], 10) : null;\n}\n","/**\n * Browser PDF.js utilities\n *\n * Uses native browser PDF.js when available, falls back to CDN.\n * Zero npm dependencies - no webpack bundling issues.\n */\n\n// Type definitions for PDF.js API\nexport interface PDFDocumentProxy {\n numPages: number;\n getPage(pageNumber: number): Promise<PDFPageProxy>;\n}\n\nexport interface PDFPageProxy {\n getViewport(params: { scale: number; rotation?: number }): PDFViewport;\n render(params: PDFRenderParams): PDFRenderTask;\n getTextContent(): Promise<TextContent>;\n}\n\nexport interface PDFViewport {\n width: number;\n height: number;\n scale: number;\n rotation: number;\n}\n\nexport interface PDFRenderParams {\n canvasContext: CanvasRenderingContext2D;\n viewport: PDFViewport;\n}\n\nexport interface PDFRenderTask {\n promise: Promise<void>;\n cancel(): void;\n}\n\nexport interface PDFLib {\n getDocument(params: { url: string }): PDFLoadingTask;\n GlobalWorkerOptions: {\n workerSrc: string;\n };\n version: string;\n}\n\nexport interface PDFLoadingTask {\n promise: Promise<PDFDocumentProxy>;\n destroy(): void;\n}\n\n/**\n * Text content types (for Phase 2)\n */\nexport interface TextItem {\n str: string;\n dir: string;\n transform: number[]; // [scaleX, skewX, skewY, scaleY, x, y]\n width: number;\n height: number;\n fontName: string;\n hasEOL: boolean;\n}\n\nexport interface TextContent {\n items: TextItem[];\n styles: Record<string, any>;\n}\n\n/**\n * Ensure PDF.js is available, loading from local public folder if needed\n */\nexport async function ensurePdfJs(): Promise<PDFLib> {\n // Check if already available (browser native or already loaded)\n if (typeof window !== 'undefined' && (window as any).pdfjsLib) {\n return (window as any).pdfjsLib as PDFLib;\n }\n\n // Load from local public folder (staged during build)\n return new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = '/pdfjs/pdf.min.mjs';\n script.type = 'module';\n\n script.onload = () => {\n const pdfjsLib = (window as any).pdfjsLib as PDFLib;\n\n if (!pdfjsLib) {\n reject(new Error('PDF.js loaded but pdfjsLib not available'));\n return;\n }\n\n // Configure worker (also served from local public folder)\n pdfjsLib.GlobalWorkerOptions.workerSrc = '/pdfjs/pdf.worker.min.mjs';\n\n resolve(pdfjsLib);\n };\n\n script.onerror = () => {\n reject(new Error('Failed to load PDF.js from /pdfjs/pdf.min.mjs'));\n };\n\n document.head.appendChild(script);\n });\n}\n\n/**\n * Load PDF document from a URL.\n *\n * The URL must include authentication (e.g. ?token=<media-token>).\n * PDF.js streams the document directly — no ArrayBuffer buffering in JS.\n */\nexport async function loadPdfDocument(url: string): Promise<PDFDocumentProxy> {\n const pdfjsLib = await ensurePdfJs();\n const loadingTask = pdfjsLib.getDocument({ url });\n return loadingTask.promise;\n}\n\n/**\n * Render PDF page to canvas and return as data URL\n */\nexport async function renderPdfPageToDataUrl(\n page: PDFPageProxy,\n scale = 1.0\n): Promise<{ dataUrl: string; width: number; height: number }> {\n const viewport = page.getViewport({ scale });\n\n // Create canvas\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\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n\n // Render PDF page to canvas\n const renderTask = page.render({\n canvasContext: context,\n viewport: viewport\n });\n\n await renderTask.promise;\n\n // Convert to data URL\n return {\n dataUrl: canvas.toDataURL('image/png'),\n width: viewport.width,\n height: viewport.height\n };\n}\n\n/**\n * Render PDF page with text content extraction (Phase 2)\n *\n * This function extracts text in parallel with rendering for future\n * text layer support. Currently the text content is available but not used.\n */\nexport async function renderPdfPageWithText(\n page: PDFPageProxy,\n scale = 1.0\n): Promise<{\n dataUrl: string;\n width: number;\n height: number;\n textContent: TextContent;\n}> {\n const viewport = page.getViewport({ scale });\n\n // Create canvas for rendering\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\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n\n // Render PDF page to canvas\n const renderTask = page.render({\n canvasContext: context,\n viewport: viewport\n });\n\n // Extract text content in parallel (for future text layer support)\n const [, textContent] = await Promise.all([\n renderTask.promise,\n page.getTextContent()\n ]);\n\n // Convert to data URL\n return {\n dataUrl: canvas.toDataURL('image/png'),\n width: viewport.width,\n height: viewport.height,\n textContent\n };\n}\n"],"mappings":"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","names":["error","pdfCoord","scaleX","scaleY"]}
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import { ReactNode } from 'react';
|
|
3
|
-
import { EventBus } from '@semiont/core';
|
|
4
|
-
|
|
5
1
|
/**
|
|
6
2
|
* Open Resources Manager Interface
|
|
7
3
|
*
|
|
@@ -108,73 +104,4 @@ interface TranslationManager {
|
|
|
108
104
|
t: (namespace: string, key: string, params?: Record<string, any>) => string;
|
|
109
105
|
}
|
|
110
106
|
|
|
111
|
-
|
|
112
|
-
* Reset the global event bus - FOR TESTING ONLY.
|
|
113
|
-
*
|
|
114
|
-
* Call this in test setup (beforeEach) to ensure test isolation.
|
|
115
|
-
* Each test gets a fresh event bus with no lingering subscriptions.
|
|
116
|
-
*
|
|
117
|
-
* @returns The new EventBus instance
|
|
118
|
-
*
|
|
119
|
-
* @example
|
|
120
|
-
* ```typescript
|
|
121
|
-
* beforeEach(() => {
|
|
122
|
-
* const eventBus = resetEventBusForTesting();
|
|
123
|
-
* });
|
|
124
|
-
* ```
|
|
125
|
-
*/
|
|
126
|
-
declare function resetEventBusForTesting(): EventBus;
|
|
127
|
-
interface EventBusProviderProps {
|
|
128
|
-
children: ReactNode;
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Unified event bus provider for all application events
|
|
132
|
-
*
|
|
133
|
-
* Consolidates three previous event buses:
|
|
134
|
-
* - MakeMeaningEventBus (document/annotation operations)
|
|
135
|
-
* - NavigationEventBus (navigation and sidebar UI)
|
|
136
|
-
* - GlobalSettingsEventBus (app-wide settings)
|
|
137
|
-
*
|
|
138
|
-
* Benefits:
|
|
139
|
-
* - Single import: useEventBus()
|
|
140
|
-
* - No decision fatigue about which bus to use
|
|
141
|
-
* - Easier cross-domain coordination
|
|
142
|
-
* - Simpler provider hierarchy
|
|
143
|
-
*
|
|
144
|
-
* NOTE: This provider uses a global singleton event bus to ensure all components
|
|
145
|
-
* share the same instance. Multiple providers in the tree will all reference the
|
|
146
|
-
* same global bus.
|
|
147
|
-
*
|
|
148
|
-
* Operation handlers (API calls triggered by events) are set up separately via
|
|
149
|
-
* the useBindFlow hook, which should be called at the resource page level.
|
|
150
|
-
*/
|
|
151
|
-
declare function EventBusProvider({ children }: EventBusProviderProps): react_jsx_runtime.JSX.Element;
|
|
152
|
-
/**
|
|
153
|
-
* Hook to access the unified event bus
|
|
154
|
-
*
|
|
155
|
-
* Use this everywhere instead of:
|
|
156
|
-
* - useMakeMeaningEvents()
|
|
157
|
-
* - useNavigationEvents()
|
|
158
|
-
* - useGlobalSettingsEvents()
|
|
159
|
-
*
|
|
160
|
-
* @example
|
|
161
|
-
* ```typescript
|
|
162
|
-
* const eventBus = useEventBus();
|
|
163
|
-
*
|
|
164
|
-
* // Emit any event
|
|
165
|
-
* eventBus.get('beckon:hover').next({ annotationId: '123' });
|
|
166
|
-
* eventBus.get('browse:sidebar-toggle').next(undefined);
|
|
167
|
-
* eventBus.get('settings:theme-changed').next({ theme: 'dark' });
|
|
168
|
-
*
|
|
169
|
-
* // Subscribe to any event
|
|
170
|
-
* useEffect(() => {
|
|
171
|
-
* const unsubscribe = eventBus.on('beckon:hover', ({ annotationId }) => {
|
|
172
|
-
* console.log(annotationId);
|
|
173
|
-
* });
|
|
174
|
-
* return () => unsubscribe();
|
|
175
|
-
* }, []);
|
|
176
|
-
* ```
|
|
177
|
-
*/
|
|
178
|
-
declare function useEventBus(): EventBus;
|
|
179
|
-
|
|
180
|
-
export { EventBusProvider as E, type OpenResourcesManager as O, type SessionManager as S, type TranslationManager as T, type OpenResource as a, type EventBusProviderProps as b, type SessionState as c, resetEventBusForTesting as r, useEventBus as u };
|
|
107
|
+
export type { OpenResourcesManager as O, SessionManager as S, TranslationManager as T, OpenResource as a, SessionState as b };
|
|
@@ -8,7 +8,8 @@ var Toolbar = {
|
|
|
8
8
|
resourceInfo: "\u0645\u0639\u0644\u0648\u0645\u0627\u062A \u0627\u0644\u0645\u0648\u0631\u062F",
|
|
9
9
|
collaboration: "\u0627\u0644\u062A\u0639\u0627\u0648\u0646",
|
|
10
10
|
userAccount: "\u062D\u0633\u0627\u0628 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645",
|
|
11
|
-
settings: "\u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A"
|
|
11
|
+
settings: "\u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A",
|
|
12
|
+
knowledgeBase: "\u0642\u0627\u0639\u062F\u0629 \u0627\u0644\u0645\u0639\u0631\u0641\u0629"
|
|
12
13
|
};
|
|
13
14
|
var ResourceInfoPanel = {
|
|
14
15
|
title: "\u0645\u0639\u0644\u0648\u0645\u0627\u062A \u0627\u0644\u0645\u0648\u0631\u062F",
|
|
@@ -417,4 +418,4 @@ export {
|
|
|
417
418
|
UnifiedAnnotationsPanel,
|
|
418
419
|
ar_default as default
|
|
419
420
|
};
|
|
420
|
-
//# sourceMappingURL=ar-
|
|
421
|
+
//# sourceMappingURL=ar-R4CRNXEF.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../translations/ar.json"],"sourcesContent":["{\n \"Toolbar\": {\n \"annotations\": \"التعليقات التوضيحية\",\n \"history\": \"السجل\",\n \"resourceInfo\": \"معلومات المورد\",\n \"collaboration\": \"التعاون\",\n \"userAccount\": \"حساب المستخدم\",\n \"settings\": \"الإعدادات\",\n \"knowledgeBase\": \"قاعدة المعرفة\"\n },\n \"ResourceInfoPanel\": {\n \"title\": \"معلومات المورد\",\n \"locale\": \"اللغة المحلية\",\n \"notSpecified\": \"غير محدد\",\n \"entityTypeTags\": \"علامات نوع الكيان\",\n \"representation\": \"التمثيل\",\n \"mediaType\": \"نوع الوسائط\",\n \"byteSize\": \"الحجم\",\n \"clone\": \"استنساخ\",\n \"cloneDescription\": \"إنشاء رابط استنساخ قابل للمشاركة لهذا المورد\",\n \"archive\": \"أرشفة\",\n \"archiveDescription\": \"نقل هذا المورد إلى حالة الأرشيف\",\n \"unarchive\": \"إلغاء الأرشفة\",\n \"unarchiveDescription\": \"استعادة هذا المورد إلى الحالة النشطة\",\n \"provenance\": \"المصدر والسلسلة\",\n \"createdAt\": \"تاريخ الإنشاء\",\n \"modifiedAt\": \"تاريخ التعديل\",\n \"creationMethod\": \"طريقة الإنشاء\",\n \"attributedTo\": \"منسوب إلى\",\n \"derivedFrom\": \"مشتق من\",\n \"generatedBy\": \"أُنشئ بواسطة\"\n },\n \"CollaborationPanel\": {\n \"title\": \"التعاون\",\n \"connectionStatus\": \"حالة الاتصال\",\n \"live\": \"مباشر\",\n \"disconnected\": \"غير متصل\",\n \"events\": \"{{count}} أحداث\",\n \"lastSync\": \"آخر مزامنة:\",\n \"noActivity\": \"لا يوجد نشاط بعد\",\n \"justNow\": \"الآن\",\n \"secondsAgo\": \"منذ {{count}} ثوانٍ\",\n \"minuteAgo\": \"منذ دقيقة واحدة\",\n \"minutesAgo\": \"منذ {{count}} دقائق\",\n \"hourAgo\": \"منذ ساعة واحدة\",\n \"hoursAgo\": \"منذ {{count}} ساعات\",\n \"realtimeActive\": \"التحديثات في الوقت الفعلي نشطة\",\n \"reconnecting\": \"جارٍ إعادة الاتصال بالخادم...\",\n \"sharing\": \"المشاركة\",\n \"collaborationComingSoon\": \"ميزات التعاون قادمة قريبًا\"\n },\n \"AnnotationHistory\": {\n \"history\": \"السجل\",\n \"loading\": \"جارٍ التحميل...\",\n \"user\": \"المستخدم\",\n \"method\": \"الطريقة\",\n \"viewOriginal\": \"عرض الأصل\",\n \"viewAnnotation\": \"عرض التعليق التوضيحي: {{content}}\",\n \"resourceCreated\": \"تم إنشاء المورد\",\n \"resourceCloned\": \"تم الاستنساخ\",\n \"resourceArchived\": \"تمت الأرشفة\",\n \"resourceUnarchived\": \"تم إلغاء الأرشفة\",\n \"highlightAdded\": \"تمت إضافة تمييز\",\n \"highlightRemoved\": \"تمت إزالة التمييز\",\n \"referenceCreated\": \"تم إنشاء مرجع\",\n \"referenceResolved\": \"تم حل المرجع\",\n \"referenceDeleted\": \"تم حذف المرجع\",\n \"entitytagAdded\": \"تمت إضافة علامة\",\n \"entitytagRemoved\": \"تمت إزالة العلامة\",\n \"assessmentAdded\": \"تمت إضافة تقييم\",\n \"assessmentRemoved\": \"تمت إزالة التقييم\",\n \"annotationAdded\": \"تمت إضافة تعليق توضيحي\",\n \"annotationRemoved\": \"تمت إزالة التعليق التوضيحي\",\n \"annotationBodyUpdated\": \"تم تحديث التعليق التوضيحي\",\n \"jobEvent\": \"حدث مهمة\",\n \"justNow\": \"الآن\",\n \"minutesAgo\": \"منذ {{count}}د\",\n \"hoursAgo\": \"منذ {{count}}س\",\n \"daysAgo\": \"منذ {{count}}ي\"\n },\n \"CommentsPanel\": {\n \"title\": \"التعليقات\",\n \"noComments\": \"لا توجد تعليقات بعد. حدد نصًا وانقر على تعليق لإضافة واحد.\",\n \"commentPlaceholder\": \"اكتب تعليقك هنا...\",\n \"save\": \"حفظ\",\n \"cancel\": \"إلغاء\",\n \"edit\": \"تعديل\",\n \"annotateComments\": \"توضيح التعليقات\",\n \"instructions\": \"التعليمات\",\n \"optional\": \"(اختياري)\",\n \"instructionsPlaceholder\": \"مثال: التركيز على المصطلحات التقنية...\",\n \"annotate\": \"توضيح\",\n \"annotating\": \"جارٍ التوضيح...\",\n \"toneLabel\": \"النبرة\",\n \"toneOptional\": \"(اختياري)\",\n \"toneScholarly\": \"أكاديمي\",\n \"toneExplanatory\": \"توضيحي\",\n \"toneConversational\": \"حواري\",\n \"toneTechnical\": \"تقني\",\n \"densityLabel\": \"الكثافة\",\n \"densitySparse\": \"متفرق\",\n \"densityDense\": \"كثيف\",\n \"fragmentSelected\": \"تم تحديد جزء\",\n \"imageRegionSelected\": \"تم تحديد منطقة من الصورة\",\n \"closeProgress\": \"إغلاق\"\n },\n \"HighlightPanel\": {\n \"title\": \"التمييزات\",\n \"noHighlights\": \"لا توجد تمييزات بعد. استخدم التوضيح بالذكاء الاصطناعي للعثور على الفقرات المهمة.\",\n \"annotateHighlights\": \"توضيح التمييزات\",\n \"instructions\": \"التعليمات\",\n \"optional\": \"(اختياري)\",\n \"instructionsPlaceholder\": \"مثال: التركيز على المفاهيم التقنية الرئيسية...\",\n \"annotate\": \"توضيح\",\n \"annotating\": \"جارٍ التوضيح...\",\n \"cancel\": \"إلغاء\",\n \"densityLabel\": \"الكثافة\",\n \"densitySparse\": \"متفرق\",\n \"densityDense\": \"كثيف\",\n \"closeProgress\": \"إغلاق\"\n },\n \"AssessmentPanel\": {\n \"title\": \"التقييمات\",\n \"noAssessments\": \"لا توجد تقييمات بعد. استخدم التوضيح بالذكاء الاصطناعي لتقييم الفقرات.\",\n \"assessmentPlaceholder\": \"اكتب تقييمك هنا...\",\n \"save\": \"حفظ\",\n \"cancel\": \"إلغاء\",\n \"annotateAssessments\": \"توضيح التقييمات\",\n \"instructions\": \"التعليمات\",\n \"optional\": \"(اختياري)\",\n \"instructionsPlaceholder\": \"مثال: تقييم الادعاءات من حيث الدقة والأدلة...\",\n \"annotate\": \"توضيح\",\n \"annotating\": \"جارٍ التوضيح...\",\n \"toneLabel\": \"النبرة\",\n \"toneOptional\": \"(اختياري)\",\n \"toneAnalytical\": \"تحليلي\",\n \"toneCritical\": \"نقدي\",\n \"toneBalanced\": \"متوازن\",\n \"toneConstructive\": \"بنّاء\",\n \"densityLabel\": \"الكثافة\",\n \"densitySparse\": \"متفرق\",\n \"densityDense\": \"كثيف\",\n \"fragmentSelected\": \"تم تحديد جزء\",\n \"imageRegionSelected\": \"تم تحديد منطقة من الصورة\",\n \"closeProgress\": \"إغلاق\"\n },\n \"TaggingPanel\": {\n \"title\": \"العلامات\",\n \"noTags\": \"لا توجد علامات بعد. استخدم التوضيح بالذكاء الاصطناعي لتحديد الأدوار الهيكلية.\",\n \"annotateTags\": \"توضيح العلامات\",\n \"selectSchema\": \"اختيار الإطار\",\n \"schemaLegal\": \"التحليل القانوني (IRAC)\",\n \"schemaScientific\": \"الورقة العلمية (IMRAD)\",\n \"schemaArgument\": \"بنية الحجة (Toulmin)\",\n \"selectCategories\": \"اختيار الفئات\",\n \"categoryIssue\": \"القضية\",\n \"categoryRule\": \"القاعدة\",\n \"categoryApplication\": \"التطبيق\",\n \"categoryConclusion\": \"الخاتمة\",\n \"categoryIntroduction\": \"المقدمة\",\n \"categoryMethods\": \"المناهج\",\n \"categoryResults\": \"النتائج\",\n \"categoryDiscussion\": \"المناقشة\",\n \"categoryClaim\": \"الادعاء\",\n \"categoryEvidence\": \"الدليل\",\n \"categoryWarrant\": \"المبرر\",\n \"categoryCounterargument\": \"الحجة المضادة\",\n \"categoryRebuttal\": \"الدحض\",\n \"annotate\": \"توضيح\",\n \"annotating\": \"جارٍ التوضيح...\",\n \"cancel\": \"إلغاء\",\n \"selectAll\": \"تحديد الكل\",\n \"deselectAll\": \"إلغاء تحديد الكل\",\n \"categoriesSelected\": \"{count, plural, =0 {لم يتم تحديد فئات} =1 {فئة واحدة محددة} other {# فئات محددة}}\",\n \"createTagForSelection\": \"إنشاء علامة للتحديد\",\n \"selectCategory\": \"اختيار الفئة\",\n \"chooseCategory\": \"اختر فئة...\",\n \"fragmentSelected\": \"تم تحديد جزء\",\n \"imageRegionSelected\": \"تم تحديد منطقة من الصورة\"\n },\n \"UnifiedAnnotationsPanel\": {\n \"title\": \"التعليقات التوضيحية\",\n \"statistics\": \"الإحصائيات\",\n \"highlight\": \"التمييزات\",\n \"reference\": \"المراجع\",\n \"assessment\": \"التقييمات\",\n \"comment\": \"التعليقات\",\n \"tag\": \"العلامات\"\n },\n \"StatisticsPanel\": {\n \"title\": \"الإحصائيات\",\n \"highlights\": \"التمييزات\",\n \"comments\": \"التعليقات\",\n \"assessments\": \"التقييمات\",\n \"tags\": \"العلامات\",\n \"references\": \"المراجع\",\n \"stub\": \"مبدئي\",\n \"resolved\": \"محلول\",\n \"entityTypes\": \"أنواع الكيانات\"\n },\n \"ReferencesPanel\": {\n \"title\": \"المراجع\",\n \"noReferences\": \"لا توجد مراجع بعد. حدد نصًا لإنشاء مراجع لموارد أخرى.\",\n \"outgoingReferences\": \"المراجع الصادرة\",\n \"incomingReferences\": \"المراجع الواردة\",\n \"noIncomingReferences\": \"لا توجد مراجع واردة\",\n \"stub\": \"مرجع مبدئي (غير مربوط)\",\n \"resolved\": \"مرجع محلول (مربوط)\",\n \"open\": \"فتح\",\n \"unlink\": \"إلغاء الربط\",\n \"resolve\": \"حل المرجع\",\n \"cancel\": \"إلغاء\",\n \"createReference\": \"إنشاء مرجع\",\n \"entityTypesOptional\": \"أنواع الكيانات (اختياري)\",\n \"fragmentSelected\": \"تم تحديد جزء\",\n \"imageRegionSelected\": \"تم تحديد منطقة من الصورة\",\n \"annotateReferences\": \"توضيح المراجع\",\n \"selectEntityTypes\": \"أنواع الكيانات:\",\n \"select\": \"تحديد\",\n \"deselect\": \"إلغاء التحديد\",\n \"noEntityTypes\": \"لا توجد أنواع كيانات متاحة\",\n \"typesSelected\": \"{count, plural, =1 {نوع واحد محدد} other {# أنواع محددة}}\",\n \"annotate\": \"توضيح\",\n \"annotating\": \"جارٍ التوضيح...\",\n \"includeDescriptiveReferences\": \"تضمين المراجع الوصفية\",\n \"descriptiveReferencesTooltip\": \"البحث أيضًا عن عبارات مثل 'الرئيس التنفيذي'، 'عملاق التكنولوجيا'، 'الفيزيائي' (بالإضافة إلى الأسماء)\",\n \"annotationProgressTitle\": \"توضيح مراجع الكيانات\",\n \"cancelAnnotation\": \"إلغاء التوضيح\",\n \"found\": \"تم العثور على {{count}}\",\n \"complete\": \"اكتمل التوضيح!\",\n \"failed\": \"فشل التوضيح\",\n \"current\": \"الحالي: {{entityType}}\",\n \"closeProgress\": \"إغلاق\",\n \"loading\": \"جارٍ التحميل...\",\n \"loadingEllipsis\": \"جارٍ التحميل...\",\n \"untitledResource\": \"مورد بدون عنوان\",\n \"noText\": \"لا يوجد نص\"\n },\n \"KeyboardShortcuts\": {\n \"title\": \"اختصارات لوحة المفاتيح\",\n \"closeDialog\": \"إغلاق مربع الحوار\",\n \"or\": \"أو\",\n \"navigationTitle\": \"التنقل\",\n \"navOpenSearch\": \"فتح البحث الشامل\",\n \"navOpenSearchAlt\": \"فتح البحث الشامل (بديل)\",\n \"navCreateResource\": \"إنشاء مورد جديد\",\n \"navCloseOverlays\": \"إغلاق جميع الطبقات العلوية (ضغط مزدوج)\",\n \"navShowHelp\": \"عرض مساعدة اختصارات لوحة المفاتيح\",\n \"sidebarTitle\": \"الشريط الجانبي للمعرفة\",\n \"sidebarCollapse\": \"طي الشريط الجانبي\",\n \"sidebarExpand\": \"توسيع الشريط الجانبي\",\n \"sidebarPickup\": \"التقاط علامة تبويب المورد (عند التركيز)\",\n \"sidebarMove\": \"نقل علامة تبويب المورد (أثناء السحب)\",\n \"sidebarDrop\": \"إفلات علامة تبويب المورد (أثناء السحب)\",\n \"sidebarCancel\": \"إلغاء عملية السحب\",\n \"annotationsTitle\": \"تعليقات المورد التوضيحية\",\n \"annotHighlight\": \"إنشاء تمييز من التعليق التوضيحي (مباشر)\",\n \"annotReference\": \"فتح نافذة المرجع المنبثقة للتعليق التوضيحي\",\n \"annotDelete\": \"حذف التعليق التوضيحي المركّز عليه\",\n \"annotNavigate\": \"التنقل عبر التعليقات التوضيحية\",\n \"annotNavigateBack\": \"التنقل عبر التعليقات التوضيحية للخلف\",\n \"listsTitle\": \"القوائم والشبكات\",\n \"listsFilterNav\": \"التنقل بين مرشحات أنواع الكيانات\",\n \"listsGridNav\": \"التنقل في شبكة الموارد\",\n \"listsJumpFirst\": \"الانتقال إلى العنصر الأول\",\n \"listsJumpLast\": \"الانتقال إلى العنصر الأخير\",\n \"searchModalTitle\": \"في نافذة البحث\",\n \"searchNav\": \"التنقل في نتائج البحث\",\n \"searchSelect\": \"اختيار النتيجة\",\n \"searchClose\": \"إغلاق البحث\",\n \"modalTitle\": \"عناصر التحكم في النوافذ المنبثقة\",\n \"modalClose\": \"إغلاق النافذة المنبثقة النشطة\",\n \"modalNavForward\": \"التنقل للأمام عبر الأزرار\",\n \"modalNavBackward\": \"التنقل للخلف عبر الأزرار\",\n \"modalActivate\": \"تفعيل الزر المركّز عليه\",\n \"accessibilityTitle\": \"إمكانية الوصول\",\n \"a11ySkipLinks\": \"الانتقال إلى روابط التخطي (عند بداية الصفحة)\",\n \"a11yFollowLink\": \"اتباع رابط التخطي\",\n \"macNote\": \"استخدام اختصارات لوحة مفاتيح Mac. ⌘ هو مفتاح Command.\",\n \"windowsNote\": \"استخدام اختصارات لوحة مفاتيح Windows/Linux. Ctrl هو مفتاح التحكم.\",\n \"footerHint\": \"اضغط {{key}} في أي وقت لعرض هذه المساعدة\",\n \"close\": \"إغلاق\"\n },\n \"AnnotateToolbar\": {\n \"modeGroup\": \"الوضع\",\n \"browse\": \"تصفح\",\n \"annotate\": \"توضيح\",\n \"selectionGroup\": \"الدافع\",\n \"clickGroup\": \"النقر\",\n \"shapeGroup\": \"الشكل\",\n \"none\": \"لا شيء\",\n \"linking\": \"مرجع\",\n \"highlighting\": \"تمييز\",\n \"assessing\": \"تقييم\",\n \"commenting\": \"تعليق\",\n \"tagging\": \"علامة\",\n \"detail\": \"تفصيل\",\n \"follow\": \"متابعة\",\n \"deleting\": \"حذف\",\n \"jsonld\": \"JSON-LD\",\n \"rectangle\": \"مستطيل\",\n \"circle\": \"دائرة\",\n \"polygon\": \"مضلع\"\n },\n \"CollapsibleResourceNavigation\": {\n \"title\": \"التنقل\",\n \"collapseSidebar\": \"طي الشريط الجانبي\",\n \"expandSidebar\": \"توسيع الشريط الجانبي\",\n \"dragToReorder\": \"اسحب لإعادة الترتيب\",\n \"dragToReorderDoc\": \"اسحب لإعادة ترتيب {{name}}\",\n \"closeResource\": \"إغلاق المورد\",\n \"dragInstructions\": \"لإعادة ترتيب الموارد: استخدم Tab للانتقال إلى مورد. اضغط Alt+سهم لأعلى للتحريك لأعلى أو Alt+سهم لأسفل للتحريك لأسفل. للسحب والإفلات: اضغط على شريط المسافة لالتقاط العنصر. استخدم مفاتيح الأسهم لتحريكه. اضغط على شريط المسافة مرة أخرى للإفلات.\"\n },\n \"ResourceViewer\": {\n \"deleteConfirmationTitle\": \"حذف التعليق التوضيحي\",\n \"deleteConfirmationMessage\": \"هل أنت متأكد أنك تريد حذف هذا التعليق التوضيحي؟ لا يمكن التراجع عن هذا الإجراء.\",\n \"deleteConfirmationCancel\": \"إلغاء\",\n \"deleteConfirmationDelete\": \"حذف\"\n },\n \"Settings\": {\n \"title\": \"الإعدادات\",\n \"lineNumbers\": \"أرقام الأسطر\",\n \"lineNumbersVisible\": \"مرئية\",\n \"lineNumbersHidden\": \"مخفية\",\n \"theme\": \"السمة\",\n \"themeLight\": \"فاتح\",\n \"themeDark\": \"داكن\",\n \"themeSystem\": \"النظام\",\n \"themeSystemActive\": \"النظام ({{mode}})\",\n \"themeModeActive\": \"استخدام وضع {{mode}}\",\n \"language\": \"اللغة\",\n \"languageHint\": \"تغيير اللغة في شريط التنقل الرئيسي\",\n \"languageChanging\": \"جارٍ تغيير اللغة...\",\n \"hoverDelay\": \"تأخير التمرير\",\n \"hoverDelayFast\": \"سريع\",\n \"hoverDelaySlow\": \"بطيء\",\n \"hoverDelayDescription\": \"تأخير {{delay}} ميلي ثانية قبل ظهور تأثيرات التمرير\"\n },\n \"AnnotateView\": {},\n \"ReferenceWizard\": {\n \"gatherTitle\": \"السياق المُجمَّع\",\n \"configureGenerationTitle\": \"تكوين التوليد\",\n \"configureSearchTitle\": \"إعدادات البحث\",\n \"searchResultsTitle\": \"نتائج البحث\",\n \"sourceContextLabel\": \"سياق التعليق التوضيحي في المورد\",\n \"connectionsLabel\": \"التعليقات التوضيحية للأقران\",\n \"citedByLabel\": \"المورد مُستشهد به من قِبل\",\n \"userHintLabel\": \"تلميح\",\n \"userHintPlaceholder\": \"صف ما يشير إليه هذا التعليق التوضيحي...\",\n \"loadingContext\": \"جارٍ جمع السياق...\",\n \"failedContext\": \"فشل في جمع السياق\",\n \"cancel\": \"إلغاء\",\n \"generate\": \"توليد\",\n \"compose\": \"تأليف\",\n \"resolutionStrategyLabel\": \"استراتيجية الحل\",\n \"back\": \"رجوع\",\n \"link\": \"رابط\",\n \"score\": \"درجة\",\n \"noResults\": \"لم يتم العثور على نتائج\",\n \"resourceTitle\": \"عنوان المورد\",\n \"resourceTitlePlaceholder\": \"أدخل عنوان المورد...\",\n \"additionalInstructions\": \"تعليمات إضافية\",\n \"additionalInstructionsPlaceholder\": \"أدخل تعليمات إضافية...\",\n \"language\": \"اللغة\",\n \"languageHelp\": \"لغة المحتوى المُولَّد\",\n \"creativity\": \"الإبداع\",\n \"creativityFocused\": \"مركّز\",\n \"creativityCreative\": \"إبداعي\",\n \"maxLength\": \"الحد الأقصى للطول\",\n \"maxLengthHelp\": \"العدد الأقصى من الرموز\",\n \"maxResults\": \"الحد الأقصى للنتائج\",\n \"semanticScoring\": \"التقييم الدلالي\",\n \"semanticScoringHelp\": \"استخدام الذكاء الاصطناعي لتقييم النتائج حسب الصلة الدلالية\",\n \"searching\": \"جاري البحث...\",\n \"search\": \"بحث\"\n }\n}"],"mappings":"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","names":[]}
|
|
@@ -8,7 +8,8 @@ var Toolbar = {
|
|
|
8
8
|
resourceInfo: "\u09B8\u09AE\u09CD\u09AA\u09A6\u09C7\u09B0 \u09A4\u09A5\u09CD\u09AF",
|
|
9
9
|
collaboration: "\u09B8\u09B9\u09AF\u09CB\u0997\u09BF\u09A4\u09BE",
|
|
10
10
|
userAccount: "\u09AC\u09CD\u09AF\u09AC\u09B9\u09BE\u09B0\u0995\u09BE\u09B0\u09C0\u09B0 \u0985\u09CD\u09AF\u09BE\u0995\u09BE\u0989\u09A8\u09CD\u099F",
|
|
11
|
-
settings: "\u09B8\u09C7\u099F\u09BF\u0982\u09B8"
|
|
11
|
+
settings: "\u09B8\u09C7\u099F\u09BF\u0982\u09B8",
|
|
12
|
+
knowledgeBase: "\u099C\u09CD\u099E\u09BE\u09A8 \u09AD\u09BE\u09A8\u09CD\u09A1\u09BE\u09B0"
|
|
12
13
|
};
|
|
13
14
|
var ResourceInfoPanel = {
|
|
14
15
|
title: "\u09B8\u09AE\u09CD\u09AA\u09A6\u09C7\u09B0 \u09A4\u09A5\u09CD\u09AF",
|
|
@@ -417,4 +418,4 @@ export {
|
|
|
417
418
|
UnifiedAnnotationsPanel,
|
|
418
419
|
bn_default as default
|
|
419
420
|
};
|
|
420
|
-
//# sourceMappingURL=bn-
|
|
421
|
+
//# sourceMappingURL=bn-CZKGRHTA.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../translations/bn.json"],"sourcesContent":["{\n \"Toolbar\": {\n \"annotations\": \"টীকাসমূহ\",\n \"history\": \"ইতিহাস\",\n \"resourceInfo\": \"সম্পদের তথ্য\",\n \"collaboration\": \"সহযোগিতা\",\n \"userAccount\": \"ব্যবহারকারীর অ্যাকাউন্ট\",\n \"settings\": \"সেটিংস\",\n \"knowledgeBase\": \"জ্ঞান ভান্ডার\"\n },\n \"ResourceInfoPanel\": {\n \"title\": \"সম্পদের তথ্য\",\n \"locale\": \"লোকেল\",\n \"notSpecified\": \"নির্দিষ্ট করা হয়নি\",\n \"entityTypeTags\": \"সত্তার ধরনের ট্যাগ\",\n \"representation\": \"উপস্থাপনা\",\n \"mediaType\": \"মিডিয়ার ধরন\",\n \"byteSize\": \"আকার\",\n \"clone\": \"ক্লোন\",\n \"cloneDescription\": \"এই সম্পদের জন্য একটি শেয়ারযোগ্য ক্লোন লিঙ্ক তৈরি করুন\",\n \"archive\": \"সংরক্ষণাগারভুক্ত করুন\",\n \"archiveDescription\": \"এই সম্পদটিকে সংরক্ষণাগারভুক্ত অবস্থায় স্থানান্তর করুন\",\n \"unarchive\": \"সংরক্ষণাগার থেকে পুনরুদ্ধার করুন\",\n \"unarchiveDescription\": \"এই সম্পদটিকে সক্রিয় অবস্থায় পুনরুদ্ধার করুন\",\n \"provenance\": \"উৎস ও উদ্ভব\",\n \"createdAt\": \"তৈরির তারিখ\",\n \"modifiedAt\": \"পরিবর্তনের তারিখ\",\n \"creationMethod\": \"তৈরির পদ্ধতি\",\n \"attributedTo\": \"সম্পাদককৃত\",\n \"derivedFrom\": \"থেকে উৎপন্ন\",\n \"generatedBy\": \"তৈরিকারক\"\n },\n \"CollaborationPanel\": {\n \"title\": \"সহযোগিতা\",\n \"connectionStatus\": \"সংযোগের অবস্থা\",\n \"live\": \"সরাসরি\",\n \"disconnected\": \"সংযোগ বিচ্ছিন্ন\",\n \"events\": \"{{count}} ঘটনা\",\n \"lastSync\": \"সর্বশেষ সিঙ্ক:\",\n \"noActivity\": \"এখনো কোনো কার্যকলাপ নেই\",\n \"justNow\": \"এইমাত্র\",\n \"secondsAgo\": \"{{count}} সেকেন্ড আগে\",\n \"minuteAgo\": \"১ মিনিট আগে\",\n \"minutesAgo\": \"{{count}} মিনিট আগে\",\n \"hourAgo\": \"১ ঘণ্টা আগে\",\n \"hoursAgo\": \"{{count}} ঘণ্টা আগে\",\n \"realtimeActive\": \"রিয়েল-টাইম আপডেট সক্রিয় আছে\",\n \"reconnecting\": \"সার্ভারে পুনরায় সংযোগ হচ্ছে...\",\n \"sharing\": \"শেয়ারিং\",\n \"collaborationComingSoon\": \"সহযোগিতা বৈশিষ্ট্য শীঘ্রই আসছে\"\n },\n \"AnnotationHistory\": {\n \"history\": \"ইতিহাস\",\n \"loading\": \"লোড হচ্ছে...\",\n \"user\": \"ব্যবহারকারী\",\n \"method\": \"পদ্ধতি\",\n \"viewOriginal\": \"মূল দেখুন\",\n \"viewAnnotation\": \"টীকা দেখুন: {{content}}\",\n \"resourceCreated\": \"সম্পদ তৈরি হয়েছে\",\n \"resourceCloned\": \"ক্লোন করা হয়েছে\",\n \"resourceArchived\": \"সংরক্ষণাগারভুক্ত\",\n \"resourceUnarchived\": \"সংরক্ষণাগার থেকে পুনরুদ্ধারকৃত\",\n \"highlightAdded\": \"হাইলাইট যোগ করা হয়েছে\",\n \"highlightRemoved\": \"হাইলাইট অপসারিত হয়েছে\",\n \"referenceCreated\": \"রেফারেন্স তৈরি হয়েছে\",\n \"referenceResolved\": \"রেফারেন্স সমাধান হয়েছে\",\n \"referenceDeleted\": \"রেফারেন্স মুছে ফেলা হয়েছে\",\n \"entitytagAdded\": \"ট্যাগ যোগ করা হয়েছে\",\n \"entitytagRemoved\": \"ট্যাগ অপসারিত হয়েছে\",\n \"assessmentAdded\": \"মূল্যায়ন যোগ করা হয়েছে\",\n \"assessmentRemoved\": \"মূল্যায়ন অপসারিত হয়েছে\",\n \"annotationAdded\": \"টীকা যোগ করা হয়েছে\",\n \"annotationRemoved\": \"টীকা অপসারিত হয়েছে\",\n \"annotationBodyUpdated\": \"টীকা আপডেট হয়েছে\",\n \"jobEvent\": \"কাজের ঘটনা\",\n \"justNow\": \"এইমাত্র\",\n \"minutesAgo\": \"{{count}} মি. আগে\",\n \"hoursAgo\": \"{{count}} ঘ. আগে\",\n \"daysAgo\": \"{{count}} দি. আগে\"\n },\n \"CommentsPanel\": {\n \"title\": \"মন্তব্যসমূহ\",\n \"noComments\": \"এখনো কোনো মন্তব্য নেই। পাঠ্য নির্বাচন করুন এবং একটি যোগ করতে মন্তব্যে ক্লিক করুন।\",\n \"commentPlaceholder\": \"এখানে আপনার মন্তব্য লিখুন...\",\n \"save\": \"সংরক্ষণ করুন\",\n \"cancel\": \"বাতিল করুন\",\n \"edit\": \"সম্পাদনা করুন\",\n \"annotateComments\": \"মন্তব্য টীকাকরণ\",\n \"instructions\": \"নির্দেশনা\",\n \"optional\": \"(ঐচ্ছিক)\",\n \"instructionsPlaceholder\": \"যেমন, প্রযুক্তিগত পরিভাষায় মনোযোগ দিন...\",\n \"annotate\": \"টীকাকরণ\",\n \"annotating\": \"টীকাকরণ হচ্ছে...\",\n \"toneLabel\": \"সুর\",\n \"toneOptional\": \"(ঐচ্ছিক)\",\n \"toneScholarly\": \"পাণ্ডিত্যপূর্ণ\",\n \"toneExplanatory\": \"ব্যাখ্যামূলক\",\n \"toneConversational\": \"কথোপকথনমূলক\",\n \"toneTechnical\": \"প্রযুক্তিগত\",\n \"densityLabel\": \"ঘনত্ব\",\n \"densitySparse\": \"বিরল\",\n \"densityDense\": \"ঘন\",\n \"fragmentSelected\": \"অংশ নির্বাচিত\",\n \"imageRegionSelected\": \"ছবির অঞ্চল নির্বাচিত\",\n \"closeProgress\": \"বন্ধ করুন\"\n },\n \"HighlightPanel\": {\n \"title\": \"হাইলাইটসমূহ\",\n \"noHighlights\": \"এখনো কোনো হাইলাইট নেই। গুরুত্বপূর্ণ অনুচ্ছেদ খুঁজতে AI টীকাকরণ ব্যবহার করুন।\",\n \"annotateHighlights\": \"হাইলাইট টীকাকরণ\",\n \"instructions\": \"নির্দেশনা\",\n \"optional\": \"(ঐচ্ছিক)\",\n \"instructionsPlaceholder\": \"যেমন, মূল প্রযুক্তিগত ধারণাগুলিতে মনোযোগ দিন...\",\n \"annotate\": \"টীকাকরণ\",\n \"annotating\": \"টীকাকরণ হচ্ছে...\",\n \"cancel\": \"বাতিল করুন\",\n \"densityLabel\": \"ঘনত্ব\",\n \"densitySparse\": \"বিরল\",\n \"densityDense\": \"ঘন\",\n \"closeProgress\": \"বন্ধ করুন\"\n },\n \"AssessmentPanel\": {\n \"title\": \"মূল্যায়নসমূহ\",\n \"noAssessments\": \"এখনো কোনো মূল্যায়ন নেই। অনুচ্ছেদ মূল্যায়ন করতে AI টীকাকরণ ব্যবহার করুন।\",\n \"assessmentPlaceholder\": \"এখানে আপনার মূল্যায়ন লিখুন...\",\n \"save\": \"সংরক্ষণ করুন\",\n \"cancel\": \"বাতিল করুন\",\n \"annotateAssessments\": \"মূল্যায়ন টীকাকরণ\",\n \"instructions\": \"নির্দেশনা\",\n \"optional\": \"(ঐচ্ছিক)\",\n \"instructionsPlaceholder\": \"যেমন, সঠিকতা এবং প্রমাণের জন্য দাবিগুলি মূল্যায়ন করুন...\",\n \"annotate\": \"টীকাকরণ\",\n \"annotating\": \"টীকাকরণ হচ্ছে...\",\n \"toneLabel\": \"সুর\",\n \"toneOptional\": \"(ঐচ্ছিক)\",\n \"toneAnalytical\": \"বিশ্লেষণাত্মক\",\n \"toneCritical\": \"সমালোচনামূলক\",\n \"toneBalanced\": \"ভারসাম্যপূর্ণ\",\n \"toneConstructive\": \"গঠনমূলক\",\n \"densityLabel\": \"ঘনত্ব\",\n \"densitySparse\": \"বিরল\",\n \"densityDense\": \"ঘন\",\n \"fragmentSelected\": \"অংশ নির্বাচিত\",\n \"imageRegionSelected\": \"ছবির অঞ্চল নির্বাচিত\",\n \"closeProgress\": \"বন্ধ করুন\"\n },\n \"TaggingPanel\": {\n \"title\": \"ট্যাগসমূহ\",\n \"noTags\": \"এখনো কোনো ট্যাগ নেই। কাঠামোগত ভূমিকা শনাক্ত করতে AI টীকাকরণ ব্যবহার করুন।\",\n \"annotateTags\": \"ট্যাগ টীকাকরণ\",\n \"selectSchema\": \"ফ্রেমওয়ার্ক নির্বাচন করুন\",\n \"schemaLegal\": \"আইনি বিশ্লেষণ (IRAC)\",\n \"schemaScientific\": \"বৈজ্ঞানিক গবেষণাপত্র (IMRAD)\",\n \"schemaArgument\": \"যুক্তি কাঠামো (Toulmin)\",\n \"selectCategories\": \"বিভাগ নির্বাচন করুন\",\n \"categoryIssue\": \"বিষয়\",\n \"categoryRule\": \"নিয়ম\",\n \"categoryApplication\": \"প্রয়োগ\",\n \"categoryConclusion\": \"উপসংহার\",\n \"categoryIntroduction\": \"ভূমিকা\",\n \"categoryMethods\": \"পদ্ধতি\",\n \"categoryResults\": \"ফলাফল\",\n \"categoryDiscussion\": \"আলোচনা\",\n \"categoryClaim\": \"দাবি\",\n \"categoryEvidence\": \"প্রমাণ\",\n \"categoryWarrant\": \"যুক্তিসূত্র\",\n \"categoryCounterargument\": \"প্রতিযুক্তি\",\n \"categoryRebuttal\": \"খণ্ডন\",\n \"annotate\": \"টীকাকরণ\",\n \"annotating\": \"টীকাকরণ হচ্ছে...\",\n \"cancel\": \"বাতিল করুন\",\n \"selectAll\": \"সমস্ত নির্বাচন করুন\",\n \"deselectAll\": \"সমস্ত অনির্বাচন করুন\",\n \"categoriesSelected\": \"{count, plural, =0 {কোনো বিভাগ নির্বাচিত নয়} =1 {১টি বিভাগ নির্বাচিত} other {# টি বিভাগ নির্বাচিত}}\",\n \"createTagForSelection\": \"নির্বাচনের জন্য ট্যাগ তৈরি করুন\",\n \"selectCategory\": \"বিভাগ নির্বাচন করুন\",\n \"chooseCategory\": \"একটি বিভাগ বেছে নিন...\",\n \"fragmentSelected\": \"অংশ নির্বাচিত\",\n \"imageRegionSelected\": \"ছবির অঞ্চল নির্বাচিত\"\n },\n \"UnifiedAnnotationsPanel\": {\n \"title\": \"টীকাসমূহ\",\n \"statistics\": \"পরিসংখ্যান\",\n \"highlight\": \"হাইলাইটসমূহ\",\n \"reference\": \"রেফারেন্সসমূহ\",\n \"assessment\": \"মূল্যায়নসমূহ\",\n \"comment\": \"মন্তব্যসমূহ\",\n \"tag\": \"ট্যাগসমূহ\"\n },\n \"StatisticsPanel\": {\n \"title\": \"পরিসংখ্যান\",\n \"highlights\": \"হাইলাইটসমূহ\",\n \"comments\": \"মন্তব্যসমূহ\",\n \"assessments\": \"মূল্যায়নসমূহ\",\n \"tags\": \"ট্যাগসমূহ\",\n \"references\": \"রেফারেন্সসমূহ\",\n \"stub\": \"অসম্পূর্ণ\",\n \"resolved\": \"সমাধানকৃত\",\n \"entityTypes\": \"সত্তার ধরন\"\n },\n \"ReferencesPanel\": {\n \"title\": \"রেফারেন্সসমূহ\",\n \"noReferences\": \"এখনো কোনো রেফারেন্স নেই। অন্যান্য সম্পদের রেফারেন্স তৈরি করতে পাঠ্য নির্বাচন করুন।\",\n \"outgoingReferences\": \"বহির্গামী রেফারেন্স\",\n \"incomingReferences\": \"আগত রেফারেন্স\",\n \"noIncomingReferences\": \"কোনো আগত রেফারেন্স নেই\",\n \"stub\": \"অসম্পূর্ণ রেফারেন্স (সংযুক্ত নয়)\",\n \"resolved\": \"সমাধানকৃত রেফারেন্স (সংযুক্ত)\",\n \"open\": \"খুলুন\",\n \"unlink\": \"সংযোগ বিচ্ছিন্ন করুন\",\n \"resolve\": \"রেফারেন্স সমাধান করুন\",\n \"cancel\": \"বাতিল করুন\",\n \"createReference\": \"রেফারেন্স তৈরি করুন\",\n \"entityTypesOptional\": \"সত্তার ধরন (ঐচ্ছিক)\",\n \"fragmentSelected\": \"অংশ নির্বাচিত\",\n \"imageRegionSelected\": \"ছবির অঞ্চল নির্বাচিত\",\n \"annotateReferences\": \"রেফারেন্স টীকাকরণ\",\n \"selectEntityTypes\": \"সত্তার ধরন:\",\n \"select\": \"নির্বাচন করুন\",\n \"deselect\": \"অনির্বাচন করুন\",\n \"noEntityTypes\": \"কোনো সত্তার ধরন উপলব্ধ নেই\",\n \"typesSelected\": \"{count, plural, =1 {১টি ধরন নির্বাচিত} other {# টি ধরন নির্বাচিত}}\",\n \"annotate\": \"টীকাকরণ\",\n \"annotating\": \"টীকাকরণ হচ্ছে...\",\n \"includeDescriptiveReferences\": \"বর্ণনামূলক রেফারেন্স অন্তর্ভুক্ত করুন\",\n \"descriptiveReferencesTooltip\": \"নামের পাশাপাশি 'সিইও', 'প্রযুক্তি জায়ান্ট', 'পদার্থবিদ' এর মতো বাক্যাংশও খুঁজুন\",\n \"annotationProgressTitle\": \"সত্তা রেফারেন্স টীকাকরণ হচ্ছে\",\n \"cancelAnnotation\": \"টীকাকরণ বাতিল করুন\",\n \"found\": \"{{count}} টি পাওয়া গেছে\",\n \"complete\": \"টীকাকরণ সম্পূর্ণ!\",\n \"failed\": \"টীকাকরণ ব্যর্থ\",\n \"current\": \"বর্তমান: {{entityType}}\",\n \"closeProgress\": \"বন্ধ করুন\",\n \"loading\": \"লোড হচ্ছে...\",\n \"loadingEllipsis\": \"লোড হচ্ছে...\",\n \"untitledResource\": \"শিরোনামবিহীন সম্পদ\",\n \"noText\": \"কোনো পাঠ্য নেই\"\n },\n \"KeyboardShortcuts\": {\n \"title\": \"কীবোর্ড শর্টকাট\",\n \"closeDialog\": \"ডায়ালগ বন্ধ করুন\",\n \"or\": \"অথবা\",\n \"navigationTitle\": \"নেভিগেশন\",\n \"navOpenSearch\": \"গ্লোবাল অনুসন্ধান খুলুন\",\n \"navOpenSearchAlt\": \"গ্লোবাল অনুসন্ধান খুলুন (বিকল্প)\",\n \"navCreateResource\": \"নতুন সম্পদ তৈরি করুন\",\n \"navCloseOverlays\": \"সমস্ত ওভারলে বন্ধ করুন (দুইবার চাপুন)\",\n \"navShowHelp\": \"কীবোর্ড শর্টকাট সাহায্য দেখান\",\n \"sidebarTitle\": \"জ্ঞান সাইডবার\",\n \"sidebarCollapse\": \"সাইডবার সংকুচিত করুন\",\n \"sidebarExpand\": \"সাইডবার প্রসারিত করুন\",\n \"sidebarPickup\": \"সম্পদ ট্যাব তুলে নিন (ফোকাসে থাকলে)\",\n \"sidebarMove\": \"সম্পদ ট্যাব সরান (টানাটানির সময়)\",\n \"sidebarDrop\": \"সম্পদ ট্যাব ছেড়ে দিন (টানাটানির সময়)\",\n \"sidebarCancel\": \"টানাটানি কার্যক্রম বাতিল করুন\",\n \"annotationsTitle\": \"সম্পদ টীকাসমূহ\",\n \"annotHighlight\": \"টীকা থেকে হাইলাইট তৈরি করুন (সরাসরি)\",\n \"annotReference\": \"টীকার জন্য রেফারেন্স পপআপ খুলুন\",\n \"annotDelete\": \"ফোকাসকৃত টীকা মুছে ফেলুন\",\n \"annotNavigate\": \"টীকাসমূহের মধ্যে নেভিগেট করুন\",\n \"annotNavigateBack\": \"টীকাসমূহে পেছনে নেভিগেট করুন\",\n \"listsTitle\": \"তালিকা এবং গ্রিড\",\n \"listsFilterNav\": \"সত্তার ধরনের ফিল্টার নেভিগেট করুন\",\n \"listsGridNav\": \"সম্পদ গ্রিড নেভিগেট করুন\",\n \"listsJumpFirst\": \"প্রথম আইটেমে যান\",\n \"listsJumpLast\": \"শেষ আইটেমে যান\",\n \"searchModalTitle\": \"অনুসন্ধান মোডালে\",\n \"searchNav\": \"অনুসন্ধান ফলাফল নেভিগেট করুন\",\n \"searchSelect\": \"ফলাফল নির্বাচন করুন\",\n \"searchClose\": \"অনুসন্ধান বন্ধ করুন\",\n \"modalTitle\": \"মোডাল নিয়ন্ত্রণ\",\n \"modalClose\": \"সক্রিয় মোডাল বন্ধ করুন\",\n \"modalNavForward\": \"বোতামগুলির মধ্যে সামনে নেভিগেট করুন\",\n \"modalNavBackward\": \"বোতামগুলির মধ্যে পেছনে নেভিগেট করুন\",\n \"modalActivate\": \"ফোকাসকৃত বোতাম সক্রিয় করুন\",\n \"accessibilityTitle\": \"অভিগম্যতা\",\n \"a11ySkipLinks\": \"স্কিপ লিঙ্কে নেভিগেট করুন (পৃষ্ঠার শুরুতে থাকলে)\",\n \"a11yFollowLink\": \"স্কিপ লিঙ্ক অনুসরণ করুন\",\n \"macNote\": \"Mac কীবোর্ড শর্টকাট ব্যবহার হচ্ছে। ⌘ হলো Command কী।\",\n \"windowsNote\": \"Windows/Linux কীবোর্ড শর্টকাট ব্যবহার হচ্ছে। Ctrl হলো Control কী।\",\n \"footerHint\": \"এই সাহায্য দেখাতে যেকোনো সময় {{key}} চাপুন\",\n \"close\": \"বন্ধ করুন\"\n },\n \"AnnotateToolbar\": {\n \"modeGroup\": \"মোড\",\n \"browse\": \"ব্রাউজ\",\n \"annotate\": \"টীকাকরণ\",\n \"selectionGroup\": \"উদ্দেশ্য\",\n \"clickGroup\": \"ক্লিক\",\n \"shapeGroup\": \"আকৃতি\",\n \"none\": \"কিছু নয়\",\n \"linking\": \"রেফারেন্স\",\n \"highlighting\": \"হাইলাইট\",\n \"assessing\": \"মূল্যায়ন\",\n \"commenting\": \"মন্তব্য\",\n \"tagging\": \"ট্যাগ\",\n \"detail\": \"বিস্তারিত\",\n \"follow\": \"অনুসরণ\",\n \"deleting\": \"মুছে ফেলুন\",\n \"jsonld\": \"JSON-LD\",\n \"rectangle\": \"আয়তক্ষেত্র\",\n \"circle\": \"বৃত্ত\",\n \"polygon\": \"বহুভুজ\"\n },\n \"CollapsibleResourceNavigation\": {\n \"title\": \"নেভিগেশন\",\n \"collapseSidebar\": \"সাইডবার সংকুচিত করুন\",\n \"expandSidebar\": \"সাইডবার প্রসারিত করুন\",\n \"dragToReorder\": \"পুনর্বিন্যাস করতে টানুন\",\n \"dragToReorderDoc\": \"{{name}} পুনর্বিন্যাস করতে টানুন\",\n \"closeResource\": \"সম্পদ বন্ধ করুন\",\n \"dragInstructions\": \"সম্পদ পুনর্বিন্যাস করতে: একটি সম্পদে নেভিগেট করতে Tab ব্যবহার করুন। উপরে যেতে Alt+উপরের তীর বা নিচে যেতে Alt+নিচের তীর চাপুন। টানা এবং ছাড়ার জন্য: আইটেম তুলে নিতে স্পেসবার চাপুন। সরাতে তীর কী ব্যবহার করুন। ছেড়ে দিতে আবার স্পেসবার চাপুন।\"\n },\n \"ResourceViewer\": {\n \"deleteConfirmationTitle\": \"টীকা মুছে ফেলুন\",\n \"deleteConfirmationMessage\": \"আপনি কি নিশ্চিতভাবে এই টীকাটি মুছে ফেলতে চান? এই কাজটি পূর্বাবস্থায় ফেরানো যাবে না।\",\n \"deleteConfirmationCancel\": \"বাতিল করুন\",\n \"deleteConfirmationDelete\": \"মুছে ফেলুন\"\n },\n \"Settings\": {\n \"title\": \"সেটিংস\",\n \"lineNumbers\": \"লাইন নম্বর\",\n \"lineNumbersVisible\": \"দৃশ্যমান\",\n \"lineNumbersHidden\": \"লুকানো\",\n \"theme\": \"থিম\",\n \"themeLight\": \"হালকা\",\n \"themeDark\": \"গাঢ়\",\n \"themeSystem\": \"সিস্টেম\",\n \"themeSystemActive\": \"সিস্টেম ({{mode}})\",\n \"themeModeActive\": \"{{mode}} মোড ব্যবহার হচ্ছে\",\n \"language\": \"ভাষা\",\n \"languageHint\": \"প্রধান নেভিগেশনে ভাষা পরিবর্তন করুন\",\n \"languageChanging\": \"ভাষা পরিবর্তন হচ্ছে...\",\n \"hoverDelay\": \"হোভার বিলম্ব\",\n \"hoverDelayFast\": \"দ্রুত\",\n \"hoverDelaySlow\": \"ধীর\",\n \"hoverDelayDescription\": \"হোভার প্রভাব প্রদর্শনের আগে {{delay}}মি.সে. বিলম্ব\"\n },\n \"AnnotateView\": {},\n \"ReferenceWizard\": {\n \"gatherTitle\": \"সংগৃহীত প্রসঙ্গ\",\n \"configureGenerationTitle\": \"জেনারেশন কনফিগার করুন\",\n \"configureSearchTitle\": \"অনুসন্ধান কনফিগার করুন\",\n \"searchResultsTitle\": \"অনুসন্ধান ফলাফল\",\n \"sourceContextLabel\": \"সম্পদে টীকার প্রসঙ্গ\",\n \"connectionsLabel\": \"সমকক্ষ টীকাসমূহ\",\n \"citedByLabel\": \"সম্পদ উদ্ধৃতকারী\",\n \"userHintLabel\": \"ইঙ্গিত\",\n \"userHintPlaceholder\": \"এই টীকাটি কী বোঝায় তা বর্ণনা করুন...\",\n \"loadingContext\": \"প্রসঙ্গ সংগ্রহ হচ্ছে...\",\n \"failedContext\": \"প্রসঙ্গ সংগ্রহ ব্যর্থ\",\n \"cancel\": \"বাতিল করুন\",\n \"generate\": \"তৈরি করুন\",\n \"compose\": \"রচনা করুন\",\n \"resolutionStrategyLabel\": \"রেজোলিউশন কৌশল\",\n \"back\": \"পিছনে\",\n \"link\": \"লিঙ্ক\",\n \"score\": \"স্কোর\",\n \"noResults\": \"কোনো ফলাফল পাওয়া যায়নি\",\n \"resourceTitle\": \"সম্পদের শিরোনাম\",\n \"resourceTitlePlaceholder\": \"সম্পদের শিরোনাম লিখুন...\",\n \"additionalInstructions\": \"অতিরিক্ত নির্দেশনা\",\n \"additionalInstructionsPlaceholder\": \"অতিরিক্ত নির্দেশনা লিখুন...\",\n \"language\": \"ভাষা\",\n \"languageHelp\": \"তৈরি করা বিষয়বস্তুর ভাষা\",\n \"creativity\": \"সৃজনশীলতা\",\n \"creativityFocused\": \"কেন্দ্রীভূত\",\n \"creativityCreative\": \"সৃজনশীল\",\n \"maxLength\": \"সর্বোচ্চ দৈর্ঘ্য\",\n \"maxLengthHelp\": \"সর্বোচ্চ টোকেন সংখ্যা\",\n \"maxResults\": \"সর্বোচ্চ ফলাফল\",\n \"semanticScoring\": \"অর্থগত স্কোরিং\",\n \"semanticScoringHelp\": \"অর্থগত প্রাসঙ্গিকতা অনুযায়ী ফলাফল স্কোর করতে AI ব্যবহার করুন\",\n \"searching\": \"অনুসন্ধান করা হচ্ছে...\",\n \"search\": \"অনুসন্ধান\"\n }\n}"],"mappings":"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","names":[]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
useApiClient,
|
|
4
4
|
useEventBus
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-HNZOXH4L.mjs";
|
|
6
6
|
|
|
7
7
|
// src/contexts/AuthTokenContext.tsx
|
|
8
8
|
import { createContext, useContext } from "react";
|
|
@@ -160,46 +160,27 @@ function useHoverEmitter(annotationId, hoverDelayMs = HOVER_DELAY_MS) {
|
|
|
160
160
|
function useAttentionStream() {
|
|
161
161
|
const client = useApiClient();
|
|
162
162
|
const token = useAuthToken();
|
|
163
|
-
const
|
|
163
|
+
const tokenRef = useRef2(token);
|
|
164
|
+
useEffect2(() => {
|
|
165
|
+
tokenRef.current = token;
|
|
166
|
+
});
|
|
164
167
|
const [status, setStatus] = useState("disconnected");
|
|
165
|
-
|
|
166
|
-
const connectingRef = useRef2(false);
|
|
167
|
-
const connect = useCallback(async () => {
|
|
168
|
-
if (connectingRef.current || streamRef.current) return;
|
|
169
|
-
connectingRef.current = true;
|
|
170
|
-
if (!client) {
|
|
171
|
-
setStatus("error");
|
|
172
|
-
connectingRef.current = false;
|
|
173
|
-
return;
|
|
174
|
-
}
|
|
168
|
+
useEffect2(() => {
|
|
175
169
|
setStatus("connecting");
|
|
176
170
|
try {
|
|
177
|
-
const
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
});
|
|
181
|
-
streamRef.current = stream;
|
|
171
|
+
const sub = client.flows.attentionStream(
|
|
172
|
+
() => tokenRef.current ? accessToken(tokenRef.current) : void 0
|
|
173
|
+
);
|
|
182
174
|
setStatus("connected");
|
|
183
|
-
|
|
175
|
+
return () => {
|
|
176
|
+
sub.unsubscribe();
|
|
177
|
+
setStatus("disconnected");
|
|
178
|
+
};
|
|
184
179
|
} catch (error) {
|
|
185
180
|
console.error("[AttentionStream] Failed to connect:", error);
|
|
186
181
|
setStatus("error");
|
|
187
|
-
|
|
188
|
-
}
|
|
189
|
-
}, [client, token, eventBus]);
|
|
190
|
-
const disconnect = useCallback(() => {
|
|
191
|
-
if (streamRef.current) {
|
|
192
|
-
streamRef.current.close();
|
|
193
|
-
streamRef.current = null;
|
|
194
|
-
}
|
|
195
|
-
setStatus("disconnected");
|
|
196
|
-
connectingRef.current = false;
|
|
197
|
-
}, []);
|
|
198
|
-
useEffect2(() => {
|
|
199
|
-
if (client) {
|
|
200
|
-
connect();
|
|
182
|
+
return;
|
|
201
183
|
}
|
|
202
|
-
return () => disconnect();
|
|
203
184
|
}, [client]);
|
|
204
185
|
return { status };
|
|
205
186
|
}
|
|
@@ -215,4 +196,4 @@ export {
|
|
|
215
196
|
useHoverEmitter,
|
|
216
197
|
useAttentionStream
|
|
217
198
|
};
|
|
218
|
-
//# sourceMappingURL=chunk-
|
|
199
|
+
//# sourceMappingURL=chunk-BQJWOK4C.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/contexts/AuthTokenContext.tsx","../src/contexts/useEventSubscription.ts","../src/hooks/useBeckonFlow.ts"],"sourcesContent":["'use client';\n\n/**\n * Auth Token Context - Manages authentication token lifecycle\n *\n * Simple approach: Just pass the token value through context.\n * When the token changes, context updates, components re-render.\n * No complex machinery needed.\n */\n\nimport { createContext, useContext, ReactNode } from 'react';\n\nconst AuthTokenContext = createContext<string | null | undefined>(undefined);\n\nexport interface AuthTokenProviderProps {\n token: string | null;\n children: ReactNode;\n}\n\n/**\n * Provider for auth token\n * Pass the current token value - React handles the rest\n */\nexport function AuthTokenProvider({\n token,\n children,\n}: AuthTokenProviderProps) {\n return (\n <AuthTokenContext.Provider value={token}>\n {children}\n </AuthTokenContext.Provider>\n );\n}\n\n/**\n * Hook to get current auth token\n *\n * Returns the current token value from context.\n * Re-renders automatically when token changes (normal React behavior).\n *\n * @returns Current access token (null if not authenticated)\n * @throws Error if used outside AuthTokenProvider\n */\nexport function useAuthToken(): string | null {\n const context = useContext(AuthTokenContext);\n\n if (context === undefined) {\n throw new Error('useAuthToken must be used within an AuthTokenProvider');\n }\n\n return context;\n}\n","import { useEffect, useRef, useMemo } from 'react';\nimport type { EventMap } from '@semiont/core';\nimport { useEventBus } from './EventBusContext';\n\n/**\n * Subscribe to an event bus event with automatic cleanup.\n *\n * This hook solves the \"stale closure\" problem by always using the latest\n * version of the handler without re-subscribing.\n *\n * @example\n * ```tsx\n * useEventSubscription('mark:created', ({ annotation }) => {\n * // This always uses the latest props/state\n * triggerSparkleAnimation(annotation.id);\n * });\n * ```\n */\nexport function useEventSubscription<K extends keyof EventMap>(\n eventName: K,\n handler: (payload: EventMap[K]) => void\n): void {\n const eventBus = useEventBus();\n\n // Store the latest handler in a ref to avoid stale closures\n const handlerRef = useRef(handler);\n\n // Update ref on every render (no re-subscription needed)\n useEffect(() => {\n handlerRef.current = handler;\n });\n\n // Subscribe once, using a stable wrapper that calls the current handler\n useEffect(() => {\n const stableHandler = (payload: EventMap[K]) => {\n handlerRef.current(payload);\n };\n\n // RxJS EventBus.get() returns Subject, subscribe returns Subscription\n const subscription = eventBus.get(eventName).subscribe(stableHandler);\n\n return () => {\n subscription.unsubscribe();\n };\n }, [eventName, eventBus]); // eventBus is stable, only re-subscribe if event name changes\n}\n\n/**\n * Subscribe to multiple events at once.\n *\n * @example\n * ```tsx\n * useEventSubscriptions({\n * 'mark:created': ({ annotation }) => setNewAnnotation(annotation),\n * 'mark:deleted': ({ annotationId }) => removeAnnotation(annotationId),\n * });\n * ```\n */\nexport function useEventSubscriptions(\n subscriptions: {\n [K in keyof EventMap]?: (payload: EventMap[K]) => void;\n }\n): void {\n const eventBus = useEventBus();\n\n // Store the latest handlers in refs\n const handlersRef = useRef(subscriptions);\n\n // Update refs on every render\n useEffect(() => {\n handlersRef.current = subscriptions;\n });\n\n // Get stable list of event names to subscribe to\n const eventNames = useMemo(\n () => Object.keys(subscriptions).sort(),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [Object.keys(subscriptions).sort().join(',')]\n );\n\n // Subscribe once per event - only re-subscribe if event names actually change\n useEffect(() => {\n const subscriptions: Array<{ unsubscribe: () => void }> = [];\n\n // Create stable wrappers for each subscription\n for (const eventName of eventNames) {\n const stableHandler = (payload: any) => {\n const currentHandler = handlersRef.current[eventName as keyof EventMap];\n if (currentHandler) {\n currentHandler(payload);\n } else {\n console.warn('[useEventSubscriptions] No current handler found for:', eventName);\n }\n };\n\n // RxJS EventBus.get() returns Subject, subscribe returns Subscription\n const subscription = eventBus.get(eventName as keyof EventMap).subscribe(stableHandler);\n subscriptions.push(subscription);\n }\n\n // Cleanup: unsubscribe from all subscriptions\n return () => {\n for (const subscription of subscriptions) {\n subscription.unsubscribe();\n }\n };\n }, [eventNames, eventBus]); // eventBus is stable singleton - never in deps; only re-subscribe if event names change\n}\n","/**\n * useBeckonFlow — Annotation attention / pointer coordination hook\n *\n * Manages which annotation currently has the user's attention:\n * - Hover state (hoveredAnnotationId)\n * - Hover → sparkle relay\n * - Click → focus relay\n *\n * Follows react-rxjs-guide.md Layer 2 pattern: Hook bridge that\n * subscribes to events and pushes values into React state.\n *\n * Note: beckon:sparkle visual effect (triggerSparkleAnimation) is owned by\n * ResourceViewerPage, which subscribes to beckon:sparkle and delegates to\n * ResourceAnnotationsContext. This hook emits the signal; it does not render the effect.\n *\n * @subscribes beckon:hover - Sets hoveredAnnotationId; emits beckon:sparkle\n * @subscribes browse:click - Emits beckon:focus (attention relay only)\n * @emits beckon:sparkle\n * @emits beckon:focus\n */\n\n/**\n * useHoverEmitter / createHoverHandlers — annotation hover emission utilities\n *\n * Centralises two hover quality-of-life behaviours:\n *\n * 1. currentHover guard — suppresses redundant emissions when the mouse\n * moves within the same annotation element (prevents event bus noise).\n *\n * 2. Debounce delay (HOVER_DELAY_MS) — a short timer before emitting\n * beckon:hover, so that transient pass-through movements (user dragging\n * the mouse across the panel to reach a button elsewhere) do not trigger\n * sparkle animations or cross-highlight effects.\n * The delay is cancelled immediately on mouseLeave, so leaving is always instant.\n *\n * Two forms are provided:\n *\n * useHoverEmitter(annotationId)\n * React hook. Returns { onMouseEnter, onMouseLeave } props for JSX elements.\n * Use in panel entries (HighlightEntry, CommentEntry, …).\n *\n * createHoverHandlers(emit)\n * Plain factory. Returns { handleMouseEnter(id), handleMouseLeave(), cleanup }.\n * Use inside useEffect / imperative setup code where hooks cannot be called\n * (BrowseView, CodeMirrorRenderer, AnnotationOverlay, PdfAnnotationCanvas).\n */\n\nimport { useState, useRef, useCallback, useEffect } from 'react';\nimport { accessToken } from '@semiont/core';\nimport { useEventBus } from '../contexts/EventBusContext';\nimport { useEventSubscriptions } from '../contexts/useEventSubscription';\nimport { useApiClient } from '../contexts/ApiClientContext';\nimport { useAuthToken } from '../contexts/AuthTokenContext';\nimport type { StreamStatus } from './useResourceEvents';\n\n// ─── useBeckonFlow ─────────────────────────────────────────────────────────\n\nexport interface BeckonFlowState {\n hoveredAnnotationId: string | null;\n}\n\nexport function useBeckonFlow(): BeckonFlowState {\n const eventBus = useEventBus();\n const [hoveredAnnotationId, setHoveredAnnotationId] = useState<string | null>(null);\n\n const handleAnnotationHover = useCallback(({ annotationId }: { annotationId: string | null }) => {\n setHoveredAnnotationId(annotationId);\n if (annotationId) {\n eventBus.get('beckon:sparkle').next({ annotationId });\n }\n }, []); // eventBus is stable singleton - never in deps\n\n const handleAnnotationClick = useCallback(({ annotationId }: { annotationId: string }) => {\n eventBus.get('beckon:focus').next({ annotationId });\n // Scroll to annotation handled by BrowseView via beckon:focus subscription\n }, []); // eventBus is stable singleton - never in deps\n\n useEventSubscriptions({\n 'beckon:hover': handleAnnotationHover,\n 'browse:click': handleAnnotationClick,\n });\n\n return { hoveredAnnotationId };\n}\n\n// ─── createHoverHandlers (use inside useEffect / imperative setup) ────────────\n\n/** Default milliseconds the mouse must dwell before beckon:hover is emitted. */\nexport const HOVER_DELAY_MS = 150;\n\ntype EmitHover = (annotationId: string | null) => void;\n\nexport interface HoverHandlers {\n /** Call with the annotation ID when the mouse enters an annotation element. */\n handleMouseEnter: (annotationId: string) => void;\n /** Call when the mouse leaves the annotation element. */\n handleMouseLeave: () => void;\n /** Cancel any pending timer — call in the useEffect cleanup. */\n cleanup: () => void;\n}\n\n/**\n * Creates hover handlers for imperative code (non-hook contexts).\n * @param emit - Callback to emit hover events\n * @param delayMs - Hover delay in milliseconds\n */\nexport function createHoverHandlers(emit: EmitHover, delayMs: number): HoverHandlers {\n let currentHover: string | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n const cancelTimer = () => {\n if (timer !== null) {\n clearTimeout(timer);\n timer = null;\n }\n };\n\n const handleMouseEnter = (annotationId: string) => {\n if (currentHover === annotationId) return; // already hovering this one\n cancelTimer();\n timer = setTimeout(() => {\n timer = null;\n currentHover = annotationId;\n emit(annotationId);\n }, delayMs);\n };\n\n const handleMouseLeave = () => {\n cancelTimer();\n if (currentHover !== null) {\n currentHover = null;\n emit(null);\n }\n };\n\n return { handleMouseEnter, handleMouseLeave, cleanup: cancelTimer };\n}\n\n// ─── useHoverEmitter (use in JSX onMouseEnter / onMouseLeave props) ───────────\n\nexport interface HoverEmitterProps {\n onMouseEnter: () => void;\n onMouseLeave: () => void;\n}\n\n/**\n * React hook that returns onMouseEnter / onMouseLeave props for a single\n * annotation entry element.\n *\n * @param annotationId - The ID of the annotation this element represents.\n * @param hoverDelayMs - Hover delay in milliseconds (defaults to HOVER_DELAY_MS for panel entries)\n */\nexport function useHoverEmitter(annotationId: string, hoverDelayMs: number = HOVER_DELAY_MS): HoverEmitterProps {\n const eventBus = useEventBus();\n const currentHoverRef = useRef<string | null>(null);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const onMouseEnter = useCallback(() => {\n if (currentHoverRef.current === annotationId) return;\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n }\n timerRef.current = setTimeout(() => {\n timerRef.current = null;\n currentHoverRef.current = annotationId;\n eventBus.get('beckon:hover').next({ annotationId });\n }, hoverDelayMs);\n }, [annotationId, hoverDelayMs]); // eventBus is stable singleton - never in deps\n\n const onMouseLeave = useCallback(() => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n if (currentHoverRef.current !== null) {\n currentHoverRef.current = null;\n eventBus.get('beckon:hover').next({ annotationId: null });\n }\n }, []); // eventBus is stable singleton - never in deps\n\n // Cleanup timer on unmount\n useEffect(() => {\n return () => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n };\n }, []);\n\n return { onMouseEnter, onMouseLeave };\n}\n\n// ─── useAttentionStream ───────────────────────────────────────────────────────\n\n/**\n * Opens a participant-scoped SSE connection to receive cross-participant\n * beckon signals. Each incoming signal is emitted as beckon:focus on the\n * EventBus — the existing scroll/highlight machinery handles it automatically.\n *\n * Signals are ephemeral: delivered if connected, silently dropped if not.\n *\n * @example\n * ```tsx\n * // In your layout (render-nothing connector):\n * useAttentionStream();\n * ```\n */\nexport function useAttentionStream(): { status: StreamStatus } {\n const client = useApiClient();\n const token = useAuthToken();\n const tokenRef = useRef(token);\n useEffect(() => { tokenRef.current = token; });\n const [status, setStatus] = useState<StreamStatus>('disconnected');\n\n useEffect(() => {\n setStatus('connecting');\n try {\n const sub = client.flows.attentionStream(() =>\n tokenRef.current ? accessToken(tokenRef.current) : undefined\n );\n setStatus('connected');\n return () => { sub.unsubscribe(); setStatus('disconnected'); };\n } catch (error) {\n console.error('[AttentionStream] Failed to connect:', error);\n setStatus('error');\n return;\n }\n }, [client]);\n\n return { status };\n}\n"],"mappings":"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","names":["subscriptions","useRef","useEffect","useRef","useEffect"]}
|