diff --git a/.gitignore b/.gitignore
index ff449984d..85caf56ba 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,3 +14,5 @@ vendor
.vscode
.idea
+
+.claude/
\ No newline at end of file
diff --git a/source/presentation/4.0/index.md b/source/presentation/4.0/index.md
index b6b7c6063..006710c90 100644
--- a/source/presentation/4.0/index.md
+++ b/source/presentation/4.0/index.md
@@ -142,7 +142,7 @@ This document acts as an introduction to the specification through a set of typi
## IIIF Use cases
1. **Artwork** - a Manifest that represents a painting, comprising a single image and accompanying display information.
-2. **Book** - a Manifest that represents a digitized bound volume made up many separate images in order. The IIIF model provides structural elements to indicate the chapters. The text of the book is made available in machine-readable form as Web Annotations.
+2. **Book** - a Manifest that represents a digitized bound volume made up of many separate images in order. The IIIF model provides structural elements to indicate the chapters. The text of the book is made available in machine-readable form as Web Annotations.
3. **Periodical** - a IIIF Collection that provides multiple child Collections and Manifests, representing the publication run of a newspaper over many years. The IIIF model provides structural elements to indicate individual articles and other elements.
4. **45 Single** - a Manifest that represents the digitized audio from the two sides of a vinyl 7 inch record.
5. **Movie** - a Manifest that represents the digitized video of a film. A transcript of the audio is provided as Web Annotations, and additional machine-readable files provide subtitles and captions.
@@ -270,7 +270,6 @@ Scenes may also have the [`duration`][prezi-40-model-duration] property in the s
"type": "Model",
"format": "model/gltf-binary"
},
-
"target": {
"id": "https://example.org/iiif/presentation/examples/manifest-with-containers/scene",
"type": "Scene"
@@ -791,7 +790,7 @@ IIIF Collection with [`behavior`][prezi-40-model-behavior] "multi-part" for the
```json
{
"@context": "http://iiif.io/api/presentation/4/context.json",
- "id": "https://example.org/iiif/periodical/multi-part-collection/v1.json",
+ "id": "https://example.org/iiif/periodical/multi-part-collection/v2.json",
"type": "Collection",
"label": { "en": ["The Tombstone Epitaph, 1881"] },
"behavior": ["multi-part"],
@@ -963,6 +962,7 @@ This example is a Manifest with two Timelines, each of which represent a tempora
"target": {
"id": "https://example.org/iiif/presentation/examples/manifest-with-audio/accompany/c1",
"type": "Canvas"
+ }
}
]
}
@@ -990,8 +990,7 @@ This example is a Manifest with two Timelines, each of which represent a tempora
"format": "audio/mp4",
"duration": 231,
"language": ["de"]
- }
-
+ },
"target": {
"id": "https://example.org/iiif/presentation/examples/manifest-with-audio/timeline/t1",
"type": "Timeline"
@@ -1061,10 +1060,11 @@ This example is a Manifest with two Timelines, each of which represent a tempora
"format": "text/plain",
"value": "Hast du etwas Zeit für mich?"
},
- "target": {
- "id": "https://example.org/iiif/presentation/examples/manifest-with-audio/timeline/t1#t=3.5,6.8",
- "type": "Timeline"
- }
+ "target":
+ {
+ "id": "https://example.org/iiif/presentation/examples/manifest-with-audio/timeline/t1#t=3.5,6.8",
+ "type": "Timeline"
+ }
}
]
// (annotations for the rest of the song lines)
@@ -1117,14 +1117,15 @@ This example is a Manifest with one Canvas that represents the temporal extent o
"type": "Annotation",
"motivation": ["painting"],
"body":
- {
- "id": "https://example.org/image/placeholder.png",
- "type": "Image",
- "format": "image/png",
- "height": 320,
- "width": 400
- }
- "target": {
+ {
+ "id": "https://example.org/image/placeholder.png",
+ "type": "Image",
+ "format": "image/png",
+ "height": 320,
+ "width": 400
+ },
+ "target":
+ {
"id": "https://iiif.io/api/cookbook/recipe/0013-placeholderCanvas/canvas/donizetti/placeholder",
"type": "Canvas"
}
@@ -1249,7 +1250,7 @@ There are two types of Camera, [`PerspectiveCamera`][prezi-40-model-PerspectiveC
### Lights
-There are five types of Light: AmbientLight, DirectionalLight, ImageBasedLight, PointLight, and SpotLight. They have an [`intensity`][prezi-40-model-intensity] property, and all Lights except ImageBasedLight have a [`color`][prezi-40-model-color] property. ImageBasedLight has an additional property of [`environmentMap`][prezi-40-model-environment-map] that specifies the environment map image used to simulate lighting. SpotLight has an additional property of [`angle`][prezi-40-model-angle] that determines the spread of its light cone. PointLights and SpotLights can be painted at specific positions within the Scene. DirectionalLights, PointLights, and SpotLights have directional facing in the Scene that affects how light is casted.
+There are five types of Light: AmbientLight, DirectionalLight, ImageBasedLight, PointLight, and SpotLight. They have an [`intensity`][prezi-40-model-intensity] property, and all Lights except ImageBasedLight have a [`color`][prezi-40-model-color] property. ImageBasedLight has an additional property of [`environmentMap`][prezi-40-model-environment-map] that specifies the environment map image used to simulate lighting. SpotLight has an additional property of [`angle`][prezi-40-model-angle] that determines the spread of its light cone. PointLights and SpotLights can be painted at specific positions within the Scene. DirectionalLights, PointLights, and SpotLights have directional facing in the Scene that affects how light is cast.
If the Scene has no Lights, then the client provides its own lighting as it sees fit.
@@ -1352,27 +1353,27 @@ The Light is green and has a position, but has its default orientation of lookin
"type": "Annotation",
"motivation": ["painting"],
"body":
- {
- "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/astronaut/astronaut.glb",
- "type": "Model",
- "format": "model/gltf-binary"
- },
+ {
+ "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/astronaut/astronaut.glb",
+ "type": "Model",
+ "format": "model/gltf-binary"
+ },
"target":
- {
- "type": "SpecificResource",
- "source": {
- "id": "https://example.org/iiif/scene1/page/p1/1",
- "type": "Scene"
- },
- "selector": [
- {
- "type": "PointSelector",
- "x": -1.0,
- "y": 1.0,
- "z": 1.0
- }
- }
- ]
+ {
+ "type": "SpecificResource",
+ "source": {
+ "id": "https://example.org/iiif/scene1/page/p1/1",
+ "type": "Scene"
+ },
+ "selector": [
+ {
+ "type": "PointSelector",
+ "x": -1.0,
+ "y": 1.0,
+ "z": 1.0
+ }
+ ]
+ }
},
{
"id": "https://example.org/iiif/3d/anno2",
@@ -1394,8 +1395,7 @@ The Light is green and has a position, but has its default orientation of lookin
"target":
{
"type": "SpecificResource",
- "source":
- {
+ "source": {
"id": "https://example.org/iiif/scene1/page/p1/1",
"type": "Scene"
},
@@ -1490,7 +1490,7 @@ This example is a Manifest with a single Scene with multiple models painted into
"type": "Model",
"format": "model/gltf-binary"
},
- "target": [
+ "target":
{
"type": "SpecificResource",
"source": {
@@ -1558,40 +1558,39 @@ This example is a Manifest with a single Scene with multiple models painted into
"motivation": ["painting"],
"exclude": ["Audio", "Lights"],
"body":
- {
- "type": "SpecificResource",
- "source": {
- "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/chess/queen.glb",
- "label": { "en": ["Queen"] },
- "type": "Model",
- "format": "model/gltf-binary"
- },
- "transform": [
- {
- "type": "ScaleTransform",
- "x": 1.5,
- "y": 1.5,
- "z": 1.5
- }
- ]
+ {
+ "type": "SpecificResource",
+ "source": {
+ "id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/chess/queen.glb",
+ "label": { "en": ["Queen"] },
+ "type": "Model",
+ "format": "model/gltf-binary"
},
+ "transform": [
+ {
+ "type": "ScaleTransform",
+ "x": 1.5,
+ "y": 1.5,
+ "z": 1.5
+ }
+ ]
+ },
"target":
- {
- "type": "SpecificResource",
- "source": {
- "id": "https://example.org/iiif/scene1/page/p1/1",
- "type": "Scene"
- },
- "selector": [
- {
- "type": "PointSelector",
- "x": 1.0,
- "y": 0.0,
- "z": 2.0
- }
- ]
- }
- ]
+ {
+ "type": "SpecificResource",
+ "source": {
+ "id": "https://example.org/iiif/scene1/page/p1/1",
+ "type": "Scene"
+ },
+ "selector": [
+ {
+ "type": "PointSelector",
+ "x": 1.0,
+ "y": 0.0,
+ "z": 2.0
+ }
+ ]
+ }
},
{
"id": "https://example.org/iiif/3d/anno4",
@@ -1716,7 +1715,7 @@ In this example, the audio content resources have durations that do not match th
"unit": "relative",
"quantityValue": 0.2
}
- }
+ },
"target":
{
"id": "https://example.org/iiif/selectors/anno2",
@@ -1872,7 +1871,8 @@ This example is a Manifest with a Canvas that represents two images displayed si
"format": "image/jpeg"
},
"target":
- {"id": "https://example.org/iiif/presentation/examples/manifest-composite-two-canvases/canvas/c2",
+ {
+ "id": "https://example.org/iiif/presentation/examples/manifest-composite-two-canvases/canvas/c2",
"type": "Canvas"
}
},
@@ -1963,11 +1963,11 @@ A Timeline, Canvas, or Scene with [`duration`][prezi-40-model-duration] can only
## Painting a Canvas or Timeline into a Scene
-Painting nested content into a Scene has some special requirements that must be observed due to important distinctions relating to the infinite boundless 3D space described by a Scene. 2D image or video content resources can be painted into a Scene by first painting the image or video content resource on a Canvas and then painting the Canvas into the Scene. In the case of painting a Timeline into a Scene, an Audio Emitter can be painted into the scene where Timeline is the [`body`][prezi-40-model-body] of the Audio Emitter. This provides greater control over the intended presentation of the Timeline's audio content within the 3D space of the Scene.
+Painting nested content into a Scene has some special requirements that must be observed due to important distinctions relating to the infinite boundless 3D space described by a Scene. 2D image or video content resources can be painted into a Scene by first painting the image or video content resource on a Canvas and then painting the Canvas into the Scene. In the case of painting a Timeline into a Scene, an Audio Emitter can be painted into the scene where Timeline is the [`source`][prezi-40-model-source] of the Audio Emitter. This provides greater control over the intended presentation of the Timeline's audio content within the 3D space of the Scene.
A Canvas can be painted into a Scene as an Annotation, though differences between the 2D space described by a Canvas and the 3D space described by a Scene must be considered. A Canvas describes a bounded 2D space with finite [`height`][prezi-40-model-height] and [`width`][prezi-40-model-width] measured in 2D integer coordinates with a coordinate origin at the top-left corner of the Canvas, while Scenes describe a boundless 3D space with x, y, and z axes of 3D continuous coordinates and a coordinate origin at the center of the space. Further, although 2D images or videos with pixel height and width can be painted into a Canvas, Canvas 2D coordinates are not equivalent to pixels. An image of any height and width in pixels can be painted into a Canvas with different height and width in coordinate units, and this has important consequences for painting Canvases into Scenes.
-When a Canvas is painted as an Annotation targeting a Scene, the top-left corner of the Canvas (the 2D coordinate origin) is aligned with the 3D coordinate origin of the Scene. The top edge of the Canvas is aligned with (e.g., is collinear to) the positive x axis extending from the coordinate origin. The left edge of the Canvas is aligned with (e.g., is collinear to) the negative y axis extending from the coordinate origin. The direction terms "top", "bottom", "right", and "left" used in this section refer to the frame of reference of the Canvas itself, not the Scene into which the Canvas is painted.
+When a Canvas is painted as an Annotation targeting a Scene, the top-left corner of the Canvas (the 2D coordinate origin) is aligned with the 3D coordinate origin of the Scene. The top edge of the Canvas is aligned with (i.e., is collinear to) the positive x axis extending from the coordinate origin. The left edge of the Canvas is aligned with (i.e., is collinear to) the negative y axis extending from the coordinate origin. The direction terms "top", "bottom", "right", and "left" used in this section refer to the frame of reference of the Canvas itself, not the Scene into which the Canvas is painted.
The Canvas is scaled to the Scene such that the 2D coordinate dimensions correspond to 3D coordinate units - a Canvas 16 units wide and 9 units high will extend 16 coordinate units across the x axis and 9 coordinate units across the y axis. Because Canvas coordinate units and image content resource pixels are not equivalent, any image with a 16:9 aspect ratio painted on this Canvas would extend 16 coordinate units by 9 coordinate units in the 3D space of the Scene, whether it was 160 pixels wide and 90 pixels high or 16,000 pixels wide and 9,000 pixels high. This provides one way to control the size of a Canvas painted into a Scene.
@@ -2268,12 +2268,10 @@ In some cases it is desirable to influence the client's positioning of the comme
"value": "This marble portrait exemplifies the veristic tradition that dominated Roman Republican portraiture and persisted into the early Imperial period.",
"position": {
"type": "SpecificResource",
- "source": [
- {
- "id": "https://example.org/iiif/scene/commenting/scene3",
- "type": "Scene"
- }
- ],
+ "source": {
+ "id": "https://example.org/iiif/scene/commenting/scene3",
+ "type": "Scene"
+ },
"selector": [
{
"type": "PointSelector",
@@ -2285,7 +2283,7 @@ In some cases it is desirable to influence the client's positioning of the comme
}
},
"target": {
- "id": "https://example.org/iiif/scene/commenting/scene3/sculpture",
+ "id": "https://example.org/iiif/scene/commenting/scene3",
"type": "Scene"
}
}
@@ -2387,7 +2385,10 @@ This example is a light switch that can be toggled on and off using activating a
"target":
{
"type": "SpecificResource",
- "source": "https://example.org/iiif/scene/switch/scene-1",
+ "source": {
+ "id": "https://example.org/iiif/scene/switch/scene-1",
+ "type": "Scene"
+ },
"selector": [
{
"type": "PointSelector",
@@ -2413,7 +2414,7 @@ This example is a light switch that can be toggled on and off using activating a
{
"type": "TextualBody",
"value": "Click the switch to turn the light on or off"
- }
+ },
"target": {
"id": "https://example.org/iiif/painting-annotation/lightswitch-1",
"type": "Annotation"
@@ -2432,17 +2433,26 @@ This example is a light switch that can be toggled on and off using activating a
"items": [
{
"type": "SpecificResource",
- "source": "https://example.org/iiif/scene/switch/scene-1/annos/1/activating-on-2",
+ "source": {
+ "id": "https://example.org/iiif/scene/switch/scene-1/annos/1/activating-on-2",
+ "type": "Annotation"
+ },
"action": ["disable"]
},
{
"type": "SpecificResource",
- "source": "https://example.org/iiif/scene/switch/scene-1/annos/1/activating-off-3",
+ "source": {
+ "id": "https://example.org/iiif/scene/switch/scene-1/annos/1/activating-off-3",
+ "type": "Annotation"
+ },
"action": ["enable"]
},
{
"type": "SpecificResource",
- "source": "https://example.org/iiif/scene/switch/scene-1/lights/point-light-4",
+ "source": {
+ "id": "https://example.org/iiif/scene/switch/scene-1/lights/point-light-4",
+ "type": "Annotation"
+ },
"action": ["show"]
}
]
@@ -2464,17 +2474,26 @@ This example is a light switch that can be toggled on and off using activating a
[
{
"type": "SpecificResource",
- "source": "https://example.org/iiif/scene/switch/scene-1/annos/1/activating-off-3",
+ "source": {
+ "id": "https://example.org/iiif/scene/switch/scene-1/annos/1/activating-off-3",
+ "type": "Annotation"
+ },
"action": ["disable"]
},
{
"type": "SpecificResource",
- "source": "https://example.org/iiif/scene/switch/scene-1/lights/point-light-4",
+ "source": {
+ "id": "https://example.org/iiif/scene/switch/scene-1/lights/point-light-4",
+ "type": "Annotation"
+ },
"action": ["hide"]
},
{
"type": "SpecificResource",
- "source": "https://example.org/iiif/scene/switch/scene-1/annos/1/activating-on-2",
+ "source": {
+ "id": "https://example.org/iiif/scene/switch/scene-1/annos/1/activating-on-2",
+ "type": "Annotation"
+ },
"action": ["enable"]
}
]
@@ -2569,7 +2588,10 @@ The format of the `value` string is implementation-specific, and will depend on
"body":
{
"type": "SpecificResource",
- "source": "https://example.org/iiif/3d/painting-anno-for-music-box",
+ "source": {
+ "id": "https://example.org/iiif/3d/painting-anno-for-music-box",
+ "type": "Annotation"
+ },
"selector": [
{
"type": "AnimationSelector",
@@ -2641,12 +2663,10 @@ It is possible to associate a particular camera with a particular commenting ann
"target":
{
"type": "SpecificResource",
- "source": [
- {
- "id": "https://example.org/iiif/scene1",
- "type": "Scene"
- }
- ],
+ "source": {
+ "id": "https://example.org/iiif/scene1",
+ "type": "Scene"
+ },
"selector": [
{
"type": "PointSelector",
@@ -2663,7 +2683,7 @@ It is possible to associate a particular camera with a particular commenting ann
{
"id": "https://raw.githubusercontent.com/IIIF/3d/main/assets/whale/whale_cranium.glb",
"type": "Model"
- }
+ },
"target":
{
// SpecificResource with PointSelector
@@ -2685,8 +2705,8 @@ It is possible to associate a particular camera with a particular commenting ann
"motivation": ["commenting"],
"body":
{
- "type": "TextualBody",
- "value": "Mandibular tooth"
+ "type": "TextualBody",
+ "value": "Mandibular tooth"
},
"target":
{
@@ -2715,11 +2735,14 @@ It is possible to associate a particular camera with a particular commenting ann
{
"id": "https://example.org/iiif/3d/commenting-anno-for-mandibular-tooth",
"type": "Annotation"
- }
+ },
"body":
{
"type": "SpecificResource",
- "source": "https://example.org/iiif/3d/anno-that-paints-desired-camera-to-view-tooth",
+ "source": {
+ "id": "https://example.org/iiif/3d/anno-that-paints-desired-camera-to-view-tooth",
+ "type": "Annotation"
+ },
"action": ["show", "enable", "select"]
}
}
@@ -2909,10 +2932,12 @@ An image might not be correctly aligned with the Canvas, and require rotation as
"profile": "level2"
}
},
- "selector": {
- "type": "ImageApiSelector",
- "rotation": "90"
- }
+ "selector": [
+ {
+ "type": "ImageApiSelector",
+ "rotation": "90"
+ }
+ ]
},
"target":
{
@@ -3010,7 +3035,7 @@ The value of `provides` is an array of strings, taken from the [IIIF Registry of
**Key Points**
* The `provides` property is placed on the annotation and not on the target of the annotation.
-* The property is primarily used to define accessibility features, but can be used to define other types of functionality, such as `transcription`.
+* The property is primarily used to define accessibility features, but can be used to define other types of functionality, such as `transcript`.
{: .note}
!!! warning TODO: The above should be a green class rgb(244,252,239) to distinguish from properties
diff --git a/source/presentation/4.0/model.md b/source/presentation/4.0/model.md
index 855a56aae..4b0b19680 100644
--- a/source/presentation/4.0/model.md
+++ b/source/presentation/4.0/model.md
@@ -421,9 +421,11 @@ Annotation Collections _MUST_ have an HTTP(S) URI. The JSON-LD description _SHOU
Annotation Collections are always paged using `first` and `last`, rather than `items` as is possible for IIIF Collections, following the regular ActivityStreams paging model.
__Properties__
-An Annotation Collection _MUST_ have the following properties: [id](#id), [type](#type), [label](#label), [first](#first), and [last](#last).
+An Annotation Collection _MUST_ have the following properties: [id](#id), [type](#type), [label](#label).
+An Annotation Collection _MUST_ have the [first](#first) and [last](#last) properties if it doesn't have the [items](#items) property.
+An Annotation Collection _MUST NOT_ have the [first](#first) and [last](#last) properties if has the [items](#items) property.
An Annotation Collection _SHOULD_ have the following properties: [metadata](#metadata), [summary](#summary), [provider](#provider), [thumbnail](#thumbnail).
-An Annotation Collection _MAY_ have the following properties: [requiredStatement](#requiredStatement), [rights](#rights), [navDate](#navDate), [navPlace](#navPlace), [placeholderContainer](#placeholderContainer), [accompanyingContainer](#accompanyingContainer), [viewingDirection](#viewingDirection), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [services](#services), [homepage](#homepage), [rendering](#rendering), [partOf](#partOf), [start](#start), [first](#first), [last](#last), [total](#total), [canonical](#canonical), [via](#via), and [annotations](#annotations).
+An Annotation Collection _MAY_ have the following properties: [requiredStatement](#requiredStatement), [rights](#rights), [navDate](#navDate), [navPlace](#navPlace), [placeholderContainer](#placeholderContainer), [accompanyingContainer](#accompanyingContainer), [viewingDirection](#viewingDirection), [behavior](#behavior), [seeAlso](#seeAlso), [service](#service), [services](#services), [homepage](#homepage), [rendering](#rendering), [partOf](#partOf), [start](#start), [total](#total), [canonical](#canonical), [via](#via), and [annotations](#annotations).
{: .note}
@@ -1276,7 +1278,7 @@ The value of `action` _MUST_ be an array of strings, where each item in the arra
### angle
{: #angle}
-The `angle` property is used with SpotLights and Spot Audio Emitters to define the radius of the cone of emitted light or sound. Note that the `fieldOfView` property is defined as the entire field of view, not half (as might be inferred from `angle` using radius).
+The `angle` property of Spot Lights and Spot Audio Emitters defines the dispersion of the cone of emitted light or sound. Note that the `fieldOfView` property is defined as the entire field of view, not half (as might be inferred from `angle` using radius).
The value _MUST_ be a floating point number greater than 0 and less than 90, and is measured in degrees. If this property is not specified, then the default value is client-dependent.
@@ -1331,9 +1333,9 @@ This property sets the background color behind any painted resources on a spatia
The value _MUST_ be a string which defines an RGB color. It _SHOULD_ be a hex value starting with "#" and is treated in a case-insensitive fashion. If this property is not specified, then the default value is client-dependent.
* A Canvas _MAY_ have the `backgroundColor` property
- Clients _SHOULD_ render `backgroundColor` on any resource type.
+ Clients _SHOULD_ render `backgroundColor` on a Canvas.
* A Scene _MAY_ have the `backgroundColor` property
- Clients _SHOULD_ render `backgroundColor` on any resource type.
+ Clients _SHOULD_ render `backgroundColor` on a Scene.
* Other resources _MUST NOT_ have the `backgroundColor` property.
{% include api/code_header.html %}
@@ -1419,7 +1421,7 @@ The URI that _SHOULD_ be used to track the resource's identity, regardless of wh
For more information about `canonical`, see the [W3C Annotation Model](https://www.w3.org/TR/annotation-model/#other-identities).
-The value _MUST_ be a string, and the value must be an absolute HTTP(S) URI.
+The value _MUST_ be a string, and the value _MUST_ be an absolute HTTP(S) URI.
* Any resource _MAY_ have the `canonical` property.
Clients _MAY_ process the `canonical` property on any resource.
@@ -1679,7 +1681,7 @@ The value _MUST_ be a string, and the value _MUST_ be an absolute HTTP(S) URI fo
The existence of an HTTP(S) URI in the `id` property does not mean that the URI will always be dereferenceable. If the resource with the `id` property is embedded, it _MAY_ also be dereferenceable. If the resource is referenced, it _MUST_ be dereferenceable.
-If a publisher wishes for a resource be able to be referenced, such as in an Annotation, then the resource _MUST_ have an `id` property.
+If a publisher wishes for a resource to be able to be referenced, such as in an Annotation, then the resource _MUST_ have an `id` property.
* Collections, Collection Pages, Manifests, Timelines, Canvases, Scenes, Annotations, Annotation Pages, Annotation Collections, Ranges, Content Resources, and Services _MUST_ have the `id` property.
Clients _MAY_ render `id` on any resource type, and _SHOULD_ render `id` on Collections, Manifests and Containers.
@@ -1895,7 +1897,7 @@ The value of this property _MUST_ be an array of JSON objects, each of which _MU
### lookAt
{: #lookAt}
-It is useful to be able to rotate a light or camera or audio resource such that it is facing another object or point in the Scene, rather than calculating the angles within the Scene's coordinate space. This is accomplished with a property called `lookAt`, valid on DirectionalLight, SpotLight, and all Cameras. The value of the property is either a PointSelector, a WktSelector, the URI of an Annotation which paints something into the current Scene, or a Specific Resource with a selector identifying a point or region in an arbitrary container.
+It is useful to be able to rotate a light or camera or audio resource such that it is facing another object or point in the Scene, rather than calculating the angles within the Scene's coordinate space. This is accomplished with a property called `lookAt`, valid on DirectionalLight, SpotLight, and all Cameras. The value of the property is either a PointSelector, a WktSelector, the URI of an Annotation which paints something into the current Scene, or a Specific Resource with a selector identifying a point or region in an arbitrary Container.
If the value is a PointSelector, then the light or camera resource is rotated around the x and y axes such that it is facing the given point. If the value is a WktSelector, then the resource should be rotated to face the given region. If the value is an Annotation which targets a point via a PointSelector, URI fragment or other mechanism, then the resource should be rotated to face that point. If the value is a Specific Resource, the source container for the Specific Resource must be painted into the current Scene, and the Specific Resource selector should identify a point or region in the source container. In this case, the light or camera resource should be rotated to face the point or region in the source container where the point or region is located within the current Scene's coordinate space. This allows light or camera resources to face a specific 2D point on a Canvas painted into a 3D scene.
@@ -2067,7 +2069,7 @@ The value is a non-negative floating point number, in the coordinate space of th
A reference from an Annotation Page to the following Annotation Page within an Annotation Collection, or from a Collection Page to the following Collection Page.
-The value must be a JSON object, with the `id` and `type` properties. The value of the `id` property must be a string, and must be the HTTP(S) URI of the following Annotation or Collection Page. The value of the `type` property must be the string `AnnotationPage` or `CollectionPage`.
+The value _MUST_ be a JSON object, with the `id` and `type` properties. The value of the `id` property _MUST_ be a string, and _MUST_ be the HTTP(S) URI of the following Annotation or Collection Page. The value of the `type` property _MUST_ be the string `AnnotationPage` or `CollectionPage`.
* An AnnotationPage _MUST_ have the `next` property, unless it is the last page in the AnnotationCollection or Collection.
Clients _MUST_ process the `next` property on an AnnotationPage or CollectionPage.
@@ -2149,16 +2151,18 @@ The value of this property _MUST_ be a JSON object conforming to the `SpecificRe
```json-doc
{ "position": {
"type": "SpecificResource",
- "source": [{
+ "source": {
"id": "https://example.org/iiif/scene1",
"type": "Scene"
- }],
- "selector": [{
- "type": "PointSelector",
- "x": 1.0,
- "y": 19.2,
- "z": 2.7
- }]
+ },
+ "selector": [
+ {
+ "type": "PointSelector",
+ "x": 1.0,
+ "y": 19.2,
+ "z": 2.7
+ }
+ ]
}
}
@@ -2169,7 +2173,7 @@ The value of this property _MUST_ be a JSON object conforming to the `SpecificRe
A reference from an Annotation Page to the preceding Annotation Page within an Annotation Collection, or from a Collection Page to the preceding Collection Page.
-The value must be a JSON object, with the `id` and `type` properties. The value of the `id` property must be a string, and must be the HTTP(S) URI of the preceding Annotation or Collection Page. The value of the `type` property must be the string `AnnotationPage` or `CollectionPage`.
+The value _MUST_ be a JSON object, with the `id` and `type` properties. The value of the `id` property _MUST_ be a string, and _MUST_ be the HTTP(S) URI of the preceding Annotation or Collection Page. The value of the `type` property _MUST_ be the string `AnnotationPage` or `CollectionPage`.
* An AnnotationPage _SHOULD_ have the `prev` property, unless it is the first page in the AnnotationCollection.
Clients _SHOULD_ process the `prev` property on an AnnotationPage.
@@ -2294,7 +2298,7 @@ Note that the majority of the values have been selected from the [W3C accessibil
| `highContrastDisplay`{: #value-highContrastDisplay} | An alternative form of visual content where the contrast is high, making it easier to see |
| `transcript`{: #value-transcript} | A transcript of the audio content, as opposed to closed captions which might include other descriptions such as music or sound effects |
| `translation`{: #value-translation} | A translation of the content into another language, defined on the content resource (IIIF Defined) |
-{: .api-table #table-behavior}
+{: .api-table #table-provides}
{% include api/code_header.html %}
``` json-doc
@@ -2356,7 +2360,7 @@ The value of the `refinedBy` property _MUST_ be a JSON Object, which _MUST_ desc
The value of the region parameter in the IIIF Image API URL structure, as recorded in an Image API Selector.
-The value of `region` _MUST_ be a string, and must conform to the requirements for the region parameter described in the Image API.
+The value of `region` _MUST_ be a string, and _MUST_ conform to the requirements for the region parameter described in the Image API.
* The IIIF Image API Selector _MAY_ have the `region` property with exactly one value.
Clients _MUST_ process the `region` property on a IIIF Image API Selector.
@@ -2463,6 +2467,8 @@ The value _MUST_ be an array of JSON objects.
* A Specific Resource _MAY_ have the `scope` property with at least one item.
Clients _SHOULD_ process `scope` on Specific Resources.
+* An Annotation _MAY_ have the `scope` property with at least one item.
+ Clients _SHOULD_ process `scope` on Annotations.
{% include api/code_header.html %}
``` json-doc
@@ -2711,11 +2717,16 @@ The value _MUST_ be a JSON object, which _MUST_ have the `id` and `type` propert
"start": {
"id": "https://example.org/iiif/1/canvas-segment/1",
"type": "SpecificResource",
- "source": "https://example.org/iiif/1/canvas/1",
- "selector": {
- "type": "PointSelector",
- "instant": 14.5
- }
+ "source": {
+ "id": "https://example.org/iiif/1/canvas/1",
+ "type": "Canvas"
+ },
+ "selector": [
+ {
+ "type": "PointSelector",
+ "instant": 14.5
+ }
+ ]
}
}
```
@@ -2725,7 +2736,7 @@ The value _MUST_ be a JSON object, which _MUST_ have the `id` and `type` propert
A non-negative, 0-based integer value identifying the relative position of the first entry in the `items` list of a Collection Page or Annotation Collection Page within the overall logical order of its parent Collection or Annotation Collection. If this is the second page, and there are 100 entries on the first page, then the value is 100 (the first page contains entries 0 through 99 inclusive).
-The value of `startIndex` must be an integer greater than -1.
+The value of `startIndex` _MUST_ be an integer greater than -1.
* An Annotation Page _MAY_ have the `startIndex` property.
Clients _MAY_ process `startIndex` on an Annotation Page.