@knaw-huc/osd-iiif-viewer 0.0.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +9 -8
- package/dist/index.js +59 -14
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
export { HighlightOverlay, type Highlight } from './HighlightOverlay.tsx';
|
|
1
2
|
export { ViewerCanvas } from './ViewerCanvas';
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
export
|
|
5
|
-
export {
|
|
6
|
-
export {
|
|
7
|
-
export {
|
|
8
|
-
export {
|
|
9
|
-
export {
|
|
3
|
+
export { ViewerProvider } from './ViewerProvider';
|
|
4
|
+
export { useViewer } from './useViewer';
|
|
5
|
+
export { useViewerControls } from './useViewerControls';
|
|
6
|
+
export { useViewerReady } from './useViewerReady';
|
|
7
|
+
export { useViewerStore } from './useViewerStore';
|
|
8
|
+
export { useManifest, useLoadManifest } from './manifest/useManifest';
|
|
9
|
+
export { useCanvas } from './manifest/useCanvas';
|
|
10
|
+
export type { ViewerManifest, ViewerCanvas as ViewerCanvasModel, ViewerRange, ViewerMetadata } from './manifest/model';
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
+
import { useStore } from "zustand/index";
|
|
2
|
+
import { createContext, useContext, useEffect, useRef, useState, useCallback } from "react";
|
|
3
|
+
import { createStore } from "zustand/vanilla";
|
|
1
4
|
import { jsx } from "react/jsx-runtime";
|
|
2
5
|
import { Viewer } from "openseadragon";
|
|
3
|
-
import { createContext, useContext, useRef, useEffect, useCallback, useState } from "react";
|
|
4
|
-
import "zustand";
|
|
5
|
-
import { createStore } from "zustand/vanilla";
|
|
6
|
-
import { useStore } from "zustand/index";
|
|
7
6
|
const createInstanceSlice = (set) => ({
|
|
8
7
|
viewer: null,
|
|
9
8
|
viewerReady: !1,
|
|
@@ -154,13 +153,55 @@ const defaultManifest = { data: null, url: "", isLoading: !1, error: null }, cre
|
|
|
154
153
|
function useViewerStore() {
|
|
155
154
|
return useContext(ViewerContext) ?? orThrow("viewer hook must be used within viewer provider");
|
|
156
155
|
}
|
|
157
|
-
function findTileSource(canvas) {
|
|
158
|
-
return canvas.imageServiceId + "/info.json";
|
|
159
|
-
}
|
|
160
156
|
function useViewerStoreSelector(selector) {
|
|
161
157
|
const store = useViewerStore();
|
|
162
158
|
return useStore(store, selector);
|
|
163
159
|
}
|
|
160
|
+
function useViewer() {
|
|
161
|
+
return useViewerStoreSelector((s) => s.viewer);
|
|
162
|
+
}
|
|
163
|
+
function useViewerReady() {
|
|
164
|
+
return useViewerStoreSelector((s) => s.viewerReady);
|
|
165
|
+
}
|
|
166
|
+
function assertSvgElement(element) {
|
|
167
|
+
if (!(element instanceof SVGElement))
|
|
168
|
+
throw new Error("Expected SVGElement");
|
|
169
|
+
}
|
|
170
|
+
function HighlightOverlay({ highlights, onHover = noop }) {
|
|
171
|
+
const viewer = useViewer(), ready = useViewerReady();
|
|
172
|
+
return useEffect(() => {
|
|
173
|
+
if (!viewer || !ready || !highlights.length)
|
|
174
|
+
return;
|
|
175
|
+
const item = viewer.world.getItemAt(0);
|
|
176
|
+
if (!item)
|
|
177
|
+
return;
|
|
178
|
+
const size = item.getContentSize(), imageRect = item.imageToViewportRectangle(0, 0, size.x, size.y), overlayElements = [];
|
|
179
|
+
for (const highlight of highlights) {
|
|
180
|
+
const container = document.createElement("div");
|
|
181
|
+
container.style.position = "absolute", container.style.pointerEvents = "none";
|
|
182
|
+
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
183
|
+
svg.setAttribute("viewBox", `0 0 ${size.x} ${size.y}`), svg.style.width = "100%", svg.style.height = "100%", svg.style.pointerEvents = "none";
|
|
184
|
+
const g = document.createElementNS("http://www.w3.org/2000/svg", "g");
|
|
185
|
+
g.innerHTML = highlight.path;
|
|
186
|
+
const shape = g.firstElementChild;
|
|
187
|
+
assertSvgElement(shape), shape.setAttribute("fill", "transparent"), shape.style.pointerEvents = "auto", shape.style.cursor = "pointer", shape.addEventListener("mouseenter", (event) => {
|
|
188
|
+
shape.setAttribute("fill", "rgba(0,0,0,0.1)"), onHover(highlight.id, event);
|
|
189
|
+
}), shape.addEventListener("mousemove", (event) => {
|
|
190
|
+
onHover(highlight.id, event);
|
|
191
|
+
}), shape.addEventListener("mouseleave", (event) => {
|
|
192
|
+
shape.setAttribute("fill", "transparent"), onHover(null, event);
|
|
193
|
+
}), svg.appendChild(g), container.appendChild(svg), viewer.addOverlay({ element: container, location: imageRect }), overlayElements.push(container);
|
|
194
|
+
}
|
|
195
|
+
return () => {
|
|
196
|
+
overlayElements.forEach((el) => viewer.removeOverlay(el));
|
|
197
|
+
};
|
|
198
|
+
}, [viewer, ready, highlights, onHover]), null;
|
|
199
|
+
}
|
|
200
|
+
const noop = () => {
|
|
201
|
+
};
|
|
202
|
+
function findTileSource(canvas) {
|
|
203
|
+
return canvas.imageServiceId + "/info.json";
|
|
204
|
+
}
|
|
164
205
|
function useCanvas() {
|
|
165
206
|
const { currentIndex } = useViewerStoreSelector((s) => s.canvas), goTo = useViewerStoreSelector((s) => s.goToCanvas), next = useViewerStoreSelector((s) => s.nextCanvas), prev = useViewerStoreSelector((s) => s.prevCanvas), current = useViewerStoreSelector(
|
|
166
207
|
(s) => s.manifest.data?.canvases[s.canvas.currentIndex] ?? null
|
|
@@ -202,8 +243,9 @@ function ViewerCanvas({ showControls = !0 }) {
|
|
|
202
243
|
}
|
|
203
244
|
);
|
|
204
245
|
}
|
|
205
|
-
function
|
|
206
|
-
|
|
246
|
+
function ViewerProvider({ children }) {
|
|
247
|
+
const [store] = useState(() => createViewerStore());
|
|
248
|
+
return /* @__PURE__ */ jsx(ViewerContext.Provider, { value: store, children });
|
|
207
249
|
}
|
|
208
250
|
function useViewerControls(fullscreenRef) {
|
|
209
251
|
const viewer = useViewer(), store = useViewerStore(), zoomLevel = useViewerStoreSelector((s) => s.zoomLevel), zoomMin = useViewerStoreSelector((s) => s.zoomMin), zoomMax = useViewerStoreSelector((s) => s.zoomMax), isFullPage = useViewerStoreSelector((s) => s.isFullPage);
|
|
@@ -237,16 +279,19 @@ function useViewerControls(fullscreenRef) {
|
|
|
237
279
|
isFullPage
|
|
238
280
|
};
|
|
239
281
|
}
|
|
240
|
-
function
|
|
241
|
-
|
|
242
|
-
return /* @__PURE__ */ jsx(ViewerContext.Provider, { value: store, children });
|
|
282
|
+
function useManifest() {
|
|
283
|
+
return useViewerStoreSelector((s) => s.manifest);
|
|
243
284
|
}
|
|
244
|
-
function
|
|
245
|
-
return useViewerStoreSelector((s) => s.
|
|
285
|
+
function useLoadManifest() {
|
|
286
|
+
return useViewerStoreSelector((s) => s.loadManifest);
|
|
246
287
|
}
|
|
247
288
|
export {
|
|
289
|
+
HighlightOverlay,
|
|
248
290
|
ViewerCanvas,
|
|
249
291
|
ViewerProvider,
|
|
292
|
+
useCanvas,
|
|
293
|
+
useLoadManifest,
|
|
294
|
+
useManifest,
|
|
250
295
|
useViewer,
|
|
251
296
|
useViewerControls,
|
|
252
297
|
useViewerReady,
|
package/package.json
CHANGED