bdsa-react-components 0.1.19 → 0.1.21

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.
Files changed (48) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/CURSOR_INTEGRATION.md +75 -15
  3. package/dist/components/AnnotationManager/AnnotationManager.d.ts +2 -183
  4. package/dist/components/AnnotationManager/AnnotationManager.d.ts.map +1 -1
  5. package/dist/components/AnnotationManager/AnnotationManager.types.d.ts +120 -0
  6. package/dist/components/AnnotationManager/AnnotationManager.types.d.ts.map +1 -0
  7. package/dist/components/FolderBrowser/FolderBrowser.d.ts +2 -115
  8. package/dist/components/FolderBrowser/FolderBrowser.d.ts.map +1 -1
  9. package/dist/components/FolderBrowser/FolderBrowser.render.d.ts +12 -0
  10. package/dist/components/FolderBrowser/FolderBrowser.render.d.ts.map +1 -0
  11. package/dist/components/FolderBrowser/FolderBrowser.types.d.ts +94 -0
  12. package/dist/components/FolderBrowser/FolderBrowser.types.d.ts.map +1 -0
  13. package/dist/components/FolderBrowser/FolderBrowser.utils.d.ts +34 -0
  14. package/dist/components/FolderBrowser/FolderBrowser.utils.d.ts.map +1 -0
  15. package/dist/components/FolderBrowser/useFolderBrowserDataFetching.d.ts +58 -0
  16. package/dist/components/FolderBrowser/useFolderBrowserDataFetching.d.ts.map +1 -0
  17. package/dist/components/FolderThumbnailBrowser/FolderThumbnailBrowser.d.ts +54 -0
  18. package/dist/components/FolderThumbnailBrowser/FolderThumbnailBrowser.d.ts.map +1 -0
  19. package/dist/components/SlideViewer/SlideViewer.d.ts +2 -169
  20. package/dist/components/SlideViewer/SlideViewer.d.ts.map +1 -1
  21. package/dist/components/SlideViewer/SlideViewer.types.d.ts +175 -0
  22. package/dist/components/SlideViewer/SlideViewer.types.d.ts.map +1 -0
  23. package/dist/components/SlideViewer/SlideViewer.utils.d.ts +46 -0
  24. package/dist/components/SlideViewer/SlideViewer.utils.d.ts.map +1 -0
  25. package/dist/components/SlideViewer/hooks/index.d.ts +5 -0
  26. package/dist/components/SlideViewer/hooks/index.d.ts.map +1 -0
  27. package/dist/components/SlideViewer/hooks/useAnnotationFetching.d.ts +23 -0
  28. package/dist/components/SlideViewer/hooks/useAnnotationFetching.d.ts.map +1 -0
  29. package/dist/components/SlideViewer/hooks/useAnnotationOpacity.d.ts +8 -0
  30. package/dist/components/SlideViewer/hooks/useAnnotationOpacity.d.ts.map +1 -0
  31. package/dist/components/SlideViewer/hooks/useAnnotationRendering.d.ts +14 -0
  32. package/dist/components/SlideViewer/hooks/useAnnotationRendering.d.ts.map +1 -0
  33. package/dist/components/SlideViewer/hooks/useSlideViewerInitialization.d.ts +21 -0
  34. package/dist/components/SlideViewer/hooks/useSlideViewerInitialization.d.ts.map +1 -0
  35. package/dist/components/ThumbnailGrid/ThumbnailGrid.d.ts +55 -0
  36. package/dist/components/ThumbnailGrid/ThumbnailGrid.d.ts.map +1 -0
  37. package/dist/components/ThumbnailViewer/ThumbnailViewer.d.ts +45 -0
  38. package/dist/components/ThumbnailViewer/ThumbnailViewer.d.ts.map +1 -0
  39. package/dist/index.cjs +70 -70
  40. package/dist/index.cjs.map +1 -1
  41. package/dist/index.d.ts +7 -0
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +38794 -37706
  44. package/dist/index.js.map +1 -1
  45. package/dist/style.css +1 -1
  46. package/dist/utils/debugLog.d.ts +18 -0
  47. package/dist/utils/debugLog.d.ts.map +1 -0
  48. package/package.json +1 -1
