@startuml hide empty members title A sample IIIF class diagram for an hypothetic C# library end title abstract JsonLdObject { +Context +ID +Type } abstract Service { } abstract Profile { } class UriProfile { +Uri } class GeoJSONService { } class PhysicalDimensionsService { {static} Profile +PhysicalScale +PhysicalUnits } class Attribution { +Language +Value } JsonLdObject <|-down- Service JsonLdObject <|-down- Profile Profile <|-- UriProfile Service <|-- GeoJSONService Service <|-- PhysicalDimensionsService package Presentation { class ResourceType { +Labels +Descriptions } class Metadata { +Label +Value } class Collection { } class Manifest { } class Range { } class Sequence { } class Layer { } class Canvas { } class AnnotationList { } class Annotation { } abstract Content { } JsonLdObject <|-down- ResourceType ResourceType <|-- Collection ResourceType <|-- Manifest ResourceType <|-- Range ResourceType <|-- Layer ResourceType <|-- Sequence ResourceType <|-- Canvas ResourceType <|-- AnnotationList ResourceType <|-- Annotation ResourceType <|-- Content ResourceType "Services" o-- Service ResourceType "Metadata" *-- Metadata ResourceType "Attributions" *-- Attribution ResourceType "Thumbnail" --> ImageResource Collection "collections" o-- Collection Collection "manifests" o-- Manifest Manifest "structures" o-- Range Manifest "sequences" o-- Sequence Range "ranges" o-- Range Range "canvases" o-- Canvas Range "contentLayer" --> Layer Sequence "canvases" o-- Canvas Canvas "images" o-- Annotation Canvas "otherContent" o-- AnnotationList AnnotationList "within" --> Layer AnnotationList "resources" o-- Annotation Annotation "resource" o-- Content Annotation "on" --> Canvas } package Image { class ImageResource { } class ImageInformationService { } class Size { +Width +Height } class Image { +Protocol +Licenses +Logos } class Tile { +ScaleFactors } class ImageProfile { +Formats +Qualities +MaxHeight +MaxWidth +MaxArea +SupportedFeatures } Size <|-- Image Size <|-- Tile Content <|-- ImageResource Service <|-- ImageInformationService Profile <|-- ImageProfile Image "tiles" *-- Tile Image "sizes" *-- Size Image "profiles" *-- ImageProfile Image "attributions" *-- Attribution Image "logo" --> ImageResource Image "services" *-- Service ImageResource "service" --> ImageInformationService ImageInformationService "image" --> Image ImageInformationService "profiles" *-- ImageProfile } package Authentication { class AuthenticationService { {static} LoginProfile {static} ClickthroughProfile {static} KioskProfile {static} ExternalProfile } class AccessCookieService { +Label +ConfirmLabel +Header +Description +FailureHeader +FailureDescription } class AccessTokenService { } class LogoutService { } Service <|-- AuthenticationService AuthenticationService <|-- AccessCookieService AuthenticationService <|-- AccessTokenService AuthenticationService <|-- LogoutService AuthenticationService "Profile" --> UriProfile AccessCookieService "Services" --> AuthenticationService } package Search { class SearchService { {static} SearchProfile } class AutocompleteService { {static} AutocompleteProfile } class SearchResultList { } class SearchLayer { +IgnoredParameters } class Hit { +Before +After } class TextQuoteSelectorAnnotation { +Prefix +Suffix +Exact } class TermList { +IgnoredParameters } class Term { +Match +Url +Count +Labels } Service <|-- SearchService Layer <|-- SearchLayer AnnotationList <|-- SearchResultList Annotation <|-- TextQuoteSelectorAnnotation SearchService "Services" *-- AutocompleteService JsonLdObject <|-- TermList Hit "Annotations" o-- Annotation SearchResultList "Hits" *-- Hit SearchResultList "Within" --> SearchLayer TermList "Terms" *-- Term } @enduml