├── .gitignore ├── source ├── favicon.ico ├── img │ ├── icon-toc.png │ ├── ajax-loader.gif │ ├── bg-color-bar.png │ ├── orcid_16x16.png │ ├── text-bg-about.png │ ├── icon-about-page.png │ ├── logo-iiif-34x30.png │ ├── text-bg-step-1.png │ ├── text-bg-step-2.png │ ├── text-bg-step-3.png │ ├── icon-select-arrow.png │ ├── interactive-img-bl.png │ ├── text-bg-impl-demos.png │ ├── text-bg-get-involved.png │ ├── text-bg-img-servers.png │ ├── text-bg-img-viewers.png │ ├── text-bg-participants.png │ ├── text-bg-quick-start.png │ ├── icon-defined-apis-60x60.png │ ├── icon-plug-n-play-60x60.png │ ├── metadata-api │ │ ├── optional.png │ │ ├── required.png │ │ ├── iiif-objects.png │ │ ├── not_allowed.png │ │ ├── recommended.png │ │ ├── article2301242.jpg │ │ ├── iiif-objects-all.png │ │ ├── iiif-objects-metadata.png │ │ ├── iiif-fields-cardinality.png │ │ └── icons-metadata-requirements.png │ ├── text-bg-tips-n-tricks.png │ ├── interactive-img-e-codices.png │ └── icon-community-driven-60x60.png ├── _includes │ ├── acronyms.md │ ├── sub-page_header.html │ ├── copyright2017.md │ ├── footer.html │ ├── chromeframe.html │ ├── doctype.html │ ├── ga.html │ ├── beta.md │ ├── nav.html │ └── spec-head.html ├── api │ ├── import │ │ └── 0.1 │ │ │ ├── iiif-dragndrop-100px.png │ │ │ └── index.md │ ├── notification │ │ └── 0.1 │ │ │ └── index.md │ └── harvest │ │ └── 0.1 │ │ ├── activities.md │ │ └── index.md ├── _data │ ├── rfc_words.yml │ ├── navigation.yml │ ├── organization.yml │ ├── acronyms.yml │ ├── impl_demos.yml │ ├── image_clients.yml │ ├── image_servers.yml │ ├── showcase.yml │ └── institutions.yml ├── js │ ├── anchor.js │ ├── main.js │ └── vendor │ │ ├── jquery.iiif-demo.js │ │ ├── anchor.min.js │ │ ├── jquery.ddslick.min.js │ │ ├── modernizr-2.6.2-respond-1.1.0.min.js │ │ └── slick.min.js ├── _layouts │ └── spec.html └── css │ ├── demo.scss │ ├── vendor │ └── slick.css │ ├── normalize.min.css │ ├── syntax.css │ ├── spec-doc.scss │ ├── spec-doc2.scss │ ├── normalize.css │ └── main.scss └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | _site 2 | node_modules/ 3 | 4 | -------------------------------------------------------------------------------- /source/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/favicon.ico -------------------------------------------------------------------------------- /source/img/icon-toc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/icon-toc.png -------------------------------------------------------------------------------- /source/img/ajax-loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/ajax-loader.gif -------------------------------------------------------------------------------- /source/img/bg-color-bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/bg-color-bar.png -------------------------------------------------------------------------------- /source/img/orcid_16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/orcid_16x16.png -------------------------------------------------------------------------------- /source/img/text-bg-about.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/text-bg-about.png -------------------------------------------------------------------------------- /source/img/icon-about-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/icon-about-page.png -------------------------------------------------------------------------------- /source/img/logo-iiif-34x30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/logo-iiif-34x30.png -------------------------------------------------------------------------------- /source/img/text-bg-step-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/text-bg-step-1.png -------------------------------------------------------------------------------- /source/img/text-bg-step-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/text-bg-step-2.png -------------------------------------------------------------------------------- /source/img/text-bg-step-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/text-bg-step-3.png -------------------------------------------------------------------------------- /source/img/icon-select-arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/icon-select-arrow.png -------------------------------------------------------------------------------- /source/img/interactive-img-bl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/interactive-img-bl.png -------------------------------------------------------------------------------- /source/img/text-bg-impl-demos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/text-bg-impl-demos.png -------------------------------------------------------------------------------- /source/img/text-bg-get-involved.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/text-bg-get-involved.png -------------------------------------------------------------------------------- /source/img/text-bg-img-servers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/text-bg-img-servers.png -------------------------------------------------------------------------------- /source/img/text-bg-img-viewers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/text-bg-img-viewers.png -------------------------------------------------------------------------------- /source/img/text-bg-participants.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/text-bg-participants.png -------------------------------------------------------------------------------- /source/img/text-bg-quick-start.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/text-bg-quick-start.png -------------------------------------------------------------------------------- /source/img/icon-defined-apis-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/icon-defined-apis-60x60.png -------------------------------------------------------------------------------- /source/img/icon-plug-n-play-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/icon-plug-n-play-60x60.png -------------------------------------------------------------------------------- /source/img/metadata-api/optional.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/metadata-api/optional.png -------------------------------------------------------------------------------- /source/img/metadata-api/required.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/metadata-api/required.png -------------------------------------------------------------------------------- /source/img/text-bg-tips-n-tricks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/text-bg-tips-n-tricks.png -------------------------------------------------------------------------------- /source/_includes/acronyms.md: -------------------------------------------------------------------------------- 1 | {% for acronym in site.data.acronyms %} 2 | *[{{ acronym[0] }}]: {{ acronym[1] }} 3 | {% endfor %} 4 | -------------------------------------------------------------------------------- /source/img/interactive-img-e-codices.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/interactive-img-e-codices.png -------------------------------------------------------------------------------- /source/img/metadata-api/iiif-objects.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/metadata-api/iiif-objects.png -------------------------------------------------------------------------------- /source/img/metadata-api/not_allowed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/metadata-api/not_allowed.png -------------------------------------------------------------------------------- /source/img/metadata-api/recommended.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/metadata-api/recommended.png -------------------------------------------------------------------------------- /source/img/icon-community-driven-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/icon-community-driven-60x60.png -------------------------------------------------------------------------------- /source/img/metadata-api/article2301242.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/metadata-api/article2301242.jpg -------------------------------------------------------------------------------- /source/img/metadata-api/iiif-objects-all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/metadata-api/iiif-objects-all.png -------------------------------------------------------------------------------- /source/api/import/0.1/iiif-dragndrop-100px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/api/import/0.1/iiif-dragndrop-100px.png -------------------------------------------------------------------------------- /source/img/metadata-api/iiif-objects-metadata.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/metadata-api/iiif-objects-metadata.png -------------------------------------------------------------------------------- /source/img/metadata-api/iiif-fields-cardinality.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/metadata-api/iiif-fields-cardinality.png -------------------------------------------------------------------------------- /source/img/metadata-api/icons-metadata-requirements.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IIIF/discovery/master/source/img/metadata-api/icons-metadata-requirements.png -------------------------------------------------------------------------------- /source/_data/rfc_words.yml: -------------------------------------------------------------------------------- 1 | - MUST 2 | - MUST NOT 3 | - REQUIRED 4 | - SHALL 5 | - SHALL NOT 6 | - SHOULD 7 | - SHOULD NOT 8 | - RECOMMENDED 9 | - NOT RECOMMENDED 10 | - MAY 11 | - OPTIONAL 12 | - MAY WISH TO 13 | -------------------------------------------------------------------------------- /source/_includes/sub-page_header.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

{% if page.title_override %}{{ page.title_override }}{% else %}{{ page.title }}{% endif %}

