@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
package/dist/docs/migration.html
CHANGED
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
<li><a class="button" href="./readme.html">README</a></li>
|
|
37
37
|
<li><a class="button" href="./migration.html">Migration guide</a></li>
|
|
38
38
|
<li><a class="button" href="./iiif.html">IIIF docs</a></li>
|
|
39
|
+
<li><a class="button" href="./authoring.html">Authoring</a></li>
|
|
39
40
|
<li><a class="button" href="./api/index.html">API docs</a></li>
|
|
40
41
|
<li><a class="button" href="../index.html#help">Help</a></li>
|
|
41
42
|
</ul>
|
|
@@ -151,7 +152,35 @@ are rendered wider with a visible track for contrast.</li>
|
|
|
151
152
|
</tr>
|
|
152
153
|
<tr>
|
|
153
154
|
<td><code>font_css: "stock:<name>"</code> (or a path)</td>
|
|
154
|
-
<td>
|
|
155
|
+
<td>paths now resolve against the page URL (not the library location), plus the font files ship via <code>@fontsource-utils/scss</code>; no separate font CSS link needed</td>
|
|
156
|
+
</tr>
|
|
157
|
+
</tbody></table>
|
|
158
|
+
<h2>A story with no map</h2>
|
|
159
|
+
<p><code>map_type: "none"</code> runs the storymap as text and media only. Nothing is
|
|
160
|
+
constructed: no <code>ol/Map</code>, no tile layer, no tile consent row, and the overview
|
|
161
|
+
control is hidden. The slider panel takes the full width, because there is no
|
|
162
|
+
map behind it to fade over.</p>
|
|
163
|
+
<p>This is the shape a photo essay or a transcript-led story wants, and it is the
|
|
164
|
+
one the map engine's unconditional construction used to make impossible. Note
|
|
165
|
+
that <code>map_type: ""</code> and an absent <code>map_type</code> both still mean OpenStreetMap, and
|
|
166
|
+
<code>map_type: null</code> now falls back to that default instead of throwing out of the
|
|
167
|
+
constructor — absence is not reinterpreted, so no existing document changes
|
|
168
|
+
meaning. Map-derived accessors (<code>getBaseLayer()</code>, <code>getMarkers()</code>, …) return
|
|
169
|
+
their neutral values, and the map setters are no-ops.</p>
|
|
170
|
+
<table>
|
|
171
|
+
<thead>
|
|
172
|
+
<tr>
|
|
173
|
+
<th>Old</th>
|
|
174
|
+
<th>New</th>
|
|
175
|
+
</tr>
|
|
176
|
+
</thead>
|
|
177
|
+
<tbody><tr>
|
|
178
|
+
<td>a text-only story with a dummy <code>map_type</code></td>
|
|
179
|
+
<td><code>map_type: "none"</code></td>
|
|
180
|
+
</tr>
|
|
181
|
+
<tr>
|
|
182
|
+
<td><code>map_type: null</code> (crashed the constructor)</td>
|
|
183
|
+
<td>normalised to the default, <code>""</code> → OSM</td>
|
|
155
184
|
</tr>
|
|
156
185
|
</tbody></table>
|
|
157
186
|
<h2>Removed globals and exports</h2>
|
|
@@ -197,7 +226,7 @@ are rendered wider with a visible track for contrast.</li>
|
|
|
197
226
|
</thead>
|
|
198
227
|
<tbody><tr>
|
|
199
228
|
<td><code>vine</code> media type (service shut down)</td>
|
|
200
|
-
<td>vine URLs fall back to the <code>website</code> iframe — use another media source for those slides</td>
|
|
229
|
+
<td>vine URLs fall back to the <code>website</code> iframe — or paste the provider's <code><iframe></code> snippet into the slide text (sanitized, https-only); use another media source for those slides</td>
|
|
201
230
|
</tr>
|
|
202
231
|
<tr>
|
|
203
232
|
<td>Juxtapose <code>frame/?uid=</code> embed URLs</td>
|
|
@@ -207,7 +236,25 @@ are rendered wider with a visible track for contrast.</li>
|
|
|
207
236
|
<td>Twitter <code>@nickname</code> rendering</td>
|
|
208
237
|
<td>tweets from <code>x.com</code> URLs are now parsed too (fixes <code>@undefined</code> nicknames); no migration needed</td>
|
|
209
238
|
</tr>
|
|
239
|
+
<tr>
|
|
240
|
+
<td>Ricoh360/theta360 embeds (#391)</td>
|
|
241
|
+
<td>service no longer available (won't fix) — paste the provider's <code><iframe></code> snippet into the slide text if the service returns</td>
|
|
242
|
+
</tr>
|
|
210
243
|
</tbody></table>
|
|
244
|
+
<p>Extra media per slide (#358, partial): each slide still has one primary
|
|
245
|
+
<code>media</code> item, but an <code><iframe></code> embed snippet pasted into the slide <code>text</code>
|
|
246
|
+
field now renders sanitized (scripts, event handlers and non-https sources
|
|
247
|
+
dropped) — use this for a second video/map/embed or as the migration path
|
|
248
|
+
for removed media types:</p>
|
|
249
|
+
<pre><code class="language-html"><p>Extra footage:</p>
|
|
250
|
+
<iframe
|
|
251
|
+
src="https://example.com/embed/123"
|
|
252
|
+
width="560"
|
|
253
|
+
height="315"
|
|
254
|
+
frameborder="0"
|
|
255
|
+
allowfullscreen
|
|
256
|
+
></iframe>
|
|
257
|
+
</code></pre>
|
|
211
258
|
<p><code>map_type: "zoomify"</code> is supported again (legacy): the image pyramid renders
|
|
212
259
|
via the storymap data's <code>zoomify</code> options (<code>path</code>, <code>width</code>, <code>height</code>), using a
|
|
213
260
|
JS warning instead of the previous removal error. Cropped edge/remainder tiles
|
|
@@ -219,29 +266,284 @@ storymap JSON sources.</p>
|
|
|
219
266
|
<h2>Map engine: Leaflet → OpenLayers</h2>
|
|
220
267
|
<ul>
|
|
221
268
|
<li><code>storymap.map</code> now exposes the <strong>OpenLayers <code>Map</code></strong> instance instead of a
|
|
222
|
-
Leaflet map. Port any direct Leaflet calls
|
|
223
|
-
|
|
269
|
+
Leaflet map. Port any direct Leaflet calls to the OpenLayers API (table
|
|
270
|
+
below). It is <code>null</code> until the map has been built.</li>
|
|
224
271
|
<li>Markers are DOM overlays (<code>.vco-mapmarker</code> / <code>.vco-mapmarker-active</code>) like
|
|
225
272
|
before; the mini map is an OpenLayers <code>OverviewMap</code> control.</li>
|
|
226
273
|
<li>New basemap options: vector styles via <code>map_type: "osm:<style>"</code> (OpenFreeMap)
|
|
227
274
|
or a Mapbox style JSON URL.</li>
|
|
275
|
+
<li>All OL types (<code>Map</code>, <code>View</code>, <code>Layer</code>, <code>Source</code>, <code>Feature</code>, ...) are
|
|
276
|
+
re-exported, so a consumer can type its own overlays without depending on
|
|
277
|
+
<code>ol</code> directly.</li>
|
|
228
278
|
</ul>
|
|
279
|
+
<h3>Direct Leaflet calls → OpenLayers</h3>
|
|
280
|
+
<p>Both maps are reachable from the same place (<code>storymap.map</code>), so only the
|
|
281
|
+
call syntax changes:</p>
|
|
282
|
+
<table>
|
|
283
|
+
<thead>
|
|
284
|
+
<tr>
|
|
285
|
+
<th>Leaflet</th>
|
|
286
|
+
<th>OpenLayers</th>
|
|
287
|
+
</tr>
|
|
288
|
+
</thead>
|
|
289
|
+
<tbody><tr>
|
|
290
|
+
<td><code>map.getCenter()</code></td>
|
|
291
|
+
<td><code>map.getView().getCenter()</code> — panel-shifted, see below</td>
|
|
292
|
+
</tr>
|
|
293
|
+
<tr>
|
|
294
|
+
<td><code>map.getZoom()</code></td>
|
|
295
|
+
<td><code>map.getView().getZoom()</code></td>
|
|
296
|
+
</tr>
|
|
297
|
+
<tr>
|
|
298
|
+
<td><code>map.setView(c, z)</code> / <code>map.fitBounds(b)</code></td>
|
|
299
|
+
<td><code>map.getView().fit(extent, { size: map.getSize() })</code></td>
|
|
300
|
+
</tr>
|
|
301
|
+
<tr>
|
|
302
|
+
<td><code>map.panTo(c)</code> / <code>map.flyTo(c, z)</code></td>
|
|
303
|
+
<td><code>map.getView().animate({ center: c, duration: 300 })</code></td>
|
|
304
|
+
</tr>
|
|
305
|
+
<tr>
|
|
306
|
+
<td><code>map.setZoom(z)</code></td>
|
|
307
|
+
<td><code>map.getView().setZoom(z)</code> (or <code>.animate({ zoom: z })</code>)</td>
|
|
308
|
+
</tr>
|
|
309
|
+
<tr>
|
|
310
|
+
<td><code>map.getSize()</code> / <code>map.getBounds()</code></td>
|
|
311
|
+
<td><code>map.getSize()</code> / <code>map.getView().calculateExtent(map.getSize())</code></td>
|
|
312
|
+
</tr>
|
|
313
|
+
<tr>
|
|
314
|
+
<td><code>map.on("moveend", fn)</code></td>
|
|
315
|
+
<td><code>map.on("moveend", fn)</code> (same event names; <code>movestart</code>/<code>move</code> also exist)</td>
|
|
316
|
+
</tr>
|
|
317
|
+
<tr>
|
|
318
|
+
<td><code>L.tileLayer(url, opts).addTo(map)</code></td>
|
|
319
|
+
<td><code>new TileLayer({ source: new XYZ({ url, attributions }) }).setMap(map)</code></td>
|
|
320
|
+
</tr>
|
|
321
|
+
<tr>
|
|
322
|
+
<td><code>L.control.attribution</code> / <code>L.control.zoom</code></td>
|
|
323
|
+
<td>OL <code>Attribution</code> / <code>Zoom</code> controls (pass them via <code>map_options.controls</code>)</td>
|
|
324
|
+
</tr>
|
|
325
|
+
<tr>
|
|
326
|
+
<td><code>map.getPane("overlayPane")</code></td>
|
|
327
|
+
<td><code>map.getOverlayContainer()</code> (markers are DOM siblings, not OL features)</td>
|
|
328
|
+
</tr>
|
|
329
|
+
<tr>
|
|
330
|
+
<td><code>map.invalidateSize()</code></td>
|
|
331
|
+
<td><code>map.updateSize()</code></td>
|
|
332
|
+
</tr>
|
|
333
|
+
<tr>
|
|
334
|
+
<td><code>map.remove()</code></td>
|
|
335
|
+
<td><code>map.setTarget(undefined); map.dispose();</code> (or <code>storymap.dispose()</code>)</td>
|
|
336
|
+
</tr>
|
|
337
|
+
</tbody></table>
|
|
338
|
+
<p>The exposed center is deliberately panel-shifted: in landscape the view is
|
|
339
|
+
offset so the visible map sits left of the slide panel, which means
|
|
340
|
+
<code>getView().getCenter()</code> does <strong>not</strong> equal the current slide's location.
|
|
341
|
+
That is a display concern, not a data one — read the location from the
|
|
342
|
+
slide, not from the view. There is intentionally no offset-aware getter;
|
|
343
|
+
an earlier <code>_getMapCenter(offset)</code> parameter promised that correction and
|
|
344
|
+
never applied it, so it was removed rather than left to mislead.
|
|
345
|
+
| <code>map.options.crs</code> / <code>map.getPixelOrigin()</code> | <code>map.getView().getProjection()</code> / <code>map.getPixelFromCoordinate(coord)</code> |</p>
|
|
346
|
+
<p>Marker positions are still DOM elements, so <code>marker.getLatLng()</code> has no
|
|
347
|
+
equivalent — read the slide data (<code>storymap.data.stlides[n].location</code>) or use
|
|
348
|
+
<code>storymap._map.getMarker(n).latLon()</code>.</p>
|
|
349
|
+
<h3>Map and marker methods</h3>
|
|
350
|
+
<p>The map/marker methods of the original viewer are still there with the same
|
|
351
|
+
names and behaviour (<code>storymap._map.<method>()</code>, <code>marker.<method>()</code>); the OL
|
|
352
|
+
engine implements them as thin wrappers over <code>storymap.map</code>. Two methods are
|
|
353
|
+
deprecated no-ops and one is gone:</p>
|
|
354
|
+
<table>
|
|
355
|
+
<thead>
|
|
356
|
+
<tr>
|
|
357
|
+
<th>Original method</th>
|
|
358
|
+
<th>Status</th>
|
|
359
|
+
</tr>
|
|
360
|
+
</thead>
|
|
361
|
+
<tbody><tr>
|
|
362
|
+
<td><code>updateDisplay</code>, <code>goTo</code>, <code>panTo</code>, <code>zoomTo</code>, <code>viewTo</code></td>
|
|
363
|
+
<td>unchanged</td>
|
|
364
|
+
</tr>
|
|
365
|
+
<tr>
|
|
366
|
+
<td><code>getBoundsZoom</code>, <code>markerOverview</code>, <code>calculateMarkerZooms</code></td>
|
|
367
|
+
<td>unchanged (<code>getBoundsZoom()</code> now returns <code>number | undefined</code> instead of a falsy value)</td>
|
|
368
|
+
</tr>
|
|
369
|
+
<tr>
|
|
370
|
+
<td><code>createMiniMap</code>, <code>createMarkers</code>, <code>createMarker</code></td>
|
|
371
|
+
<td>unchanged</td>
|
|
372
|
+
</tr>
|
|
373
|
+
<tr>
|
|
374
|
+
<td><code>setMapOffset</code>, <code>calculateMinMaxZoom</code>, <code>updateMinMaxZoom</code>, <code>initialMapLocation</code></td>
|
|
375
|
+
<td>unchanged</td>
|
|
376
|
+
</tr>
|
|
377
|
+
<tr>
|
|
378
|
+
<td><code>show()</code> / <code>hide()</code> (map and marker)</td>
|
|
379
|
+
<td><strong>deprecated no-ops</strong> — they were already empty in the original viewer. Style <code>.vco-mapmarker</code> or use <code>marker.active(false)</code></td>
|
|
380
|
+
</tr>
|
|
381
|
+
<tr>
|
|
382
|
+
<td><code>map.addTo(container)</code> / <code>map.removeFrom(container)</code></td>
|
|
383
|
+
<td>unchanged — inherited from the <code>DomMixed</code> mixin: append/remove the map container and fire <code>added</code>/<code>removed</code>. The engine override re-targets and re-measures the OpenLayers viewport, so a move into a differently sized parent works</td>
|
|
384
|
+
</tr>
|
|
385
|
+
<tr>
|
|
386
|
+
<td><code>marker.createPopup()</code></td>
|
|
387
|
+
<td><strong>deprecated no-op</strong> — it never did anything upstream either (empty base body, commented-out Leaflet body), so the <code>map_popup</code> option that called it had no effect. Still accepted, still inert</td>
|
|
388
|
+
</tr>
|
|
389
|
+
<tr>
|
|
390
|
+
<td><code>marker.addTo()</code>, <code>marker.removeFrom()</code>, <code>marker.updateDisplay()</code>, <code>marker.active()</code>, <code>marker.location()</code></td>
|
|
391
|
+
<td>unchanged</td>
|
|
392
|
+
</tr>
|
|
393
|
+
</tbody></table>
|
|
394
|
+
<p>Marker helpers that Leaflet provided on the marker object (<code>getLatLng</code>,
|
|
395
|
+
<code>setIcon</code>, <code>bindPopup</code>) are gone; use <code>marker.latLon()</code>, the
|
|
396
|
+
<code>.vco-mapmarker</code> element and your own DOM/CSS.</p>
|
|
397
|
+
<h2>Reaching the map, layers and markers</h2>
|
|
398
|
+
<p><code>storymap.map</code> is the raw <code>ol/Map</code> (typed as <code>OlMap | null</code> — it is set during
|
|
399
|
+
construction, so check it before first use in an async setup). Everything the
|
|
400
|
+
viewer keeps internally is available through accessors on <code>storymap</code> (and on
|
|
401
|
+
<code>storymap._map</code> for the engine methods):</p>
|
|
402
|
+
<table>
|
|
403
|
+
<thead>
|
|
404
|
+
<tr>
|
|
405
|
+
<th>Accessor</th>
|
|
406
|
+
<th>Returns</th>
|
|
407
|
+
</tr>
|
|
408
|
+
</thead>
|
|
409
|
+
<tbody><tr>
|
|
410
|
+
<td><code>getBaseLayer()</code></td>
|
|
411
|
+
<td>the base tile/vector layer</td>
|
|
412
|
+
</tr>
|
|
413
|
+
<tr>
|
|
414
|
+
<td><code>getOverlayLayers()</code> / <code>getOverlayLayer(i)</code></td>
|
|
415
|
+
<td>overlay layers / one by index (<code>null</code> if out of range)</td>
|
|
416
|
+
</tr>
|
|
417
|
+
<tr>
|
|
418
|
+
<td><code>getOverlayCount()</code></td>
|
|
419
|
+
<td>number of overlays</td>
|
|
420
|
+
</tr>
|
|
421
|
+
<tr>
|
|
422
|
+
<td><code>setOverlayVisible(i, on)</code> / <code>setOverlayOpacity(i, opacity)</code></td>
|
|
423
|
+
<td>show/hide and fade one overlay</td>
|
|
424
|
+
</tr>
|
|
425
|
+
<tr>
|
|
426
|
+
<td><code>getMinimap()</code></td>
|
|
427
|
+
<td>the <code>OverviewMap</code> control, or its inner map via <code>getOverviewMap()</code></td>
|
|
428
|
+
</tr>
|
|
429
|
+
<tr>
|
|
430
|
+
<td><code>getLine()</code> / <code>getLineActive()</code></td>
|
|
431
|
+
<td>the full and the travelled route <code>VectorLayer</code></td>
|
|
432
|
+
</tr>
|
|
433
|
+
<tr>
|
|
434
|
+
<td><code>getMarker(n)</code> / <code>getMarkers()</code></td>
|
|
435
|
+
<td>one marker or all of them, in slide order</td>
|
|
436
|
+
</tr>
|
|
437
|
+
<tr>
|
|
438
|
+
<td><code>setExtraAttributions(html)</code></td>
|
|
439
|
+
<td>extra attribution HTML, listed after the source credits</td>
|
|
440
|
+
</tr>
|
|
441
|
+
<tr>
|
|
442
|
+
<td><code>isImageSpace()</code></td>
|
|
443
|
+
<td>whether the map is a IIIF image in image space (see below)</td>
|
|
444
|
+
</tr>
|
|
445
|
+
</tbody></table>
|
|
446
|
+
<p><code>tile_source_factory</code> may return a full <code>ol/layer/Layer</code> (not just a source)
|
|
447
|
+
anywhere a layer is built, so custom layers can carry their own opacity,
|
|
448
|
+
z-index and events. A custom layer without a source (Allmaps'
|
|
449
|
+
<code>WarpedMapLayer</code>) passes through untouched; source reads go through a
|
|
450
|
+
capability check, so it simply skips the tile-grid fits.</p>
|
|
451
|
+
<p>The viewer reserves three z-index ranges and custom layers should stay out
|
|
452
|
+
of them: <strong>0</strong> for the base tiles, <strong>1..n</strong> for the stacked <code>overlays[]</code>
|
|
453
|
+
entries in order, and <strong>10/11</strong> for the full and travelled route lines. A
|
|
454
|
+
custom layer with no explicit z-index lands wherever OpenLayers puts it,
|
|
455
|
+
which is above the lines — set one explicitly if the layer must sit inside
|
|
456
|
+
the stack.</p>
|
|
457
|
+
<h3>Image space vs. georeferenced</h3>
|
|
458
|
+
<p><code>map_type: "iiif"</code> is a mercator map by default. With <code>map_as_image: true</code> the
|
|
459
|
+
image <em>is</em> the map: the view projection becomes <code>EPSG:4326</code>, the view is
|
|
460
|
+
fitted to the image extent and marker locations are pixel offsets into the
|
|
461
|
+
image rather than lat/lon. Ask <code>storymap.isImageSpace()</code> instead of testing
|
|
462
|
+
<code>map_type</code> — georeferenced IIIF (a manifest with <code>navPlace</code> regions) is an
|
|
463
|
+
ordinary mercator map, and <code>map_bbox</code> with a georeferenced layer is one too.</p>
|
|
464
|
+
<h3>Knowing when the imagery is there</h3>
|
|
465
|
+
<p>Tile and image sources attach asynchronously, so <code>loaded</code> can fire before the
|
|
466
|
+
imagery exists. Listen for <code>imageready</code>, which fires once a source is ready and
|
|
467
|
+
carries <code>{ source, kind, layer }</code> (<code>kind</code> is <code>"iiif"</code>, <code>"zoomify"</code> or
|
|
468
|
+
<code>"tiles"</code>); it is re-fired on the <code>storymap</code> as well:</p>
|
|
469
|
+
<pre><code class="language-js">storymap.on("imageready", ({ kind, source }) => {
|
|
470
|
+
console.log("imagery ready", kind, source);
|
|
471
|
+
});
|
|
472
|
+
</code></pre>
|
|
473
|
+
<h3>Tearing a storymap down</h3>
|
|
474
|
+
<p>Call <code>storymap.dispose()</code> when the embedding view goes away (SPA route change,
|
|
475
|
+
dialog close). It clears the timers and the resize observer, removes the
|
|
476
|
+
<code>window</code>/<code>document</code> listeners, cancels running slide animations, disposes the
|
|
477
|
+
slider and the OpenLayers map, and sets <code>storymap.map</code> to <code>null</code>. Calling it
|
|
478
|
+
twice is safe; the instance is unusable afterwards.</p>
|
|
479
|
+
<h2>Custom map providers</h2>
|
|
480
|
+
<p>Any slippy-map tile URL works as <code>map_type</code> — pass the template verbatim
|
|
481
|
+
(including <code>{z}/{x}/{y}</code>), relative or absolute:</p>
|
|
482
|
+
<pre><code class="language-js">new StoryMap("embed", data, {
|
|
483
|
+
map_type: "https://tiles.example.org/base/{z}/{x}/{y}.png",
|
|
484
|
+
});
|
|
485
|
+
</code></pre>
|
|
486
|
+
<p>Mapbox style JSON URLs render as vector tile layers; OpenLayers
|
|
487
|
+
<code>Map</code>/<code>View</code> pass-through stays available via <code>options.map_options</code>
|
|
488
|
+
(<code>controls</code> replaces the defaults, <code>interactions</code> are added to the
|
|
489
|
+
viewer's own pan/zoom set, <code>view</code> merges over the computed default).</p>
|
|
490
|
+
<p>For source classes the templates cannot express (WMS, authenticated or
|
|
491
|
+
gridded sources), use the <code>tile_source_factory</code> option. It is consulted
|
|
492
|
+
for every base, overlay and minimap layer before the built-in
|
|
493
|
+
<code>map_type</code> handling — return a <code>TileLayer</code> (or a bare <code>Source</code>, which
|
|
494
|
+
is wrapped in one), or <code>null</code>/<code>undefined</code> to fall through:</p>
|
|
495
|
+
<pre><code class="language-js">import TileLayer from "ol/layer/Tile";
|
|
496
|
+
import TileWMS from "ol/source/TileWMS";
|
|
497
|
+
|
|
498
|
+
new StoryMap("embed", data, {
|
|
499
|
+
map_type: "wms:flood",
|
|
500
|
+
tile_source_factory: (map_type, { createDefault }) =>
|
|
501
|
+
map_type.startsWith("wms:")
|
|
502
|
+
? new TileLayer({
|
|
503
|
+
source: new TileWMS({
|
|
504
|
+
url: "https://geoserver.example.org/wms",
|
|
505
|
+
params: { LAYERS: map_type.slice(4) },
|
|
506
|
+
crossOrigin: "anonymous",
|
|
507
|
+
}),
|
|
508
|
+
})
|
|
509
|
+
: createDefault(),
|
|
510
|
+
});
|
|
511
|
+
</code></pre>
|
|
512
|
+
<p>Custom sources must carry their own attributions (via the returned
|
|
513
|
+
source or the <code>attribution</code> option) — only the built-in <code>osm*</code> types
|
|
514
|
+
are credited automatically. <code>tile_source_factory</code> is constructor- and
|
|
515
|
+
runtime-only (functions cannot ride storymap JSON) and also applies to
|
|
516
|
+
<code>overlays[]</code> entries, whose <code>map_type</code> values go through the same
|
|
517
|
+
factory.</p>
|
|
229
518
|
<h2>Data and tooling</h2>
|
|
230
519
|
<ul>
|
|
231
520
|
<li>Storymap JSON is now validated against a JSON Schema
|
|
232
521
|
(<code>schema/storymap.schema.json</code>); invalid documents are reported to the
|
|
233
522
|
console at load time.</li>
|
|
234
|
-
<li>IIIF Presentation 3 manifests are accepted directly as storymap sources
|
|
235
|
-
<
|
|
236
|
-
|
|
237
|
-
<code>
|
|
238
|
-
|
|
523
|
+
<li>IIIF Presentation 3 manifests are accepted directly as storymap sources.
|
|
524
|
+
The map settings map onto <code>storymap:</code> terms of a map configuration service
|
|
525
|
+
(IIIF has no basemap or tile-layer vocabulary of its own), and the
|
|
526
|
+
geospatial parts use the native extensions where they exist: <code>navPlace</code>
|
|
527
|
+
Points for slide locations, a <code>navPlace</code> Polygon for the story extent
|
|
528
|
+
(<code>map_bbox</code>), an IIIF Image API Selector for <code>location.region</code>, and the
|
|
529
|
+
Georeference Extension for placed rasters. A georeferenced layer is
|
|
530
|
+
manifest-only (the legacy format cannot express ground control points); see
|
|
531
|
+
<a href="./iiif.html#geo-referenced-layers">docs/storymap-as-iiif-manifest.md</a>.</li>
|
|
239
532
|
<li>The editor, staging/backend infrastructure, AWS/GitHub hosting scripts and the
|
|
240
533
|
Python authoring server are gone — this is a viewer-only library.</li>
|
|
241
534
|
</ul>
|
|
242
|
-
<h2>Events (unchanged)</h2>
|
|
243
|
-
<p><code>change</code> (with <code>current_slide</code
|
|
244
|
-
<code>
|
|
535
|
+
<h2>Events (unchanged, plus two new ones)</h2>
|
|
536
|
+
<p><code>change</code> (with <code>current_slide</code>, and now also <code>current_id</code> — the slide's
|
|
537
|
+
<code>uniqueid</code>, for deep-linking), <code>loaded</code>, <code>title</code>, <code>dataloaded</code>,
|
|
538
|
+
<code>fontLoaded</code>, plus the listener map in the constructor — all work as before.
|
|
539
|
+
<code>markerAdded</code>/<code>markerRemoved</code> still fire on the map object, and <code>imageready</code>
|
|
540
|
+
is new (see above).</p>
|
|
541
|
+
<p>Two additions for IIIF tours: <code>await storymap.loadAnnotations()</code> fetches a
|
|
542
|
+
manifest's externally referenced annotation pages and appends them as stops,
|
|
543
|
+
then fires <code>annotationsloaded</code> with <code>{ stops, searchService, failed }</code>. A
|
|
544
|
+
slide's stable identity is available as <code>storymap.getSlideId(index)</code>, which
|
|
545
|
+
is what the <code>#slide-N</code> hash and the <code>iiif-content</code> deep link resolve
|
|
546
|
+
through.</p>
|
|
245
547
|
|
|
246
548
|
</main>
|
|
247
549
|
|
package/dist/docs/readme.html
CHANGED
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
<li><a class="button" href="./readme.html">README</a></li>
|
|
37
37
|
<li><a class="button" href="./migration.html">Migration guide</a></li>
|
|
38
38
|
<li><a class="button" href="./iiif.html">IIIF docs</a></li>
|
|
39
|
+
<li><a class="button" href="./authoring.html">Authoring</a></li>
|
|
39
40
|
<li><a class="button" href="./api/index.html">API docs</a></li>
|
|
40
41
|
<li><a class="button" href="../index.html#help">Help</a></li>
|
|
41
42
|
</ul>
|
|
@@ -54,7 +55,9 @@ affiliated with, or supported by Northwestern University Knight Lab.</p>
|
|
|
54
55
|
files (or IIIF Presentation manifests) with TypeScript + Vite + OpenLayers.
|
|
55
56
|
There is no authoring tool — create your storymap JSON by hand or with your
|
|
56
57
|
own code, and see <code>docs/</code> for the migration notes from the original
|
|
57
|
-
Knight Lab release
|
|
58
|
+
Knight Lab release. The library also exports <code>storymapToManifest()</code>, which
|
|
59
|
+
produces a IIIF manifest from a storymap document (<code>npm run convert:iiif</code>
|
|
60
|
+
does the same from the command line; see <code>docs/storymap-as-iiif-manifest.md</code>).</p>
|
|
58
61
|
<h2>Development</h2>
|
|
59
62
|
<p>See docs/DEVELOPMENT.md to get setup for local development of StoryMapJS. This
|
|
60
63
|
repository is the viewer library only (TypeScript + Vite + OpenLayers);
|
|
@@ -74,6 +77,13 @@ value of the storymap's <code>language</code> option must match the file nam
|
|
|
74
77
|
<h2>Map Options</h2>
|
|
75
78
|
<p>To disable connecting lines on maps set <code>map_as_image: true</code> in the storymap
|
|
76
79
|
options (the default <code>false</code> renders cartography).</p>
|
|
80
|
+
<p><code>storymap.map</code> is the raw OpenLayers map, typed with the re-exported <code>ol</code>
|
|
81
|
+
types, and <code>getBaseLayer()</code>, <code>getOverlayLayers()</code>, <code>getMinimap()</code>,
|
|
82
|
+
<code>getMarkers()</code> and friends hand out the layers the viewer built. Listen for
|
|
83
|
+
<code>imageready</code> to run code against the real imagery, and call
|
|
84
|
+
<code>storymap.dispose()</code> when the embedding view goes away — see
|
|
85
|
+
<a href="./migration.html#reaching-the-map-layers-and-markers">docs/migration-from-knightlab.md</a>
|
|
86
|
+
for the full surface.</p>
|
|
77
87
|
<p>The menubar buttons can be disabled individually:</p>
|
|
78
88
|
<pre><code>show_overview: false, // map overview button
|
|
79
89
|
show_back_to_start: false, // back to the beginning button
|
|
@@ -115,7 +125,8 @@ map_type: "https://tiles.openfreemap.org/styles/bright", // vector st
|
|
|
115
125
|
</code></pre>
|
|
116
126
|
<p>Any value containing <code>{z}</code> renders as a raster XYZ layer; a path without <code>{z}</code>
|
|
117
127
|
that looks like a URL/path renders as a vector style layer; anything else falls
|
|
118
|
-
back to classic OSM raster
|
|
128
|
+
back to classic OSM raster — except <code>"none"</code>, which builds no map at all and
|
|
129
|
+
runs the story as text and media only.</p>
|
|
119
130
|
<h3>Switching the basemap at runtime</h3>
|
|
120
131
|
<p><code>storymap.setMapOption("map_type", next)</code> / <code>setMapOptions({...})</code> rebuilds the
|
|
121
132
|
main tile layer <strong>and</strong> the minimap (<code>ol/control/OverviewMap</code>) layer, keeping
|
|
@@ -138,23 +149,43 @@ images, lists, emphasis and spans in your slides, e.g.:</p>
|
|
|
138
149
|
}
|
|
139
150
|
</code></pre>
|
|
140
151
|
<p>The <code>vco-note</code> span renders as a small grey note, like the built-in credits.</p>
|
|
141
|
-
<p><strong>Caution:</strong> the text is
|
|
142
|
-
|
|
152
|
+
<p><strong>Caution:</strong> the text is sanitized, but sanitizing is a mitigation rather
|
|
153
|
+
than a guarantee. Prose and media formatting survive (<code>class</code>, <code>alt</code>, <code>width</code>,
|
|
154
|
+
table attributes, and so on), scripts and other executable tags are dropped
|
|
155
|
+
with their contents, event-handler attributes are stripped, every URL
|
|
156
|
+
attribute is checked to be <code>http(s)</code>, and <code><iframe></code> embeds are rebuilt into
|
|
157
|
+
a sandboxed, <code>no-referrer</code> element. <code>style</code>, <code>id</code> and <code>name</code> are <em>not</em> allowed,
|
|
158
|
+
and a link's <code>target</code> is always forced to <code>_blank</code>. The same sanitizer covers
|
|
159
|
+
media credit, media caption, the navigation headline and the map attribution
|
|
160
|
+
line. Still: only load storymaps from sources you trust.</p>
|
|
143
161
|
<h2>GDPR consent for external services</h2>
|
|
144
162
|
<p>Set the <code>consent_required</code> option to <code>true</code> to ask for permission before
|
|
145
163
|
anything is loaded from external services (media embeds such as YouTube,
|
|
146
|
-
Twitter or SoundCloud, map tiles, and external font
|
|
164
|
+
Twitter or SoundCloud, slide narration audio, map tiles, and external font
|
|
165
|
+
CSS):</p>
|
|
147
166
|
<pre><code>{
|
|
148
167
|
"consent_required": true,
|
|
149
168
|
...
|
|
150
169
|
}
|
|
151
170
|
</code></pre>
|
|
152
171
|
<p>Each service asks with an Allow/Deny panel; answering one panel resolves every
|
|
153
|
-
pending panel of the same service.
|
|
154
|
-
cookie, the panel is skipped entirely. Denied services show a placeholder
|
|
172
|
+
pending panel of the same service. Denied services show a placeholder
|
|
155
173
|
instead of the media, and the map renders without tiles until they are
|
|
156
|
-
allowed
|
|
157
|
-
|
|
174
|
+
allowed.</p>
|
|
175
|
+
<p>Before the story loads, one dialog lists every external service it uses (map
|
|
176
|
+
tiles, media services including slide narration, external fonts) with three
|
|
177
|
+
choices: <strong>Allow all</strong>, <strong>Decline all</strong>, or a decision per service. A story
|
|
178
|
+
with no map (<code>map_type: "none"</code>) has no tile row to answer. The dialog is
|
|
179
|
+
skipped once every service has a stored decision; per-service panels still
|
|
180
|
+
appear for services discovered later (e.g. a preloaded slide).</p>
|
|
181
|
+
<p>Decisions are stored in <code>localStorage</code> under <code>storymapjs-consent</code> and have no
|
|
182
|
+
expiry — clearing site data asks again.</p>
|
|
183
|
+
<p>The consent labels are <strong>not</strong> fully translated. <code>src/language/locale/en.json</code>
|
|
184
|
+
defines every string; 28 bundled locales fall back to English for the keys
|
|
185
|
+
they lack — most are missing one, a handful are missing around ten (the
|
|
186
|
+
per-service consent prompts and the fullscreen button labels). Run
|
|
187
|
+
<code>npm run check:locales</code> to see the current state — it reports the gap per
|
|
188
|
+
locale and is expected to be runnable without failing.</p>
|
|
158
189
|
<h2>Troubleshooting</h2>
|
|
159
190
|
<p>If a storymap fails to render, open the browser console: the viewer logs
|
|
160
191
|
fetch and validation errors (e.g. "could not load storymap data from ...").
|
package/dist/embed/index.html
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
|
8
8
|
<meta name="mobile-web-app-capable" content="yes">
|
|
9
9
|
<meta name="apple-touch-fullscreen" content="yes">
|
|
10
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0
|
|
10
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
11
11
|
<link rel="stylesheet" href="../css/storymap.css">
|
|
12
12
|
<style>
|
|
13
13
|
html, body {
|
|
@@ -16,6 +16,64 @@
|
|
|
16
16
|
padding: 0;
|
|
17
17
|
margin: 0;
|
|
18
18
|
}
|
|
19
|
+
#storymap-embed {
|
|
20
|
+
width: 100%;
|
|
21
|
+
height: 100%;
|
|
22
|
+
}
|
|
23
|
+
.storymap-url-prompt {
|
|
24
|
+
display: flex;
|
|
25
|
+
align-items: center;
|
|
26
|
+
justify-content: center;
|
|
27
|
+
width: 100%;
|
|
28
|
+
height: 100%;
|
|
29
|
+
padding: 20px;
|
|
30
|
+
box-sizing: border-box;
|
|
31
|
+
background-color: #fff;
|
|
32
|
+
color: #333;
|
|
33
|
+
font-family: sans-serif;
|
|
34
|
+
}
|
|
35
|
+
.storymap-url-card {
|
|
36
|
+
width: 100%;
|
|
37
|
+
max-width: 480px;
|
|
38
|
+
text-align: left;
|
|
39
|
+
}
|
|
40
|
+
.storymap-url-card h1 {
|
|
41
|
+
font-size: 1.25rem;
|
|
42
|
+
margin: 0 0 8px;
|
|
43
|
+
}
|
|
44
|
+
.storymap-url-card p {
|
|
45
|
+
margin: 0 0 12px;
|
|
46
|
+
}
|
|
47
|
+
.storymap-url-card label {
|
|
48
|
+
display: block;
|
|
49
|
+
margin-bottom: 6px;
|
|
50
|
+
font-weight: bold;
|
|
51
|
+
}
|
|
52
|
+
.storymap-url-row {
|
|
53
|
+
display: flex;
|
|
54
|
+
gap: 8px;
|
|
55
|
+
}
|
|
56
|
+
.storymap-url-card input {
|
|
57
|
+
flex: 1;
|
|
58
|
+
min-width: 0;
|
|
59
|
+
padding: 8px 10px;
|
|
60
|
+
font-size: 1rem;
|
|
61
|
+
border: 1px solid #999;
|
|
62
|
+
border-radius: 4px;
|
|
63
|
+
}
|
|
64
|
+
.storymap-url-card button {
|
|
65
|
+
padding: 8px 16px;
|
|
66
|
+
font-size: 1rem;
|
|
67
|
+
border: 1px solid #333;
|
|
68
|
+
border-radius: 4px;
|
|
69
|
+
background-color: #333;
|
|
70
|
+
color: #fff;
|
|
71
|
+
cursor: pointer;
|
|
72
|
+
}
|
|
73
|
+
.storymap-url-error {
|
|
74
|
+
margin-top: 8px;
|
|
75
|
+
color: #a00;
|
|
76
|
+
}
|
|
19
77
|
</style>
|
|
20
78
|
</head>
|
|
21
79
|
|
|
@@ -39,6 +97,12 @@
|
|
|
39
97
|
const getStartSlide = () =>
|
|
40
98
|
urlParams.has("start_at_slide") ? parseInt(urlParams.get("start_at_slide"), 10) : 0;
|
|
41
99
|
|
|
100
|
+
// slide duration in milliseconds; missing or invalid values disable autoplay
|
|
101
|
+
const getAutoplay = () => {
|
|
102
|
+
const value = parseInt(urlParams.get("autoplay"), 10);
|
|
103
|
+
return Number.isFinite(value) && value > 0 ? value : 0;
|
|
104
|
+
};
|
|
105
|
+
|
|
42
106
|
const onStoryMapTitle = (e) => {
|
|
43
107
|
document.title = "StoryMapJS: " + e.title;
|
|
44
108
|
};
|
|
@@ -47,7 +111,7 @@
|
|
|
47
111
|
if (!data || !data.storymap) {
|
|
48
112
|
return;
|
|
49
113
|
}
|
|
50
|
-
const options = { start_at_slide: getStartSlide() };
|
|
114
|
+
const options = { start_at_slide: getStartSlide(), autoplay: getAutoplay() };
|
|
51
115
|
// font theme loading is handled by the library (data.font_css / stock:default)
|
|
52
116
|
storymap = new StoryMap("storymap-embed", data, options, {
|
|
53
117
|
title: onStoryMapTitle,
|
|
@@ -71,10 +135,71 @@
|
|
|
71
135
|
document.getElementById("storymap-embed").append(el);
|
|
72
136
|
};
|
|
73
137
|
|
|
138
|
+
const showUrlPrompt = (message) => {
|
|
139
|
+
const container = document.getElementById("storymap-embed");
|
|
140
|
+
container.innerHTML = "";
|
|
141
|
+
const el = document.createElement("div");
|
|
142
|
+
el.className = "storymap-url-prompt";
|
|
143
|
+
const card = document.createElement("div");
|
|
144
|
+
card.className = "storymap-url-card";
|
|
145
|
+
const heading = document.createElement("h1");
|
|
146
|
+
heading.textContent = "Open a StoryMap";
|
|
147
|
+
const hint = document.createElement("p");
|
|
148
|
+
hint.textContent =
|
|
149
|
+
message || "Enter the URL of a storymap.json file to view it here.";
|
|
150
|
+
const form = document.createElement("form");
|
|
151
|
+
form.id = "storymap-url-form";
|
|
152
|
+
const label = document.createElement("label");
|
|
153
|
+
label.setAttribute("for", "storymap-url-input");
|
|
154
|
+
label.textContent = "Storymap JSON URL";
|
|
155
|
+
const row = document.createElement("div");
|
|
156
|
+
row.className = "storymap-url-row";
|
|
157
|
+
const input = document.createElement("input");
|
|
158
|
+
input.id = "storymap-url-input";
|
|
159
|
+
input.name = "url";
|
|
160
|
+
// type="text" (not "url") so relative storymap paths like
|
|
161
|
+
// "examples/katrina.json" pass native form validation; validity is
|
|
162
|
+
// checked via new URL(value, siteRoot) on submit instead.
|
|
163
|
+
input.type = "text";
|
|
164
|
+
input.inputMode = "url";
|
|
165
|
+
input.required = true;
|
|
166
|
+
input.placeholder = "https://example.com/storymap.json";
|
|
167
|
+
input.autocomplete = "off";
|
|
168
|
+
input.spellcheck = false;
|
|
169
|
+
const button = document.createElement("button");
|
|
170
|
+
button.type = "submit";
|
|
171
|
+
button.textContent = "Open storymap";
|
|
172
|
+
const error = document.createElement("p");
|
|
173
|
+
error.id = "storymap-url-error";
|
|
174
|
+
error.className = "storymap-url-error";
|
|
175
|
+
error.hidden = true;
|
|
176
|
+
row.append(input, button);
|
|
177
|
+
form.append(label, row, error);
|
|
178
|
+
card.append(heading, hint, form);
|
|
179
|
+
el.append(card);
|
|
180
|
+
container.append(el);
|
|
181
|
+
form.addEventListener("submit", (e) => {
|
|
182
|
+
e.preventDefault();
|
|
183
|
+
const value = input.value.trim();
|
|
184
|
+
if (!value) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
try {
|
|
188
|
+
// validate + resolve like the viewer fetch below (supports
|
|
189
|
+
// relative, root-relative and absolute URLs)
|
|
190
|
+
new URL(value, siteRoot);
|
|
191
|
+
} catch {
|
|
192
|
+
error.textContent = "Please enter a valid URL to a storymap.json file.";
|
|
193
|
+
error.hidden = false;
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
urlParams.set("url", value);
|
|
197
|
+
window.location.search = urlParams.toString();
|
|
198
|
+
});
|
|
199
|
+
};
|
|
200
|
+
|
|
74
201
|
if (!urlParam) {
|
|
75
|
-
|
|
76
|
-
"No storymap url given. Append ?url=<storymap.json> to the embed url.",
|
|
77
|
-
);
|
|
202
|
+
showUrlPrompt();
|
|
78
203
|
} else {
|
|
79
204
|
fetch(new URL(urlParam, siteRoot).href)
|
|
80
205
|
.then((response) => {
|