@@ -0,0 +1,175 @@
1
+ import { FeatureCollection } from 'geojson';
2
+ import { Viewer as OpenSeadragonViewer, Options as OpenSeadragonOptions } from 'openseadragon';
3
+ import { default as React } from 'react';
4
+
5
+ export interface SlideImageInfo {
6
+ /** Image ID from DSA (used if dziUrl is not provided) */
7
+ imageId?: string | number;
8
+ /** Image width in pixels (used if dziUrl is not provided) */
9
+ width?: number;
10
+ /** Image height in pixels (used if dziUrl is not provided) */
11
+ height?: number;
12
+ /** Tile width (used if dziUrl is not provided) */
13
+ tileWidth?: number;
14
+ /** Number of zoom levels (used if dziUrl is not provided) */
15
+ levels?: number;
16
+ /** Base URL for DSA tile server (used if dziUrl is not provided) */
17
+ baseUrl?: string;
18
+ /** DZI descriptor URL (e.g., 'http://bdsa.pathology.emory.edu:8080/api/v1/item/{itemId}/tiles/dzi.dzi')
19
+ * If provided, this will be used instead of manually constructing tile URLs */
20
+ dziUrl?: string;
21
+ }
22
+ export interface AnnotationFeature {
23
+ /** Unique identifier for the annotation */
24
+ id?: string | number;
25
+ /** Left coordinate in pixels */
26
+ left: number;
27
+ /** Top coordinate in pixels */
28
+ top: number;
29
+ /** Width in pixels */
30
+ width: number;
31
+ /** Height in pixels */
32
+ height: number;
33
+ /** Optional color for the annotation stroke */
34
+ color?: string;
35
+ /** Optional group identifier */
36
+ group?: string | number;
37
+ /** Optional label */
38
+ label?: string;
39
+ /** Type of annotation (rectangle, polyline, etc.) */
40
+ annotationType?: 'rectangle' | 'polyline';
41
+ /** Points array for polyline annotations */
42
+ points?: Array<[number, number]>;
43
+ /** Whether polyline is closed */
44
+ closed?: boolean;
45
+ /** Fill color for polyline */
46
+ fillColor?: string;
47
+ /** Store full element for rendering */
48
+ element?: unknown;
49
+ /** Optional additional properties */
50
+ [key: string]: unknown;
51
+ }
52
+ export interface AnnotationInfoProperty {
53
+ /** Key to access the property value from the annotation document */
54
+ key: string;
55
+ /** Display label for this property */
56
+ label: string;
57
+ /** Optional formatter function to transform the value before display */
58
+ formatter?: (value: unknown, doc: {
59
+ id: string | number;
60
+ elementCount: number;
61
+ totalPoints: number;
62
+ types: string[];
63
+ filteredCount?: number;
64
+ filteredPoints?: number;
65
+ }) => string | React.ReactNode;
66
+ /** Whether to display this property (default: true) */
67
+ show?: boolean;
68
+ }
69
+ export interface AnnotationInfoConfig {
70
+ /** Properties to display for each fetched annotation document */
71
+ documentProperties?: AnnotationInfoProperty[];
72
+ /** Whether to show the "Fetched from DSA API" section */
73
+ showFetchedSection?: boolean;
74
+ /** Whether to show the "Provided Annotations" section */
75
+ showProvidedSection?: boolean;
76
+ /** Whether to show the "Total Rendered" section */
77
+ showTotalSection?: boolean;
78
+ /** Custom header text */
79
+ headerText?: string;
80
+ }
81
+ export interface AnnotationCache {
82
+ get(annotationId: string | number, versionHash?: string): Promise<unknown | null>;
83
+ set(annotationId: string | number, data: unknown, options?: {
84
+ ttl?: number;
85
+ versionHash?: string;
86
+ }): Promise<void>;
87
+ has(annotationId: string | number, versionHash?: string): Promise<boolean>;
88
+ delete(annotationId: string | number): Promise<void>;
89
+ clear(): Promise<void>;
90
+ getStats?(): Promise<{
91
+ size: number;
92
+ hits?: number;
93
+ misses?: number;
94
+ hitRate?: number;
95
+ }>;
96
+ }
97
+ export interface SlideViewerProps {
98
+ /** Image information for the slide to display */
99
+ imageInfo: SlideImageInfo;
100
+ /** Annotations to render on the slide (array of rectangles or GeoJSON) */
101
+ annotations?: AnnotationFeature[] | FeatureCollection;
102
+ /** Annotation IDs to fetch from DSA API (baseUrl/annotation/{id}) */
103
+ annotationIds?: (string | number)[];
104
+ /** Base URL for DSA API (e.g., 'http://bdsa.pathology.emory.edu:8080/api/v1') */
105
+ apiBaseUrl?: string;
106
+ /** Callback when viewer is ready */
107
+ onViewerReady?: (viewer: OpenSeadragonViewer) => void;
108
+ /** Callback when annotation is clicked */
109
+ onAnnotationClick?: (annotation: AnnotationFeature) => void;
110
+ /** Default stroke color for annotations */
111
+ defaultAnnotationColor?: string;
112
+ /** Stroke width for annotations */
113
+ strokeWidth?: number;
114
+ /** Additional OpenSeadragon configuration options */
115
+ osdOptions?: OpenSeadragonOptions;
116
+ /** Custom CSS class name */
117
+ className?: string;
118
+ /** Height for the viewer container (e.g., '600px', '100vh', '100%').
119
+ * Required: OpenSeadragon needs an explicit height to initialize properly. */
120
+ height?: string | number;
121
+ /** Width for the viewer container (defaults to '100%') */
122
+ width?: string | number;
123
+ /** Display information about loaded annotation documents */
124
+ showAnnotationInfo?: boolean;
125
+ /** Configuration for customizing the annotation info panel display */
126
+ annotationInfoConfig?: AnnotationInfoConfig;
127
+ /** Maximum number of points allowed per annotation element (default: 10000).
128
+ * Annotations exceeding this limit will be skipped with a warning. */
129
+ maxPointsPerAnnotation?: number;
130
+ /** Maximum total number of points allowed across all annotations (default: 100000).
131
+ * If exceeded, annotations will be filtered starting from the largest ones. */
132
+ maxTotalPoints?: number;
133
+ /** Custom fetch function for API requests. Useful for adding authentication headers.
134
+ * If not provided, uses the default `fetch`. The function should match the Fetch API signature. */
135
+ fetchFn?: (url: string, options?: RequestInit) => Promise<Response>;
136
+ /** Custom headers to add to all API requests. Merged with fetchFn headers if both are provided. */
137
+ apiHeaders?: HeadersInit;
138
+ /** Authentication token to use for requests. Can be extracted from apiHeaders automatically if not provided. */
139
+ authToken?: string;
140
+ /** If true, appends the authentication token as a query parameter (?token=...) to all requests (DZI, tiles, annotations).
141
+ * This is required for some DSA servers that validate tokens via query parameters instead of (or in addition to) headers.
142
+ * Default: false */
143
+ tokenQueryParam?: boolean;
144
+ /** Show annotation controls panel in the sidebar (default: false) */
145
+ showAnnotationControls?: boolean;
146
+ /** Default opacity for all annotations (0-1, default: 1) */
147
+ defaultAnnotationOpacity?: number;
148
+ /** Map of annotation IDs to their individual opacity values (0-1). Overrides defaultAnnotationOpacity for specific annotations. */
149
+ annotationOpacities?: Map<string | number, number> | Record<string, number>;
150
+ /** Map of annotation IDs to their visibility state. If provided, only visible annotations will be rendered/updated. */
151
+ visibleAnnotations?: Map<string | number, boolean> | Record<string, boolean>;
152
+ /** Callback when annotation has finished loading and rendering. Called with the annotation ID. */
153
+ onAnnotationReady?: (annotationId: string | number) => void;
154
+ /** Optional pull-through cache for annotation documents. Acts as a cache-aside proxy:
155
+ * 1. Checks cache first on fetch requests
156
+ * 2. On cache miss, fetches from API and stores in cache
157
+ * 3. On cache hit, returns cached data immediately (no API call)
158
+ * If not provided, automatically creates an IndexedDBAnnotationCache. Set to `null` to disable caching. */
159
+ annotationCache?: AnnotationCache | null;
160
+ /** If true, disables caching entirely (equivalent to annotationCache={null}). Useful for debugging or forcing fresh fetches. */
161
+ disableCache?: boolean;
162
+ /** If true, disables the IntersectionObserver visibility check and initializes immediately.
163
+ * Useful for cases where you want immediate initialization regardless of viewport visibility.
164
+ * Default: false (visibility check enabled for better performance and error prevention) */
165
+ disableVisibilityCheck?: boolean;
166
+ /** Optional map of annotation headers (from /annotation?itemId=... endpoint) keyed by annotation ID.
167
+ * If provided, used to compute version hashes for cache invalidation when annotations change on the server.
168
+ * Should contain the metadata objects returned from AnnotationManager's annotation search endpoint.
169
+ * Typically obtained from AnnotationManager: `annotations.map(ann => [ann._id, ann])` or similar.
170
+ * If not provided, cache will work but version-based invalidation will be disabled. */
171
+ annotationHeaders?: Map<string | number, unknown> | Record<string, unknown>;
172
+ /** If true, enables debug logging to console. Default: false */
173
+ debug?: boolean;
174
+ }
175
+ //# sourceMappingURL=SlideViewer.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SlideViewer.types.d.ts","sourceRoot":"","sources":["../../../src/components/SlideViewer/SlideViewer.types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { AnnotationInfoConfig, AnnotationFeature } from './SlideViewer.types';
2
+
3
+ /**
4
+ * Compute version hash from annotation header for cache invalidation
5
+ * Extracts version-relevant fields and computes a hash
6
+ */
7
+ export declare function computeVersionHash(header: Record<string, unknown>): string;
8
+ /**
9
+ * Extract authentication token from authToken prop or apiHeaders
10
+ */
11
+ export declare function extractToken(authToken?: string, apiHeaders?: HeadersInit): string | undefined;
12
+ /**
13
+ * Append authentication token as query parameter to a URL
14
+ */
15
+ export declare function appendTokenToUrl(url: string, token?: string): string;
16
+ /**
17
+ * Helper function to apply opacity to a color string
18
+ * Always returns rgba format for consistency, even at 100% opacity
19
+ */
20
+ export declare function applyOpacity(color: string, opacity: number): string;
21
+ /**
22
+ * Parse annotation document into AnnotationFeature array
23
+ */
24
+ export interface ParseAnnotationResult {
25
+ features: AnnotationFeature[];
26
+ docInfo: {
27
+ id: string | number;
28
+ elementCount: number;
29
+ totalPoints: number;
30
+ types: string[];
31
+ filteredCount?: number;
32
+ filteredPoints?: number;
33
+ };
34
+ filteredCount: number;
35
+ filteredPoints: number;
36
+ }
37
+ export declare function parseAnnotationDocument(annotationDoc: unknown, annotationId: string | number, defaultAnnotationColor: string, maxPointsPerAnnotation: number): ParseAnnotationResult;
38
+ /**
39
+ * Filter annotations by total point limit
40
+ */
41
+ export declare function filterAnnotationsByTotalPoints(annotations: AnnotationFeature[], maxTotalPoints: number): AnnotationFeature[];
42
+ /**
43
+ * Default configuration for annotation info panel
44
+ */
45
+ export declare const DEFAULT_ANNOTATION_INFO_CONFIG: AnnotationInfoConfig;
46
+ //# sourceMappingURL=SlideViewer.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SlideViewer.utils.d.ts","sourceRoot":"","sources":["../../../src/components/SlideViewer/SlideViewer.utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAGlF;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAwB1E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAoC7F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAOpE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CA2CnE;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IAClC,QAAQ,EAAE,iBAAiB,EAAE,CAAA;IAC7B,OAAO,EAAE;QACL,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;QACnB,YAAY,EAAE,MAAM,CAAA;QACpB,WAAW,EAAE,MAAM,CAAA;QACnB,KAAK,EAAE,MAAM,EAAE,CAAA;QACf,aAAa,CAAC,EAAE,MAAM,CAAA;QACtB,cAAc,CAAC,EAAE,MAAM,CAAA;KAC1B,CAAA;IACD,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;CACzB;AAED,wBAAgB,uBAAuB,CACnC,aAAa,EAAE,OAAO,EACtB,YAAY,EAAE,MAAM,GAAG,MAAM,EAC7B,sBAAsB,EAAE,MAAM,EAC9B,sBAAsB,EAAE,MAAM,GAC/B,qBAAqB,CAsHvB;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC1C,WAAW,EAAE,iBAAiB,EAAE,EAChC,cAAc,EAAE,MAAM,GACvB,iBAAiB,EAAE,CAgDrB;AAED;;GAEG;AACH,eAAO,MAAM,8BAA8B,EAAE,oBA2B5C,CAAA"}
@@ -0,0 +1,5 @@
1
+ export { useAnnotationFetching, type UseAnnotationFetchingResult } from './useAnnotationFetching';
2
+ export { useAnnotationRendering } from './useAnnotationRendering';
3
+ export { useAnnotationOpacity } from './useAnnotationOpacity';
4
+ export { useSlideViewerInitialization } from './useSlideViewerInitialization';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/SlideViewer/hooks/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,KAAK,2BAA2B,EAAE,MAAM,yBAAyB,CAAA;AACjG,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAA"}
@@ -0,0 +1,23 @@
1
+ import { default as React } from 'react';
2
+ import { AnnotationFeature } from '../SlideViewer.types';
3
+
4
+ export interface UseAnnotationFetchingResult {
5
+ fetchedAnnotations: AnnotationFeature[];
6
+ annotationDocuments: Array<{
7
+ id: string | number;
8
+ elementCount: number;
9
+ totalPoints: number;
10
+ types: string[];
11
+ filteredCount?: number;
12
+ filteredPoints?: number;
13
+ }>;
14
+ }
15
+ export declare function useAnnotationFetching(annotationIds: (string | number)[] | undefined, apiBaseUrl: string | undefined, defaultAnnotationColor: string, maxPointsPerAnnotation: number, maxTotalPoints: number, wrappedFetch: (url: string, options?: RequestInit) => Promise<Response>, cache: {
16
+ get(annotationId: string | number, versionHash?: string): Promise<unknown | null>;
17
+ set(annotationId: string | number, data: unknown, options?: {
18
+ ttl?: number;
19
+ versionHash?: string;
20
+ }): Promise<void>;
21
+ delete(annotationId: string | number): Promise<void>;
22
+ } | null, annotationHeaders: Map<string | number, unknown> | Record<string, unknown> | undefined, apiHeaders: HeadersInit | undefined, isMountedRef: React.MutableRefObject<boolean>, debug: boolean): UseAnnotationFetchingResult;
23
+ //# sourceMappingURL=useAnnotationFetching.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAnnotationFetching.d.ts","sourceRoot":"","sources":["../../../../src/components/SlideViewer/hooks/useAnnotationFetching.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAI7D,MAAM,WAAW,2BAA2B;IACxC,kBAAkB,EAAE,iBAAiB,EAAE,CAAA;IACvC,mBAAmB,EAAE,KAAK,CAAC;QACvB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;QACnB,YAAY,EAAE,MAAM,CAAA;QACpB,WAAW,EAAE,MAAM,CAAA;QACnB,KAAK,EAAE,MAAM,EAAE,CAAA;QACf,aAAa,CAAC,EAAE,MAAM,CAAA;QACtB,cAAc,CAAC,EAAE,MAAM,CAAA;KAC1B,CAAC,CAAA;CACL;AAED,wBAAgB,qBAAqB,CACjC,aAAa,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,SAAS,EAC9C,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,sBAAsB,EAAE,MAAM,EAC9B,sBAAsB,EAAE,MAAM,EAC9B,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,EACvE,KAAK,EAAE;IACH,GAAG,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;IACjF,GAAG,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClH,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACvD,GAAG,IAAI,EACR,iBAAiB,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACtF,UAAU,EAAE,WAAW,GAAG,SAAS,EACnC,YAAY,EAAE,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAC7C,KAAK,EAAE,OAAO,GACf,2BAA2B,CA4M7B"}
@@ -0,0 +1,8 @@
1
+ import { PaperOverlay, AnnotationToolkit } from 'osd-paperjs-annotation';
2
+ import { Viewer as OpenSeadragonViewer } from 'openseadragon';
3
+
4
+ /**
5
+ * Hook to handle annotation opacity updates without full re-renders
6
+ */
7
+ export declare function useAnnotationOpacity(viewer: OpenSeadragonViewer | null, overlay: PaperOverlay | null, toolkit: AnnotationToolkit | null, annotationOpacity: number, annotationOpacities: Map<string | number, number> | Record<string, number> | undefined, visibleAnnotations: Map<string | number, boolean> | Record<string, boolean> | undefined, defaultAnnotationOpacity: number, defaultAnnotationColor: string, safeDrawPaperView: (paperScope: PaperOverlay['paperScope']) => void): void;
8
+ //# sourceMappingURL=useAnnotationOpacity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAnnotationOpacity.d.ts","sourceRoot":"","sources":["../../../../src/components/SlideViewer/hooks/useAnnotationOpacity.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,KAAK,EAAE,MAAM,IAAI,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAElE;;GAEG;AACH,wBAAgB,oBAAoB,CAChC,MAAM,EAAE,mBAAmB,GAAG,IAAI,EAClC,OAAO,EAAE,YAAY,GAAG,IAAI,EAC5B,OAAO,EAAE,iBAAiB,GAAG,IAAI,EACjC,iBAAiB,EAAE,MAAM,EACzB,mBAAmB,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACtF,kBAAkB,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACvF,wBAAwB,EAAE,MAAM,EAChC,sBAAsB,EAAE,MAAM,EAC9B,iBAAiB,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC,YAAY,CAAC,KAAK,IAAI,QA0HtE"}
@@ -0,0 +1,14 @@
1
+ import { default as React } from 'react';
2
+ import { AnnotationFeature } from '../SlideViewer.types';
3
+ import { PaperOverlay, AnnotationToolkit } from 'osd-paperjs-annotation';
4
+ import { Viewer as OpenSeadragonViewer } from 'openseadragon';
5
+ import { DebugLogger } from '../../../utils/debugLog';
6
+
7
+ /**
8
+ * Hook to handle annotation rendering in Paper.js
9
+ */
10
+ export declare function useAnnotationRendering(viewer: OpenSeadragonViewer | null, overlay: PaperOverlay | null, toolkit: AnnotationToolkit | null, parsedManualAnnotations: AnnotationFeature[], fetchedAnnotations: AnnotationFeature[], annotationsKey: string, fetchedAnnotationsKey: string, annotationOpacity: number, annotationOpacities: Map<string | number, number> | Record<string, number> | undefined, visibleAnnotations: Map<string | number, boolean> | Record<string, boolean> | undefined, defaultAnnotationColor: string, strokeWidth: number, onAnnotationClickRef: React.MutableRefObject<((annotation: AnnotationFeature) => void) | undefined>, onAnnotationReady: ((annotationId: string | number) => void) | undefined, tiledImageRef: React.MutableRefObject<{
11
+ addPaperItem: (item: unknown) => void;
12
+ paperItems?: unknown[];
13
+ } | null>, lastRenderedAnnotationsRef: React.MutableRefObject<string>, safeDrawPaperView: (paperScope: PaperOverlay['paperScope']) => void, debugLog: DebugLogger): void;
14
+ //# sourceMappingURL=useAnnotationRendering.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAnnotationRendering.d.ts","sourceRoot":"","sources":["../../../../src/components/SlideViewer/hooks/useAnnotationRendering.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAE7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,KAAK,EAAE,MAAM,IAAI,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAE1D;;GAEG;AACH,wBAAgB,sBAAsB,CAClC,MAAM,EAAE,mBAAmB,GAAG,IAAI,EAClC,OAAO,EAAE,YAAY,GAAG,IAAI,EAC5B,OAAO,EAAE,iBAAiB,GAAG,IAAI,EACjC,uBAAuB,EAAE,iBAAiB,EAAE,EAC5C,kBAAkB,EAAE,iBAAiB,EAAE,EACvC,cAAc,EAAE,MAAM,EACtB,qBAAqB,EAAE,MAAM,EAC7B,iBAAiB,EAAE,MAAM,EACzB,mBAAmB,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACtF,kBAAkB,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACvF,sBAAsB,EAAE,MAAM,EAC9B,WAAW,EAAE,MAAM,EACnB,oBAAoB,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,EAAE,iBAAiB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,EACnG,iBAAiB,EAAE,CAAC,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,EACxE,aAAa,EAAE,KAAK,CAAC,gBAAgB,CAAC;IAAE,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAA;CAAE,GAAG,IAAI,CAAC,EAC/G,0BAA0B,EAAE,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAC1D,iBAAiB,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC,YAAY,CAAC,KAAK,IAAI,EACnE,QAAQ,EAAE,WAAW,QA4RxB"}
@@ -0,0 +1,21 @@
1
+ import { default as React } from 'react';
2
+ import { PaperOverlay, AnnotationToolkit } from 'osd-paperjs-annotation';
3
+ import { Viewer as OpenSeadragonViewer, Options as OpenSeadragonOptions } from 'openseadragon';
4
+ import { DebugLogger } from '../../../utils/debugLog';
5
+
6
+ /**
7
+ * Hook to handle OpenSeadragon viewer initialization
8
+ */
9
+ export declare function useSlideViewerInitialization(containerRef: React.RefObject<HTMLDivElement>, isVisible: boolean, isMountedRef: React.MutableRefObject<boolean>, isInitializedRef: React.MutableRefObject<boolean>, lastImageKeyRef: React.MutableRefObject<string>, viewerIdRef: React.MutableRefObject<string>, imageKey: string, processedDziUrl: string | null | undefined, imageInfo: {
10
+ imageId?: string | number;
11
+ width?: number;
12
+ height?: number;
13
+ tileWidth?: number;
14
+ levels?: number;
15
+ baseUrl?: string;
16
+ dziUrl?: string;
17
+ }, token: string | null | undefined, tokenQueryParam: boolean, apiHeaders: HeadersInit | undefined, osdOptions: OpenSeadragonOptions | undefined, onViewerReadyRef: React.MutableRefObject<((viewer: OpenSeadragonViewer) => void) | undefined>, setViewer: (viewer: OpenSeadragonViewer | null) => void, setOverlay: (overlay: PaperOverlay | null) => void, setToolkit: (toolkit: AnnotationToolkit | null) => void, tiledImageRef: React.MutableRefObject<{
18
+ addPaperItem: (item: unknown) => void;
19
+ paperItems?: unknown[];
20
+ } | null>, appendTokenToUrl: (url: string, token: string) => string, debugLog: DebugLogger): void;
21
+ //# sourceMappingURL=useSlideViewerInitialization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSlideViewerInitialization.d.ts","sourceRoot":"","sources":["../../../../src/components/SlideViewer/hooks/useSlideViewerInitialization.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,KAAK,EAAE,MAAM,IAAI,mBAAmB,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAEnG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAE1D;;GAEG;AACH,wBAAgB,4BAA4B,CACxC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,EAC7C,SAAS,EAAE,OAAO,EAClB,YAAY,EAAE,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAC7C,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,EACjD,eAAe,EAAE,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAC/C,WAAW,EAAE,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAC3C,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC1C,SAAS,EAAE;IACP,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACzB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;CAClB,EACD,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,eAAe,EAAE,OAAO,EACxB,UAAU,EAAE,WAAW,GAAG,SAAS,EACnC,UAAU,EAAE,oBAAoB,GAAG,SAAS,EAC5C,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,EAC7F,SAAS,EAAE,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,KAAK,IAAI,EACvD,UAAU,EAAE,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,KAAK,IAAI,EAClD,UAAU,EAAE,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,KAAK,IAAI,EACvD,aAAa,EAAE,KAAK,CAAC,gBAAgB,CAAC;IAAE,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAA;CAAE,GAAG,IAAI,CAAC,EAC/G,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,EACxD,QAAQ,EAAE,WAAW,QAkVxB"}
@@ -0,0 +1,55 @@
1
+ import { default as React } from 'react';
2
+ import { Item } from '../../utils/itemUtils';
3
+
4
+ export interface ThumbnailGridProps {
5
+ /** DSA folder ID to fetch items from */
6
+ folderId?: string;
7
+ /** Array of specific image IDs to display */
8
+ imageIds?: string[];
9
+ /** Pre-loaded items array (takes precedence) */
10
+ items?: Item[];
11
+ /** DSA API base URL (e.g., "http://bdsa.pathology.emory.edu:8080/api/v1") */
12
+ apiBaseUrl: string;
13
+ /** Backend API base URL for fetching items (optional, falls back to apiBaseUrl if not provided) */
14
+ backendApiBaseUrl?: string;
15
+ /** Headers for API requests (auth, etc.) */
16
+ apiHeaders?: HeadersInit;
17
+ /** Authentication token to use for requests. Can be extracted from apiHeaders automatically if not provided. */
18
+ authToken?: string;
19
+ /** If true, appends the authentication token as a query parameter (?token=...) to thumbnail URLs.
20
+ * This is required for some DSA servers that validate tokens via query parameters instead of (or in addition to) headers.
21
+ * Default: false */
22
+ tokenQueryParam?: boolean;
23
+ /** Custom fetch function for API requests */
24
+ fetchFn?: (url: string, options?: RequestInit) => Promise<Response>;
25
+ /** Initial items per page estimate (default: 12) */
26
+ itemsPerPage?: number;
27
+ /** Thumbnail size preset (default: 'l') */
28
+ thumbnailSize?: 's' | 'm' | 'l' | 'xl';
29
+ /** Thumbnail image size in pixels (default: 512) - Note: Currently not used, DSA API handles size automatically */
30
+ thumbnailImageSize?: number;
31
+ /** Display name for model (if viewing model training images) */
32
+ modelName?: string;
33
+ /** Dataset split information */
34
+ modelDatasetInfo?: {
35
+ train: string[];
36
+ val: string[];
37
+ test: string[];
38
+ };
39
+ /** Called when items are loaded/filtered */
40
+ onItemsLoaded?: (itemIds: string[]) => void;
41
+ /** Function to determine dataset type */
42
+ getDatasetType?: (itemId: string) => 'train' | 'val' | 'test' | null;
43
+ /** Callback when thumbnail is clicked */
44
+ onThumbnailClick?: (item: Item) => void;
45
+ /** Debug mode for logging */
46
+ debug?: boolean;
47
+ /** Custom CSS class */
48
+ className?: string;
49
+ }
50
+ /**
51
+ * Basic thumbnail grid component that displays static thumbnail images.
52
+ * This is a lightweight alternative to FolderThumbnailBrowser that doesn't use OpenSeadragon.
53
+ */
54
+ export declare const ThumbnailGrid: React.ForwardRefExoticComponent<ThumbnailGridProps & React.RefAttributes<HTMLDivElement>>;
55
+ //# sourceMappingURL=ThumbnailGrid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThumbnailGrid.d.ts","sourceRoot":"","sources":["../../../src/components/ThumbnailGrid/ThumbnailGrid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAA;AAChF,OAAO,EAAgC,KAAK,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAE/E,OAAO,qBAAqB,CAAA;AAE5B,MAAM,WAAW,kBAAkB;IAE/B,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,gDAAgD;IAChD,KAAK,CAAC,EAAE,IAAI,EAAE,CAAA;IAGd,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAA;IAClB,mGAAmG;IACnG,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,4CAA4C;IAC5C,UAAU,CAAC,EAAE,WAAW,CAAA;IACxB,gHAAgH;IAChH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;yBAEqB;IACrB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;IAGnE,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAA;IACtC,mHAAmH;IACnH,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAG3B,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gCAAgC;IAChC,gBAAgB,CAAC,EAAE;QACf,KAAK,EAAE,MAAM,EAAE,CAAA;QACf,GAAG,EAAE,MAAM,EAAE,CAAA;QACb,IAAI,EAAE,MAAM,EAAE,CAAA;KACjB,CAAA;IAGD,4CAA4C;IAC5C,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IAC3C,yCAAyC;IACzC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI,CAAA;IACpE,yCAAyC;IACzC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAA;IAGvC,6BAA6B;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAYD;;;GAGG;AACH,eAAO,MAAM,aAAa,2FA2bzB,CAAA"}
@@ -0,0 +1,45 @@
1
+ import { default as React } from 'react';
2
+ import { Item } from '../../utils/itemUtils';
3
+
4
+ /**
5
+ * Update opacity for a specific annotation across all thumbnails
6
+ */
7
+ export declare function updateThumbnailOpacity(annotationId: string, opacity: number): void;
8
+ /**
9
+ * Get current opacity for an annotation
10
+ */
11
+ export declare function getThumbnailOpacity(annotationId: string): number;
12
+ /**
13
+ * Clear all opacity settings
14
+ */
15
+ export declare function clearThumbnailOpacities(): void;
16
+ export interface ThumbnailViewerProps {
17
+ /** DSA item object with _id, name, meta, etc. */
18
+ item: Item;
19
+ /** Width of thumbnail in pixels */
20
+ viewerWidth: number;
21
+ /** DSA API base URL */
22
+ apiBaseUrl: string;
23
+ /** Backend API base URL for annotation caching (optional) */
24
+ backendApiBaseUrl?: string;
25
+ /** Headers for API requests */
26
+ apiHeaders?: HeadersInit;
27
+ /** Name of currently selected annotation */
28
+ selectedAnnotationName?: string;
29
+ /** Map of itemId -> annotationId */
30
+ annotationNameToIds?: Map<string, string> | Record<string, string>;
31
+ /** Function to determine dataset type (train/val/test) */
32
+ getDatasetType?: (itemId: string) => 'train' | 'val' | 'test' | null;
33
+ /** Show OpenSeadragon navigation controls (zoom, home, fullscreen) (default: false) */
34
+ showViewerControls?: boolean;
35
+ /** Custom fetch function for API requests */
36
+ fetchFn?: (url: string, options?: RequestInit) => Promise<Response>;
37
+ /** Debug mode for logging */
38
+ debug?: boolean;
39
+ }
40
+ /**
41
+ * Individual thumbnail component that wraps SlideViewer for displaying a single DSA item
42
+ * with optional annotation overlay.
43
+ */
44
+ export declare const ThumbnailViewer: React.NamedExoticComponent<ThumbnailViewerProps>;
45
+ //# sourceMappingURL=ThumbnailViewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThumbnailViewer.d.ts","sourceRoot":"","sources":["../../../src/components/ThumbnailViewer/ThumbnailViewer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAA;AAEhF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAEjD,OAAO,uBAAuB,CAAA;AAS9B;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAGlF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAG9C;AAED,MAAM,WAAW,oBAAoB;IACjC,iDAAiD;IACjD,IAAI,EAAE,IAAI,CAAA;IACV,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAA;IACnB,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,+BAA+B;IAC/B,UAAU,CAAC,EAAE,WAAW,CAAA;IACxB,4CAA4C;IAC5C,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,oCAAoC;IACpC,mBAAmB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClE,0DAA0D;IAC1D,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI,CAAA;IACpE,uFAAuF;IACvF,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,6CAA6C;IAC7C,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;IACnE,6BAA6B;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,kDA6e3B,CAAA"}