A modern IIIF viewer with a small footprint (despite the name) distributed as a web component that can be dropped into any HTML page or frontend framework.
This is a work in progress and does not support all required IIIF client features (yet).
This project is heavily inspired by Mirador 4, which I still view as the premier IIIF viewer.
behavior and viewingDirection (including RTL support)openSeadragonConfigThis project is actively developed. The following IIIF features are not yet supported:
duration) not supportedstart property: Cannot specify initial canvas or temporal positionnavDate: No date-based navigation for newspapers/journalsannotation-editorThe annotation-editor plugin supports custom storage adapters plus extension hooks for host apps that need to inject create rules, draft enrichment, lazy body hydration, or selection-linked workflows without forking the plugin. See docs/plugins.md.
There is also an optional pdf-export plugin for downloading a selected flat range of canvases as a client-side PDF, with optional consumer-configured cover-sheet metadata and an optional OCR annotation-source selector for PDF text. When canvases include IIIF OCR annotations with supplementing text bodies and xywh targets, the plugin embeds that OCR as selectable PDF text. For private or non-CORS image services, consumers can supply their own image loader/proxy path. See docs/plugins.md.
rendering property: No links to alternative formats (PDF, etc.)placeholderCanvas/accompanyingCanvas: Not supportedThe goal is to support all IIIF client mandatory features with pluggable optional features. The footprint of Triiiceratops, despite the name, is intended to remain considerably smaller than other fully featured viewers while attaining feature parity.
The viewer is available as a web component that works in any framework or static HTML.
Via CDN:
<script
type="module"
src="https://unpkg.com/triiiceratops/dist/triiiceratops-element.js"
></script>
<link
rel="stylesheet"
href="https://unpkg.com/triiiceratops/dist/triiiceratops-element.css"
/>
<div style="height: 600px; width: 100%;">
<triiiceratops-viewer
style="height: 100%; width: 100%; display: block;"
manifest-id="https://iiif.wellcomecollection.org/presentation/v2/b18035723"
>
</triiiceratops-viewer>
</div>
To load a manifest directly from JSON, assign it as a property from JavaScript:
<triiiceratops-viewer id="viewer"></triiiceratops-viewer>
<script type="module">
const viewer = document.getElementById('viewer');
viewer.manifestId = 'urn:example:manifest';
viewer.manifestJson = {
id: 'urn:example:manifest',
type: 'Manifest',
label: { none: ['Local manifest'] },
items: [],
};
</script>
If you are using Svelte, you can import the component directly.
Installation:
pnpm add triiiceratops
Usage:
<script>
import { TriiiceratopsViewer } from 'triiiceratops';
const manifestJson = {
id: 'urn:example:manifest',
type: 'Manifest',
label: { none: ['Local manifest'] },
items: [],
};
</script>
<!-- Container must have height -->
<div style="height: 600px;">
<TriiiceratopsViewer manifestId="urn:example:manifest" {manifestJson} />
</div>
If your application stores transcript or annotation data locally, you can provide search results directly with searchProvider:
<script>
import { TriiiceratopsViewer } from 'triiiceratops';
const searchProvider = async (query, context) => {
return [
{
canvasIndex: 0,
canvasLabel: 'Page 1',
hits: [{ type: 'hit', before: '', match: query, after: '' }],
},
];
};
</script>
<TriiiceratopsViewer
manifestId="urn:example:manifest"
{manifestJson}
{searchProvider}
/>
searchProvider is a callback hook, not a IIIF Search service declaration. It does not add, replace, or override a search service URI in the manifest. If your manifest already declares a normal IIIF Search service, Triiiceratops will use that service when searchProvider is not supplied.
The web component can also load manifest JSON directly via the manifestJson property, but custom search providers remain a Svelte-only integration hook for now.
pnpm install
pnpm dev # Start local demo server
pnpm build:all # Build library, web component, and demo
pnpm test # Run unit tests
pnpm test:e2e # Run end-to-end tests
MIT