@projektemacher/storymapjs 0.10.7 → 0.10.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG +350 -19
- package/README.md +43 -9
- package/dist/assets/demo-DBpeF31K.js +1 -0
- package/dist/assets/harness-Cr0rYpvt.js +1 -0
- package/dist/assets/harness-multi-CYHgI0a9.js +1 -0
- package/dist/assets/harness-support-Do7sIp2j.js +1 -0
- package/dist/assets/index-wHPqGrBS.js +1 -0
- package/dist/assets/main-DXalctuR.js +17 -0
- package/dist/context.json +12 -9
- package/dist/css/fonts/files/amatic-sc-cyrillic-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/amatic-sc-cyrillic-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/amatic-sc-hebrew-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/amatic-sc-hebrew-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/amatic-sc-vietnamese-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/amatic-sc-vietnamese-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-100-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-100-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-200-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-200-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-300-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-300-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-500-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-500-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-600-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-600-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-800-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-800-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-900-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-900-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-100-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-100-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-200-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-200-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-300-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-300-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-500-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-500-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-600-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-600-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-800-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-800-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-900-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-900-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-ext-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-cyrillic-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-100-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-100-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-200-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-200-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-300-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-300-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-500-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-500-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-600-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-600-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-800-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-800-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-900-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-900-normal.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/bitter-vietnamese-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-arabic-200-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-arabic-300-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-arabic-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-arabic-500-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-arabic-600-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-arabic-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-arabic-800-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-arabic-900-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-200-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-300-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-500-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-600-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-800-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-900-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-ext-200-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-ext-300-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-ext-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-ext-500-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-ext-600-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-ext-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-ext-800-normal.woff2 +0 -0
- package/dist/css/fonts/files/cairo-latin-ext-900-normal.woff2 +0 -0
- package/dist/css/fonts/files/dancing-script-vietnamese-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/eb-garamond-cyrillic-ext-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/eb-garamond-cyrillic-ext-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/eb-garamond-cyrillic-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/eb-garamond-cyrillic-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/eb-garamond-greek-ext-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/eb-garamond-greek-ext-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/eb-garamond-greek-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/eb-garamond-greek-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/eb-garamond-vietnamese-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/eb-garamond-vietnamese-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-cyrillic-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-cyrillic-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-cyrillic-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-cyrillic-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-cyrillic-ext-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-cyrillic-ext-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-cyrillic-ext-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-cyrillic-ext-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-greek-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-greek-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-greek-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-greek-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-greek-ext-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-greek-ext-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-greek-ext-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-greek-ext-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-vietnamese-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-vietnamese-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-vietnamese-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/gentium-book-plus-vietnamese-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/old-standard-tt-cyrillic-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/old-standard-tt-cyrillic-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/old-standard-tt-cyrillic-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/old-standard-tt-cyrillic-ext-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/old-standard-tt-cyrillic-ext-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/old-standard-tt-cyrillic-ext-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/old-standard-tt-vietnamese-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/old-standard-tt-vietnamese-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/old-standard-tt-vietnamese-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/open-sans-cyrillic-ext-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/open-sans-cyrillic-ext-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/open-sans-cyrillic-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/open-sans-cyrillic-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/open-sans-greek-ext-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/open-sans-greek-ext-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/open-sans-greek-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/open-sans-greek-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/open-sans-hebrew-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/open-sans-hebrew-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/open-sans-vietnamese-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/open-sans-vietnamese-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-cyrillic-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-cyrillic-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-sc-cyrillic-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-sc-cyrillic-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-sc-cyrillic-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-sc-cyrillic-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-sc-cyrillic-900-italic.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-sc-cyrillic-900-normal.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-sc-vietnamese-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-sc-vietnamese-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-sc-vietnamese-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-sc-vietnamese-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-sc-vietnamese-900-italic.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-sc-vietnamese-900-normal.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-vietnamese-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/playfair-display-vietnamese-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/pt-sans-cyrillic-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/pt-sans-cyrillic-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/pt-sans-cyrillic-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/pt-sans-cyrillic-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/pt-sans-cyrillic-ext-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/pt-sans-cyrillic-ext-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/pt-sans-cyrillic-ext-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/pt-sans-cyrillic-ext-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/pt-sans-narrow-cyrillic-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/pt-sans-narrow-cyrillic-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/pt-sans-narrow-cyrillic-ext-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/pt-sans-narrow-cyrillic-ext-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/pt-serif-cyrillic-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/pt-serif-cyrillic-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/pt-serif-cyrillic-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/pt-serif-cyrillic-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/pt-serif-cyrillic-ext-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/pt-serif-cyrillic-ext-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/pt-serif-cyrillic-ext-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/pt-serif-cyrillic-ext-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/raleway-cyrillic-ext-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/raleway-cyrillic-ext-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/raleway-cyrillic-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/raleway-cyrillic-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/raleway-vietnamese-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/raleway-vietnamese-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/roboto-slab-cyrillic-ext-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/roboto-slab-cyrillic-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/roboto-slab-greek-ext-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/roboto-slab-greek-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/roboto-slab-vietnamese-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-300-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-300-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-500-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-500-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-ext-300-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-ext-300-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-ext-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-ext-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-ext-500-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-ext-500-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-ext-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-cyrillic-ext-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-300-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-300-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-500-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-500-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-ext-300-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-ext-300-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-ext-400-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-ext-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-ext-500-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-ext-500-normal.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-ext-700-italic.woff2 +0 -0
- package/dist/css/fonts/files/ubuntu-greek-ext-700-normal.woff2 +0 -0
- package/dist/css/fonts/files/unica-one-vietnamese-400-normal.woff2 +0 -0
- package/dist/css/fonts/files/vollkorn-cyrillic-ext-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/vollkorn-cyrillic-ext-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/vollkorn-cyrillic-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/vollkorn-cyrillic-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/vollkorn-greek-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/vollkorn-greek-wght-normal.woff2 +0 -0
- package/dist/css/fonts/files/vollkorn-vietnamese-wght-italic.woff2 +0 -0
- package/dist/css/fonts/files/vollkorn-vietnamese-wght-normal.woff2 +0 -0
- package/dist/css/fonts/font.abril-droidsans.css +3 -0
- package/dist/css/fonts/font.amatic-andika.css +57 -0
- package/dist/css/fonts/font.bitter-raleway.css +111 -0
- package/dist/css/fonts/font.cairo.css +312 -0
- package/dist/css/fonts/font.clicker-garamond.css +93 -0
- package/dist/css/fonts/font.dancing-ledger.css +12 -0
- package/dist/css/fonts/font.default.css +183 -0
- package/dist/css/fonts/font.fjalla-average.css +3 -0
- package/dist/css/fonts/font.georgia-helvetica.css +3 -0
- package/dist/css/fonts/font.knightlab.css +642 -0
- package/dist/css/fonts/font.lustria-lato.css +3 -0
- package/dist/css/fonts/font.medula-lato.css +3 -0
- package/dist/css/fonts/font.oldstandard.css +84 -0
- package/dist/css/fonts/font.opensans-gentiumbook.css +183 -0
- package/dist/css/fonts/font.playfair-faunaone.css +39 -0
- package/dist/css/fonts/font.playfair.css +147 -0
- package/dist/css/fonts/font.pt.css +183 -0
- package/dist/css/fonts/font.roboto-megrim.css +3 -0
- package/dist/css/fonts/font.rufina-sintony.css +3 -0
- package/dist/css/fonts/font.ubuntu.css +291 -0
- package/dist/css/fonts/font.unicaone-vollkorn.css +84 -0
- package/dist/css/storymap.css +1 -1
- package/dist/demo.html +2 -2
- package/dist/docs/api/.nojekyll +1 -0
- package/dist/docs/api/assets/custom.css +47 -0
- package/dist/docs/api/assets/hierarchy.js +1 -0
- package/dist/docs/api/assets/highlight.css +57 -0
- package/dist/docs/api/assets/icons.js +18 -0
- package/dist/docs/api/assets/icons.svg +1 -0
- package/dist/docs/api/assets/main.js +60 -0
- package/dist/docs/api/assets/navigation.js +1 -0
- package/dist/docs/api/assets/search.js +1 -0
- package/dist/docs/api/assets/style.css +1648 -0
- package/dist/docs/api/classes/StoryMap.html +1604 -0
- package/dist/docs/api/functions/MediaType.html +51 -0
- package/dist/docs/api/functions/isPresentation3Collection.html +47 -0
- package/dist/docs/api/functions/isPresentation3Manifest.html +53 -0
- package/dist/docs/api/functions/loadCSS.html +63 -0
- package/dist/docs/api/functions/manifestToStorymapData.html +49 -0
- package/dist/docs/api/functions/setLanguage.html +54 -0
- package/dist/docs/api/functions/storymapToManifest.html +57 -0
- package/dist/docs/api/functions/validateStorymap.html +53 -0
- package/dist/docs/api/functions/validateStorymapAndReport.html +54 -0
- package/dist/docs/api/hierarchy.html +28 -0
- package/dist/docs/api/index.html +197 -0
- package/dist/docs/api/interfaces/AnimationHandle.html +60 -0
- package/dist/docs/api/interfaces/ImagereadyPayload.html +71 -0
- package/dist/docs/api/interfaces/LanguageEntry.html +102 -0
- package/dist/docs/api/interfaces/LatLngLiteral.html +73 -0
- package/dist/docs/api/interfaces/LoadOptions.html +59 -0
- package/dist/docs/api/interfaces/OlLayer.html +1400 -0
- package/dist/docs/api/interfaces/OlMap.html +1656 -0
- package/dist/docs/api/interfaces/OlProjection.html +332 -0
- package/dist/docs/api/interfaces/OlSource.html +784 -0
- package/dist/docs/api/interfaces/OlTileLayer.html +1497 -0
- package/dist/docs/api/interfaces/OlVectorLayer.html +1559 -0
- package/dist/docs/api/interfaces/OlView.html +1958 -0
- package/dist/docs/api/interfaces/StorymapData.html +71 -0
- package/dist/docs/api/interfaces/StorymapDataWrapper.html +60 -0
- package/dist/docs/api/interfaces/StorymapDocument.html +68 -0
- package/dist/docs/api/interfaces/StorymapError.html +63 -0
- package/dist/docs/api/interfaces/StorymapGeoreference.html +93 -0
- package/dist/docs/api/interfaces/StorymapGeoreferenceBody.html +74 -0
- package/dist/docs/api/interfaces/StorymapGroundControlPoint.html +69 -0
- package/dist/docs/api/interfaces/StorymapLanguageMap.html +57 -0
- package/dist/docs/api/interfaces/StorymapManifest.html +118 -0
- package/dist/docs/api/interfaces/StorymapManifestAnnotation.html +105 -0
- package/dist/docs/api/interfaces/StorymapManifestBackground.html +81 -0
- package/dist/docs/api/interfaces/StorymapManifestCanvas.html +140 -0
- package/dist/docs/api/interfaces/StorymapManifestContentResource.html +97 -0
- package/dist/docs/api/interfaces/StorymapManifestFeatureCollection.html +82 -0
- package/dist/docs/api/interfaces/StorymapManifestGeoreferencing.html +87 -0
- package/dist/docs/api/interfaces/StorymapManifestImageService.html +69 -0
- package/dist/docs/api/interfaces/StorymapManifestRange.html +75 -0
- package/dist/docs/api/interfaces/StorymapManifestService.html +77 -0
- package/dist/docs/api/interfaces/StorymapManifestSpecificResource.html +69 -0
- package/dist/docs/api/interfaces/StorymapManifestStatement.html +63 -0
- package/dist/docs/api/interfaces/StorymapMapOptions.html +92 -0
- package/dist/docs/api/interfaces/StorymapOptions.html +532 -0
- package/dist/docs/api/interfaces/StorymapOverlayLayer.html +126 -0
- package/dist/docs/api/interfaces/StorymapSlide.html +132 -0
- package/dist/docs/api/interfaces/StorymapSlideBackground.html +72 -0
- package/dist/docs/api/interfaces/StorymapSlideLocation.html +117 -0
- package/dist/docs/api/interfaces/StorymapSlideMarker.html +104 -0
- package/dist/docs/api/interfaces/StorymapSlideMedia.html +110 -0
- package/dist/docs/api/interfaces/StorymapSlideNarration.html +65 -0
- package/dist/docs/api/interfaces/StorymapSlideText.html +72 -0
- package/dist/docs/api/interfaces/StorymapTilejson.html +105 -0
- package/dist/docs/api/media/es.json +31 -0
- package/dist/docs/api/media/migration-from-knightlab.md +359 -0
- package/dist/docs/api/modules.html +50 -0
- package/dist/docs/api/types/ContentState.html +70 -0
- package/dist/docs/api/types/ImagereadyKind.html +34 -0
- package/dist/docs/api/types/MediaTypeMatch.html +78 -0
- package/dist/docs/api/types/TileSourceFactory.html +53 -0
- package/dist/docs/authoring.html +293 -0
- package/dist/docs/iiif.html +617 -62
- package/dist/docs/migration.html +313 -11
- package/dist/docs/readme.html +40 -9
- package/dist/embed/index.html +1 -1
- package/dist/examples/issue-242-nonlatin.json +55 -0
- package/dist/examples/issue-305-start-at-slide-data.json +96 -0
- package/dist/examples/issue-358-iframe.json +57 -0
- package/dist/examples/issue-iiif-geo.json +32 -0
- package/dist/examples/issue-image-alt.json +23 -0
- package/dist/examples/issue-image-region.json +42 -0
- package/dist/examples/issue-image-srcset.json +24 -0
- package/dist/examples/map-area-overlays.json +68 -0
- package/dist/examples/no-map.json +44 -0
- package/dist/examples-iiif/annotated-image.json +188 -0
- package/dist/examples-iiif/bob-boilen.json +11 -5
- package/dist/examples-iiif/courbet.json +9 -6
- package/dist/examples-iiif/empty.json +8 -4
- package/dist/examples-iiif/flickr-drewvigal.json +248 -24
- package/dist/examples-iiif/flickr-zach.wise.json +8 -4
- package/dist/examples-iiif/georeferenced-layer-unsupported.json +153 -0
- package/dist/examples-iiif/georeferenced-layer.json +318 -0
- package/dist/examples-iiif/iiif-wellcome.json +9 -6
- package/dist/examples-iiif/instagram-chenpamela.json +381 -36
- package/dist/examples-iiif/instagram_brentfoster.json +429 -40
- package/dist/examples-iiif/instagram_couch.json +261 -26
- package/dist/examples-iiif/instagram_joegermuska.json +441 -41
- package/dist/examples-iiif/instagram_matteich.json +261 -26
- package/dist/examples-iiif/instagram_mirandamulligan.json +261 -26
- package/dist/examples-iiif/instagram_raymondmccrea.json +261 -26
- package/dist/examples-iiif/instagram_test.json +261 -26
- package/dist/examples-iiif/issue-134-no-lines.json +9 -5
- package/dist/examples-iiif/issue-177-color-vars.json +9 -5
- package/dist/examples-iiif/issue-211-rtl.json +9 -5
- package/dist/examples-iiif/issue-242-nonlatin.json +239 -0
- package/dist/examples-iiif/issue-272-facebook.json +9 -5
- package/dist/examples-iiif/issue-305-start-at-slide-data.json +305 -0
- package/dist/examples-iiif/issue-305-start-at-slide.json +9 -5
- package/dist/examples-iiif/issue-341-distance.json +9 -5
- package/dist/examples-iiif/issue-358-iframe.json +190 -0
- package/dist/examples-iiif/issue-360-juxtapose.json +22 -7
- package/dist/examples-iiif/issue-368-null-fields.json +9 -5
- package/dist/examples-iiif/issue-375-code-lists.json +9 -5
- package/dist/examples-iiif/issue-381-dateline.json +9 -5
- package/dist/examples-iiif/issue-405-custom-icon.json +203 -0
- package/dist/examples-iiif/issue-425-many-slides.json +9 -5
- package/dist/examples-iiif/issue-428-background.json +20 -8
- package/dist/examples-iiif/issue-435-googlemaps.json +9 -5
- package/dist/examples-iiif/issue-437-documentcloud.json +22 -7
- package/dist/examples-iiif/issue-451-webp.json +9 -5
- package/dist/examples-iiif/issue-455-audio.json +9 -5
- package/dist/examples-iiif/issue-480-shorts.json +9 -5
- package/dist/examples-iiif/issue-506-marker-sync.json +9 -5
- package/dist/examples-iiif/issue-iiif-geo.json +200 -0
- package/dist/examples-iiif/issue-image-alt.json +90 -0
- package/dist/examples-iiif/issue-image-region.json +203 -0
- package/dist/examples-iiif/issue-image-srcset.json +87 -0
- package/dist/examples-iiif/jansteen.json +9 -6
- package/dist/examples-iiif/katrina.json +197 -41
- package/dist/examples-iiif/map-area-overlays.json +289 -0
- package/dist/examples-iiif/marktwain.json +255 -58
- package/dist/examples-iiif/no-map.json +148 -0
- package/dist/examples-iiif/population.json +440 -76
- package/dist/examples-iiif/president.json +456 -83
- package/dist/examples-iiif/scroll-hint.json +190 -0
- package/dist/examples-iiif/seurat.json +113 -22
- package/dist/examples-iiif/zoomify-clamp.json +153 -0
- package/dist/harness-multi.html +17 -0
- package/dist/harness.html +3 -2
- package/dist/index.html +16 -10
- package/dist/js/storymap.d.ts +1439 -114
- package/dist/js/storymap.js +24654 -21936
- package/dist/js/storymap.js.map +1 -1
- package/dist/navplace-properties.json +40 -0
- package/docs/migration-from-knightlab.md +229 -9
- package/docs/storymap-as-iiif-manifest.md +559 -135
- package/package.json +11 -8
- package/schema/storymap.schema.json +431 -78
- package/src/animation/easings.ts +8 -1
- package/src/animation/tween.ts +186 -0
- package/src/core/Browser.ts +6 -5
- package/src/core/Load.ts +54 -2
- package/src/core/Util.ts +255 -193
- package/src/core/mixins.ts +24 -7
- package/src/core/viewers.ts +94 -0
- package/src/dom/DomEvent.ts +27 -8
- package/src/globals.d.ts +8 -0
- package/src/language/Language.ts +199 -25
- package/src/language/locale/.expected-gaps.json +86 -0
- package/src/language/locale/be.json +15 -2
- package/src/language/locale/bg.json +15 -2
- package/src/language/locale/cs.json +15 -2
- package/src/language/locale/de.json +12 -1
- package/src/language/locale/el.json +15 -2
- package/src/language/locale/en.json +6 -2
- package/src/language/locale/es.json +15 -2
- package/src/language/locale/et.json +5 -1
- package/src/language/locale/fr.json +15 -2
- package/src/language/locale/he.json +16 -3
- package/src/language/locale/hu.json +15 -2
- package/src/language/locale/is.json +5 -1
- package/src/language/locale/it.json +15 -2
- package/src/language/locale/jp.json +15 -2
- package/src/language/locale/ko.json +15 -2
- package/src/language/locale/nl.json +15 -2
- package/src/language/locale/nn.json +5 -1
- package/src/language/locale/no.json +15 -2
- package/src/language/locale/pl.json +15 -2
- package/src/language/locale/pt.json +15 -2
- package/src/language/locale/ru.json +15 -2
- package/src/language/locale/sk.json +15 -2
- package/src/language/locale/sr.json +5 -1
- package/src/language/locale/sv.json +15 -2
- package/src/language/locale/tr.json +15 -2
- package/src/language/locale/uk.json +15 -2
- package/src/language/locale/ur.json +5 -1
- package/src/language/locale/zh-cn.json +15 -2
- package/src/language/locale/zh-tw.json +15 -2
- package/src/main.ts +92 -0
- package/src/map/Map.ts +183 -106
- package/src/map/MapMarker.ts +28 -5
- package/src/map/georeference.ts +325 -0
- package/src/map/openlayers/Map.OpenLayers.ts +850 -237
- package/src/map/openlayers/MapMarker.OpenLayers.ts +248 -24
- package/src/map/openlayers/zoomifyTiles.ts +1 -4
- package/src/media/EmbedUtil.ts +308 -24
- package/src/media/Media.ts +243 -55
- package/src/media/embedId.ts +104 -0
- package/src/media/types/Audio.ts +9 -82
- package/src/media/types/Blockquote.ts +2 -3
- package/src/media/types/DailyMotion.ts +5 -10
- package/src/media/types/DocumentCloud.ts +6 -35
- package/src/media/types/Facebook.ts +3 -4
- package/src/media/types/Flickr.ts +9 -9
- package/src/media/types/GoogleDoc.ts +3 -4
- package/src/media/types/HtmlMedia.ts +167 -0
- package/src/media/types/IFrame.ts +3 -4
- package/src/media/types/Image.ts +72 -6
- package/src/media/types/Juxtapose.ts +14 -5
- package/src/media/types/SoundCloud.ts +28 -6
- package/src/media/types/Text.ts +19 -13
- package/src/media/types/Twitter.ts +27 -14
- package/src/media/types/Video.ts +9 -79
- package/src/media/types/Vimeo.ts +10 -10
- package/src/media/types/Website.ts +23 -13
- package/src/media/types/Wikipedia.ts +18 -8
- package/src/media/types/YouTube.ts +71 -39
- package/src/scss/Typography.scss +1 -3
- package/src/scss/VCO.StoryMap.Dark.scss +18 -6
- package/src/scss/VCO.StoryMap.scss +37 -6
- package/src/scss/Variables.Dark.scss +3 -2
- package/src/scss/Variables.scss +3 -2
- package/src/scss/core/Mixins.scss +5 -63
- package/src/scss/fonts/font.amatic-andika.scss +3 -0
- package/src/scss/fonts/font.bitter-raleway.scss +6 -0
- package/src/scss/fonts/font.cairo.scss +79 -0
- package/src/scss/fonts/font.clicker-garamond.scss +5 -0
- package/src/scss/fonts/font.dancing-ledger.scss +1 -0
- package/src/scss/fonts/font.knightlab.scss +14 -0
- package/src/scss/fonts/font.oldstandard.scss +6 -0
- package/src/scss/fonts/font.opensans-gentiumbook.scss +5 -0
- package/src/scss/fonts/font.playfair-faunaone.scss +2 -0
- package/src/scss/fonts/font.playfair.scss +4 -0
- package/src/scss/fonts/font.pt.scss +6 -0
- package/src/scss/fonts/font.ubuntu.scss +4 -0
- package/src/scss/fonts/font.unicaone-vollkorn.scss +5 -0
- package/src/scss/map/VCO.MapMarker.scss +98 -3
- package/src/scss/media/VCO.Media.scss +7 -10
- package/src/scss/media/types/VCO.Media.Text.scss +8 -0
- package/src/scss/media/types/VCO.Media.Wikipedia.scss +2 -1
- package/src/scss/slider/VCO.Slide.scss +13 -3
- package/src/scss/slider/VCO.SlideNav.scss +11 -17
- package/src/scss/slider/VCO.StorySlider.scss +4 -2
- package/src/scss/ui/VCO.Consent.scss +44 -0
- package/src/scss/ui/VCO.MenuBar.Button.scss +8 -0
- package/src/scss/ui/VCO.Message.scss +2 -5
- package/src/site/site.ts +2 -1
- package/src/slider/Slide.ts +121 -27
- package/src/slider/SlideNav.ts +39 -5
- package/src/slider/StorySlider.ts +153 -42
- package/src/storymap/Consent.ts +407 -82
- package/src/storymap/StoryMap.ts +1192 -182
- package/src/storymap/content-state.ts +185 -0
- package/src/storymap/iiif.ts +1526 -68
- package/src/storymap/to-iiif.ts +921 -0
- package/src/storymap/validate.ts +80 -7
- package/src/types.ts +223 -26
- package/src/ui/MenuBar.ts +98 -45
- package/src/ui/Message.ts +9 -0
- package/src/ui/Swipable.ts +145 -78
- package/dist/assets/demo-D6cTmzn6.js +0 -1
- package/dist/assets/harness-BPFlzutp.js +0 -1
- package/dist/assets/index-DDsPBPZA.js +0 -1
- package/dist/assets/main-Y-MYUSJ4.js +0 -17
- package/src/animation/morpheus.d.ts +0 -41
- package/src/scss/media/types/VCO.Media.Instagram.scss +0 -7
- package/src/scss/media/types/VCO.Media.Profile.scss +0 -5
- package/src/ui/Draggable.ts +0 -374
|
@@ -56,6 +56,14 @@
|
|
|
56
56
|
// font-weight:normal;
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
|
+
|
|
60
|
+
// Inline images embedded in slide text HTML (e.g. sketches, maps):
|
|
61
|
+
// constrain to the text column, keep aspect ratio with explicit
|
|
62
|
+
// width/height attributes
|
|
63
|
+
img {
|
|
64
|
+
max-width: 100%;
|
|
65
|
+
height: auto;
|
|
66
|
+
}
|
|
59
67
|
}
|
|
60
68
|
|
|
61
69
|
// When the background is an image
|
|
@@ -61,8 +61,7 @@
|
|
|
61
61
|
z-index: -1;
|
|
62
62
|
overflow: hidden;
|
|
63
63
|
display: none;
|
|
64
|
-
|
|
65
|
-
@include opacity(50);
|
|
64
|
+
opacity: 0.5;
|
|
66
65
|
}
|
|
67
66
|
|
|
68
67
|
.vco-slide-scrollable-container {
|
|
@@ -348,6 +347,16 @@
|
|
|
348
347
|
text-align: right;
|
|
349
348
|
}
|
|
350
349
|
|
|
350
|
+
/* Extra iframe media in slide text (issue #358)
|
|
351
|
+
================================================== */
|
|
352
|
+
.vco-text-content {
|
|
353
|
+
iframe {
|
|
354
|
+
width: 100%;
|
|
355
|
+
min-height: 280px;
|
|
356
|
+
border: 0;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
351
360
|
/* Text Background
|
|
352
361
|
================================================== */
|
|
353
362
|
.vco-slide.vco-text-background {
|
|
@@ -356,7 +365,8 @@
|
|
|
356
365
|
padding: 20px;
|
|
357
366
|
|
|
358
367
|
@include background-color-opacity(0, 0, 0, 60);
|
|
359
|
-
|
|
368
|
+
|
|
369
|
+
border-radius: 7px;
|
|
360
370
|
|
|
361
371
|
h2 {
|
|
362
372
|
margin-top: 5px;
|
|
@@ -29,8 +29,7 @@
|
|
|
29
29
|
word-break: break-all;
|
|
30
30
|
overflow-wrap: anywhere;
|
|
31
31
|
hyphens: auto;
|
|
32
|
-
|
|
33
|
-
@include opacity(15);
|
|
32
|
+
opacity: 0.15;
|
|
34
33
|
}
|
|
35
34
|
|
|
36
35
|
.vco-slidenav-title {
|
|
@@ -93,7 +92,7 @@
|
|
|
93
92
|
&:hover {
|
|
94
93
|
.vco-slidenav-title,
|
|
95
94
|
.vco-slidenav-description {
|
|
96
|
-
|
|
95
|
+
opacity: 1;
|
|
97
96
|
}
|
|
98
97
|
}
|
|
99
98
|
}
|
|
@@ -149,8 +148,7 @@
|
|
|
149
148
|
&:hover {
|
|
150
149
|
.vco-slidenav-icon {
|
|
151
150
|
margin-left: 32 - 20px;
|
|
152
|
-
|
|
153
|
-
@include opacity(100);
|
|
151
|
+
opacity: 1;
|
|
154
152
|
}
|
|
155
153
|
}
|
|
156
154
|
}
|
|
@@ -159,8 +157,7 @@
|
|
|
159
157
|
&:hover {
|
|
160
158
|
.vco-slidenav-icon {
|
|
161
159
|
margin-left: -4px;
|
|
162
|
-
|
|
163
|
-
@include opacity(100);
|
|
160
|
+
opacity: 1;
|
|
164
161
|
}
|
|
165
162
|
}
|
|
166
163
|
}
|
|
@@ -194,7 +191,7 @@
|
|
|
194
191
|
}
|
|
195
192
|
|
|
196
193
|
.vco-slidenav-icon {
|
|
197
|
-
|
|
194
|
+
opacity: 0.33;
|
|
198
195
|
}
|
|
199
196
|
}
|
|
200
197
|
}
|
|
@@ -208,16 +205,14 @@
|
|
|
208
205
|
|
|
209
206
|
.vco-slidenav-icon {
|
|
210
207
|
margin-left: 32 - 24px;
|
|
211
|
-
|
|
212
|
-
@include opacity(100);
|
|
208
|
+
opacity: 1;
|
|
213
209
|
}
|
|
214
210
|
}
|
|
215
211
|
|
|
216
212
|
&:active {
|
|
217
213
|
.vco-slidenav-icon {
|
|
218
214
|
margin-left: 0;
|
|
219
|
-
|
|
220
|
-
@include opacity(100);
|
|
215
|
+
opacity: 1;
|
|
221
216
|
}
|
|
222
217
|
}
|
|
223
218
|
}
|
|
@@ -227,14 +222,13 @@
|
|
|
227
222
|
.vco-slidenav-icon {
|
|
228
223
|
// margin-left: 0px;
|
|
229
224
|
margin-left: 100 - 20px;
|
|
230
|
-
|
|
231
|
-
@include opacity(100);
|
|
225
|
+
opacity: 1;
|
|
232
226
|
}
|
|
233
227
|
}
|
|
234
228
|
|
|
235
229
|
&:active {
|
|
236
230
|
.vco-slidenav-icon {
|
|
237
|
-
|
|
231
|
+
opacity: 1;
|
|
238
232
|
}
|
|
239
233
|
}
|
|
240
234
|
}
|
|
@@ -247,13 +241,13 @@
|
|
|
247
241
|
.vco-slidenav-previous {
|
|
248
242
|
&:hover {
|
|
249
243
|
.vco-slidenav-icon {
|
|
250
|
-
|
|
244
|
+
opacity: 0.33;
|
|
251
245
|
}
|
|
252
246
|
}
|
|
253
247
|
|
|
254
248
|
&:active {
|
|
255
249
|
.vco-slidenav-icon {
|
|
256
|
-
|
|
250
|
+
opacity: 1;
|
|
257
251
|
}
|
|
258
252
|
}
|
|
259
253
|
}
|
|
@@ -10,8 +10,10 @@
|
|
|
10
10
|
height: 100%;
|
|
11
11
|
overflow: hidden;
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
// horizontal drags belong to the slider; vertical panning passes
|
|
14
|
+
// through to the page (mobile navigation, #288)
|
|
15
|
+
touch-action: pan-y;
|
|
16
|
+
user-select: none;
|
|
15
17
|
position: relative;
|
|
16
18
|
|
|
17
19
|
img,
|
|
@@ -75,3 +75,47 @@
|
|
|
75
75
|
font-size: $base-font-size;
|
|
76
76
|
text-align: center;
|
|
77
77
|
}
|
|
78
|
+
|
|
79
|
+
/* Start-of-story consent: allow all / individually / decline all
|
|
80
|
+
================================================= */
|
|
81
|
+
.vco-consent-start {
|
|
82
|
+
.vco-consent-services {
|
|
83
|
+
display: flex;
|
|
84
|
+
flex-direction: column;
|
|
85
|
+
gap: 6px;
|
|
86
|
+
max-width: 420px;
|
|
87
|
+
width: 100%;
|
|
88
|
+
margin-top: 6px;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.vco-consent-service {
|
|
92
|
+
display: flex;
|
|
93
|
+
align-items: center;
|
|
94
|
+
justify-content: space-between;
|
|
95
|
+
gap: 12px;
|
|
96
|
+
padding: 4px 0;
|
|
97
|
+
border-bottom: 1px solid rgb(0 0 0 / 10%);
|
|
98
|
+
|
|
99
|
+
&:last-child {
|
|
100
|
+
border-bottom: none;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.vco-consent-service-label {
|
|
105
|
+
color: $color-dark;
|
|
106
|
+
text-align: left;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.vco-consent-buttons {
|
|
110
|
+
margin-top: 0;
|
|
111
|
+
|
|
112
|
+
button:disabled {
|
|
113
|
+
opacity: 0.5;
|
|
114
|
+
cursor: default;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.vco-consent-start-actions {
|
|
119
|
+
margin-top: 12px;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
@@ -31,6 +31,14 @@
|
|
|
31
31
|
background: $color-theme;
|
|
32
32
|
color: $color-background;
|
|
33
33
|
}
|
|
34
|
+
|
|
35
|
+
// keyboard focus parity with the hover state
|
|
36
|
+
&:focus-visible {
|
|
37
|
+
background: $color-theme;
|
|
38
|
+
color: $color-background;
|
|
39
|
+
outline: 2px solid $color-theme;
|
|
40
|
+
outline-offset: -2px;
|
|
41
|
+
}
|
|
34
42
|
}
|
|
35
43
|
|
|
36
44
|
.vco-mobile {
|
|
@@ -43,9 +43,7 @@
|
|
|
43
43
|
height: 30px;
|
|
44
44
|
background-color: #666;
|
|
45
45
|
vertical-align: middle;
|
|
46
|
-
|
|
47
|
-
@include box-shadow(inset 0 1px 2px rgba(255, 255, 255, 0.1));
|
|
48
|
-
|
|
46
|
+
box-shadow: inset 0 1px 2px rgb(255 255 255 / 10%);
|
|
49
47
|
margin-left: auto;
|
|
50
48
|
margin-right: auto;
|
|
51
49
|
|
|
@@ -96,8 +94,7 @@
|
|
|
96
94
|
color: #333;
|
|
97
95
|
padding: 10px;
|
|
98
96
|
margin-top: 10px;
|
|
99
|
-
|
|
100
|
-
@include border-radius(7px);
|
|
97
|
+
border-radius: 7px;
|
|
101
98
|
}
|
|
102
99
|
}
|
|
103
100
|
}
|
package/src/site/site.ts
CHANGED
|
@@ -18,7 +18,8 @@ const EXAMPLES: ExampleEntry[] = [
|
|
|
18
18
|
{ id: "katrina", title: "Hurricane Katrina", kind: "Map" },
|
|
19
19
|
{ id: "population", title: "US Population Shifts", kind: "Map" },
|
|
20
20
|
{ id: "marktwain", title: "Mark Twain's Travels", kind: "Map" },
|
|
21
|
-
|
|
21
|
+
// a legacy Zoomify pyramid, not IIIF — labelled accordingly
|
|
22
|
+
{ id: "seurat", title: "A Sunday on La Grande Jatte", kind: "Large image (legacy)" },
|
|
22
23
|
{ id: "iiif-wellcome", title: "Wellcome Collection (IIIF)", kind: "IIIF" },
|
|
23
24
|
{ id: "president", title: "A Month in the Life of President Obama", kind: "Map" },
|
|
24
25
|
// remote showcase examples, rendered by the embed player
|
package/src/slider/Slide.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { DomEvent } from "../dom/DomEvent";
|
|
|
4
4
|
import Dom from "../dom/Dom";
|
|
5
5
|
import { easeInSpline } from "../animation/easings";
|
|
6
6
|
import MediaType from "../media/MediaType";
|
|
7
|
+
import { sanitizeSlideText } from "../media/EmbedUtil";
|
|
7
8
|
import Text from "../media/types/Text";
|
|
8
9
|
import { Browser } from "../core/Browser";
|
|
9
10
|
import { MediaTypeMatch, StorymapSlide, StorymapSlideBackground } from "../types";
|
|
@@ -27,6 +28,19 @@ interface SlideOptions {
|
|
|
27
28
|
[key: string]: unknown;
|
|
28
29
|
}
|
|
29
30
|
|
|
31
|
+
/**
|
|
32
|
+
* The slide's element cache. `call_to_action` is null until the slide is told
|
|
33
|
+
* to show one (`addCallToAction`).
|
|
34
|
+
*/
|
|
35
|
+
type SlideElements = {
|
|
36
|
+
container: HTMLElement;
|
|
37
|
+
scroll_container: HTMLElement;
|
|
38
|
+
background: HTMLElement;
|
|
39
|
+
content_container: HTMLElement;
|
|
40
|
+
content: HTMLElement;
|
|
41
|
+
call_to_action: HTMLElement | null;
|
|
42
|
+
};
|
|
43
|
+
|
|
30
44
|
/* Media instance surface as used by Slide; instances are created
|
|
31
45
|
dynamically via the matched MediaTypeMatch.cls constructor. Media is
|
|
32
46
|
Evented — "media_loaded" signals that content heights may have changed. */
|
|
@@ -35,8 +49,10 @@ interface MediaInstance {
|
|
|
35
49
|
loadMedia: () => void;
|
|
36
50
|
stopMedia: () => void;
|
|
37
51
|
updateDisplay: (w?: number, h?: number, l?: string) => void;
|
|
52
|
+
dispose?: () => void;
|
|
38
53
|
on?: EventedInstance["on"];
|
|
39
|
-
|
|
54
|
+
off?: EventedInstance["off"];
|
|
55
|
+
_state?: { loaded?: boolean; eager?: boolean };
|
|
40
56
|
}
|
|
41
57
|
|
|
42
58
|
interface SlideHas {
|
|
@@ -52,13 +68,17 @@ interface SlideHas {
|
|
|
52
68
|
}
|
|
53
69
|
|
|
54
70
|
class SlideBase {
|
|
55
|
-
|
|
71
|
+
/** `call_to_action` is only created when the slide shows one. */
|
|
72
|
+
declare "_el": SlideElements;
|
|
56
73
|
declare "_media": MediaInstance | null;
|
|
57
74
|
declare "_mediaclass": unknown;
|
|
58
75
|
declare "_text": Text;
|
|
59
76
|
declare "_state": { loaded: boolean };
|
|
60
77
|
declare "_scroll_hint": HTMLElement | null;
|
|
61
78
|
declare "_scroll_hint_dismissed": boolean;
|
|
79
|
+
declare "_onSlideScrollBound": EventListener;
|
|
80
|
+
/** Every `media_ended` handler registered via `onMediaEnded`, kept so `dispose()` can remove them. */
|
|
81
|
+
declare "_media_ended_fns": (() => void)[];
|
|
62
82
|
declare "has": SlideHas;
|
|
63
83
|
declare "title": string;
|
|
64
84
|
declare "data": StorymapSlide;
|
|
@@ -107,7 +127,7 @@ class SlideBase {
|
|
|
107
127
|
},
|
|
108
128
|
};
|
|
109
129
|
|
|
110
|
-
this.has.title = title_slide;
|
|
130
|
+
this.has.title = title_slide === true;
|
|
111
131
|
|
|
112
132
|
this.title = "";
|
|
113
133
|
|
|
@@ -139,7 +159,8 @@ class SlideBase {
|
|
|
139
159
|
// Animation Object
|
|
140
160
|
this.animator = {};
|
|
141
161
|
|
|
142
|
-
|
|
162
|
+
this._onSlideScrollBound = null as unknown as EventListener;
|
|
163
|
+
this._media_ended_fns = [];
|
|
143
164
|
mergeData(this.options, options);
|
|
144
165
|
mergeData(this.data, data);
|
|
145
166
|
|
|
@@ -154,6 +175,37 @@ class SlideBase {
|
|
|
154
175
|
|
|
155
176
|
hide() {}
|
|
156
177
|
|
|
178
|
+
/**
|
|
179
|
+
* Release the slide's listeners, media and DOM. Called by
|
|
180
|
+
* `StorySlider.dispose()`; the slide must not be used afterwards.
|
|
181
|
+
*/
|
|
182
|
+
dispose() {
|
|
183
|
+
// the scroll listener was registered against a bound copy, so this
|
|
184
|
+
// only works because that reference was kept
|
|
185
|
+
if (this._onSlideScrollBound) {
|
|
186
|
+
this._el.container?.removeEventListener("scroll", this._onSlideScrollBound);
|
|
187
|
+
this._onSlideScrollBound = null as unknown as EventListener;
|
|
188
|
+
}
|
|
189
|
+
if (this._el.call_to_action) {
|
|
190
|
+
DomEvent.removeListener(this._el.call_to_action, "click", this._onCallToAction, this);
|
|
191
|
+
}
|
|
192
|
+
if (this._scroll_hint) {
|
|
193
|
+
DomEvent.removeListener(this._scroll_hint, "click", this._onScrollHintClick, this);
|
|
194
|
+
this._scroll_hint = null;
|
|
195
|
+
}
|
|
196
|
+
this._el.container?.getAnimations?.().forEach((a) => a.cancel());
|
|
197
|
+
// the media_ended handlers registered via onMediaEnded() live on the
|
|
198
|
+
// media object, which outlives this slide once nulled — remove them
|
|
199
|
+
// here or a disposed slide's advance closure fires on a later ended
|
|
200
|
+
for (const fn of this._media_ended_fns) {
|
|
201
|
+
this._media?.off?.("media_ended", fn);
|
|
202
|
+
}
|
|
203
|
+
this._media_ended_fns = [];
|
|
204
|
+
this._media?.dispose?.();
|
|
205
|
+
this._media = null;
|
|
206
|
+
this._el.container?.remove();
|
|
207
|
+
}
|
|
208
|
+
|
|
157
209
|
setActive(is_active: boolean) {
|
|
158
210
|
this.active = is_active;
|
|
159
211
|
|
|
@@ -164,7 +216,14 @@ class SlideBase {
|
|
|
164
216
|
// the hint may re-appear on a revisit if the content still
|
|
165
217
|
// overflows (the dismissed flag resets per activation)
|
|
166
218
|
this._scroll_hint_dismissed = false;
|
|
219
|
+
// the active slide's images load eagerly: media built after this
|
|
220
|
+
// point (the 1200ms load timer) honors the flag, already-built
|
|
221
|
+
// images are upgraded below
|
|
222
|
+
if (this._media?._state) {
|
|
223
|
+
this._media._state.eager = true;
|
|
224
|
+
}
|
|
167
225
|
this.loadMedia();
|
|
226
|
+
this._eagerLoadImages();
|
|
168
227
|
this._updateScrollHint();
|
|
169
228
|
} else {
|
|
170
229
|
this.stopMedia();
|
|
@@ -183,6 +242,17 @@ class SlideBase {
|
|
|
183
242
|
}
|
|
184
243
|
}
|
|
185
244
|
|
|
245
|
+
/* Perf: preloaded slide images are `lazy`; make them `eager` the
|
|
246
|
+
moment the slide becomes active so navigation never waits on a
|
|
247
|
+
deferred fetch (loading starts now, not on intersection). */
|
|
248
|
+
_eagerLoadImages() {
|
|
249
|
+
this._el.container
|
|
250
|
+
.querySelectorAll<HTMLImageElement>("img.vco-media-image")
|
|
251
|
+
.forEach((img) => {
|
|
252
|
+
img.loading = "eager";
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
|
|
186
256
|
stopMedia() {
|
|
187
257
|
if (this._media && this._state.loaded) {
|
|
188
258
|
try {
|
|
@@ -211,6 +281,28 @@ class SlideBase {
|
|
|
211
281
|
return this.has.background;
|
|
212
282
|
}
|
|
213
283
|
|
|
284
|
+
/**
|
|
285
|
+
* True when this slide's media is a timed, playable one (audio or video).
|
|
286
|
+
* `autoplay_media` waits for such a slide's media to end instead of using
|
|
287
|
+
* its timer; everything else keeps the timer.
|
|
288
|
+
*/
|
|
289
|
+
hasPlayableMedia(): boolean {
|
|
290
|
+
const kind = this.options.media_type as string | undefined;
|
|
291
|
+
return kind === "audio" || kind === "video";
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Call `fn` when this slide's media finishes playing. A slide with no
|
|
296
|
+
* media — or media that cannot end — never calls it, which is why
|
|
297
|
+
* `autoplay_media` keeps its timer as a fallback rather than waiting on
|
|
298
|
+
* an event that may not arrive.
|
|
299
|
+
*/
|
|
300
|
+
onMediaEnded(fn: () => void): void {
|
|
301
|
+
if (!this.hasPlayableMedia() || !this._media?.on) return;
|
|
302
|
+
this._media.on("media_ended", fn);
|
|
303
|
+
this._media_ended_fns.push(fn);
|
|
304
|
+
}
|
|
305
|
+
|
|
214
306
|
scrollToTop() {
|
|
215
307
|
this._el.container.scrollTop = 0;
|
|
216
308
|
}
|
|
@@ -235,11 +327,7 @@ class SlideBase {
|
|
|
235
327
|
return;
|
|
236
328
|
}
|
|
237
329
|
if (!this._scroll_hint) {
|
|
238
|
-
this._scroll_hint = Dom.create(
|
|
239
|
-
"div",
|
|
240
|
-
"vco-slide-scroll-hint",
|
|
241
|
-
el,
|
|
242
|
-
);
|
|
330
|
+
this._scroll_hint = Dom.create("div", "vco-slide-scroll-hint", el);
|
|
243
331
|
this._scroll_hint.innerHTML = "<span class='vco-icon-arrow-down'></span>";
|
|
244
332
|
DomEvent.addListener(this._scroll_hint, "click", this._onScrollHintClick, this);
|
|
245
333
|
}
|
|
@@ -276,8 +364,12 @@ class SlideBase {
|
|
|
276
364
|
"vco-slide-calltoaction",
|
|
277
365
|
this._el.content_container,
|
|
278
366
|
);
|
|
279
|
-
|
|
280
|
-
|
|
367
|
+
// The text comes from `call_to_action_text` in the storymap JSON, so
|
|
368
|
+
// it goes through the sanitizer like every other author string
|
|
369
|
+
// instead of being concatenated into markup.
|
|
370
|
+
const button_text = Dom.create("span", "vco-slide-calltoaction-button-text");
|
|
371
|
+
button_text.appendChild(sanitizeSlideText(str));
|
|
372
|
+
this._el.call_to_action?.appendChild(button_text);
|
|
281
373
|
DomEvent.addListener(this._el.call_to_action, "click", this._onCallToAction, this);
|
|
282
374
|
}
|
|
283
375
|
|
|
@@ -308,8 +400,11 @@ class SlideBase {
|
|
|
308
400
|
this._el.content = Dom.create("div", "vco-slide-content", this._el.content_container);
|
|
309
401
|
this._el.background = Dom.create("div", "vco-slide-background", this._el.container);
|
|
310
402
|
// first scroll of any kind hides the scroll hint (passive: the
|
|
311
|
-
// listener never prevents default)
|
|
312
|
-
|
|
403
|
+
// listener never prevents default). The reference is kept because
|
|
404
|
+
// `.bind()` returns a new function each call, so the listener could
|
|
405
|
+
// otherwise never be removed again.
|
|
406
|
+
this._onSlideScrollBound = this._onSlideScroll.bind(this);
|
|
407
|
+
this._el.container.addEventListener("scroll", this._onSlideScrollBound, {
|
|
313
408
|
passive: true,
|
|
314
409
|
});
|
|
315
410
|
// Style Slide Background
|
|
@@ -341,46 +436,45 @@ class SlideBase {
|
|
|
341
436
|
if (this.data.text && this.data.text.text) {
|
|
342
437
|
this.has.text = true;
|
|
343
438
|
}
|
|
344
|
-
if (this.data.text
|
|
439
|
+
if (this.data.text?.headline) {
|
|
345
440
|
this.has.headline = true;
|
|
346
441
|
this.title = this.data.text.headline;
|
|
347
442
|
}
|
|
348
443
|
|
|
349
444
|
// Create Media
|
|
350
|
-
|
|
445
|
+
const slide_media = this.data.media;
|
|
446
|
+
if (this.has.media && slide_media) {
|
|
351
447
|
// Determine the media type
|
|
352
|
-
|
|
353
|
-
this.options.media_name =
|
|
354
|
-
this.options.media_type =
|
|
448
|
+
slide_media.mediatype = MediaType(slide_media) as MediaTypeMatch;
|
|
449
|
+
this.options.media_name = slide_media.mediatype.name;
|
|
450
|
+
this.options.media_type = slide_media.mediatype.type;
|
|
355
451
|
|
|
356
452
|
// Create a media object using the matched class name
|
|
357
|
-
this._media = new
|
|
358
|
-
this.data.media,
|
|
359
|
-
this.options,
|
|
360
|
-
) as MediaInstance;
|
|
453
|
+
this._media = new slide_media.mediatype.cls(slide_media, this.options) as MediaInstance;
|
|
361
454
|
// loaded media changes the content height — the scroll hint
|
|
362
455
|
// may appear or disappear
|
|
363
456
|
this._media.on?.("media_loaded", () => this._updateScrollHint());
|
|
364
457
|
}
|
|
365
458
|
|
|
366
459
|
// Create Text
|
|
367
|
-
if (this.has.text || this.has.headline) {
|
|
460
|
+
if ((this.has.text || this.has.headline) && this.data.text) {
|
|
368
461
|
this._text = new Text(this.data.text, {
|
|
369
462
|
title: this.has.title,
|
|
370
463
|
text_align: this.options.text_align as string | undefined,
|
|
371
464
|
});
|
|
372
465
|
}
|
|
373
466
|
|
|
374
|
-
// Add to DOM
|
|
467
|
+
// Add to DOM. Each branch has just established the members it uses
|
|
468
|
+
// (has.media -> _media, has.text/headline -> _text).
|
|
375
469
|
if (!this.has.text && !this.has.headline && this.has.media) {
|
|
376
470
|
this._el.container.className += " vco-slide-media-only";
|
|
377
|
-
this._media
|
|
471
|
+
this._media?.addTo(this._el.content);
|
|
378
472
|
} else if (this.has.headline && this.has.media && !this.has.text) {
|
|
379
473
|
this._el.container.className += " vco-slide-media-only";
|
|
380
474
|
this._text.addTo(this._el.content);
|
|
381
|
-
this._media
|
|
475
|
+
this._media?.addTo(this._el.content);
|
|
382
476
|
} else if (this.has.text && this.has.media) {
|
|
383
|
-
this._media
|
|
477
|
+
this._media?.addTo(this._el.content);
|
|
384
478
|
this._text.addTo(this._el.content);
|
|
385
479
|
} else if (this.has.text || this.has.headline) {
|
|
386
480
|
this._el.container.className += " vco-slide-text-only";
|
package/src/slider/SlideNav.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { mergeData } from "../core/Util";
|
|
2
2
|
import { DomMixed, Evented, type EventedInstance } from "../core/mixins";
|
|
3
3
|
import Dom from "../dom/Dom";
|
|
4
|
-
import Animate from "
|
|
4
|
+
import Animate from "../animation/tween";
|
|
5
5
|
import { DomEvent } from "../dom/DomEvent";
|
|
6
6
|
import { Browser } from "../core/Browser";
|
|
7
|
+
import { sanitizeSlideText } from "../media/EmbedUtil";
|
|
7
8
|
import { AnimateOptions, AnimationHandle } from "../types";
|
|
8
9
|
/* SlideNav
|
|
9
10
|
Navigation for Slideshows
|
|
@@ -169,18 +170,27 @@ class SlideNavBase {
|
|
|
169
170
|
// update data
|
|
170
171
|
this.data = mergeData(this.data, d);
|
|
171
172
|
|
|
172
|
-
// Title
|
|
173
|
+
// Title and date are the slide's own headline/date — sanitized like
|
|
174
|
+
// the slide body. They were the reachable twin of an already-sanitized
|
|
175
|
+
// field: a hostile headline executed as soon as a nav arrow rendered.
|
|
173
176
|
if (this.data.title !== "") {
|
|
174
|
-
this._el.title.
|
|
177
|
+
this._el.title.replaceChildren(sanitizeSlideText(this.data.title));
|
|
175
178
|
}
|
|
176
179
|
|
|
177
180
|
// Date
|
|
178
|
-
if (this.data.date
|
|
179
|
-
this._el.description.
|
|
181
|
+
if (this.data.date) {
|
|
182
|
+
this._el.description.replaceChildren(sanitizeSlideText(this.data.date));
|
|
180
183
|
}
|
|
181
184
|
}
|
|
182
185
|
|
|
183
186
|
_initLayout() {
|
|
187
|
+
// Accessibility (issue #385 wave): the nav container is operable by
|
|
188
|
+
// keyboard — focusable, announced as a button, Enter/Space activate
|
|
189
|
+
this._el.container.setAttribute("role", "button");
|
|
190
|
+
this._el.container.setAttribute("tabindex", "0");
|
|
191
|
+
const label = this.options.direction === "next" ? "Next slide" : "Previous slide";
|
|
192
|
+
this._el.container.setAttribute("aria-label", label);
|
|
193
|
+
|
|
184
194
|
// Create Layout
|
|
185
195
|
this._el.content_container = Dom.create(
|
|
186
196
|
"div",
|
|
@@ -188,6 +198,7 @@ class SlideNavBase {
|
|
|
188
198
|
this._el.container,
|
|
189
199
|
);
|
|
190
200
|
this._el.icon = Dom.create("div", "vco-slidenav-icon", this._el.content_container);
|
|
201
|
+
this._el.icon.setAttribute("aria-hidden", "true");
|
|
191
202
|
this._el.title = Dom.create("div", "vco-slidenav-title", this._el.content_container);
|
|
192
203
|
this._el.description = Dom.create(
|
|
193
204
|
"div",
|
|
@@ -202,6 +213,29 @@ class SlideNavBase {
|
|
|
202
213
|
|
|
203
214
|
_initEvents() {
|
|
204
215
|
DomEvent.addListener(this._el.container, "click", this._onMouseClick, this);
|
|
216
|
+
DomEvent.addListener(this._el.container, "keydown", this._onKeyDown, this);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
_onKeyDown(e: Event) {
|
|
220
|
+
const key = (e as KeyboardEvent).key;
|
|
221
|
+
if (key === "Enter" || key === " " || key === "Spacebar") {
|
|
222
|
+
e.preventDefault();
|
|
223
|
+
this._onMouseClick();
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Release the listeners and the position animation. Called by
|
|
229
|
+
* `StorySlider.dispose()`; the nav must not be used afterwards.
|
|
230
|
+
*/
|
|
231
|
+
dispose() {
|
|
232
|
+
if (this.animator_position) {
|
|
233
|
+
this.animator_position.stop();
|
|
234
|
+
this.animator_position = null;
|
|
235
|
+
}
|
|
236
|
+
DomEvent.removeListener(this._el.container, "click", this._onMouseClick, this);
|
|
237
|
+
DomEvent.removeListener(this._el.container, "keydown", this._onKeyDown, this);
|
|
238
|
+
this._el.container.remove();
|
|
205
239
|
}
|
|
206
240
|
}
|
|
207
241
|
|