Skip to content

Commit ee0e357

Browse files
committed
Add functionality for viewing IIIF images and manifests
This uses OpenSeaDragon to provide a lightweight viewer for images and manifests. Other than paging and zoom controls, nothing else is provided in order to keep the implementation simple. Works for both IIIF v2 and v3. Ref #19 Ref #69
1 parent 3a27c3e commit ee0e357

File tree

18 files changed

+384
-31
lines changed

18 files changed

+384
-31
lines changed

assets/icons/arrow-left.svg

Lines changed: 3 additions & 0 deletions
Loading

assets/icons/arrow-right.svg

Lines changed: 3 additions & 0 deletions
Loading

assets/icons/arrows-fullscreen.svg

Lines changed: 3 additions & 0 deletions
Loading

assets/icons/house.svg

Lines changed: 3 additions & 0 deletions
Loading

assets/icons/zoom-in.svg

Lines changed: 5 additions & 0 deletions
Loading

assets/icons/zoom-out.svg

Lines changed: 5 additions & 0 deletions
Loading

package-lock.json

Lines changed: 31 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,12 @@
4747
"license": "MIT",
4848
"dependencies": {
4949
"@geomatico/maplibre-cog-protocol": "^0.5.0",
50+
"@iiif/presentation-2": "^1.0.4",
51+
"@iiif/presentation-3": "^2.2.3",
5052
"@shoelace-style/shoelace": "^2.20.1",
5153
"@terraformer/wkt": "^2.2.1",
5254
"d3-scale": "^4.0.2",
53-
"maplibre-gl": "^5.6.0"
55+
"maplibre-gl": "^5.6.0",
56+
"openseadragon": "^5.0.1"
5457
}
5558
}

src/components.d.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ import { EaseToOptions } from "maplibre-gl";
1010
export { OgmRecord } from "./utils/record";
1111
export { EaseToOptions } from "maplibre-gl";
1212
export namespace Components {
13+
interface OgmImage {
14+
"record": OgmRecord;
15+
"theme": 'light' | 'dark';
16+
}
1317
interface OgmMap {
1418
"easeMapTo": (options: EaseToOptions) => Promise<maplibregl.Map>;
1519
"previewOpacity": number;
@@ -35,10 +39,15 @@ export namespace Components {
3539
"theme": 'light' | 'dark';
3640
}
3741
interface OgmViewer {
42+
"loadRecord": (record: OgmRecord) => Promise<void>;
3843
"recordUrl": string;
3944
"theme": 'light' | 'dark';
4045
}
4146
}
47+
export interface OgmImageCustomEvent<T> extends CustomEvent<T> {
48+
detail: T;
49+
target: HTMLOgmImageElement;
50+
}
4251
export interface OgmMapCustomEvent<T> extends CustomEvent<T> {
4352
detail: T;
4453
target: HTMLOgmMapElement;
@@ -52,6 +61,24 @@ export interface OgmSettingsCustomEvent<T> extends CustomEvent<T> {
5261
target: HTMLOgmSettingsElement;
5362
}
5463
declare global {
64+
interface HTMLOgmImageElementEventMap {
65+
"imageLoaded": void;
66+
"imageLoading": void;
67+
}
68+
interface HTMLOgmImageElement extends Components.OgmImage, HTMLStencilElement {
69+
addEventListener<K extends keyof HTMLOgmImageElementEventMap>(type: K, listener: (this: HTMLOgmImageElement, ev: OgmImageCustomEvent<HTMLOgmImageElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
70+
addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
71+
addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
72+
addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
73+
removeEventListener<K extends keyof HTMLOgmImageElementEventMap>(type: K, listener: (this: HTMLOgmImageElement, ev: OgmImageCustomEvent<HTMLOgmImageElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
74+
removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
75+
removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
76+
removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
77+
}
78+
var HTMLOgmImageElement: {
79+
prototype: HTMLOgmImageElement;
80+
new (): HTMLOgmImageElement;
81+
};
5582
interface HTMLOgmMapElementEventMap {
5683
"mapIdle": void;
5784
"mapLoading": void;
@@ -123,6 +150,7 @@ declare global {
123150
new (): HTMLOgmViewerElement;
124151
};
125152
interface HTMLElementTagNameMap {
153+
"ogm-image": HTMLOgmImageElement;
126154
"ogm-map": HTMLOgmMapElement;
127155
"ogm-menubar": HTMLOgmMenubarElement;
128156
"ogm-metadata": HTMLOgmMetadataElement;
@@ -132,6 +160,12 @@ declare global {
132160
}
133161
}
134162
declare namespace LocalJSX {
163+
interface OgmImage {
164+
"onImageLoaded"?: (event: OgmImageCustomEvent<void>) => void;
165+
"onImageLoading"?: (event: OgmImageCustomEvent<void>) => void;
166+
"record"?: OgmRecord;
167+
"theme"?: 'light' | 'dark';
168+
}
135169
interface OgmMap {
136170
"onMapIdle"?: (event: OgmMapCustomEvent<void>) => void;
137171
"onMapLoading"?: (event: OgmMapCustomEvent<void>) => void;
@@ -164,6 +198,7 @@ declare namespace LocalJSX {
164198
"theme"?: 'light' | 'dark';
165199
}
166200
interface IntrinsicElements {
201+
"ogm-image": OgmImage;
167202
"ogm-map": OgmMap;
168203
"ogm-menubar": OgmMenubar;
169204
"ogm-metadata": OgmMetadata;
@@ -176,6 +211,7 @@ export { LocalJSX as JSX };
176211
declare module "@stencil/core" {
177212
export namespace JSX {
178213
interface IntrinsicElements {
214+
"ogm-image": LocalJSX.OgmImage & JSXBase.HTMLAttributes<HTMLOgmImageElement>;
179215
"ogm-map": LocalJSX.OgmMap & JSXBase.HTMLAttributes<HTMLOgmMapElement>;
180216
"ogm-menubar": LocalJSX.OgmMenubar & JSXBase.HTMLAttributes<HTMLOgmMenubarElement>;
181217
"ogm-metadata": LocalJSX.OgmMetadata & JSXBase.HTMLAttributes<HTMLOgmMetadataElement>;
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
:host {
2+
display: block;
3+
width: 100%;
4+
height: 100%;
5+
position: relative;
6+
}
7+
8+
#openseadragon {
9+
height: 100%;
10+
background-color: var(--sl-panel-background-color);
11+
}
12+
13+
.controls {
14+
position: absolute;
15+
top: 0.5rem;
16+
right: 0.5rem;
17+
z-index: 1;
18+
display: flex;
19+
flex-direction: column;
20+
gap: 0.5rem;
21+
}

0 commit comments

Comments
 (0)