Skip to content

Commit cd91d69

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. Ref #19 Ref #69
1 parent 3a27c3e commit cd91d69

21 files changed

+468
-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)