@projektemacher/storymapjs 0.10.6 → 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 +358 -16
- 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 +101 -21
- 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 +314 -12
- package/dist/docs/readme.html +40 -9
- package/dist/embed/index.html +130 -5
- 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 +33 -10
- package/dist/js/storymap.d.ts +1558 -114
- package/dist/js/storymap.js +10113 -6490
- package/dist/js/storymap.js.map +1 -1
- package/dist/navplace-properties.json +40 -0
- package/docs/migration-from-knightlab.md +359 -0
- package/docs/storymap-as-iiif-manifest.md +934 -0
- package/package.json +16 -10
- package/schema/storymap.schema.json +431 -78
- package/src/animation/easings.ts +25 -0
- package/src/animation/tween.ts +186 -0
- package/src/core/Browser.ts +20 -0
- package/src/core/Load.ts +232 -0
- package/src/core/Util.ts +416 -0
- package/src/core/mixins.ts +188 -0
- package/src/core/viewers.ts +94 -0
- package/src/dom/Dom.ts +31 -0
- package/src/dom/DomEvent.ts +80 -0
- package/src/globals.d.ts +24 -0
- package/src/language/Language.ts +281 -0
- package/src/language/locale/.expected-gaps.json +86 -0
- package/src/language/locale/be.json +31 -0
- package/src/language/locale/bg.json +31 -0
- package/src/language/locale/cs.json +31 -0
- package/src/language/locale/de.json +31 -0
- package/src/language/locale/el.json +31 -0
- package/src/language/locale/en.json +32 -0
- package/src/language/locale/es.json +31 -0
- package/src/language/locale/et.json +22 -0
- package/src/language/locale/fr.json +31 -0
- package/src/language/locale/he.json +31 -0
- package/src/language/locale/hu.json +31 -0
- package/src/language/locale/is.json +22 -0
- package/src/language/locale/it.json +31 -0
- package/src/language/locale/jp.json +31 -0
- package/src/language/locale/ko.json +31 -0
- package/src/language/locale/nl.json +31 -0
- package/src/language/locale/nn.json +22 -0
- package/src/language/locale/no.json +31 -0
- package/src/language/locale/pl.json +31 -0
- package/src/language/locale/pt.json +31 -0
- package/src/language/locale/ru.json +31 -0
- package/src/language/locale/sk.json +31 -0
- package/src/language/locale/sr.json +21 -0
- package/src/language/locale/sv.json +31 -0
- package/src/language/locale/tr.json +31 -0
- package/src/language/locale/uk.json +31 -0
- package/src/language/locale/ur.json +22 -0
- package/src/language/locale/zh-cn.json +31 -0
- package/src/language/locale/zh-tw.json +31 -0
- package/src/main.ts +143 -0
- package/src/map/Map.ts +794 -0
- package/src/map/MapMarker.ts +172 -0
- package/src/map/georeference.ts +325 -0
- package/src/map/openlayers/Map.OpenLayers.ts +2492 -0
- package/src/map/openlayers/MapMarker.OpenLayers.ts +400 -0
- package/src/map/openlayers/zoomifyTiles.ts +25 -0
- package/src/map/types.ts +17 -0
- package/src/media/EmbedUtil.ts +452 -0
- package/src/media/Media.ts +597 -0
- package/src/media/MediaType.ts +163 -0
- package/src/media/embedId.ts +104 -0
- package/src/media/types/Audio.ts +14 -0
- package/src/media/types/Blockquote.ts +39 -0
- package/src/media/types/DailyMotion.ts +53 -0
- package/src/media/types/DocumentCloud.ts +12 -0
- package/src/media/types/Facebook.ts +40 -0
- package/src/media/types/Flickr.ts +115 -0
- package/src/media/types/GoogleDoc.ts +58 -0
- package/src/media/types/HtmlMedia.ts +167 -0
- package/src/media/types/IFrame.ts +50 -0
- package/src/media/types/Image.ts +115 -0
- package/src/media/types/Juxtapose.ts +41 -0
- package/src/media/types/SoundCloud.ts +99 -0
- package/src/media/types/Text.ts +178 -0
- package/src/media/types/Twitter.ts +109 -0
- package/src/media/types/Video.ts +14 -0
- package/src/media/types/Vimeo.ts +65 -0
- package/src/media/types/Website.ts +46 -0
- package/src/media/types/Wikipedia.ts +134 -0
- package/src/media/types/YouTube.ts +224 -0
- package/src/scss/Typography.scss +235 -0
- package/src/scss/VCO.StoryMap.Dark.scss +150 -0
- package/src/scss/VCO.StoryMap.scss +195 -0
- package/src/scss/Variables.Dark.scss +57 -0
- package/src/scss/Variables.scss +48 -0
- package/src/scss/core/Mixins.scss +54 -0
- package/src/scss/core/Reset.scss +206 -0
- package/src/scss/fonts/_font.base.scss +113 -0
- package/src/scss/fonts/font.abril-droidsans.scss +75 -0
- package/src/scss/fonts/font.amatic-andika.scss +76 -0
- package/src/scss/fonts/font.bitter-raleway.scss +92 -0
- package/src/scss/fonts/font.cairo.scss +79 -0
- package/src/scss/fonts/font.clicker-garamond.scss +97 -0
- package/src/scss/fonts/font.dancing-ledger.scss +75 -0
- package/src/scss/fonts/font.default.scss +9 -0
- package/src/scss/fonts/font.fjalla-average.scss +80 -0
- package/src/scss/fonts/font.georgia-helvetica.scss +58 -0
- package/src/scss/fonts/font.knightlab.scss +111 -0
- package/src/scss/fonts/font.lustria-lato.scss +80 -0
- package/src/scss/fonts/font.medula-lato.scss +73 -0
- package/src/scss/fonts/font.oldstandard.scss +94 -0
- package/src/scss/fonts/font.opensans-gentiumbook.scss +85 -0
- package/src/scss/fonts/font.playfair-faunaone.scss +88 -0
- package/src/scss/fonts/font.playfair.scss +89 -0
- package/src/scss/fonts/font.pt.scss +96 -0
- package/src/scss/fonts/font.roboto-megrim.scss +73 -0
- package/src/scss/fonts/font.rufina-sintony.scss +73 -0
- package/src/scss/fonts/font.ubuntu.scss +82 -0
- package/src/scss/fonts/font.unicaone-vollkorn.scss +90 -0
- package/src/scss/icons/Icons.scss +239 -0
- package/src/scss/map/VCO.ImageMarker.scss +23 -0
- package/src/scss/map/VCO.Map.scss +21 -0
- package/src/scss/map/VCO.MapMarker.scss +242 -0
- package/src/scss/map/openlayers/VCO.Map.OpenLayers.scss +126 -0
- package/src/scss/media/VCO.Media.scss +219 -0
- package/src/scss/media/types/VCO.Media.Blockquote.scss +76 -0
- package/src/scss/media/types/VCO.Media.IFrame.scss +11 -0
- package/src/scss/media/types/VCO.Media.Image.scss +13 -0
- package/src/scss/media/types/VCO.Media.Text.scss +98 -0
- package/src/scss/media/types/VCO.Media.Twitter.scss +87 -0
- package/src/scss/media/types/VCO.Media.Wikipedia.scss +65 -0
- package/src/scss/site/site.scss +748 -0
- package/src/scss/slider/VCO.Slide.scss +457 -0
- package/src/scss/slider/VCO.SlideNav.scss +332 -0
- package/src/scss/slider/VCO.StorySlider.scss +66 -0
- package/src/scss/snapmap/VCO.SnapMap.scss +103 -0
- package/src/scss/ui/VCO.Consent.scss +121 -0
- package/src/scss/ui/VCO.MenuBar.Button.scss +107 -0
- package/src/scss/ui/VCO.MenuBar.scss +20 -0
- package/src/scss/ui/VCO.Message.scss +101 -0
- package/src/site/site.ts +88 -0
- package/src/slider/Slide.ts +554 -0
- package/src/slider/SlideNav.ts +246 -0
- package/src/slider/StorySlider.ts +833 -0
- package/src/storymap/Consent.ts +471 -0
- package/src/storymap/StoryMap.ts +2118 -0
- package/src/storymap/content-state.ts +185 -0
- package/src/storymap/iiif.ts +1844 -0
- package/src/storymap/to-iiif.ts +921 -0
- package/src/storymap/validate.ts +257 -0
- package/src/types.ts +494 -0
- package/src/ui/MenuBar.ts +376 -0
- package/src/ui/Message.ts +127 -0
- package/src/ui/Swipable.ts +455 -0
- package/dist/assets/demo-CVQ7kFek.js +0 -1
- package/dist/assets/harness-C-VZV-ou.js +0 -1
- package/dist/assets/index-DDsPBPZA.js +0 -1
- package/dist/assets/main-DwbXrrYn.js +0 -17
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { mergeData } from "../core/Util";
|
|
2
|
+
import { Evented, type EventedInstance } from "../core/mixins";
|
|
3
|
+
import { easeInSpline } from "../animation/easings";
|
|
4
|
+
import type {
|
|
5
|
+
AnimationHandle,
|
|
6
|
+
IconSpec,
|
|
7
|
+
LatLngLiteral,
|
|
8
|
+
MapMarkerData,
|
|
9
|
+
StorymapOptions,
|
|
10
|
+
} from "../types";
|
|
11
|
+
/* MapMarker
|
|
12
|
+
Creates a marker. Takes a data object and
|
|
13
|
+
populates the marker with content.
|
|
14
|
+
================================================= */
|
|
15
|
+
|
|
16
|
+
class MapMarkerBase {
|
|
17
|
+
declare "_el": Record<string, HTMLElement>;
|
|
18
|
+
declare "_marker": HTMLDivElement;
|
|
19
|
+
declare "_icon": IconSpec | HTMLDivElement | false;
|
|
20
|
+
declare "_custom_icon": IconSpec | false;
|
|
21
|
+
declare "_custom_icon_url": string;
|
|
22
|
+
declare "_custom_image_icon": string | false;
|
|
23
|
+
declare "marker_number": number;
|
|
24
|
+
declare "media_icon_class": string;
|
|
25
|
+
declare "timer": ReturnType<typeof setTimeout> | null;
|
|
26
|
+
declare "data": MapMarkerData;
|
|
27
|
+
declare "options": StorymapOptions;
|
|
28
|
+
declare "animator": AnimationHandle | null;
|
|
29
|
+
declare "fire": EventedInstance["fire"];
|
|
30
|
+
|
|
31
|
+
/* Constructor
|
|
32
|
+
================================================== */
|
|
33
|
+
constructor(data?: MapMarkerData, options?: Partial<StorymapOptions>) {
|
|
34
|
+
// DOM Elements
|
|
35
|
+
this._el = {
|
|
36
|
+
container: {} as HTMLElement,
|
|
37
|
+
content_container: {} as HTMLElement,
|
|
38
|
+
content: {} as HTMLElement,
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
// Components
|
|
42
|
+
this._marker = {} as HTMLDivElement;
|
|
43
|
+
|
|
44
|
+
// Icon
|
|
45
|
+
this._icon = {} as HTMLDivElement;
|
|
46
|
+
this._custom_icon = false;
|
|
47
|
+
this._custom_icon_url = "";
|
|
48
|
+
this._custom_image_icon = false;
|
|
49
|
+
|
|
50
|
+
// Marker Number
|
|
51
|
+
this.marker_number = 0;
|
|
52
|
+
|
|
53
|
+
// Media Icon
|
|
54
|
+
this.media_icon_class = "";
|
|
55
|
+
|
|
56
|
+
// Timer
|
|
57
|
+
this.timer = null;
|
|
58
|
+
|
|
59
|
+
// Data
|
|
60
|
+
this.data = {};
|
|
61
|
+
|
|
62
|
+
// Options
|
|
63
|
+
this.options = {
|
|
64
|
+
// animation
|
|
65
|
+
duration: 1000,
|
|
66
|
+
ease: easeInSpline,
|
|
67
|
+
width: 600,
|
|
68
|
+
height: 600,
|
|
69
|
+
} as StorymapOptions;
|
|
70
|
+
|
|
71
|
+
// Animation Object
|
|
72
|
+
this.animator = null;
|
|
73
|
+
|
|
74
|
+
// Merge Data and Options
|
|
75
|
+
mergeData(this.options, options);
|
|
76
|
+
mergeData(this.data, data);
|
|
77
|
+
|
|
78
|
+
this._initLayout();
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* Public
|
|
82
|
+
================================================== */
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* @deprecated No-op since 0.9.x upstream (the original marker defined an
|
|
86
|
+
* empty body too). Markers are never individually hidden; use CSS on
|
|
87
|
+
* `.vco-mapmarker`, or `active(false)` to dim one.
|
|
88
|
+
*/
|
|
89
|
+
show(): void {}
|
|
90
|
+
|
|
91
|
+
/** @deprecated See {@link show} — no-op since 0.9.x upstream. */
|
|
92
|
+
hide(): void {}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* @deprecated Never implemented, in the original viewer either: the base
|
|
96
|
+
* `MapMarker._createPopup` had an empty body and the Leaflet override's
|
|
97
|
+
* body was commented out, so the `map_popup` option that called it never
|
|
98
|
+
* had any effect. Kept as a no-op so pre-0.10 code that calls it keeps
|
|
99
|
+
* working. Render the slide text yourself, or use CSS on
|
|
100
|
+
* `.vco-mapmarker` to show a label.
|
|
101
|
+
*/
|
|
102
|
+
createPopup(_d?: MapMarkerData, _o?: StorymapOptions): void {}
|
|
103
|
+
|
|
104
|
+
addTo(m: unknown): void {
|
|
105
|
+
this._addTo(m);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
removeFrom(m: unknown): void {
|
|
109
|
+
this._removeFrom(m);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
updateDisplay(w: number, h: number, a?: boolean): void {
|
|
113
|
+
this._updateDisplay(w, h, a);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
createMarker(d?: MapMarkerData, o?: StorymapOptions): void {
|
|
117
|
+
this._createMarker(d, o);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
active(a: boolean): void {
|
|
121
|
+
this._active(a);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
location(): LatLngLiteral | null {
|
|
125
|
+
return this._location();
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* Marker Specific
|
|
129
|
+
Specific to Map API
|
|
130
|
+
================================================== */
|
|
131
|
+
_createMarker(d?: MapMarkerData, o?: StorymapOptions): void {}
|
|
132
|
+
|
|
133
|
+
_addTo(m: unknown): void {}
|
|
134
|
+
|
|
135
|
+
_removeFrom(m: unknown): void {}
|
|
136
|
+
|
|
137
|
+
_active(a: boolean): void {}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* The marker's coordinate, or null when it has none (an overview slide, or
|
|
141
|
+
* a slide carrying only an image region). Every caller treats null as
|
|
142
|
+
* "nothing to focus", so this is the honest shape — the previous
|
|
143
|
+
* `{ lat: 0, lng: 0 }` was a real point at Null Island, spelled with a
|
|
144
|
+
* longitude key nothing in the map read.
|
|
145
|
+
*/
|
|
146
|
+
_location(): LatLngLiteral | null {
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/* Events
|
|
151
|
+
================================================== */
|
|
152
|
+
_onMarkerClick(e?: unknown): void {
|
|
153
|
+
this.fire("markerclick", { marker_number: this.marker_number });
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/* Private Methods
|
|
157
|
+
================================================== */
|
|
158
|
+
_initLayout(): void {
|
|
159
|
+
this._createMarker(this.data, this.options);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Update Display
|
|
163
|
+
_updateDisplay(width: number, height: number, animate?: boolean): void {}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export default class MapMarker extends Evented(MapMarkerBase) {
|
|
167
|
+
constructor(...args: ConstructorParameters<typeof MapMarkerBase>) {
|
|
168
|
+
super(...args);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export { MapMarker };
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
// Affine placement of IIIF images from Georeference Extension ground control
|
|
2
|
+
// points, as a pure module so it can be unit tested without OpenLayers or a
|
|
3
|
+
// network.
|
|
4
|
+
//
|
|
5
|
+
// The IIIF Georeference Extension (iiif.io/api/extension/georef) supplies a
|
|
6
|
+
// GeoJSON FeatureCollection pairing `properties.resourceCoords` (image
|
|
7
|
+
// pixels) with `geometry.coordinates` (WGS84 lon/lat). Fitting those points
|
|
8
|
+
// yields the placement of the image on the geographic map.
|
|
9
|
+
//
|
|
10
|
+
// Only what OpenLayers can actually render is supported: the affine
|
|
11
|
+
// (first-order polynomial) case with an axis-aligned result, which is placed
|
|
12
|
+
// as a geographic `extent` on the IIIF source and reprojected by the view.
|
|
13
|
+
// Rotated or skewed sheets, higher-order polynomials and thin plate splines
|
|
14
|
+
// are reported so the caller can warn and skip them instead of drawing a
|
|
15
|
+
// wrong layer.
|
|
16
|
+
|
|
17
|
+
import type { StorymapGeoreferenceBody } from "../types";
|
|
18
|
+
|
|
19
|
+
/** An affine transform: x' = a·x + c·y + e, y' = b·x + d·y + f */
|
|
20
|
+
export type AffineTransform = [number, number, number, number, number, number];
|
|
21
|
+
|
|
22
|
+
/** Bounding box in WGS84 degrees, `[west, south, east, north]` */
|
|
23
|
+
export type LonLatBbox = [number, number, number, number];
|
|
24
|
+
|
|
25
|
+
/** Ground control point pairing an image pixel with a WGS84 position */
|
|
26
|
+
export interface GroundControlPoint {
|
|
27
|
+
/** Image pixel `[x, y]` */
|
|
28
|
+
pixel: [number, number];
|
|
29
|
+
/** WGS84 `[lon, lat]` */
|
|
30
|
+
lonLat: [number, number];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Largest allowed deviation, in degrees, between a control point and its
|
|
35
|
+
* affine prediction. GCP sets digitized by hand routinely miss by a few
|
|
36
|
+
* hundred metres; anything beyond this is a projection problem (or a
|
|
37
|
+
* higher-order transform) that an affine cannot represent.
|
|
38
|
+
*/
|
|
39
|
+
const MAX_RESIDUAL_DEGREES = 0.05;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Largest allowed sine of the rotation/skew between the image axes and the
|
|
43
|
+
* geographic axes. The placement is drawn as an axis-aligned geographic
|
|
44
|
+
* extent, so a sheet scanned at an angle cannot be represented.
|
|
45
|
+
*/
|
|
46
|
+
const MAX_AXIS_SKEW = 0.01;
|
|
47
|
+
|
|
48
|
+
export type GeoreferenceFit =
|
|
49
|
+
| {
|
|
50
|
+
kind: "placed";
|
|
51
|
+
/** image pixel → WGS84 lon/lat */
|
|
52
|
+
transform: AffineTransform;
|
|
53
|
+
/** bounding box of the four image corners, in WGS84 degrees */
|
|
54
|
+
bbox: LonLatBbox;
|
|
55
|
+
/** mean absolute residual of the fit, in degrees */
|
|
56
|
+
residual: number;
|
|
57
|
+
}
|
|
58
|
+
| {
|
|
59
|
+
kind: "skipped";
|
|
60
|
+
/** why the points cannot be placed, for the console warning */
|
|
61
|
+
reason: string;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
function isFiniteNumber(value: unknown): value is number {
|
|
65
|
+
return typeof value === "number" && isFinite(value);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Resolves the `info.json` of a IIIF Image API service. The georeference
|
|
70
|
+
* term may name either the service base (as the Georeference Extension's
|
|
71
|
+
* ImageService target does) or the `info.json` document itself (as the
|
|
72
|
+
* `iiif.url` option does), so both are accepted.
|
|
73
|
+
*/
|
|
74
|
+
export function resolveInfoJsonUrl(url: string): string {
|
|
75
|
+
const trimmed = url.replace(/\/+$/, "");
|
|
76
|
+
return /info\.json$/.test(trimmed) ? trimmed : trimmed + "/info.json";
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Reads the ground control points out of a Georeference annotation body.
|
|
81
|
+
* Returns null when the body is malformed or holds fewer than three points
|
|
82
|
+
* (two points do not determine a transform).
|
|
83
|
+
*/
|
|
84
|
+
export function readGroundControlPoints(body: unknown): GroundControlPoint[] | null {
|
|
85
|
+
if (typeof body !== "object" || body === null) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
const features = (body as { features?: unknown }).features;
|
|
89
|
+
if (!Array.isArray(features)) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
const points: GroundControlPoint[] = [];
|
|
93
|
+
for (const feature of features) {
|
|
94
|
+
if (typeof feature !== "object" || feature === null) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const record = feature as {
|
|
98
|
+
properties?: { resourceCoords?: unknown };
|
|
99
|
+
geometry?: { coordinates?: unknown };
|
|
100
|
+
};
|
|
101
|
+
const coords = record.properties?.resourceCoords;
|
|
102
|
+
const position = record.geometry?.coordinates;
|
|
103
|
+
if (!Array.isArray(coords) || !Array.isArray(position)) {
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (!isFiniteNumber(coords[0]) || !isFiniteNumber(coords[1])) {
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (!isFiniteNumber(position[0]) || !isFiniteNumber(position[1])) {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
points.push({
|
|
113
|
+
pixel: [coords[0], coords[1]],
|
|
114
|
+
lonLat: [position[0], position[1]],
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
return points.length >= 3 ? points : null;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Whether the annotation's `transformation` hint asks for something the
|
|
122
|
+
* viewer cannot place. Absent or `polynomial` order 1 is fine; a missing
|
|
123
|
+
* order defaults to 1 in the Georeference Extension.
|
|
124
|
+
*/
|
|
125
|
+
export function unsupportedTransformation(body: StorymapGeoreferenceBody): string | null {
|
|
126
|
+
const transformation = body?.transformation;
|
|
127
|
+
if (!transformation || typeof transformation !== "object") {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
const type = transformation.type;
|
|
131
|
+
if (type === undefined || type === null) {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
if (type !== "polynomial") {
|
|
135
|
+
return `transformation type "${type}" is not supported (only a first-order polynomial is placed affinely)`;
|
|
136
|
+
}
|
|
137
|
+
const order = transformation.options?.order;
|
|
138
|
+
if (order !== undefined && order !== 1) {
|
|
139
|
+
return `polynomial order ${order} is not supported (only first-order is placed affinely)`;
|
|
140
|
+
}
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Least-squares fit of the affine transform mapping image pixels to WGS84
|
|
146
|
+
* lon/lat. Solves the two independent 3-parameter systems (x for lon, y for
|
|
147
|
+
* lat) with Gaussian elimination and partial pivoting; with three or more
|
|
148
|
+
* points the fit is over-determined, which absorbs the small errors of
|
|
149
|
+
* hand-digitized control points.
|
|
150
|
+
*/
|
|
151
|
+
export function fitAffine(points: GroundControlPoint[]): AffineTransform | null {
|
|
152
|
+
if (points.length < 3) {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
// The two systems share the same 3×3 normal matrix
|
|
156
|
+
const normal = [
|
|
157
|
+
[0, 0, 0],
|
|
158
|
+
[0, 0, 0],
|
|
159
|
+
[0, 0, 0],
|
|
160
|
+
];
|
|
161
|
+
const rhsX = [0, 0, 0];
|
|
162
|
+
const rhsY = [0, 0, 0];
|
|
163
|
+
for (const point of points) {
|
|
164
|
+
const [x, y] = point.pixel;
|
|
165
|
+
const row = [x, y, 1];
|
|
166
|
+
for (let i = 0; i < 3; i++) {
|
|
167
|
+
for (let j = 0; j < 3; j++) {
|
|
168
|
+
normal[i][j] += row[i] * row[j];
|
|
169
|
+
}
|
|
170
|
+
rhsX[i] += row[i] * point.lonLat[0];
|
|
171
|
+
rhsY[i] += row[i] * point.lonLat[1];
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
const lon = solve3x3(normal, rhsX);
|
|
175
|
+
const lat = solve3x3(normal, rhsY);
|
|
176
|
+
if (!lon || !lat) {
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
// [a, b, c, d, e, f] with lon' = a·x + c·y + e, lat' = b·x + d·y + f
|
|
180
|
+
return [lon[0], lat[0], lon[1], lat[1], lon[2], lat[2]];
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/** Applies a fitted transform to an image pixel. */
|
|
184
|
+
export function applyAffine(transform: AffineTransform, x: number, y: number): [number, number] {
|
|
185
|
+
const [a, b, c, d, e, f] = transform;
|
|
186
|
+
return [a * x + c * y + e, b * x + d * y + f];
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Fits a Georeference annotation body and reports whether the result can be
|
|
191
|
+
* drawn as an axis-aligned geographic extent.
|
|
192
|
+
*/
|
|
193
|
+
export function fitGeoreference(
|
|
194
|
+
body: StorymapGeoreferenceBody,
|
|
195
|
+
width: number,
|
|
196
|
+
height: number,
|
|
197
|
+
): GeoreferenceFit {
|
|
198
|
+
if (!isFiniteNumber(width) || !isFiniteNumber(height) || width <= 0 || height <= 0) {
|
|
199
|
+
return {
|
|
200
|
+
kind: "skipped",
|
|
201
|
+
reason: "the placed image has no usable pixel dimensions",
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
const unsupported = unsupportedTransformation(body);
|
|
205
|
+
if (unsupported) {
|
|
206
|
+
return { kind: "skipped", reason: unsupported };
|
|
207
|
+
}
|
|
208
|
+
const points = readGroundControlPoints(body);
|
|
209
|
+
if (!points) {
|
|
210
|
+
return {
|
|
211
|
+
kind: "skipped",
|
|
212
|
+
reason: "the georeference has fewer than three valid ground control points",
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
const transform = fitAffine(points);
|
|
216
|
+
if (!transform) {
|
|
217
|
+
return {
|
|
218
|
+
kind: "skipped",
|
|
219
|
+
reason: "the ground control points do not determine a transform",
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// How far the fit strays from the digitized points
|
|
224
|
+
let total = 0;
|
|
225
|
+
for (const point of points) {
|
|
226
|
+
const [lon, lat] = applyAffine(transform, point.pixel[0], point.pixel[1]);
|
|
227
|
+
total += Math.abs(lon - point.lonLat[0]) + Math.abs(lat - point.lonLat[1]);
|
|
228
|
+
}
|
|
229
|
+
const residual = total / (points.length * 2);
|
|
230
|
+
if (residual > MAX_RESIDUAL_DEGREES) {
|
|
231
|
+
return {
|
|
232
|
+
kind: "skipped",
|
|
233
|
+
reason:
|
|
234
|
+
"the ground control points do not fit an affine transform " +
|
|
235
|
+
`(mean residual ${residual.toFixed(4)}°, limit ${MAX_RESIDUAL_DEGREES}°); ` +
|
|
236
|
+
"the sheet needs a projection or a warped layer",
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// The image is drawn as an axis-aligned extent, so the axes must line up
|
|
241
|
+
// with the geographic axes
|
|
242
|
+
const [a, b, c, d] = transform;
|
|
243
|
+
const lonLength = Math.hypot(a, b);
|
|
244
|
+
const latLength = Math.hypot(c, d);
|
|
245
|
+
const skew = Math.max(
|
|
246
|
+
lonLength > 0 ? Math.abs(b) / lonLength : 1,
|
|
247
|
+
latLength > 0 ? Math.abs(c) / latLength : 1,
|
|
248
|
+
);
|
|
249
|
+
if (skew > MAX_AXIS_SKEW) {
|
|
250
|
+
return {
|
|
251
|
+
kind: "skipped",
|
|
252
|
+
reason:
|
|
253
|
+
"the placed image is rotated or skewed relative to the geographic axes; " +
|
|
254
|
+
"the viewer places axis-aligned sheets only (use tile_source_factory for warped layers)",
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Bounding box of the four image corners
|
|
259
|
+
const corners: [number, number][] = [
|
|
260
|
+
[0, 0],
|
|
261
|
+
[width, 0],
|
|
262
|
+
[width, height],
|
|
263
|
+
[0, height],
|
|
264
|
+
];
|
|
265
|
+
let west = Infinity;
|
|
266
|
+
let south = Infinity;
|
|
267
|
+
let east = -Infinity;
|
|
268
|
+
let north = -Infinity;
|
|
269
|
+
for (const [x, y] of corners) {
|
|
270
|
+
const [lon, lat] = applyAffine(transform, x, y);
|
|
271
|
+
west = Math.min(west, lon);
|
|
272
|
+
east = Math.max(east, lon);
|
|
273
|
+
south = Math.min(south, lat);
|
|
274
|
+
north = Math.max(north, lat);
|
|
275
|
+
}
|
|
276
|
+
if (
|
|
277
|
+
!isFiniteNumber(west) ||
|
|
278
|
+
!isFiniteNumber(south) ||
|
|
279
|
+
!isFiniteNumber(east) ||
|
|
280
|
+
!isFiniteNumber(north) ||
|
|
281
|
+
east <= west ||
|
|
282
|
+
north <= south
|
|
283
|
+
) {
|
|
284
|
+
return {
|
|
285
|
+
kind: "skipped",
|
|
286
|
+
reason: "the placed image has a degenerate extent",
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
return { kind: "placed", transform, bbox: [west, south, east, north], residual };
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/** Solves a 3×3 linear system by Gaussian elimination with partial pivoting. */
|
|
293
|
+
function solve3x3(matrix: number[][], rhs: number[]): [number, number, number] | null {
|
|
294
|
+
const m = [
|
|
295
|
+
[matrix[0][0], matrix[0][1], matrix[0][2], rhs[0]],
|
|
296
|
+
[matrix[1][0], matrix[1][1], matrix[1][2], rhs[1]],
|
|
297
|
+
[matrix[2][0], matrix[2][1], matrix[2][2], rhs[2]],
|
|
298
|
+
];
|
|
299
|
+
for (let column = 0; column < 3; column++) {
|
|
300
|
+
let pivot = column;
|
|
301
|
+
for (let row = column + 1; row < 3; row++) {
|
|
302
|
+
if (Math.abs(m[row][column]) > Math.abs(m[pivot][column])) {
|
|
303
|
+
pivot = row;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
if (Math.abs(m[pivot][column]) < 1e-12) {
|
|
307
|
+
return null;
|
|
308
|
+
}
|
|
309
|
+
if (pivot !== column) {
|
|
310
|
+
const swap = m[pivot];
|
|
311
|
+
m[pivot] = m[column];
|
|
312
|
+
m[column] = swap;
|
|
313
|
+
}
|
|
314
|
+
for (let row = 0; row < 3; row++) {
|
|
315
|
+
if (row === column) {
|
|
316
|
+
continue;
|
|
317
|
+
}
|
|
318
|
+
const factor = m[row][column] / m[column][column];
|
|
319
|
+
for (let k = column; k < 4; k++) {
|
|
320
|
+
m[row][k] -= factor * m[column][k];
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return [m[0][3] / m[0][0], m[1][3] / m[1][1], m[2][3] / m[2][2]];
|
|
325
|
+
}
|