@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 CHANGED
@@ -1,9 +1,10 @@
1
+ export { HighlightOverlay, type Highlight } from './HighlightOverlay.tsx';
1
2
  export { ViewerCanvas } from './ViewerCanvas';
2
- export type { ViewerStore } from './ViewerStore.ts';
3
- export type { InstanceSlice } from './InstanceSlice.ts';
4
- export type { ControlSlice } from './ControlSlice.ts';
5
- export { useViewer } from './useViewer.tsx';
6
- export { useViewerControls } from './useViewerControls.tsx';
7
- export { ViewerProvider } from './ViewerProvider.tsx';
8
- export { useViewerReady } from './useViewerReady.tsx';
9
- export { useViewerStore } from './useViewerStore.tsx';
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 useViewer() {
206
- return useViewerStoreSelector((s) => s.viewer);
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 ViewerProvider({ children }) {
241
- const [store] = useState(() => createViewerStore());
242
- return /* @__PURE__ */ jsx(ViewerContext.Provider, { value: store, children });
282
+ function useManifest() {
283
+ return useViewerStoreSelector((s) => s.manifest);
243
284
  }
244
- function useViewerReady() {
245
- return useViewerStoreSelector((s) => s.viewerReady);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knaw-huc/osd-iiif-viewer",
3
- "version": "0.0.0",
3
+ "version": "0.1.1",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -52,4 +52,4 @@
52
52
  "vite-plugin-dts": "^4.5.4",
53
53
  "vitest": "^3.2.1"
54
54
  }
55
- }
55
+ }