4 |
5 |
6 | -------------------------------------------------------------------------------- /source/_data/navigation.yml: -------------------------------------------------------------------------------- 1 | - 2 | name: About 3 | url: /about/ 4 | - 5 | name: Technical Details 6 | url: /technical-details/ 7 | - 8 | name: "Apps & Demos" 9 | url: /apps-demos/ 10 | - 11 | name: Community 12 | url: /community/ 13 | - 14 | name: News 15 | url: /news/ 16 | -------------------------------------------------------------------------------- /source/_includes/copyright2017.md: -------------------------------------------------------------------------------- 1 | _Copyright © 2017 Editors and contributors. Published by the IIIF Consortium under the [CC-BY][cc-by] license, see [disclaimer][disclaimer]._ 2 | 3 | [disclaimer]: /api/annex/notes/disclaimer/ 4 | [cc-by]: http://creativecommons.org/licenses/by/4.0/ "Creative Commons — Attribution 4.0 International" 5 | -------------------------------------------------------------------------------- /source/_includes/footer.html: -------------------------------------------------------------------------------- 1 | 10 | -------------------------------------------------------------------------------- /source/_data/organization.yml: -------------------------------------------------------------------------------- 1 | name: "IIIF | International Image Interoperability Framework" 2 | description: "International Image Interoperability Framework: A community driven image framework with well defined APIs for making the world’s image repositories interoperable and accessible" 3 | email: "iiif-discuss@googlegroups.com" 4 | url: http://iiif.io 5 | -------------------------------------------------------------------------------- /source/_includes/chromeframe.html: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /source/_includes/doctype.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /source/_includes/ga.html: -------------------------------------------------------------------------------- 1 | 10 | -------------------------------------------------------------------------------- /source/_includes/beta.md: -------------------------------------------------------------------------------- 1 | {% if page.pre != 'final' %} 2 | __Beta Specification for Trial Use__ 3 | This is a work in progress. We are actively seeking new implementations, updates to existing implementations, and feedback. No section should be considered final, and the absence of any content does not imply that such content is out of scope, or may not appear in the future. Please send any feedback to [iiif-discuss@googlegroups.com][iiif-discuss]. 4 | {: .alert} 5 | 6 | [iiif-discuss]: mailto:iiif-discuss@googlegroups.com "Email Discussion List" 7 | {% endif %} 8 | -------------------------------------------------------------------------------- /source/js/anchor.js: -------------------------------------------------------------------------------- 1 | // add anchor images and links when hovering over anchors 2 | window.onload = function() { 3 | anchors.options.placement = 'left'; 4 | anchors.add(); 5 | }; 6 | 7 | // update the hash fragment as we scroll 8 | $(document).bind('scroll', function(e) { 9 | $('h2,h3,h4').each(function() { 10 | if ($(this).offset().top < window.pageYOffset + 5 && $(this).offset().top + $(this).height() > window.pageYOffset + 5) { 11 | var urlId = '#' + $(this).attr('id'); 12 | window.history.replaceState(null, null, urlId); 13 | } 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /source/_data/acronyms.yml: -------------------------------------------------------------------------------- 1 | API: "Application Programming Interface" 2 | CAS: "Central Authentication Service" 3 | CORS: "Cross-Origin Resource Sharing" 4 | HATEOAS: "Hypermedia as the Engine of Application State" 5 | HTML: "HyperText Markup Language" 6 | HTTP: "Hypertext Transfer Protocol" 7 | HTTPS: "Hypertext Transfer Protocol (Secure)" 8 | IIIF: "International Image Interoperability Framework" 9 | IP: "Internet Procotol" 10 | JSON-LD: "JSON for Linking Data" 11 | JSON: "JavaScript Object Notation" 12 | JSONP: "JavaScript Object Notation with Padding" 13 | RDF: "Resource Description Framework" 14 | REST: "Representational State Transfer" 15 | RFC: "Request for Comments" 16 | TLS: "Transport Layer Security" 17 | XML: "eXtensible Markup Language" 18 | -------------------------------------------------------------------------------- /source/_includes/nav.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | Home 4 | 18 |
19 |
20 | -------------------------------------------------------------------------------- /source/_layouts/spec.html: -------------------------------------------------------------------------------- 1 | --- 2 | --- 3 | {% include doctype.html %} 4 | {% include spec-head.html %} 5 | 6 | {% include chromeframe.html %} 7 | {% include nav.html %} 8 |
9 |
10 |
11 | {% include sub-page_header.html %} 12 | {% for word in site.data.rfc_words %} 13 | {% assign upper = word | prepend: '' | append: '' %} 14 | {% assign lower = upper | downcase | replace: '', '' %} 15 | {% assign content = content | replace: upper, lower %} 16 | {% endfor %} 17 |
18 | {{ content }} 19 |
20 |
21 |
22 |
23 | {% include footer.html %} 24 | {% if page.id == 'main' %}{% include interactive_image_js.html %}{% endif %} 25 | {% include ga.html %} 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /source/_includes/spec-head.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{ page.title }} — {{ site.data.organization.name }} 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /source/js/main.js: -------------------------------------------------------------------------------- 1 | $(function() { 2 | $('.iiif-demo').iiifDemo({ 3 | selectOptions: { 4 | '0,1200,5213,2242': { 5 | 'w,' : [0], 6 | 'w - 200,': [0], 7 | 'w - 400,': [0] 8 | }, 9 | '1400,1200,2500,1075' : { 10 | 'w,' : [0], 11 | 'w - 200,': [0], 12 | 'w - 400,': [0] 13 | }, 14 | 'full': { 15 | ',h' : [0, 90, 180, 270], 16 | ',h - 200': [0, 90, 180, 270] 17 | }, 18 | '2325,1300,800,800': { 19 | '400,400': [0, 90, 180, 270], 20 | '200,200': [0, 90, 180, 270], 21 | '100,100': [0, 90, 180, 270] 22 | }, 23 | '3050,3000,1200,1600': { 24 | '300,400': [0, 90, 180, 270], 25 | '225,300': [0, 90, 180, 270], 26 | '150,200': [0, 90, 180, 270] 27 | }, 28 | '2150,4500,1500,645': { 29 | 'w,' : [0], 30 | 'w - 200,': [0], 31 | 'w - 400,': [0] 32 | }, 33 | '2125,4375,4500,1935': { 34 | 'w,' : [0], 35 | 'w - 200,': [0], 36 | 'w - 400,': [0] 37 | } 38 | }, 39 | iiifImgInfo: { 40 | baseUrl: 'http://stacks.stanford.edu/image/iiif/ff139pd0160%252FK90113-43', 41 | region: 'full', 42 | size: 'full', 43 | rotation: 0, 44 | quality: 'default', 45 | format: 'jpg' 46 | } 47 | }); 48 | }); 49 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Workspace for the IIIF Discovery Technical Specification Group 2 | 3 | See [IIIF Discovery Technical Specification Group](http://iiif.io/community/groups/discovery/) for organizational details, charter and links. 4 | 5 | This repository contains: 6 | 7 | * Initial Working Draft of an Import specification, now in the main IIIF repo: 8 | [http://preview.iiif.io/api/discovery/api/discovery/0.1/](http://preview.iiif.io/api/discovery/api/discovery/0.1/) 9 | * [Working Draft of an Import specification](https://github.com/IIIF/discovery/blob/master/source/api/import/0.1/index.md) 10 | * Various files copied from the [main iiif.io github](https://github.com/IIIF/iiif.io) to enable development of draft specifications. 11 | 12 | See also: 13 | 14 | * [Discovery Use Cases](https://github.com/IIIF/iiif-stories/issues?q=is%3Aissue+is%3Aopen+label%3Adiscovery) 15 | 16 | ## Ongoing Experimental Implementations 17 | 18 | * Digirati 19 | * Endpoint: https://mcgrattan.org/as/ 20 | * Implementation: https://github.com/mattmcgrattan/iiif-activity-streams 21 | 22 | * OCLC 23 | * Endpoint: https://researchworks.oclc.org/digital/activity-stream/collection/16007_p267401coll32 24 | * Aggregated Endpoints: https://researchworks.oclc.org/digital/discovery-index 25 | * Implementation: https://github.com/mixterj/iiif_activity_streams_creation 26 | * Consumer: https://github.com/mixterj/activity_streams_harvest 27 | 28 | * NCSU 29 | * Endpoint: https://scrc.lib.ncsu.edu/sal_staging/iiif-discovery.json 30 | 31 | * IIIF 32 | * Endpoint: http://preview.iiif.io/root/discovery_list/community/groups/discovery/registry_as.json -------------------------------------------------------------------------------- /source/css/demo.scss: -------------------------------------------------------------------------------- 1 | 2 | .main-interactive-img-info { 3 | color: #9496A4; 4 | font-size: 13px; 5 | } 6 | 7 | .iiif-demo { 8 | border-top: 1px solid #E9EAEC; 9 | padding: 40px 0; 10 | } 11 | 12 | .iiif-demo .try-it { 13 | background-color: #fff; 14 | overflow: auto; 15 | } 16 | 17 | .iiif-demo .try-it h2 { 18 | color: #444c5a; 19 | } 20 | 21 | .iiif-demo .try-it .label { 22 | color: #6d7180; 23 | font-weight: 300; 24 | margin-bottom: 20px; 25 | } 26 | 27 | .iiif-demo .try-it .iiif-url { 28 | background-color: #fff; 29 | font-family: 'Inconsolata', sans-serif; 30 | word-wrap: break-word; 31 | } 32 | 33 | .iiif-demo .try-it .iiif-url { 34 | list-style: none; 35 | padding: 0; 36 | } 37 | 38 | .iiif-demo .try-it .iiif-url li { 39 | float: left; 40 | } 41 | 42 | .try-it .iiif-url .param-label, .try-it .iiif-url .param-label-none { 43 | color: #9496A4; 44 | font-size: 10px; 45 | line-height: 1.4; 46 | margin-bottom: 2px; 47 | text-align: center; 48 | } 49 | 50 | .try-it .iiif-url .param-value { 51 | border-top: 1px solid #d9d9d9; 52 | border-right: 1px solid #fff; 53 | border-left: 1px solid #fff; 54 | border-radius: 12px; 55 | padding-top: 7px; 56 | } 57 | 58 | .try-it .iiif-url .param-value-none { 59 | padding-top: 7px; 60 | } 61 | 62 | .try-it .iiif-url .param-label-none { 63 | border: 0; 64 | } 65 | 66 | .iiif-demo .try-it .iiif-url select { 67 | background: #00bc99 url(../img/icon-select-arrow.png) right center no-repeat; 68 | border: 0px solid #ccc; 69 | border-radius: 3px; 70 | color: #fff; 71 | cursor: pointer; 72 | font-family: 'Inconsolata', sans-serif; 73 | margin: 0 2px; 74 | padding: 4px 25px 4px 8px; 75 | text-indent: 0.01px; /* Removes default arrow from firefox*/ 76 | text-overflow: ""; /*Removes default arrow from firefox*/ 77 | -moz-appearance: none; /* Removes Default Firefox style*/ 78 | -webkit-appearance: none; 79 | } 80 | 81 | .iiif-demo .try-it .iiif-url select option { 82 | font-family: 'Inconsolata', sans-serif; 83 | } 84 | 85 | .iiif-demo .iiif-image-container { 86 | background: #fff url(../img/ajax-loader.gif) 10px 10px no-repeat; 87 | height: 450px; 88 | margin: 20px 0 0 0; 89 | overflow: auto; 90 | } 91 | -------------------------------------------------------------------------------- /source/_data/impl_demos.yml: -------------------------------------------------------------------------------- 1 | # Use Markdown in the blurb if necessary for links, etc. Each list entry in the blurb gets a

. 2 | - name: Stanford University Libraries - Mirador demo 3 | uri: http://showcase.iiif.io/viewer/mirador/ 4 | blurb: 5 | - > 6 | This demo of Mirador, developed by the Stanford University Libraries, allows 7 | the user to compare images from several different image repositories, 8 | including the Stanford Digital Repository, Yale University and Los Alamos 9 | National Labs. 10 | - name: Princeton University Libraries 11 | uri: https://libimages1.princeton.edu/osd-demo/?feedme=pudl0123/8172070/01/00000001.jp2 12 | blurb: 13 | - > 14 | This demonstration, hosted by the Princeton University Libraries, shows an 15 | image being served by Loris and viewed using OpenSeadragon. 16 | - name: The British Library 17 | uri: http://sanddragon.bl.uk/mirador/ 18 | blurb: 19 | - > 20 | The British Library deployed a demonstration of Mirador that allows the user 21 | to compare images from the British Library, Yale University and Stanford 22 | University. The BL adapted Mirador to display a YouTube video within the 23 | viewer that can be played while inspecting images. 24 | - name: Biblissima - Mirador Demo 25 | uri: http://demos.biblissima-condorcet.fr/mirador/ 26 | blurb: 27 | - > 28 | The [Biblissima Project](http://www.biblissima-condorcet.fr/) is a hub for 29 | digital humanities projects in France that is focused on the written cultural 30 | heritage of the Middle Ages and the Renaissance. They have an implementation 31 | of Mirador that currently shows content hosted at multiple institutions and 32 | will, increasingly, provide access to French content. 33 | - name: Europeana 34 | uri: http://europeana.eu 35 | blurb: 36 | - > 37 | [Europeana](http://europeana.eu), Europe's platform for digital cultural heritage, 38 | encourages its network of partners (libraries, archives, museums) to provide access 39 | to high-quality content. They have started to encourage data providers to adopt IIIF, 40 | and have adapted their infrastructure so that it can handle IIIF resources. The first 41 | IIIF datasets following the agreed Europeana guidelines for IIIF can be accessed on the 42 | [Europeana Collections portal](http://www.europeana.eu/portal/en/search?view=grid&q=sv_dcterms_conformsTo%3A*iiif*). 43 | -------------------------------------------------------------------------------- /source/css/vendor/slick.css: -------------------------------------------------------------------------------- 1 | /* Slider */ 2 | .slick-slider 3 | { 4 | position: relative; 5 | 6 | display: block; 7 | 8 | -moz-box-sizing: border-box; 9 | box-sizing: border-box; 10 | 11 | -webkit-user-select: none; 12 | -moz-user-select: none; 13 | -ms-user-select: none; 14 | user-select: none; 15 | 16 | -webkit-touch-callout: none; 17 | -khtml-user-select: none; 18 | -ms-touch-action: pan-y; 19 | touch-action: pan-y; 20 | -webkit-tap-highlight-color: transparent; 21 | } 22 | 23 | .slick-list 24 | { 25 | position: relative; 26 | 27 | display: block; 28 | overflow: hidden; 29 | 30 | margin: 0; 31 | padding: 0; 32 | } 33 | .slick-list:focus 34 | { 35 | outline: none; 36 | } 37 | .slick-list.dragging 38 | { 39 | cursor: pointer; 40 | cursor: hand; 41 | } 42 | 43 | .slick-slider .slick-track, 44 | .slick-slider .slick-list 45 | { 46 | -webkit-transform: translate3d(0, 0, 0); 47 | -moz-transform: translate3d(0, 0, 0); 48 | -ms-transform: translate3d(0, 0, 0); 49 | -o-transform: translate3d(0, 0, 0); 50 | transform: translate3d(0, 0, 0); 51 | } 52 | 53 | .slick-track 54 | { 55 | position: relative; 56 | top: 0; 57 | left: 0; 58 | 59 | display: block; 60 | } 61 | .slick-track:before, 62 | .slick-track:after 63 | { 64 | display: table; 65 | 66 | content: ''; 67 | } 68 | .slick-track:after 69 | { 70 | clear: both; 71 | } 72 | .slick-loading .slick-track 73 | { 74 | visibility: hidden; 75 | } 76 | 77 | .slick-slide 78 | { 79 | display: none; 80 | float: left; 81 | 82 | height: 100%; 83 | min-height: 1px; 84 | } 85 | [dir='rtl'] .slick-slide 86 | { 87 | float: right; 88 | } 89 | .slick-slide img 90 | { 91 | display: block; 92 | } 93 | .slick-slide.slick-loading img 94 | { 95 | display: none; 96 | } 97 | .slick-slide.dragging img 98 | { 99 | pointer-events: none; 100 | } 101 | .slick-initialized .slick-slide 102 | { 103 | display: block; 104 | } 105 | .slick-loading .slick-slide 106 | { 107 | visibility: hidden; 108 | } 109 | .slick-vertical .slick-slide 110 | { 111 | display: block; 112 | 113 | height: auto; 114 | 115 | border: 1px solid transparent; 116 | } 117 | .slick-arrow.slick-hidden { 118 | display: none; 119 | } -------------------------------------------------------------------------------- /source/css/normalize.min.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v1.1.2 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-size:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}html,button,input,select,textarea{font-family:sans-serif}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}h2{font-size:1.5em;margin:.83em 0}h3{font-size:1.17em;margin:1em 0}h4{font-size:1em;margin:1.33em 0}h5{font-size:.83em;margin:1.67em 0}h6{font-size:.67em;margin:2.33em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:1em 40px}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}p,pre{margin:1em 0}code,kbd,pre,samp{font-family:monospace,serif;_font-family:'courier new',monospace;font-size:1em}pre{white-space:pre;white-space:pre-wrap;word-wrap:break-word}q{quotes:none}q:before,q:after{content:'';content:none}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}dl,menu,ol,ul{margin:1em 0}dd{margin:0 0 0 40px}menu,ol,ul{padding:0 0 0 40px}nav ul,nav ol{list-style:none;list-style-image:none}img{border:0;-ms-interpolation-mode:bicubic}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0;white-space:normal;*margin-left:-7px}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;*overflow:visible}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;*height:13px;*width:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0} -------------------------------------------------------------------------------- /source/_data/image_clients.yml: -------------------------------------------------------------------------------- 1 | # Use Markdown in the blurb if necessary for links, etc. Each list entry in the blurb gets a

. 2 | - name: Diva.js 3 | uri: http://ddmal.github.io/diva.js/ 4 | blurb: 5 | - > 6 | Diva.js is an open-source document image viewer, especially suited for 7 | use in archival book digitization initiatives where viewing high-resolution 8 | images is a crucial part of the user experience. Using Diva, libraries, 9 | archives, and museums can present high-resolution document page images 10 | in a user-friendly “instant-on” interface that has been optimized for speed 11 | and flexibility. 12 | - name: IIPMooViewer 13 | uri: https://github.com/ruven/iipmooviewer 14 | blurb: 15 | - > 16 | IIPMooViewer is an open source, Javascript and HTML5 image streaming and 17 | zooming client. IIPMooViewer is IIIF-compatible and works with 18 | [IIPServer](https://github.com/ruven/iipsrv) or other IIIF 19 | compatible servers. Visit the 20 | [IIP demo page](http://iipimage.sourceforge.net/demo/) to see the IIP 21 | viewers in action. 22 | - name: Mirador 23 | uri: http://github.com/IIIF/mirador 24 | blurb: 25 | - > 26 | Mirador is an open source image, Javascript and HTML5 viewer that delivers 27 | high resolution images in a workspace that enables comparison of multiple 28 | images from multiple repositories. Mirador is fully IIIF-compatible. Visit 29 | the [Mirador demo](http://showcase.iiif.io/viewer/mirador/) to see it in 30 | action. 31 | - name: OpenSeadragon 32 | uri: http://openseadragon.github.io/ 33 | blurb: 34 | - > 35 | OpenSeadragon is an open-source, Javascript viewer enabling smooth deep 36 | zoom and pan of high resolution images. OpenSeadragon is IIIF compatible. 37 | A demo of OpenSeadragon in action can be seen on the 38 | [project homepage](http://openseadragon.github.io/). 39 | - name: Leaflet-IIIF 40 | uri: https://github.com/mejackreed/Leaflet-IIIF 41 | blurb: 42 | - > 43 | Leaflet-IIIF is a Leaflet plugin that enables zoomable IIIF images to be easily and quickly displayed. Leaflet + Leaflet-IIIF weigh in at just 35 KB and include great features like accessible keyboard controls and native touch/mobile support. 44 | [Check out the demo](http://mejackreed.github.io/Leaflet-IIIF/examples/example.html) 45 | - name: Universal Viewer 46 | uri: https://github.com/universalviewer 47 | blurb: 48 | - > 49 | The Universal Viewer is an open source project to enable cultural heritage institutions to present their digital artifacts in a IIIF-compliant and highly customisable user interface. 50 | -------------------------------------------------------------------------------- /source/api/notification/0.1/index.md: -------------------------------------------------------------------------------- 1 | # IIIF Notifications 2 | 3 | This information is extracted from the [Crawling](/api/harvest/) work, as it applies to notifications using the [ActivityStreams](https://www.w3.org/TR/activitystreams-core/) pattern. 4 | 5 | ## Notifications of Change 6 | 7 | [Linked Data Notifications](https://www.w3.org/TR/ldn/) allow for these notifications to be sent to and made available from an "inbox", and thus we would be consistent with section 3 of the charter around Notification. Further, the [ActivityPub](https://www.w3.org/TR/activitypub/) specification introduces the additional notion of an "outbox". 8 | 9 | Sending Manifests to an Inbox is not a "notification", it's just moving data around. Instead we send a description of the activity, which the reciever can process or not as it chooses. 10 | 11 | LDN provides a storage and publication mechanism, but clients are still expected to come and retrieve the set of changes in the same way as above. Assuming that either (a) systems register their interest in a resource, and the publisher notifies them directly or (b) the publisher writes to the inbox, and the inbox then auto-forwards the notification to the subscribers ... then there needs to be a method of subscribing to have the changes pushed to a remote inbox. 12 | 13 | ### Linked Data Notifications: Subscription 14 | 15 | While there is [WebSub](https://www.w3.org/TR/websub/), this does not interoperate with LDN and is from a service oriented mindset. WebSub makes various requirements that are not appropriate for Notifications (you MUST send the entire contents of the resource that you have subscribed to) which prevents subscribing either to binary resources (you don't want the entire gigabyte TIFF) or or aggregation-level containers (you don't want every change, every time, just the new one). 16 | 17 | ActivityPub is a method for transferring the notifications and subscribing, but does not follow REST patterns. Instead it uses side effects associated with particular activities. For example, the side effect of recieving a "Follow" activity is to add the sender to the "followers" of the resource. A REST based approach would be to create the subscription resource within the followers container. 18 | 19 | A more LOD / LDP / LDN appropriate pattern would be to use a REST pattern with Containers, that allow subscription to the inbox, manage filtering and the callback endpoint. One way to do this could be as [described here](https://docs.google.com/document/d/1JsQS1LVFt8wuJSYo_XsOzyP28pS8hfSLEhAC3BFuN6o/edit). 20 | 21 | For the purposes of IIIF discovery, the above decision is firmly in the Notification section of the charter and does not impact the publication of the ActivityStreams Collections as resources. 22 | -------------------------------------------------------------------------------- /source/_data/image_servers.yml: -------------------------------------------------------------------------------- 1 | # Use Markdown in the blurb if necessary for links, etc. Each list entry in the blurb gets a

. 2 | - name: ContentDM 3 | uri: http://www.contentdm.org/ 4 | blurb: 5 | - > 6 | ContentDM is a full-featured digital collection management system 7 | supported by OCLC that includes image hosting and metadata management. 8 | CONTENTdm allows for easy building and showcasing of digital collections 9 | on personalized websites, making them more discoverable to people around the world. 10 | CONTENTdm also secures and monitors master files in a cloud-based preservation 11 | archive so they remain safe for the future. 12 | - > 13 | Digital repositories using CONTENTdm support the IIIF Image API. For more details see the [CONTENTdm IIIF Support page](http://oc.lc/IIIFandCONTENTdm). 14 | - name: Djatoka 15 | uri: http://sourceforge.net/projects/djatoka/ 16 | blurb: 17 | - > 18 | Djatoka is an open source, Java-based image server that provides 19 | compression and region extraction of JPEG 2000 images, URI-addressability 20 | of regions, and support for multiple image formats (including., BMP, GIF, 21 | JPG, PNG, PNM, TIF, JPEG 2000). Djatoka comes with a plug-in framework that 22 | allows transformations to be applied to regions and resolutions (e.g., 23 | watermarking). 24 | - > 25 | Djatoka is not natively IIIF-compatible. However, djatoka URI’s are easily 26 | translated to IIIF URI’s (for example see this 27 | [Ruby on Rails gem](https://github.com/jronallo/djatoka) that does the 28 | translation). 29 | - name: FSI Server 30 | uri: http://www.fsi-viewer.com/ 31 | blurb: 32 | - > 33 | There is a [IIIF adaptor for FSI server](https://github.com/jhu-digital-manuscripts/rosa/tree/master/rosa-iiif-endpoint). 34 | - > 35 | FSI Server is a popular commercial solution for serving high resolution 36 | images in multiple formats.  It accompanies the Flash-based FSI Viewer 37 | for zoom and pan. 38 | - name: IIPImage Server 39 | uri: http://iipimage.sourceforge.net/documentation/server/ 40 | blurb: 41 | - > 42 | The IIPImage server is a high performance image server for streaming high 43 | resolution images. It supports advanced image features such as 16 and 32 44 | bit color depths, floating point data, CIELAB colorimetric images and 45 | scientific imagery such as multispectral or hyperspectral images. 46 | - > 47 | The server is an Fast CGI module written in C++ that is designed to be 48 | embedded within a host web server such as Apache, Lighttpd, MyServer or Nginx. 49 | - > 50 | IIPImage server is IIIF compatible ( 51 | [GitHub repo](https://github.com/ruven/iipsrv) of the project). 52 | - name: Loris 53 | uri: https://github.com/pulibrary/loris 54 | blurb: 55 | - > 56 | Loris is an open source, Python-based image server that supports the IIIF 57 | Image API ver 1.1. Loris supports JPEG and TIFF sources as well as JPEG2000. 58 | - name: digilib 59 | uri: http://digilib.sourceforge.net/ 60 | blurb: 61 | - > 62 | digilib is an open source, Java based image server for high resolution images. 63 | It supports the IIIF Image API and a native API that also allows brightness, 64 | contrast and color corrections and other operations. 65 | - > 66 | digilib supports JPEG, TIFF, PNG, JPEG2000 and other image formats via Java 67 | ImageIO. digilib also has a web client that offers continuous zoom, 68 | referenceable views, image annotations and other features for scholarly work. 69 | -------------------------------------------------------------------------------- /source/css/syntax.css: -------------------------------------------------------------------------------- 1 | .highlight { background: #ffffff; } 2 | .highlight .c { color: #999988; font-style: italic } /* Comment */ 3 | .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ 4 | .highlight .k { font-weight: bold } /* Keyword */ 5 | .highlight .o { font-weight: bold } /* Operator */ 6 | .highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */ 7 | .highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */ 8 | .highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */ 9 | .highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */ 10 | .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ 11 | .highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */ 12 | .highlight .ge { font-style: italic } /* Generic.Emph */ 13 | .highlight .gr { color: #aa0000 } /* Generic.Error */ 14 | .highlight .gh { color: #999999 } /* Generic.Heading */ 15 | .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ 16 | .highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */ 17 | .highlight .go { color: #888888 } /* Generic.Output */ 18 | .highlight .gp { color: #555555 } /* Generic.Prompt */ 19 | .highlight .gs { font-weight: bold } /* Generic.Strong */ 20 | .highlight .gu { color: #aaaaaa } /* Generic.Subheading */ 21 | .highlight .gt { color: #aa0000 } /* Generic.Traceback */ 22 | .highlight .kc { font-weight: bold } /* Keyword.Constant */ 23 | .highlight .kd { font-weight: bold } /* Keyword.Declaration */ 24 | .highlight .kp { font-weight: bold } /* Keyword.Pseudo */ 25 | .highlight .kr { font-weight: bold } /* Keyword.Reserved */ 26 | .highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */ 27 | .highlight .m { color: #009999 } /* Literal.Number */ 28 | .highlight .s { color: #5a5 } /* Literal.String */ 29 | .highlight .na { color: #008080 } /* Name.Attribute */ 30 | .highlight .nb { color: #0086B3 } /* Name.Builtin */ 31 | .highlight .nc { color: #445588; font-weight: bold } /* Name.Class */ 32 | .highlight .no { color: #008080 } /* Name.Constant */ 33 | .highlight .ni { color: #800080 } /* Name.Entity */ 34 | .highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */ 35 | .highlight .nf { color: #990000; font-weight: bold } /* Name.Function */ 36 | .highlight .nn { color: #555555 } /* Name.Namespace */ 37 | .highlight .nt { color: #3030b0 } /* Name.Tag */ 38 | .highlight .nv { color: #008080 } /* Name.Variable */ 39 | .highlight .ow { font-weight: bold } /* Operator.Word */ 40 | .highlight .w { color: #bbbbbb } /* Text.Whitespace */ 41 | .highlight .mf { color: #955 } /* Literal.Number.Float */ 42 | .highlight .mh { color: #009999 } /* Literal.Number.Hex */ 43 | .highlight .mi { color: #955 } /* Literal.Number.Integer */ 44 | .highlight .mo { color: #009999 } /* Literal.Number.Oct */ 45 | .highlight .sb { color: #5a5 } /* Literal.String.Backtick */ 46 | .highlight .sc { color: #5a5 } /* Literal.String.Char */ 47 | .highlight .sd { color: #5a5 } /* Literal.String.Doc */ 48 | .highlight .s2 { color: #5a5 } /* Literal.String.Double */ 49 | .highlight .se { color: #5a5 } /* Literal.String.Escape */ 50 | .highlight .sh { color: #5a5 } /* Literal.String.Heredoc */ 51 | .highlight .si { color: #5a5 } /* Literal.String.Interpol */ 52 | .highlight .sx { color: #5a5 } /* Literal.String.Other */ 53 | .highlight .sr { color: #009926 } /* Literal.String.Regex */ 54 | .highlight .s1 { color: #5a5 } /* Literal.String.Single */ 55 | .highlight .ss { color: #990073 } /* Literal.String.Symbol */ 56 | .highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */ 57 | .highlight .vc { color: #008080 } /* Name.Variable.Class */ 58 | .highlight .vg { color: #008080 } /* Name.Variable.Global */ 59 | .highlight .vi { color: #008080 } /* Name.Variable.Instance */ 60 | .highlight .il { color: #009999 } /* Literal.Number.Integer.Long */ 61 | .highlight .nx { color: #0086b3 } /* function in javascript? */ 62 | -------------------------------------------------------------------------------- /source/js/vendor/jquery.iiif-demo.js: -------------------------------------------------------------------------------- 1 | ;(function ($, window, document, undefined) { 2 | var pluginName = "iiifDemo", 3 | defaults = { 4 | selectOptions: {}, 5 | roundToCutoff: 50, 6 | iiifImgInfo: {}, 7 | }; 8 | 9 | function Plugin(element, options) { 10 | this.$element = $(element); 11 | this.options = $.extend({}, defaults, options); 12 | this.regions = []; 13 | this.selectValues = {}; 14 | 15 | this._defaults = defaults; 16 | this._name = pluginName; 17 | 18 | this.init(); 19 | } 20 | 21 | Plugin.prototype = { 22 | 23 | init: function() { 24 | this.$imgContainer = this.$element.find('.iiif-image-container'), 25 | this.$iiifImg = this.$imgContainer.find('img'), 26 | this.$selectRegion = this.$element.find('.iiif-select-region'), 27 | this.$selectSize = this.$element.find('.iiif-select-size'), 28 | this.$selectRotation = this.$element.find('.iiif-select-rotation'); 29 | 30 | this.calculateSelectValues(); 31 | this.render(); 32 | this.bindEvents(); 33 | }, 34 | 35 | 36 | render: function() { 37 | this.loadRegionSelectValues(); 38 | }, 39 | 40 | 41 | loadRegionSelectValues: function(region) { 42 | region = region || this.regions[0]; 43 | 44 | this.updateOptions(this.$selectRegion, this.regions, region); 45 | this.loadSizeSelectValues(region); 46 | }, 47 | 48 | 49 | loadSizeSelectValues: function(region, size) { 50 | var sizes = this.getSizesFor(region); 51 | 52 | size = size || sizes[0]; 53 | 54 | this.updateOptions(this.$selectSize, sizes, size); 55 | this.loadRotationSelectValues(region, size); 56 | }, 57 | 58 | 59 | loadRotationSelectValues: function(region, size, rotation) { 60 | var rotations = this.getRotationsFor(region, size); 61 | 62 | rotation = rotation || rotations[0]; 63 | 64 | this.updateOptions(this.$selectRotation, rotations, rotation); 65 | this.renderIiifImg(region, size, rotation); 66 | }, 67 | 68 | 69 | calculateSelectValues: function () { 70 | var w = this.$imgContainer.width(), 71 | h = this.$imgContainer.height(), 72 | regex = /([wh](\s*[-+]\s*\d+)?)/i, // matches 'w - 200,' and ',h' 73 | _this = this; 74 | 75 | $.each(this.options.selectOptions, function(region, values) { 76 | $.each(values, function(size, rotation) { 77 | // options like 'w - 200,' & ',h' are evaluated with image container dimensions 78 | size = size.replace(regex, function(match) { 79 | return _this.roundTo(parseInt(eval(match)), 10); 80 | }); 81 | 82 | if (!_this.selectValues.hasOwnProperty(region)) { 83 | _this.selectValues[region] = {}; 84 | _this.regions.push(region); 85 | } 86 | 87 | _this.selectValues[region][size] = rotation; 88 | }); 89 | }); 90 | }, 91 | 92 | 93 | bindEvents: function() { 94 | var _this = this; 95 | 96 | $(window).resize(function() { 97 | _this.selectValues = {}; 98 | _this.calculateSelectValues(); 99 | _this.render(); 100 | }); 101 | 102 | this.$selectRegion.on('change', function() { 103 | _this.loadSizeSelectValues($(this).val()); 104 | }); 105 | 106 | this.$selectSize.on('change', function() { 107 | _this.loadRotationSelectValues(_this.$selectRegion.val(), $(this).val()); 108 | }); 109 | 110 | this.$selectRotation.on('change', function() { 111 | _this.renderIiifImg(_this.$selectRegion.val(), _this.$selectSize.val(), $(this).val()); 112 | }); 113 | }, 114 | 115 | 116 | updateOptions: function($element, options, selected) { 117 | $element.html(''); 118 | 119 | $.each(options, function(index, option) { 120 | $element.append(''); 121 | }); 122 | 123 | $element.val(selected).attr('selected', 'selected'); 124 | }, 125 | 126 | 127 | renderIiifImg: function(region, size, rotation) { 128 | this.$iiifImg 129 | .attr('src', '') 130 | .hide() 131 | .attr('src', this.getIiifUrl(region, size, rotation)).fadeIn(300); 132 | }, 133 | 134 | 135 | getIiifUrl: function(region, size, rotation) { 136 | var info = this.options.iiifImgInfo; 137 | 138 | return [info.baseUrl, region, size, rotation, info.quality + '.' + info.format].join('/'); 139 | }, 140 | 141 | getSizesFor: function(region) { 142 | return $.map(this.selectValues[region], function(obj, size) { return size }); 143 | }, 144 | 145 | 146 | getRotationsFor: function(region, size) { 147 | return this.selectValues[region][size]; 148 | }, 149 | 150 | 151 | roundTo: function(value) { 152 | var cutoff = this.options.roundToCutoff || 0; 153 | return Math.max(value - (value % cutoff), cutoff); 154 | } 155 | 156 | }; 157 | 158 | $.fn[pluginName] = function (options) { 159 | return this.each(function () { 160 | if (!$.data(this, "plugin_" + pluginName)) { 161 | $.data(this, "plugin_" + pluginName, new Plugin(this, options)); 162 | } 163 | }); 164 | }; 165 | 166 | })(jQuery, window, document); 167 | -------------------------------------------------------------------------------- /source/js/vendor/anchor.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * AnchorJS - v3.1.0 - 2016-02-12 3 | * https://github.com/bryanbraun/anchorjs 4 | * Copyright (c) 2016 Bryan Braun; Licensed MIT 5 | */ 6 | function AnchorJS(A){"use strict";function e(A){A.icon=A.hasOwnProperty("icon")?A.icon:"",A.visible=A.hasOwnProperty("visible")?A.visible:"hover",A.placement=A.hasOwnProperty("placement")?A.placement:"right",A.class=A.hasOwnProperty("class")?A.class:"",A.truncate=A.hasOwnProperty("truncate")?Math.floor(A.truncate):64}function t(A){var e;if("string"==typeof A||A instanceof String)e=[].slice.call(document.querySelectorAll(A));else{if(!(Array.isArray(A)||A instanceof NodeList))throw new Error("The selector provided to AnchorJS was invalid.");e=[].slice.call(A)}return e}function n(){if(null===document.head.querySelector("style.anchorjs")){var A,e=document.createElement("style"),t=" .anchorjs-link { opacity: 0; text-decoration: none; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }",n=" *:hover > .anchorjs-link, .anchorjs-link:focus { opacity: 1; }",o=' @font-face { font-family: "anchorjs-icons"; font-style: normal; font-weight: normal; src: url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBTUAAAC8AAAAYGNtYXAWi9QdAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5Zgq29TcAAAF4AAABNGhlYWQEZM3pAAACrAAAADZoaGVhBhUDxgAAAuQAAAAkaG10eASAADEAAAMIAAAAFGxvY2EAKACuAAADHAAAAAxtYXhwAAgAVwAAAygAAAAgbmFtZQ5yJ3cAAANIAAAB2nBvc3QAAwAAAAAFJAAAACAAAwJAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpywPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6cv//f//AAAAAAAg6cv//f//AAH/4xY5AAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAACADEARAJTAsAAKwBUAAABIiYnJjQ/AT4BMzIWFxYUDwEGIicmND8BNjQnLgEjIgYPAQYUFxYUBw4BIwciJicmND8BNjIXFhQPAQYUFx4BMzI2PwE2NCcmNDc2MhcWFA8BDgEjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAEAAAABAACiToc1Xw889QALBAAAAAAA0XnFFgAAAADRecUWAAAAAAJTAsAAAAAIAAIAAAAAAAAAAQAAA8D/wAAABAAAAAAAAlMAAQAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAACAAAAAoAAMQAAAAAACgAUAB4AmgABAAAABQBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEADgAAAAEAAAAAAAIABwCfAAEAAAAAAAMADgBLAAEAAAAAAAQADgC0AAEAAAAAAAUACwAqAAEAAAAAAAYADgB1AAEAAAAAAAoAGgDeAAMAAQQJAAEAHAAOAAMAAQQJAAIADgCmAAMAAQQJAAMAHABZAAMAAQQJAAQAHADCAAMAAQQJAAUAFgA1AAMAAQQJAAYAHACDAAMAAQQJAAoANAD4YW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzVmVyc2lvbiAxLjAAVgBlAHIAcwBpAG8AbgAgADEALgAwYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzUmVndWxhcgBSAGUAZwB1AGwAYQByYW5jaG9yanMtaWNvbnMAYQBuAGMAaABvAHIAagBzAC0AaQBjAG8AbgBzRm9udCBnZW5lcmF0ZWQgYnkgSWNvTW9vbi4ARgBvAG4AdAAgAGcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAASQBjAG8ATQBvAG8AbgAuAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==) format("truetype"); }',i=" [data-anchorjs-icon]::after { content: attr(data-anchorjs-icon); }";e.className="anchorjs",e.appendChild(document.createTextNode("")),A=document.head.querySelector('[rel="stylesheet"], style'),void 0===A?document.head.appendChild(e):document.head.insertBefore(e,A),e.sheet.insertRule(t,e.sheet.cssRules.length),e.sheet.insertRule(n,e.sheet.cssRules.length),e.sheet.insertRule(i,e.sheet.cssRules.length),e.sheet.insertRule(o,e.sheet.cssRules.length)}}this.options=A||{},this.elements=[],e(this.options),this.isTouchDevice=function(){return!!("ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch)},this.add=function(A){var o,i,s,a,r,c,l,h,g,u,B,Q,f=[];if(e(this.options),Q=this.options.visible,"touch"===Q&&(Q=this.isTouchDevice()?"always":"hover"),A||(A="h1, h2, h3, h4, h5, h6"),o=t(A),0===o.length)return!1;for(n(),i=document.querySelectorAll("[id]"),s=[].map.call(i,function(A){return A.id}),r=0;r-1,t=(" "+A.lastChild.className+" ").indexOf(" anchorjs-link ")>-1;return e||t}}var anchors=new AnchorJS; 7 | -------------------------------------------------------------------------------- /source/css/spec-doc.scss: -------------------------------------------------------------------------------- 1 | --- 2 | --- 3 | 4 | .wrapper { 5 | font-family: sans-serif; 6 | width: 80%; 7 | margin: 0 5%; 8 | } 9 | 10 | .sub-pages-container { 11 | font-family: sans-serif; 12 | color: #222; 13 | line-height: 1.2; 14 | 15 | code, kbd, pre, samp { 16 | font-family: 'Ubuntu Mono', monospace; 17 | font-size: 1em; 18 | } 19 | 20 | p { 21 | margin-top: 10px; 22 | margin-bottom: 10px 23 | } 24 | 25 | article h1 { 26 | font-family: sans-serif; 27 | } 28 | .specbody { 29 | margin: 0 5%; 30 | 31 | .fullPct { 32 | width: 100%; 33 | } 34 | 35 | .ex_table { 36 | width: 100%; 37 | margin-top: 5px; 38 | tr { 39 | vertical-align: top; 40 | td { 41 | text-align: center; 42 | p { 43 | margin: 0; 44 | line-height: 1.2; 45 | padding: 0; 46 | } 47 | img { 48 | max-width: 350px; 49 | } 50 | strong { 51 | background: red; 52 | color: white; 53 | font-weight: bold; 54 | font-family: sans-serif; 55 | padding-left: 3px; 56 | margin-left: 2px; 57 | padding-right: 3px; 58 | margin-right: 2px; 59 | border-radius: 3px; 60 | } 61 | } 62 | } 63 | } 64 | 65 | .floatRight { 66 | float:right; 67 | padding-right: 30px; 68 | } 69 | 70 | .h400px { 71 | height: 400px; 72 | } 73 | 74 | h2 { 75 | font-family: sans-serif; 76 | color: #2f353e; 77 | font-weight: 300; 78 | letter-spacing: 1px; 79 | margin-top: 16px 80 | } 81 | 82 | h3 { 83 | font-weight: 300; 84 | color: #2f353e; 85 | font-family: sans-serif; 86 | margin-top: 12px 87 | } 88 | 89 | h4 { 90 | font-weight: 300; 91 | color: #2f353e; 92 | font-family: sans-serif; 93 | margin-top: 12px; 94 | } 95 | 96 | .names { 97 | padding-top: 0; 98 | margin-top: 0; 99 | li { 100 | line-height: 1.1; 101 | list-style: none 102 | } 103 | } // x .names 104 | 105 | .warning { 106 | border-left: 4px solid #E05252; 107 | background: #fbe9e9; 108 | padding-top: 20px; 109 | padding-bottom: 20px; 110 | padding-left: 20px; 111 | 112 | strong { 113 | font-weight: bold; 114 | color: #E05252; 115 | } 116 | } 117 | 118 | .api-table { 119 | td:first-child { 120 | font-size: 1.1em; 121 | font-family: 'Ubuntu Mono', ; 122 | } 123 | td { 124 | font-family: sans-serif; 125 | } 126 | } // .api-table 127 | } // x .specbody 128 | } // x .sub-pages-container 129 | 130 | .usage { 131 | margin: 0px; 132 | padding-top: 0px; 133 | padding-bottom: 2px; 134 | font-style: italic 135 | } 136 | dd ul li { 137 | margin: 0px; 138 | padding: 0px 139 | } 140 | dd ul { 141 | margin: 0px; 142 | padding-top: 0px; 143 | padding-bottom: 0px 144 | } 145 | dt { 146 | font-weight: bold; 147 | margin-top: 8px 148 | } 149 | .examplelist li { 150 | margin-bottom: 8px 151 | } 152 | .examplelist li code { 153 | background: #eee; 154 | border: 1px dashed #bbb; 155 | padding: 3px 156 | } 157 | 158 | .highlight { 159 | background: #eee; 160 | border: 1px dashed #bbb; 161 | padding-left: 5px; 162 | margin-left: 30px 163 | 164 | } 165 | 166 | .python { 167 | .c { 168 | font-style: italic; 169 | color: #909090; 170 | } 171 | .n { 172 | color: #202090; 173 | } 174 | .o { 175 | color: black; 176 | } 177 | .k { 178 | color: green; 179 | } 180 | .mi { 181 | color: #209020; 182 | } 183 | .nb { 184 | color: #902020; 185 | } 186 | .kn { 187 | color: #902090; 188 | } 189 | .nn { 190 | color: #202090; 191 | } 192 | .p { 193 | color: black; 194 | } 195 | .s { 196 | color: #209020; 197 | } 198 | 199 | } 200 | 201 | .json { 202 | .c1 { 203 | font-style: italic; 204 | color: #909090 205 | } 206 | .s2 { 207 | color: #209020 208 | } 209 | .nt { 210 | color: #202090 211 | } 212 | .p {color: black} 213 | .o {color: black} 214 | .err { 215 | font-style: italic; 216 | color: #909090 217 | } 218 | .mi { 219 | color: #902020 220 | } 221 | .mf { 222 | color: #902020 223 | } 224 | } 225 | 226 | 227 | .CodeRay { 228 | background: #eee; 229 | border: 1px dashed #bbb; 230 | padding-left: 5px; 231 | margin-left: 30px 232 | } 233 | .string { 234 | color: #209020 235 | } 236 | .comment { 237 | font-style: italic; 238 | color: #909090 239 | } 240 | .key { 241 | color: #202090 242 | } 243 | .integer { 244 | color: #902020 245 | } 246 | .error { 247 | color: red; 248 | font-weight: bold; 249 | font-size: +1 250 | } 251 | pre { 252 | margin-top: 8px; 253 | margin-bottom: 8px 254 | } 255 | .urltemplate { 256 | background: #eee; 257 | border: 1px dashed #bbb; 258 | padding-left: 5px; 259 | margin-left: 30px; 260 | margin-right: 30px; 261 | padding-top: 5px; 262 | padding-bottom: 5px 263 | } 264 | 265 | .codetemplate { 266 | background: #eee; 267 | border: 1px dashed #bbb; 268 | padding: 5px 15px; 269 | } 270 | 271 | .mytoc ol { 272 | margin: 0px; 273 | margin-top: 2px 274 | } 275 | .rfc { 276 | color: #d55; 277 | font-variant: small-caps; 278 | font-style: normal; 279 | font-size: 1.2em; 280 | line-height: 0.8333 281 | } 282 | .legend { 283 | width: 50% 284 | } 285 | table { 286 | border: 1px solid black; 287 | } 288 | tr { 289 | border: 1px solid #666; 290 | } 291 | td, th { 292 | border: 1px solid #666; 293 | padding: 3px 294 | } 295 | #markdown-toc li { 296 | list-style-type: none; 297 | padding-top: 0px; 298 | padding-bottom: 0px; 299 | line-height: 1.1; 300 | margin-top: 8px; 301 | margin-bottom: 8px 302 | } 303 | #markdown-toc ul { 304 | margin-top: 8px; 305 | margin-bottom: 8px 306 | } 307 | -------------------------------------------------------------------------------- /source/_data/showcase.yml: -------------------------------------------------------------------------------- 1 | 2 | ### Clients 3 | 4 | - name: OpenSeadragon 5 | id: osd 6 | type: client 7 | img_url: http://showcase.iiif.io/img/showcase/osd.jpg 8 | desc: 9 | - > 10 | An open-source, web-based viewer for zoomable images, implemented in pure JavaScript. 11 | github_url: https://github.com/openseadragon/openseadragon 12 | url: http://showcase.iiif.io/showcase/osd-viewer.html 13 | 14 | - name: Mirador Viewer 15 | id: mirador 16 | type: client 17 | img_url: http://showcase.iiif.io/img/showcase/mirador.jpg 18 | desc: 19 | - > 20 | An open-source, web-based 'multi-up' viewer that supports zoom-pan-rotate 21 | functionality, ability to display/compare simple images, and images with 22 | annotations. 23 | github_url: https://github.com/IIIF/mirador 24 | url: http://showcase.iiif.io/showcase/mirador-viewer.html 25 | 26 | - name: Universal Viewer 27 | id: uv 28 | type: client 29 | img_url: http://showcase.iiif.io/img/showcase/uv.png 30 | desc: 31 | - > 32 | Initially developed by Digirati for the Wellcome Library, the UV can display most types of digital 33 | content, including cover-to-cover books, archives, works of art, video, audio and 3D. It also supports the IIIF Auth and Search APIs. 34 | github_url: https://github.com/UniversalViewer/universalviewer 35 | url: http://showcase.iiif.io/showcase/uv.html 36 | 37 | - name: Leaflet-IIIF Viewer 38 | id: leaflet 39 | type: client 40 | img_url: http://showcase.iiif.io/img/showcase/leaflet.jpg 41 | desc: 42 | - > 43 | Leaflet-IIIF is a Leaflet plugin that enables zoomable IIIF images to be 44 | easily and quickly displayed. Leaflet + Leaflet-IIIF weigh in at just 35 KB 45 | and include great features like accessible keyboard controls and native 46 | touch/mobile support. 47 | github_url: https://github.com/mejackreed/Leaflet-IIIF 48 | url: http://showcase.iiif.io/showcase/leaflet-iiif-viewer.html 49 | 50 | - name: KlokanTech IIIFViewer 51 | id: klokantech-iiifviewer 52 | type: client 53 | img_url: http://showcase.iiif.io/img/showcase/klokantechiiifviewer.png 54 | desc: 55 | - > 56 | IIIF Viewer from Klokan Technologies is optimized for desktop and mobile 57 | devices (iOS, Android), is open-source, free to use and powered by OpenLayers. 58 | Extra features: Rotation on client side, Drawing tools (polygons, lines, 59 | markers), Color adjustment (saturation, lightness, etc.), WebGL... 60 | github_url: https://github.com/klokantech/iiifviewer 61 | url: http://showcase.iiif.io/showcase/klokantech-iiifviewer.html 62 | 63 | ### Servers 64 | 65 | - name: Loris IIIF Image Server 66 | id: loris 67 | type: server 68 | img_url: http://showcase.iiif.io/img/showcase/loris.jpg 69 | desc: 70 | - > 71 | Loris is an open source, Python-based image server that supports the IIIF 72 | Image API version 2.0. Loris supports JPEG2000 as well as JPEG and TIFF source images. 73 | github_url: https://github.com/pulibrary/loris 74 | url: http://showcase.iiif.io/showcase/loris-server.html 75 | 76 | - name: IIP Image 77 | id: iip 78 | type: server 79 | img_url: http://showcase.iiif.io/img/showcase/iip.png 80 | desc: 81 | - > 82 | IIPImage is a high-performance feature-rich image server system 83 | for web-based streamed viewing and zooming of ultra high-resolution images. 84 | IIPImage Server is designed to be embedded within a host web server such as Apache, Lighttpd, 85 | MyServer or Nginx. It supports TIFF and JPEG2000 source images. 86 | github_url: https://github.com/ruven 87 | url: http://showcase.iiif.io/showcase/iipimage-viewer.html 88 | 89 | ### Sites/Consumers 90 | 91 | - name: Georeferencer 92 | id: georeferencer 93 | type: site 94 | img_url: http://showcase.iiif.io/img/showcase/georeferencer.jpg 95 | desc: 96 | - > 97 | Turn scans into maps. Georeferencer is an online tool that assigns 98 | geographical location to any IIIF image. 99 | url: http://showcase.iiif.io/showcase/georeferencer.html 100 | 101 | - name: Yale Center for British Art 102 | id: ycba 103 | type: site 104 | img_url: http://showcase.iiif.io/img/showcase/yale-ycba-iipmooviewer.png 105 | desc: 106 | - > 107 | The Yale Center for British Art uses IIPMooviewer's IIIF Image API support 108 | to provide access to high-resolution images. 109 | url: http://showcase.iiif.io/showcase/ycba.html 110 | 111 | - name: e-codices 112 | id: e-codices 113 | type: site 114 | img_url: http://showcase.iiif.io/img/showcase/e-codices.png 115 | desc: 116 | - > 117 | e-codices – Virtual Manuscript Library of Switzerland uses the Loris IIIF Image Server, OpenSeadragon and the IIIF Presentation API, providing access to over 450,000 high-resolution images from over 1,200 medieval manuscripts with metadata in four languages. 118 | url: http://showcase.iiif.io/showcase/e-codices.html 119 | 120 | - name: Fractals 121 | id: fractals 122 | type: site 123 | img_url: http://showcase.iiif.io/img/showcase/fractals.jpg 124 | desc: 125 | - > 126 | IIIF components are used to serve and view dynamically created fractal images up to 1 billion pixels wide and 1 billion pixels high. Fractals exhibit patterns that repeat as you zoom in. A standard IIIF viewer and web server are used, together with a fractal generator that emulates the way tiles are created from JPEG2000 images. 127 | url: http://showcase.iiif.io/showcase/fractals.html 128 | 129 | - name: SAT Taishōzō Image DB 130 | id: satdb 131 | type: site 132 | img_url: http://showcase.iiif.io/img/showcase/satdb.png 133 | desc: 134 | - > 135 | Buddhist images can be searched not only from the search window but also from the value of the embedded tag on the images by clicking on it. Users can find search terms by English words with clicking "EN" button without inputting Japanese words by hand. This system also provides a function to display several images in parallel easily from a search result via a cart by use of Mirador. 136 | url: http://showcase.iiif.io/showcase/satdb.html 137 | 138 | 139 | ### Other 140 | -------------------------------------------------------------------------------- /source/css/spec-doc2.scss: -------------------------------------------------------------------------------- 1 | --- 2 | --- 3 | 4 | .wrapper { 5 | font-family: sans-serif; 6 | width: 80%; 7 | margin: 0 5%; 8 | } 9 | 10 | .sub-pages-container { 11 | font-family: sans-serif; 12 | color: #222; 13 | line-height: 1.2; 14 | 15 | code, kbd, pre, samp { 16 | font-family: 'Ubuntu Mono', monospace; 17 | font-size: 1em; 18 | } 19 | 20 | p { 21 | margin-top: 10px; 22 | margin-bottom: 10px 23 | } 24 | 25 | article h1 { 26 | font-family: sans-serif; 27 | } 28 | .specbody { 29 | margin: 0 5%; 30 | 31 | .fullPct { 32 | width: 100%; 33 | } 34 | 35 | .ex_table { 36 | width: 100%; 37 | margin-top: 5px; 38 | tr { 39 | vertical-align: top; 40 | td { 41 | text-align: center; 42 | p { 43 | margin: 0; 44 | line-height: 1.2; 45 | padding: 0; 46 | } 47 | img { 48 | max-width: 350px; 49 | } 50 | strong { 51 | background: red; 52 | color: white; 53 | font-weight: bold; 54 | font-family: sans-serif; 55 | padding-left: 3px; 56 | margin-left: 2px; 57 | padding-right: 3px; 58 | margin-right: 2px; 59 | border-radius: 3px; 60 | } 61 | } 62 | } 63 | } 64 | 65 | .floatRight { 66 | float:right; 67 | padding-right: 30px; 68 | } 69 | 70 | .h400px { 71 | height: 400px; 72 | } 73 | 74 | h2 { 75 | font-family: sans-serif; 76 | color: #2f353e; 77 | font-weight: 300; 78 | letter-spacing: 1px; 79 | margin-top: 16px 80 | } 81 | 82 | h3 { 83 | font-weight: 300; 84 | color: #2f353e; 85 | font-family: sans-serif; 86 | margin-top: 12px 87 | } 88 | 89 | h4 { 90 | font-weight: 300; 91 | color: #2f353e; 92 | font-family: sans-serif; 93 | margin-top: 12px; 94 | font-size: 17px; 95 | } 96 | 97 | h5 { 98 | font-weight: bold; 99 | margin: 0; 100 | padding: 0; 101 | font-size: 15px; 102 | } 103 | 104 | h5+p { 105 | margin-top: 2px; 106 | } 107 | 108 | .clearRight { 109 | clear:right; 110 | } 111 | 112 | .names { 113 | padding-top: 0; 114 | margin-top: 0; 115 | li { 116 | line-height: 1.1; 117 | list-style: none 118 | } 119 | } // x .names 120 | 121 | .warning { 122 | border-left: 4px solid #E05252; 123 | background: #fbe9e9; 124 | padding-top: 20px; 125 | padding-bottom: 20px; 126 | padding-left: 20px; 127 | padding-right: 24px; 128 | 129 | strong { 130 | font-weight: bold; 131 | color: #E05252; 132 | margin-right: 10px; 133 | } 134 | } 135 | .alert { 136 | border-left: 4px solid #E0CB52; 137 | background: #FCFAEE; 138 | padding-top: 5px; 139 | padding-bottom: 20px; 140 | padding-left: 20px; 141 | padding-right: 24px; 142 | vertical-align: top; 143 | 144 | strong { 145 | font-weight: bold; 146 | color: #B9AB2D; 147 | margin-right: 10px; 148 | } 149 | } 150 | 151 | .note { 152 | border-left: 4px solid #52E052; 153 | background: #D0FCD0; 154 | padding-top: 5px; 155 | padding-bottom: 20px; 156 | padding-left: 20px; 157 | padding-right: 24px; 158 | vertical-align: top; 159 | 160 | strong { 161 | font-weight: bold; 162 | color: #32C032; 163 | margin-right: 10px; 164 | } 165 | } 166 | 167 | .api-table { 168 | td:first-child { 169 | font-size: 1.1em; 170 | font-family: 'Ubuntu Mono', monospace; 171 | } 172 | td { 173 | font-family: sans-serif; 174 | } 175 | } // .api-table 176 | 177 | .first-col-normal { 178 | td:first-child { 179 | font-family: sans-serif; 180 | } 181 | } // .first-col-normal 182 | 183 | .names { 184 | a { 185 | border-bottom: none; 186 | } 187 | } 188 | 189 | } // x .specbody 190 | } // x .sub-pages-container 191 | 192 | .anchorjs-link { 193 | border-bottom: none !important; 194 | } 195 | 196 | .usage { 197 | margin: 0px; 198 | padding-top: 0px; 199 | padding-bottom: 2px; 200 | font-style: italic 201 | } 202 | dd ul li { 203 | margin: 0px; 204 | padding: 0px 205 | } 206 | dd ul { 207 | margin: 0px; 208 | padding-top: 0px; 209 | padding-bottom: 0px 210 | } 211 | dt { 212 | font-weight: bold; 213 | margin-top: 8px 214 | } 215 | .examplelist li { 216 | margin-bottom: 8px 217 | } 218 | .examplelist li code { 219 | background: #eee; 220 | border: 1px dashed #bbb; 221 | padding: 3px 222 | } 223 | 224 | .highlight { 225 | background: #eee; 226 | border: 1px dashed #bbb; 227 | padding: 5px; 228 | margin-left: 30px 229 | } 230 | 231 | .CodeRay { 232 | background: #eee; 233 | border: 1px dashed #bbb; 234 | padding-left: 5px; 235 | margin-left: 30px 236 | } 237 | .string { 238 | color: #209020 239 | } 240 | .comment { 241 | font-style: italic; 242 | color: #909090 243 | } 244 | .key { 245 | color: #202090 246 | } 247 | .integer { 248 | color: #902020 249 | } 250 | .error { 251 | color: red; 252 | font-weight: bold; 253 | font-size: +1 254 | } 255 | pre { 256 | margin-top: 8px; 257 | margin-bottom: 8px 258 | } 259 | .urltemplate { 260 | background: #eee; 261 | border: 1px dashed #bbb; 262 | padding-left: 5px; 263 | margin-left: 30px; 264 | margin-right: 30px; 265 | padding-top: 5px; 266 | padding-bottom: 5px 267 | } 268 | 269 | .codetemplate { 270 | background: #eee; 271 | border: 1px dashed #bbb; 272 | padding: 5px 15px; 273 | } 274 | 275 | .mytoc ol { 276 | margin: 0px; 277 | margin-top: 2px 278 | } 279 | .rfc { 280 | color: #d55; 281 | font-variant: small-caps; 282 | font-style: normal; 283 | font-size: 1.2em; 284 | line-height: 0.8333 285 | } 286 | .legend { 287 | width: 50% 288 | } 289 | table { 290 | border: 1px solid black; 291 | } 292 | tr { 293 | border: 1px solid #666; 294 | } 295 | td, th { 296 | border: 1px solid #666; 297 | padding: 3px 298 | } 299 | #markdown-toc li { 300 | list-style-type: none; 301 | padding-top: 0px; 302 | padding-bottom: 0px; 303 | line-height: 1.1; 304 | margin-top: 8px; 305 | margin-bottom: 8px 306 | } 307 | #markdown-toc ul { 308 | margin-top: 8px; 309 | margin-bottom: 8px 310 | } 311 | -------------------------------------------------------------------------------- /source/js/vendor/jquery.ddslick.min.js: -------------------------------------------------------------------------------- 1 | (function (a) { function g(a, b) { var c = a.data("ddslick"); var d = a.find(".dd-selected"), e = d.siblings(".dd-selected-value"), f = a.find(".dd-options"), g = d.siblings(".dd-pointer"), h = a.find(".dd-option").eq(b), k = h.closest("li"), l = c.settings, m = c.settings.data[b]; a.find(".dd-option").removeClass("dd-option-selected"); h.addClass("dd-option-selected"); c.selectedIndex = b; c.selectedItem = k; c.selectedData = m; if (l.showSelectedHTML) { d.html((m.imageSrc ? '' : "") + (m.text ? '" : "") + (m.description ? '' + m.description + "" : "")) } else d.html(m.text); e.val(m.value); c.original.val(m.value); a.data("ddslick", c); i(a); j(a); if (typeof l.onSelected == "function") { l.onSelected.call(this, c) } } function h(b) { var c = b.find(".dd-select"), d = c.siblings(".dd-options"), e = c.find(".dd-pointer"), f = d.is(":visible"); a(".dd-click-off-close").not(d).slideUp(50); a(".dd-pointer").removeClass("dd-pointer-up"); if (f) { d.slideUp("fast"); e.removeClass("dd-pointer-up") } else { d.slideDown("fast"); e.addClass("dd-pointer-up") } k(b) } function i(a) { a.find(".dd-options").slideUp(50); a.find(".dd-pointer").removeClass("dd-pointer-up").removeClass("dd-pointer-up") } function j(a) { var b = a.find(".dd-select").css("height"); var c = a.find(".dd-selected-description"); var d = a.find(".dd-selected-image"); if (c.length <= 0 && d.length > 0) { a.find(".dd-selected-text").css("lineHeight", b) } } function k(b) { b.find(".dd-option").each(function () { var c = a(this); var d = c.css("height"); var e = c.find(".dd-option-description"); var f = b.find(".dd-option-image"); if (e.length <= 0 && f.length > 0) { c.find(".dd-option-text").css("lineHeight", d) } }) } a.fn.ddslick = function (c) { if (b[c]) { return b[c].apply(this, Array.prototype.slice.call(arguments, 1)) } else if (typeof c === "object" || !c) { return b.init.apply(this, arguments) } else { a.error("Method " + c + " does not exists.") } }; var b = {}, c = { data: [], keepJSONItemsOnTop: false, width: 260, height: null, background: "#eee", selectText: "", defaultSelectedIndex: null, truncateDescription: true, imagePosition: "left", showSelectedHTML: true, clickOffToClose: true, onSelected: function () { } }, d = '

', e = '', f = '"; if (a("#css-ddslick").length <= 0) { a(f).appendTo("head") } b.init = function (b) { var b = a.extend({}, c, b); return this.each(function () { var c = a(this), f = c.data("ddslick"); if (!f) { var i = [], j = b.data; c.find("option").each(function () { var b = a(this), c = b.data(); i.push({ text: a.trim(b.text()), value: b.val(), selected: b.is(":selected"), description: c.description, imageSrc: c.imagesrc }) }); if (b.keepJSONItemsOnTop) a.merge(b.data, i); else b.data = a.merge(i, b.data); var k = c, l = a('
'); c.replaceWith(l); c = l; c.addClass("dd-container").append(d).append(e); var i = c.find(".dd-select"), m = c.find(".dd-options"); m.css({ width: b.width }); i.css({ width: b.width, background: b.background }); c.css({ width: b.width }); if (b.height != null) m.css({ height: b.height, overflow: "auto" }); a.each(b.data, function (a, c) { if (c.selected) b.defaultSelectedIndex = a; m.append("
  • " + '' + (c.value ? ' ' : "") + (c.imageSrc ? ' ' : "") + (c.text ? ' " : "") + (c.description ? ' ' + c.description + "" : "") + "" + "
  • ") }); var n = { settings: b, original: k, selectedIndex: -1, selectedItem: null, selectedData: null }; c.data("ddslick", n); if (b.selectText.length > 0 && b.defaultSelectedIndex == null) { c.find(".dd-selected").html(b.selectText) } else { var o = b.defaultSelectedIndex != null && b.defaultSelectedIndex >= 0 && b.defaultSelectedIndex < b.data.length ? b.defaultSelectedIndex : 0; g(c, o) } c.find(".dd-select").on("click.ddslick", function () { h(c) }); c.find(".dd-option").on("click.ddslick", function () { g(c, a(this).closest("li").index()) }); if (b.clickOffToClose) { m.addClass("dd-click-off-close"); c.on("click.ddslick", function (a) { a.stopPropagation() }); a("body").on("click", function () { a(".dd-click-off-close").slideUp(50).siblings(".dd-select").find(".dd-pointer").removeClass("dd-pointer-up") }) } } }) }; b.select = function (b) { return this.each(function () { if (b.index) g(a(this), b.index) }) }; b.open = function () { return this.each(function () { var b = a(this), c = b.data("ddslick"); if (c) h(b) }) }; b.close = function () { return this.each(function () { var b = a(this), c = b.data("ddslick"); if (c) i(b) }) }; b.destroy = function () { return this.each(function () { var b = a(this), c = b.data("ddslick"); if (c) { var d = c.original; b.removeData("ddslick").unbind(".ddslick").replaceWith(d) } }) } })(jQuery) -------------------------------------------------------------------------------- /source/api/import/0.1/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "IIIF Import API 0.1.0" 3 | title_override: "IIIF Import API 0.1.0" 4 | id: import-api 5 | layout: spec 6 | tags: [specifications, import-api] 7 | major: 0 8 | minor: 1 9 | patch: 0 10 | pre: draft 11 | cssversion: 2 12 | sitemap: false 13 | --- 14 | 15 | ## Status of this Document 16 | {:.no_toc} 17 | __This Version:__ {{ page.major }}.{{ page.minor }}.{{ page.patch }}{% if page.pre != 'final' %}-{{ page.pre }}{% endif %} 18 | 19 | {% include beta.md %} 20 | 21 | **Editors** 22 | 23 | * **[Michael Appleby](https://orcid.org/0000-0002-1266-298X)** [![ORCID iD](/img/orcid_16x16.png)](https://orcid.org/0000-0002-1266-298X), [_Yale University_](http://www.yale.edu/) 24 | * **[Tom Crane](https://orcid.org/0000-0003-1881-243X)** [![ORCID iD](/img/orcid_16x16.png)](https://orcid.org/0000-0003-1881-243X), [_Digirati_](http://digirati.com/) 25 | * **[Robert Sanderson](https://orcid.org/0000-0003-4441-6852)** [![ORCID iD](/img/orcid_16x16.png)](https://orcid.org/0000-0003-4441-6852), [_Stanford University_](http://www.stanford.edu/) 26 | * **[Jon Stroop](https://orcid.org/0000-0002-0367-1243)** [![ORCID iD](/img/orcid_16x16.png)](https://orcid.org/0000-0002-0367-1243), [_Princeton University Library_](https://library.princeton.edu/) 27 | * **[Simeon Warner](https://orcid.org/0000-0002-7970-7855)** [![ORCID iD](/img/orcid_16x16.png)](https://orcid.org/0000-0002-7970-7855), [_Cornell University_](https://www.cornell.edu/) 28 | {: .names} 29 | 30 | {% include copyright2017.md %} 31 | 32 | ## Table of Contents 33 | {:.no_toc} 34 | 35 | * Table of Discontent (will be replaced by macro) 36 | {:toc} 37 | 38 | ## 1. Introduction 39 | 40 | The IIIF (pronounced "Triple-Eye-Eff") [Presentation API][prezi-api] allows content to be brought together from distributed systems via annotations. That content might include images, often with a IIIF [Image API][image-api] service to access them, audio, video, rich or plain text, or anything else. There is a rich ecosystem of [IIIF viewing clients][iiif-clients] with different affordances to meet different user needs. This specification describes approaches that allow users to easily import IIIF resources into the viewing client they choose. 41 | 42 | Please join in discussion of this draft specification on the [IIIF Discovery Technical Specification Group][iiif-discovery-tsg] calls, or send feedback to [iiif-discuss@googlegroups.com][iiif-discuss] 43 | 44 | ### 1.1. Use Cases 45 | 46 | Use cases for import of IIIF resources to viewers include: 47 | 48 | * User has an multi-item IIIF viewer application open. In another browser window, the user is browsing or using a search interface, and locates an image, book, manuscript, etc. that they want to add to their open viewer. 49 | * User has an IIIF application open that provides the ability to edit a IIIF [Presentation API][prezi-api] Manifest. In another browser window, the user is browsing or using a search interface, and locates an image that they want to add to the manifest they are creating. 50 | 51 | FIXME - Want to have 3-5 key pithy use cases in here that motivate the set of patterns proposed. 52 | {: .warning} 53 | 54 | This is WORK IN PROGRESS: Additional use cases may be submitted on [github][iiif-discovery-use-cases] for discussion by the [IIIF Discovery Technical Specification Group][iiif-discovery-tsg]. 55 | {: .warning} 56 | 57 | ### 1.2. Terminology 58 | 59 | The key words _MUST_, _MUST NOT_, _REQUIRED_, _SHALL_, _SHALL NOT_, _SHOULD_, _SHOULD NOT_, _RECOMMENDED_, _MAY_, and _OPTIONAL_ in this document are to be interpreted as described in [RFC 2119][rfc-2119]. 60 | 61 | ## 2. Overview 62 | 63 | FIXME - Motivation for UI patterns and scope, and description elements and concepts that are commons across patterns. 64 | {: .warning} 65 | 66 | ## 3. Open in Viewer 67 | 68 | FIXME - need a pattern, see [#99](https://github.com/IIIF/iiif-stories/issues/99), [#90](https://github.com/IIIF/iiif-stories/issues/90), [#85](https://github.com/IIIF/iiif-stories/issues/85). 69 | {: .warning} 70 | 71 | ## 4. Add to Viewer 72 | 73 | ### 4.1 Drag and Drop 74 | 75 | [Drag and drop][drag-and-drop] is a common pattern in graphical user interfaces that is supported by most windowing systems and web browsers. It requires a recognizable item to select or "grab", and a location to "drag" to before "dropping". This specification uses a hyperlinked icon to support drag and drop of an IIIF resource from one web page to an IIIF viewing application in another web page. Common web browser implementations support this pattern by copying the hyperlink target URI as payload of the drop action. An example HTML snippet is shown below: 76 | 77 | ``` 78 | 79 | Drag item to IIIF viewer 80 | 81 | ``` 82 | 83 | The three components to this snippet: link target, link parameters, icon are described in the following sections. 84 | 85 | FIXME - Should probably rework this to use [HTML5 Drag and drop][html5-dnd]. 86 | {: .warning} 87 | 88 | #### 4.1.1 Link Target 89 | 90 | A user following the hyperlink will be directed to the specified URI (`http://example.org/help?manifest=http://example.org/manifest1` in the example above). It is _RECOMMENDED_ that this resolve to a page that explains the drag and drop facility, or opens a particular viewer showing the image or manifest. 91 | 92 | FIXME - Is there community agreement on this behavior? 93 | {: .warning} 94 | 95 | #### 4.1.2 Link Parameters 96 | 97 | The query parameters of the link target (`manifest=http://example.org/manifest1`) provide the information necessary for the IIIF viewing application receiving the "drop" to open or add the specified resource. The query parameters _MAY_ include: 98 | 99 | * `manifest` - URI of an IIIF [Presentation API][prezi-api] Manifest (`http://example.org/manifest1` in the example snippet). 100 | * `canvas` - URI of currently selected Canvas within the Manifest. If no Canvas is specified then the target application will use its default behavior to present the Manifest. (The `canvas` parameter has no meaning unless a `manifest` parameter is given.) 101 | * `image` - URI of an IIIF [Image API][image-api] `info.json`. This is an alternative to specifying a Manifest for use in situations where the source implements only the Image API. It _SHOULD NOT_ be specified in addition to `manifest` or `canvas`. 102 | 103 | #### 4.1.3 Icon 104 | 105 | It is _RECOMMENDED_ that the following icon be used as a recognizable way to indicate an IIIF resource that may be dragged following the drag and drop pattern described in this section. 106 | 107 | ![icon](iiif-dragndrop-100px.png) 108 | 109 | This icon may be freely reused according to the terms of [CC0][cc0]. The icon _MAY_ be scaled to fit in with other user interface design elements. 110 | 111 | FIXME - Need a real icon. The IIIF logo has been used in a number of implementations. 112 | {: .warning} 113 | 114 | ### 4.2 Copy Paste 115 | 116 | FIXME - Work out copy paste pattern. 117 | {: .warning} 118 | 119 | ## Appendices 120 | 121 | ### A. Versioning 122 | 123 | This specification follows [Semantic Versioning][semver]. See the note [Versioning of APIs][versioning] for details regarding how this is implemented. 124 | 125 | ### B. Acknowledgements 126 | 127 | Many thanks to the members of the [IIIF][iiif-community] for their engagement, ideas and feedback. 128 | 129 | ### C. Change Log 130 | 131 | | Date | Description | 132 | | ---------- | -------------------------------------------------- | 133 | | 2017-09-07 | Version 0.1.0 draft of drag-and-drop pattern only | 134 | | 2015-09-30 | Trial implementation of [drag-and-drop at IIIF Shimathon][shimathon-drag-and-drop] | 135 | {: .api-table} 136 | 137 | 138 | [cc-by]: http://creativecommons.org/licenses/by/4.0/ "Creative Commons — Attribution 4.0 International" 139 | [iiif-discuss]: mailto:iiif-discuss@googlegroups.com "Email Discussion List" 140 | [iiif-discovery-tsg]: http://iiif.io/community/groups/discovery/ "IIIF Discovery Technical Specification Group" 141 | [iiif-discovery-use-cases]: https://github.com/IIIF/iiif-stories/issues?q=is%3Aissue+is%3Aopen+label%3Adiscovery-import "IIIF Discovery Import Use Cases" 142 | [iiif-clients]: http://iiif.io/apps-demos/#implementation-demos "IIIF Viewing Clients" 143 | [versioning]: /api/annex/notes/semver/ "Versioning of APIs" 144 | [semver]: http://semver.org/spec/v2.0.0.html "Semantic Versioning 2.0.0" 145 | [iiif-community]: /community/ "IIIF Community" 146 | 147 | [image-api]: /api/image/2.0/ "Image API" 148 | [prezi-api]: /api/presentation/2.0/ "Presentation API" 149 | [rfc-2119]: http://tools.ietf.org/html/rfc2119 150 | 151 | [drag-and-drop]: https://en.wikipedia.org/wiki/Drag_and_drop "Drag and Drop" 152 | [shimathon-drag-and-drop]: https://zimeon.github.io/iiif-dragndrop/ "IIIF Drag-and-Drop Experiments" 153 | [cc0]: https://creativecommons.org/publicdomain/zero/1.0/ "CC0 1.0 Universal (CC0 1.0) Public Domain Dedication" 154 | [html5-dnd]: https://www.w3.org/TR/html/editing.html#drag-and-drop "HTML5 Drag and Drop" 155 | 156 | {% include acronyms.md %} 157 | -------------------------------------------------------------------------------- /source/_data/institutions.yml: -------------------------------------------------------------------------------- 1 | - name: 4Science 2 | uri: https://www.4science.it/en/ 3 | iiifc: 4 | - name: Art Institute of Chicago 5 | uri: http://www.artic.edu/ 6 | iiifc: 7 | - name: ARTstor 8 | uri: http://www.ithaka.org 9 | iiifc: 1 10 | - name: Art Gallery of Ontario 11 | uri: http://boxwood.ago.ca 12 | iiifc: 13 | - name: Bayerische Staatsbibliothek (Bavarian State Library) 14 | uri: http://www.bsb-muenchen.de 15 | iiifc: 1 16 | - name: La Bibliothèque nationale de France 17 | uri: http://www.bnf.fr 18 | iiifc: 1 19 | - name: Biblissima 20 | uri: http://www.biblissima-condorcet.fr/ 21 | iiifc: 22 | - name: Boston Public Library 23 | uri: https://digitalcommonwealth.org 24 | iiifc: 25 | - name: British Library 26 | uri: https://www.bl.uk/ 27 | iiifc: 1 28 | - name: British Museum 29 | uri: http://www.britishmuseum.org/ 30 | iiifc: 31 | - name: Brown University 32 | uri: https://repository.library.brown.edu 33 | iiifc: 2 34 | - name: Cambridge University 35 | uri: https://www.cam.ac.uk/ 36 | iiifc: 2 37 | - name: Canadiana.org 38 | uri: http://canadiana.org 39 | iiifc: 40 | - name: Carnegie Museum of Art 41 | uri: http://records.cmoa.org 42 | iiifc: 43 | - name: Center for Open Data in the Humanities, Research Organization of Information and Systems, Japan 44 | uri: http://codh.rois.ac.jp/ 45 | - name: Centre de Recherche et de Restauration des Musées de France (C2RMF) 46 | uri: http://c2rmf.fr/ 47 | iiifc: 48 | - name: Chinese University of Hong Kong 49 | uri: http://lib.cuhk.edu.hk/ 50 | iiifc: 2 51 | - name: Cogapp 52 | uri: http://www.cogapp.com 53 | iiifc: 54 | - name: Columbia University 55 | uri: http://www.columbia.edu/ 56 | iiifc: 57 | - name: CONTENTdm 58 | uri: http://www.oclc.org/en-US/contentdm.html 59 | iiifc: 60 | - name: Cooper Hewitt Smithsonian Design Museum 61 | uri: http://www.cooperhewitt.org 62 | iiifc: 63 | - name: Cornell University 64 | uri: https://www.library.cornell.edu/ 65 | iiifc: 1 66 | - name: Data Futures Project (University of Westminster) 67 | uri: https://www.data-futures.org/ 68 | iiifc: 2 69 | - name: DPLA 70 | uri: http://dp.la/ 71 | - name: Digital Image Archive of Medieval Music (DIAMM) 72 | uri: http://www.diamm.ac.uk/ 73 | - name: Digirati Ltd 74 | uri: http://www.digirati.co.uk/ 75 | - name: Durham University Library 76 | uri: https://www.dur.ac.uk/library/asc/ 77 | - name: e-codices – Virtual Manuscript Library of Switzerland 78 | uri: http://www.e-codices.unifr.ch 79 | - name: École polytechnique fédérale de Lausanne (EPFL) 80 | uri: https://www.epfl.ch/index.en.html 81 | iiifc: 2 82 | - name: Europeana 83 | uri: http://europeana.eu/ 84 | iiifc: 2 85 | - name: Folger Shakespeare Library 86 | uri: http://www.folger.edu/ 87 | iiifc: 2 88 | - name: The J. Paul Getty Trust 89 | uri: http://getty.edu/ 90 | iiifc: 2 91 | - name: Ghent University 92 | uri: https://www.ugent.be/en 93 | iiifc: 94 | - name: Gottingen State and University Library 95 | uri: https://textgrid.de/en/ 96 | iiifc: 2 97 | - name: Harvard Art Museums 98 | uri: http://www.harvardartmuseums.org/ 99 | iiifc: 100 | - name: Harvard University 101 | uri: http://iiif.harvard.edu 102 | iiifc: 2 103 | - name: Hill Museum & Manuscript Library (HMML) 104 | uri: https://www.vhmml.org/ 105 | iiifc: 106 | - name: Holoscene 107 | uri: http://holoscene.io 108 | iiifc: 109 | - name: Huygens ING (KNAW) 110 | uri: https://www.huygens.knaw.nl/ 111 | - name: Indiana University 112 | uri: https://www.iu.edu/ 113 | iiifc: 2 114 | - name: Internet Archive 115 | uri: https://archive.org/index.php 116 | iiifc: 117 | - name: Johns Hopkins University 118 | uri: http://library.jhu.edu 119 | iiifc: 2 120 | - name: Keio University Libraries 121 | uri: http://www.lib.keio.ac.jp/en/ 122 | - name: Klokan Technologies 123 | uri: http://www.klokantech.com/ 124 | - name: KU Leuven - LIBIS+ 125 | uri: http://libisplus.be/libisplus/mirador-iiif-en 126 | iiifc: 127 | - name: Kyoto University Library Network 128 | uri: http://www.kulib.kyoto-u.ac.jp/ 129 | iiifc: 2 130 | - name: Leiden University 131 | uri: https://www.library.universiteitleiden.nl 132 | iiifc: 2 133 | - name: Leipzig University Library (Universitätsbibliothek Leipzig) 134 | uri: https://www.ub.uni-leipzig.de 135 | iiifc: 136 | - name: Library of Congress 137 | uri: https://www.wdl.org 138 | iiifc: 139 | - name: LUNA Imaging 140 | uri: http://www.lunaimaging.com/blog/2015/12/3/luna-and-iiif-1 141 | - name: Manuscriptorium - Digital Library of Written Cultural Heritage 142 | uri: http://www.manuscriptorium.com/ 143 | - name: Max Planck Institute for European Legal History 144 | uri: http://www.rg.mpg.de/en 145 | - name: MIT Libraries 146 | uri: http://libraries.mit.edu 147 | iiifc: 2 148 | - name: Moravian Library (Moravská zemská knihovna) 149 | uri: https://www.mzk.cz/ 150 | iiifc: 151 | - name: National Gallery of Art 152 | uri: http://www.nga.gov 153 | iiifc: 2 154 | - name: National Library of Austria 155 | uri: https://www.onb.ac.at/en/ 156 | - name: Nasjonalbiblioteket (National Library of Norway) 157 | uri: http://www.nb.no/English 158 | iiifc: 1 159 | - name: National Library of Denmark 160 | uri: http://www.kb.dk/en/ 161 | - name: National Library of Egypt 162 | uri: http://www.darelkotob.gov.eg/index.html 163 | iiifc: 164 | - name: National Library of Israel 165 | uri: http://www.nli.org.il 166 | iiifc: 2 167 | - name: National Library of New Zealand 168 | uri: https://natlib.govt.nz/ 169 | - name: National Library of Poland 170 | uri: http://bn.org.pl 171 | iiifc: 2 172 | - name: National Library of Scotland 173 | uri: http://www.nls.uk/ 174 | iiifc: 2 175 | - name: National Library of Serbia 176 | uri: https://www.nb.rs/?change_lang=en 177 | - name: National Library of Wales 178 | uri: https://www.llgc.org.uk/ 179 | - name: Nationalmuseum Sweden 180 | uri: http://www.nationalmuseum.se 181 | - name: New York University Libraries 182 | uri: http://library.nyu.edu/ 183 | iiifc: 2 184 | - name: North Carolina State University Libraries 185 | uri: https://www.lib.ncsu.edu/ 186 | iiifc: 2 187 | - name: Ohio State University 188 | uri: https://www.osu.edu/ 189 | iiifc: 2 190 | - name: Pennsylvania State University Libraries 191 | uri: https://libraries.psu.edu/ 192 | iiifc: 2 193 | - name: Princeton University Library 194 | uri: http://library.princeton.edu 195 | iiifc: 1 196 | - name: Public Record Office Victoria 197 | uri: https://www.prov.vic.gov.au/ 198 | - name: Qatar National Library 199 | uri: http://www.qnl.qa 200 | - name: Sirma Group 201 | uri: https://sirma.com/ 202 | iiifc: 203 | - name: Smithsonian Institution 204 | uri: https://www.si.edu/ 205 | iiifc: 2 206 | - name: "St. Louis University" 207 | uri: https://www.slu.edu/ 208 | - name: St. Mary's University 209 | uri: http://jubilees.stmarytx.edu 210 | - name: Stanford University 211 | uri: http://library.stanford.edu/ 212 | iiifc: 1 213 | - name: State Library of Queensland 214 | uri: http://www.slq.qld.gov.au/ 215 | iiifc: 216 | - name: Synaptica 217 | uri: http://www.synaptica.com/ 218 | - name: TextGrid 219 | uri: https://textgrid.de/en/ 220 | - name: text & bytes 221 | uri: http://www.textandbytes.com/en 222 | - name: Trinity College Dublin 223 | uri: https://repository.dri.ie 224 | - name: United States Holocaust Memorial Museum 225 | uri: https://www.ushmm.org/ 226 | - name: Universidad de la Habana, Biblioteca Nacional de Cuba José Martí 227 | uri: http://www.bnjm.cu/ 228 | - name: University College Dublin 229 | uri: http://www.ucd.ie/library/ 230 | iiifc: 231 | - name: University of Alberta Libraries 232 | uri: https://www.library.ualberta.ca 233 | iiifc: 234 | - name: University of Basel, Digital Humanities Lab 235 | uri: http://dhlab.unibas.ch/ 236 | iiifc: 2 237 | - name: University of California, Los Angeles 238 | uri: http://www.ucla.edu/ 239 | - name: University of California, Santa Barbara 240 | uri: http://www.ucsb.edu/ 241 | - name: University of Edinburgh 242 | uri: http://www.ed.ac.uk/ 243 | iiifc: 2 244 | - name: University of Glasgow 245 | uri: http://hms.scot/fiddle/copies/ 246 | iiifc: 247 | - name: University of Hong Kong 248 | uri: http://www.hku.hk/ 249 | iiifc: 2 250 | - name: University of Illinois at Urbana-Champaign 251 | uri: http://illinois.edu/ 252 | iiifc: 253 | - name: University of Michigan 254 | uri: https://www.lib.umich.edu/digital-library-platform-services-dlps 255 | iiifc: 2 256 | - name: University of Notre Dame 257 | uri: http://library.nd.edu 258 | iiifc: 2 259 | - name: University of Oklahoma 260 | uri: https://www.ou.edu/ 261 | iiifc: 2 262 | - name: University of Oxford (Bodleian Library) 263 | uri: http://www.bodleian.ox.ac.uk 264 | iiifc: 1 265 | - name: University of Pennsylvania 266 | uri: http://www.upenn.edu/ 267 | iiifc: 2 268 | - name: University of Tokyo 269 | uri: http://21dzk.l.u-tokyo.ac.jp/DHI/ 270 | iiifc: 2 271 | - name: University of Toronto 272 | uri: https://library.utoronto.ca 273 | iiifc: 2 274 | - name: University of Utah 275 | uri: https://lib.utah.edu/ 276 | iiifc: 277 | - name: University of Virginia Library 278 | uri: http://www.library.virginia.edu/ 279 | iiifc: 280 | - name: Vatican Library 281 | uri: https://www.vatlib.it 282 | iiifc: 2 283 | - name: Villanova University 284 | uri: https://digital.library.villanova.edu/ 285 | iiifc: 286 | - name: Walter J. Ong, S.J. Center for Digital Humanities at Saint Louis University 287 | uri: https://www.slu.edu/center-for-digital-humanities 288 | iiifc: 2 289 | - name: The Walters Art Museum 290 | uri: http://thewalters.org 291 | iiifc: 292 | - name: Wellcome Trust 293 | uri: http://wellcomelibrary.org 294 | iiifc: 1 295 | - name: Wikipedia (Wikimedia Foundation) 296 | uri: http://www.wikipedia.org/ 297 | iiifc: 298 | - name: World Digital Library 299 | uri: http://www.wdl.org 300 | - name: Yale Center for British Art 301 | uri: http://britishart.yale.edu/ 302 | iiifc: 1 303 | - name: Yale University 304 | uri: https://www.yale.edu/ 305 | iiifc: 1 306 | - name: Zegami 307 | uri: https://zegami.com/ 308 | -------------------------------------------------------------------------------- /source/api/harvest/0.1/activities.md: -------------------------------------------------------------------------------- 1 | # IIIF Resource Discovery: Activities 2 | 3 | This approach to the discovery of IIIF Resources uses standard, semantic technologies for easy optimization of crawling and indexing processes. The core technology choice, as agreed upon at the Toronto Working Groups meeting, is the W3C's [ActivityStreams 2.0](https://www.w3.org/TR/activitystreams-core/) specification. 4 | 5 | ## Types of Activity 6 | 7 | ### Single-Resource Publisher Operations 8 | 9 | #### Create 10 | 11 | Level: 1 12 | 13 | The object resource came into existence. Before this time it did not exist, and the state of the resource is the first state. 14 | 15 | __Use Case:__ As a content publisher, I want to alert search engines that I created a new Manifest, so that they can harvest and index it. 16 | 17 | ```json 18 | { 19 | "id": "http://example.org/iiif/discovery/event/54627", 20 | "type": "Create", 21 | "object": { 22 | "id": "https://example.org/iiif/museum/1/manifest.json", 23 | "type": "Manifest" 24 | }, 25 | "endTime": "2017-06-08T00:00:00Z" 26 | } 27 | ``` 28 | 29 | 30 | #### Update / Modify 31 | 32 | Level: 0 33 | 34 | A resource that was already created was changed, or was created and the activity is published by a system that cannot distinguish modification from creation. Any previous state may also be available at another URI. 35 | 36 | __Use Case:__ As a content publisher, I want to alert search engines that I updated a Manifest, so that they can re-harvest and update their indexes. 37 | 38 | ```json 39 | { 40 | "id": "http://example.org/iiif/discovery/event/100001", 41 | "type": "Update", 42 | "object": { 43 | "id": "https://example.org/iiif/museum/1/manifest.json", 44 | "type": "Manifest" 45 | }, 46 | "endTime": "2017-09-19T20:00:00Z" 47 | } 48 | ``` 49 | 50 | #### Delete 51 | 52 | Level: 2 53 | 54 | A resource that was already created was taken out of existence. After this time, the resource does not exist, and previous states may be available at other URIs. 55 | 56 | __Use Case:__ As a content publisher, I want to alert search engines that I deleted a Manifest, so that they can remove it from their indexes. 57 | 58 | ```json 59 | { 60 | "id": "http://example.org/iiif/discovery/event/8172645", 61 | "type": "Delete", 62 | "object": { 63 | "id": "https://example.org/iiif/museum/1/manifest.json", 64 | "type": "Manifest" 65 | }, 66 | "endTime": "2017-09-19T20:00:00Z" 67 | } 68 | ``` 69 | 70 | 71 | ### Multi-Resource Publisher Operations 72 | 73 | These operations are compositions of the above in terms of the effects on different resources, but should be treated as a single operation for the purpose of notification and replay. These are more appropriate for true synchronization systems, rather than simple crawling and discovery. 74 | 75 | The advantage to using them is that they frequently do not require the resources to be re-harvested, instead all of the necessary information about the change is included in the activity itself. 76 | 77 | #### Add 78 | 79 | Level: 4 80 | 81 | The `object` resource was added to the `target`, such as a Manifest being added to a Collection. 82 | 83 | For the purposes of discovery systems, the inclusion of the manifest in the collection might affect indexing, if there are per-collection indexes, even if there are no other changes to the Collection or Manifest. Instead of an Update to the Collection, this allows the actual change to be communicated so that the Collection document does not need to be re-harvested. 84 | 85 | __Use Case:__ As a content publisher, I want to alert search engines that I added a Manifest to a particular Collection, such that a Collection-specific index can be updated. 86 | 87 | ```json 88 | { 89 | "id": "http://example.org/iiif/discovery/event/123462", 90 | "type": "Add", 91 | "object": { 92 | "id": "https://example.org/iiif/museum/1/manifest.json", 93 | "type": "Manifest" 94 | }, 95 | "target": { 96 | "id": "https://example.org/iiif/museum/paintings/collection.json", 97 | "type": "Collection" 98 | }, 99 | "endTime": "2017-09-19T20:00:00Z" 100 | } 101 | ``` 102 | 103 | #### Remove 104 | 105 | Level: 4 106 | 107 | The `object` resource was removed from the `origin` resource, such as removing a Manifest from a Collection. 108 | 109 | This is the inverse of `Add` for the indexing management of the membership of Collections. 110 | 111 | __Use Case:__ As a content publisher, I want to alert search engines that I removed a Manifest from a particular Collection, such that a Collection-specific index can be updated. 112 | 113 | ```json 114 | { 115 | "id": "http://example.org/iiif/discovery/event/123462", 116 | "type": "Remove", 117 | "object": { 118 | "id": "https://example.org/iiif/museum/1/manifest.json", 119 | "type": "Manifest" 120 | }, 121 | "origin": { 122 | "id": "https://example.org/iiif/museum/paintings/collection.json", 123 | "type": "Collection" 124 | }, 125 | "endTime": "2017-09-19T20:00:00Z" 126 | } 127 | ``` 128 | 129 | 130 | #### Copy 131 | 132 | Minimum Level: 3 133 | 134 | The source resource was duplicated to create or modify the target resource. This activity is not a core ActivityStreams type. 135 | 136 | For the purposes of discovery, the object resource's representation can be treated as the target resource's representation, but the object resource should not (yet) be removed from the index. This does not require the target resource to be re-harvested. 137 | 138 | __Use Case:__ Needed for Copy to be included. Does anyone actually copy rather than move, under what circumstances, and why? 139 | {: .warning} 140 | 141 | ```json 142 | { 143 | "id": "http://example.org/iiif/discovery/event/123462", 144 | "type": "Copy", 145 | "object": { 146 | "id": "https://example.org/iiif/museum/1/manifest.json", 147 | "type": "Manifest" 148 | }, 149 | "target": { 150 | "id": "https://example.org/iiif/publications/102314/manifest.json", 151 | "type": "Manifest" 152 | }, 153 | "endTime": "2017-09-19T20:00:00Z" 154 | } 155 | ``` 156 | 157 | #### Rename / Move 158 | 159 | Minimum Level: 4 160 | 161 | The object resource is duplicated to create or modify the target resource, and the original was deleted as part of the operation. 162 | 163 | For the purposes of discovery, the representation of the object resource should now be treated as the representation of the target resource, and the object resource removed from the index. This does not require the target resource to be reharvested. 164 | 165 | __Use Case:__ As a content publisher, I want to alert search engines that I have changed my URI patterns and thereby moved a Manifest to a different URI, such that the indexes can be updated to point to the new location. 166 | 167 | ```json 168 | { 169 | "id": "http://example.org/iiif/discovery/event/123462", 170 | "type": "Move", 171 | "object": { 172 | "id": "https://example.org/iiif/museum/1/manifest.json", 173 | "type": "Manifest" 174 | }, 175 | "target": { 176 | "id": "https://example.org/iiif/publications/102314/manifest.json", 177 | "type": "Manifest" 178 | }, 179 | "endTime": "2017-09-19T20:00:00Z" 180 | } 181 | ``` 182 | 183 | #### Merge 184 | 185 | Minumum Level: 4 186 | 187 | Two or more source resources were combined to create or modify the target resource. This activity is not a core ActivityStreams type. 188 | 189 | For the purposes of discovery, as the merge is not necessarily complete, nor is it clear whether or not the merged resources were deleted or modified as part of the process, all of the resources should be reharvested. The user interface for the discovery system might wish to group them together in some way to visualize the merge to the user. 190 | 191 | __Use Case:__ Needed. While symmetrical with Split, we need an actual use case for when and why anyone would merge resources. 192 | {: .warning} 193 | 194 | ```json 195 | { 196 | "id": "http://example.org/iiif/discovery/event/123462", 197 | "type": "Merge", 198 | "object": [ 199 | { 200 | "id": "https://example.org/iiif/museum/1/manifest.json", 201 | "type": "Manifest" 202 | }, 203 | { 204 | "id": "https://example.org/iiif/museum/2/manifest.json", 205 | "type": "Manifest" 206 | } 207 | ], 208 | "target": { 209 | "id": "https://example.org/iiif/museum/1726/manifest.json", 210 | "type": "Manifest" 211 | }, 212 | "endTime": "2017-09-19T20:00:00Z" 213 | } 214 | ``` 215 | 216 | #### Split 217 | 218 | Minumum Level: 4 219 | 220 | A single source resource was divided to create or modify multiple target resources. 221 | 222 | For the purposes of discovery, as the split is not necessarily complete, nor is it clear whether or not the original resource was deleted or modified as part of the process, all of the resources should be reharvested. 223 | 224 | __Use Case:__ As a content publisher, I want to alert search engines that I split a Manifest representing a large archive into smaller pieces, where each piece better represents an object, and thus for search engines to reharvest all of the pieces. Note that there is no distinction between Split and Delete+Create+Create as everything needs to be harvested. Better use case required. 225 | {: .warning} 226 | 227 | 228 | ```json 229 | { 230 | "id": "http://example.org/iiif/discovery/event/123462", 231 | "type": "Split", 232 | "object": { 233 | "id": "https://example.org/iiif/museum/1726/manifest.json", 234 | "type": "Manifest" 235 | }, 236 | "target": [ 237 | { 238 | "id": "https://example.org/iiif/museum/1/manifest.json", 239 | "type": "Manifest" 240 | }, 241 | { 242 | "id": "https://example.org/iiif/museum/2/manifest.json", 243 | "type": "Manifest" 244 | } 245 | ], 246 | "endTime": "2017-09-19T20:00:00Z" 247 | } 248 | ``` 249 | 250 | ### Third Party Operations 251 | 252 | These operations are carried out by third parties, rather than the publisher. As such they would be written to the Inbox of the resource as either a request to modify the resource, or just notification that the resource was used. 253 | 254 | 255 | #### Reference 256 | 257 | Minimum Level: 3 258 | 259 | A remote source resource has a new reference or link to the target local resource. 260 | 261 | ```json 262 | { 263 | "id": "http://example.org/iiif/discovery/event/8172645", 264 | "type": "Reference", 265 | "object": { 266 | "id": "https://example.edu/iiif/9/manifest.json", 267 | "type": "Manifest" 268 | }, 269 | "target": { 270 | "id": "https://example.org/iiif/museum/1/manifest.json", 271 | "type": "Manifest" 272 | }, 273 | "endTime": "2017-09-19T20:00:00Z" 274 | } 275 | ``` 276 | 277 | 278 | #### Use 279 | 280 | Minimum Level: 3 281 | 282 | The target resource was used by the remote agent in some way. 283 | 284 | ```json 285 | { 286 | "id": "http://example.org/iiif/discovery/event/8172645", 287 | "type": "Use", 288 | "object": { 289 | "id": "https://example.org/iiif/museum/1/manifest.json", 290 | "type": "Manifest" 291 | }, 292 | "endTime": "2017-09-19T20:00:00Z" 293 | } 294 | ``` 295 | 296 | -------------------------------------------------------------------------------- /source/css/normalize.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v1.1.2 | MIT License | git.io/normalize */ 2 | 3 | /* ========================================================================== 4 | HTML5 display definitions 5 | ========================================================================== */ 6 | 7 | /** 8 | * Correct `block` display not defined in IE 6/7/8/9 and Firefox 3. 9 | */ 10 | 11 | article, 12 | aside, 13 | details, 14 | figcaption, 15 | figure, 16 | footer, 17 | header, 18 | hgroup, 19 | main, 20 | nav, 21 | section, 22 | summary { 23 | display: block; 24 | } 25 | 26 | /** 27 | * Correct `inline-block` display not defined in IE 6/7/8/9 and Firefox 3. 28 | */ 29 | 30 | audio, 31 | canvas, 32 | video { 33 | display: inline-block; 34 | *display: inline; 35 | *zoom: 1; 36 | } 37 | 38 | /** 39 | * Prevent modern browsers from displaying `audio` without controls. 40 | * Remove excess height in iOS 5 devices. 41 | */ 42 | 43 | audio:not([controls]) { 44 | display: none; 45 | height: 0; 46 | } 47 | 48 | /** 49 | * Address styling not present in IE 7/8/9, Firefox 3, and Safari 4. 50 | * Known issue: no IE 6 support. 51 | */ 52 | 53 | [hidden] { 54 | display: none; 55 | } 56 | 57 | /* ========================================================================== 58 | Base 59 | ========================================================================== */ 60 | 61 | /** 62 | * 1. Correct text resizing oddly in IE 6/7 when body `font-size` is set using 63 | * `em` units. 64 | * 2. Prevent iOS text size adjust after orientation change, without disabling 65 | * user zoom. 66 | */ 67 | 68 | html { 69 | font-size: 100%; /* 1 */ 70 | -ms-text-size-adjust: 100%; /* 2 */ 71 | -webkit-text-size-adjust: 100%; /* 2 */ 72 | } 73 | 74 | /** 75 | * Address `font-family` inconsistency between `textarea` and other form 76 | * elements. 77 | */ 78 | 79 | html, 80 | button, 81 | input, 82 | select, 83 | textarea { 84 | font-family: sans-serif; 85 | } 86 | 87 | /** 88 | * Address margins handled incorrectly in IE 6/7. 89 | */ 90 | 91 | body { 92 | margin: 0; 93 | } 94 | 95 | /* ========================================================================== 96 | Links 97 | ========================================================================== */ 98 | 99 | /** 100 | * Address `outline` inconsistency between Chrome and other browsers. 101 | */ 102 | 103 | a:focus { 104 | outline: thin dotted; 105 | } 106 | 107 | /** 108 | * Improve readability when focused and also mouse hovered in all browsers. 109 | */ 110 | 111 | a:active, 112 | a:hover { 113 | outline: 0; 114 | } 115 | 116 | /* ========================================================================== 117 | Typography 118 | ========================================================================== */ 119 | 120 | /** 121 | * Address font sizes and margins set differently in IE 6/7. 122 | * Address font sizes within `section` and `article` in Firefox 4+, Safari 5, 123 | * and Chrome. 124 | */ 125 | 126 | h1 { 127 | font-size: 2em; 128 | margin: 0.67em 0; 129 | } 130 | 131 | h2 { 132 | font-size: 1.5em; 133 | margin: 0.83em 0; 134 | } 135 | 136 | h3 { 137 | font-size: 1.17em; 138 | margin: 1em 0; 139 | } 140 | 141 | h4 { 142 | font-size: 1em; 143 | margin: 1.33em 0; 144 | } 145 | 146 | h5 { 147 | font-size: 0.83em; 148 | margin: 1.67em 0; 149 | } 150 | 151 | h6 { 152 | font-size: 0.67em; 153 | margin: 2.33em 0; 154 | } 155 | 156 | /** 157 | * Address styling not present in IE 7/8/9, Safari 5, and Chrome. 158 | */ 159 | 160 | abbr[title] { 161 | border-bottom: 1px dotted; 162 | } 163 | 164 | /** 165 | * Address style set to `bolder` in Firefox 3+, Safari 4/5, and Chrome. 166 | */ 167 | 168 | b, 169 | strong { 170 | font-weight: bold; 171 | } 172 | 173 | blockquote { 174 | margin: 1em 40px; 175 | } 176 | 177 | /** 178 | * Address styling not present in Safari 5 and Chrome. 179 | */ 180 | 181 | dfn { 182 | font-style: italic; 183 | } 184 | 185 | /** 186 | * Address differences between Firefox and other browsers. 187 | * Known issue: no IE 6/7 normalization. 188 | */ 189 | 190 | hr { 191 | -moz-box-sizing: content-box; 192 | box-sizing: content-box; 193 | height: 0; 194 | } 195 | 196 | /** 197 | * Address styling not present in IE 6/7/8/9. 198 | */ 199 | 200 | mark { 201 | background: #ff0; 202 | color: #000; 203 | } 204 | 205 | /** 206 | * Address margins set differently in IE 6/7. 207 | */ 208 | 209 | p, 210 | pre { 211 | margin: 1em 0; 212 | } 213 | 214 | /** 215 | * Correct font family set oddly in IE 6, Safari 4/5, and Chrome. 216 | */ 217 | 218 | code, 219 | kbd, 220 | pre, 221 | samp { 222 | font-family: monospace, serif; 223 | _font-family: 'courier new', monospace; 224 | font-size: 1em; 225 | } 226 | 227 | /** 228 | * Improve readability of pre-formatted text in all browsers. 229 | */ 230 | 231 | pre { 232 | white-space: pre; 233 | white-space: pre-wrap; 234 | word-wrap: break-word; 235 | } 236 | 237 | /** 238 | * Address CSS quotes not supported in IE 6/7. 239 | */ 240 | 241 | q { 242 | quotes: none; 243 | } 244 | 245 | /** 246 | * Address `quotes` property not supported in Safari 4. 247 | */ 248 | 249 | q:before, 250 | q:after { 251 | content: ''; 252 | content: none; 253 | } 254 | 255 | /** 256 | * Address inconsistent and variable font size in all browsers. 257 | */ 258 | 259 | small { 260 | font-size: 80%; 261 | } 262 | 263 | /** 264 | * Prevent `sub` and `sup` affecting `line-height` in all browsers. 265 | */ 266 | 267 | sub, 268 | sup { 269 | font-size: 75%; 270 | line-height: 0; 271 | position: relative; 272 | vertical-align: baseline; 273 | } 274 | 275 | sup { 276 | top: -0.5em; 277 | } 278 | 279 | sub { 280 | bottom: -0.25em; 281 | } 282 | 283 | /* ========================================================================== 284 | Lists 285 | ========================================================================== */ 286 | 287 | /** 288 | * Address margins set differently in IE 6/7. 289 | */ 290 | 291 | dl, 292 | menu, 293 | ol, 294 | ul { 295 | margin: 1em 0; 296 | } 297 | 298 | dd { 299 | margin: 0 0 0 40px; 300 | } 301 | 302 | /** 303 | * Address paddings set differently in IE 6/7. 304 | */ 305 | 306 | menu, 307 | ol, 308 | ul { 309 | padding: 0 0 0 40px; 310 | } 311 | 312 | /** 313 | * Correct list images handled incorrectly in IE 7. 314 | */ 315 | 316 | nav ul, 317 | nav ol { 318 | list-style: none; 319 | list-style-image: none; 320 | } 321 | 322 | /* ========================================================================== 323 | Embedded content 324 | ========================================================================== */ 325 | 326 | /** 327 | * 1. Remove border when inside `a` element in IE 6/7/8/9 and Firefox 3. 328 | * 2. Improve image quality when scaled in IE 7. 329 | */ 330 | 331 | img { 332 | border: 0; /* 1 */ 333 | -ms-interpolation-mode: bicubic; /* 2 */ 334 | } 335 | 336 | /** 337 | * Correct overflow displayed oddly in IE 9. 338 | */ 339 | 340 | svg:not(:root) { 341 | overflow: hidden; 342 | } 343 | 344 | /* ========================================================================== 345 | Figures 346 | ========================================================================== */ 347 | 348 | /** 349 | * Address margin not present in IE 6/7/8/9, Safari 5, and Opera 11. 350 | */ 351 | 352 | figure { 353 | margin: 0; 354 | } 355 | 356 | /* ========================================================================== 357 | Forms 358 | ========================================================================== */ 359 | 360 | /** 361 | * Correct margin displayed oddly in IE 6/7. 362 | */ 363 | 364 | form { 365 | margin: 0; 366 | } 367 | 368 | /** 369 | * Define consistent border, margin, and padding. 370 | */ 371 | 372 | fieldset { 373 | border: 1px solid #c0c0c0; 374 | margin: 0 2px; 375 | padding: 0.35em 0.625em 0.75em; 376 | } 377 | 378 | /** 379 | * 1. Correct color not being inherited in IE 6/7/8/9. 380 | * 2. Correct text not wrapping in Firefox 3. 381 | * 3. Correct alignment displayed oddly in IE 6/7. 382 | */ 383 | 384 | legend { 385 | border: 0; /* 1 */ 386 | padding: 0; 387 | white-space: normal; /* 2 */ 388 | *margin-left: -7px; /* 3 */ 389 | } 390 | 391 | /** 392 | * 1. Correct font size not being inherited in all browsers. 393 | * 2. Address margins set differently in IE 6/7, Firefox 3+, Safari 5, 394 | * and Chrome. 395 | * 3. Improve appearance and consistency in all browsers. 396 | */ 397 | 398 | button, 399 | input, 400 | select, 401 | textarea { 402 | font-size: 100%; /* 1 */ 403 | margin: 0; /* 2 */ 404 | vertical-align: baseline; /* 3 */ 405 | *vertical-align: middle; /* 3 */ 406 | } 407 | 408 | /** 409 | * Address Firefox 3+ setting `line-height` on `input` using `!important` in 410 | * the UA stylesheet. 411 | */ 412 | 413 | button, 414 | input { 415 | line-height: normal; 416 | } 417 | 418 | /** 419 | * Address inconsistent `text-transform` inheritance for `button` and `select`. 420 | * All other form control elements do not inherit `text-transform` values. 421 | * Correct `button` style inheritance in Chrome, Safari 5+, and IE 6+. 422 | * Correct `select` style inheritance in Firefox 4+ and Opera. 423 | */ 424 | 425 | button, 426 | select { 427 | text-transform: none; 428 | } 429 | 430 | /** 431 | * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` 432 | * and `video` controls. 433 | * 2. Correct inability to style clickable `input` types in iOS. 434 | * 3. Improve usability and consistency of cursor style between image-type 435 | * `input` and others. 436 | * 4. Remove inner spacing in IE 7 without affecting normal text inputs. 437 | * Known issue: inner spacing remains in IE 6. 438 | */ 439 | 440 | button, 441 | html input[type="button"], /* 1 */ 442 | input[type="reset"], 443 | input[type="submit"] { 444 | -webkit-appearance: button; /* 2 */ 445 | cursor: pointer; /* 3 */ 446 | *overflow: visible; /* 4 */ 447 | } 448 | 449 | /** 450 | * Re-set default cursor for disabled elements. 451 | */ 452 | 453 | button[disabled], 454 | html input[disabled] { 455 | cursor: default; 456 | } 457 | 458 | /** 459 | * 1. Address box sizing set to content-box in IE 8/9. 460 | * 2. Remove excess padding in IE 8/9. 461 | * 3. Remove excess padding in IE 7. 462 | * Known issue: excess padding remains in IE 6. 463 | */ 464 | 465 | input[type="checkbox"], 466 | input[type="radio"] { 467 | box-sizing: border-box; /* 1 */ 468 | padding: 0; /* 2 */ 469 | *height: 13px; /* 3 */ 470 | *width: 13px; /* 3 */ 471 | } 472 | 473 | /** 474 | * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. 475 | * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome 476 | * (include `-moz` to future-proof). 477 | */ 478 | 479 | input[type="search"] { 480 | -webkit-appearance: textfield; /* 1 */ 481 | -moz-box-sizing: content-box; 482 | -webkit-box-sizing: content-box; /* 2 */ 483 | box-sizing: content-box; 484 | } 485 | 486 | /** 487 | * Remove inner padding and search cancel button in Safari 5 and Chrome 488 | * on OS X. 489 | */ 490 | 491 | input[type="search"]::-webkit-search-cancel-button, 492 | input[type="search"]::-webkit-search-decoration { 493 | -webkit-appearance: none; 494 | } 495 | 496 | /** 497 | * Remove inner padding and border in Firefox 3+. 498 | */ 499 | 500 | button::-moz-focus-inner, 501 | input::-moz-focus-inner { 502 | border: 0; 503 | padding: 0; 504 | } 505 | 506 | /** 507 | * 1. Remove default vertical scrollbar in IE 6/7/8/9. 508 | * 2. Improve readability and alignment in all browsers. 509 | */ 510 | 511 | textarea { 512 | overflow: auto; /* 1 */ 513 | vertical-align: top; /* 2 */ 514 | } 515 | 516 | /* ========================================================================== 517 | Tables 518 | ========================================================================== */ 519 | 520 | /** 521 | * Remove most spacing between table cells. 522 | */ 523 | 524 | table { 525 | border-collapse: collapse; 526 | border-spacing: 0; 527 | } 528 | -------------------------------------------------------------------------------- /source/api/harvest/0.1/index.md: -------------------------------------------------------------------------------- 1 | 2 | # IIIF Resource Discovery - OUT OF DATE 3 | 4 | 5 | __Previous Draft__
    This document is a former draft of the discovery specification, currently available at [http://preview.iiif.io/api/discovery/api/discovery/0.1/](http://preview.iiif.io/api/discovery/api/discovery/0.1/). Please see that specification instead. 6 | {: .warning} 7 | 8 | This approach to the discovery of IIIF Resources uses standard, semantic technologies for easy optimization of crawling and indexing processes. The core technology choice, as agreed upon at the Toronto Working Groups meeting, is the W3C's [ActivityStreams 2.0](https://www.w3.org/TR/activitystreams-core/) specification. 9 | 10 | 11 | ## The Approach 12 | 13 | Following the [design principles](http://iiif.io/api/annex/notes/design_patterns/) of IIIF: 14 | * As Simple as Possible, and No Simpler 15 | * Intelligently Manage Ramping Up 16 | * Avoid Specific Technology implementations 17 | * Follow Resource-Oriented Design 18 | * Follow Linked Data 19 | * Design for JSON-LD First 20 | * Use Standards 21 | * Follow Best Practices 22 | * Loosely couple APIs 23 | * Define Success, not Failure 24 | 25 | And the useful patterns established by the [ResourceSync](http://openarchives.org/rs/1.1/resourcesync) effort: 26 | * List of Resources 27 | * List of Changes 28 | * Notification of Changes 29 | 30 | As scoped by the [IIIF Discovery charter](http://iiif.io/community/groups/discovery/charter/) and [use cases](https://github.com/iiif/iiif-stories/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aopen%20label%3Adiscovery), we have designed an approach towards solving the challenges faced by the community. 31 | 32 | ## Activity Streams 33 | 34 | [Activity Streams](https://www.w3.org/TR/activitystreams-core/) (AS2) is a "model for representing potential and completed activities". IIIF already uses the AS2 Collections and Paging model, as does the [Web Annotation](https://www.w3.org/TR/annotation-model/#collections) work that we depend on. AS2 is designed to be JSON-LD first while still respecting the Linked Open Data paradigm, and follows the best practices defined in the W3C. 35 | 36 | ### List of Resources 37 | 38 | The top level resource for managing the lists of IIIF resources is an AS2 Collection. This model is the same as the Web Annotation model for Annotation Collections and Annotation Pages. AS2 Collections for lists of this size will always be paged, and the Collection document a pointer to the first and last pages, along with metadata about the entire list. 39 | 40 | Therefore, the Collection does not directly contain any of the activities or resources, instead it refers to the `first` page of such a list. The pages are ordered both from page to page by following `next` relationships, and internally within the page in the `items` property. The number of entries in each page is up to the implementer, and cannot be requested by the client. 41 | 42 | ```json-doc 43 | { 44 | "@context": [ 45 | "http://iiif.io/api/presentation/3/context.json", 46 | "https://www.w3.org/ns/activitystreams"], 47 | "id": "https://example.org/iiif/discovery.json", 48 | "type": "Collection", 49 | "label": "Example Big Collection", 50 | "total": 33000, 51 | "first": { 52 | "id": "https://example.org/iiif/discovery-1.json", 53 | "type": "CollectionPage" 54 | }, 55 | "last": { 56 | "id": "https://data.getty.edu/iiif/discovery-10.json", 57 | "type": "CollectionPage" 58 | } 59 | } 60 | ``` 61 | 62 | #### Level 0: Basic Resource List 63 | 64 | The basic information required, in order to provide a minimally effective set of links to Manifests to harvest is just the URIs of the Manifests. However, with the addition of just a little boilerplate in the JSON, we can be on the path towards a robust set of metadata that allows clients to optimize their harvesting. 65 | 66 | Starting with the Manifest links, we add an "Update" activity wrapper around the URIs. The order of the Manifests in the pages is unimportant, but each should only appear once. In terms of optimization, it provides no additional benefit over any other simpler list format, but is compatible with a system where optimization is possible, such as the following levels. This is the minimum level for interoperability, but further levels are significant improvements in terms of efficiency. 67 | 68 | __Usage:__ Crawl the entire set of pages and dereference each manifest to see if it has changed. 69 | 70 | ```json-doc 71 | { 72 | "@context": [ 73 | "http://iiif.io/api/presentation/3/context.json", 74 | "https://www.w3.org/ns/activitystreams"], 75 | "id": "https://example.org/iiif/discovery-1.json", 76 | "type": "CollectionPage", 77 | "partOf": { 78 | "id": "https://example.org/iiif/discovery.json", 79 | "type": "Collection" 80 | }, 81 | "next": { 82 | "id": "https://example.org/iiif/discovery-2.json", 83 | "type": "CollectionPage" 84 | }, 85 | "items": [ 86 | { 87 | "type": "Update", 88 | "object": { 89 | "id": "https://example.org/iiif/museum/1/manifest.json", 90 | "type": "Manifest", 91 | } 92 | }, 93 | { 94 | "type": "Update", 95 | "object": { 96 | "id": "https://example.org/iiif/museum/2/manifest.json", 97 | "type": "Manifest" 98 | } 99 | } 100 | ] 101 | } 102 | ``` 103 | 104 | 105 | #### Level 1: Basic Change List 106 | 107 | The most effective information to add is the datestamp at which the resource was last modified (including the initial modification that created it). If we know these dates, we can add them to the activities and order the list such that the most recent activities occur last. The timestamp is given in the `endTime` property -- the time at which the document update process finished. It is up to the implementer to decide whether the update process includes the publication online, or only the internal data modification, but the decision MUST be consistently applied. 108 | 109 | The rationale for crawling backwards is that the first pages, once finished, become static resources. If the list were ordered from most recent to least, then either the pages would change their URIs, reducing the ability to cache them or the first page would be constantly changing size rather than the last page, which is more familiar. 110 | 111 | Note that the Manifests MAY appear multiple times in the list, or only the most recent change might appear, depending on the implementation. 112 | 113 | __Usage:__ Record each time the list is crawled. Start from the `last` page and work backwards through the list until a datestamp in `endTime` is encountered before the previous time a crawl occurred, and has thus already been processed. 114 | 115 | ```json-doc 116 | { 117 | "@context": [ 118 | "http://iiif.io/api/presentation/3/context.json", 119 | "https://www.w3.org/ns/activitystreams"], 120 | "id": "https://example.org/iiif/discovery-1.json", 121 | "type": "CollectionPage", 122 | "partOf": { 123 | "id": "https://example.org/iiif/discovery.json", 124 | "type": "Collection" 125 | }, 126 | "next": { 127 | "id": "https://data.getty.edu/iiif/discovery-2.json", 128 | "type": "CollectionPage" 129 | }, 130 | "items": [ 131 | { 132 | "type": "Update", 133 | "object": { 134 | "id": "https://data.getty.edu/iiif/museum/1876/manifest.json", 135 | "type": "Manifest" 136 | }, 137 | "endTime": "2017-09-20T00:00:00Z" 138 | }, 139 | { 140 | "type": "Update", 141 | "object": { 142 | "id": "https://data.getty.edu/iiif/museum/33092/manifest.json", 143 | "type": "Manifest" 144 | }, 145 | "endTime": "2017-09-21T00:00:00Z" 146 | } 147 | // ... 148 | ] 149 | } 150 | ``` 151 | 152 | 153 | #### Level 1b: Change List with Metadata 154 | 155 | Additional metadata can be added to the basic change list without affecting the overall crawl behavior. This metadata can include: 156 | 157 | * An identifier for the activity, so it can be referenced externally, given in `id`. 158 | * The actor that performed the activity, given in `actor`. 159 | * The application, tool or service used to perform the activity, given in `instrument`. 160 | * The datestamp of when the activity started, given in `startTime`. 161 | * And any additional information about the Manifest, from the Presentation API. 162 | 163 | __Usage__: Record each time the list is crawled. Start from the `last` page and work backwards through the list until a datestamp before the previous time a crawl occurred is encountered. 164 | 165 | ```json-doc 166 | { 167 | "@context": [ 168 | "http://iiif.io/api/presentation/3/context.json", 169 | "https://www.w3.org/ns/activitystreams"], 170 | "id": "https://example.org/iiif/discovery-1.json", 171 | "type": "CollectionPage", 172 | "partOf": { 173 | "id": "https://example.org/iiif/discovery.json", 174 | "type": "Collection" 175 | }, 176 | "next": { 177 | "id": "https://data.getty.edu/iiif/discovery-2.json", 178 | "type": "CollectionPage" 179 | }, 180 | "items": [ 181 | { 182 | "id": "http://data.getty.edu/iiif/discovery/event/196421", 183 | "type": "Update", 184 | "actor": { 185 | "id": "http://example.org/museum", 186 | "type": "Organization" 187 | }, 188 | "instrument": "http://github.com/example_org/iiif_museum_transformer", 189 | "object": { 190 | "id": "https://data.getty.edu/iiif/museum/33092/manifest.json", 191 | "type": "Manifest", 192 | "label": {"en": ["Example Museum Object"]}, 193 | "within": "https://example.org/iiif/museum/collection/paintings.json" 194 | }, 195 | "startTime": "2017-09-19T20:00:00Z", 196 | "endTime": "2017-09-19T20:01:00Z" 197 | } 198 | ] 199 | } 200 | ``` 201 | 202 | #### Level 2: Complete Change List 203 | 204 | At the most complex level, a log of all of the activities that have taken place can be recorded, with multiple events per resource. This would include Deletes, allowing a synchronization process to remove resources as well as add them. This would also allow for the complete history of a resource to be reconstructed, if each version has an archived representation. The list might end up very long if there are many changes to resources, however this is not a typical situation as far as we know, and the cost is still not terrible as each entry is short and can be compressed both on disk and at the HTTP(S) transport layer. 205 | 206 | The core activity types are: 207 | 208 | * `Create`: The initial creation of the resource. Each resource must have at most one Create event in which it is the `object`. 209 | * `Update`: Any change to the resource. In a system that does not distinguish creation from modification, then all changes MAY be `Update`s. 210 | * `Delete`: The deletion of the resource, or its de-publication from the web. 211 | 212 | Additional activities which institutions may also find helpful are listed [in this annex](activities.md/). 213 | 214 | __Usage:__ Record each time the list is crawled. Start from the `last` page and work backwards through the list until a datestamp before the previous time a crawl occurred is encountered. Only process the most recent change per resource, including deleting resources. 215 | 216 | ```json-doc 217 | { 218 | "@context": [ 219 | "http://iiif.io/api/presentation/3/context.json", 220 | "https://www.w3.org/ns/activitystreams"], 221 | "id": "https://example.org/iiif/discovery-1.json", 222 | "type": "CollectionPage", 223 | "partOf": { 224 | "id": "https://example.org/iiif/discovery.json", 225 | "type": "Collection" 226 | }, 227 | "next": { 228 | "id": "https://example.org/iiif/discovery-2.json", 229 | "type": "CollectionPage" 230 | }, 231 | "items": [ 232 | { 233 | "id": "http://data.getty.edu/iiif/discovery/event/196421", 234 | "type": "Delete", 235 | "object": { 236 | "id": "https://data.getty.edu/iiif/museum/1/manifest.json", 237 | "type": "Manifest" 238 | }, 239 | "endTime": "2017-09-25T20:00:01Z" 240 | }, 241 | { 242 | "id": "http://data.getty.edu/iiif/discovery/event/100001", 243 | "type": "Update", 244 | "object": { 245 | "id": "https://data.getty.edu/iiif/museum/1/manifest.json", 246 | "type": "Manifest" 247 | }, 248 | "endTime": "2017-09-19T20:01:00Z" 249 | }, 250 | { 251 | "id": "http://data.getty.edu/iiif/discovery/event/54627", 252 | "type": "Create", 253 | "object": { 254 | "id": "https://data.getty.edu/iiif/museum/1/manifest.json", 255 | "type": "Manifest" 256 | }, 257 | "endTime": "2017-06-07T08:00:30Z" 258 | } 259 | ] 260 | } 261 | ``` 262 | 263 | ## Processing Algorithm 264 | 265 | The aim of the processing algorithm is to inform harvesters how to make best use of the available information, with an aim of finding "indexable content" -- the descriptive information that might be used to build an index of the resources to allow them to be discovered. For different types of resource, and for different domains, the "indexable content" will have different formats and semantics. At worst, the data in the Manifest and other IIIF resources might be used, despite its presentational intent. 266 | 267 | __Collection Algorithm__ 268 | 269 | Given the URI of an ActivityStreams Collection (`collection`) as input, a conforming processor SHOULD: 270 | 271 | 1. Initialization: 272 | 1. Let `processedItems` be an empty array 273 | 2. Let `lastCrawl` be the timestamp of the previous time the algorithm was executed 274 | 2. Retrieve the representation of `collection` via HTTP(S) 275 | 3. Minimally validate that it conforms to the specification 276 | 4. Find the URI of the last page at `collection.last.id` (`pageN`) 277 | 5. Apply the results of the page algorithm to `pageN` 278 | 279 | 280 | __Page Algorithm__ 281 | 282 | Given the URI of an ActivityStreams CollectionPage (`page`) and the date of last crawling (`lastCrawl`) as input, a conforming processor SHOULD: 283 | 284 | 1. Retrieve the representation of `page` via HTTP(S) 285 | 2. Minimally validate that it conforms to the specification 286 | 3. Find the set of updates of the page at `page.items` (`items`) 287 | 4. In reverse order, iterate through the activities (`activity`) in `items` 288 | 1. For each `activity`, if `activity.endTime` is before `lastCrawl`, then terminate ; 289 | 2. If the updated resource's uri at `activity.target.id` is in `processedItems`, then continue ; 290 | 3. Otherwise, if `activity.type` is `Update` or `Create`, then find the URI of the updated resource at `activity.target.id` (`target`) and apply the target resource algorithm ; 291 | 4. Otherwise, if `activity.type` is `Delete`, then find the URI of the deleted resource at `activity.target.id` and remove it from the index. 292 | 5. Add the processed resource's URI to `processedItems` 293 | 5. Finally, find the URI of the previous page at `collection.prev.id` (`pageN1`) 294 | 6. Apply the results of the page algorithm to `pageN1` 295 | 296 | __Target Resource Algorithm__ 297 | 298 | Given the URI of a target resource (`target`), a conforming processor SHOULD: 299 | 300 | 1. Retrieve the representation of `target` via HTTP(S) 301 | 2. Minimally validate that it conforms to the appropriate specification 302 | 3. Find the URI of the resource at `target.id` (`targetId`) 303 | 4. If the resource has the `seeAlso` property, then for each resource referenced ('extref') 304 | 1. If the `format` and/or `profile` of `extref` is understood by the processor, then it should retrieve any representations that it can process to extract Indexable Content. 305 | 5. Otherwise, extract any indexable content from the resource's representation, using resource type specific functionality. 306 | 6. Index the content against `targetId` 307 | 308 | 309 | ## Ongoing Experiments 310 | 311 | * Digirati 312 | * Endpoint: https://mcgrattan.org/as/ 313 | * Implementation: https://github.com/mattmcgrattan/iiif-activity-streams 314 | 315 | * OCLC 316 | * Endpoint: http://52.204.112.237:3051/activity-streams 317 | * Implementation: https://github.com/mixterj/iiif_activity_streams_creation 318 | * Consumer: https://github.com/mixterj/activity_streams_harvest 319 | 320 | * NCSU 321 | * Endpoint: https://d.lib.ncsu.edu/collections/iiif-discovery.json 322 | 323 | * IIIF 324 | * Endpoint: http://preview.iiif.io/root/discovery_list/community/groups/discovery/registry_as.json 325 | -------------------------------------------------------------------------------- /source/js/vendor/modernizr-2.6.2-respond-1.1.0.min.js: -------------------------------------------------------------------------------- 1 | /* Modernizr 2.6.2 (Custom Build) | MIT & BSD 2 | * Build: http://modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-canvas-canvastext-draganddrop-hashchange-history-audio-video-indexeddb-input-inputtypes-localstorage-postmessage-sessionstorage-websockets-websqldatabase-webworkers-geolocation-inlinesvg-smil-svg-svgclippaths-touch-webgl-shiv-mq-cssclasses-addtest-prefixed-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-load 3 | */ 4 | ;window.Modernizr=function(a,b,c){function D(a){j.cssText=a}function E(a,b){return D(n.join(a+";")+(b||""))}function F(a,b){return typeof a===b}function G(a,b){return!!~(""+a).indexOf(b)}function H(a,b){for(var d in a){var e=a[d];if(!G(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function I(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:F(f,"function")?f.bind(d||b):f}return!1}function J(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+p.join(d+" ")+d).split(" ");return F(b,"string")||F(b,"undefined")?H(e,b):(e=(a+" "+q.join(d+" ")+d).split(" "),I(e,b,c))}function K(){e.input=function(c){for(var d=0,e=c.length;d',a,""].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},z=function(b){var c=a.matchMedia||a.msMatchMedia;if(c)return c(b).matches;var d;return y("@media "+b+" { #"+h+" { position: absolute; } }",function(b){d=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle)["position"]=="absolute"}),d},A=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;return f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=F(e[d],"function"),F(e[d],"undefined")||(e[d]=c),e.removeAttribute(d))),e=null,f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),B={}.hasOwnProperty,C;!F(B,"undefined")&&!F(B.call,"undefined")?C=function(a,b){return B.call(a,b)}:C=function(a,b){return b in a&&F(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=w.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(w.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(w.call(arguments)))};return e}),s.flexbox=function(){return J("flexWrap")},s.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},s.canvastext=function(){return!!e.canvas&&!!F(b.createElement("canvas").getContext("2d").fillText,"function")},s.webgl=function(){return!!a.WebGLRenderingContext},s.touch=function(){var c;return"ontouchstart"in a||a.DocumentTouch&&b instanceof DocumentTouch?c=!0:y(["@media (",n.join("touch-enabled),("),h,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(a){c=a.offsetTop===9}),c},s.geolocation=function(){return"geolocation"in navigator},s.postmessage=function(){return!!a.postMessage},s.websqldatabase=function(){return!!a.openDatabase},s.indexedDB=function(){return!!J("indexedDB",a)},s.hashchange=function(){return A("hashchange",a)&&(b.documentMode===c||b.documentMode>7)},s.history=function(){return!!a.history&&!!history.pushState},s.draganddrop=function(){var a=b.createElement("div");return"draggable"in a||"ondragstart"in a&&"ondrop"in a},s.websockets=function(){return"WebSocket"in a||"MozWebSocket"in a},s.rgba=function(){return D("background-color:rgba(150,255,150,.5)"),G(j.backgroundColor,"rgba")},s.hsla=function(){return D("background-color:hsla(120,40%,100%,.5)"),G(j.backgroundColor,"rgba")||G(j.backgroundColor,"hsla")},s.multiplebgs=function(){return D("background:url(https://),url(https://),red url(https://)"),/(url\s*\(.*?){3}/.test(j.background)},s.backgroundsize=function(){return J("backgroundSize")},s.borderimage=function(){return J("borderImage")},s.borderradius=function(){return J("borderRadius")},s.boxshadow=function(){return J("boxShadow")},s.textshadow=function(){return b.createElement("div").style.textShadow===""},s.opacity=function(){return E("opacity:.55"),/^0.55$/.test(j.opacity)},s.cssanimations=function(){return J("animationName")},s.csscolumns=function(){return J("columnCount")},s.cssgradients=function(){var a="background-image:",b="gradient(linear,left top,right bottom,from(#9f9),to(white));",c="linear-gradient(left top,#9f9, white);";return D((a+"-webkit- ".split(" ").join(b+a)+n.join(c+a)).slice(0,-a.length)),G(j.backgroundImage,"gradient")},s.cssreflections=function(){return J("boxReflect")},s.csstransforms=function(){return!!J("transform")},s.csstransforms3d=function(){var a=!!J("perspective");return a&&"webkitPerspective"in g.style&&y("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(b,c){a=b.offsetLeft===9&&b.offsetHeight===3}),a},s.csstransitions=function(){return J("transition")},s.fontface=function(){var a;return y('@font-face {font-family:"font";src:url("https://")}',function(c,d){var e=b.getElementById("smodernizr"),f=e.sheet||e.styleSheet,g=f?f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"":"";a=/src/i.test(g)&&g.indexOf(d.split(" ")[0])===0}),a},s.generatedcontent=function(){var a;return y(["#",h,"{font:0/0 a}#",h,':after{content:"',l,'";visibility:hidden;font:3px/1 a}'].join(""),function(b){a=b.offsetHeight>=3}),a},s.video=function(){var a=b.createElement("video"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),c.h264=a.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,"")}catch(d){}return c},s.audio=function(){var a=b.createElement("audio"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),c.mp3=a.canPlayType("audio/mpeg;").replace(/^no$/,""),c.wav=a.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),c.m4a=(a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;")).replace(/^no$/,"")}catch(d){}return c},s.localstorage=function(){try{return localStorage.setItem(h,h),localStorage.removeItem(h),!0}catch(a){return!1}},s.sessionstorage=function(){try{return sessionStorage.setItem(h,h),sessionStorage.removeItem(h),!0}catch(a){return!1}},s.webworkers=function(){return!!a.Worker},s.applicationcache=function(){return!!a.applicationCache},s.svg=function(){return!!b.createElementNS&&!!b.createElementNS(r.svg,"svg").createSVGRect},s.inlinesvg=function(){var a=b.createElement("div");return a.innerHTML="",(a.firstChild&&a.firstChild.namespaceURI)==r.svg},s.smil=function(){return!!b.createElementNS&&/SVGAnimate/.test(m.call(b.createElementNS(r.svg,"animate")))},s.svgclippaths=function(){return!!b.createElementNS&&/SVGClipPath/.test(m.call(b.createElementNS(r.svg,"clipPath")))};for(var L in s)C(s,L)&&(x=L.toLowerCase(),e[x]=s[L](),v.push((e[x]?"":"no-")+x));return e.input||K(),e.addTest=function(a,b){if(typeof a=="object")for(var d in a)C(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},D(""),i=k=null,function(a,b){function k(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function l(){var a=r.elements;return typeof a=="string"?a.split(" "):a}function m(a){var b=i[a[g]];return b||(b={},h++,a[g]=h,i[h]=b),b}function n(a,c,f){c||(c=b);if(j)return c.createElement(a);f||(f=m(c));var g;return f.cache[a]?g=f.cache[a].cloneNode():e.test(a)?g=(f.cache[a]=f.createElem(a)).cloneNode():g=f.createElem(a),g.canHaveChildren&&!d.test(a)?f.frag.appendChild(g):g}function o(a,c){a||(a=b);if(j)return a.createDocumentFragment();c=c||m(a);var d=c.frag.cloneNode(),e=0,f=l(),g=f.length;for(;e",f="hidden"in a,j=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){f=!0,j=!0}})();var r={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,supportsUnknownElements:j,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:q,createElement:n,createDocumentFragment:o};a.html5=r,q(b)}(this,b),e._version=d,e._prefixes=n,e._domPrefixes=q,e._cssomPrefixes=p,e.mq=z,e.hasEvent=A,e.testProp=function(a){return H([a])},e.testAllProps=J,e.testStyles=y,e.prefixed=function(a,b,c){return b?J(a,b,c):J(a,"pfx")},g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+v.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f #mq-test-1 { width: 42px; }';a.insertBefore(d,b);c=g.offsetWidth==42;a.removeChild(d);return{matches:c,media:h}}})(document); 9 | 10 | /*! Respond.js v1.1.0: min/max-width media query polyfill. (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs */ 11 | (function(e){e.respond={};respond.update=function(){};respond.mediaQueriesSupported=e.matchMedia&&e.matchMedia("only all").matches;if(respond.mediaQueriesSupported){return}var w=e.document,s=w.documentElement,i=[],k=[],q=[],o={},h=30,f=w.getElementsByTagName("head")[0]||s,g=w.getElementsByTagName("base")[0],b=f.getElementsByTagName("link"),d=[],a=function(){var D=b,y=D.length,B=0,A,z,C,x;for(;B-1,minw:F.match(/\(min\-width:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:F.match(/\(max\-width:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}}j()},l,r,v=function(){var z,A=w.createElement("div"),x=w.body,y=false;A.style.cssText="position:absolute;font-size:1em;width:1em";if(!x){x=y=w.createElement("body");x.style.background="none"}x.appendChild(A);s.insertBefore(x,s.firstChild);z=A.offsetWidth;if(y){s.removeChild(x)}else{x.removeChild(A)}z=p=parseFloat(z);return z},p,j=function(I){var x="clientWidth",B=s[x],H=w.compatMode==="CSS1Compat"&&B||w.body[x]||B,D={},G=b[b.length-1],z=(new Date()).getTime();if(I&&l&&z-l-1?(p||v()):1)}if(!!J){J=parseFloat(J)*(J.indexOf(y)>-1?(p||v()):1)}if(!K.hasquery||(!A||!L)&&(A||H>=C)&&(L||H<=J)){if(!D[K.media]){D[K.media]=[]}D[K.media].push(k[K.rules])}}for(var E in q){if(q[E]&&q[E].parentNode===f){f.removeChild(q[E])}}for(var E in D){var M=w.createElement("style"),F=D[E].join("\n");M.type="text/css";M.media=E;f.insertBefore(M,G.nextSibling);if(M.styleSheet){M.styleSheet.cssText=F}else{M.appendChild(w.createTextNode(F))}q.push(M)}},n=function(x,z){var y=c();if(!y){return}y.open("GET",x,true);y.onreadystatechange=function(){if(y.readyState!=4||y.status!=200&&y.status!=304){return}z(y.responseText)};if(y.readyState==4){return}y.send(null)},c=(function(){var x=false;try{x=new XMLHttpRequest()}catch(y){x=new ActiveXObject("Microsoft.XMLHTTP")}return function(){return x}})();a();respond.update=a;function t(){j(true)}if(e.addEventListener){e.addEventListener("resize",t,false)}else{if(e.attachEvent){e.attachEvent("onresize",t)}}})(this); -------------------------------------------------------------------------------- /source/css/main.scss: -------------------------------------------------------------------------------- 1 | --- 2 | --- 3 | /* ========================================================================== 4 | HTML5 Boilerplate styles - h5bp.com (generated via initializr.com) 5 | ========================================================================== */ 6 | 7 | html, 8 | button, 9 | input, 10 | select, 11 | textarea { 12 | color: #222; 13 | } 14 | 15 | body { 16 | font-size: 1em; 17 | line-height: 1.4; 18 | } 19 | 20 | ::-moz-selection { 21 | background: #b3d4fc; 22 | text-shadow: none; 23 | } 24 | 25 | ::selection { 26 | background: #b3d4fc; 27 | text-shadow: none; 28 | } 29 | 30 | hr { 31 | display: block; 32 | height: 1px; 33 | border: 0; 34 | border-top: 1px solid #ccc; 35 | margin: 1em 0; 36 | padding: 0; 37 | } 38 | 39 | img { 40 | vertical-align: middle; 41 | } 42 | 43 | fieldset { 44 | border: 0; 45 | margin: 0; 46 | padding: 0; 47 | } 48 | 49 | textarea { 50 | resize: vertical; 51 | } 52 | 53 | .chromeframe { 54 | margin: 0.2em 0; 55 | background: #ccc; 56 | color: #000; 57 | padding: 0.2em 0; 58 | } 59 | 60 | 61 | /* ===== Initializr Styles ================================================== 62 | Author: Jonathan Verrecchia - verekia.com/initializr/responsive-template 63 | ============================================================================= */ 64 | 65 | body { 66 | color: #555; 67 | font: 15px/26px 'Open Sans', Helvetica, Helvetica Neue, Arial; 68 | } 69 | 70 | 71 | 72 | .wrapper { 73 | width: 90%; 74 | margin: 0 5%; 75 | } 76 | 77 | a:link, a:visited, a:hover, a:active { 78 | color: #2e8b74; 79 | padding-bottom: 1px; 80 | text-decoration: none; 81 | } 82 | 83 | .font-weight-600 { 84 | font-weight: 600; 85 | } 86 | 87 | .text-align-center { 88 | text-align: center; 89 | } 90 | 91 | /*==== MOBILE: Menu ====*/ 92 | 93 | nav ul { 94 | margin: 0; 95 | padding: 0; 96 | } 97 | 98 | nav a:link, nav a:visited, nav a:hover, nav a:active { 99 | border-top: 1px solid #424957; 100 | color: #b3b5b7; 101 | display: block; 102 | font-family: 'Open Sans', Arial, sans-serif; 103 | font-size: 11px; 104 | font-weight: 600; 105 | letter-spacing: 1px; 106 | padding: 12px 0; 107 | text-align: center; 108 | text-decoration: none; 109 | text-transform: uppercase; 110 | } 111 | 112 | nav ul a.is-selected { 113 | color: #00bc99; 114 | } 115 | 116 | nav a:hover { 117 | color: #fff; 118 | } 119 | 120 | 121 | /*==== MOBILE: Main ====*/ 122 | 123 | .header-container { 124 | background: #21252c url('../img/bg-color-bar.png') left top repeat-x; 125 | padding-top: 3px; 126 | } 127 | 128 | .title { 129 | background: transparent url('../img/logo-iiif-34x30.png') center 8px no-repeat; 130 | display: block; 131 | font-size: 0; 132 | height: 40px; 133 | margin: 0 auto; 134 | padding-bottom: 4px; 135 | width: 34px; 136 | } 137 | 138 | .text-align-right { 139 | text-align: right; 140 | } 141 | 142 | .text-align-left { 143 | text-align: left; 144 | } 145 | 146 | a.button-turquoise { 147 | background-color: #00bc99; 148 | border: 0; 149 | border-bottom: 3px solid #2e8b74 !important; 150 | border-radius: 4px; 151 | color: #fff; 152 | display: block; 153 | clear: left; 154 | font-family: 'Open Sans', Arial, sans-serif; 155 | font-size: 12px; 156 | font-weight: 400; 157 | letter-spacing: 1px; 158 | margin-top: 10px; 159 | padding: 8px 16px; 160 | } 161 | 162 | /* Home page */ 163 | 164 | .main-blurb { 165 | background-color: #2f353e; 166 | color: #979A9E; 167 | padding: 30px 0; 168 | text-align: center; 169 | } 170 | 171 | .main-blurb h1 { 172 | font-family: 'Raleway', Arial, sans-serif; 173 | font-weight: 100; 174 | color: #fff; 175 | font-size: 22px; 176 | letter-spacing: 2px; 177 | line-height: 1.5; 178 | margin: 0.3em 0; 179 | word-wrap: break-word; 180 | } 181 | 182 | .main-blurb p { 183 | font-family: 'Open Sans', Arial, sans-serif; 184 | font-size: 15px; 185 | font-weight: 500; 186 | letter-spacing: 1px; 187 | line-height: 1.8; 188 | word-spacing: 1px; 189 | } 190 | 191 | .front-announcement { 192 | padding: 10px; 193 | border-top:1px solid black; 194 | font-size: 14pt; 195 | background: #21252c; 196 | color: white; 197 | 198 | div { 199 | margin: 0 auto; 200 | text-align: center; 201 | } 202 | } 203 | 204 | .carousel-wrapper, #carousel { 205 | background: #21252c; 206 | } 207 | 208 | .carousel-tab { 209 | height: 430px; 210 | width: 400; 211 | background: #21252c; 212 | text-align: center; 213 | } 214 | 215 | .carousel-wrapper .carousel-head { 216 | font-size: 16pt; 217 | background: #2f353e; 218 | margin-bottom: 5px; 219 | border-bottom: 1px solid black; 220 | color: white; 221 | font-weight: regular; 222 | text-align: center; 223 | padding-top: 10px; 224 | padding-bottom: 10px; 225 | } 226 | 227 | .main-highlight-blurbs { 228 | background-color: #F7F7F8; 229 | overflow: auto; 230 | padding: 40px 0; 231 | } 232 | 233 | .main-highlight-blurbs .highlight { 234 | background-position: center top; 235 | background-repeat: no-repeat; 236 | color: #444C5A; 237 | font-family: 'Open Sans', Arial, sans-serif; 238 | font-size: 14px; 239 | padding: 80px 5% 5px 5%; 240 | width: 90%; 241 | text-align: center; 242 | } 243 | 244 | .main-highlight-blurbs .highlight h2, .try-it h2 { 245 | color: #2e8b74; 246 | font-family: 'Raleway', Arial, sans-serif; 247 | font-size: 22px; 248 | font-weight: 300; 249 | letter-spacing: 1px; 250 | margin: 0; 251 | text-shadow: 1px 1px 1px rgba(255, 255, 255, 0.3); 252 | } 253 | 254 | .main-highlight-blurbs .highlight p { 255 | line-height: 2; 256 | margin: 20px 0; 257 | } 258 | 259 | .main-highlight-blurbs .plug-n-play { 260 | background-image: url('../img/icon-plug-n-play-60x60.png'); 261 | } 262 | 263 | .main-highlight-blurbs .defined-apis { 264 | background-image: url('../img/icon-defined-apis-60x60.png'); 265 | } 266 | 267 | .main-highlight-blurbs .community-driven { 268 | background-image: url('../img/icon-community-driven-60x60.png'); 269 | } 270 | 271 | .main aside { 272 | color: white; 273 | padding: 0px 5% 10px; 274 | } 275 | 276 | /*==== MOBILE: Sub pages : Common styles ====*/ 277 | 278 | .sub-pages-container a:link, 279 | .sub-pages-container a:visited, 280 | .sub-pages-container a:hover, 281 | .sub-pages-container a:active { 282 | border-bottom: 1px dotted #2e8b74; 283 | } 284 | 285 | .sub-pages-container article { 286 | background-color: #fff; 287 | } 288 | 289 | .sub-pages-container article section { 290 | margin-bottom: 4em; 291 | } 292 | 293 | .sub-pages-container article header { 294 | border-bottom: 1px solid #dbdde0; 295 | margin-bottom: 1.5em; 296 | overflow: auto; 297 | } 298 | 299 | .sub-pages-container article h1 { 300 | color: #2f353e; 301 | font-family: 'Raleway', Arial, sans-serif; 302 | font-weight: 300; 303 | font-size: 25px; 304 | letter-spacing: 2px; 305 | line-height: 1.5; 306 | margin: 0.5em 0; 307 | } 308 | 309 | .sub-pages-container article ul, .sub-pages-container article ul { 310 | list-style-type: circle; 311 | } 312 | 313 | .sub-pages-container article ul li, .sub-pages-container article ol li { 314 | padding: 3px 0 3px 8px; 315 | } 316 | 317 | .sub-pages-container article .step-box { 318 | background-color: #ed2534; 319 | border-radius: 4px; 320 | color: #fff; 321 | font-size: 15px; 322 | font-weight: 400; 323 | padding: 8px 16px; 324 | } 325 | 326 | .sub-pages-container h2, 327 | .sub-pages-container h3, 328 | .sub-pages-container h4 { 329 | color: #2f353e; 330 | font-family: 'Raleway', Arial, sans-serif; 331 | font-size: 18px; 332 | font-weight: 300; 333 | letter-spacing: 1px; 334 | margin: 0 0 10px 0; 335 | } 336 | 337 | .sub-pages-container h3 { 338 | font-size: 17px; 339 | } 340 | 341 | .sub-pages-container h4 { 342 | font-size: 15px; 343 | } 344 | 345 | .sub-pages-container section.step h2 { 346 | display: inline; 347 | margin-bottom: 5px; 348 | } 349 | 350 | .sub-pages-container section .question { 351 | color: #7f899f; 352 | font-family: 'Open Sans', Arial, sans-serif; 353 | font-size: 15px; 354 | font-weight: 300; 355 | font-style: italic; 356 | padding-top: 6px; 357 | } 358 | 359 | .sub-pages-container section dt { 360 | margin-bottom: 10px; 361 | } 362 | 363 | .sub-pages-container section dd { 364 | margin-bottom: 20px; 365 | } 366 | 367 | .sub-pages-container section.image-viewers ul, 368 | .sub-pages-container section.image-servers ul, 369 | .sub-pages-container section.impl-demos ul { 370 | padding-left: 40px; 371 | } 372 | 373 | 374 | /* Sub pages : Individual styles */ 375 | 376 | .sub-pages-container .technical-details article header { 377 | margin-bottom: 0; 378 | } 379 | 380 | .sub-pages-container .technical-details .section-quick-links { 381 | background-color: #F7F7F8; 382 | border-bottom: 1px solid #dbdde0; 383 | overflow: auto; 384 | /*padding-bottom: 30px;*/ 385 | padding: 30px 0 32px 0; 386 | text-align: center; 387 | } 388 | 389 | .sub-pages-container .technical-details a.button-turquoise { 390 | margin-left: 20px; 391 | margin-right: 20px; 392 | } 393 | .sub-pages-container .community .participants ul { 394 | padding-left: 40px; 395 | } 396 | 397 | .sub-pages-container .community .get-involved dl dd { 398 | margin-left: 20px; 399 | } 400 | 401 | .sub-pages-container .image-api { 402 | color: #222; 403 | } 404 | 405 | .sub-pages-container .image-api .names { 406 | list-style-type: none; 407 | margin: 1em 0 0 0; 408 | padding-left: 20px; 409 | } 410 | 411 | .sub-pages-container .image-api .names li { 412 | line-height: 1.1; 413 | padding-left: 0; 414 | } 415 | 416 | .sub-pages-container .toc ol { 417 | counter-reset: item; 418 | margin: 0; 419 | padding-left: 10px; 420 | } 421 | 422 | .sub-pages-container .toc ol ol { 423 | padding-left: 25px; 424 | } 425 | 426 | .sub-pages-container .toc li { 427 | display: inline-block; 428 | width: 92%; 429 | } 430 | 431 | .sub-pages-container .toc li:before { 432 | content: counters(item, ".") ". "; 433 | counter-increment: item; 434 | } 435 | 436 | .sub-pages-container table { 437 | margin: 25px 0; 438 | } 439 | 440 | .sub-pages-container .api-table tr { 441 | border-top: 1px solid #2e8b74; 442 | border-bottom: 1px solid #2e8b74; 443 | font-size: 13px; 444 | } 445 | 446 | .sub-pages-container .api-table th { 447 | background-color: #2e8b74; 448 | color: #fff; 449 | font-weight: normal; 450 | padding: 8px 15px; 451 | text-align: left; 452 | vertical-align: middle; 453 | white-space: normal; 454 | } 455 | 456 | .sub-pages-container .md-requirements .api-table th { 457 | border-right: 1px solid #fff; 458 | text-align: center; 459 | padding: 8px 5px; 460 | } 461 | 462 | .sub-pages-container .md-requirements .api-table td { 463 | padding: 8px 5px; 464 | } 465 | 466 | .sub-pages-container .md-requirements .legend { 467 | list-style-type: none; 468 | line-height: 20px; 469 | padding-left: 0; 470 | } 471 | 472 | .sub-pages-container .md-requirements .legend .req { 473 | float: left; 474 | margin-right: 20px; 475 | } 476 | 477 | .sub-pages-container .api-table td:first-child { 478 | font-family: monospace; 479 | /*text-align: center;*/ 480 | } 481 | 482 | .sub-pages-container .api-table td { 483 | padding: 8px 15px; 484 | vertical-align: middle; 485 | word-wrap: break-word; 486 | white-space: -pre-wrap; /* Opera 4-6 */ 487 | white-space: -o-pre-wrap; /* Opera 7 */ 488 | white-space: -moz-pre-wrap; /* Mozilla */ 489 | white-space: -hp-pre-wrap; /* HP Printers */ 490 | } 491 | 492 | .sub-pages-container .url-encoding-and-decoding .api-table td { 493 | word-break: break-all; 494 | } 495 | 496 | .sub-pages-container .example-urls { 497 | font-family: monospace; 498 | font-size: 13px; 499 | list-style-type: none; 500 | margin-bottom: 25px; 501 | padding-left: 0; 502 | } 503 | 504 | .sub-pages-container .example-urls li { 505 | padding: 2px 0; 506 | word-break: break-all; 507 | } 508 | 509 | .sub-pages-container .container-figure { 510 | text-align: left; 511 | } 512 | 513 | .sub-pages-container .container-figure .figure-label { 514 | color: #999; 515 | font-size: 13px; 516 | font-style: italic; 517 | } 518 | 519 | .figure-image-api-region { 520 | background-image: url('/api/image/1.1/img/iiif-region.png'); 521 | } 522 | 523 | .figure-image-api-size { 524 | background-image: url('/api/image/1.1/img/iiif-size.png'); 525 | } 526 | 527 | .figure-image-api-rotation { 528 | background-image: url('/api/image/1.1/img/iiif-rotation.png'); 529 | } 530 | 531 | .figure-image-api-quality { 532 | background-image: url('/api/image/1.1/img/iiif-quality.png'); 533 | } 534 | 535 | .figure-presentation-api-objects { 536 | height: 350px; 537 | width: 117px; 538 | } 539 | 540 | .figure-presentation-api-objects-md { 541 | height: 400px; 542 | width: 428px; 543 | } 544 | 545 | .figure-presentation-api-objects-all { 546 | height: 500px; 547 | width: 702px; 548 | } 549 | 550 | .to-toc { 551 | float: right; 552 | height: 25px; 553 | padding-left: 20px; 554 | width: 25px; 555 | } 556 | 557 | .monospace { 558 | font-family: monospace; 559 | } 560 | 561 | .left-indent { 562 | text-indent: 20px; 563 | } 564 | 565 | .visibility-hidden { 566 | visibility: hidden; 567 | } 568 | 569 | .code-block { 570 | background-color: #e0efef; 571 | border: 1px solid #c0d3d3; 572 | border-radius: 3px; 573 | display: inline-block; 574 | font-family: monospace; 575 | font-size: 13px; 576 | line-height: 1.6; 577 | margin: 0; 578 | padding: 4px 12px; 579 | word-break: break-all; 580 | } 581 | 582 | .multi-line-code { 583 | white-space: pre; 584 | white-space: pre-wrap; 585 | word-wrap: break-word; 586 | } 587 | 588 | .numbered-box { 589 | background-color: #eb2026; 590 | border-radius: 3px; 591 | color: #fff; 592 | padding: 4px 6px 3px 6px; 593 | } 594 | 595 | 596 | .req { 597 | background: transparent url('/img/metadata-api/icons-metadata-requirements.png') left top no-repeat; 598 | height: 20px; 599 | margin: 0 auto; 600 | width: 20px; 601 | } 602 | 603 | .mandatory { 604 | background-position: 0 0; 605 | } 606 | 607 | .recommended { 608 | background-position: -20px 0; 609 | } 610 | 611 | .optional { 612 | background-position: 0 -20px; 613 | } 614 | 615 | .not-applicable { 616 | background-position: -20px -20px; 617 | } 618 | 619 | .sub-rh { 620 | background-color:#DCF4EE; 621 | font-weight: bold; 622 | } 623 | 624 | .compliance-tick { 625 | color: #2E8B74; 626 | text-align: center; 627 | } 628 | 629 | /* Footer */ 630 | 631 | .footer-container { 632 | border-top: 1px solid black; 633 | background: #2f353e; 634 | color: #c0c0c0; 635 | padding: 8px; 636 | } 637 | 638 | .footer-container .footer-column { 639 | float: left; 640 | width: 50%; 641 | background: #2f353e; 642 | color: #a7aaae; 643 | font-size: 12px; 644 | text-align: center; 645 | } 646 | 647 | .footer-container ul { 648 | line-height: 1.6; 649 | list-style: none; 650 | margin: 0; 651 | padding: 0; 652 | width: 100%; 653 | } 654 | 655 | .footer-container ul li { 656 | display: inline; 657 | padding-right: 25px; 658 | } 659 | 660 | /* =============== 661 | ALL: IE Fixes 662 | ================== */ 663 | 664 | .ie7 .title { 665 | padding-top: 20px; 666 | } 667 | 668 | 669 | /* ========================================================================== 670 | Media Queries 671 | ============================================================================= */ 672 | 673 | @media only screen and (min-width: 480px) { 674 | 675 | /* ==================== 676 | INTERMEDIATE: Menu 677 | ==================== */ 678 | 679 | .title { 680 | margin: 0 0 5px 0; 681 | } 682 | 683 | nav { 684 | border-top: 1px solid #424957; 685 | } 686 | 687 | nav a:link, nav a:visited, nav a:hover, nav a:active { 688 | border-top: 0; 689 | display: inline-block; 690 | padding: 12px 3% 12px 0; 691 | margin-bottom: 0; 692 | } 693 | 694 | nav li:first-child a { 695 | margin-left: 0; 696 | } 697 | 698 | nav li:last-child a { 699 | margin-right: 0; 700 | padding-right: 0; 701 | } 702 | 703 | .main-blurb h1 { 704 | font-size: 32px; 705 | } 706 | 707 | .main-blurb p { 708 | font-size: 17px; 709 | } 710 | 711 | a.button-turquoise { 712 | font-size: 15px; 713 | padding: 12px 24px; 714 | } 715 | 716 | .main-blurb .buttons { 717 | padding: 15px 0 10px 0; 718 | } 719 | 720 | .main-blurb a.button-turquoise { 721 | margin: 10px; 722 | display: inline; 723 | clear: none; 724 | } 725 | 726 | .sub-pages-container article .step-box { 727 | background-color: #ed2534; 728 | /*border: 2px solid #ed2534;*/ 729 | border-radius: 4px; 730 | color: #fff; 731 | font-size: 14px; 732 | font-weight: 600; 733 | padding: 8px 16px; 734 | } 735 | 736 | .sub-pages-container .container-figure { 737 | text-align: center; 738 | } 739 | 740 | 741 | /* ======================== 742 | INTERMEDIATE: IE Fixes 743 | ======================== */ 744 | 745 | nav ul li { 746 | display: inline; 747 | } 748 | 749 | .oldie nav a { 750 | margin: 0 0.7%; 751 | } 752 | } 753 | 754 | @media only screen and (min-width: 768px) { 755 | 756 | /* ============ 757 | WIDE: Menu 758 | ============ */ 759 | 760 | .title { 761 | float: left; 762 | margin: 0 0 5px 0; 763 | width: 34px; 764 | } 765 | 766 | nav { 767 | float: right; 768 | text-align: right; 769 | width: 70%; 770 | } 771 | 772 | nav a:link, nav a:visited, nav a:hover, nav a:active { 773 | padding: 12px 0 12px 4%; 774 | margin-bottom: 0; 775 | } 776 | 777 | /* ============ 778 | WIDE: Main 779 | ============ */ 780 | 781 | .main aside { 782 | float: right; 783 | width: 28%; 784 | } 785 | 786 | .main-highlight-blurbs .highlight { 787 | float: left; 788 | width: 23%; 789 | } 790 | 791 | a.button-turquoise { 792 | margin: 10px; 793 | display: inline; 794 | clear: none; 795 | } 796 | 797 | .sub-pages-container article { 798 | float: left; 799 | min-height: 400px; 800 | width: 100%; 801 | } 802 | 803 | .sub-pages-container h2 { 804 | font-size: 20px; 805 | } 806 | 807 | .sub-pages-container h3 { 808 | font-size: 18px; 809 | } 810 | 811 | .sub-pages-container section.about-content, 812 | .sub-pages-container section.quick-start, 813 | .sub-pages-container section.step-1, 814 | .sub-pages-container section.step-2, 815 | .sub-pages-container section.step-3, 816 | .sub-pages-container section.tips-n-tricks, 817 | .sub-pages-container section.image-viewers, 818 | .sub-pages-container section.image-servers, 819 | .sub-pages-container section.impl-demos, 820 | .sub-pages-container section.get-involved, 821 | .sub-pages-container section.participants { 822 | box-sizing: border-box; 823 | padding-left: 110px; 824 | -moz-box-sizing: border-box; 825 | -webkit-box-sizing: border-box; 826 | } 827 | .sub-pages-container section.about-content { background: transparent url(../img/text-bg-about.png) left top no-repeat; } 828 | .sub-pages-container section.quick-start { background: transparent url(../img/text-bg-quick-start.png) left top no-repeat; } 829 | .sub-pages-container section.step-1 { background: transparent url(../img/text-bg-step-1.png) 10px top no-repeat; } 830 | .sub-pages-container section.step-2 { background: transparent url(../img/text-bg-step-2.png) 10px top no-repeat; } 831 | .sub-pages-container section.step-3 { background: transparent url(../img/text-bg-step-3.png) 10px top no-repeat; } 832 | .sub-pages-container section.tips-n-tricks { background: transparent url(../img/text-bg-tips-n-tricks.png) left top no-repeat; } 833 | .sub-pages-container section.image-viewers { background: transparent url(../img/text-bg-img-viewers.png) left top no-repeat; } 834 | .sub-pages-container section.image-servers { background: transparent url(../img/text-bg-img-servers.png) left top no-repeat; } 835 | .sub-pages-container section.impl-demos { background: transparent url(../img/text-bg-impl-demos.png) left top no-repeat; } 836 | .sub-pages-container section.get-involved { background: transparent url(../img/text-bg-get-involved.png) left top no-repeat; } 837 | .sub-pages-container section.participants { background: transparent url(../img/text-bg-participants.png) left top no-repeat; } 838 | 839 | .sub-pages-container .api-table th { 840 | white-space: nowrap; 841 | } 842 | 843 | 844 | .sub-pages-container .sched-table { 845 | width:100%; 846 | } 847 | 848 | 849 | .sub-pages-container .sched-table td:first-child { 850 | width: 20%; 851 | } 852 | .sub-pages-container .sched-table td:nth-child(2) { 853 | width: 45%; 854 | } 855 | .sub-pages-container .sched-table td:nth-child(3) { 856 | width: 35%; 857 | } 858 | 859 | .sub-pages-container .msched-table { 860 | width:100%; 861 | } 862 | 863 | 864 | .sub-pages-container .msched-table td:first-child { 865 | width: 13%; 866 | } 867 | .sub-pages-container .msched-table td:nth-child(2) { 868 | width: 29%; 869 | } 870 | .sub-pages-container .msched-table td:nth-child(3) { 871 | width: 29%; 872 | } 873 | .sub-pages-container .msched-table td:nth-child(4) { 874 | width: 29%; 875 | } 876 | 877 | .code-block { 878 | margin: 0 0 0 20px; 879 | } 880 | 881 | .footer-container .footer-column { 882 | float: left; 883 | width: 50%; 884 | } 885 | 886 | } 887 | 888 | @media only screen and (min-width: 1140px) { 889 | 890 | /* =============== 891 | Maximal Width 892 | =============== */ 893 | 894 | .wrapper { 895 | width: 1026px; /* 1140px - 10% for margins */ 896 | margin: 0 auto; 897 | } 898 | 899 | .footer-container .footer-column { 900 | float: left; 901 | width: 25%; 902 | } 903 | } 904 | 905 | /* ========================================================================== 906 | Helper classes 907 | ========================================================================== */ 908 | 909 | .ir { 910 | background-color: transparent; 911 | border: 0; 912 | overflow: hidden; 913 | *text-indent: -9999px; 914 | } 915 | 916 | .ir:before { 917 | content: ""; 918 | display: block; 919 | width: 0; 920 | height: 150%; 921 | } 922 | 923 | .hidden { 924 | display: none !important; 925 | visibility: hidden; 926 | } 927 | 928 | .visuallyhidden { 929 | border: 0; 930 | clip: rect(0 0 0 0); 931 | height: 1px; 932 | margin: -1px; 933 | overflow: hidden; 934 | padding: 0; 935 | position: absolute; 936 | width: 1px; 937 | } 938 | 939 | .visuallyhidden.focusable:active, 940 | .visuallyhidden.focusable:focus { 941 | clip: auto; 942 | height: auto; 943 | margin: 0; 944 | overflow: visible; 945 | position: static; 946 | width: auto; 947 | } 948 | 949 | .invisible { 950 | visibility: hidden; 951 | } 952 | 953 | .clearfix:before, 954 | .clearfix:after { 955 | content: " "; 956 | display: table; 957 | } 958 | 959 | .clearfix:after { 960 | clear: both; 961 | } 962 | 963 | .clearfix { 964 | *zoom: 1; 965 | } 966 | 967 | /* ========================================================================== 968 | Print styles 969 | ========================================================================== */ 970 | 971 | @media print { 972 | * { 973 | background: transparent !important; 974 | color: #000 !important; /* Black prints faster: h5bp.com/s */ 975 | box-shadow: none !important; 976 | text-shadow: none !important; 977 | } 978 | 979 | a, 980 | a:visited { 981 | text-decoration: underline; 982 | } 983 | 984 | a[href]:after { 985 | content: " (" attr(href) ")"; 986 | } 987 | 988 | abbr[title]:after { 989 | content: " (" attr(title) ")"; 990 | } 991 | 992 | /* 993 | * Don't show links for images, or javascript/internal links 994 | */ 995 | 996 | .ir a:after, 997 | a[href^="javascript:"]:after, 998 | a[href^="#"]:after { 999 | content: ""; 1000 | } 1001 | 1002 | pre, 1003 | blockquote { 1004 | border: 1px solid #999; 1005 | page-break-inside: avoid; 1006 | } 1007 | 1008 | thead { 1009 | display: table-header-group; /* h5bp.com/t */ 1010 | } 1011 | 1012 | tr, 1013 | img { 1014 | page-break-inside: avoid; 1015 | } 1016 | 1017 | img { 1018 | max-width: 100% !important; 1019 | } 1020 | 1021 | @page { 1022 | margin: 0.5cm; 1023 | } 1024 | 1025 | p, 1026 | h2, 1027 | h3 { 1028 | orphans: 3; 1029 | widows: 3; 1030 | } 1031 | 1032 | h2, 1033 | h3 { 1034 | page-break-after: avoid; 1035 | } 1036 | } 1037 | 1038 | // Post styles 1039 | .short-post-title { 1040 | .post-date { 1041 | font-size: smaller; 1042 | } 1043 | } 1044 | .post { 1045 | h2, h3, h4 { 1046 | font-weight: 600; 1047 | } 1048 | .meta { 1049 | p { 1050 | line-height: 1.1; 1051 | margin-top: 5px; 1052 | margin-bottom: 5px 1053 | } 1054 | } 1055 | dd { 1056 | ul { 1057 | margin: 0; 1058 | padding:0; 1059 | } 1060 | } 1061 | li { 1062 | padding-bottom: 0 !important; 1063 | padding-top: 0 !important; 1064 | } 1065 | } 1066 | -------------------------------------------------------------------------------- /source/js/vendor/slick.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | _ _ _ _ 3 | ___| (_) ___| | __ (_)___ 4 | / __| | |/ __| |/ / | / __| 5 | \__ \ | | (__| < _ | \__ \ 6 | |___/_|_|\___|_|\_(_)/ |___/ 7 | |__/ 8 | 9 | Version: 1.5.9 10 | Author: Ken Wheeler 11 | Website: http://kenwheeler.github.io 12 | Docs: http://kenwheeler.github.io/slick 13 | Repo: http://github.com/kenwheeler/slick 14 | Issues: http://github.com/kenwheeler/slick/issues 15 | 16 | */ 17 | !function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery"],a):"undefined"!=typeof exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){"use strict";var b=window.Slick||{};b=function(){function c(c,d){var f,e=this;e.defaults={accessibility:!0,adaptiveHeight:!1,appendArrows:a(c),appendDots:a(c),arrows:!0,asNavFor:null,prevArrow:'',nextArrow:'',autoplay:!1,autoplaySpeed:3e3,centerMode:!1,centerPadding:"50px",cssEase:"ease",customPaging:function(a,b){return'"},dots:!1,dotsClass:"slick-dots",draggable:!0,easing:"linear",edgeFriction:.35,fade:!1,focusOnSelect:!1,infinite:!0,initialSlide:0,lazyLoad:"ondemand",mobileFirst:!1,pauseOnHover:!0,pauseOnDotsHover:!1,respondTo:"window",responsive:null,rows:1,rtl:!1,slide:"",slidesPerRow:1,slidesToShow:1,slidesToScroll:1,speed:500,swipe:!0,swipeToSlide:!1,touchMove:!0,touchThreshold:5,useCSS:!0,useTransform:!1,variableWidth:!1,vertical:!1,verticalSwiping:!1,waitForAnimate:!0,zIndex:1e3},e.initials={animating:!1,dragging:!1,autoPlayTimer:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,$dots:null,listWidth:null,listHeight:null,loadIndex:0,$nextArrow:null,$prevArrow:null,slideCount:null,slideWidth:null,$slideTrack:null,$slides:null,sliding:!1,slideOffset:0,swipeLeft:null,$list:null,touchObject:{},transformsEnabled:!1,unslicked:!1},a.extend(e,e.initials),e.activeBreakpoint=null,e.animType=null,e.animProp=null,e.breakpoints=[],e.breakpointSettings=[],e.cssTransitions=!1,e.hidden="hidden",e.paused=!1,e.positionProp=null,e.respondTo=null,e.rowCount=1,e.shouldClick=!0,e.$slider=a(c),e.$slidesCache=null,e.transformType=null,e.transitionType=null,e.visibilityChange="visibilitychange",e.windowWidth=0,e.windowTimer=null,f=a(c).data("slick")||{},e.options=a.extend({},e.defaults,f,d),e.currentSlide=e.options.initialSlide,e.originalSettings=e.options,"undefined"!=typeof document.mozHidden?(e.hidden="mozHidden",e.visibilityChange="mozvisibilitychange"):"undefined"!=typeof document.webkitHidden&&(e.hidden="webkitHidden",e.visibilityChange="webkitvisibilitychange"),e.autoPlay=a.proxy(e.autoPlay,e),e.autoPlayClear=a.proxy(e.autoPlayClear,e),e.changeSlide=a.proxy(e.changeSlide,e),e.clickHandler=a.proxy(e.clickHandler,e),e.selectHandler=a.proxy(e.selectHandler,e),e.setPosition=a.proxy(e.setPosition,e),e.swipeHandler=a.proxy(e.swipeHandler,e),e.dragHandler=a.proxy(e.dragHandler,e),e.keyHandler=a.proxy(e.keyHandler,e),e.autoPlayIterator=a.proxy(e.autoPlayIterator,e),e.instanceUid=b++,e.htmlExpr=/^(?:\s*(<[\w\W]+>)[^>]*)$/,e.registerBreakpoints(),e.init(!0),e.checkResponsive(!0)}var b=0;return c}(),b.prototype.addSlide=b.prototype.slickAdd=function(b,c,d){var e=this;if("boolean"==typeof c)d=c,c=null;else if(0>c||c>=e.slideCount)return!1;e.unload(),"number"==typeof c?0===c&&0===e.$slides.length?a(b).appendTo(e.$slideTrack):d?a(b).insertBefore(e.$slides.eq(c)):a(b).insertAfter(e.$slides.eq(c)):d===!0?a(b).prependTo(e.$slideTrack):a(b).appendTo(e.$slideTrack),e.$slides=e.$slideTrack.children(this.options.slide),e.$slideTrack.children(this.options.slide).detach(),e.$slideTrack.append(e.$slides),e.$slides.each(function(b,c){a(c).attr("data-slick-index",b)}),e.$slidesCache=e.$slides,e.reinit()},b.prototype.animateHeight=function(){var a=this;if(1===a.options.slidesToShow&&a.options.adaptiveHeight===!0&&a.options.vertical===!1){var b=a.$slides.eq(a.currentSlide).outerHeight(!0);a.$list.animate({height:b},a.options.speed)}},b.prototype.animateSlide=function(b,c){var d={},e=this;e.animateHeight(),e.options.rtl===!0&&e.options.vertical===!1&&(b=-b),e.transformsEnabled===!1?e.options.vertical===!1?e.$slideTrack.animate({left:b},e.options.speed,e.options.easing,c):e.$slideTrack.animate({top:b},e.options.speed,e.options.easing,c):e.cssTransitions===!1?(e.options.rtl===!0&&(e.currentLeft=-e.currentLeft),a({animStart:e.currentLeft}).animate({animStart:b},{duration:e.options.speed,easing:e.options.easing,step:function(a){a=Math.ceil(a),e.options.vertical===!1?(d[e.animType]="translate("+a+"px, 0px)",e.$slideTrack.css(d)):(d[e.animType]="translate(0px,"+a+"px)",e.$slideTrack.css(d))},complete:function(){c&&c.call()}})):(e.applyTransition(),b=Math.ceil(b),e.options.vertical===!1?d[e.animType]="translate3d("+b+"px, 0px, 0px)":d[e.animType]="translate3d(0px,"+b+"px, 0px)",e.$slideTrack.css(d),c&&setTimeout(function(){e.disableTransition(),c.call()},e.options.speed))},b.prototype.asNavFor=function(b){var c=this,d=c.options.asNavFor;d&&null!==d&&(d=a(d).not(c.$slider)),null!==d&&"object"==typeof d&&d.each(function(){var c=a(this).slick("getSlick");c.unslicked||c.slideHandler(b,!0)})},b.prototype.applyTransition=function(a){var b=this,c={};b.options.fade===!1?c[b.transitionType]=b.transformType+" "+b.options.speed+"ms "+b.options.cssEase:c[b.transitionType]="opacity "+b.options.speed+"ms "+b.options.cssEase,b.options.fade===!1?b.$slideTrack.css(c):b.$slides.eq(a).css(c)},b.prototype.autoPlay=function(){var a=this;a.autoPlayTimer&&clearInterval(a.autoPlayTimer),a.slideCount>a.options.slidesToShow&&a.paused!==!0&&(a.autoPlayTimer=setInterval(a.autoPlayIterator,a.options.autoplaySpeed))},b.prototype.autoPlayClear=function(){var a=this;a.autoPlayTimer&&clearInterval(a.autoPlayTimer)},b.prototype.autoPlayIterator=function(){var a=this;a.options.infinite===!1?1===a.direction?(a.currentSlide+1===a.slideCount-1&&(a.direction=0),a.slideHandler(a.currentSlide+a.options.slidesToScroll)):(a.currentSlide-1===0&&(a.direction=1),a.slideHandler(a.currentSlide-a.options.slidesToScroll)):a.slideHandler(a.currentSlide+a.options.slidesToScroll)},b.prototype.buildArrows=function(){var b=this;b.options.arrows===!0&&(b.$prevArrow=a(b.options.prevArrow).addClass("slick-arrow"),b.$nextArrow=a(b.options.nextArrow).addClass("slick-arrow"),b.slideCount>b.options.slidesToShow?(b.$prevArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex"),b.$nextArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex"),b.htmlExpr.test(b.options.prevArrow)&&b.$prevArrow.prependTo(b.options.appendArrows),b.htmlExpr.test(b.options.nextArrow)&&b.$nextArrow.appendTo(b.options.appendArrows),b.options.infinite!==!0&&b.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true")):b.$prevArrow.add(b.$nextArrow).addClass("slick-hidden").attr({"aria-disabled":"true",tabindex:"-1"}))},b.prototype.buildDots=function(){var c,d,b=this;if(b.options.dots===!0&&b.slideCount>b.options.slidesToShow){for(d='
      ',c=0;c<=b.getDotCount();c+=1)d+="
    • "+b.options.customPaging.call(this,b,c)+"
    • ";d+="
    ",b.$dots=a(d).appendTo(b.options.appendDots),b.$dots.find("li").first().addClass("slick-active").attr("aria-hidden","false")}},b.prototype.buildOut=function(){var b=this;b.$slides=b.$slider.children(b.options.slide+":not(.slick-cloned)").addClass("slick-slide"),b.slideCount=b.$slides.length,b.$slides.each(function(b,c){a(c).attr("data-slick-index",b).data("originalStyling",a(c).attr("style")||"")}),b.$slider.addClass("slick-slider"),b.$slideTrack=0===b.slideCount?a('
    ').appendTo(b.$slider):b.$slides.wrapAll('
    ').parent(),b.$list=b.$slideTrack.wrap('
    ').parent(),b.$slideTrack.css("opacity",0),(b.options.centerMode===!0||b.options.swipeToSlide===!0)&&(b.options.slidesToScroll=1),a("img[data-lazy]",b.$slider).not("[src]").addClass("slick-loading"),b.setupInfinite(),b.buildArrows(),b.buildDots(),b.updateDots(),b.setSlideClasses("number"==typeof b.currentSlide?b.currentSlide:0),b.options.draggable===!0&&b.$list.addClass("draggable")},b.prototype.buildRows=function(){var b,c,d,e,f,g,h,a=this;if(e=document.createDocumentFragment(),g=a.$slider.children(),a.options.rows>1){for(h=a.options.slidesPerRow*a.options.rows,f=Math.ceil(g.length/h),b=0;f>b;b++){var i=document.createElement("div");for(c=0;cd.breakpoints[e]&&(f=d.breakpoints[e]));null!==f?null!==d.activeBreakpoint?(f!==d.activeBreakpoint||c)&&(d.activeBreakpoint=f,"unslick"===d.breakpointSettings[f]?d.unslick(f):(d.options=a.extend({},d.originalSettings,d.breakpointSettings[f]),b===!0&&(d.currentSlide=d.options.initialSlide),d.refresh(b)),h=f):(d.activeBreakpoint=f,"unslick"===d.breakpointSettings[f]?d.unslick(f):(d.options=a.extend({},d.originalSettings,d.breakpointSettings[f]),b===!0&&(d.currentSlide=d.options.initialSlide),d.refresh(b)),h=f):null!==d.activeBreakpoint&&(d.activeBreakpoint=null,d.options=d.originalSettings,b===!0&&(d.currentSlide=d.options.initialSlide),d.refresh(b),h=f),b||h===!1||d.$slider.trigger("breakpoint",[d,h])}},b.prototype.changeSlide=function(b,c){var f,g,h,d=this,e=a(b.target);switch(e.is("a")&&b.preventDefault(),e.is("li")||(e=e.closest("li")),h=d.slideCount%d.options.slidesToScroll!==0,f=h?0:(d.slideCount-d.currentSlide)%d.options.slidesToScroll,b.data.message){case"previous":g=0===f?d.options.slidesToScroll:d.options.slidesToShow-f,d.slideCount>d.options.slidesToShow&&d.slideHandler(d.currentSlide-g,!1,c);break;case"next":g=0===f?d.options.slidesToScroll:f,d.slideCount>d.options.slidesToShow&&d.slideHandler(d.currentSlide+g,!1,c);break;case"index":var i=0===b.data.index?0:b.data.index||e.index()*d.options.slidesToScroll;d.slideHandler(d.checkNavigable(i),!1,c),e.children().trigger("focus");break;default:return}},b.prototype.checkNavigable=function(a){var c,d,b=this;if(c=b.getNavigableIndexes(),d=0,a>c[c.length-1])a=c[c.length-1];else for(var e in c){if(ab.options.slidesToShow&&(b.$prevArrow&&b.$prevArrow.off("click.slick",b.changeSlide),b.$nextArrow&&b.$nextArrow.off("click.slick",b.changeSlide)),b.$list.off("touchstart.slick mousedown.slick",b.swipeHandler),b.$list.off("touchmove.slick mousemove.slick",b.swipeHandler),b.$list.off("touchend.slick mouseup.slick",b.swipeHandler),b.$list.off("touchcancel.slick mouseleave.slick",b.swipeHandler),b.$list.off("click.slick",b.clickHandler),a(document).off(b.visibilityChange,b.visibility),b.$list.off("mouseenter.slick",a.proxy(b.setPaused,b,!0)),b.$list.off("mouseleave.slick",a.proxy(b.setPaused,b,!1)),b.options.accessibility===!0&&b.$list.off("keydown.slick",b.keyHandler),b.options.focusOnSelect===!0&&a(b.$slideTrack).children().off("click.slick",b.selectHandler),a(window).off("orientationchange.slick.slick-"+b.instanceUid,b.orientationChange),a(window).off("resize.slick.slick-"+b.instanceUid,b.resize),a("[draggable!=true]",b.$slideTrack).off("dragstart",b.preventDefault),a(window).off("load.slick.slick-"+b.instanceUid,b.setPosition),a(document).off("ready.slick.slick-"+b.instanceUid,b.setPosition)},b.prototype.cleanUpRows=function(){var b,a=this;a.options.rows>1&&(b=a.$slides.children().children(),b.removeAttr("style"),a.$slider.html(b))},b.prototype.clickHandler=function(a){var b=this;b.shouldClick===!1&&(a.stopImmediatePropagation(),a.stopPropagation(),a.preventDefault())},b.prototype.destroy=function(b){var c=this;c.autoPlayClear(),c.touchObject={},c.cleanUpEvents(),a(".slick-cloned",c.$slider).detach(),c.$dots&&c.$dots.remove(),c.$prevArrow&&c.$prevArrow.length&&(c.$prevArrow.removeClass("slick-disabled slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled tabindex").css("display",""),c.htmlExpr.test(c.options.prevArrow)&&c.$prevArrow.remove()),c.$nextArrow&&c.$nextArrow.length&&(c.$nextArrow.removeClass("slick-disabled slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled tabindex").css("display",""),c.htmlExpr.test(c.options.nextArrow)&&c.$nextArrow.remove()),c.$slides&&(c.$slides.removeClass("slick-slide slick-active slick-center slick-visible slick-current").removeAttr("aria-hidden").removeAttr("data-slick-index").each(function(){a(this).attr("style",a(this).data("originalStyling"))}),c.$slideTrack.children(this.options.slide).detach(),c.$slideTrack.detach(),c.$list.detach(),c.$slider.append(c.$slides)),c.cleanUpRows(),c.$slider.removeClass("slick-slider"),c.$slider.removeClass("slick-initialized"),c.unslicked=!0,b||c.$slider.trigger("destroy",[c])},b.prototype.disableTransition=function(a){var b=this,c={};c[b.transitionType]="",b.options.fade===!1?b.$slideTrack.css(c):b.$slides.eq(a).css(c)},b.prototype.fadeSlide=function(a,b){var c=this;c.cssTransitions===!1?(c.$slides.eq(a).css({zIndex:c.options.zIndex}),c.$slides.eq(a).animate({opacity:1},c.options.speed,c.options.easing,b)):(c.applyTransition(a),c.$slides.eq(a).css({opacity:1,zIndex:c.options.zIndex}),b&&setTimeout(function(){c.disableTransition(a),b.call()},c.options.speed))},b.prototype.fadeSlideOut=function(a){var b=this;b.cssTransitions===!1?b.$slides.eq(a).animate({opacity:0,zIndex:b.options.zIndex-2},b.options.speed,b.options.easing):(b.applyTransition(a),b.$slides.eq(a).css({opacity:0,zIndex:b.options.zIndex-2}))},b.prototype.filterSlides=b.prototype.slickFilter=function(a){var b=this;null!==a&&(b.$slidesCache=b.$slides,b.unload(),b.$slideTrack.children(this.options.slide).detach(),b.$slidesCache.filter(a).appendTo(b.$slideTrack),b.reinit())},b.prototype.getCurrent=b.prototype.slickCurrentSlide=function(){var a=this;return a.currentSlide},b.prototype.getDotCount=function(){var a=this,b=0,c=0,d=0;if(a.options.infinite===!0)for(;bb.options.slidesToShow&&(b.slideOffset=b.slideWidth*b.options.slidesToShow*-1,e=d*b.options.slidesToShow*-1),b.slideCount%b.options.slidesToScroll!==0&&a+b.options.slidesToScroll>b.slideCount&&b.slideCount>b.options.slidesToShow&&(a>b.slideCount?(b.slideOffset=(b.options.slidesToShow-(a-b.slideCount))*b.slideWidth*-1,e=(b.options.slidesToShow-(a-b.slideCount))*d*-1):(b.slideOffset=b.slideCount%b.options.slidesToScroll*b.slideWidth*-1,e=b.slideCount%b.options.slidesToScroll*d*-1))):a+b.options.slidesToShow>b.slideCount&&(b.slideOffset=(a+b.options.slidesToShow-b.slideCount)*b.slideWidth,e=(a+b.options.slidesToShow-b.slideCount)*d),b.slideCount<=b.options.slidesToShow&&(b.slideOffset=0,e=0),b.options.centerMode===!0&&b.options.infinite===!0?b.slideOffset+=b.slideWidth*Math.floor(b.options.slidesToShow/2)-b.slideWidth:b.options.centerMode===!0&&(b.slideOffset=0,b.slideOffset+=b.slideWidth*Math.floor(b.options.slidesToShow/2)),c=b.options.vertical===!1?a*b.slideWidth*-1+b.slideOffset:a*d*-1+e,b.options.variableWidth===!0&&(f=b.slideCount<=b.options.slidesToShow||b.options.infinite===!1?b.$slideTrack.children(".slick-slide").eq(a):b.$slideTrack.children(".slick-slide").eq(a+b.options.slidesToShow),c=b.options.rtl===!0?f[0]?-1*(b.$slideTrack.width()-f[0].offsetLeft-f.width()):0:f[0]?-1*f[0].offsetLeft:0,b.options.centerMode===!0&&(f=b.slideCount<=b.options.slidesToShow||b.options.infinite===!1?b.$slideTrack.children(".slick-slide").eq(a):b.$slideTrack.children(".slick-slide").eq(a+b.options.slidesToShow+1),c=b.options.rtl===!0?f[0]?-1*(b.$slideTrack.width()-f[0].offsetLeft-f.width()):0:f[0]?-1*f[0].offsetLeft:0,c+=(b.$list.width()-f.outerWidth())/2)),c},b.prototype.getOption=b.prototype.slickGetOption=function(a){var b=this;return b.options[a]},b.prototype.getNavigableIndexes=function(){var e,a=this,b=0,c=0,d=[];for(a.options.infinite===!1?e=a.slideCount:(b=-1*a.options.slidesToScroll,c=-1*a.options.slidesToScroll,e=2*a.slideCount);e>b;)d.push(b),b=c+a.options.slidesToScroll,c+=a.options.slidesToScroll<=a.options.slidesToShow?a.options.slidesToScroll:a.options.slidesToShow;return d},b.prototype.getSlick=function(){return this},b.prototype.getSlideCount=function(){var c,d,e,b=this;return e=b.options.centerMode===!0?b.slideWidth*Math.floor(b.options.slidesToShow/2):0,b.options.swipeToSlide===!0?(b.$slideTrack.find(".slick-slide").each(function(c,f){return f.offsetLeft-e+a(f).outerWidth()/2>-1*b.swipeLeft?(d=f,!1):void 0}),c=Math.abs(a(d).attr("data-slick-index")-b.currentSlide)||1):b.options.slidesToScroll},b.prototype.goTo=b.prototype.slickGoTo=function(a,b){var c=this;c.changeSlide({data:{message:"index",index:parseInt(a)}},b)},b.prototype.init=function(b){var c=this;a(c.$slider).hasClass("slick-initialized")||(a(c.$slider).addClass("slick-initialized"),c.buildRows(),c.buildOut(),c.setProps(),c.startLoad(),c.loadSlider(),c.initializeEvents(),c.updateArrows(),c.updateDots()),b&&c.$slider.trigger("init",[c]),c.options.accessibility===!0&&c.initADA()},b.prototype.initArrowEvents=function(){var a=this;a.options.arrows===!0&&a.slideCount>a.options.slidesToShow&&(a.$prevArrow.on("click.slick",{message:"previous"},a.changeSlide),a.$nextArrow.on("click.slick",{message:"next"},a.changeSlide))},b.prototype.initDotEvents=function(){var b=this;b.options.dots===!0&&b.slideCount>b.options.slidesToShow&&a("li",b.$dots).on("click.slick",{message:"index"},b.changeSlide),b.options.dots===!0&&b.options.pauseOnDotsHover===!0&&b.options.autoplay===!0&&a("li",b.$dots).on("mouseenter.slick",a.proxy(b.setPaused,b,!0)).on("mouseleave.slick",a.proxy(b.setPaused,b,!1))},b.prototype.initializeEvents=function(){var b=this;b.initArrowEvents(),b.initDotEvents(),b.$list.on("touchstart.slick mousedown.slick",{action:"start"},b.swipeHandler),b.$list.on("touchmove.slick mousemove.slick",{action:"move"},b.swipeHandler),b.$list.on("touchend.slick mouseup.slick",{action:"end"},b.swipeHandler),b.$list.on("touchcancel.slick mouseleave.slick",{action:"end"},b.swipeHandler),b.$list.on("click.slick",b.clickHandler),a(document).on(b.visibilityChange,a.proxy(b.visibility,b)),b.$list.on("mouseenter.slick",a.proxy(b.setPaused,b,!0)),b.$list.on("mouseleave.slick",a.proxy(b.setPaused,b,!1)),b.options.accessibility===!0&&b.$list.on("keydown.slick",b.keyHandler),b.options.focusOnSelect===!0&&a(b.$slideTrack).children().on("click.slick",b.selectHandler),a(window).on("orientationchange.slick.slick-"+b.instanceUid,a.proxy(b.orientationChange,b)),a(window).on("resize.slick.slick-"+b.instanceUid,a.proxy(b.resize,b)),a("[draggable!=true]",b.$slideTrack).on("dragstart",b.preventDefault),a(window).on("load.slick.slick-"+b.instanceUid,b.setPosition),a(document).on("ready.slick.slick-"+b.instanceUid,b.setPosition)},b.prototype.initUI=function(){var a=this;a.options.arrows===!0&&a.slideCount>a.options.slidesToShow&&(a.$prevArrow.show(),a.$nextArrow.show()),a.options.dots===!0&&a.slideCount>a.options.slidesToShow&&a.$dots.show(),a.options.autoplay===!0&&a.autoPlay()},b.prototype.keyHandler=function(a){var b=this;a.target.tagName.match("TEXTAREA|INPUT|SELECT")||(37===a.keyCode&&b.options.accessibility===!0?b.changeSlide({data:{message:"previous"}}):39===a.keyCode&&b.options.accessibility===!0&&b.changeSlide({data:{message:"next"}}))},b.prototype.lazyLoad=function(){function g(b){a("img[data-lazy]",b).each(function(){var b=a(this),c=a(this).attr("data-lazy"),d=document.createElement("img");d.onload=function(){b.animate({opacity:0},100,function(){b.attr("src",c).animate({opacity:1},200,function(){b.removeAttr("data-lazy").removeClass("slick-loading")})})},d.src=c})}var c,d,e,f,b=this;b.options.centerMode===!0?b.options.infinite===!0?(e=b.currentSlide+(b.options.slidesToShow/2+1),f=e+b.options.slidesToShow+2):(e=Math.max(0,b.currentSlide-(b.options.slidesToShow/2+1)),f=2+(b.options.slidesToShow/2+1)+b.currentSlide):(e=b.options.infinite?b.options.slidesToShow+b.currentSlide:b.currentSlide,f=e+b.options.slidesToShow,b.options.fade===!0&&(e>0&&e--,f<=b.slideCount&&f++)),c=b.$slider.find(".slick-slide").slice(e,f),g(c),b.slideCount<=b.options.slidesToShow?(d=b.$slider.find(".slick-slide"),g(d)):b.currentSlide>=b.slideCount-b.options.slidesToShow?(d=b.$slider.find(".slick-cloned").slice(0,b.options.slidesToShow),g(d)):0===b.currentSlide&&(d=b.$slider.find(".slick-cloned").slice(-1*b.options.slidesToShow),g(d))},b.prototype.loadSlider=function(){var a=this;a.setPosition(),a.$slideTrack.css({opacity:1}),a.$slider.removeClass("slick-loading"),a.initUI(),"progressive"===a.options.lazyLoad&&a.progressiveLazyLoad()},b.prototype.next=b.prototype.slickNext=function(){var a=this;a.changeSlide({data:{message:"next"}})},b.prototype.orientationChange=function(){var a=this;a.checkResponsive(),a.setPosition()},b.prototype.pause=b.prototype.slickPause=function(){var a=this;a.autoPlayClear(),a.paused=!0},b.prototype.play=b.prototype.slickPlay=function(){var a=this;a.paused=!1,a.autoPlay()},b.prototype.postSlide=function(a){var b=this;b.$slider.trigger("afterChange",[b,a]),b.animating=!1,b.setPosition(),b.swipeLeft=null,b.options.autoplay===!0&&b.paused===!1&&b.autoPlay(),b.options.accessibility===!0&&b.initADA()},b.prototype.prev=b.prototype.slickPrev=function(){var a=this;a.changeSlide({data:{message:"previous"}})},b.prototype.preventDefault=function(a){a.preventDefault()},b.prototype.progressiveLazyLoad=function(){var c,d,b=this;c=a("img[data-lazy]",b.$slider).length,c>0&&(d=a("img[data-lazy]",b.$slider).first(),d.attr("src",null),d.attr("src",d.attr("data-lazy")).removeClass("slick-loading").load(function(){d.removeAttr("data-lazy"),b.progressiveLazyLoad(),b.options.adaptiveHeight===!0&&b.setPosition()}).error(function(){d.removeAttr("data-lazy"),b.progressiveLazyLoad()}))},b.prototype.refresh=function(b){var d,e,c=this;e=c.slideCount-c.options.slidesToShow,c.options.infinite||(c.slideCount<=c.options.slidesToShow?c.currentSlide=0:c.currentSlide>e&&(c.currentSlide=e)),d=c.currentSlide,c.destroy(!0),a.extend(c,c.initials,{currentSlide:d}),c.init(),b||c.changeSlide({data:{message:"index",index:d}},!1)},b.prototype.registerBreakpoints=function(){var c,d,e,b=this,f=b.options.responsive||null;if("array"===a.type(f)&&f.length){b.respondTo=b.options.respondTo||"window";for(c in f)if(e=b.breakpoints.length-1,d=f[c].breakpoint,f.hasOwnProperty(c)){for(;e>=0;)b.breakpoints[e]&&b.breakpoints[e]===d&&b.breakpoints.splice(e,1),e--;b.breakpoints.push(d),b.breakpointSettings[d]=f[c].settings}b.breakpoints.sort(function(a,c){return b.options.mobileFirst?a-c:c-a})}},b.prototype.reinit=function(){var b=this;b.$slides=b.$slideTrack.children(b.options.slide).addClass("slick-slide"),b.slideCount=b.$slides.length,b.currentSlide>=b.slideCount&&0!==b.currentSlide&&(b.currentSlide=b.currentSlide-b.options.slidesToScroll),b.slideCount<=b.options.slidesToShow&&(b.currentSlide=0),b.registerBreakpoints(),b.setProps(),b.setupInfinite(),b.buildArrows(),b.updateArrows(),b.initArrowEvents(),b.buildDots(),b.updateDots(),b.initDotEvents(),b.checkResponsive(!1,!0),b.options.focusOnSelect===!0&&a(b.$slideTrack).children().on("click.slick",b.selectHandler),b.setSlideClasses(0),b.setPosition(),b.$slider.trigger("reInit",[b]),b.options.autoplay===!0&&b.focusHandler()},b.prototype.resize=function(){var b=this;a(window).width()!==b.windowWidth&&(clearTimeout(b.windowDelay),b.windowDelay=window.setTimeout(function(){b.windowWidth=a(window).width(),b.checkResponsive(),b.unslicked||b.setPosition()},50))},b.prototype.removeSlide=b.prototype.slickRemove=function(a,b,c){var d=this;return"boolean"==typeof a?(b=a,a=b===!0?0:d.slideCount-1):a=b===!0?--a:a,d.slideCount<1||0>a||a>d.slideCount-1?!1:(d.unload(),c===!0?d.$slideTrack.children().remove():d.$slideTrack.children(this.options.slide).eq(a).remove(),d.$slides=d.$slideTrack.children(this.options.slide),d.$slideTrack.children(this.options.slide).detach(),d.$slideTrack.append(d.$slides),d.$slidesCache=d.$slides,void d.reinit())},b.prototype.setCSS=function(a){var d,e,b=this,c={};b.options.rtl===!0&&(a=-a),d="left"==b.positionProp?Math.ceil(a)+"px":"0px",e="top"==b.positionProp?Math.ceil(a)+"px":"0px",c[b.positionProp]=a,b.transformsEnabled===!1?b.$slideTrack.css(c):(c={},b.cssTransitions===!1?(c[b.animType]="translate("+d+", "+e+")",b.$slideTrack.css(c)):(c[b.animType]="translate3d("+d+", "+e+", 0px)",b.$slideTrack.css(c)))},b.prototype.setDimensions=function(){var a=this;a.options.vertical===!1?a.options.centerMode===!0&&a.$list.css({padding:"0px "+a.options.centerPadding}):(a.$list.height(a.$slides.first().outerHeight(!0)*a.options.slidesToShow),a.options.centerMode===!0&&a.$list.css({padding:a.options.centerPadding+" 0px"})),a.listWidth=a.$list.width(),a.listHeight=a.$list.height(),a.options.vertical===!1&&a.options.variableWidth===!1?(a.slideWidth=Math.ceil(a.listWidth/a.options.slidesToShow),a.$slideTrack.width(Math.ceil(a.slideWidth*a.$slideTrack.children(".slick-slide").length))):a.options.variableWidth===!0?a.$slideTrack.width(5e3*a.slideCount):(a.slideWidth=Math.ceil(a.listWidth),a.$slideTrack.height(Math.ceil(a.$slides.first().outerHeight(!0)*a.$slideTrack.children(".slick-slide").length)));var b=a.$slides.first().outerWidth(!0)-a.$slides.first().width();a.options.variableWidth===!1&&a.$slideTrack.children(".slick-slide").width(a.slideWidth-b)},b.prototype.setFade=function(){var c,b=this;b.$slides.each(function(d,e){c=b.slideWidth*d*-1,b.options.rtl===!0?a(e).css({position:"relative",right:c,top:0,zIndex:b.options.zIndex-2,opacity:0}):a(e).css({position:"relative",left:c,top:0,zIndex:b.options.zIndex-2,opacity:0})}),b.$slides.eq(b.currentSlide).css({zIndex:b.options.zIndex-1,opacity:1})},b.prototype.setHeight=function(){var a=this;if(1===a.options.slidesToShow&&a.options.adaptiveHeight===!0&&a.options.vertical===!1){var b=a.$slides.eq(a.currentSlide).outerHeight(!0);a.$list.css("height",b)}},b.prototype.setOption=b.prototype.slickSetOption=function(b,c,d){var f,g,e=this;if("responsive"===b&&"array"===a.type(c))for(g in c)if("array"!==a.type(e.options.responsive))e.options.responsive=[c[g]];else{for(f=e.options.responsive.length-1;f>=0;)e.options.responsive[f].breakpoint===c[g].breakpoint&&e.options.responsive.splice(f,1),f--;e.options.responsive.push(c[g])}else e.options[b]=c;d===!0&&(e.unload(),e.reinit())},b.prototype.setPosition=function(){var a=this;a.setDimensions(),a.setHeight(),a.options.fade===!1?a.setCSS(a.getLeft(a.currentSlide)):a.setFade(),a.$slider.trigger("setPosition",[a])},b.prototype.setProps=function(){var a=this,b=document.body.style;a.positionProp=a.options.vertical===!0?"top":"left","top"===a.positionProp?a.$slider.addClass("slick-vertical"):a.$slider.removeClass("slick-vertical"),(void 0!==b.WebkitTransition||void 0!==b.MozTransition||void 0!==b.msTransition)&&a.options.useCSS===!0&&(a.cssTransitions=!0),a.options.fade&&("number"==typeof a.options.zIndex?a.options.zIndex<3&&(a.options.zIndex=3):a.options.zIndex=a.defaults.zIndex),void 0!==b.OTransform&&(a.animType="OTransform",a.transformType="-o-transform",a.transitionType="OTransition",void 0===b.perspectiveProperty&&void 0===b.webkitPerspective&&(a.animType=!1)),void 0!==b.MozTransform&&(a.animType="MozTransform",a.transformType="-moz-transform",a.transitionType="MozTransition",void 0===b.perspectiveProperty&&void 0===b.MozPerspective&&(a.animType=!1)),void 0!==b.webkitTransform&&(a.animType="webkitTransform",a.transformType="-webkit-transform",a.transitionType="webkitTransition",void 0===b.perspectiveProperty&&void 0===b.webkitPerspective&&(a.animType=!1)),void 0!==b.msTransform&&(a.animType="msTransform",a.transformType="-ms-transform",a.transitionType="msTransition",void 0===b.msTransform&&(a.animType=!1)),void 0!==b.transform&&a.animType!==!1&&(a.animType="transform",a.transformType="transform",a.transitionType="transition"),a.transformsEnabled=a.options.useTransform&&null!==a.animType&&a.animType!==!1},b.prototype.setSlideClasses=function(a){var c,d,e,f,b=this;d=b.$slider.find(".slick-slide").removeClass("slick-active slick-center slick-current").attr("aria-hidden","true"),b.$slides.eq(a).addClass("slick-current"),b.options.centerMode===!0?(c=Math.floor(b.options.slidesToShow/2),b.options.infinite===!0&&(a>=c&&a<=b.slideCount-1-c?b.$slides.slice(a-c,a+c+1).addClass("slick-active").attr("aria-hidden","false"):(e=b.options.slidesToShow+a,d.slice(e-c+1,e+c+2).addClass("slick-active").attr("aria-hidden","false")),0===a?d.eq(d.length-1-b.options.slidesToShow).addClass("slick-center"):a===b.slideCount-1&&d.eq(b.options.slidesToShow).addClass("slick-center")),b.$slides.eq(a).addClass("slick-center")):a>=0&&a<=b.slideCount-b.options.slidesToShow?b.$slides.slice(a,a+b.options.slidesToShow).addClass("slick-active").attr("aria-hidden","false"):d.length<=b.options.slidesToShow?d.addClass("slick-active").attr("aria-hidden","false"):(f=b.slideCount%b.options.slidesToShow,e=b.options.infinite===!0?b.options.slidesToShow+a:a,b.options.slidesToShow==b.options.slidesToScroll&&b.slideCount-ab.options.slidesToShow)){for(e=b.options.centerMode===!0?b.options.slidesToShow+1:b.options.slidesToShow,c=b.slideCount;c>b.slideCount-e;c-=1)d=c-1,a(b.$slides[d]).clone(!0).attr("id","").attr("data-slick-index",d-b.slideCount).prependTo(b.$slideTrack).addClass("slick-cloned");for(c=0;e>c;c+=1)d=c,a(b.$slides[d]).clone(!0).attr("id","").attr("data-slick-index",d+b.slideCount).appendTo(b.$slideTrack).addClass("slick-cloned");b.$slideTrack.find(".slick-cloned").find("[id]").each(function(){a(this).attr("id","")})}},b.prototype.setPaused=function(a){var b=this;b.options.autoplay===!0&&b.options.pauseOnHover===!0&&(b.paused=a,a?b.autoPlayClear():b.autoPlay())},b.prototype.selectHandler=function(b){var c=this,d=a(b.target).is(".slick-slide")?a(b.target):a(b.target).parents(".slick-slide"),e=parseInt(d.attr("data-slick-index"));return e||(e=0),c.slideCount<=c.options.slidesToShow?(c.setSlideClasses(e),void c.asNavFor(e)):void c.slideHandler(e)},b.prototype.slideHandler=function(a,b,c){var d,e,f,g,h=null,i=this;return b=b||!1,i.animating===!0&&i.options.waitForAnimate===!0||i.options.fade===!0&&i.currentSlide===a||i.slideCount<=i.options.slidesToShow?void 0:(b===!1&&i.asNavFor(a),d=a,h=i.getLeft(d),g=i.getLeft(i.currentSlide),i.currentLeft=null===i.swipeLeft?g:i.swipeLeft,i.options.infinite===!1&&i.options.centerMode===!1&&(0>a||a>i.getDotCount()*i.options.slidesToScroll)?void(i.options.fade===!1&&(d=i.currentSlide,c!==!0?i.animateSlide(g,function(){i.postSlide(d); 18 | }):i.postSlide(d))):i.options.infinite===!1&&i.options.centerMode===!0&&(0>a||a>i.slideCount-i.options.slidesToScroll)?void(i.options.fade===!1&&(d=i.currentSlide,c!==!0?i.animateSlide(g,function(){i.postSlide(d)}):i.postSlide(d))):(i.options.autoplay===!0&&clearInterval(i.autoPlayTimer),e=0>d?i.slideCount%i.options.slidesToScroll!==0?i.slideCount-i.slideCount%i.options.slidesToScroll:i.slideCount+d:d>=i.slideCount?i.slideCount%i.options.slidesToScroll!==0?0:d-i.slideCount:d,i.animating=!0,i.$slider.trigger("beforeChange",[i,i.currentSlide,e]),f=i.currentSlide,i.currentSlide=e,i.setSlideClasses(i.currentSlide),i.updateDots(),i.updateArrows(),i.options.fade===!0?(c!==!0?(i.fadeSlideOut(f),i.fadeSlide(e,function(){i.postSlide(e)})):i.postSlide(e),void i.animateHeight()):void(c!==!0?i.animateSlide(h,function(){i.postSlide(e)}):i.postSlide(e))))},b.prototype.startLoad=function(){var a=this;a.options.arrows===!0&&a.slideCount>a.options.slidesToShow&&(a.$prevArrow.hide(),a.$nextArrow.hide()),a.options.dots===!0&&a.slideCount>a.options.slidesToShow&&a.$dots.hide(),a.$slider.addClass("slick-loading")},b.prototype.swipeDirection=function(){var a,b,c,d,e=this;return a=e.touchObject.startX-e.touchObject.curX,b=e.touchObject.startY-e.touchObject.curY,c=Math.atan2(b,a),d=Math.round(180*c/Math.PI),0>d&&(d=360-Math.abs(d)),45>=d&&d>=0?e.options.rtl===!1?"left":"right":360>=d&&d>=315?e.options.rtl===!1?"left":"right":d>=135&&225>=d?e.options.rtl===!1?"right":"left":e.options.verticalSwiping===!0?d>=35&&135>=d?"left":"right":"vertical"},b.prototype.swipeEnd=function(a){var c,b=this;if(b.dragging=!1,b.shouldClick=b.touchObject.swipeLength>10?!1:!0,void 0===b.touchObject.curX)return!1;if(b.touchObject.edgeHit===!0&&b.$slider.trigger("edge",[b,b.swipeDirection()]),b.touchObject.swipeLength>=b.touchObject.minSwipe)switch(b.swipeDirection()){case"left":c=b.options.swipeToSlide?b.checkNavigable(b.currentSlide+b.getSlideCount()):b.currentSlide+b.getSlideCount(),b.slideHandler(c),b.currentDirection=0,b.touchObject={},b.$slider.trigger("swipe",[b,"left"]);break;case"right":c=b.options.swipeToSlide?b.checkNavigable(b.currentSlide-b.getSlideCount()):b.currentSlide-b.getSlideCount(),b.slideHandler(c),b.currentDirection=1,b.touchObject={},b.$slider.trigger("swipe",[b,"right"])}else b.touchObject.startX!==b.touchObject.curX&&(b.slideHandler(b.currentSlide),b.touchObject={})},b.prototype.swipeHandler=function(a){var b=this;if(!(b.options.swipe===!1||"ontouchend"in document&&b.options.swipe===!1||b.options.draggable===!1&&-1!==a.type.indexOf("mouse")))switch(b.touchObject.fingerCount=a.originalEvent&&void 0!==a.originalEvent.touches?a.originalEvent.touches.length:1,b.touchObject.minSwipe=b.listWidth/b.options.touchThreshold,b.options.verticalSwiping===!0&&(b.touchObject.minSwipe=b.listHeight/b.options.touchThreshold),a.data.action){case"start":b.swipeStart(a);break;case"move":b.swipeMove(a);break;case"end":b.swipeEnd(a)}},b.prototype.swipeMove=function(a){var d,e,f,g,h,b=this;return h=void 0!==a.originalEvent?a.originalEvent.touches:null,!b.dragging||h&&1!==h.length?!1:(d=b.getLeft(b.currentSlide),b.touchObject.curX=void 0!==h?h[0].pageX:a.clientX,b.touchObject.curY=void 0!==h?h[0].pageY:a.clientY,b.touchObject.swipeLength=Math.round(Math.sqrt(Math.pow(b.touchObject.curX-b.touchObject.startX,2))),b.options.verticalSwiping===!0&&(b.touchObject.swipeLength=Math.round(Math.sqrt(Math.pow(b.touchObject.curY-b.touchObject.startY,2)))),e=b.swipeDirection(),"vertical"!==e?(void 0!==a.originalEvent&&b.touchObject.swipeLength>4&&a.preventDefault(),g=(b.options.rtl===!1?1:-1)*(b.touchObject.curX>b.touchObject.startX?1:-1),b.options.verticalSwiping===!0&&(g=b.touchObject.curY>b.touchObject.startY?1:-1),f=b.touchObject.swipeLength,b.touchObject.edgeHit=!1,b.options.infinite===!1&&(0===b.currentSlide&&"right"===e||b.currentSlide>=b.getDotCount()&&"left"===e)&&(f=b.touchObject.swipeLength*b.options.edgeFriction,b.touchObject.edgeHit=!0),b.options.vertical===!1?b.swipeLeft=d+f*g:b.swipeLeft=d+f*(b.$list.height()/b.listWidth)*g,b.options.verticalSwiping===!0&&(b.swipeLeft=d+f*g),b.options.fade===!0||b.options.touchMove===!1?!1:b.animating===!0?(b.swipeLeft=null,!1):void b.setCSS(b.swipeLeft)):void 0)},b.prototype.swipeStart=function(a){var c,b=this;return 1!==b.touchObject.fingerCount||b.slideCount<=b.options.slidesToShow?(b.touchObject={},!1):(void 0!==a.originalEvent&&void 0!==a.originalEvent.touches&&(c=a.originalEvent.touches[0]),b.touchObject.startX=b.touchObject.curX=void 0!==c?c.pageX:a.clientX,b.touchObject.startY=b.touchObject.curY=void 0!==c?c.pageY:a.clientY,void(b.dragging=!0))},b.prototype.unfilterSlides=b.prototype.slickUnfilter=function(){var a=this;null!==a.$slidesCache&&(a.unload(),a.$slideTrack.children(this.options.slide).detach(),a.$slidesCache.appendTo(a.$slideTrack),a.reinit())},b.prototype.unload=function(){var b=this;a(".slick-cloned",b.$slider).remove(),b.$dots&&b.$dots.remove(),b.$prevArrow&&b.htmlExpr.test(b.options.prevArrow)&&b.$prevArrow.remove(),b.$nextArrow&&b.htmlExpr.test(b.options.nextArrow)&&b.$nextArrow.remove(),b.$slides.removeClass("slick-slide slick-active slick-visible slick-current").attr("aria-hidden","true").css("width","")},b.prototype.unslick=function(a){var b=this;b.$slider.trigger("unslick",[b,a]),b.destroy()},b.prototype.updateArrows=function(){var b,a=this;b=Math.floor(a.options.slidesToShow/2),a.options.arrows===!0&&a.slideCount>a.options.slidesToShow&&!a.options.infinite&&(a.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false"),a.$nextArrow.removeClass("slick-disabled").attr("aria-disabled","false"),0===a.currentSlide?(a.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true"),a.$nextArrow.removeClass("slick-disabled").attr("aria-disabled","false")):a.currentSlide>=a.slideCount-a.options.slidesToShow&&a.options.centerMode===!1?(a.$nextArrow.addClass("slick-disabled").attr("aria-disabled","true"),a.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false")):a.currentSlide>=a.slideCount-1&&a.options.centerMode===!0&&(a.$nextArrow.addClass("slick-disabled").attr("aria-disabled","true"),a.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false")))},b.prototype.updateDots=function(){var a=this;null!==a.$dots&&(a.$dots.find("li").removeClass("slick-active").attr("aria-hidden","true"),a.$dots.find("li").eq(Math.floor(a.currentSlide/a.options.slidesToScroll)).addClass("slick-active").attr("aria-hidden","false"))},b.prototype.visibility=function(){var a=this;document[a.hidden]?(a.paused=!0,a.autoPlayClear()):a.options.autoplay===!0&&(a.paused=!1,a.autoPlay())},b.prototype.initADA=function(){var b=this;b.$slides.add(b.$slideTrack.find(".slick-cloned")).attr({"aria-hidden":"true",tabindex:"-1"}).find("a, input, button, select").attr({tabindex:"-1"}),b.$slideTrack.attr("role","listbox"),b.$slides.not(b.$slideTrack.find(".slick-cloned")).each(function(c){a(this).attr({role:"option","aria-describedby":"slick-slide"+b.instanceUid+c})}),null!==b.$dots&&b.$dots.attr("role","tablist").find("li").each(function(c){a(this).attr({role:"presentation","aria-selected":"false","aria-controls":"navigation"+b.instanceUid+c,id:"slick-slide"+b.instanceUid+c})}).first().attr("aria-selected","true").end().find("button").attr("role","button").end().closest("div").attr("role","toolbar"),b.activateADA()},b.prototype.activateADA=function(){var a=this;a.$slideTrack.find(".slick-active").attr({"aria-hidden":"false"}).find("a, input, button, select").attr({tabindex:"0"})},b.prototype.focusHandler=function(){var b=this;b.$slider.on("focus.slick blur.slick","*",function(c){c.stopImmediatePropagation();var d=a(this);setTimeout(function(){b.isPlay&&(d.is(":focus")?(b.autoPlayClear(),b.paused=!0):(b.paused=!1,b.autoPlay()))},0)})},a.fn.slick=function(){var f,g,a=this,c=arguments[0],d=Array.prototype.slice.call(arguments,1),e=a.length;for(f=0;e>f;f++)if("object"==typeof c||"undefined"==typeof c?a[f].slick=new b(a[f],c):g=a[f].slick[c].apply(a[f].slick,d),"undefined"!=typeof g)return g;return a}}); --------------------------------------------------------------------------------