pdf-mapview 0.1.1 → 0.1.3
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/README.md +3 -0
- package/dist/client/index.cjs +13 -1
- package/dist/client/index.cjs.map +1 -1
- package/dist/client/index.d.cts +2 -1
- package/dist/client/index.d.ts +2 -1
- package/dist/client/index.js +12 -2
- package/dist/client/index.js.map +1 -1
- package/dist/pdf.worker.min.mjs +21 -0
- package/dist/shared/index.cjs +5 -0
- package/dist/shared/index.cjs.map +1 -1
- package/dist/shared/index.d.cts +1 -1
- package/dist/shared/index.d.ts +1 -1
- package/dist/shared/index.js +4 -1
- package/dist/shared/index.js.map +1 -1
- package/dist/{source-DHrup45h.d.cts → source-CGfHymsL.d.cts} +4 -1
- package/dist/{source-Cb1QZPVw.d.ts → source-CfLTVdEE.d.ts} +4 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -57,11 +57,14 @@ function Floorplan({ manifest }: { manifest: any }) {
|
|
|
57
57
|
### PDF fallback source
|
|
58
58
|
|
|
59
59
|
```tsx
|
|
60
|
+
import { pdfWorkerUrl } from "pdf-mapview";
|
|
61
|
+
|
|
60
62
|
<TileMapViewer
|
|
61
63
|
source={{
|
|
62
64
|
type: "pdf",
|
|
63
65
|
file: "/plan.pdf",
|
|
64
66
|
page: 1,
|
|
67
|
+
workerSrc: pdfWorkerUrl,
|
|
65
68
|
}}
|
|
66
69
|
/>
|
|
67
70
|
```
|
package/dist/client/index.cjs
CHANGED
|
@@ -4,6 +4,7 @@ var react = require('react');
|
|
|
4
4
|
var zod = require('zod');
|
|
5
5
|
var jsxRuntime = require('react/jsx-runtime');
|
|
6
6
|
|
|
7
|
+
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
7
8
|
// src/client/components/TileMapViewer.tsx
|
|
8
9
|
var normalizedPointSchema = zod.z.object({
|
|
9
10
|
x: zod.z.number().finite().min(0).max(1),
|
|
@@ -738,17 +739,27 @@ function toUint8Array(input) {
|
|
|
738
739
|
return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);
|
|
739
740
|
}
|
|
740
741
|
|
|
742
|
+
// src/shared/pdfWorkerUrl.ts
|
|
743
|
+
var pdfWorkerUrl = new URL("../pdf.worker.min.mjs", (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))).toString();
|
|
744
|
+
|
|
741
745
|
// src/client/engines/pdfJsEngine.ts
|
|
742
746
|
async function createPdfJsEngine(options) {
|
|
743
747
|
if (options.source.type !== "pdf") {
|
|
744
748
|
throw new Error("PDF.js engine only supports PDF sources.");
|
|
745
749
|
}
|
|
746
750
|
throwIfAborted2(options.signal);
|
|
747
|
-
const pdfjs = await import('pdfjs-dist/build/pdf.mjs');
|
|
751
|
+
const pdfjs = await import('pdfjs-dist/legacy/build/pdf.mjs');
|
|
748
752
|
throwIfAborted2(options.signal);
|
|
749
753
|
if (!options.container.isConnected) {
|
|
750
754
|
throw createAbortError2();
|
|
751
755
|
}
|
|
756
|
+
const workerSrc = options.source.workerSrc ?? pdfWorkerUrl;
|
|
757
|
+
if (!workerSrc) {
|
|
758
|
+
throw new Error(
|
|
759
|
+
"PDF sources require a configured worker URL. Pass source.workerSrc or use pdfWorkerUrl from pdf-mapview."
|
|
760
|
+
);
|
|
761
|
+
}
|
|
762
|
+
pdfjs.GlobalWorkerOptions.workerSrc = workerSrc;
|
|
752
763
|
const file = options.source.file;
|
|
753
764
|
const loadingTask = pdfjs.getDocument(
|
|
754
765
|
typeof file === "string" ? {
|
|
@@ -1148,6 +1159,7 @@ function useRegions() {
|
|
|
1148
1159
|
|
|
1149
1160
|
exports.PdfMap = PdfMap;
|
|
1150
1161
|
exports.TileMapViewer = TileMapViewer;
|
|
1162
|
+
exports.pdfWorkerUrl = pdfWorkerUrl;
|
|
1151
1163
|
exports.useMapApi = useMapApi;
|
|
1152
1164
|
exports.useRegions = useRegions;
|
|
1153
1165
|
exports.useViewportState = useViewportState;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/shared/overlays.ts","../../src/client/core/ViewportStore.ts","../../src/client/core/overlayProjection.ts","../../src/client/core/MapController.ts","../../src/client/runtimeContext.ts","../../src/client/hooks/useMapApi.ts","../../src/client/hooks/useViewportState.ts","../../src/client/components/RegionLabelLayer.tsx","../../src/client/components/OverlayLayer.tsx","../../src/shared/coordinates.ts","../../src/shared/manifest.ts","../../src/client/engines/openSeadragonEngine.ts","../../src/shared/bytes.ts","../../src/client/engines/pdfJsEngine.ts","../../src/client/components/TileMapViewer.tsx","../../src/client/components/PdfMap.tsx","../../src/client/hooks/useRegions.ts"],"names":["z","createContext","useContext","useSyncExternalStore","jsx","useMemo","jsxs","projected","Fragment","throwIfAborted","createAbortError","forwardRef","TileMapViewer","useRef","useState","useEffect","useImperativeHandle","PdfMap"],"mappings":"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","file":"index.cjs","sourcesContent":["import { z } from \"zod\";\n\nimport type { NormalizedPoint, NormalizedRect } from \"./coordinates\";\n\nexport type RegionGeometryType = \"polygon\" | \"rectangle\" | \"point\" | \"label\";\n\nexport interface PolygonGeometry {\n type: \"polygon\";\n points: NormalizedPoint[];\n}\n\nexport interface RectangleGeometry {\n type: \"rectangle\";\n rect: NormalizedRect;\n}\n\nexport interface PointGeometry {\n type: \"point\";\n point: NormalizedPoint;\n radius?: number;\n}\n\nexport interface LabelGeometry {\n type: \"label\";\n point: NormalizedPoint;\n text: string;\n}\n\nexport type RegionGeometry =\n | PolygonGeometry\n | RectangleGeometry\n | PointGeometry\n | LabelGeometry;\n\nexport interface RegionFeature<Metadata = Record<string, unknown>> {\n id: string;\n geometry: RegionGeometry;\n label?: string;\n metadata?: Metadata;\n}\n\nexport interface RegionCollection<Metadata = Record<string, unknown>> {\n type: \"FeatureCollection\";\n regions: RegionFeature<Metadata>[];\n}\n\nconst normalizedPointSchema = z.object({\n x: z.number().finite().min(0).max(1),\n y: z.number().finite().min(0).max(1),\n});\n\nconst normalizedRectSchema = z.object({\n x: z.number().finite().min(0).max(1),\n y: z.number().finite().min(0).max(1),\n width: z.number().finite().min(0).max(1),\n height: z.number().finite().min(0).max(1),\n});\n\nexport const regionFeatureSchema = z.object({\n id: z.string().min(1),\n geometry: z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"polygon\"),\n points: z.array(normalizedPointSchema).min(3),\n }),\n z.object({\n type: z.literal(\"rectangle\"),\n rect: normalizedRectSchema,\n }),\n z.object({\n type: z.literal(\"point\"),\n point: normalizedPointSchema,\n radius: z.number().finite().positive().optional(),\n }),\n z.object({\n type: z.literal(\"label\"),\n point: normalizedPointSchema,\n text: z.string().min(1),\n }),\n ]),\n label: z.string().optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\nexport const regionCollectionSchema = z.object({\n type: z.literal(\"FeatureCollection\"),\n regions: z.array(regionFeatureSchema),\n});\n\nexport function normalizeRegions(\n input?: RegionCollection | RegionFeature[] | null,\n): RegionFeature[] {\n if (!input) {\n return [];\n }\n\n if (Array.isArray(input)) {\n return input;\n }\n\n return input.regions;\n}\n","import type { MapViewState } from \"../../shared/viewport\";\n\ntype Listener = () => void;\n\nconst defaultViewState: MapViewState = {\n center: { x: 0.5, y: 0.5 },\n zoom: 1,\n minZoom: 0,\n maxZoom: 6,\n containerWidth: 0,\n containerHeight: 0,\n};\n\nexport class ViewportStore {\n private state: MapViewState = defaultViewState;\n private listeners = new Set<Listener>();\n\n getSnapshot(): MapViewState {\n return this.state;\n }\n\n setState(state: MapViewState): void {\n this.state = state;\n for (const listener of this.listeners) {\n listener();\n }\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n}\n","import type { RegionFeature, RegionGeometry } from \"../../shared/overlays\";\nimport type { NormalizedPoint, NormalizedRect } from \"../../shared/coordinates\";\nimport type { ViewportController } from \"../../shared/viewport\";\n\nexport interface ProjectedPoint {\n x: number;\n y: number;\n}\n\nexport interface ProjectedRegion {\n bounds: NormalizedRect;\n path?: string;\n points?: ProjectedPoint[];\n rect?: { x: number; y: number; width: number; height: number };\n center?: ProjectedPoint;\n text?: string;\n}\n\nexport function projectRegion(\n controller: ViewportController,\n region: RegionFeature,\n): ProjectedRegion {\n const bounds = getRegionBounds(region);\n\n switch (region.geometry.type) {\n case \"polygon\": {\n const points = region.geometry.points.map((point) => controller.normalizedToScreen(point));\n return {\n bounds,\n path: points.map((point, index) => `${index === 0 ? \"M\" : \"L\"} ${point.x} ${point.y}`).join(\" \") + \" Z\",\n points,\n };\n }\n case \"rectangle\": {\n const topLeft = controller.normalizedToScreen({\n x: region.geometry.rect.x,\n y: region.geometry.rect.y,\n });\n const bottomRight = controller.normalizedToScreen({\n x: region.geometry.rect.x + region.geometry.rect.width,\n y: region.geometry.rect.y + region.geometry.rect.height,\n });\n return {\n bounds,\n rect: {\n x: topLeft.x,\n y: topLeft.y,\n width: bottomRight.x - topLeft.x,\n height: bottomRight.y - topLeft.y,\n },\n };\n }\n case \"point\": {\n const center = controller.normalizedToScreen(region.geometry.point);\n return {\n bounds,\n center,\n };\n }\n case \"label\": {\n const center = controller.normalizedToScreen(region.geometry.point);\n return {\n bounds,\n center,\n text: region.geometry.text,\n };\n }\n }\n}\n\nexport function getRegionBounds(region: RegionFeature): NormalizedRect {\n return getGeometryBounds(region.geometry);\n}\n\nfunction getGeometryBounds(geometry: RegionGeometry): NormalizedRect {\n switch (geometry.type) {\n case \"rectangle\":\n return geometry.rect;\n case \"point\":\n return {\n x: geometry.point.x,\n y: geometry.point.y,\n width: 0,\n height: 0,\n };\n case \"label\":\n return {\n x: geometry.point.x,\n y: geometry.point.y,\n width: 0,\n height: 0,\n };\n case \"polygon\": {\n const xs = geometry.points.map((point) => point.x);\n const ys = geometry.points.map((point) => point.y);\n const minX = Math.min(...xs);\n const minY = Math.min(...ys);\n const maxX = Math.max(...xs);\n const maxY = Math.max(...ys);\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n }\n }\n}\n\nexport function getRegionCenter(region: RegionFeature): NormalizedPoint {\n const bounds = getRegionBounds(region);\n return {\n x: bounds.x + bounds.width / 2,\n y: bounds.y + bounds.height / 2,\n };\n}\n","import type { RegionFeature } from \"../../shared/overlays\";\nimport type { NormalizedPoint, NormalizedRect } from \"../../shared/coordinates\";\nimport type {\n MapViewState,\n ScreenPoint,\n ViewTransitionOptions,\n ViewportController,\n} from \"../../shared/viewport\";\n\nimport { ViewportStore } from \"./ViewportStore\";\nimport { getRegionBounds } from \"./overlayProjection\";\nimport type { ViewerEngine } from \"../engines/engineTypes\";\n\nexport class MapController implements ViewportController {\n readonly store = new ViewportStore();\n private engine: ViewerEngine | null = null;\n private regions: RegionFeature[] = [];\n\n attachEngine(engine: ViewerEngine): void {\n this.engine = engine;\n }\n\n detachEngine(engine: ViewerEngine): void {\n if (this.engine === engine) {\n this.engine = null;\n }\n }\n\n setRegions(regions: RegionFeature[]): void {\n this.regions = regions;\n }\n\n getView(): MapViewState {\n if (this.engine) {\n return this.engine.getView();\n }\n return this.store.getSnapshot();\n }\n\n setView(view: Partial<MapViewState>, options?: ViewTransitionOptions): void {\n this.engine?.setView(view, options);\n }\n\n fitToBounds(bounds?: NormalizedRect, options?: ViewTransitionOptions): void {\n this.engine?.fitToBounds(bounds, options);\n }\n\n zoomToRegion(regionId: string, options?: ViewTransitionOptions): void {\n const region = this.regions.find((candidate) => candidate.id === regionId);\n if (!region) {\n return;\n }\n this.fitToBounds(getRegionBounds(region), options);\n }\n\n screenToNormalized(point: ScreenPoint): NormalizedPoint {\n return this.engine?.screenToNormalized(point) ?? { x: 0, y: 0 };\n }\n\n normalizedToScreen(point: NormalizedPoint): ScreenPoint {\n return this.engine?.normalizedToScreen(point) ?? { x: 0, y: 0 };\n }\n\n resize(): void {\n this.engine?.resize();\n }\n}\n","import { createContext } from \"react\";\n\nimport type { RegionFeature } from \"../shared/overlays\";\nimport type { MapController } from \"./core/MapController\";\n\nexport interface MapRuntimeValue {\n controller: MapController;\n regions: RegionFeature[];\n}\n\nexport const MapRuntimeContext = createContext<MapRuntimeValue | null>(null);\n","import { useContext } from \"react\";\n\nimport { MapRuntimeContext } from \"../runtimeContext\";\n\nexport function useMapApi() {\n return useContext(MapRuntimeContext)?.controller ?? null;\n}\n","import { useSyncExternalStore } from \"react\";\n\nimport { MapRuntimeContext } from \"../runtimeContext\";\nimport { useContext } from \"react\";\n\nexport function useViewportState() {\n const runtime = useContext(MapRuntimeContext);\n if (!runtime) {\n throw new Error(\"useViewportState must be used within a TileMapViewer\");\n }\n\n return useSyncExternalStore(\n (listener) => runtime.controller.store.subscribe(listener),\n () => runtime.controller.store.getSnapshot(),\n );\n}\n","import type { RegionFeature } from \"../../shared/overlays\";\nimport type { ProjectedRegion } from \"../core/overlayProjection\";\n\nexport interface RegionLabelLayerProps {\n region: RegionFeature;\n projected: ProjectedRegion;\n}\n\nexport function RegionLabelLayer({ region, projected }: RegionLabelLayerProps) {\n if (!projected.center || (!projected.text && !region.label)) {\n return null;\n }\n\n return (\n <div\n style={{\n position: \"absolute\",\n left: projected.center.x,\n top: projected.center.y,\n transform: \"translate(-50%, -50%)\",\n pointerEvents: \"none\",\n color: \"#111827\",\n background: \"rgba(255,255,255,0.92)\",\n padding: \"2px 6px\",\n borderRadius: 6,\n fontSize: 12,\n lineHeight: 1.3,\n border: \"1px solid rgba(17,24,39,0.15)\",\n whiteSpace: \"nowrap\",\n }}\n >\n {projected.text ?? region.label}\n </div>\n );\n}\n","import { Fragment, useMemo } from \"react\";\n\nimport type { RegionFeature } from \"../../shared/overlays\";\nimport type { MapPointerEvent } from \"../../shared/viewport\";\nimport { projectRegion } from \"../core/overlayProjection\";\nimport { useMapApi } from \"../hooks/useMapApi\";\nimport { useViewportState } from \"../hooks/useViewportState\";\nimport { RegionLabelLayer } from \"./RegionLabelLayer\";\n\nexport interface RegionRenderArgs {\n region: RegionFeature;\n projected: ReturnType<typeof projectRegion>;\n isHovered: boolean;\n isSelected: boolean;\n}\n\nexport interface OverlayLayerProps {\n regions: RegionFeature[];\n selectedRegionId?: string | null;\n hoveredRegionId?: string | null;\n onRegionClick?: (region: RegionFeature, event: MapPointerEvent) => void;\n onRegionHover?: (region: RegionFeature | null, event: MapPointerEvent) => void;\n renderRegion?: (args: RegionRenderArgs) => React.ReactNode;\n}\n\nexport function OverlayLayer(props: OverlayLayerProps) {\n const api = useMapApi();\n const view = useViewportState();\n\n const projected = useMemo(() => {\n if (!api) {\n return [];\n }\n return props.regions.map((region) => ({\n region,\n projected: projectRegion(api, region),\n }));\n }, [api, props.regions, view]);\n\n if (!api) {\n return null;\n }\n\n return (\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n pointerEvents: \"none\",\n }}\n >\n <svg\n width=\"100%\"\n height=\"100%\"\n style={{\n position: \"absolute\",\n inset: 0,\n overflow: \"visible\",\n }}\n >\n {projected.map(({ region, projected }) => {\n const isHovered = props.hoveredRegionId === region.id;\n const isSelected = props.selectedRegionId === region.id;\n const getLocalPoint = (event: React.PointerEvent<SVGElement> | React.MouseEvent<SVGElement>) => {\n const rect = (event.currentTarget.ownerSVGElement ?? event.currentTarget).getBoundingClientRect();\n return {\n x: event.clientX - rect.left,\n y: event.clientY - rect.top,\n };\n };\n\n const onPointerMove = (event: React.PointerEvent<SVGElement>) => {\n const localPoint = getLocalPoint(event);\n props.onRegionHover?.(region, {\n screenPoint: localPoint,\n normalizedPoint: api.screenToNormalized(localPoint),\n nativeEvent: event,\n });\n };\n\n const onClick = (event: React.MouseEvent<SVGElement>) => {\n const localPoint = getLocalPoint(event);\n props.onRegionClick?.(region, {\n screenPoint: localPoint,\n normalizedPoint: api.screenToNormalized(localPoint),\n nativeEvent: event,\n });\n };\n\n const custom = props.renderRegion?.({\n region,\n projected,\n isHovered,\n isSelected,\n });\n\n if (custom) {\n return <Fragment key={region.id}>{custom}</Fragment>;\n }\n\n const sharedProps = {\n onClick,\n onPointerMove,\n onPointerLeave: (event: React.PointerEvent<SVGElement>) => {\n const localPoint = getLocalPoint(event);\n props.onRegionHover?.(null, {\n screenPoint: localPoint,\n nativeEvent: event,\n });\n },\n style: {\n pointerEvents: \"auto\" as const,\n cursor: \"pointer\",\n },\n fill: isSelected ? \"rgba(37,99,235,0.24)\" : isHovered ? \"rgba(37,99,235,0.18)\" : \"rgba(37,99,235,0.12)\",\n stroke: isSelected ? \"#1d4ed8\" : \"#2563eb\",\n strokeWidth: isSelected ? 2 : 1.5,\n };\n\n switch (region.geometry.type) {\n case \"polygon\":\n return <path key={region.id} d={projected.path} {...sharedProps} />;\n case \"rectangle\":\n if (!projected.rect) return null;\n return <rect key={region.id} x={projected.rect.x} y={projected.rect.y} width={projected.rect.width} height={projected.rect.height} {...sharedProps} />;\n case \"point\":\n if (!projected.center) return null;\n return <circle key={region.id} cx={projected.center.x} cy={projected.center.y} r={region.geometry.radius ?? 8} {...sharedProps} />;\n case \"label\":\n return null;\n }\n })}\n </svg>\n\n {projected.map(({ region, projected }) => (\n <RegionLabelLayer key={`${region.id}:label`} region={region} projected={projected} />\n ))}\n </div>\n );\n}\n","export interface NormalizedPoint {\n x: number;\n y: number;\n}\n\nexport interface NormalizedRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface PixelSize {\n width: number;\n height: number;\n}\n\nexport function clamp01(value: number): number {\n return Math.min(1, Math.max(0, value));\n}\n\nexport function clampNormalizedPoint(point: NormalizedPoint): NormalizedPoint {\n return {\n x: clamp01(point.x),\n y: clamp01(point.y),\n };\n}\n\nexport function clampNormalizedRect(rect: NormalizedRect): NormalizedRect {\n const x = clamp01(rect.x);\n const y = clamp01(rect.y);\n const width = Math.min(1 - x, Math.max(0, rect.width));\n const height = Math.min(1 - y, Math.max(0, rect.height));\n return { x, y, width, height };\n}\n\nexport function normalizedToPixels(point: NormalizedPoint, size: PixelSize): NormalizedPoint {\n return {\n x: point.x * size.width,\n y: point.y * size.height,\n };\n}\n\nexport function pixelsToNormalized(point: NormalizedPoint, size: PixelSize): NormalizedPoint {\n if (size.width <= 0 || size.height <= 0) {\n return { x: 0, y: 0 };\n }\n\n return {\n x: point.x / size.width,\n y: point.y / size.height,\n };\n}\n\nexport function rectCenter(rect: NormalizedRect): NormalizedPoint {\n return {\n x: rect.x + rect.width / 2,\n y: rect.y + rect.height / 2,\n };\n}\n\nexport function unionRects(rects: readonly NormalizedRect[]): NormalizedRect | null {\n if (rects.length === 0) {\n return null;\n }\n\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n\n for (const rect of rects) {\n minX = Math.min(minX, rect.x);\n minY = Math.min(minY, rect.y);\n maxX = Math.max(maxX, rect.x + rect.width);\n maxY = Math.max(maxY, rect.y + rect.height);\n }\n\n return clampNormalizedRect({\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n });\n}\n","import { z } from \"zod\";\n\nimport { regionCollectionSchema } from \"./overlays\";\nimport type { RegionCollection } from \"./overlays\";\nimport type { TileFormat } from \"./ingest\";\n\nexport interface TileLevelManifest {\n z: number;\n width: number;\n height: number;\n columns: number;\n rows: number;\n scale: number;\n}\n\nexport interface PdfMapManifest {\n version: 1;\n kind: \"pdf-map\";\n id: string;\n source: {\n type: \"pdf\" | \"image\";\n originalFilename?: string;\n page?: number;\n width: number;\n height: number;\n mimeType?: string;\n };\n coordinateSpace: {\n normalized: true;\n width: number;\n height: number;\n };\n tiles: {\n tileSize: number;\n format: TileFormat;\n minZoom: number;\n maxZoom: number;\n pathTemplate: string;\n levels: TileLevelManifest[];\n };\n view: {\n defaultCenter: [number, number];\n defaultZoom: number;\n minZoom: number;\n maxZoom: number;\n };\n overlays?: {\n inline?: RegionCollection;\n url?: string;\n };\n assets?: {\n preview?: string;\n };\n metadata?: {\n title?: string;\n createdAt?: string;\n [key: string]: unknown;\n };\n}\n\nexport interface CreateManifestInput extends Omit<PdfMapManifest, \"version\" | \"kind\"> {}\n\nexport interface ResolveTileUrlArgs {\n manifest: PdfMapManifest;\n z: number;\n x: number;\n y: number;\n baseUrl?: string;\n overrideTemplate?: string;\n}\n\nconst tileLevelSchema = z.object({\n z: z.number().int().min(0),\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n columns: z.number().int().positive(),\n rows: z.number().int().positive(),\n scale: z.number().positive(),\n});\n\nexport const manifestSchema: z.ZodType<PdfMapManifest> = z.object({\n version: z.literal(1),\n kind: z.literal(\"pdf-map\"),\n id: z.string().min(1),\n source: z.object({\n type: z.union([z.literal(\"pdf\"), z.literal(\"image\")]),\n originalFilename: z.string().optional(),\n page: z.number().int().positive().optional(),\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n mimeType: z.string().optional(),\n }),\n coordinateSpace: z.object({\n normalized: z.literal(true),\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n }),\n tiles: z.object({\n tileSize: z.number().int().positive(),\n format: z.union([z.literal(\"webp\"), z.literal(\"jpeg\"), z.literal(\"png\")]),\n minZoom: z.number().int().min(0),\n maxZoom: z.number().int().min(0),\n pathTemplate: z.string().min(1),\n levels: z.array(tileLevelSchema),\n }),\n view: z.object({\n defaultCenter: z.tuple([\n z.number().finite().min(0).max(1),\n z.number().finite().min(0).max(1),\n ]),\n defaultZoom: z.number().finite(),\n minZoom: z.number().finite(),\n maxZoom: z.number().finite(),\n }),\n overlays: z\n .object({\n inline: regionCollectionSchema.optional(),\n url: z.string().optional(),\n })\n .optional(),\n assets: z\n .object({\n preview: z.string().optional(),\n })\n .optional(),\n metadata: z\n .object({\n title: z.string().optional(),\n createdAt: z.string().optional(),\n })\n .catchall(z.unknown())\n .optional(),\n});\n\nexport function createManifest(input: CreateManifestInput): PdfMapManifest {\n return manifestSchema.parse({\n version: 1,\n kind: \"pdf-map\",\n ...input,\n });\n}\n\nexport function parseManifest(input: unknown): PdfMapManifest {\n return manifestSchema.parse(input);\n}\n\nexport function resolveTileUrl(args: ResolveTileUrlArgs): string {\n const template = args.overrideTemplate ?? args.manifest.tiles.pathTemplate;\n const relative = template\n .replaceAll(\"{z}\", String(args.z))\n .replaceAll(\"{x}\", String(args.x))\n .replaceAll(\"{y}\", String(args.y));\n\n if (/^https?:\\/\\//.test(relative)) {\n return relative;\n }\n\n if (!args.baseUrl) {\n return relative;\n }\n\n if (/^https?:\\/\\//.test(args.baseUrl)) {\n return new URL(relative.replace(/^\\//, \"\"), ensureTrailingSlash(args.baseUrl)).toString();\n }\n\n return joinRelativeUrl(args.baseUrl, relative);\n}\n\nfunction ensureTrailingSlash(value: string): string {\n return value.endsWith(\"/\") ? value : `${value}/`;\n}\n\nfunction joinRelativeUrl(baseUrl: string, path: string): string {\n const normalizedBase = ensureLeadingSlash(stripTrailingSlash(baseUrl));\n const normalizedPath = stripLeadingSlash(path);\n\n if (!normalizedPath) {\n return normalizedBase || \"/\";\n }\n\n return normalizedBase ? `${normalizedBase}/${normalizedPath}` : `/${normalizedPath}`;\n}\n\nfunction stripLeadingSlash(value: string): string {\n return value.replace(/^\\/+/, \"\");\n}\n\nfunction stripTrailingSlash(value: string): string {\n return value.replace(/\\/+$/, \"\");\n}\n\nfunction ensureLeadingSlash(value: string): string {\n if (!value) {\n return \"\";\n }\n return value.startsWith(\"/\") ? value : `/${value}`;\n}\n","import { clamp01 } from \"../../shared/coordinates\";\nimport { resolveTileUrl } from \"../../shared/manifest\";\nimport type { NormalizedPoint } from \"../../shared/coordinates\";\nimport type { MapViewState, ScreenPoint, ViewTransitionOptions } from \"../../shared/viewport\";\nimport type { EngineInitOptions, ViewerEngine } from \"./engineTypes\";\n\ninterface OpenSeadragonModule {\n default: {\n (options: Record<string, unknown>): any;\n Point: new (x: number, y: number) => any;\n Rect: new (x: number, y: number, width: number, height: number) => any;\n };\n}\n\nexport async function createOpenSeadragonEngine(\n options: EngineInitOptions,\n): Promise<ViewerEngine> {\n throwIfAborted(options.signal);\n const OpenSeadragon = (await import(\"openseadragon\")) as unknown as OpenSeadragonModule;\n throwIfAborted(options.signal);\n if (!options.container.isConnected) {\n throw createAbortError();\n }\n const osd = OpenSeadragon.default;\n\n const viewer = osd({\n element: options.container,\n showNavigationControl: false,\n minZoomLevel: options.minZoom,\n maxZoomLevel: options.maxZoom,\n visibilityRatio: 1,\n constrainDuringPan: true,\n animationTime: 0.2,\n gestureSettingsMouse: {\n clickToZoom: false,\n dblClickToZoom: true,\n pinchToZoom: true,\n flickEnabled: true,\n scrollToZoom: true,\n },\n tileSources: createTileSource(options.source),\n });\n if (options.signal?.aborted || !options.container.isConnected) {\n viewer.destroy();\n throw createAbortError();\n }\n\n let isOpen = false;\n\n const publish = () => {\n options.onViewChange?.(getView());\n };\n\n viewer.addHandler(\"open\", () => {\n isOpen = true;\n if (options.initialView?.center) {\n viewer.viewport.panTo(\n imageToViewportPoint(options.initialView.center.x, options.initialView.center.y),\n true,\n );\n }\n if (typeof options.initialView?.zoom === \"number\") {\n viewer.viewport.zoomTo(options.initialView.zoom, undefined, true);\n }\n publish();\n });\n viewer.addHandler(\"animation\", publish);\n viewer.addHandler(\"resize\", publish);\n\n const dimensions = getDimensions(options.source);\n const defaultView = getDefaultView(options, dimensions);\n\n const getItem = () => {\n const item = viewer.world.getItemAt(0);\n return item && typeof item.viewportToImageCoordinates === \"function\" ? item : null;\n };\n\n const getContainerSize = () => {\n const containerSize = viewer.container.getBoundingClientRect();\n return {\n width: containerSize.width,\n height: containerSize.height,\n };\n };\n\n const imageToViewportPoint = (x: number, y: number) => {\n const item = getItem();\n if (!item) {\n return new osd.Point(x, y);\n }\n return item.imageToViewportCoordinates(x * dimensions.width, y * dimensions.height);\n };\n\n const getView = (): MapViewState => {\n const item = getItem();\n const containerSize = getContainerSize();\n if (!isOpen || !item) {\n return {\n ...defaultView,\n containerWidth: containerSize.width,\n containerHeight: containerSize.height,\n };\n }\n\n const center = viewer.viewport.getCenter(true);\n const imageCenter = item.viewportToImageCoordinates(center);\n return {\n center: {\n x: clamp01(imageCenter.x / dimensions.width),\n y: clamp01(imageCenter.y / dimensions.height),\n },\n zoom: viewer.viewport.getZoom(true),\n minZoom: options.minZoom ?? 0,\n maxZoom: options.maxZoom ?? 8,\n containerWidth: containerSize.width,\n containerHeight: containerSize.height,\n };\n };\n\n const engine: ViewerEngine = {\n getView,\n setView(view, transitionOptions) {\n if (!isOpen || !getItem()) {\n return;\n }\n if (view.center) {\n viewer.viewport.panTo(\n imageToViewportPoint(view.center.x, view.center.y),\n transitionOptions?.immediate ?? false,\n );\n }\n if (typeof view.zoom === \"number\") {\n viewer.viewport.zoomTo(view.zoom, undefined, transitionOptions?.immediate ?? false);\n }\n publish();\n },\n fitToBounds(bounds, transitionOptions) {\n const item = getItem();\n if (!isOpen || !item) {\n return;\n }\n if (!bounds) {\n viewer.viewport.goHome(transitionOptions?.immediate ?? false);\n publish();\n return;\n }\n\n const topLeft = item.imageToViewportCoordinates(\n bounds.x * dimensions.width,\n bounds.y * dimensions.height,\n );\n const bottomRight = item.imageToViewportCoordinates(\n (bounds.x + bounds.width) * dimensions.width,\n (bounds.y + bounds.height) * dimensions.height,\n );\n\n viewer.viewport.fitBounds(\n new osd.Rect(\n topLeft.x,\n topLeft.y,\n bottomRight.x - topLeft.x || 0.01,\n bottomRight.y - topLeft.y || 0.01,\n ),\n transitionOptions?.immediate ?? false,\n );\n publish();\n },\n screenToNormalized(point: ScreenPoint) {\n const item = getItem();\n if (!isOpen || !item) {\n const size = getContainerSize();\n return {\n x: size.width > 0 ? clamp01(point.x / size.width) : 0,\n y: size.height > 0 ? clamp01(point.y / size.height) : 0,\n };\n }\n const viewportPoint = viewer.viewport.pointFromPixel(\n new osd.Point(point.x, point.y),\n true,\n );\n const imagePoint = item.viewportToImageCoordinates(viewportPoint);\n return {\n x: clamp01(imagePoint.x / dimensions.width),\n y: clamp01(imagePoint.y / dimensions.height),\n };\n },\n normalizedToScreen(point: NormalizedPoint) {\n if (!isOpen || !getItem()) {\n const size = getContainerSize();\n return {\n x: point.x * size.width,\n y: point.y * size.height,\n };\n }\n const viewportPoint = imageToViewportPoint(point.x, point.y);\n const pixel = viewer.viewport.pixelFromPoint(viewportPoint, true);\n return {\n x: pixel.x,\n y: pixel.y,\n };\n },\n destroy() {\n isOpen = false;\n viewer.destroy();\n },\n resize() {\n viewer.forceRedraw();\n publish();\n },\n getContainer() {\n return options.container;\n },\n };\n\n return engine;\n}\n\nfunction throwIfAborted(signal?: AbortSignal) {\n if (signal?.aborted) {\n throw createAbortError();\n }\n}\n\nfunction createAbortError() {\n const error = new Error(\"Viewer initialization aborted.\");\n error.name = \"AbortError\";\n return error;\n}\n\nfunction getDefaultView(\n options: EngineInitOptions,\n dimensions: { width: number; height: number },\n): MapViewState {\n const manifestView = options.source.type === \"tiles\" ? options.source.manifest.view : undefined;\n\n return {\n center: options.initialView?.center ?? normalizedCenterFromSource(options.source),\n zoom: options.initialView?.zoom ?? manifestView?.defaultZoom ?? 1,\n minZoom: options.minZoom ?? manifestView?.minZoom ?? 0,\n maxZoom: options.maxZoom ?? manifestView?.maxZoom ?? 8,\n containerWidth: dimensions.width,\n containerHeight: dimensions.height,\n };\n}\n\nfunction normalizedCenterFromSource(source: EngineInitOptions[\"source\"]) {\n if (source.type === \"tiles\") {\n return {\n x: source.manifest.view.defaultCenter[0],\n y: source.manifest.view.defaultCenter[1],\n };\n }\n\n return { x: 0.5, y: 0.5 };\n}\n\nfunction createTileSource(source: EngineInitOptions[\"source\"]) {\n if (source.type === \"tiles\") {\n const manifest = source.manifest;\n return {\n width: manifest.source.width,\n height: manifest.source.height,\n tileSize: manifest.tiles.tileSize,\n minLevel: manifest.tiles.minZoom,\n maxLevel: manifest.tiles.maxZoom,\n getTileUrl(level: number, x: number, y: number) {\n if (source.getTileUrl) {\n return source.getTileUrl({\n manifest,\n z: level,\n x,\n y,\n }) as string;\n }\n return resolveTileUrl({\n manifest,\n z: level,\n x,\n y,\n baseUrl: source.baseUrl,\n });\n },\n };\n }\n\n if (source.type === \"image\") {\n return {\n type: \"image\",\n url: source.src,\n buildPyramid: false,\n };\n }\n\n throw new Error(\"OpenSeadragon engine only supports tile and image sources.\");\n}\n\nfunction getDimensions(source: EngineInitOptions[\"source\"]) {\n if (source.type === \"tiles\") {\n return {\n width: source.manifest.source.width,\n height: source.manifest.source.height,\n };\n }\n\n if (source.type === \"image\") {\n return {\n width: source.width,\n height: source.height,\n };\n }\n\n throw new Error(\"OpenSeadragon engine only supports image and tile sources.\");\n}\n","export function toUint8Array(input: Buffer | Uint8Array | ArrayBuffer): Uint8Array {\n if (input instanceof ArrayBuffer) {\n return new Uint8Array(input);\n }\n\n return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n}\n","import { toUint8Array } from \"../../shared/bytes\";\nimport type { PDFDocumentProxy, PDFPageProxy } from \"pdfjs-dist/types/src/display/api\";\n\nimport { clamp01 } from \"../../shared/coordinates\";\nimport type { MapViewState, ScreenPoint, ViewTransitionOptions } from \"../../shared/viewport\";\nimport type { EngineInitOptions, ViewerEngine } from \"./engineTypes\";\n\ninterface PdfJsModule {\n getDocument: (src: unknown) => {\n promise: Promise<any>;\n destroy?: () => void;\n };\n}\n\nexport async function createPdfJsEngine(options: EngineInitOptions): Promise<ViewerEngine> {\n if (options.source.type !== \"pdf\") {\n throw new Error(\"PDF.js engine only supports PDF sources.\");\n }\n\n throwIfAborted(options.signal);\n const pdfjs = (await import(\"pdfjs-dist/build/pdf.mjs\")) as PdfJsModule;\n throwIfAborted(options.signal);\n if (!options.container.isConnected) {\n throw createAbortError();\n }\n const file = options.source.file;\n const loadingTask = pdfjs.getDocument(\n typeof file === \"string\"\n ? {\n url: file,\n }\n : {\n data: toUint8Array(file),\n },\n );\n const pdf = (await loadingTask.promise) as PDFDocumentProxy;\n if (options.signal?.aborted || !options.container.isConnected) {\n loadingTask.destroy?.();\n await pdf.destroy();\n throw createAbortError();\n }\n const page = (await pdf.getPage(options.source.page ?? 1)) as PDFPageProxy;\n\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\");\n if (!context) {\n throw new Error(\"Unable to get 2D context for PDF canvas.\");\n }\n\n options.container.innerHTML = \"\";\n options.container.style.overflow = \"hidden\";\n options.container.style.touchAction = \"none\";\n options.container.appendChild(canvas);\n\n const baseViewport = page.getViewport({ scale: 1 });\n const containerRect = options.container.getBoundingClientRect();\n const fitScale =\n containerRect.width > 0 && containerRect.height > 0\n ? Math.min(containerRect.width / baseViewport.width, containerRect.height / baseViewport.height)\n : 1;\n const renderScale = Math.max(1, fitScale);\n\n const renderedViewport = page.getViewport({ scale: renderScale });\n canvas.width = Math.ceil(renderedViewport.width);\n canvas.height = Math.ceil(renderedViewport.height);\n canvas.style.transformOrigin = \"0 0\";\n canvas.style.willChange = \"transform\";\n\n await page.render({\n canvasContext: context,\n viewport: renderedViewport,\n }).promise;\n\n let view: MapViewState = {\n center: options.initialView?.center ?? { x: 0.5, y: 0.5 },\n zoom: options.initialView?.zoom ?? 1,\n minZoom: options.minZoom ?? 0.5,\n maxZoom: options.maxZoom ?? 8,\n containerWidth: containerRect.width,\n containerHeight: containerRect.height,\n };\n\n let pan = { x: 0, y: 0 };\n let dragging = false;\n let dragOrigin = { x: 0, y: 0 };\n\n const publish = () => {\n options.onViewChange?.({ ...view });\n };\n\n const applyTransform = () => {\n const rect = options.container.getBoundingClientRect();\n view = {\n ...view,\n containerWidth: rect.width,\n containerHeight: rect.height,\n };\n canvas.style.transform = `translate(${pan.x}px, ${pan.y}px) scale(${view.zoom})`;\n publish();\n };\n\n const normalizedToCanvas = (point: ScreenPoint) => ({\n x: point.x * canvas.width,\n y: point.y * canvas.height,\n });\n\n const screenToNormalized = (point: ScreenPoint) => {\n const localX = (point.x - pan.x) / view.zoom;\n const localY = (point.y - pan.y) / view.zoom;\n return {\n x: clamp01(localX / canvas.width),\n y: clamp01(localY / canvas.height),\n };\n };\n\n const handlePointerDown = (event: PointerEvent) => {\n dragging = true;\n dragOrigin = { x: event.clientX - pan.x, y: event.clientY - pan.y };\n };\n\n const handlePointerMove = (event: PointerEvent) => {\n if (!dragging) {\n return;\n }\n pan = {\n x: event.clientX - dragOrigin.x,\n y: event.clientY - dragOrigin.y,\n };\n applyTransform();\n };\n\n const handlePointerUp = () => {\n dragging = false;\n };\n\n const handleWheel = (event: WheelEvent) => {\n event.preventDefault();\n const delta = event.deltaY < 0 ? 1.1 : 0.9;\n const nextZoom = Math.min(view.maxZoom, Math.max(view.minZoom, view.zoom * delta));\n view = {\n ...view,\n zoom: nextZoom,\n };\n applyTransform();\n };\n\n options.container.addEventListener(\"pointerdown\", handlePointerDown);\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n options.container.addEventListener(\"wheel\", handleWheel, { passive: false });\n\n applyTransform();\n\n const engine: ViewerEngine = {\n getView() {\n return { ...view };\n },\n setView(nextView, transitionOptions) {\n if (nextView.center) {\n view = { ...view, center: nextView.center };\n }\n if (typeof nextView.zoom === \"number\") {\n view = {\n ...view,\n zoom: Math.min(view.maxZoom, Math.max(view.minZoom, nextView.zoom)),\n };\n }\n if (nextView.minZoom) {\n view = { ...view, minZoom: nextView.minZoom };\n }\n if (nextView.maxZoom) {\n view = { ...view, maxZoom: nextView.maxZoom };\n }\n if (transitionOptions?.immediate === false) {\n requestAnimationFrame(applyTransform);\n } else {\n applyTransform();\n }\n },\n fitToBounds(bounds) {\n if (!bounds) {\n view = { ...view, center: { x: 0.5, y: 0.5 }, zoom: 1 };\n pan = { x: 0, y: 0 };\n applyTransform();\n return;\n }\n\n const rect = options.container.getBoundingClientRect();\n const zoomX = rect.width / (bounds.width * canvas.width || canvas.width);\n const zoomY = rect.height / (bounds.height * canvas.height || canvas.height);\n const nextZoom = Math.min(view.maxZoom, Math.max(view.minZoom, Math.min(zoomX, zoomY)));\n const centerX = (bounds.x + bounds.width / 2) * canvas.width * nextZoom;\n const centerY = (bounds.y + bounds.height / 2) * canvas.height * nextZoom;\n pan = {\n x: rect.width / 2 - centerX,\n y: rect.height / 2 - centerY,\n };\n view = {\n ...view,\n center: {\n x: bounds.x + bounds.width / 2,\n y: bounds.y + bounds.height / 2,\n },\n zoom: nextZoom,\n };\n applyTransform();\n },\n screenToNormalized,\n normalizedToScreen(point) {\n const local = normalizedToCanvas(point);\n return {\n x: pan.x + local.x * view.zoom,\n y: pan.y + local.y * view.zoom,\n };\n },\n destroy() {\n options.container.removeEventListener(\"pointerdown\", handlePointerDown);\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n options.container.removeEventListener(\"wheel\", handleWheel);\n loadingTask.destroy?.();\n },\n resize() {\n applyTransform();\n },\n getContainer() {\n return options.container;\n },\n };\n\n return engine;\n}\n\nfunction throwIfAborted(signal?: AbortSignal) {\n if (signal?.aborted) {\n throw createAbortError();\n }\n}\n\nfunction createAbortError() {\n const error = new Error(\"Viewer initialization aborted.\");\n error.name = \"AbortError\";\n return error;\n}\n","import {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport type { RegionFeature, RegionCollection } from \"../../shared/overlays\";\nimport type { PdfMapSource } from \"../../shared/source\";\nimport type { NormalizedRect } from \"../../shared/coordinates\";\nimport type {\n MapPointerEvent,\n MapViewState,\n ScreenPoint,\n ViewTransitionOptions,\n} from \"../../shared/viewport\";\nimport { normalizeRegions } from \"../../shared/overlays\";\nimport { MapController } from \"../core/MapController\";\nimport { OverlayLayer, type RegionRenderArgs } from \"./OverlayLayer\";\nimport { createOpenSeadragonEngine } from \"../engines/openSeadragonEngine\";\nimport { createPdfJsEngine } from \"../engines/pdfJsEngine\";\nimport { MapRuntimeContext } from \"../runtimeContext\";\n\nexport interface MapApi {\n getView(): MapViewState;\n setView(view: Partial<MapViewState>, opts?: ViewTransitionOptions): void;\n fitToBounds(bounds?: NormalizedRect, opts?: ViewTransitionOptions): void;\n zoomToRegion(regionId: string, opts?: ViewTransitionOptions): void;\n screenToNormalized(point: ScreenPoint): { x: number; y: number };\n normalizedToScreen(point: { x: number; y: number }): ScreenPoint;\n}\n\nexport interface TileMapViewerProps {\n source: PdfMapSource;\n regions?: RegionCollection | RegionFeature[];\n initialView?: Partial<MapViewState>;\n minZoom?: number;\n maxZoom?: number;\n className?: string;\n style?: React.CSSProperties;\n selectedRegionId?: string | null;\n onViewChange?: (view: MapViewState) => void;\n onRegionClick?: (region: RegionFeature, event: MapPointerEvent) => void;\n onRegionHover?: (region: RegionFeature | null, event: MapPointerEvent) => void;\n renderRegion?: (args: RegionRenderArgs) => React.ReactNode;\n}\n\nexport const TileMapViewer = forwardRef<MapApi, TileMapViewerProps>(function TileMapViewer(\n props,\n ref,\n) {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const controller = useMemo(() => new MapController(), []);\n const [hoveredRegionId, setHoveredRegionId] = useState<string | null>(null);\n const sourceRef = useRef(props.source);\n const initialViewRef = useRef(props.initialView);\n const onViewChangeRef = useRef(props.onViewChange);\n\n sourceRef.current = props.source;\n initialViewRef.current = props.initialView;\n onViewChangeRef.current = props.onViewChange;\n\n const regions = useMemo(() => normalizeRegions(props.regions), [props.regions]);\n const sourceKey = useMemo(() => getSourceKey(props.source), [props.source]);\n const initialViewKey = useMemo(() => getInitialViewKey(props.initialView), [props.initialView]);\n const mapApi = useMemo<MapApi>(\n () => ({\n getView: () => controller.getView(),\n setView: (view, opts) => controller.setView(view, opts),\n fitToBounds: (bounds, opts) => controller.fitToBounds(bounds, opts),\n zoomToRegion: (regionId, opts) => controller.zoomToRegion(regionId, opts),\n screenToNormalized: (point) => controller.screenToNormalized(point),\n normalizedToScreen: (point) => controller.normalizedToScreen(point),\n }),\n [controller],\n );\n\n useEffect(() => {\n controller.setRegions(regions);\n }, [controller, regions]);\n\n useImperativeHandle(ref, () => mapApi, [mapApi]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) {\n return;\n }\n\n const abortController = new AbortController();\n let activeEngine: Awaited<ReturnType<typeof createOpenSeadragonEngine>> | null = null;\n\n const onViewChange = (view: MapViewState) => {\n controller.store.setState(view);\n onViewChangeRef.current?.(view);\n };\n\n const createEngine = async () => {\n try {\n const source = sourceRef.current;\n const initialView = initialViewRef.current;\n\n if (\n abortController.signal.aborted ||\n containerRef.current !== container ||\n !container.isConnected\n ) {\n return;\n }\n\n const engine =\n source.type === \"pdf\"\n ? await createPdfJsEngine({\n container,\n source,\n minZoom: props.minZoom,\n maxZoom: props.maxZoom,\n initialView,\n onViewChange,\n signal: abortController.signal,\n })\n : await createOpenSeadragonEngine({\n container,\n source,\n minZoom: props.minZoom,\n maxZoom: props.maxZoom,\n initialView,\n onViewChange,\n signal: abortController.signal,\n });\n\n if (\n abortController.signal.aborted ||\n containerRef.current !== container ||\n !container.isConnected\n ) {\n engine.destroy();\n return;\n }\n\n activeEngine = engine;\n controller.attachEngine(engine);\n } catch (error) {\n if (!(error instanceof Error) || error.name !== \"AbortError\") {\n console.error(error);\n }\n }\n };\n\n void createEngine();\n\n const resizeObserver = new ResizeObserver(() => {\n controller.resize();\n });\n resizeObserver.observe(container);\n\n return () => {\n abortController.abort();\n resizeObserver.disconnect();\n if (activeEngine) {\n controller.detachEngine(activeEngine);\n activeEngine.destroy();\n }\n if (containerRef.current === container) {\n container.innerHTML = \"\";\n }\n };\n }, [controller, initialViewKey, props.maxZoom, props.minZoom, sourceKey]);\n\n return (\n <MapRuntimeContext.Provider\n value={{\n controller,\n regions,\n }}\n >\n <div\n className={props.className}\n style={{\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n minHeight: 320,\n background: \"#f8fafc\",\n overflow: \"hidden\",\n ...props.style,\n }}\n >\n <div\n ref={containerRef}\n style={{\n position: \"absolute\",\n inset: 0,\n }}\n />\n <OverlayLayer\n regions={regions}\n selectedRegionId={props.selectedRegionId}\n hoveredRegionId={hoveredRegionId}\n onRegionClick={props.onRegionClick}\n onRegionHover={(region, event) => {\n setHoveredRegionId(region?.id ?? null);\n props.onRegionHover?.(region, event);\n }}\n renderRegion={props.renderRegion}\n />\n </div>\n </MapRuntimeContext.Provider>\n );\n});\n\nconst objectIdCache = new WeakMap<object, number>();\nlet nextObjectId = 1;\n\nfunction getSourceKey(source: PdfMapSource): string {\n switch (source.type) {\n case \"tiles\":\n return JSON.stringify({\n type: source.type,\n manifestId: source.manifest.id,\n width: source.manifest.source.width,\n height: source.manifest.source.height,\n pathTemplate: source.manifest.tiles.pathTemplate,\n minZoom: source.manifest.tiles.minZoom,\n maxZoom: source.manifest.tiles.maxZoom,\n baseUrl: source.baseUrl ?? null,\n getTileUrl: source.getTileUrl ? getObjectId(source.getTileUrl) : null,\n });\n case \"image\":\n return JSON.stringify({\n type: source.type,\n src: source.src,\n width: source.width,\n height: source.height,\n });\n case \"pdf\":\n return JSON.stringify({\n type: source.type,\n page: source.page ?? 1,\n file: typeof source.file === \"string\" ? source.file : getObjectId(source.file),\n });\n }\n}\n\nfunction getInitialViewKey(initialView?: Partial<MapViewState>): string {\n if (!initialView) {\n return \"null\";\n }\n\n return JSON.stringify({\n center: initialView.center\n ? {\n x: initialView.center.x,\n y: initialView.center.y,\n }\n : null,\n zoom: initialView.zoom ?? null,\n minZoom: initialView.minZoom ?? null,\n maxZoom: initialView.maxZoom ?? null,\n });\n}\n\nfunction getObjectId(value: object): number {\n const existing = objectIdCache.get(value);\n if (existing) {\n return existing;\n }\n const id = nextObjectId;\n nextObjectId += 1;\n objectIdCache.set(value, id);\n return id;\n}\n","import { forwardRef } from \"react\";\n\nimport type { MapApi, TileMapViewerProps } from \"./TileMapViewer\";\nimport { TileMapViewer } from \"./TileMapViewer\";\n\nexport const PdfMap = forwardRef<MapApi, TileMapViewerProps>(function PdfMap(props, ref) {\n return <TileMapViewer ref={ref} {...props} />;\n});\n","import { useContext } from \"react\";\n\nimport { MapRuntimeContext } from \"../runtimeContext\";\n\nexport function useRegions() {\n return useContext(MapRuntimeContext)?.regions ?? [];\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/shared/overlays.ts","../../src/client/core/ViewportStore.ts","../../src/client/core/overlayProjection.ts","../../src/client/core/MapController.ts","../../src/client/runtimeContext.ts","../../src/client/hooks/useMapApi.ts","../../src/client/hooks/useViewportState.ts","../../src/client/components/RegionLabelLayer.tsx","../../src/client/components/OverlayLayer.tsx","../../src/shared/coordinates.ts","../../src/shared/manifest.ts","../../src/client/engines/openSeadragonEngine.ts","../../src/shared/bytes.ts","../../src/shared/pdfWorkerUrl.ts","../../src/client/engines/pdfJsEngine.ts","../../src/client/components/TileMapViewer.tsx","../../src/client/components/PdfMap.tsx","../../src/client/hooks/useRegions.ts"],"names":["z","createContext","useContext","useSyncExternalStore","jsx","useMemo","jsxs","projected","Fragment","throwIfAborted","createAbortError","forwardRef","TileMapViewer","useRef","useState","useEffect","useImperativeHandle","PdfMap"],"mappings":"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","file":"index.cjs","sourcesContent":["import { z } from \"zod\";\n\nimport type { NormalizedPoint, NormalizedRect } from \"./coordinates\";\n\nexport type RegionGeometryType = \"polygon\" | \"rectangle\" | \"point\" | \"label\";\n\nexport interface PolygonGeometry {\n type: \"polygon\";\n points: NormalizedPoint[];\n}\n\nexport interface RectangleGeometry {\n type: \"rectangle\";\n rect: NormalizedRect;\n}\n\nexport interface PointGeometry {\n type: \"point\";\n point: NormalizedPoint;\n radius?: number;\n}\n\nexport interface LabelGeometry {\n type: \"label\";\n point: NormalizedPoint;\n text: string;\n}\n\nexport type RegionGeometry =\n | PolygonGeometry\n | RectangleGeometry\n | PointGeometry\n | LabelGeometry;\n\nexport interface RegionFeature<Metadata = Record<string, unknown>> {\n id: string;\n geometry: RegionGeometry;\n label?: string;\n metadata?: Metadata;\n}\n\nexport interface RegionCollection<Metadata = Record<string, unknown>> {\n type: \"FeatureCollection\";\n regions: RegionFeature<Metadata>[];\n}\n\nconst normalizedPointSchema = z.object({\n x: z.number().finite().min(0).max(1),\n y: z.number().finite().min(0).max(1),\n});\n\nconst normalizedRectSchema = z.object({\n x: z.number().finite().min(0).max(1),\n y: z.number().finite().min(0).max(1),\n width: z.number().finite().min(0).max(1),\n height: z.number().finite().min(0).max(1),\n});\n\nexport const regionFeatureSchema = z.object({\n id: z.string().min(1),\n geometry: z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"polygon\"),\n points: z.array(normalizedPointSchema).min(3),\n }),\n z.object({\n type: z.literal(\"rectangle\"),\n rect: normalizedRectSchema,\n }),\n z.object({\n type: z.literal(\"point\"),\n point: normalizedPointSchema,\n radius: z.number().finite().positive().optional(),\n }),\n z.object({\n type: z.literal(\"label\"),\n point: normalizedPointSchema,\n text: z.string().min(1),\n }),\n ]),\n label: z.string().optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\nexport const regionCollectionSchema = z.object({\n type: z.literal(\"FeatureCollection\"),\n regions: z.array(regionFeatureSchema),\n});\n\nexport function normalizeRegions(\n input?: RegionCollection | RegionFeature[] | null,\n): RegionFeature[] {\n if (!input) {\n return [];\n }\n\n if (Array.isArray(input)) {\n return input;\n }\n\n return input.regions;\n}\n","import type { MapViewState } from \"../../shared/viewport\";\n\ntype Listener = () => void;\n\nconst defaultViewState: MapViewState = {\n center: { x: 0.5, y: 0.5 },\n zoom: 1,\n minZoom: 0,\n maxZoom: 6,\n containerWidth: 0,\n containerHeight: 0,\n};\n\nexport class ViewportStore {\n private state: MapViewState = defaultViewState;\n private listeners = new Set<Listener>();\n\n getSnapshot(): MapViewState {\n return this.state;\n }\n\n setState(state: MapViewState): void {\n this.state = state;\n for (const listener of this.listeners) {\n listener();\n }\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n}\n","import type { RegionFeature, RegionGeometry } from \"../../shared/overlays\";\nimport type { NormalizedPoint, NormalizedRect } from \"../../shared/coordinates\";\nimport type { ViewportController } from \"../../shared/viewport\";\n\nexport interface ProjectedPoint {\n x: number;\n y: number;\n}\n\nexport interface ProjectedRegion {\n bounds: NormalizedRect;\n path?: string;\n points?: ProjectedPoint[];\n rect?: { x: number; y: number; width: number; height: number };\n center?: ProjectedPoint;\n text?: string;\n}\n\nexport function projectRegion(\n controller: ViewportController,\n region: RegionFeature,\n): ProjectedRegion {\n const bounds = getRegionBounds(region);\n\n switch (region.geometry.type) {\n case \"polygon\": {\n const points = region.geometry.points.map((point) => controller.normalizedToScreen(point));\n return {\n bounds,\n path: points.map((point, index) => `${index === 0 ? \"M\" : \"L\"} ${point.x} ${point.y}`).join(\" \") + \" Z\",\n points,\n };\n }\n case \"rectangle\": {\n const topLeft = controller.normalizedToScreen({\n x: region.geometry.rect.x,\n y: region.geometry.rect.y,\n });\n const bottomRight = controller.normalizedToScreen({\n x: region.geometry.rect.x + region.geometry.rect.width,\n y: region.geometry.rect.y + region.geometry.rect.height,\n });\n return {\n bounds,\n rect: {\n x: topLeft.x,\n y: topLeft.y,\n width: bottomRight.x - topLeft.x,\n height: bottomRight.y - topLeft.y,\n },\n };\n }\n case \"point\": {\n const center = controller.normalizedToScreen(region.geometry.point);\n return {\n bounds,\n center,\n };\n }\n case \"label\": {\n const center = controller.normalizedToScreen(region.geometry.point);\n return {\n bounds,\n center,\n text: region.geometry.text,\n };\n }\n }\n}\n\nexport function getRegionBounds(region: RegionFeature): NormalizedRect {\n return getGeometryBounds(region.geometry);\n}\n\nfunction getGeometryBounds(geometry: RegionGeometry): NormalizedRect {\n switch (geometry.type) {\n case \"rectangle\":\n return geometry.rect;\n case \"point\":\n return {\n x: geometry.point.x,\n y: geometry.point.y,\n width: 0,\n height: 0,\n };\n case \"label\":\n return {\n x: geometry.point.x,\n y: geometry.point.y,\n width: 0,\n height: 0,\n };\n case \"polygon\": {\n const xs = geometry.points.map((point) => point.x);\n const ys = geometry.points.map((point) => point.y);\n const minX = Math.min(...xs);\n const minY = Math.min(...ys);\n const maxX = Math.max(...xs);\n const maxY = Math.max(...ys);\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n }\n }\n}\n\nexport function getRegionCenter(region: RegionFeature): NormalizedPoint {\n const bounds = getRegionBounds(region);\n return {\n x: bounds.x + bounds.width / 2,\n y: bounds.y + bounds.height / 2,\n };\n}\n","import type { RegionFeature } from \"../../shared/overlays\";\nimport type { NormalizedPoint, NormalizedRect } from \"../../shared/coordinates\";\nimport type {\n MapViewState,\n ScreenPoint,\n ViewTransitionOptions,\n ViewportController,\n} from \"../../shared/viewport\";\n\nimport { ViewportStore } from \"./ViewportStore\";\nimport { getRegionBounds } from \"./overlayProjection\";\nimport type { ViewerEngine } from \"../engines/engineTypes\";\n\nexport class MapController implements ViewportController {\n readonly store = new ViewportStore();\n private engine: ViewerEngine | null = null;\n private regions: RegionFeature[] = [];\n\n attachEngine(engine: ViewerEngine): void {\n this.engine = engine;\n }\n\n detachEngine(engine: ViewerEngine): void {\n if (this.engine === engine) {\n this.engine = null;\n }\n }\n\n setRegions(regions: RegionFeature[]): void {\n this.regions = regions;\n }\n\n getView(): MapViewState {\n if (this.engine) {\n return this.engine.getView();\n }\n return this.store.getSnapshot();\n }\n\n setView(view: Partial<MapViewState>, options?: ViewTransitionOptions): void {\n this.engine?.setView(view, options);\n }\n\n fitToBounds(bounds?: NormalizedRect, options?: ViewTransitionOptions): void {\n this.engine?.fitToBounds(bounds, options);\n }\n\n zoomToRegion(regionId: string, options?: ViewTransitionOptions): void {\n const region = this.regions.find((candidate) => candidate.id === regionId);\n if (!region) {\n return;\n }\n this.fitToBounds(getRegionBounds(region), options);\n }\n\n screenToNormalized(point: ScreenPoint): NormalizedPoint {\n return this.engine?.screenToNormalized(point) ?? { x: 0, y: 0 };\n }\n\n normalizedToScreen(point: NormalizedPoint): ScreenPoint {\n return this.engine?.normalizedToScreen(point) ?? { x: 0, y: 0 };\n }\n\n resize(): void {\n this.engine?.resize();\n }\n}\n","import { createContext } from \"react\";\n\nimport type { RegionFeature } from \"../shared/overlays\";\nimport type { MapController } from \"./core/MapController\";\n\nexport interface MapRuntimeValue {\n controller: MapController;\n regions: RegionFeature[];\n}\n\nexport const MapRuntimeContext = createContext<MapRuntimeValue | null>(null);\n","import { useContext } from \"react\";\n\nimport { MapRuntimeContext } from \"../runtimeContext\";\n\nexport function useMapApi() {\n return useContext(MapRuntimeContext)?.controller ?? null;\n}\n","import { useSyncExternalStore } from \"react\";\n\nimport { MapRuntimeContext } from \"../runtimeContext\";\nimport { useContext } from \"react\";\n\nexport function useViewportState() {\n const runtime = useContext(MapRuntimeContext);\n if (!runtime) {\n throw new Error(\"useViewportState must be used within a TileMapViewer\");\n }\n\n return useSyncExternalStore(\n (listener) => runtime.controller.store.subscribe(listener),\n () => runtime.controller.store.getSnapshot(),\n );\n}\n","import type { RegionFeature } from \"../../shared/overlays\";\nimport type { ProjectedRegion } from \"../core/overlayProjection\";\n\nexport interface RegionLabelLayerProps {\n region: RegionFeature;\n projected: ProjectedRegion;\n}\n\nexport function RegionLabelLayer({ region, projected }: RegionLabelLayerProps) {\n if (!projected.center || (!projected.text && !region.label)) {\n return null;\n }\n\n return (\n <div\n style={{\n position: \"absolute\",\n left: projected.center.x,\n top: projected.center.y,\n transform: \"translate(-50%, -50%)\",\n pointerEvents: \"none\",\n color: \"#111827\",\n background: \"rgba(255,255,255,0.92)\",\n padding: \"2px 6px\",\n borderRadius: 6,\n fontSize: 12,\n lineHeight: 1.3,\n border: \"1px solid rgba(17,24,39,0.15)\",\n whiteSpace: \"nowrap\",\n }}\n >\n {projected.text ?? region.label}\n </div>\n );\n}\n","import { Fragment, useMemo } from \"react\";\n\nimport type { RegionFeature } from \"../../shared/overlays\";\nimport type { MapPointerEvent } from \"../../shared/viewport\";\nimport { projectRegion } from \"../core/overlayProjection\";\nimport { useMapApi } from \"../hooks/useMapApi\";\nimport { useViewportState } from \"../hooks/useViewportState\";\nimport { RegionLabelLayer } from \"./RegionLabelLayer\";\n\nexport interface RegionRenderArgs {\n region: RegionFeature;\n projected: ReturnType<typeof projectRegion>;\n isHovered: boolean;\n isSelected: boolean;\n}\n\nexport interface OverlayLayerProps {\n regions: RegionFeature[];\n selectedRegionId?: string | null;\n hoveredRegionId?: string | null;\n onRegionClick?: (region: RegionFeature, event: MapPointerEvent) => void;\n onRegionHover?: (region: RegionFeature | null, event: MapPointerEvent) => void;\n renderRegion?: (args: RegionRenderArgs) => React.ReactNode;\n}\n\nexport function OverlayLayer(props: OverlayLayerProps) {\n const api = useMapApi();\n const view = useViewportState();\n\n const projected = useMemo(() => {\n if (!api) {\n return [];\n }\n return props.regions.map((region) => ({\n region,\n projected: projectRegion(api, region),\n }));\n }, [api, props.regions, view]);\n\n if (!api) {\n return null;\n }\n\n return (\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n pointerEvents: \"none\",\n }}\n >\n <svg\n width=\"100%\"\n height=\"100%\"\n style={{\n position: \"absolute\",\n inset: 0,\n overflow: \"visible\",\n }}\n >\n {projected.map(({ region, projected }) => {\n const isHovered = props.hoveredRegionId === region.id;\n const isSelected = props.selectedRegionId === region.id;\n const getLocalPoint = (event: React.PointerEvent<SVGElement> | React.MouseEvent<SVGElement>) => {\n const rect = (event.currentTarget.ownerSVGElement ?? event.currentTarget).getBoundingClientRect();\n return {\n x: event.clientX - rect.left,\n y: event.clientY - rect.top,\n };\n };\n\n const onPointerMove = (event: React.PointerEvent<SVGElement>) => {\n const localPoint = getLocalPoint(event);\n props.onRegionHover?.(region, {\n screenPoint: localPoint,\n normalizedPoint: api.screenToNormalized(localPoint),\n nativeEvent: event,\n });\n };\n\n const onClick = (event: React.MouseEvent<SVGElement>) => {\n const localPoint = getLocalPoint(event);\n props.onRegionClick?.(region, {\n screenPoint: localPoint,\n normalizedPoint: api.screenToNormalized(localPoint),\n nativeEvent: event,\n });\n };\n\n const custom = props.renderRegion?.({\n region,\n projected,\n isHovered,\n isSelected,\n });\n\n if (custom) {\n return <Fragment key={region.id}>{custom}</Fragment>;\n }\n\n const sharedProps = {\n onClick,\n onPointerMove,\n onPointerLeave: (event: React.PointerEvent<SVGElement>) => {\n const localPoint = getLocalPoint(event);\n props.onRegionHover?.(null, {\n screenPoint: localPoint,\n nativeEvent: event,\n });\n },\n style: {\n pointerEvents: \"auto\" as const,\n cursor: \"pointer\",\n },\n fill: isSelected ? \"rgba(37,99,235,0.24)\" : isHovered ? \"rgba(37,99,235,0.18)\" : \"rgba(37,99,235,0.12)\",\n stroke: isSelected ? \"#1d4ed8\" : \"#2563eb\",\n strokeWidth: isSelected ? 2 : 1.5,\n };\n\n switch (region.geometry.type) {\n case \"polygon\":\n return <path key={region.id} d={projected.path} {...sharedProps} />;\n case \"rectangle\":\n if (!projected.rect) return null;\n return <rect key={region.id} x={projected.rect.x} y={projected.rect.y} width={projected.rect.width} height={projected.rect.height} {...sharedProps} />;\n case \"point\":\n if (!projected.center) return null;\n return <circle key={region.id} cx={projected.center.x} cy={projected.center.y} r={region.geometry.radius ?? 8} {...sharedProps} />;\n case \"label\":\n return null;\n }\n })}\n </svg>\n\n {projected.map(({ region, projected }) => (\n <RegionLabelLayer key={`${region.id}:label`} region={region} projected={projected} />\n ))}\n </div>\n );\n}\n","export interface NormalizedPoint {\n x: number;\n y: number;\n}\n\nexport interface NormalizedRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface PixelSize {\n width: number;\n height: number;\n}\n\nexport function clamp01(value: number): number {\n return Math.min(1, Math.max(0, value));\n}\n\nexport function clampNormalizedPoint(point: NormalizedPoint): NormalizedPoint {\n return {\n x: clamp01(point.x),\n y: clamp01(point.y),\n };\n}\n\nexport function clampNormalizedRect(rect: NormalizedRect): NormalizedRect {\n const x = clamp01(rect.x);\n const y = clamp01(rect.y);\n const width = Math.min(1 - x, Math.max(0, rect.width));\n const height = Math.min(1 - y, Math.max(0, rect.height));\n return { x, y, width, height };\n}\n\nexport function normalizedToPixels(point: NormalizedPoint, size: PixelSize): NormalizedPoint {\n return {\n x: point.x * size.width,\n y: point.y * size.height,\n };\n}\n\nexport function pixelsToNormalized(point: NormalizedPoint, size: PixelSize): NormalizedPoint {\n if (size.width <= 0 || size.height <= 0) {\n return { x: 0, y: 0 };\n }\n\n return {\n x: point.x / size.width,\n y: point.y / size.height,\n };\n}\n\nexport function rectCenter(rect: NormalizedRect): NormalizedPoint {\n return {\n x: rect.x + rect.width / 2,\n y: rect.y + rect.height / 2,\n };\n}\n\nexport function unionRects(rects: readonly NormalizedRect[]): NormalizedRect | null {\n if (rects.length === 0) {\n return null;\n }\n\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n\n for (const rect of rects) {\n minX = Math.min(minX, rect.x);\n minY = Math.min(minY, rect.y);\n maxX = Math.max(maxX, rect.x + rect.width);\n maxY = Math.max(maxY, rect.y + rect.height);\n }\n\n return clampNormalizedRect({\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n });\n}\n","import { z } from \"zod\";\n\nimport { regionCollectionSchema } from \"./overlays\";\nimport type { RegionCollection } from \"./overlays\";\nimport type { TileFormat } from \"./ingest\";\n\nexport interface TileLevelManifest {\n z: number;\n width: number;\n height: number;\n columns: number;\n rows: number;\n scale: number;\n}\n\nexport interface PdfMapManifest {\n version: 1;\n kind: \"pdf-map\";\n id: string;\n source: {\n type: \"pdf\" | \"image\";\n originalFilename?: string;\n page?: number;\n width: number;\n height: number;\n mimeType?: string;\n };\n coordinateSpace: {\n normalized: true;\n width: number;\n height: number;\n };\n tiles: {\n tileSize: number;\n format: TileFormat;\n minZoom: number;\n maxZoom: number;\n pathTemplate: string;\n levels: TileLevelManifest[];\n };\n view: {\n defaultCenter: [number, number];\n defaultZoom: number;\n minZoom: number;\n maxZoom: number;\n };\n overlays?: {\n inline?: RegionCollection;\n url?: string;\n };\n assets?: {\n preview?: string;\n };\n metadata?: {\n title?: string;\n createdAt?: string;\n [key: string]: unknown;\n };\n}\n\nexport interface CreateManifestInput extends Omit<PdfMapManifest, \"version\" | \"kind\"> {}\n\nexport interface ResolveTileUrlArgs {\n manifest: PdfMapManifest;\n z: number;\n x: number;\n y: number;\n baseUrl?: string;\n overrideTemplate?: string;\n}\n\nconst tileLevelSchema = z.object({\n z: z.number().int().min(0),\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n columns: z.number().int().positive(),\n rows: z.number().int().positive(),\n scale: z.number().positive(),\n});\n\nexport const manifestSchema: z.ZodType<PdfMapManifest> = z.object({\n version: z.literal(1),\n kind: z.literal(\"pdf-map\"),\n id: z.string().min(1),\n source: z.object({\n type: z.union([z.literal(\"pdf\"), z.literal(\"image\")]),\n originalFilename: z.string().optional(),\n page: z.number().int().positive().optional(),\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n mimeType: z.string().optional(),\n }),\n coordinateSpace: z.object({\n normalized: z.literal(true),\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n }),\n tiles: z.object({\n tileSize: z.number().int().positive(),\n format: z.union([z.literal(\"webp\"), z.literal(\"jpeg\"), z.literal(\"png\")]),\n minZoom: z.number().int().min(0),\n maxZoom: z.number().int().min(0),\n pathTemplate: z.string().min(1),\n levels: z.array(tileLevelSchema),\n }),\n view: z.object({\n defaultCenter: z.tuple([\n z.number().finite().min(0).max(1),\n z.number().finite().min(0).max(1),\n ]),\n defaultZoom: z.number().finite(),\n minZoom: z.number().finite(),\n maxZoom: z.number().finite(),\n }),\n overlays: z\n .object({\n inline: regionCollectionSchema.optional(),\n url: z.string().optional(),\n })\n .optional(),\n assets: z\n .object({\n preview: z.string().optional(),\n })\n .optional(),\n metadata: z\n .object({\n title: z.string().optional(),\n createdAt: z.string().optional(),\n })\n .catchall(z.unknown())\n .optional(),\n});\n\nexport function createManifest(input: CreateManifestInput): PdfMapManifest {\n return manifestSchema.parse({\n version: 1,\n kind: \"pdf-map\",\n ...input,\n });\n}\n\nexport function parseManifest(input: unknown): PdfMapManifest {\n return manifestSchema.parse(input);\n}\n\nexport function resolveTileUrl(args: ResolveTileUrlArgs): string {\n const template = args.overrideTemplate ?? args.manifest.tiles.pathTemplate;\n const relative = template\n .replaceAll(\"{z}\", String(args.z))\n .replaceAll(\"{x}\", String(args.x))\n .replaceAll(\"{y}\", String(args.y));\n\n if (/^https?:\\/\\//.test(relative)) {\n return relative;\n }\n\n if (!args.baseUrl) {\n return relative;\n }\n\n if (/^https?:\\/\\//.test(args.baseUrl)) {\n return new URL(relative.replace(/^\\//, \"\"), ensureTrailingSlash(args.baseUrl)).toString();\n }\n\n return joinRelativeUrl(args.baseUrl, relative);\n}\n\nfunction ensureTrailingSlash(value: string): string {\n return value.endsWith(\"/\") ? value : `${value}/`;\n}\n\nfunction joinRelativeUrl(baseUrl: string, path: string): string {\n const normalizedBase = ensureLeadingSlash(stripTrailingSlash(baseUrl));\n const normalizedPath = stripLeadingSlash(path);\n\n if (!normalizedPath) {\n return normalizedBase || \"/\";\n }\n\n return normalizedBase ? `${normalizedBase}/${normalizedPath}` : `/${normalizedPath}`;\n}\n\nfunction stripLeadingSlash(value: string): string {\n return value.replace(/^\\/+/, \"\");\n}\n\nfunction stripTrailingSlash(value: string): string {\n return value.replace(/\\/+$/, \"\");\n}\n\nfunction ensureLeadingSlash(value: string): string {\n if (!value) {\n return \"\";\n }\n return value.startsWith(\"/\") ? value : `/${value}`;\n}\n","import { clamp01 } from \"../../shared/coordinates\";\nimport { resolveTileUrl } from \"../../shared/manifest\";\nimport type { NormalizedPoint } from \"../../shared/coordinates\";\nimport type { MapViewState, ScreenPoint, ViewTransitionOptions } from \"../../shared/viewport\";\nimport type { EngineInitOptions, ViewerEngine } from \"./engineTypes\";\n\ninterface OpenSeadragonModule {\n default: {\n (options: Record<string, unknown>): any;\n Point: new (x: number, y: number) => any;\n Rect: new (x: number, y: number, width: number, height: number) => any;\n };\n}\n\nexport async function createOpenSeadragonEngine(\n options: EngineInitOptions,\n): Promise<ViewerEngine> {\n throwIfAborted(options.signal);\n const OpenSeadragon = (await import(\"openseadragon\")) as unknown as OpenSeadragonModule;\n throwIfAborted(options.signal);\n if (!options.container.isConnected) {\n throw createAbortError();\n }\n const osd = OpenSeadragon.default;\n\n const viewer = osd({\n element: options.container,\n showNavigationControl: false,\n minZoomLevel: options.minZoom,\n maxZoomLevel: options.maxZoom,\n visibilityRatio: 1,\n constrainDuringPan: true,\n animationTime: 0.2,\n gestureSettingsMouse: {\n clickToZoom: false,\n dblClickToZoom: true,\n pinchToZoom: true,\n flickEnabled: true,\n scrollToZoom: true,\n },\n tileSources: createTileSource(options.source),\n });\n if (options.signal?.aborted || !options.container.isConnected) {\n viewer.destroy();\n throw createAbortError();\n }\n\n let isOpen = false;\n\n const publish = () => {\n options.onViewChange?.(getView());\n };\n\n viewer.addHandler(\"open\", () => {\n isOpen = true;\n if (options.initialView?.center) {\n viewer.viewport.panTo(\n imageToViewportPoint(options.initialView.center.x, options.initialView.center.y),\n true,\n );\n }\n if (typeof options.initialView?.zoom === \"number\") {\n viewer.viewport.zoomTo(options.initialView.zoom, undefined, true);\n }\n publish();\n });\n viewer.addHandler(\"animation\", publish);\n viewer.addHandler(\"resize\", publish);\n\n const dimensions = getDimensions(options.source);\n const defaultView = getDefaultView(options, dimensions);\n\n const getItem = () => {\n const item = viewer.world.getItemAt(0);\n return item && typeof item.viewportToImageCoordinates === \"function\" ? item : null;\n };\n\n const getContainerSize = () => {\n const containerSize = viewer.container.getBoundingClientRect();\n return {\n width: containerSize.width,\n height: containerSize.height,\n };\n };\n\n const imageToViewportPoint = (x: number, y: number) => {\n const item = getItem();\n if (!item) {\n return new osd.Point(x, y);\n }\n return item.imageToViewportCoordinates(x * dimensions.width, y * dimensions.height);\n };\n\n const getView = (): MapViewState => {\n const item = getItem();\n const containerSize = getContainerSize();\n if (!isOpen || !item) {\n return {\n ...defaultView,\n containerWidth: containerSize.width,\n containerHeight: containerSize.height,\n };\n }\n\n const center = viewer.viewport.getCenter(true);\n const imageCenter = item.viewportToImageCoordinates(center);\n return {\n center: {\n x: clamp01(imageCenter.x / dimensions.width),\n y: clamp01(imageCenter.y / dimensions.height),\n },\n zoom: viewer.viewport.getZoom(true),\n minZoom: options.minZoom ?? 0,\n maxZoom: options.maxZoom ?? 8,\n containerWidth: containerSize.width,\n containerHeight: containerSize.height,\n };\n };\n\n const engine: ViewerEngine = {\n getView,\n setView(view, transitionOptions) {\n if (!isOpen || !getItem()) {\n return;\n }\n if (view.center) {\n viewer.viewport.panTo(\n imageToViewportPoint(view.center.x, view.center.y),\n transitionOptions?.immediate ?? false,\n );\n }\n if (typeof view.zoom === \"number\") {\n viewer.viewport.zoomTo(view.zoom, undefined, transitionOptions?.immediate ?? false);\n }\n publish();\n },\n fitToBounds(bounds, transitionOptions) {\n const item = getItem();\n if (!isOpen || !item) {\n return;\n }\n if (!bounds) {\n viewer.viewport.goHome(transitionOptions?.immediate ?? false);\n publish();\n return;\n }\n\n const topLeft = item.imageToViewportCoordinates(\n bounds.x * dimensions.width,\n bounds.y * dimensions.height,\n );\n const bottomRight = item.imageToViewportCoordinates(\n (bounds.x + bounds.width) * dimensions.width,\n (bounds.y + bounds.height) * dimensions.height,\n );\n\n viewer.viewport.fitBounds(\n new osd.Rect(\n topLeft.x,\n topLeft.y,\n bottomRight.x - topLeft.x || 0.01,\n bottomRight.y - topLeft.y || 0.01,\n ),\n transitionOptions?.immediate ?? false,\n );\n publish();\n },\n screenToNormalized(point: ScreenPoint) {\n const item = getItem();\n if (!isOpen || !item) {\n const size = getContainerSize();\n return {\n x: size.width > 0 ? clamp01(point.x / size.width) : 0,\n y: size.height > 0 ? clamp01(point.y / size.height) : 0,\n };\n }\n const viewportPoint = viewer.viewport.pointFromPixel(\n new osd.Point(point.x, point.y),\n true,\n );\n const imagePoint = item.viewportToImageCoordinates(viewportPoint);\n return {\n x: clamp01(imagePoint.x / dimensions.width),\n y: clamp01(imagePoint.y / dimensions.height),\n };\n },\n normalizedToScreen(point: NormalizedPoint) {\n if (!isOpen || !getItem()) {\n const size = getContainerSize();\n return {\n x: point.x * size.width,\n y: point.y * size.height,\n };\n }\n const viewportPoint = imageToViewportPoint(point.x, point.y);\n const pixel = viewer.viewport.pixelFromPoint(viewportPoint, true);\n return {\n x: pixel.x,\n y: pixel.y,\n };\n },\n destroy() {\n isOpen = false;\n viewer.destroy();\n },\n resize() {\n viewer.forceRedraw();\n publish();\n },\n getContainer() {\n return options.container;\n },\n };\n\n return engine;\n}\n\nfunction throwIfAborted(signal?: AbortSignal) {\n if (signal?.aborted) {\n throw createAbortError();\n }\n}\n\nfunction createAbortError() {\n const error = new Error(\"Viewer initialization aborted.\");\n error.name = \"AbortError\";\n return error;\n}\n\nfunction getDefaultView(\n options: EngineInitOptions,\n dimensions: { width: number; height: number },\n): MapViewState {\n const manifestView = options.source.type === \"tiles\" ? options.source.manifest.view : undefined;\n\n return {\n center: options.initialView?.center ?? normalizedCenterFromSource(options.source),\n zoom: options.initialView?.zoom ?? manifestView?.defaultZoom ?? 1,\n minZoom: options.minZoom ?? manifestView?.minZoom ?? 0,\n maxZoom: options.maxZoom ?? manifestView?.maxZoom ?? 8,\n containerWidth: dimensions.width,\n containerHeight: dimensions.height,\n };\n}\n\nfunction normalizedCenterFromSource(source: EngineInitOptions[\"source\"]) {\n if (source.type === \"tiles\") {\n return {\n x: source.manifest.view.defaultCenter[0],\n y: source.manifest.view.defaultCenter[1],\n };\n }\n\n return { x: 0.5, y: 0.5 };\n}\n\nfunction createTileSource(source: EngineInitOptions[\"source\"]) {\n if (source.type === \"tiles\") {\n const manifest = source.manifest;\n return {\n width: manifest.source.width,\n height: manifest.source.height,\n tileSize: manifest.tiles.tileSize,\n minLevel: manifest.tiles.minZoom,\n maxLevel: manifest.tiles.maxZoom,\n getTileUrl(level: number, x: number, y: number) {\n if (source.getTileUrl) {\n return source.getTileUrl({\n manifest,\n z: level,\n x,\n y,\n }) as string;\n }\n return resolveTileUrl({\n manifest,\n z: level,\n x,\n y,\n baseUrl: source.baseUrl,\n });\n },\n };\n }\n\n if (source.type === \"image\") {\n return {\n type: \"image\",\n url: source.src,\n buildPyramid: false,\n };\n }\n\n throw new Error(\"OpenSeadragon engine only supports tile and image sources.\");\n}\n\nfunction getDimensions(source: EngineInitOptions[\"source\"]) {\n if (source.type === \"tiles\") {\n return {\n width: source.manifest.source.width,\n height: source.manifest.source.height,\n };\n }\n\n if (source.type === \"image\") {\n return {\n width: source.width,\n height: source.height,\n };\n }\n\n throw new Error(\"OpenSeadragon engine only supports image and tile sources.\");\n}\n","export function toUint8Array(input: Buffer | Uint8Array | ArrayBuffer): Uint8Array {\n if (input instanceof ArrayBuffer) {\n return new Uint8Array(input);\n }\n\n return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n}\n","export const pdfWorkerUrl = new URL(\"../pdf.worker.min.mjs\", import.meta.url).toString();\n\nexport default pdfWorkerUrl;\n","import { toUint8Array } from \"../../shared/bytes\";\nimport { pdfWorkerUrl } from \"../../shared/pdfWorkerUrl\";\nimport type { PDFDocumentProxy, PDFPageProxy } from \"pdfjs-dist/types/src/display/api\";\n\nimport { clamp01 } from \"../../shared/coordinates\";\nimport type { MapViewState, ScreenPoint, ViewTransitionOptions } from \"../../shared/viewport\";\nimport type { EngineInitOptions, ViewerEngine } from \"./engineTypes\";\n\ninterface PdfJsModule {\n GlobalWorkerOptions: {\n workerSrc: string;\n };\n getDocument: (src: unknown) => {\n promise: Promise<any>;\n destroy?: () => void;\n };\n}\n\nexport async function createPdfJsEngine(options: EngineInitOptions): Promise<ViewerEngine> {\n if (options.source.type !== \"pdf\") {\n throw new Error(\"PDF.js engine only supports PDF sources.\");\n }\n\n throwIfAborted(options.signal);\n const pdfjs = (await import(\"pdfjs-dist/legacy/build/pdf.mjs\")) as PdfJsModule;\n throwIfAborted(options.signal);\n if (!options.container.isConnected) {\n throw createAbortError();\n }\n const workerSrc = options.source.workerSrc ?? pdfWorkerUrl;\n if (!workerSrc) {\n throw new Error(\n \"PDF sources require a configured worker URL. Pass source.workerSrc or use pdfWorkerUrl from pdf-mapview.\",\n );\n }\n pdfjs.GlobalWorkerOptions.workerSrc = workerSrc;\n const file = options.source.file;\n const loadingTask = pdfjs.getDocument(\n typeof file === \"string\"\n ? {\n url: file,\n }\n : {\n data: toUint8Array(file),\n },\n );\n const pdf = (await loadingTask.promise) as PDFDocumentProxy;\n if (options.signal?.aborted || !options.container.isConnected) {\n loadingTask.destroy?.();\n await pdf.destroy();\n throw createAbortError();\n }\n const page = (await pdf.getPage(options.source.page ?? 1)) as PDFPageProxy;\n\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\");\n if (!context) {\n throw new Error(\"Unable to get 2D context for PDF canvas.\");\n }\n\n options.container.innerHTML = \"\";\n options.container.style.overflow = \"hidden\";\n options.container.style.touchAction = \"none\";\n options.container.appendChild(canvas);\n\n const baseViewport = page.getViewport({ scale: 1 });\n const containerRect = options.container.getBoundingClientRect();\n const fitScale =\n containerRect.width > 0 && containerRect.height > 0\n ? Math.min(containerRect.width / baseViewport.width, containerRect.height / baseViewport.height)\n : 1;\n const renderScale = Math.max(1, fitScale);\n\n const renderedViewport = page.getViewport({ scale: renderScale });\n canvas.width = Math.ceil(renderedViewport.width);\n canvas.height = Math.ceil(renderedViewport.height);\n canvas.style.transformOrigin = \"0 0\";\n canvas.style.willChange = \"transform\";\n\n await page.render({\n canvasContext: context,\n viewport: renderedViewport,\n }).promise;\n\n let view: MapViewState = {\n center: options.initialView?.center ?? { x: 0.5, y: 0.5 },\n zoom: options.initialView?.zoom ?? 1,\n minZoom: options.minZoom ?? 0.5,\n maxZoom: options.maxZoom ?? 8,\n containerWidth: containerRect.width,\n containerHeight: containerRect.height,\n };\n\n let pan = { x: 0, y: 0 };\n let dragging = false;\n let dragOrigin = { x: 0, y: 0 };\n\n const publish = () => {\n options.onViewChange?.({ ...view });\n };\n\n const applyTransform = () => {\n const rect = options.container.getBoundingClientRect();\n view = {\n ...view,\n containerWidth: rect.width,\n containerHeight: rect.height,\n };\n canvas.style.transform = `translate(${pan.x}px, ${pan.y}px) scale(${view.zoom})`;\n publish();\n };\n\n const normalizedToCanvas = (point: ScreenPoint) => ({\n x: point.x * canvas.width,\n y: point.y * canvas.height,\n });\n\n const screenToNormalized = (point: ScreenPoint) => {\n const localX = (point.x - pan.x) / view.zoom;\n const localY = (point.y - pan.y) / view.zoom;\n return {\n x: clamp01(localX / canvas.width),\n y: clamp01(localY / canvas.height),\n };\n };\n\n const handlePointerDown = (event: PointerEvent) => {\n dragging = true;\n dragOrigin = { x: event.clientX - pan.x, y: event.clientY - pan.y };\n };\n\n const handlePointerMove = (event: PointerEvent) => {\n if (!dragging) {\n return;\n }\n pan = {\n x: event.clientX - dragOrigin.x,\n y: event.clientY - dragOrigin.y,\n };\n applyTransform();\n };\n\n const handlePointerUp = () => {\n dragging = false;\n };\n\n const handleWheel = (event: WheelEvent) => {\n event.preventDefault();\n const delta = event.deltaY < 0 ? 1.1 : 0.9;\n const nextZoom = Math.min(view.maxZoom, Math.max(view.minZoom, view.zoom * delta));\n view = {\n ...view,\n zoom: nextZoom,\n };\n applyTransform();\n };\n\n options.container.addEventListener(\"pointerdown\", handlePointerDown);\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n options.container.addEventListener(\"wheel\", handleWheel, { passive: false });\n\n applyTransform();\n\n const engine: ViewerEngine = {\n getView() {\n return { ...view };\n },\n setView(nextView, transitionOptions) {\n if (nextView.center) {\n view = { ...view, center: nextView.center };\n }\n if (typeof nextView.zoom === \"number\") {\n view = {\n ...view,\n zoom: Math.min(view.maxZoom, Math.max(view.minZoom, nextView.zoom)),\n };\n }\n if (nextView.minZoom) {\n view = { ...view, minZoom: nextView.minZoom };\n }\n if (nextView.maxZoom) {\n view = { ...view, maxZoom: nextView.maxZoom };\n }\n if (transitionOptions?.immediate === false) {\n requestAnimationFrame(applyTransform);\n } else {\n applyTransform();\n }\n },\n fitToBounds(bounds) {\n if (!bounds) {\n view = { ...view, center: { x: 0.5, y: 0.5 }, zoom: 1 };\n pan = { x: 0, y: 0 };\n applyTransform();\n return;\n }\n\n const rect = options.container.getBoundingClientRect();\n const zoomX = rect.width / (bounds.width * canvas.width || canvas.width);\n const zoomY = rect.height / (bounds.height * canvas.height || canvas.height);\n const nextZoom = Math.min(view.maxZoom, Math.max(view.minZoom, Math.min(zoomX, zoomY)));\n const centerX = (bounds.x + bounds.width / 2) * canvas.width * nextZoom;\n const centerY = (bounds.y + bounds.height / 2) * canvas.height * nextZoom;\n pan = {\n x: rect.width / 2 - centerX,\n y: rect.height / 2 - centerY,\n };\n view = {\n ...view,\n center: {\n x: bounds.x + bounds.width / 2,\n y: bounds.y + bounds.height / 2,\n },\n zoom: nextZoom,\n };\n applyTransform();\n },\n screenToNormalized,\n normalizedToScreen(point) {\n const local = normalizedToCanvas(point);\n return {\n x: pan.x + local.x * view.zoom,\n y: pan.y + local.y * view.zoom,\n };\n },\n destroy() {\n options.container.removeEventListener(\"pointerdown\", handlePointerDown);\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n options.container.removeEventListener(\"wheel\", handleWheel);\n loadingTask.destroy?.();\n },\n resize() {\n applyTransform();\n },\n getContainer() {\n return options.container;\n },\n };\n\n return engine;\n}\n\nfunction throwIfAborted(signal?: AbortSignal) {\n if (signal?.aborted) {\n throw createAbortError();\n }\n}\n\nfunction createAbortError() {\n const error = new Error(\"Viewer initialization aborted.\");\n error.name = \"AbortError\";\n return error;\n}\n","import {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport type { RegionFeature, RegionCollection } from \"../../shared/overlays\";\nimport type { PdfMapSource } from \"../../shared/source\";\nimport type { NormalizedRect } from \"../../shared/coordinates\";\nimport type {\n MapPointerEvent,\n MapViewState,\n ScreenPoint,\n ViewTransitionOptions,\n} from \"../../shared/viewport\";\nimport { normalizeRegions } from \"../../shared/overlays\";\nimport { MapController } from \"../core/MapController\";\nimport { OverlayLayer, type RegionRenderArgs } from \"./OverlayLayer\";\nimport { createOpenSeadragonEngine } from \"../engines/openSeadragonEngine\";\nimport { createPdfJsEngine } from \"../engines/pdfJsEngine\";\nimport { MapRuntimeContext } from \"../runtimeContext\";\n\nexport interface MapApi {\n getView(): MapViewState;\n setView(view: Partial<MapViewState>, opts?: ViewTransitionOptions): void;\n fitToBounds(bounds?: NormalizedRect, opts?: ViewTransitionOptions): void;\n zoomToRegion(regionId: string, opts?: ViewTransitionOptions): void;\n screenToNormalized(point: ScreenPoint): { x: number; y: number };\n normalizedToScreen(point: { x: number; y: number }): ScreenPoint;\n}\n\nexport interface TileMapViewerProps {\n source: PdfMapSource;\n regions?: RegionCollection | RegionFeature[];\n initialView?: Partial<MapViewState>;\n minZoom?: number;\n maxZoom?: number;\n className?: string;\n style?: React.CSSProperties;\n selectedRegionId?: string | null;\n onViewChange?: (view: MapViewState) => void;\n onRegionClick?: (region: RegionFeature, event: MapPointerEvent) => void;\n onRegionHover?: (region: RegionFeature | null, event: MapPointerEvent) => void;\n renderRegion?: (args: RegionRenderArgs) => React.ReactNode;\n}\n\nexport const TileMapViewer = forwardRef<MapApi, TileMapViewerProps>(function TileMapViewer(\n props,\n ref,\n) {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const controller = useMemo(() => new MapController(), []);\n const [hoveredRegionId, setHoveredRegionId] = useState<string | null>(null);\n const sourceRef = useRef(props.source);\n const initialViewRef = useRef(props.initialView);\n const onViewChangeRef = useRef(props.onViewChange);\n\n sourceRef.current = props.source;\n initialViewRef.current = props.initialView;\n onViewChangeRef.current = props.onViewChange;\n\n const regions = useMemo(() => normalizeRegions(props.regions), [props.regions]);\n const sourceKey = useMemo(() => getSourceKey(props.source), [props.source]);\n const initialViewKey = useMemo(() => getInitialViewKey(props.initialView), [props.initialView]);\n const mapApi = useMemo<MapApi>(\n () => ({\n getView: () => controller.getView(),\n setView: (view, opts) => controller.setView(view, opts),\n fitToBounds: (bounds, opts) => controller.fitToBounds(bounds, opts),\n zoomToRegion: (regionId, opts) => controller.zoomToRegion(regionId, opts),\n screenToNormalized: (point) => controller.screenToNormalized(point),\n normalizedToScreen: (point) => controller.normalizedToScreen(point),\n }),\n [controller],\n );\n\n useEffect(() => {\n controller.setRegions(regions);\n }, [controller, regions]);\n\n useImperativeHandle(ref, () => mapApi, [mapApi]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) {\n return;\n }\n\n const abortController = new AbortController();\n let activeEngine: Awaited<ReturnType<typeof createOpenSeadragonEngine>> | null = null;\n\n const onViewChange = (view: MapViewState) => {\n controller.store.setState(view);\n onViewChangeRef.current?.(view);\n };\n\n const createEngine = async () => {\n try {\n const source = sourceRef.current;\n const initialView = initialViewRef.current;\n\n if (\n abortController.signal.aborted ||\n containerRef.current !== container ||\n !container.isConnected\n ) {\n return;\n }\n\n const engine =\n source.type === \"pdf\"\n ? await createPdfJsEngine({\n container,\n source,\n minZoom: props.minZoom,\n maxZoom: props.maxZoom,\n initialView,\n onViewChange,\n signal: abortController.signal,\n })\n : await createOpenSeadragonEngine({\n container,\n source,\n minZoom: props.minZoom,\n maxZoom: props.maxZoom,\n initialView,\n onViewChange,\n signal: abortController.signal,\n });\n\n if (\n abortController.signal.aborted ||\n containerRef.current !== container ||\n !container.isConnected\n ) {\n engine.destroy();\n return;\n }\n\n activeEngine = engine;\n controller.attachEngine(engine);\n } catch (error) {\n if (!(error instanceof Error) || error.name !== \"AbortError\") {\n console.error(error);\n }\n }\n };\n\n void createEngine();\n\n const resizeObserver = new ResizeObserver(() => {\n controller.resize();\n });\n resizeObserver.observe(container);\n\n return () => {\n abortController.abort();\n resizeObserver.disconnect();\n if (activeEngine) {\n controller.detachEngine(activeEngine);\n activeEngine.destroy();\n }\n if (containerRef.current === container) {\n container.innerHTML = \"\";\n }\n };\n }, [controller, initialViewKey, props.maxZoom, props.minZoom, sourceKey]);\n\n return (\n <MapRuntimeContext.Provider\n value={{\n controller,\n regions,\n }}\n >\n <div\n className={props.className}\n style={{\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n minHeight: 320,\n background: \"#f8fafc\",\n overflow: \"hidden\",\n ...props.style,\n }}\n >\n <div\n ref={containerRef}\n style={{\n position: \"absolute\",\n inset: 0,\n }}\n />\n <OverlayLayer\n regions={regions}\n selectedRegionId={props.selectedRegionId}\n hoveredRegionId={hoveredRegionId}\n onRegionClick={props.onRegionClick}\n onRegionHover={(region, event) => {\n setHoveredRegionId(region?.id ?? null);\n props.onRegionHover?.(region, event);\n }}\n renderRegion={props.renderRegion}\n />\n </div>\n </MapRuntimeContext.Provider>\n );\n});\n\nconst objectIdCache = new WeakMap<object, number>();\nlet nextObjectId = 1;\n\nfunction getSourceKey(source: PdfMapSource): string {\n switch (source.type) {\n case \"tiles\":\n return JSON.stringify({\n type: source.type,\n manifestId: source.manifest.id,\n width: source.manifest.source.width,\n height: source.manifest.source.height,\n pathTemplate: source.manifest.tiles.pathTemplate,\n minZoom: source.manifest.tiles.minZoom,\n maxZoom: source.manifest.tiles.maxZoom,\n baseUrl: source.baseUrl ?? null,\n getTileUrl: source.getTileUrl ? getObjectId(source.getTileUrl) : null,\n });\n case \"image\":\n return JSON.stringify({\n type: source.type,\n src: source.src,\n width: source.width,\n height: source.height,\n });\n case \"pdf\":\n return JSON.stringify({\n type: source.type,\n page: source.page ?? 1,\n file: typeof source.file === \"string\" ? source.file : getObjectId(source.file),\n });\n }\n}\n\nfunction getInitialViewKey(initialView?: Partial<MapViewState>): string {\n if (!initialView) {\n return \"null\";\n }\n\n return JSON.stringify({\n center: initialView.center\n ? {\n x: initialView.center.x,\n y: initialView.center.y,\n }\n : null,\n zoom: initialView.zoom ?? null,\n minZoom: initialView.minZoom ?? null,\n maxZoom: initialView.maxZoom ?? null,\n });\n}\n\nfunction getObjectId(value: object): number {\n const existing = objectIdCache.get(value);\n if (existing) {\n return existing;\n }\n const id = nextObjectId;\n nextObjectId += 1;\n objectIdCache.set(value, id);\n return id;\n}\n","import { forwardRef } from \"react\";\n\nimport type { MapApi, TileMapViewerProps } from \"./TileMapViewer\";\nimport { TileMapViewer } from \"./TileMapViewer\";\n\nexport const PdfMap = forwardRef<MapApi, TileMapViewerProps>(function PdfMap(props, ref) {\n return <TileMapViewer ref={ref} {...props} />;\n});\n","import { useContext } from \"react\";\n\nimport { MapRuntimeContext } from \"../runtimeContext\";\n\nexport function useRegions() {\n return useContext(MapRuntimeContext)?.regions ?? [];\n}\n"]}
|
package/dist/client/index.d.cts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import { i as RegionFeature, d as NormalizedRect, h as RegionCollection, N as NormalizedPoint } from '../ingest-sfbf6503.cjs';
|
|
3
|
-
import { d as ViewportController, b as MapViewState, V as ViewTransitionOptions, S as ScreenPoint, P as PdfMapSource, M as MapPointerEvent } from '../source-
|
|
3
|
+
import { d as ViewportController, b as MapViewState, V as ViewTransitionOptions, S as ScreenPoint, P as PdfMapSource, M as MapPointerEvent } from '../source-CGfHymsL.cjs';
|
|
4
|
+
export { p as pdfWorkerUrl } from '../source-CGfHymsL.cjs';
|
|
4
5
|
import 'zod';
|
|
5
6
|
|
|
6
7
|
interface ProjectedPoint {
|
package/dist/client/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import { i as RegionFeature, d as NormalizedRect, h as RegionCollection, N as NormalizedPoint } from '../ingest-sfbf6503.js';
|
|
3
|
-
import { d as ViewportController, b as MapViewState, V as ViewTransitionOptions, S as ScreenPoint, P as PdfMapSource, M as MapPointerEvent } from '../source-
|
|
3
|
+
import { d as ViewportController, b as MapViewState, V as ViewTransitionOptions, S as ScreenPoint, P as PdfMapSource, M as MapPointerEvent } from '../source-CfLTVdEE.js';
|
|
4
|
+
export { p as pdfWorkerUrl } from '../source-CfLTVdEE.js';
|
|
4
5
|
import 'zod';
|
|
5
6
|
|
|
6
7
|
interface ProjectedPoint {
|
package/dist/client/index.js
CHANGED
|
@@ -736,17 +736,27 @@ function toUint8Array(input) {
|
|
|
736
736
|
return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);
|
|
737
737
|
}
|
|
738
738
|
|
|
739
|
+
// src/shared/pdfWorkerUrl.ts
|
|
740
|
+
var pdfWorkerUrl = new URL("../pdf.worker.min.mjs", import.meta.url).toString();
|
|
741
|
+
|
|
739
742
|
// src/client/engines/pdfJsEngine.ts
|
|
740
743
|
async function createPdfJsEngine(options) {
|
|
741
744
|
if (options.source.type !== "pdf") {
|
|
742
745
|
throw new Error("PDF.js engine only supports PDF sources.");
|
|
743
746
|
}
|
|
744
747
|
throwIfAborted2(options.signal);
|
|
745
|
-
const pdfjs = await import('pdfjs-dist/build/pdf.mjs');
|
|
748
|
+
const pdfjs = await import('pdfjs-dist/legacy/build/pdf.mjs');
|
|
746
749
|
throwIfAborted2(options.signal);
|
|
747
750
|
if (!options.container.isConnected) {
|
|
748
751
|
throw createAbortError2();
|
|
749
752
|
}
|
|
753
|
+
const workerSrc = options.source.workerSrc ?? pdfWorkerUrl;
|
|
754
|
+
if (!workerSrc) {
|
|
755
|
+
throw new Error(
|
|
756
|
+
"PDF sources require a configured worker URL. Pass source.workerSrc or use pdfWorkerUrl from pdf-mapview."
|
|
757
|
+
);
|
|
758
|
+
}
|
|
759
|
+
pdfjs.GlobalWorkerOptions.workerSrc = workerSrc;
|
|
750
760
|
const file = options.source.file;
|
|
751
761
|
const loadingTask = pdfjs.getDocument(
|
|
752
762
|
typeof file === "string" ? {
|
|
@@ -1144,6 +1154,6 @@ function useRegions() {
|
|
|
1144
1154
|
return useContext(MapRuntimeContext)?.regions ?? [];
|
|
1145
1155
|
}
|
|
1146
1156
|
|
|
1147
|
-
export { PdfMap, TileMapViewer, useMapApi, useRegions, useViewportState };
|
|
1157
|
+
export { PdfMap, TileMapViewer, pdfWorkerUrl, useMapApi, useRegions, useViewportState };
|
|
1148
1158
|
//# sourceMappingURL=index.js.map
|
|
1149
1159
|
//# sourceMappingURL=index.js.map
|