@projektemacher/storymapjs 0.10.7 → 0.10.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG +350 -19
- package/README.md +43 -9
- package/dist/assets/demo-DBpeF31K.js +1 -0
- package/dist/assets/harness-Cr0rYpvt.js +1 -0
- package/dist/assets/harness-multi-CYHgI0a9.js +1 -0
- package/dist/assets/harness-support-Do7sIp2j.js +1 -0
- package/dist/assets/index-wHPqGrBS.js +1 -0
- package/dist/assets/main-DXalctuR.js +17 -0
- package/dist/context.json +12 -9
- package/dist/css/fonts/files/amatic-sc-cyrillic-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/amatic-sc-cyrillic-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/amatic-sc-hebrew-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/amatic-sc-hebrew-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/amatic-sc-vietnamese-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/amatic-sc-vietnamese-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-100-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-100-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-200-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-200-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-300-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-300-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-500-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-500-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-600-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-600-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-800-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-800-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-900-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-900-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-100-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-100-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-200-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-200-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-300-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-300-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-500-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-500-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-600-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-600-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-800-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-800-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-900-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-900-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-100-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-100-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-200-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-200-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-300-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-300-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-500-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-500-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-600-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-600-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-800-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-800-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-900-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-900-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-arabic-200-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-arabic-300-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-arabic-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-arabic-500-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-arabic-600-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-arabic-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-arabic-800-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-arabic-900-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-200-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-300-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-500-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-600-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-800-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-900-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-ext-200-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-ext-300-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-ext-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-ext-500-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-ext-600-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-ext-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-ext-800-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-ext-900-normal.woff2 +0 -0
- package/dist/css/fonts/files/dancing-script-vietnamese-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/eb-garamond-cyrillic-ext-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/eb-garamond-cyrillic-ext-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/eb-garamond-cyrillic-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/eb-garamond-cyrillic-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/eb-garamond-greek-ext-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/eb-garamond-greek-ext-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/eb-garamond-greek-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/eb-garamond-greek-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/eb-garamond-vietnamese-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/eb-garamond-vietnamese-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-cyrillic-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-cyrillic-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-cyrillic-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-cyrillic-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-cyrillic-ext-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-cyrillic-ext-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-cyrillic-ext-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-cyrillic-ext-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-greek-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-greek-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-greek-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-greek-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-greek-ext-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-greek-ext-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-greek-ext-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-greek-ext-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-vietnamese-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-vietnamese-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-vietnamese-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-vietnamese-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/old-standard-tt-cyrillic-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/old-standard-tt-cyrillic-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/old-standard-tt-cyrillic-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/old-standard-tt-cyrillic-ext-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/old-standard-tt-cyrillic-ext-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/old-standard-tt-cyrillic-ext-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/old-standard-tt-vietnamese-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/old-standard-tt-vietnamese-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/old-standard-tt-vietnamese-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/open-sans-cyrillic-ext-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/open-sans-cyrillic-ext-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/open-sans-cyrillic-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/open-sans-cyrillic-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/open-sans-greek-ext-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/open-sans-greek-ext-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/open-sans-greek-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/open-sans-greek-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/open-sans-hebrew-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/open-sans-hebrew-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/open-sans-vietnamese-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/open-sans-vietnamese-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-cyrillic-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-cyrillic-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-sc-cyrillic-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-sc-cyrillic-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-sc-cyrillic-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-sc-cyrillic-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-sc-cyrillic-900-italic.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-sc-cyrillic-900-normal.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-sc-vietnamese-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-sc-vietnamese-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-sc-vietnamese-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-sc-vietnamese-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-sc-vietnamese-900-italic.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-sc-vietnamese-900-normal.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-vietnamese-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-vietnamese-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/pt-sans-cyrillic-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/pt-sans-cyrillic-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/pt-sans-cyrillic-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/pt-sans-cyrillic-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/pt-sans-cyrillic-ext-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/pt-sans-cyrillic-ext-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/pt-sans-cyrillic-ext-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/pt-sans-cyrillic-ext-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/pt-sans-narrow-cyrillic-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/pt-sans-narrow-cyrillic-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/pt-sans-narrow-cyrillic-ext-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/pt-sans-narrow-cyrillic-ext-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/pt-serif-cyrillic-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/pt-serif-cyrillic-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/pt-serif-cyrillic-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/pt-serif-cyrillic-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/pt-serif-cyrillic-ext-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/pt-serif-cyrillic-ext-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/pt-serif-cyrillic-ext-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/pt-serif-cyrillic-ext-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/raleway-cyrillic-ext-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/raleway-cyrillic-ext-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/raleway-cyrillic-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/raleway-cyrillic-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/raleway-vietnamese-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/raleway-vietnamese-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/roboto-slab-cyrillic-ext-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/roboto-slab-cyrillic-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/roboto-slab-greek-ext-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/roboto-slab-greek-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/roboto-slab-vietnamese-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-300-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-300-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-500-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-500-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-ext-300-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-ext-300-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-ext-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-ext-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-ext-500-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-ext-500-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-ext-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-ext-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-300-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-300-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-500-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-500-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-ext-300-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-ext-300-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-ext-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-ext-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-ext-500-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-ext-500-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-ext-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-ext-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/unica-one-vietnamese-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/vollkorn-cyrillic-ext-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/vollkorn-cyrillic-ext-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/vollkorn-cyrillic-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/vollkorn-cyrillic-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/vollkorn-greek-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/vollkorn-greek-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/vollkorn-vietnamese-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/vollkorn-vietnamese-wght-normal.woff2 +0 -0
- package/dist/css/fonts/font.abril-droidsans.css +3 -0
- package/dist/css/fonts/font.amatic-andika.css +57 -0
- package/dist/css/fonts/font.bitter-raleway.css +111 -0
- package/dist/css/fonts/font.cairo.css +312 -0
- package/dist/css/fonts/font.clicker-garamond.css +93 -0
- package/dist/css/fonts/font.dancing-ledger.css +12 -0
- package/dist/css/fonts/font.default.css +183 -0
- package/dist/css/fonts/font.fjalla-average.css +3 -0
- package/dist/css/fonts/font.georgia-helvetica.css +3 -0
- package/dist/css/fonts/font.knightlab.css +642 -0
- package/dist/css/fonts/font.lustria-lato.css +3 -0
- package/dist/css/fonts/font.medula-lato.css +3 -0
- package/dist/css/fonts/font.oldstandard.css +84 -0
- package/dist/css/fonts/font.opensans-gentiumbook.css +183 -0
- package/dist/css/fonts/font.playfair-faunaone.css +39 -0
- package/dist/css/fonts/font.playfair.css +147 -0
- package/dist/css/fonts/font.pt.css +183 -0
- package/dist/css/fonts/font.roboto-megrim.css +3 -0
- package/dist/css/fonts/font.rufina-sintony.css +3 -0
- package/dist/css/fonts/font.ubuntu.css +291 -0
- package/dist/css/fonts/font.unicaone-vollkorn.css +84 -0
- package/dist/css/storymap.css +1 -1
- package/dist/demo.html +2 -2
- package/dist/docs/api/.nojekyll +1 -0
- package/dist/docs/api/assets/custom.css +47 -0
- package/dist/docs/api/assets/hierarchy.js +1 -0
- package/dist/docs/api/assets/highlight.css +57 -0
- package/dist/docs/api/assets/icons.js +18 -0
- package/dist/docs/api/assets/icons.svg +1 -0
- package/dist/docs/api/assets/main.js +60 -0
- package/dist/docs/api/assets/navigation.js +1 -0
- package/dist/docs/api/assets/search.js +1 -0
- package/dist/docs/api/assets/style.css +1648 -0
- package/dist/docs/api/classes/StoryMap.html +1604 -0
- package/dist/docs/api/functions/MediaType.html +51 -0
- package/dist/docs/api/functions/isPresentation3Collection.html +47 -0
- package/dist/docs/api/functions/isPresentation3Manifest.html +53 -0
- package/dist/docs/api/functions/loadCSS.html +63 -0
- package/dist/docs/api/functions/manifestToStorymapData.html +49 -0
- package/dist/docs/api/functions/setLanguage.html +54 -0
- package/dist/docs/api/functions/storymapToManifest.html +57 -0
- package/dist/docs/api/functions/validateStorymap.html +53 -0
- package/dist/docs/api/functions/validateStorymapAndReport.html +54 -0
- package/dist/docs/api/hierarchy.html +28 -0
- package/dist/docs/api/index.html +197 -0
- package/dist/docs/api/interfaces/AnimationHandle.html +60 -0
- package/dist/docs/api/interfaces/ImagereadyPayload.html +71 -0
- package/dist/docs/api/interfaces/LanguageEntry.html +102 -0
- package/dist/docs/api/interfaces/LatLngLiteral.html +73 -0
- package/dist/docs/api/interfaces/LoadOptions.html +59 -0
- package/dist/docs/api/interfaces/OlLayer.html +1400 -0
- package/dist/docs/api/interfaces/OlMap.html +1656 -0
- package/dist/docs/api/interfaces/OlProjection.html +332 -0
- package/dist/docs/api/interfaces/OlSource.html +784 -0
- package/dist/docs/api/interfaces/OlTileLayer.html +1497 -0
- package/dist/docs/api/interfaces/OlVectorLayer.html +1559 -0
- package/dist/docs/api/interfaces/OlView.html +1958 -0
- package/dist/docs/api/interfaces/StorymapData.html +71 -0
- package/dist/docs/api/interfaces/StorymapDataWrapper.html +60 -0
- package/dist/docs/api/interfaces/StorymapDocument.html +68 -0
- package/dist/docs/api/interfaces/StorymapError.html +63 -0
- package/dist/docs/api/interfaces/StorymapGeoreference.html +93 -0
- package/dist/docs/api/interfaces/StorymapGeoreferenceBody.html +74 -0
- package/dist/docs/api/interfaces/StorymapGroundControlPoint.html +69 -0
- package/dist/docs/api/interfaces/StorymapLanguageMap.html +57 -0
- package/dist/docs/api/interfaces/StorymapManifest.html +118 -0
- package/dist/docs/api/interfaces/StorymapManifestAnnotation.html +105 -0
- package/dist/docs/api/interfaces/StorymapManifestBackground.html +81 -0
- package/dist/docs/api/interfaces/StorymapManifestCanvas.html +140 -0
- package/dist/docs/api/interfaces/StorymapManifestContentResource.html +97 -0
- package/dist/docs/api/interfaces/StorymapManifestFeatureCollection.html +82 -0
- package/dist/docs/api/interfaces/StorymapManifestGeoreferencing.html +87 -0
- package/dist/docs/api/interfaces/StorymapManifestImageService.html +69 -0
- package/dist/docs/api/interfaces/StorymapManifestRange.html +75 -0
- package/dist/docs/api/interfaces/StorymapManifestService.html +77 -0
- package/dist/docs/api/interfaces/StorymapManifestSpecificResource.html +69 -0
- package/dist/docs/api/interfaces/StorymapManifestStatement.html +63 -0
- package/dist/docs/api/interfaces/StorymapMapOptions.html +92 -0
- package/dist/docs/api/interfaces/StorymapOptions.html +532 -0
- package/dist/docs/api/interfaces/StorymapOverlayLayer.html +126 -0
- package/dist/docs/api/interfaces/StorymapSlide.html +132 -0
- package/dist/docs/api/interfaces/StorymapSlideBackground.html +72 -0
- package/dist/docs/api/interfaces/StorymapSlideLocation.html +117 -0
- package/dist/docs/api/interfaces/StorymapSlideMarker.html +104 -0
- package/dist/docs/api/interfaces/StorymapSlideMedia.html +110 -0
- package/dist/docs/api/interfaces/StorymapSlideNarration.html +65 -0
- package/dist/docs/api/interfaces/StorymapSlideText.html +72 -0
- package/dist/docs/api/interfaces/StorymapTilejson.html +105 -0
- package/dist/docs/api/media/es.json +31 -0
- package/dist/docs/api/media/migration-from-knightlab.md +359 -0
- package/dist/docs/api/modules.html +50 -0
- package/dist/docs/api/types/ContentState.html +70 -0
- package/dist/docs/api/types/ImagereadyKind.html +34 -0
- package/dist/docs/api/types/MediaTypeMatch.html +78 -0
- package/dist/docs/api/types/TileSourceFactory.html +53 -0
- package/dist/docs/authoring.html +293 -0
- package/dist/docs/iiif.html +617 -62
- package/dist/docs/migration.html +313 -11
- package/dist/docs/readme.html +40 -9
- package/dist/embed/index.html +1 -1
- package/dist/examples/issue-242-nonlatin.json +55 -0
- package/dist/examples/issue-305-start-at-slide-data.json +96 -0
- package/dist/examples/issue-358-iframe.json +57 -0
- package/dist/examples/issue-iiif-geo.json +32 -0
- package/dist/examples/issue-image-alt.json +23 -0
- package/dist/examples/issue-image-region.json +42 -0
- package/dist/examples/issue-image-srcset.json +24 -0
- package/dist/examples/map-area-overlays.json +68 -0
- package/dist/examples/no-map.json +44 -0
- package/dist/examples-iiif/annotated-image.json +188 -0
- package/dist/examples-iiif/bob-boilen.json +11 -5
- package/dist/examples-iiif/courbet.json +9 -6
- package/dist/examples-iiif/empty.json +8 -4
- package/dist/examples-iiif/flickr-drewvigal.json +248 -24
- package/dist/examples-iiif/flickr-zach.wise.json +8 -4
- package/dist/examples-iiif/georeferenced-layer-unsupported.json +153 -0
- package/dist/examples-iiif/georeferenced-layer.json +318 -0
- package/dist/examples-iiif/iiif-wellcome.json +9 -6
- package/dist/examples-iiif/instagram-chenpamela.json +381 -36
- package/dist/examples-iiif/instagram_brentfoster.json +429 -40
- package/dist/examples-iiif/instagram_couch.json +261 -26
- package/dist/examples-iiif/instagram_joegermuska.json +441 -41
- package/dist/examples-iiif/instagram_matteich.json +261 -26
- package/dist/examples-iiif/instagram_mirandamulligan.json +261 -26
- package/dist/examples-iiif/instagram_raymondmccrea.json +261 -26
- package/dist/examples-iiif/instagram_test.json +261 -26
- package/dist/examples-iiif/issue-134-no-lines.json +9 -5
- package/dist/examples-iiif/issue-177-color-vars.json +9 -5
- package/dist/examples-iiif/issue-211-rtl.json +9 -5
- package/dist/examples-iiif/issue-242-nonlatin.json +239 -0
- package/dist/examples-iiif/issue-272-facebook.json +9 -5
- package/dist/examples-iiif/issue-305-start-at-slide-data.json +305 -0
- package/dist/examples-iiif/issue-305-start-at-slide.json +9 -5
- package/dist/examples-iiif/issue-341-distance.json +9 -5
- package/dist/examples-iiif/issue-358-iframe.json +190 -0
- package/dist/examples-iiif/issue-360-juxtapose.json +22 -7
- package/dist/examples-iiif/issue-368-null-fields.json +9 -5
- package/dist/examples-iiif/issue-375-code-lists.json +9 -5
- package/dist/examples-iiif/issue-381-dateline.json +9 -5
- package/dist/examples-iiif/issue-405-custom-icon.json +203 -0
- package/dist/examples-iiif/issue-425-many-slides.json +9 -5
- package/dist/examples-iiif/issue-428-background.json +20 -8
- package/dist/examples-iiif/issue-435-googlemaps.json +9 -5
- package/dist/examples-iiif/issue-437-documentcloud.json +22 -7
- package/dist/examples-iiif/issue-451-webp.json +9 -5
- package/dist/examples-iiif/issue-455-audio.json +9 -5
- package/dist/examples-iiif/issue-480-shorts.json +9 -5
- package/dist/examples-iiif/issue-506-marker-sync.json +9 -5
- package/dist/examples-iiif/issue-iiif-geo.json +200 -0
- package/dist/examples-iiif/issue-image-alt.json +90 -0
- package/dist/examples-iiif/issue-image-region.json +203 -0
- package/dist/examples-iiif/issue-image-srcset.json +87 -0
- package/dist/examples-iiif/jansteen.json +9 -6
- package/dist/examples-iiif/katrina.json +197 -41
- package/dist/examples-iiif/map-area-overlays.json +289 -0
- package/dist/examples-iiif/marktwain.json +255 -58
- package/dist/examples-iiif/no-map.json +148 -0
- package/dist/examples-iiif/population.json +440 -76
- package/dist/examples-iiif/president.json +456 -83
- package/dist/examples-iiif/scroll-hint.json +190 -0
- package/dist/examples-iiif/seurat.json +113 -22
- package/dist/examples-iiif/zoomify-clamp.json +153 -0
- package/dist/harness-multi.html +17 -0
- package/dist/harness.html +3 -2
- package/dist/index.html +16 -10
- package/dist/js/storymap.d.ts +1439 -114
- package/dist/js/storymap.js +24654 -21936
- package/dist/js/storymap.js.map +1 -1
- package/dist/navplace-properties.json +40 -0
- package/docs/migration-from-knightlab.md +229 -9
- package/docs/storymap-as-iiif-manifest.md +559 -135
- package/package.json +11 -8
- package/schema/storymap.schema.json +431 -78
- package/src/animation/easings.ts +8 -1
- package/src/animation/tween.ts +186 -0
- package/src/core/Browser.ts +6 -5
- package/src/core/Load.ts +54 -2
- package/src/core/Util.ts +255 -193
- package/src/core/mixins.ts +24 -7
- package/src/core/viewers.ts +94 -0
- package/src/dom/DomEvent.ts +27 -8
- package/src/globals.d.ts +8 -0
- package/src/language/Language.ts +199 -25
- package/src/language/locale/.expected-gaps.json +86 -0
- package/src/language/locale/be.json +15 -2
- package/src/language/locale/bg.json +15 -2
- package/src/language/locale/cs.json +15 -2
- package/src/language/locale/de.json +12 -1
- package/src/language/locale/el.json +15 -2
- package/src/language/locale/en.json +6 -2
- package/src/language/locale/es.json +15 -2
- package/src/language/locale/et.json +5 -1
- package/src/language/locale/fr.json +15 -2
- package/src/language/locale/he.json +16 -3
- package/src/language/locale/hu.json +15 -2
- package/src/language/locale/is.json +5 -1
- package/src/language/locale/it.json +15 -2
- package/src/language/locale/jp.json +15 -2
- package/src/language/locale/ko.json +15 -2
- package/src/language/locale/nl.json +15 -2
- package/src/language/locale/nn.json +5 -1
- package/src/language/locale/no.json +15 -2
- package/src/language/locale/pl.json +15 -2
- package/src/language/locale/pt.json +15 -2
- package/src/language/locale/ru.json +15 -2
- package/src/language/locale/sk.json +15 -2
- package/src/language/locale/sr.json +5 -1
- package/src/language/locale/sv.json +15 -2
- package/src/language/locale/tr.json +15 -2
- package/src/language/locale/uk.json +15 -2
- package/src/language/locale/ur.json +5 -1
- package/src/language/locale/zh-cn.json +15 -2
- package/src/language/locale/zh-tw.json +15 -2
- package/src/main.ts +92 -0
- package/src/map/Map.ts +183 -106
- package/src/map/MapMarker.ts +28 -5
- package/src/map/georeference.ts +325 -0
- package/src/map/openlayers/Map.OpenLayers.ts +850 -237
- package/src/map/openlayers/MapMarker.OpenLayers.ts +248 -24
- package/src/map/openlayers/zoomifyTiles.ts +1 -4
- package/src/media/EmbedUtil.ts +308 -24
- package/src/media/Media.ts +243 -55
- package/src/media/embedId.ts +104 -0
- package/src/media/types/Audio.ts +9 -82
- package/src/media/types/Blockquote.ts +2 -3
- package/src/media/types/DailyMotion.ts +5 -10
- package/src/media/types/DocumentCloud.ts +6 -35
- package/src/media/types/Facebook.ts +3 -4
- package/src/media/types/Flickr.ts +9 -9
- package/src/media/types/GoogleDoc.ts +3 -4
- package/src/media/types/HtmlMedia.ts +167 -0
- package/src/media/types/IFrame.ts +3 -4
- package/src/media/types/Image.ts +72 -6
- package/src/media/types/Juxtapose.ts +14 -5
- package/src/media/types/SoundCloud.ts +28 -6
- package/src/media/types/Text.ts +19 -13
- package/src/media/types/Twitter.ts +27 -14
- package/src/media/types/Video.ts +9 -79
- package/src/media/types/Vimeo.ts +10 -10
- package/src/media/types/Website.ts +23 -13
- package/src/media/types/Wikipedia.ts +18 -8
- package/src/media/types/YouTube.ts +71 -39
- package/src/scss/Typography.scss +1 -3
- package/src/scss/VCO.StoryMap.Dark.scss +18 -6
- package/src/scss/VCO.StoryMap.scss +37 -6
- package/src/scss/Variables.Dark.scss +3 -2
- package/src/scss/Variables.scss +3 -2
- package/src/scss/core/Mixins.scss +5 -63
- package/src/scss/fonts/font.amatic-andika.scss +3 -0
- package/src/scss/fonts/font.bitter-raleway.scss +6 -0
- package/src/scss/fonts/font.cairo.scss +79 -0
- package/src/scss/fonts/font.clicker-garamond.scss +5 -0
- package/src/scss/fonts/font.dancing-ledger.scss +1 -0
- package/src/scss/fonts/font.knightlab.scss +14 -0
- package/src/scss/fonts/font.oldstandard.scss +6 -0
- package/src/scss/fonts/font.opensans-gentiumbook.scss +5 -0
- package/src/scss/fonts/font.playfair-faunaone.scss +2 -0
- package/src/scss/fonts/font.playfair.scss +4 -0
- package/src/scss/fonts/font.pt.scss +6 -0
- package/src/scss/fonts/font.ubuntu.scss +4 -0
- package/src/scss/fonts/font.unicaone-vollkorn.scss +5 -0
- package/src/scss/map/VCO.MapMarker.scss +98 -3
- package/src/scss/media/VCO.Media.scss +7 -10
- package/src/scss/media/types/VCO.Media.Text.scss +8 -0
- package/src/scss/media/types/VCO.Media.Wikipedia.scss +2 -1
- package/src/scss/slider/VCO.Slide.scss +13 -3
- package/src/scss/slider/VCO.SlideNav.scss +11 -17
- package/src/scss/slider/VCO.StorySlider.scss +4 -2
- package/src/scss/ui/VCO.Consent.scss +44 -0
- package/src/scss/ui/VCO.MenuBar.Button.scss +8 -0
- package/src/scss/ui/VCO.Message.scss +2 -5
- package/src/site/site.ts +2 -1
- package/src/slider/Slide.ts +121 -27
- package/src/slider/SlideNav.ts +39 -5
- package/src/slider/StorySlider.ts +153 -42
- package/src/storymap/Consent.ts +407 -82
- package/src/storymap/StoryMap.ts +1192 -182
- package/src/storymap/content-state.ts +185 -0
- package/src/storymap/iiif.ts +1526 -68
- package/src/storymap/to-iiif.ts +921 -0
- package/src/storymap/validate.ts +80 -7
- package/src/types.ts +223 -26
- package/src/ui/MenuBar.ts +98 -45
- package/src/ui/Message.ts +9 -0
- package/src/ui/Swipable.ts +145 -78
- package/dist/assets/demo-D6cTmzn6.js +0 -1
- package/dist/assets/harness-BPFlzutp.js +0 -1
- package/dist/assets/index-DDsPBPZA.js +0 -1
- package/dist/assets/main-Y-MYUSJ4.js +0 -17
- package/src/animation/morpheus.d.ts +0 -41
- package/src/scss/media/types/VCO.Media.Instagram.scss +0 -7
- package/src/scss/media/types/VCO.Media.Profile.scss +0 -5
- package/src/ui/Draggable.ts +0 -374
|
@@ -14,17 +14,52 @@ the fixtures in [`public/examples/`](../public/examples/) are real-world samples
|
|
|
14
14
|
|
|
15
15
|
## Contexts
|
|
16
16
|
|
|
17
|
-
A manifest
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
A manifest declares four context URLs, in this order: the official
|
|
18
|
+
[navPlace extension](https://iiif.io/api/extension/navplace/) context (which
|
|
19
|
+
§3.1 of the extension requires before Presentation 3), the Presentation 3.0
|
|
20
|
+
context, the navPlace properties context, and the StoryMap extension context.
|
|
21
|
+
The last of the four resolves to the document below — shown inline here for
|
|
22
|
+
reference; a manifest must reference it by URL, not paste it in (see the
|
|
23
|
+
`@context` rule under "Validator interop"):
|
|
20
24
|
|
|
21
25
|
```json
|
|
22
26
|
{
|
|
23
|
-
"@context":
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
|
|
27
|
+
"@context": {
|
|
28
|
+
"@version": 1.1,
|
|
29
|
+
"storymap": "https://christianmahnke.de/iiif/storymap#",
|
|
30
|
+
"mapAsImage": "storymap:mapAsImage",
|
|
31
|
+
"basemap": "storymap:basemap",
|
|
32
|
+
"tilejson": "storymap:tilejson",
|
|
33
|
+
"mapAccessToken": "storymap:mapAccessToken",
|
|
34
|
+
"mapBackgroundColor": "storymap:mapBackgroundColor",
|
|
35
|
+
"mapCenterOffset": "storymap:mapCenterOffset",
|
|
36
|
+
"fontCss": "storymap:fontCss",
|
|
37
|
+
"callToAction": "storymap:callToAction",
|
|
38
|
+
"callToActionText": "storymap:callToActionText",
|
|
39
|
+
"startAtSlide": "storymap:startAtSlide",
|
|
40
|
+
"language": "storymap:language",
|
|
41
|
+
"calculateZoom": "storymap:calculateZoom",
|
|
42
|
+
"lineFollowsPath": "storymap:lineFollowsPath",
|
|
43
|
+
"showLines": "storymap:showLines",
|
|
44
|
+
"showHistoryLine": "storymap:showHistoryLine",
|
|
45
|
+
"lineColor": "storymap:lineColor",
|
|
46
|
+
"lineColorInactive": "storymap:lineColorInactive",
|
|
47
|
+
"lineWeight": "storymap:lineWeight",
|
|
48
|
+
"lineOpacity": "storymap:lineOpacity",
|
|
49
|
+
"lineDash": "storymap:lineDash",
|
|
50
|
+
"lineJoin": "storymap:lineJoin",
|
|
51
|
+
"useCustomMarkers": "storymap:useCustomMarkers",
|
|
52
|
+
"mapArea": "storymap:mapArea",
|
|
53
|
+
"overviewExtent": "storymap:overviewExtent",
|
|
54
|
+
"keyboard": "storymap:keyboard",
|
|
55
|
+
"overlays": "storymap:overlays",
|
|
56
|
+
"type": {
|
|
57
|
+
"@id": "storymap:type",
|
|
58
|
+
"@type": "@id"
|
|
59
|
+
},
|
|
60
|
+
"mediaSrcset": "storymap:mediaSrcset",
|
|
61
|
+
"mediaSizes": "storymap:mediaSizes"
|
|
62
|
+
}
|
|
28
63
|
}
|
|
29
64
|
```
|
|
30
65
|
|
|
@@ -59,20 +94,18 @@ what the fixtures reference. Content:
|
|
|
59
94
|
"@context": {
|
|
60
95
|
"@version": 1.1,
|
|
61
96
|
"storymap": "https://christianmahnke.de/iiif/storymap#",
|
|
62
|
-
"
|
|
97
|
+
"basemap": "storymap:basemap",
|
|
98
|
+
"tilejson": "storymap:tilejson",
|
|
63
99
|
"mapAsImage": "storymap:mapAsImage",
|
|
64
100
|
"mapAccessToken": "storymap:mapAccessToken",
|
|
65
101
|
"mapBackgroundColor": "storymap:mapBackgroundColor",
|
|
66
102
|
"mapCenterOffset": "storymap:mapCenterOffset",
|
|
67
|
-
"mapSubdomains": "storymap:mapSubdomains",
|
|
68
|
-
"iiifUrl": { "@id": "storymap:iiifUrl", "@type": "@id" },
|
|
69
103
|
"fontCss": "storymap:fontCss",
|
|
70
104
|
"callToAction": "storymap:callToAction",
|
|
71
105
|
"callToActionText": "storymap:callToActionText",
|
|
72
106
|
"startAtSlide": "storymap:startAtSlide",
|
|
73
107
|
"language": "storymap:language",
|
|
74
108
|
"calculateZoom": "storymap:calculateZoom",
|
|
75
|
-
"lessBounce": "storymap:lessBounce",
|
|
76
109
|
"lineFollowsPath": "storymap:lineFollowsPath",
|
|
77
110
|
"showLines": "storymap:showLines",
|
|
78
111
|
"showHistoryLine": "storymap:showHistoryLine",
|
|
@@ -83,11 +116,13 @@ what the fixtures reference. Content:
|
|
|
83
116
|
"lineDash": "storymap:lineDash",
|
|
84
117
|
"lineJoin": "storymap:lineJoin",
|
|
85
118
|
"useCustomMarkers": "storymap:useCustomMarkers",
|
|
119
|
+
"mapArea": "storymap:mapArea",
|
|
120
|
+
"overviewExtent": "storymap:overviewExtent",
|
|
121
|
+
"keyboard": "storymap:keyboard",
|
|
122
|
+
"overlays": "storymap:overlays",
|
|
86
123
|
"type": { "@id": "storymap:type", "@type": "@id" },
|
|
87
|
-
"
|
|
88
|
-
"
|
|
89
|
-
"mediaCredit": "storymap:mediaCredit",
|
|
90
|
-
"date": "storymap:date"
|
|
124
|
+
"mediaSrcset": "storymap:mediaSrcset",
|
|
125
|
+
"mediaSizes": "storymap:mediaSizes"
|
|
91
126
|
}
|
|
92
127
|
}
|
|
93
128
|
```
|
|
@@ -114,19 +149,20 @@ Each slide becomes one Canvas in `items` order. Canvas ids are
|
|
|
114
149
|
(`<canvas-id>/annotationpage/1`) holding the slide's painted media
|
|
115
150
|
(`<canvas-id>/annotation/1`, `motivation: "painting"`, `target: <canvas-id>`).
|
|
116
151
|
|
|
117
|
-
| IIIF
|
|
118
|
-
|
|
|
119
|
-
| `id`, `type`
|
|
120
|
-
| `label`
|
|
121
|
-
| `summary`
|
|
122
|
-
| `height`, `width`
|
|
123
|
-
| `items`
|
|
124
|
-
| `storymap:type`
|
|
125
|
-
| `
|
|
126
|
-
| `storymap:
|
|
127
|
-
| `storymap:
|
|
128
|
-
|
|
|
129
|
-
| `
|
|
152
|
+
| IIIF | StoryMap | Notes |
|
|
153
|
+
| ---------------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------ |
|
|
154
|
+
| `id`, `type` | — | `"Canvas"` |
|
|
155
|
+
| `label` | `slide.text.headline` | Language map `{"none": [headline]}`; omitted when the headline is empty |
|
|
156
|
+
| `summary` | `slide.text.text` | Language map; the slide body text (may contain HTML) |
|
|
157
|
+
| `height`, `width` | — | Nominal `1080 × 1080` for non-image slides; actual image dimensions for image-map slides |
|
|
158
|
+
| `items` | `slide.media` | AnnotationPage with the painting annotation, see below — which also carries the caption, credit and alt text |
|
|
159
|
+
| `storymap:type` | `slide.type` | `"overview"` marks the map overview slide |
|
|
160
|
+
| `background` | `slide.background` | A painting annotation whose body is an `Image` (the url) and/or a `Color` (the colour) |
|
|
161
|
+
| `storymap:mediaSrcset` | `slide.media.srcset` | Responsive image candidates, passed through to the `img` element |
|
|
162
|
+
| `storymap:mediaSizes` | `slide.media.sizes` | The `sizes` companion of `mediaSrcset` |
|
|
163
|
+
| _(target selector)_ | `slide.location.region` | `ImageApiSelector` `xywh=pixel:x,y,w,h`; image stops on image-map slides |
|
|
164
|
+
| `navDate` | `slide.date` | Plain string, verbatim; the official validator applies no format rule at all, so a human date is fine |
|
|
165
|
+
| `navPlace` | `slide.location` | See below |
|
|
130
166
|
|
|
131
167
|
## Locations via navPlace
|
|
132
168
|
|
|
@@ -139,11 +175,48 @@ with one GeoJSON Feature:
|
|
|
139
175
|
verbatim. For image-map storymaps (`storymap:mapAsImage: true`) the values are
|
|
140
176
|
image coordinates rather than WGS84 degrees; consumers can detect this via
|
|
141
177
|
`storymap:mapAsImage`.
|
|
142
|
-
- `properties`: marker data — `zoom`, `line`, `icon`, `iconSize`,
|
|
143
|
-
`
|
|
178
|
+
- `properties`: marker data — `name`, `zoom`, `line`, `icon`, `iconSize`,
|
|
179
|
+
`image`, `use_custom_marker`, plus the presentation-only `popup` and
|
|
180
|
+
`audioBadge` (only present keys).
|
|
144
181
|
- `location.use_custom_marker` / `use_custom_markers` (manifest) opt into
|
|
145
182
|
custom marker rendering; see the storymap terms below.
|
|
146
183
|
|
|
184
|
+
Those properties are described by **`https://cmahnke.github.io/StoryMapJS/navplace-properties.json`**,
|
|
185
|
+
which a manifest using a `properties` bag should name in its `@context`. The
|
|
186
|
+
extension requires it (§3.2): terms in a GeoJSON Feature's `properties` must be
|
|
187
|
+
described either by a registered IIIF extension or by a local linked-data
|
|
188
|
+
context, and a client that meets a property it does not understand must ignore
|
|
189
|
+
it. There is no IIIF extension for marker presentation — navPlace defines
|
|
190
|
+
exactly one term, `navPlace` itself — so the local context is the only option.
|
|
191
|
+
It is why `popup` and `audioBadge` need no `storymap:` term of their own, and
|
|
192
|
+
the same mechanism is what `docs/plans/iiif-media-tours.md` §2 wants for its
|
|
193
|
+
marker config. The nine local names hang off this project's existing namespace
|
|
194
|
+
(`https://christianmahnke.de/iiif/storymap#`), not a new one.
|
|
195
|
+
|
|
196
|
+
### Context order matters
|
|
197
|
+
|
|
198
|
+
The navPlace extension's context **must be listed before** the Presentation 3
|
|
199
|
+
context — §3.1 of the extension:
|
|
200
|
+
|
|
201
|
+
> The navPlace extension linked data context must be included before the IIIF
|
|
202
|
+
> Presentation API 3 linked data context on the top-level object.
|
|
203
|
+
|
|
204
|
+
So a manifest that uses `navPlace` declares:
|
|
205
|
+
|
|
206
|
+
```json
|
|
207
|
+
"@context": [
|
|
208
|
+
"http://iiif.io/api/extension/navplace/context.json",
|
|
209
|
+
"http://iiif.io/api/presentation/3/context.json",
|
|
210
|
+
"https://cmahnke.github.io/StoryMapJS/navplace-properties.json",
|
|
211
|
+
"https://cmahnke.github.io/StoryMapJS/context.json"
|
|
212
|
+
]
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
Getting this backwards does not break a viewer — the reader does not consult
|
|
216
|
+
either context — but it does make the document wrong as linked data, which is
|
|
217
|
+
the point of shipping a context at all. Every fixture in this repository had it
|
|
218
|
+
backwards.
|
|
219
|
+
|
|
147
220
|
Alternatively a manifest MAY aggregate all slide locations in a single
|
|
148
221
|
manifest-level `navPlace` with one Feature per Canvas in `items` order.
|
|
149
222
|
|
|
@@ -201,7 +274,7 @@ actual image dimensions. Two body variants are valid:
|
|
|
201
274
|
```
|
|
202
275
|
|
|
203
276
|
The converter emits variant (b). Legacy `zoomify` storymaps are converted to
|
|
204
|
-
`storymap:
|
|
277
|
+
`storymap:basemap: "iiif"`; since the original zoomify tile paths are dead, the
|
|
205
278
|
converter substitutes the IIIF reference image above (the legacy pyramid
|
|
206
279
|
definition is not carried — nothing reads it).
|
|
207
280
|
|
|
@@ -222,51 +295,373 @@ properties):
|
|
|
222
295
|
{
|
|
223
296
|
"id": "https://example.org/storymap/<name>/map-config",
|
|
224
297
|
"type": "Service",
|
|
225
|
-
"profile": "https://
|
|
226
|
-
"storymap:
|
|
298
|
+
"profile": "https://cmahnke.github.io/StoryMapJS/context.json/mapconfig",
|
|
299
|
+
"storymap:basemap": "osm:standard"
|
|
300
|
+
}
|
|
301
|
+
]
|
|
302
|
+
}
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### TileJSON for a tile service
|
|
306
|
+
|
|
307
|
+
A keyword basemap and a tile URL template are different kinds of thing, and
|
|
308
|
+
`mapType` used to be both. They are now separate: `storymap:basemap` names a
|
|
309
|
+
source the viewer knows how to configure, and an **unprefixed** `tilejson`
|
|
310
|
+
object describes any other tile service in the standard's own terms. Only
|
|
311
|
+
`tiles` is required:
|
|
312
|
+
|
|
313
|
+
```json
|
|
314
|
+
{
|
|
315
|
+
"service": [
|
|
316
|
+
{
|
|
317
|
+
"id": "https://example.org/storymap/<name>/map-config",
|
|
318
|
+
"type": "Service",
|
|
319
|
+
"profile": "https://cmahnke.github.io/StoryMapJS/context.json/mapconfig",
|
|
320
|
+
"tilejson": {
|
|
321
|
+
"tiles": ["https://tiles.example.org/{z}/{x}/{y}.png"],
|
|
322
|
+
"minzoom": 4,
|
|
323
|
+
"maxzoom": 17,
|
|
324
|
+
"bounds": [-122.7, 37.1, -121.1, 38.1],
|
|
325
|
+
"scheme": "tms",
|
|
326
|
+
"center": [4.4777, 51.9244, 12]
|
|
327
|
+
}
|
|
328
|
+
// `tiles` may also be a single template string — that is what the
|
|
329
|
+
// converter writes. The reader accepts both forms.
|
|
227
330
|
}
|
|
228
331
|
]
|
|
229
332
|
}
|
|
230
333
|
```
|
|
231
334
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
|
237
|
-
|
|
|
238
|
-
| `
|
|
239
|
-
| `
|
|
240
|
-
| `
|
|
241
|
-
| `
|
|
242
|
-
| `
|
|
243
|
-
| `
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
|
250
|
-
|
|
|
251
|
-
| `
|
|
252
|
-
| `
|
|
253
|
-
| `
|
|
254
|
-
| `
|
|
255
|
-
| `
|
|
256
|
-
| `
|
|
257
|
-
| `
|
|
335
|
+
`tiles` becomes `map_type`, so everything that dispatches on a template (the
|
|
336
|
+
`tile_source_factory` option, attribution, the minimap) works unchanged. The
|
|
337
|
+
rest is honoured where the map can act on it:
|
|
338
|
+
|
|
339
|
+
| Member | Effect |
|
|
340
|
+
| --------- | ------------------------------------------------------------------------- |
|
|
341
|
+
| `tiles` | the tile URL template, as `map_type` |
|
|
342
|
+
| `minzoom` | the view's minimum zoom, and the tile grid's range |
|
|
343
|
+
| `maxzoom` | the view's maximum zoom, and the tile grid's range |
|
|
344
|
+
| `bounds` | a `[west, south, east, north]` lon/lat box the view center is kept inside |
|
|
345
|
+
| `scheme` | `tms` flips the tile row, which is counted from the bottom in TMS |
|
|
346
|
+
| `center` | `[lon, lat, zoom]`, the initial view |
|
|
347
|
+
|
|
348
|
+
The `center` is the initial view only, and `bounds` constrains the center
|
|
349
|
+
without pinning the resolution — a hard extent constraint would fight the panel
|
|
350
|
+
offset, the same reason `map_bbox` works the way it does.
|
|
351
|
+
|
|
352
|
+
| Service property (storymap:) | StoryMap field | Values |
|
|
353
|
+
| ----------------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
|
|
354
|
+
| `basemap` | `map_type` | A keyword the viewer configures itself: `osm:standard`, `mapbox://styles/...`, `stadia:...`, `iiif`. `zoomify` is replaced by `iiif` |
|
|
355
|
+
| _(unprefixed)_ `tilejson` | `map_type` + `tilejson` | TileJSON 2.1 for an arbitrary tile service — see below |
|
|
356
|
+
| `mapAsImage` | `map_as_image` | `true` when the image itself is the map |
|
|
357
|
+
| `mapAccessToken` | `map_access_token` | Mapbox/Stadia token from the storymap data, never the repository |
|
|
358
|
+
| `mapBackgroundColor` | `map_background_color` | CSS color |
|
|
359
|
+
| `mapCenterOffset` | `map_center_offset` | `{left, top}` |
|
|
360
|
+
| `mapSubdomains` | `map_subdomains` | Tile URL subdomains |
|
|
361
|
+
| _(none)_ | `iiif.url` | From the Image API `service[]` a painting body carries, plus `/info.json`; see below |
|
|
362
|
+
| `fontCss` | `font_css` | e.g. `stock:dancing-ledger` |
|
|
363
|
+
| `callToAction` | `call_to_action` | boolean |
|
|
364
|
+
| `callToActionText` | `call_to_action_text` | string |
|
|
365
|
+
| `startAtSlide` | `start_at_slide` | 0-based slide index |
|
|
366
|
+
| `language` | `language` | IETF language tag |
|
|
367
|
+
| `calculateZoom` | `calculate_zoom` | boolean |
|
|
368
|
+
| `lessBounce` | `less_bounce` | boolean |
|
|
369
|
+
| `lineFollowsPath` | `line_follows_path` | boolean |
|
|
370
|
+
| `showLines` | `show_lines` | boolean |
|
|
371
|
+
| `showHistoryLine` | `show_history_line` | boolean |
|
|
372
|
+
| `lineColor` | `line_color` | CSS color |
|
|
373
|
+
| `lineColorInactive` | `line_color_inactive` | CSS color |
|
|
374
|
+
| `lineWeight` | `line_weight` | number (px) |
|
|
375
|
+
| `lineOpacity` | `line_opacity` | 0–1 |
|
|
376
|
+
| `lineDash` | `line_dash` | CSS dash pattern |
|
|
377
|
+
| `lineJoin` | `line_join` | CSS line join |
|
|
378
|
+
| `useCustomMarkers` | `use_custom_markers` | boolean |
|
|
379
|
+
| `mapArea` | `map_area` | `"full"` (default) or `"left"` |
|
|
380
|
+
| `overviewExtent` | `overview_extent` | `[west, south, east, north]` lon/lat box for the minimap overview |
|
|
381
|
+
| `keyboard` | `keyboard` | boolean: arrow keys navigate the story from anywhere |
|
|
382
|
+
| `overlays` | `overlays` | array of stacked layers (see below) |
|
|
383
|
+
| _(georeferencing annotation)_ | `overlays[]` (georeference entries) | IIIF images placed from ground control points — see "Geo-referenced layers" |
|
|
258
384
|
|
|
259
385
|
### Canvas level — direct properties
|
|
260
386
|
|
|
261
387
|
Canvas objects are open for extension terms, so slide-specific StoryMap data is
|
|
262
|
-
carried directly on the Canvas: `storymap:type`,
|
|
263
|
-
`storymap:
|
|
264
|
-
Canvas table above).
|
|
388
|
+
carried directly on the Canvas: `storymap:type`, plus the two terms with no
|
|
389
|
+
standard home, `storymap:mediaSrcset` and `storymap:mediaSizes` (see the
|
|
390
|
+
Canvas table above). A slide's date is the standard `navDate` and its
|
|
391
|
+
background is the standard `background` annotation. The media caption, credit and alt
|
|
392
|
+
text are **not** terms any more: they are the painting annotation's own `label`,
|
|
393
|
+
`requiredStatement` and `accessibilitySummary`, which is where Presentation 3
|
|
394
|
+
defines them. A manifest written against the old terms still loads — the strings
|
|
395
|
+
are simply no longer read.
|
|
265
396
|
|
|
266
397
|
Readers must use the prefixed term for the slide type (`storymap:type`): the
|
|
267
398
|
bare `type` key of a Canvas is the IIIF class type (`"Canvas"`) and can never
|
|
268
399
|
carry the StoryMap slide type.
|
|
269
400
|
|
|
401
|
+
## Annotation-driven tour stops
|
|
402
|
+
|
|
403
|
+
A Canvas annotation whose `motivation` is `commenting`, `tagging`,
|
|
404
|
+
`classifying` or `describing` and whose target resolves to a region becomes
|
|
405
|
+
one slide, appended after that Canvas's own slide. This is the shape Storiiies
|
|
406
|
+
and Micrio use for a guided tour of one image, and it is the subject of
|
|
407
|
+
[docs/iiif-authoring.md](iiif-authoring.md).
|
|
408
|
+
|
|
409
|
+
- **Target** — `xywh=` fragment / Image API Selector, or a `PointSelector`
|
|
410
|
+
(synthesized into a square of 5% of the Canvas's smaller side, centred and
|
|
411
|
+
clamped). A `TextQuoteSelector`, `TimeState` or `SvgSelector` is preserved
|
|
412
|
+
but not resolved or drawn. A bare string target's `#xywh=` counts. An
|
|
413
|
+
annotation aimed at the whole Canvas is **not** a stop.
|
|
414
|
+
- **Body** — a `TextualBody` supplies the slide text (`text/plain` escaped and
|
|
415
|
+
split per blank-line block, `text/html` kept as markup); a body with an
|
|
416
|
+
`id` (e.g. `type: "Sound"`) supplies `media.url`, whose extension picks the
|
|
417
|
+
player. An annotation with a region but no body is not a stop.
|
|
418
|
+
- **Region stops are honoured in image mode** only — the same rule as a
|
|
419
|
+
`xywh=pixel:` region. A geographic map ignores them.
|
|
420
|
+
- `navPlace` may not appear on an Annotation (the extension forbids it), so
|
|
421
|
+
all stops on a Canvas share that Canvas's location and marker presentation.
|
|
422
|
+
|
|
423
|
+
## What the body record carries
|
|
424
|
+
|
|
425
|
+
The painting annotation's body is read into one shared record. The
|
|
426
|
+
`storymap:mediaCaption` / `mediaCredit` / `mediaAlt` extension terms are
|
|
427
|
+
dropped — a manifest still using them loads, but the strings are not read —
|
|
428
|
+
and the standard properties are the only source:
|
|
429
|
+
|
|
430
|
+
| Body property | Slide media field |
|
|
431
|
+
| --------------------------------------------------------------- | -------------------------------- |
|
|
432
|
+
| `label` | `caption` |
|
|
433
|
+
| `requiredStatement` (one `{label, value}` object) or `provider` | `credit` |
|
|
434
|
+
| `accessibilitySummary` | `alt` |
|
|
435
|
+
| `thumbnail` | `thumb` |
|
|
436
|
+
| `type`, `format` | player selection (`MediaType()`) |
|
|
437
|
+
| `duration`, `start`, `end` | time-anchored stops |
|
|
438
|
+
| a sibling `TextualBody` with `format: text/vtt` | `subtitles` |
|
|
439
|
+
|
|
440
|
+
## Native IIIF vs. the StoryMap extension
|
|
441
|
+
|
|
442
|
+
IIIF defines three approved Presentation API extensions — navPlace, Text
|
|
443
|
+
Granularity and Georeference — and **no vocabulary for a basemap or a tile
|
|
444
|
+
layer stack**. Everything the viewer draws under and over the story (basemap
|
|
445
|
+
type, layout, minimap bounds, stacked layers, keyboard navigation) therefore
|
|
446
|
+
stays in the `storymap:` terms of the map configuration service, which is the
|
|
447
|
+
JSON-LD-idiomatic place for extended configuration. What IIIF _does_ model
|
|
448
|
+
natively is used wherever it exists:
|
|
449
|
+
|
|
450
|
+
| Story | Native IIIF | Used here |
|
|
451
|
+
| -------------------------------------- | ----------------------------------------------------------------------------------------------------- | -------------------------------------------- |
|
|
452
|
+
| Slide location | `navPlace` Point | yes |
|
|
453
|
+
| Story extent | `navPlace` Polygon (an explicit navPlace use case) | yes — a canvas polygon becomes `map_bbox` |
|
|
454
|
+
| Image region stops | `ImageApiSelector` `xywh=pixel:` on the painting annotation target | yes — the selector is the only source (§2.8) |
|
|
455
|
+
| Raster layer placed on a map | [Georeference Extension](https://iiif.io/api/extension/georef) (GCPs, `motivation: "georeferencing"`) | yes — see below |
|
|
456
|
+
| Basemap, layer stack, layout, keyboard | — | no; `storymap:` terms |
|
|
457
|
+
|
|
458
|
+
### Groups and the slide order
|
|
459
|
+
|
|
460
|
+
`structures` does two jobs. A Range with a `label` and no `start` is a **group**,
|
|
461
|
+
and every canvas it contains gets that value as `slide.group`; nested Ranges are
|
|
462
|
+
chapters inside it, and the outermost labelled Range is the group. And the order
|
|
463
|
+
canvases appear in is the **slide order** — a Range is allowed to run them in a
|
|
464
|
+
order the document does not, which is what a storyboard is for:
|
|
465
|
+
|
|
466
|
+
```json
|
|
467
|
+
{
|
|
468
|
+
"structures": [
|
|
469
|
+
{
|
|
470
|
+
"id": "https://example.org/storymap/<name>/range/1",
|
|
471
|
+
"type": "Range",
|
|
472
|
+
"label": { "none": ["Act I"] },
|
|
473
|
+
"items": [
|
|
474
|
+
"https://example.org/storymap/<name>/canvas/1",
|
|
475
|
+
"https://example.org/storymap/<name>/canvas/3"
|
|
476
|
+
]
|
|
477
|
+
}
|
|
478
|
+
]
|
|
479
|
+
}
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
A canvas in no Range keeps its document position, after the ones a Range does
|
|
483
|
+
mention. A Range with a `start` is a time segment of a canvas, not a group: it
|
|
484
|
+
contributes order and nothing else.
|
|
485
|
+
|
|
486
|
+
### Deep links and external annotations
|
|
487
|
+
|
|
488
|
+
Two things a manifest can offer that a viewer used to ignore.
|
|
489
|
+
|
|
490
|
+
**A stop can be linked by its identity.** Every canvas id is a `uniqueid`
|
|
491
|
+
(§2.3), so a stop is addressable by something that survives a slide being
|
|
492
|
+
inserted above it. The viewer writes both forms:
|
|
493
|
+
|
|
494
|
+
| Where | Form | Example |
|
|
495
|
+
| ---------------- | ------------------------------------------------------------ | ------------------------------------- |
|
|
496
|
+
| `change` payload | `current_id`, next to `current_slide` | — |
|
|
497
|
+
| URL hash | `#slide-<uniqueid>`, or `#slide-3` for a storymap-JSON slide | `#slide-https%3A%2F%2F…%2Fcanvas%2F3` |
|
|
498
|
+
| Query parameter | `iiif-content`, IIIF Content State 1.0 | `?iiif-content=https://…/canvas/3` |
|
|
499
|
+
|
|
500
|
+
Both are read on load, and the hash again on every `hashchange`, so browser
|
|
501
|
+
back/forward keeps working. The index form is still accepted, so links shared
|
|
502
|
+
before ids were emitted keep resolving.
|
|
503
|
+
|
|
504
|
+
The `iiif-content` parameter is the standard's own format and follows its
|
|
505
|
+
encoding rule, which is deliberately asymmetric: a **plain URI is written
|
|
506
|
+
unencoded**, a **JSON-LD form is content-state-encoded** (base64url, no
|
|
507
|
+
padding). A whole canvas is therefore a bare target URI, while a region — which
|
|
508
|
+
the spec says a bare URI cannot express — is the encoded Target Body:
|
|
509
|
+
|
|
510
|
+
```json
|
|
511
|
+
{
|
|
512
|
+
"target": {
|
|
513
|
+
"type": "SpecificResource",
|
|
514
|
+
"source": { "id": "https://example.org/canvas/7", "type": "Canvas" },
|
|
515
|
+
"selector": { "type": "ImageApiSelector", "value": "xywh=pixel:10,20,30,40" }
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
**External annotations.** A manifest's `seeAlso` points at annotation
|
|
521
|
+
collections or pages that live on an annotation server. They are recorded on the
|
|
522
|
+
data as `see_also` but **not fetched** — reading them is a network round trip
|
|
523
|
+
per document, and a viewer should not block its first paint on a third party. A
|
|
524
|
+
host opts in:
|
|
525
|
+
|
|
526
|
+
```js
|
|
527
|
+
const { stops, searchService, failed } = await storymap.loadAnnotations();
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
which fetches, merges the annotations for the canvases being rendered into tour
|
|
531
|
+
stops, and fires `annotationsloaded` with the same value. A `SearchService1` in
|
|
532
|
+
`seeAlso` is reported as `searchService` rather than followed. One level of
|
|
533
|
+
indirection is followed, so a collection may reference its pages, but a cycle
|
|
534
|
+
cannot become an infinite walk. Fetching is cached per document, so two calls
|
|
535
|
+
share one request.
|
|
536
|
+
|
|
537
|
+
### Institutional credit
|
|
538
|
+
|
|
539
|
+
A manifest says who published it and under what licence, and all of it ends up
|
|
540
|
+
on the one credit line the viewer renders — the map attribution the host can
|
|
541
|
+
also feed with `setExtraAttributions()`:
|
|
542
|
+
|
|
543
|
+
| Manifest property | Becomes |
|
|
544
|
+
| ------------------- | ----------------------------------- |
|
|
545
|
+
| `requiredStatement` | `Attribution: <value>` |
|
|
546
|
+
| `provider` (Agent) | `Provider: <label, or the id>` |
|
|
547
|
+
| `rights` | `Licence: <uri>` |
|
|
548
|
+
| `homepage` (Agent) | the Agent's label or id, unlabelled |
|
|
549
|
+
|
|
550
|
+
They are joined with `·` in that order. `logo` is an image rather than a
|
|
551
|
+
credit line, so it is offered as `data.logo`, and `metadata`'s label/value
|
|
552
|
+
pairs are handed on as `data.metadata[]` — arbitrary pairs cannot be rendered
|
|
553
|
+
generically, and dropping them loses provenance.
|
|
554
|
+
|
|
555
|
+
The converter writes a `metadata` pair reading "Generated by: StoryMapJS"
|
|
556
|
+
rather than claiming to be the manifest's `provider`. P3's `provider` is
|
|
557
|
+
whoever published the content, and the converter does not know that; writing
|
|
558
|
+
itself there would put "Provider: StoryMapJS" on the credit line of every
|
|
559
|
+
converted storymap.
|
|
560
|
+
|
|
561
|
+
### Geo-referenced layers
|
|
562
|
+
|
|
563
|
+
A `motivation: "georeferencing"` annotation carries the Georeference Extension
|
|
564
|
+
payload: the IIIF Image API service to place in its `target`, and its ground
|
|
565
|
+
control points (`properties.resourceCoords` ↔ `geometry.coordinates`, WGS84) in
|
|
566
|
+
its `body`. Per the extension, a layer that is not part of the canvas it ships
|
|
567
|
+
in — which is every map layer — embeds the image it places in `target` rather
|
|
568
|
+
than referencing it. The viewer fits the points affinely and places the image,
|
|
569
|
+
which OpenLayers reprojects onto the view exactly like the IIIF basemap:
|
|
570
|
+
|
|
571
|
+
```json
|
|
572
|
+
{
|
|
573
|
+
"items": [
|
|
574
|
+
{
|
|
575
|
+
"id": "https://example.org/storymap/<name>/canvas/1",
|
|
576
|
+
"type": "Canvas",
|
|
577
|
+
"items": [
|
|
578
|
+
{
|
|
579
|
+
"id": "https://example.org/storymap/<name>/canvas/1/georeferencing/1",
|
|
580
|
+
"type": "Annotation",
|
|
581
|
+
"motivation": "georeferencing",
|
|
582
|
+
"target": {
|
|
583
|
+
"id": "https://iiif.example.org/image1",
|
|
584
|
+
"type": "Image",
|
|
585
|
+
"width": 5965,
|
|
586
|
+
"height": 2514,
|
|
587
|
+
"service": [
|
|
588
|
+
{
|
|
589
|
+
"id": "https://iiif.example.org/image1",
|
|
590
|
+
"type": "ImageService3",
|
|
591
|
+
"profile": "level2"
|
|
592
|
+
}
|
|
593
|
+
]
|
|
594
|
+
},
|
|
595
|
+
"requiredStatement": {
|
|
596
|
+
"label": { "none": ["Attribution"] },
|
|
597
|
+
"value": { "none": ["Sheet 12, 1789"] }
|
|
598
|
+
},
|
|
599
|
+
"body": {
|
|
600
|
+
"type": "FeatureCollection",
|
|
601
|
+
"transformation": { "type": "polynomial", "options": { "order": 1 } },
|
|
602
|
+
"features": [
|
|
603
|
+
{
|
|
604
|
+
"type": "Feature",
|
|
605
|
+
"properties": { "resourceCoords": [5085, 782] },
|
|
606
|
+
"geometry": {
|
|
607
|
+
"type": "Point",
|
|
608
|
+
"coordinates": [4.4885839, 51.9101828]
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
]
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
]
|
|
615
|
+
}
|
|
616
|
+
]
|
|
617
|
+
}
|
|
618
|
+
```
|
|
619
|
+
|
|
620
|
+
An annotation is canvas-scoped but the layer it describes is map-wide, so the
|
|
621
|
+
annotations are collected from **every** canvas: a layer annotated on the first
|
|
622
|
+
canvas still applies to the whole story. `requiredStatement` is read as the
|
|
623
|
+
layer's attribution. The other presentation keys the term could carry —
|
|
624
|
+
`opacity`, `visible`, `className`, `blendMode` — have no IIIF vocabulary for a
|
|
625
|
+
georeferencing annotation and are not read; the extent is not lost in substance,
|
|
626
|
+
because the control points describe it. Entries with fewer than three usable
|
|
627
|
+
points are dropped while reading.
|
|
628
|
+
|
|
629
|
+
**A caveat about the official validator.** The Presentation 3.0 validator checks
|
|
630
|
+
against the base JSON Schema, which predates the Georeference Extension, so it
|
|
631
|
+
rejects a `FeatureCollection` body and an embedded `Image` target with _"is not
|
|
632
|
+
valid under any of the given schemas"_ — even with the extension's own context
|
|
633
|
+
declared, which does resolve at
|
|
634
|
+
`http://iiif.io/api/extension/georef/1/context.json`. We keep the extension's
|
|
635
|
+
spelling anyway: a georeferenced manifest that other IIIF tools can read is
|
|
636
|
+
worth more than one this particular validator accepts. `npm run validate:iiif`
|
|
637
|
+
reports the two georeferenced fixtures as _not covered_ rather than as failures,
|
|
638
|
+
with that reason.
|
|
639
|
+
|
|
640
|
+
The result is an `overlays[]` entry, so `setOverlayVisible()` /
|
|
641
|
+
`setOverlayOpacity()` and the rest of the layer API work on it as for any other
|
|
642
|
+
layer. A storymap-JSON `overlays[]` entry may carry a `georeference` in place
|
|
643
|
+
of a `map_type`, which is the shape the converter writes these annotations
|
|
644
|
+
from.
|
|
645
|
+
|
|
646
|
+
**Limits.** The extension also allows second/third-order polynomials, thin
|
|
647
|
+
plate splines and rotated or skewed sheets. OpenLayers places an image as an
|
|
648
|
+
axis-aligned extent, so the viewer fits the affine (first-order) case only:
|
|
649
|
+
anything else is reported in the console and skipped rather than drawn in the
|
|
650
|
+
wrong place. For true warping, plug
|
|
651
|
+
[Allmaps' `WarpedMapLayer`](https://www.npmjs.com/package/@allmaps/openlayers)
|
|
652
|
+
(or any OpenLayers layer) into the `tile_source_factory` option and keep the
|
|
653
|
+
georeference data on your side — see the "IIIF extensions" recipe in
|
|
654
|
+
[docs/migration-from-knightlab.md](migration-from-knightlab.md). Image-space
|
|
655
|
+
maps (`map_as_image`, zoomify) have no geographic view, so a placed sheet is
|
|
656
|
+
skipped there as well.
|
|
657
|
+
|
|
658
|
+
A storymap-JSON `overlays[]` entry can carry a `georeference` — url, width,
|
|
659
|
+
height and the FeatureCollection body — instead of a `map_type`, and the
|
|
660
|
+
converter writes it as the annotation above, on the first canvas. The two
|
|
661
|
+
georeferenced fixtures are still hand-authored: they are the only manifests in
|
|
662
|
+
the set with no storymap-JSON source. `georeferenced-layer.json` places its
|
|
663
|
+
sheet; `georeferenced-layer-unsupported.json` shows the skip path.
|
|
664
|
+
|
|
270
665
|
## Validator interop
|
|
271
666
|
|
|
272
667
|
The official IIIF presentation validator
|
|
@@ -292,8 +687,9 @@ photo, and a slide with a YouTube video — full manifest:
|
|
|
292
687
|
```json
|
|
293
688
|
{
|
|
294
689
|
"@context": [
|
|
295
|
-
"http://iiif.io/api/presentation/3/context.json",
|
|
296
690
|
"http://iiif.io/api/extension/navplace/context.json",
|
|
691
|
+
"http://iiif.io/api/presentation/3/context.json",
|
|
692
|
+
"https://cmahnke.github.io/StoryMapJS/navplace-properties.json",
|
|
297
693
|
"https://cmahnke.github.io/StoryMapJS/context.json"
|
|
298
694
|
],
|
|
299
695
|
"id": "https://example.org/storymap/storm",
|
|
@@ -311,8 +707,8 @@ photo, and a slide with a YouTube video — full manifest:
|
|
|
311
707
|
{
|
|
312
708
|
"id": "https://example.org/storymap/storm/map-config",
|
|
313
709
|
"type": "Service",
|
|
314
|
-
"profile": "https://
|
|
315
|
-
"storymap:
|
|
710
|
+
"profile": "https://cmahnke.github.io/StoryMapJS/context.json/mapconfig",
|
|
711
|
+
"storymap:basemap": "osm:standard",
|
|
316
712
|
"storymap:language": "en",
|
|
317
713
|
"storymap:showLines": true,
|
|
318
714
|
"storymap:showHistoryLine": true,
|
|
@@ -349,7 +745,7 @@ photo, and a slide with a YouTube video — full manifest:
|
|
|
349
745
|
}
|
|
350
746
|
],
|
|
351
747
|
"storymap:type": "overview",
|
|
352
|
-
"
|
|
748
|
+
"navDate": "Sep 1"
|
|
353
749
|
},
|
|
354
750
|
{
|
|
355
751
|
"id": "https://example.org/storymap/storm/canvas/2",
|
|
@@ -372,14 +768,17 @@ photo, and a slide with a YouTube video — full manifest:
|
|
|
372
768
|
"type": "Image",
|
|
373
769
|
"format": "image/jpeg"
|
|
374
770
|
},
|
|
375
|
-
"target": "https://example.org/storymap/storm/canvas/2"
|
|
771
|
+
"target": "https://example.org/storymap/storm/canvas/2",
|
|
772
|
+
"label": "Landfall",
|
|
773
|
+
"requiredStatement": {
|
|
774
|
+
"label": { "none": ["Credit"] },
|
|
775
|
+
"value": { "none": ["Weather Service"] }
|
|
776
|
+
}
|
|
376
777
|
}
|
|
377
778
|
]
|
|
378
779
|
}
|
|
379
780
|
],
|
|
380
|
-
"
|
|
381
|
-
"storymap:mediaCredit": "Weather Service",
|
|
382
|
-
"storymap:date": "Sep 2",
|
|
781
|
+
"navDate": "Sep 2",
|
|
383
782
|
"navPlace": {
|
|
384
783
|
"id": "https://example.org/storymap/storm/canvas/2/navplace",
|
|
385
784
|
"type": "FeatureCollection",
|
|
@@ -412,13 +811,16 @@ photo, and a slide with a YouTube video — full manifest:
|
|
|
412
811
|
"id": "https://www.youtube.com/watch?v=example",
|
|
413
812
|
"type": "Video"
|
|
414
813
|
},
|
|
415
|
-
"target": "https://example.org/storymap/storm/canvas/3"
|
|
814
|
+
"target": "https://example.org/storymap/storm/canvas/3",
|
|
815
|
+
"requiredStatement": {
|
|
816
|
+
"label": { "none": ["Credit"] },
|
|
817
|
+
"value": { "none": ["News"] }
|
|
818
|
+
}
|
|
416
819
|
}
|
|
417
820
|
]
|
|
418
821
|
}
|
|
419
822
|
],
|
|
420
|
-
"
|
|
421
|
-
"storymap:date": "Sep 3",
|
|
823
|
+
"navDate": "Sep 3",
|
|
422
824
|
"navPlace": {
|
|
423
825
|
"id": "https://example.org/storymap/storm/canvas/3/navplace",
|
|
424
826
|
"type": "FeatureCollection",
|
|
@@ -438,73 +840,95 @@ photo, and a slide with a YouTube video — full manifest:
|
|
|
438
840
|
|
|
439
841
|
## Full mapping table
|
|
440
842
|
|
|
441
|
-
| Legacy field (storymap root) | IIIF path
|
|
442
|
-
| ---------------------------- |
|
|
443
|
-
| `slides` | `items[]` (Canvas per slide)
|
|
444
|
-
| `language` | `service[0].storymap:language`
|
|
445
|
-
| `map_type` | `service[0].storymap:
|
|
446
|
-
| `map_as_image` | `service[0].storymap:mapAsImage`
|
|
447
|
-
| `map_mini` | _dropped_ (viewer setting, not part of the exchange format)
|
|
448
|
-
| `map_subdomains` |
|
|
449
|
-
| `map_access_token` | `service[0].storymap:mapAccessToken`
|
|
450
|
-
| `map_background_color` | `service[0].storymap:mapBackgroundColor`
|
|
451
|
-
| `map_center_offset` | `service[0].storymap:mapCenterOffset`
|
|
452
|
-
| `map_popup` | _dropped_ (viewer setting)
|
|
453
|
-
| `use_custom_markers` | `service[0].storymap:useCustomMarkers`
|
|
454
|
-
| `
|
|
455
|
-
| `
|
|
456
|
-
| `
|
|
457
|
-
| `
|
|
458
|
-
| `
|
|
459
|
-
| `
|
|
460
|
-
| `
|
|
461
|
-
| `
|
|
462
|
-
| `
|
|
463
|
-
| `
|
|
464
|
-
| `
|
|
465
|
-
| `
|
|
466
|
-
| `
|
|
467
|
-
| `
|
|
468
|
-
| `
|
|
469
|
-
| `
|
|
470
|
-
| `
|
|
471
|
-
| `
|
|
472
|
-
| `
|
|
473
|
-
| `
|
|
474
|
-
|
|
|
475
|
-
|
|
476
|
-
|
|
|
477
|
-
|
|
|
478
|
-
| `
|
|
479
|
-
|
|
480
|
-
|
|
|
481
|
-
|
|
|
482
|
-
| `
|
|
483
|
-
| `
|
|
484
|
-
| `
|
|
485
|
-
| `
|
|
486
|
-
| `location.
|
|
487
|
-
| `location.
|
|
488
|
-
| `location.
|
|
489
|
-
| `location.
|
|
490
|
-
| `
|
|
491
|
-
| `
|
|
492
|
-
| `
|
|
493
|
-
| `
|
|
494
|
-
| `media.url` (
|
|
495
|
-
| `media.
|
|
496
|
-
| `media.
|
|
497
|
-
| `media.
|
|
498
|
-
| `
|
|
499
|
-
| `
|
|
843
|
+
| Legacy field (storymap root) | IIIF path |
|
|
844
|
+
| ---------------------------- | ----------------------------------------------------------------------- |
|
|
845
|
+
| `slides` | `items[]` (Canvas per slide) |
|
|
846
|
+
| `language` | `service[0].storymap:language` |
|
|
847
|
+
| `map_type` | `service[0].storymap:basemap` (`zoomify` → `iiif`), or `tilejson.tiles` |
|
|
848
|
+
| `map_as_image` | `service[0].storymap:mapAsImage` |
|
|
849
|
+
| `map_mini` | _dropped_ (viewer setting, not part of the exchange format) |
|
|
850
|
+
| `map_subdomains` | _dropped_ (inert, no reader) |
|
|
851
|
+
| `map_access_token` | `service[0].storymap:mapAccessToken` |
|
|
852
|
+
| `map_background_color` | `service[0].storymap:mapBackgroundColor` |
|
|
853
|
+
| `map_center_offset` | `service[0].storymap:mapCenterOffset` |
|
|
854
|
+
| `map_popup` | _dropped_ (viewer setting) |
|
|
855
|
+
| `use_custom_markers` | `service[0].storymap:useCustomMarkers` |
|
|
856
|
+
| `map_area` | `service[0].storymap:mapArea` |
|
|
857
|
+
| `overview_extent` | `service[0].storymap:overviewExtent` |
|
|
858
|
+
| `keyboard` | `service[0].storymap:keyboard` |
|
|
859
|
+
| `overlays` (georeference) | Georeferencing annotation `target` + `body` |
|
|
860
|
+
| `zoom_distance` | _dropped_ (viewer setting) |
|
|
861
|
+
| `calculate_zoom` | `service[0].storymap:calculateZoom` |
|
|
862
|
+
| `less_bounce` | _dropped_ (inert, no reader) |
|
|
863
|
+
| `line_follows_path` | `service[0].storymap:lineFollowsPath` |
|
|
864
|
+
| `show_lines` | `service[0].storymap:showLines` |
|
|
865
|
+
| `show_history_line` | `service[0].storymap:showHistoryLine` |
|
|
866
|
+
| `line_color` | `service[0].storymap:lineColor` |
|
|
867
|
+
| `line_color_inactive` | `service[0].storymap:lineColorInactive` |
|
|
868
|
+
| `line_weight` | `service[0].storymap:lineWeight` |
|
|
869
|
+
| `line_opacity` | `service[0].storymap:lineOpacity` |
|
|
870
|
+
| `line_dash` | `service[0].storymap:lineDash` |
|
|
871
|
+
| `line_join` | `service[0].storymap:lineJoin` |
|
|
872
|
+
| `iiif.url` | Canvas Image annotation `service[0].id` + `/info.json` |
|
|
873
|
+
| `iiif.attribution` | `requiredStatement` |
|
|
874
|
+
| `zoomify` | _dropped_ (zoomify is replaced by the IIIF reference image) |
|
|
875
|
+
| `font_css` | `service[0].storymap:fontCss` |
|
|
876
|
+
| `call_to_action` | `service[0].storymap:callToAction` |
|
|
877
|
+
| `call_to_action_text` | `service[0].storymap:callToActionText` |
|
|
878
|
+
| `relative_date` | _dropped_ (viewer setting) |
|
|
879
|
+
| `start_at_slide` | `service[0].storymap:startAtSlide` |
|
|
880
|
+
| _(root) `width`, `height`_ | _dropped_ (viewer embed size) |
|
|
881
|
+
|
|
882
|
+
| Legacy field (slide) | IIIF path |
|
|
883
|
+
| ------------------------------ | --------------------------------------------------------------------------- |
|
|
884
|
+
| `type: "overview"` | Canvas `storymap:type: "overview"` |
|
|
885
|
+
| `date` | Canvas `navDate` |
|
|
886
|
+
| `text.headline` | Canvas `label` (language map) |
|
|
887
|
+
| `text.text` | Canvas `summary` (language map) |
|
|
888
|
+
| `location.lat`, `location.lon` | Canvas `navPlace` Feature `geometry.coordinates` |
|
|
889
|
+
| `location.zoom` | Canvas `navPlace` Feature `properties.zoom` |
|
|
890
|
+
| `location.line` | Canvas `navPlace` Feature `properties.line` |
|
|
891
|
+
| `location.name` | Canvas `navPlace` Feature `properties.name` |
|
|
892
|
+
| `location.icon` | Canvas `navPlace` Feature `properties.icon` |
|
|
893
|
+
| `location.iconSize` | Canvas `navPlace` Feature `properties.iconSize` |
|
|
894
|
+
| `location.image` | Canvas `navPlace` Feature `properties.image` |
|
|
895
|
+
| `location.use_custom_marker` | Canvas `navPlace` Feature `properties.use_custom_marker` |
|
|
896
|
+
| `media.url` (image) | Annotation body `{type: "Image", format: ...}` |
|
|
897
|
+
| `media.url` (video service) | Annotation body `{type: "Video"}` |
|
|
898
|
+
| `media.url` (audio service) | Annotation body `{type: "Sound"}` |
|
|
899
|
+
| `media.url` (web page) | Annotation body `{type: "Text", format: "text/html"}` |
|
|
900
|
+
| `media.url` (absent / HTML) | Annotation body `{type: "TextualBody", value: ...}` |
|
|
901
|
+
| `media.caption` | Painting annotation `label` |
|
|
902
|
+
| `media.credit` | Painting annotation `requiredStatement` (`{label, value}`) |
|
|
903
|
+
| `media.alt` | Painting annotation `accessibilitySummary` |
|
|
904
|
+
| `media.srcset` | Canvas `storymap:mediaSrcset` |
|
|
905
|
+
| `media.sizes` | Canvas `storymap:mediaSizes` |
|
|
906
|
+
| `location.region` | Painting annotation target `ImageApiSelector` `xywh=pixel:` |
|
|
907
|
+
| `media.thumb` | Canvas `thumbnail[]` or the body `thumbnail[]` |
|
|
908
|
+
| `background` | Canvas `background` painting annotation (Image + Color body) |
|
|
909
|
+
| `uniqueid` | Canvas `id` |
|
|
910
|
+
| `group` | A `structures` Range label; the Range order is the slide order |
|
|
911
|
+
| `language` (per slide) | The language tag the slide's text was read in (§3.4) |
|
|
912
|
+
| `logo`, `metadata` | Read into `data.logo` / `data.metadata[]` |
|
|
913
|
+
| `tilejson` | `service[0].tilejson` |
|
|
914
|
+
| `title` | Manifest `label` (a label is required, so the converter uses the file name) |
|
|
500
915
|
|
|
501
916
|
## Conversion
|
|
502
917
|
|
|
503
|
-
`
|
|
504
|
-
`public/examples
|
|
918
|
+
`npm run convert:iiif` regenerates `public/examples-iiif/` from
|
|
919
|
+
`public/examples/` (it needs Node 22.6+, since the script imports the
|
|
920
|
+
TypeScript library source via type stripping). Ids are deterministic:
|
|
505
921
|
|
|
506
922
|
- Manifest: `https://example.org/storymap/<name>`
|
|
507
923
|
- Canvas: `<manifest-id>/canvas/<n>` (1-based, slide order)
|
|
508
924
|
- AnnotationPage: `<canvas-id>/annotationpage/1`
|
|
509
925
|
- Annotation: `<canvas-id>/annotation/1`
|
|
510
926
|
- FeatureCollection / Feature: `<canvas-id>/navplace[.../feature/1]`
|
|
927
|
+
|
|
928
|
+
Three fixtures in `public/examples-iiif/` are hand-authored and not
|
|
929
|
+
overwritten by a full run: `georeferenced-layer.json` and
|
|
930
|
+
`georeferenced-layer-unsupported.json`, which exercise the Georeference
|
|
931
|
+
Extension payloads (the legacy format cannot express ground control points,
|
|
932
|
+
so there is nothing to convert from), and `annotated-image.json`, the
|
|
933
|
+
annotation-driven tour (there is no storymap document to convert from —
|
|
934
|
+
annotation stops only exist on the manifest side).
|