@projektemacher/storymapjs 0.10.7 → 0.11.0
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 +431 -19
- package/README.md +168 -17
- package/dist/assets/demo-bWnOyfUw.js +1 -0
- package/dist/assets/harness-C3JUv5Ii.js +1 -0
- package/dist/assets/harness-multi-XZNex3tb.js +1 -0
- package/dist/assets/harness-support-CjfZIVeb.js +1 -0
- package/dist/assets/index-wHPqGrBS.js +1 -0
- package/dist/assets/main-DQ32hWBM.js +17 -0
- package/dist/context.json +23 -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 +3 -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 +2112 -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/isSlideshowCollection.html +51 -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/slideshowToStorymapData.html +51 -0
- package/dist/docs/api/functions/slideshowVersion.html +48 -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 +300 -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/MapEvents.html +116 -0
- package/dist/docs/api/interfaces/MapMarkerEvents.html +66 -0
- package/dist/docs/api/interfaces/MarkerEventPayload.html +57 -0
- package/dist/docs/api/interfaces/MediaEvents.html +78 -0
- package/dist/docs/api/interfaces/MenuBarEvents.html +114 -0
- package/dist/docs/api/interfaces/MessageEvents.html +72 -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/SlideBackgroundState.html +66 -0
- package/dist/docs/api/interfaces/SlideEvents.html +78 -0
- package/dist/docs/api/interfaces/SlideNavEvents.html +72 -0
- package/dist/docs/api/interfaces/SlideshowPlayerSettings.html +182 -0
- package/dist/docs/api/interfaces/SlideshowToStorymapResult.html +60 -0
- package/dist/docs/api/interfaces/SlideshowTranslatorOptions.html +65 -0
- package/dist/docs/api/interfaces/SlideshowWarning.html +72 -0
- package/dist/docs/api/interfaces/StoryMapEvents.html +146 -0
- package/dist/docs/api/interfaces/StoryMapMarker.html +763 -0
- package/dist/docs/api/interfaces/StorySliderEvents.html +102 -0
- package/dist/docs/api/interfaces/StorymapBasemap.html +69 -0
- package/dist/docs/api/interfaces/StorymapData.html +77 -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 +137 -0
- package/dist/docs/api/interfaces/StorymapManifestBackground.html +81 -0
- package/dist/docs/api/interfaces/StorymapManifestCanvas.html +188 -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 +734 -0
- package/dist/docs/api/interfaces/StorymapOverlayLayer.html +157 -0
- package/dist/docs/api/interfaces/StorymapSlide.html +186 -0
- package/dist/docs/api/interfaces/StorymapSlideBackground.html +72 -0
- package/dist/docs/api/interfaces/StorymapSlideLocation.html +161 -0
- package/dist/docs/api/interfaces/StorymapSlideMarker.html +103 -0
- package/dist/docs/api/interfaces/StorymapSlideMedia.html +149 -0
- package/dist/docs/api/interfaces/StorymapSlideNarration.html +117 -0
- package/dist/docs/api/interfaces/StorymapSlideText.html +72 -0
- package/dist/docs/api/interfaces/StorymapTilejson.html +105 -0
- package/dist/docs/api/interfaces/SwipableEvents.html +102 -0
- package/dist/docs/api/interfaces/TextEvents.html +66 -0
- package/dist/docs/api/media/es.json +31 -0
- package/dist/docs/api/media/events.md +66 -0
- package/dist/docs/api/media/migration-from-knightlab.md +399 -0
- package/dist/docs/api/media/slideshow.md +109 -0
- package/dist/docs/api/media/storymap-as-iiif-manifest.md +1007 -0
- package/dist/docs/api/modules.html +50 -0
- package/dist/docs/api/types/ContentState.html +70 -0
- package/dist/docs/api/types/FiredEvent.html +43 -0
- package/dist/docs/api/types/ImagereadyKind.html +34 -0
- package/dist/docs/api/types/MediaTypeMatch.html +78 -0
- package/dist/docs/api/types/SwipeDirection.html +36 -0
- package/dist/docs/api/types/TileSourceFactory.html +53 -0
- package/dist/docs/authoring.html +306 -0
- package/dist/docs/events.html +263 -0
- package/dist/docs/iiif.html +738 -69
- package/dist/docs/migration.html +360 -11
- package/dist/docs/readme.html +149 -17
- package/dist/embed/index.html +8 -1
- package/dist/examples/font-css-false.json +33 -0
- 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/layers-control.json +60 -0
- package/dist/examples/map-area-overlays.json +68 -0
- package/dist/examples/map-template-provider.json +36 -0
- package/dist/examples/multi-media.json +71 -0
- package/dist/examples/no-map.json +44 -0
- package/dist/examples-iiif/annotated-image.json +204 -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/font-css-false.json +114 -0
- 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/layers-control.json +226 -0
- package/dist/examples-iiif/map-area-overlays.json +289 -0
- package/dist/examples-iiif/map-template-provider.json +133 -0
- package/dist/examples-iiif/marktwain.json +255 -58
- package/dist/examples-iiif/multi-media.json +237 -0
- 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/examples-slideshow/single.json +79 -0
- package/dist/examples-slideshow/static/pixel.png +0 -0
- package/dist/examples-slideshow/static.json +44 -0
- package/dist/harness-multi.html +17 -0
- package/dist/harness.html +4 -2
- package/dist/index.html +19 -12
- package/dist/js/storymap.d.ts +2669 -307
- package/dist/js/storymap.js +10820 -6196
- package/dist/js/storymap.js.map +1 -1
- package/dist/navplace-properties.json +54 -0
- package/dist/site.css +54 -36
- package/docs/migration-from-knightlab.md +279 -19
- package/docs/storymap-as-iiif-manifest.md +633 -136
- package/package.json +12 -7
- package/schema/storymap.schema.json +733 -80
- 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 +257 -193
- package/src/core/mixins.ts +66 -35
- 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 +206 -25
- package/src/language/locale/.expected-gaps.json +346 -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 +23 -2
- package/src/language/locale/el.json +15 -2
- package/src/language/locale/en.json +17 -3
- 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 +143 -0
- package/src/map/Map.ts +227 -112
- package/src/map/MapMarker.ts +44 -8
- package/src/map/georeference.ts +325 -0
- package/src/map/openlayers/Map.OpenLayers.ts +1601 -263
- package/src/map/openlayers/MapMarker.OpenLayers.ts +348 -24
- package/src/map/openlayers/zoomifyTiles.ts +1 -4
- package/src/map/slideView.ts +149 -0
- package/src/map/types.ts +2 -0
- package/src/media/EmbedUtil.ts +333 -24
- package/src/media/Media.ts +270 -59
- package/src/media/embedId.ts +110 -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 +23 -12
- package/src/media/types/GoogleDoc.ts +3 -4
- package/src/media/types/HtmlMedia.ts +233 -0
- package/src/media/types/IFrame.ts +3 -4
- package/src/media/types/Image.ts +87 -9
- package/src/media/types/Juxtapose.ts +14 -5
- package/src/media/types/SoundCloud.ts +28 -6
- package/src/media/types/Text.ts +46 -21
- package/src/media/types/Twitter.ts +35 -20
- package/src/media/types/Video.ts +9 -79
- package/src/media/types/Vimeo.ts +11 -11
- package/src/media/types/Website.ts +23 -13
- package/src/media/types/Wikipedia.ts +18 -8
- package/src/media/types/YouTube.ts +72 -40
- package/src/scss/Typography.scss +16 -18
- package/src/scss/VCO.StoryMap.scss +208 -12
- package/src/scss/Variables.scss +3 -2
- package/src/scss/core/Mixins.scss +5 -63
- package/src/scss/core/Reset.scss +5 -18
- 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.Map.scss +1 -1
- package/src/scss/map/VCO.MapMarker.scss +114 -8
- package/src/scss/map/openlayers/VCO.Map.OpenLayers.scss +7 -4
- package/src/scss/media/VCO.Media.scss +14 -17
- package/src/scss/media/types/VCO.Media.Blockquote.scss +1 -1
- package/src/scss/media/types/VCO.Media.Text.scss +13 -5
- package/src/scss/media/types/VCO.Media.Twitter.scss +4 -4
- package/src/scss/media/types/VCO.Media.Wikipedia.scss +3 -19
- package/src/scss/site/site.scss +55 -36
- package/src/scss/slider/VCO.Slide.scss +61 -13
- package/src/scss/slider/VCO.SlideNav.scss +34 -24
- package/src/scss/slider/VCO.StorySlider.scss +53 -1
- package/src/scss/snapmap/VCO.SnapMap.scss +3 -3
- package/src/scss/ui/VCO.Consent.scss +63 -13
- package/src/scss/ui/VCO.Layers.scss +119 -0
- package/src/scss/ui/VCO.MenuBar.Button.scss +143 -14
- package/src/scss/ui/VCO.MenuBar.scss +9 -2
- package/src/scss/ui/VCO.Message.scss +16 -5
- package/src/site/site.ts +2 -1
- package/src/slider/Slide.ts +326 -74
- package/src/slider/SlideNav.ts +54 -9
- package/src/slider/StorySlider.ts +352 -60
- package/src/storymap/Consent.ts +429 -82
- package/src/storymap/StoryMap.ts +2163 -340
- package/src/storymap/content-state.ts +180 -0
- package/src/storymap/font-css.ts +72 -0
- package/src/storymap/from-slideshow.ts +785 -0
- package/src/storymap/iiif-shared.ts +228 -0
- package/src/storymap/iiif.ts +1742 -95
- package/src/storymap/to-iiif.ts +1008 -0
- package/src/storymap/validate.ts +80 -7
- package/src/types.ts +591 -29
- package/src/ui/LayersControl.ts +302 -0
- package/src/ui/MenuBar.ts +325 -61
- package/src/ui/Message.ts +44 -2
- package/src/ui/Swipable.ts +170 -85
- 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/VCO.StoryMap.Dark.scss +0 -138
- package/src/scss/Variables.Dark.scss +0 -56
- 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
package/CHANGELOG
CHANGED
|
@@ -1,10 +1,385 @@
|
|
|
1
|
-
|
|
1
|
+
0.11.0 (2026-10-07)
|
|
2
2
|
------------------------
|
|
3
|
-
|
|
3
|
+
Added
|
|
4
|
+
-----
|
|
5
|
+
- Inactive slides are hidden from assistive tech (`aria-hidden` + `inert`
|
|
6
|
+
in `Slide.setActive()`), so screen readers no longer read every
|
|
7
|
+
off-screen slide; preloading (including iframes) is unaffected
|
|
8
|
+
- Keyboard access: map pins are focusable buttons (Enter/Space activates,
|
|
9
|
+
focus returns on popup close), messages dismiss from the keyboard, and a
|
|
10
|
+
skip link jumps to the slide content. Autoplay gains a menubar
|
|
11
|
+
pause/resume toggle; slide text carries its `lang`; consent dialogs are
|
|
12
|
+
labelled dialogues with focus; media errors announce via `role=alert`
|
|
13
|
+
- Reduced motion is honored everywhere it matters: map glides, line draw,
|
|
14
|
+
background fades, nav intro, smooth scroll and the loader freeze, and an
|
|
15
|
+
OS toggle flipped mid-story stops autoplay. Touch targets are 44px,
|
|
16
|
+
muted text meets contrast, and focus rings are visible
|
|
17
|
+
- Programmatic popup cards: `storymap.openMarkerPopup(n)` navigates to the
|
|
18
|
+
stop and opens its card (false and no navigation when disabled, out of
|
|
19
|
+
range, disposed or mapless), plus `closeMarkerPopup(n?)` and
|
|
20
|
+
`isPopupOpen(n)`. The marker itself exposes `openPopup()` /
|
|
21
|
+
`closePopup()` / `togglePopup()` / `isPopupEnabled()` / `popupOpen`,
|
|
22
|
+
and the `StoryMapMarker` type is exported for hosts
|
|
23
|
+
- `popupopen` / `popupclose` (`{ marker_number, current_slide }`) and a
|
|
24
|
+
viewer-level `markerclick` re-fire, so hosts can tell marker clicks apart
|
|
25
|
+
from programmatic navigation
|
|
26
|
+
- `tweetAuthor()` next to `tweetId()`: `Twitter` extracts both through the
|
|
27
|
+
shared helpers instead of its own regex
|
|
28
|
+
- `font_css: false` (or `"none"`) injects no theme stylesheet for
|
|
29
|
+
bundler consumers that import it themselves; the consent dialog lists no
|
|
30
|
+
font service for it, and a failing theme load warns with its URL. The
|
|
31
|
+
IIIF `storymap:fontCss` term round-trips `false`
|
|
32
|
+
- Layer switcher: `show_layers_control: true` adds a menubar disclosure
|
|
33
|
+
button with basemap radios (`basemaps[]`, entry 0 initial unless
|
|
34
|
+
`map_type` says otherwise) and overlay checkboxes (rows track built
|
|
35
|
+
layers, so malformed entries never appear). Overlay `label` (string or
|
|
36
|
+
function), `locked` (checked and disabled) and `control: false` (hidden
|
|
37
|
+
row) annotate entries; cross-projection basemaps are refused with a
|
|
38
|
+
warning. Fires `basemapchange` / `overlaychange`, also on the viewer
|
|
39
|
+
- IIIF narration (V1 of #358): a `motivation: "supplementing"` Sound/Video
|
|
40
|
+
body plays as `slide.narration`, and the writer emits one back. Array
|
|
41
|
+
`motivation` values are honored everywhere — previously an array read as
|
|
42
|
+
"no motivation" and was accepted as the canvas painting, shadowing the
|
|
43
|
+
real media
|
|
44
|
+
- Second visible media slot (V2 of #358): `media_extra` renders further media
|
|
45
|
+
items after the primary one (`media_layout: "stack"`, the default, or
|
|
46
|
+
`"row"` for two side-by-side items); documents without it render
|
|
47
|
+
identically. Extra `painting` annotations read as `media_extra` and are
|
|
48
|
+
written back, so the slot round-trips — only the layout stays viewer-side,
|
|
49
|
+
IIIF has no term for it. Consent, the audio badge and the popup thumbnail
|
|
50
|
+
all see every item
|
|
51
|
+
- Dark theme without a second stylesheet: every widget colour is a
|
|
52
|
+
`--vco-*` custom property (Sass values kept as fallbacks, so the default
|
|
53
|
+
render is unchanged); `theme: "dark"` forces the dark palette, `"light"`
|
|
54
|
+
pins the light one, unset follows `prefers-color-scheme`. The unshippable
|
|
55
|
+
`VCO.StoryMap.Dark.scss` / `Variables.Dark.scss` pair is deleted, the
|
|
56
|
+
dead widget reset is live again, and dark text pairs clear AA. The
|
|
57
|
+
landing page follows the OS scheme too
|
|
58
|
+
- Typed events: every emitter has an `*Events` map (exported from the
|
|
59
|
+
library), so `storymap.on("chnage", …)` is a compile error and handlers
|
|
60
|
+
infer their payload. `fire()` can no longer be handed a `type`/`target`
|
|
61
|
+
in the payload, `off()` removes all matches, and teardowns detach
|
|
62
|
+
their listeners
|
|
63
|
+
- Full XYZ templates naming a known provider are credited to it
|
|
64
|
+
(`tile.openstreetmap.org` and subdomains, `stadiamaps.com`,
|
|
65
|
+
`openmaptiles.org`, `mapbox.com`, `arcgisonline.com`/`esri.com`,
|
|
66
|
+
`carto.com`/`basemaps.cartocdn.com` — subdomains match their parent), in
|
|
67
|
+
both the rendered line and the source attributions. Relative templates
|
|
68
|
+
still render "Map data"
|
|
69
|
+
|
|
70
|
+
Changed
|
|
71
|
+
-------
|
|
72
|
+
- The IIIF reader/writer share `src/storymap/iiif-shared.ts`
|
|
73
|
+
(`LOCATION_PROPERTIES`, JSON guards, bbox and URL checks) instead of
|
|
74
|
+
three copies; the writer's Node CLI import carries an explicit `.ts`
|
|
75
|
+
extension, which type-stripping resolution requires
|
|
76
|
+
- Map attribution comes from one provider-credit table (linked HTML and
|
|
77
|
+
plain text cannot drift apart); font-theme URL helpers live in
|
|
78
|
+
`src/storymap/font-css.ts` (re-exported from `StoryMap`)
|
|
79
|
+
- Error paths log with `console.warn`, prefixed `StoryMapJS:`, instead of
|
|
80
|
+
`console.log`
|
|
81
|
+
|
|
82
|
+
0.10.8 (2026-09-29)
|
|
83
|
+
------------------------
|
|
84
|
+
Code audit: one regression, a set of latent bugs, seven stored-XSS sinks, a
|
|
85
|
+
disabled type check that had been hiding them, and a dependency swap.
|
|
86
|
+
|
|
87
|
+
Added
|
|
88
|
+
-----
|
|
89
|
+
- **`map_type: "none"`: a storymap with no map.** The text and the media are
|
|
90
|
+
the whole story, which the map's unconditional construction used to make
|
|
91
|
+
impossible. No `ol/Map` is built, so there is no tile request to consent to
|
|
92
|
+
and the consent dialog omits its tile row; the overview control is hidden;
|
|
93
|
+
the slider panel takes the full width, since there is no map to fade over;
|
|
94
|
+
and `loaded` fires without waiting for a map that will never load. The
|
|
95
|
+
accessors return their neutral values and the map setters are no-ops.
|
|
96
|
+
`map_type: ""` and an absent key still mean OpenStreetMap, and `map_type:
|
|
97
|
+
null` is normalised to that default instead of throwing out of the
|
|
98
|
+
constructor (the schema already allowed the key to be missing)
|
|
99
|
+
- **`storymapToManifest()` is now a library export**, promoted out of the
|
|
100
|
+
`convert:iiif` script, so one function both writes and reads the IIIF format
|
|
101
|
+
and a host can produce a manifest in the browser. The CLI delegates to it
|
|
102
|
+
(via Node's own type stripping, so no new dependency and no build step), and
|
|
103
|
+
its output is unchanged byte for byte across all 50 fixtures
|
|
104
|
+
- **Annotation-driven tour stops.** A IIIF manifest whose commenting,
|
|
105
|
+
tagging, classifying or describing annotations carry a fragment target
|
|
106
|
+
becomes one slide per annotation, each fitting the region it points at —
|
|
107
|
+
the Storiiies/Micrio shape. `text/plain` bodies become one paragraph per
|
|
108
|
+
block (escaped), `text/html` keeps its markup, and a `Sound` body becomes
|
|
109
|
+
the slide's media. A `PointSelector` becomes a square of 5% of the
|
|
110
|
+
canvas's smaller side, centred and clamped. New `docs/iiif-authoring.md`
|
|
111
|
+
(published as `authoring.html`) and a four-stop example,
|
|
112
|
+
`public/examples-iiif/annotated-image.json`
|
|
113
|
+
- A normalized selector reader: `FragmentSelector`/`ImageApiSelector`
|
|
114
|
+
(`xywh=`, including `xywh=pixel:`), `PointSelector`, `TextQuoteSelector`,
|
|
115
|
+
`TimeState` and `SvgSelector` are all read, one level of `refinedBy` is
|
|
116
|
+
followed, and a string target's `#xywh=` fragment counts. Quote and SVG
|
|
117
|
+
selectors are preserved but not yet resolved or drawn — the guide says so
|
|
118
|
+
- The painting body's standard fields are the only source for the slide
|
|
119
|
+
media record: `body.label` (caption), `body.requiredStatement` /
|
|
120
|
+
`body.provider` (credit), `body.accessibilitySummary` (alt),
|
|
121
|
+
`body.thumbnail` (thumb), and a `TextualBody` with `format: text/vtt`
|
|
122
|
+
(subtitles). The `storymap:mediaCaption` / `mediaCredit` / `mediaAlt`
|
|
123
|
+
extension terms are dropped; a manifest still using them loads, but the
|
|
124
|
+
strings are no longer read
|
|
125
|
+
(subtitles)
|
|
126
|
+
- `media.subtitles`: a WebVTT file rendered as a `<track kind="subtitles">`
|
|
127
|
+
on the audio or video element
|
|
128
|
+
- Per-slide `narration: {url}`, played through one reused audio element
|
|
129
|
+
rather than the slide's media frame, so switching slides cannot leave a
|
|
130
|
+
recording playing. Gated by browser autoplay policy (it starts after the
|
|
131
|
+
first gesture) and by a new `media:narration` consent service, so the GDPR
|
|
132
|
+
mode has no hole for it
|
|
133
|
+
- `autoplay_media`: with autoplay on, a slide whose media is audio or video
|
|
134
|
+
advances when it ends instead of on the millisecond timer. The timer stays
|
|
135
|
+
armed as a fallback, so a media element that never fires `ended` cannot
|
|
136
|
+
stall the story
|
|
137
|
+
- Per-slide `marker: { icon, iconSize, image, label, popup, audioBadge }`,
|
|
138
|
+
with `location.*` kept as the legacy spelling and `marker.*` winning. No
|
|
139
|
+
new `storymap:` term: in a manifest all of it arrives in the `navPlace`
|
|
140
|
+
Feature `properties` bag, which is a GeoJSON foreign-member bag and needs
|
|
141
|
+
no vocabulary registration
|
|
142
|
+
- `marker.popup`: the active marker's card toggles on click, with a sanitized
|
|
143
|
+
headline and excerpt, the media thumb and a real close button. Escape and
|
|
144
|
+
navigating away both close it, and the marker releases it (and its keydown
|
|
145
|
+
listener) in `dispose()`. Inactive markers still navigate on click
|
|
146
|
+
- `marker.audioBadge`: a dot on markers whose slide has narration or audio
|
|
147
|
+
media
|
|
148
|
+
- Browser coverage for the surfaces jsdom cannot reach, and for the changes
|
|
149
|
+
that came with replacing the map engine: `imageready` against a real
|
|
150
|
+
asynchronously-attached IIIF source, `dispose()` proving no tile requests
|
|
151
|
+
happen after teardown, `addTo()`/`removeFrom()` re-measuring a moved map,
|
|
152
|
+
the `isImageSpace()` contract, runtime option and language changes,
|
|
153
|
+
per-viewer consent, `tile_source_factory`, and network-level proof that
|
|
154
|
+
imagery actually reaches the map (the fixture sweep only checked that a
|
|
155
|
+
container existed, so a grey map used to pass everything)
|
|
156
|
+
- `npm run test:e2e:all` runs the whole suite on Chromium, Firefox and WebKit
|
|
157
|
+
(`E2E_ALL_BROWSERS=1`). Chromium-only stays the default, so the main CI job is
|
|
158
|
+
unaffected; a separate, currently non-blocking CI job runs the matrix
|
|
159
|
+
- A typed OpenLayers surface: all OL types (`Map`, `View`, `Layer`,
|
|
160
|
+
`Source`, ...) plus the StoryMapJS extension types are re-exported, so a
|
|
161
|
+
consumer can build and type its own layers without depending on `ol`
|
|
162
|
+
separately. `storymap.map` is the raw `ol/Map` and is now honestly nullable
|
|
163
|
+
(`OlMap | null`) instead of an `{} as Map` placeholder
|
|
164
|
+
- Accessors for everything the viewer kept private:
|
|
165
|
+
`getBaseLayer()`, `getOverlayLayers()`/`getOverlayLayer(i)`,
|
|
166
|
+
`getOverlayCount()`, `setOverlayVisible()`/`setOverlayOpacity()`,
|
|
167
|
+
`getMinimap()`, `getLine()`/`getLineActive()`, `getMarker(n)`/`getMarkers()`
|
|
168
|
+
and `setExtraAttributions()`; underscore internals are no longer needed
|
|
169
|
+
- `tile_source_factory` may return a full `ol/layer/Layer`, not only a source,
|
|
170
|
+
so a custom layer can carry its own opacity, z-index and events. A layer
|
|
171
|
+
without a source (Allmaps' `WarpedMapLayer`) passes through untouched —
|
|
172
|
+
the engine fields are `Layer`-typed and source reads go through a
|
|
173
|
+
capability check instead of assuming a tile source
|
|
174
|
+
- `imageready` event (`{ source, kind, layer }`, now a typed
|
|
175
|
+
`ImagereadyPayload` export with `kind: "iiif" | "zoomify" | "tiles"`)
|
|
176
|
+
fired once an image source is actually ready, and re-fired on the
|
|
177
|
+
storymap: `loaded` can fire before the imagery exists. The zoomify base
|
|
178
|
+
layer never announced itself — only its minimap did — so a host waiting
|
|
179
|
+
on the event hung on legacy stories; it fires now
|
|
180
|
+
- `storymap.dispose()` releases timers, the resize observer, window/document
|
|
181
|
+
listeners, running slide animations, the slider and the OpenLayers map
|
|
182
|
+
- `isImageSpace()` tells an IIIF image presented as a picture of the world
|
|
183
|
+
(`map_as_image`) from a georeferenced IIIF map; the five places that tested
|
|
184
|
+
`map_type === "iiif" && map_as_image` inline now share it
|
|
185
|
+
- The no-op `show()`/`hide()` methods (map and marker) are marked deprecated
|
|
186
|
+
with the reason, and the surviving map/marker methods are documented as
|
|
187
|
+
aliases over the OpenLayers map
|
|
188
|
+
- `marker.createPopup()` is back as a deprecated no-op, so pre-0.10 code that
|
|
189
|
+
calls it keeps working. It never did anything upstream either: the base
|
|
190
|
+
`MapMarker._createPopup` had an empty body and the Leaflet override's body
|
|
191
|
+
was commented out, so the `map_popup` option that called it never had an
|
|
192
|
+
effect
|
|
193
|
+
- `map.addTo(container)` / `map.removeFrom(container)` keep their original
|
|
194
|
+
`DomMixed` behaviour (append/remove the map container, fire
|
|
195
|
+
`added`/`removed`) and are now OpenLayers-aware: `addTo` re-attaches the map
|
|
196
|
+
target and calls `updateSize()` after the move, `removeFrom` untargets the
|
|
197
|
+
map so it does not render into a detached node
|
|
198
|
+
|
|
199
|
+
Fixed
|
|
200
|
+
-----
|
|
201
|
+
- A IIIF `requiredStatement`'s `label` was discarded, so a manifest that labels
|
|
202
|
+
its statement — "Credit", "Rights holder", "Photographer" — showed the bare
|
|
203
|
+
value. The label is now kept ("Attribution: …") where there is one, and an
|
|
204
|
+
unlabelled statement is still the bare value, unchanged
|
|
205
|
+
- An IIIF `Collection` was accepted as a Manifest and its member Manifests were
|
|
206
|
+
read as if they were Canvases, producing text-only slides with no media, no
|
|
207
|
+
locations and no warning. A Collection is now detected and reported by name
|
|
208
|
+
with its members instead
|
|
209
|
+
- A IIIF manifest's canonical ids were dropped, so a stop could not be
|
|
210
|
+
addressed by its own id even though the viewer already resolves deep links by
|
|
211
|
+
`uniqueid`. Canvas `id` (falling back to the Manifest's) now lands on the
|
|
212
|
+
slide, and an annotation-driven stop gets `<canvasId>#<index>` so it is
|
|
213
|
+
addressable without colliding with the canvas it annotates
|
|
214
|
+
- A slide with body text and no headline rendered a literal "headline" as an
|
|
215
|
+
`<h2>`: `Text`'s constructor seeded its data with the placeholder strings
|
|
216
|
+
"headline"/"text", which `mergeData` only overwrites when the key is
|
|
217
|
+
present. The empty strings its render guards already expect
|
|
218
|
+
- `e2e/known-issues/issue-288` tested neither half of what it claimed: without
|
|
219
|
+
`hasTouch` the browser still reports `pointer: fine`, so `Browser.touch` and
|
|
220
|
+
`Browser.mobile` were false and the desktop branch rendered, and the click
|
|
221
|
+
landed on `.vco-slidenav-next`, which is `display: none` on mobile. It now
|
|
222
|
+
enables touch, asserts the mobile branch is the one under test, checks the
|
|
223
|
+
`touch-action: pan-y` rule the fix is actually about, and drives a real
|
|
224
|
+
touch drag (via CDP) to show a vertical swipe scrolls the page past the
|
|
225
|
+
storymap
|
|
226
|
+
- `e2e/known-issues/issue-452` reported a `zoom` declaration that exists in no
|
|
227
|
+
stylesheet. OpenLayers ships `.ol-viewport canvas { all: unset }`, and Firefox
|
|
228
|
+
and WebKit enumerate `zoom` as a *declared* property once `all` has reset it
|
|
229
|
+
while Chromium does not. It now asserts against the stylesheet's source text
|
|
230
|
+
- The touch-scrollbar assertion in `e2e/scroll-hint` compared
|
|
231
|
+
`getComputedStyle().scrollbarWidth` against `"thin"`/`"auto"`, which is not
|
|
232
|
+
comparable across engines: Chromium computes `auto`, Firefox computes `none`
|
|
233
|
+
for the same declaration. The declaration is now checked in the stylesheet
|
|
234
|
+
source, and the runtime half is skipped where Playwright does not report
|
|
235
|
+
touch (WebKit)
|
|
236
|
+
- A new georeferenced-IIIF fixture (`issue-iiif-geo`), because the negative
|
|
237
|
+
`isImageSpace()` case could not be reached from the existing ones: the
|
|
238
|
+
document sets `map_as_image`, and the document wins over a constructor option
|
|
239
|
+
- The consent registry keyed its stored decisions on a *localized* label, so
|
|
240
|
+
the same service hashed differently in German than in English and renaming a
|
|
241
|
+
label orphaned every saved decision. Keys are now stable and namespaced
|
|
242
|
+
(`map:tiles`, `fonts:web`, `media:<type>`) with the localized name carried
|
|
243
|
+
alongside, and existing decisions are migrated on read. The per-slide dialog
|
|
244
|
+
also asked "Load content from youtube?" — it now shows the media's display
|
|
245
|
+
name, matching the start-of-story dialog
|
|
246
|
+
- 27 of the 29 bundled locales had no `consent_*` strings at all and silently
|
|
247
|
+
fell back to English, including the whole start-of-story dialog. The 9
|
|
248
|
+
missing keys are translated in 23 locales; `npm run check:locales` now fails
|
|
249
|
+
on a new gap (its `--strict` flag was documented but never implemented, and
|
|
250
|
+
the check was not in CI) instead of only reporting
|
|
251
|
+
- Removing a map marker did not renumber the ones behind it, even though
|
|
252
|
+
`marker_number` is the index a click hands to `goTo()`: a click on the third
|
|
253
|
+
pin after removing the second navigated to the wrong slide
|
|
254
|
+
- Every slide got an empty element id. The generated `uniqueid` was only
|
|
255
|
+
created when the field was the empty string, but it is optional in the
|
|
256
|
+
schema and absent from 47 of the 48 bundled fixtures
|
|
257
|
+
- `dispose()` released the timers and the OpenLayers map but nothing they
|
|
258
|
+
owned, so a torn-down storymap left its slider, slides, media players,
|
|
259
|
+
markers and buttons in the document. Each class now releases what it owns,
|
|
260
|
+
and three listeners that could not be removed at all (registered as inline
|
|
261
|
+
arrows or a throwaway `.bind()`) keep a reference
|
|
262
|
+
- A preload was tracked in one `preloadTimer` that held either a
|
|
263
|
+
`setTimeout` or a `requestIdleCallback` handle. Both are numbers, so
|
|
264
|
+
cancelling one with the other's API appeared to work while leaking it
|
|
265
|
+
- map_bbox was ignored for every IIIF map: the runtime test was "map_type is
|
|
266
|
+
iiif", so a *georeferenced* IIIF map was treated as image space and its view
|
|
267
|
+
was fitted to the image extent instead of the bbox
|
|
268
|
+
- 12 tile/vector source sites declared `attributions: []`, so the OSM, Stadia,
|
|
269
|
+
Mapbox, Esri, Carto, OpenTopo, Esri Ocean, NASA, overlay and mini-map
|
|
270
|
+
credits never reached the attribution control. They are now credited from
|
|
271
|
+
the source; custom `.vco-map-attribution` lines are unchanged
|
|
272
|
+
- Navigating mutated the caller's document: the computed marker zoom was
|
|
273
|
+
written back onto `slides[i].location.zoom`, and `StoryMap.data` is that very
|
|
274
|
+
object. The zoom ladder now lives in an internal store; the authored value is
|
|
275
|
+
left alone and is still used for the min/max bounds
|
|
276
|
+
- `map_options.interactions` was documented as replacing the defaults; it is
|
|
277
|
+
additive (the viewer's own pan/zoom set is always installed)
|
|
278
|
+
- Image media never called onLoaded(): the call had drifted into a dead
|
|
279
|
+
position after a `return` in _altText(), so every image slide kept a
|
|
280
|
+
permanent "Loading Image" overlay painted over it and never rendered its
|
|
281
|
+
credit or caption
|
|
282
|
+
- Consent-denied media threw a TypeError on desktop: updateMediaDisplay()
|
|
283
|
+
dereferenced `content_item.style` on the empty placeholder
|
|
284
|
+
- Map.goTo() fired its change event twice for a slide with no location
|
|
285
|
+
- start_at_slide supplied by the storymap *data* was ignored: the field was
|
|
286
|
+
read before the data merge and the slider's opening goTo() fires before the
|
|
287
|
+
change listener is attached
|
|
288
|
+
- The menubar collapse toggle was a no-op: the portrait branch it only
|
|
289
|
+
appears in unconditionally overwrote the map height it asked for
|
|
290
|
+
- map_type "stadia" with no style resolved to a non-Stadia style name, so
|
|
291
|
+
every tile 404'd; setMapOption("map_bbox") rebuilt the View without the
|
|
292
|
+
deliberate constraints
|
|
293
|
+
- The start-of-story consent dialog listed services the visitor had already
|
|
294
|
+
answered, and left answered rows greyed out rather than removing them
|
|
295
|
+
(two consent e2e tests were failing because of this)
|
|
296
|
+
- The YouTube IFrame API poll retried forever; Vimeo's embed URL used &
|
|
297
|
+
separators that are not decoded in a URL property; the horizontal swipe
|
|
298
|
+
constraint clamp was inverted; slide positions were computed from the
|
|
299
|
+
previous width; goToId() with an unknown id jumped to slide 0
|
|
300
|
+
- 7 of the 18 media types had no icon glyph, so their error boxes were blank
|
|
301
|
+
- he.json carried a UTF-8 BOM that made it unparseable by standard JSON tools
|
|
302
|
+
|
|
303
|
+
Security
|
|
304
|
+
--------
|
|
305
|
+
- The slide-text sanitizer was a denylist that copied every attribute
|
|
306
|
+
verbatim. `style` came through untouched, which allowed a pasted
|
|
307
|
+
full-viewport opaque overlay over the map and controls (chrome spoofing and
|
|
308
|
+
clickjacking from one attribute). It is now an allowlist; `target` is always
|
|
309
|
+
forced to `_blank`, `id`/`name` are dropped, `srcset` is validated per
|
|
310
|
+
candidate, and rebuilt embeds are sandboxed with a no-referrer policy
|
|
311
|
+
- Seven innerHTML sinks that bypassed the sanitizer are routed through it:
|
|
312
|
+
media credit, media caption, the navigation headline, the call-to-action
|
|
313
|
+
text, the Juxtapose iframe, and the map attribution line
|
|
314
|
+
- media and image link hrefs are protocol-checked, so a `javascript:` href in
|
|
315
|
+
the storymap JSON is no longer a click-through XSS
|
|
316
|
+
- a crafted `stock:` font name resolved to an arbitrary same-origin file
|
|
317
|
+
- the schema validator did not implement `anyOf`, so map_bbox,
|
|
318
|
+
map_overview_center and the zoomify block were accepted completely
|
|
319
|
+
unvalidated; `format` and `maxLength` are now honoured
|
|
320
|
+
|
|
321
|
+
Removed
|
|
322
|
+
-------
|
|
323
|
+
- The inert option keys `less_bounce`, `map_subdomains`, `map_popup`,
|
|
324
|
+
`zoom_distance`, `dragging` and `path_gfx`: documented and accepted, but read
|
|
325
|
+
by nothing. They are gone from the schema, the types and the defaults, and
|
|
326
|
+
documents carrying them still validate, because the schema does not close
|
|
327
|
+
`additionalProperties`
|
|
328
|
+
|
|
329
|
+
Changed
|
|
330
|
+
-------
|
|
331
|
+
- The map engine is genuinely optional. `StoryMap._map` is `null` rather than a
|
|
332
|
+
`{}` stub, so the accessors' `this._map ? … : neutral` guards mean what they
|
|
333
|
+
say instead of passing on a truthy object and then calling a method on it,
|
|
334
|
+
and the paths that only make sense with a map now throw a named error if they
|
|
335
|
+
are reached without one
|
|
336
|
+
- `StoryMap._el.map` is `HTMLElement | null` rather than `HTMLElement`
|
|
337
|
+
- A second viewer on a page asking for a different `language` now **throws**
|
|
338
|
+
instead of silently repainting the first one. The UI strings are a single
|
|
339
|
+
page-wide binding read while a viewer is constructed, so a conflict was
|
|
340
|
+
never survivable; the claim is released by `dispose()`. Only an explicit
|
|
341
|
+
`language` — the constructor option or the document's — counts as a request:
|
|
342
|
+
a viewer that was not given one adopts the page's current locale, so calling
|
|
343
|
+
the public `setLanguage()` and then building viewers without a `language`
|
|
344
|
+
option keeps the locale instead of resetting the page to English. The
|
|
345
|
+
trade-off is that such a viewer follows a previous viewer's
|
|
346
|
+
`refreshLanguage()`
|
|
347
|
+
- Several viewers on a page no longer overwrite each other's consent
|
|
348
|
+
decisions: each manager merges into the shared record and re-reads it on
|
|
349
|
+
every ask, instead of writing its whole set back
|
|
350
|
+
- With `keyboard: true` on more than one viewer, an arrow keypress goes to the
|
|
351
|
+
viewer that holds focus, or else the one interacted with most recently
|
|
352
|
+
- External scripts and stylesheets are injected once per URL for the page, so
|
|
353
|
+
two viewers no longer both load the YouTube/SoundCloud APIs and the font
|
|
354
|
+
theme
|
|
355
|
+
- `dispose()` empties the host container and turns the public methods and
|
|
356
|
+
accessors into no-ops; there is no re-init path (build a new StoryMap)
|
|
357
|
+
- strictNullChecks is enabled. The `{} as HTMLElement` placeholders it was
|
|
358
|
+
masking are now honestly nullable, which is what the consent-denied crash
|
|
359
|
+
came from
|
|
360
|
+
- morpheus (an inlined UMD build that shipped no types) is replaced by a
|
|
361
|
+
~130 line Web Animations API wrapper with the same call signature: one
|
|
362
|
+
dependency and one hand-maintained .d.ts removed, -5 kB raw and no
|
|
363
|
+
measurable change over the wire. morpheus gzipped well, so most of the raw
|
|
364
|
+
saving is offset by the new code; the win here is the dependency and the
|
|
365
|
+
type stub, not the bytes
|
|
366
|
+
- npm run check:locales reports which locales are missing which strings.
|
|
367
|
+
28 of 29 are missing 8-10, mostly the per-service consent labels
|
|
368
|
+
- Docs corrected: DEVELOPMENT.md described a CommonJS/UMD build with a
|
|
369
|
+
KLStoryMap global (it is ESM-only), the CHANGELOG claimed consent labels
|
|
370
|
+
were fully translated and that zoomify was removed (both false), and
|
|
371
|
+
README/index.html said slide text is rendered raw (it is sanitized)
|
|
372
|
+
|
|
373
|
+
0.10.0 - 0.10.7 (2026-09-22 to 2026-09-25)
|
|
374
|
+
------------------------
|
|
375
|
+
Released as eight patches without individual changelog entries; this is the
|
|
376
|
+
consolidated list. Viewer-only restructure of the repository:
|
|
4
377
|
- Removed the editor Flask backend, CDN staging and all legacy build artifacts
|
|
5
378
|
- Replaced webpack with Vite (dev/build/preview), default Vite project layout
|
|
6
379
|
- Converted the source to strict TypeScript (target ES2022, noImplicitAny, no explicit any)
|
|
7
|
-
- Replaced Leaflet with OpenLayers
|
|
380
|
+
- Replaced Leaflet with OpenLayers. IIIF Image API ("map_type": "iiif") is the
|
|
381
|
+
recommended image basemap; the legacy Zoomify pyramid ("map_type": "zoomify")
|
|
382
|
+
is retained as a deprecated basemap and warns when it loads
|
|
8
383
|
- Converted Less to SASS with zero deprecation warnings (@use only, no @import, no vendor prefixes, no postcss-scss)
|
|
9
384
|
- Fonts bundled via @fontsource + @fontsource-utils/scss mixins (woff2, latin subsets); no runtime font CDN requests
|
|
10
385
|
- New exchange format: IIIF Presentation API 3.0 manifests (docs/storymap-as-iiif-manifest.md) with navPlace geo +
|
|
@@ -24,9 +399,59 @@ Viewer-only restructure of the repository:
|
|
|
24
399
|
- Runtime language switching without reload (MenuBar.refreshLabels,
|
|
25
400
|
StoryMap.refreshLanguage); locale fallback no longer mutates English;
|
|
26
401
|
German fullscreen labels
|
|
27
|
-
- Attribution refresh on basemap switch (+setExtraAttributions);
|
|
28
|
-
lines pinned above rebuilt tile
|
|
29
|
-
slide colors accept any CSS color
|
|
402
|
+
- Attribution refresh on basemap switch (+setExtraAttributions); identical
|
|
403
|
+
credits collapse to one entry; route lines pinned above rebuilt tile
|
|
404
|
+
layers; font_css resolves page-relative; slide colors accept any CSS color
|
|
405
|
+
- Consent: decisions persist in localStorage (storymapjs-consent, no expiry)
|
|
406
|
+
instead of a 90-day cookie; a start-of-story dialog lists the external
|
|
407
|
+
services the story uses (map tiles, media services, external fonts) and
|
|
408
|
+
offers allow all, decline all or a decision per service, with per-service
|
|
409
|
+
panels as the fallback for services discovered later. Only en.json
|
|
410
|
+
translates every label: the other 28 bundled locales are each missing the
|
|
411
|
+
per-service consent strings and fall back to English (npm run check:locales)
|
|
412
|
+
- Mobile gestures: iOS swipe navigation fixed — signed gesture deltas (a
|
|
413
|
+
rightward swipe on the left half no longer counts as "next"), touchcancel
|
|
414
|
+
handled without leaking touchmove/mouseleave listeners (swipes used to stop
|
|
415
|
+
working after the first slide), touchend reads changedTouches, and
|
|
416
|
+
touch-action: pan-y on the slider keeps vertical page scrolling
|
|
417
|
+
- Accessibility: image alt text end-to-end (schema, IIIF storymap:mediaAlt,
|
|
418
|
+
caption-as-plain-text fallback), aria-live slide announcements, real <button>
|
|
419
|
+
menubar actions with :focus-visible styling, keyboard-operable slider nav
|
|
420
|
+
arrows (role/tabindex/Enter/Space), prefers-reduced-motion honored
|
|
421
|
+
(instant slide changes, no autoplay), embed page allows pinch-zoom
|
|
422
|
+
- Image performance: offscreen slide images are lazy-loaded and
|
|
423
|
+
async-decoded (upgraded to eager when their slide becomes active), IIIF
|
|
424
|
+
image URLs request container-matched widths, optional srcset/sizes pass
|
|
425
|
+
through for plain images
|
|
426
|
+
- Fonts: non-latin subsets (cyrillic, greek, hebrew, vietnamese) shipped
|
|
427
|
+
from the installed Fontsource packages where a family provides them, plus a
|
|
428
|
+
new stock:cairo theme with arabic coverage
|
|
429
|
+
- IIIF: per-slide image regions (location.region as IIIF xywh in image
|
|
430
|
+
pixels) fit the view on navigation for image-map stories, encoded in
|
|
431
|
+
manifests as storymap:imageRegion
|
|
432
|
+
- Storymap JSON: schema entries for map_area, overlays (with per-layer
|
|
433
|
+
opacity, visibility, attribution, className, blendMode and lon/lat extent),
|
|
434
|
+
overview_extent and keyboard — plus the slide fields location.region and
|
|
435
|
+
media.alt/srcset/sizes, and a fix for overlays and overview_extent being
|
|
436
|
+
silently dropped when they came from the data file instead of the options
|
|
437
|
+
- IIIF manifests: the same options as storymap:mapArea, storymap:overlays,
|
|
438
|
+
storymap:overviewExtent and storymap:keyboard terms on the map
|
|
439
|
+
configuration service, storymap:mediaSrcset / storymap:mediaSizes on the
|
|
440
|
+
canvas, and the native geospatial vocabulary where IIIF has it — a navPlace
|
|
441
|
+
Polygon as the story extent (map_bbox), an IIIF Image API Selector as
|
|
442
|
+
location.region
|
|
443
|
+
- IIIF manifests: storymap:georeferencedLayers places a IIIF image on the
|
|
444
|
+
geographic map from a Georeference Extension annotation body (affine
|
|
445
|
+
placement of its ground control points); placements needing a
|
|
446
|
+
non-affine transform or a rotated sheet are reported and skipped, so
|
|
447
|
+
warped layers stay a tile_source_factory/Allmaps concern
|
|
448
|
+
- Map providers: tile_source_factory option injects custom OpenLayers tile
|
|
449
|
+
layers/sources (e.g. WMS) for the base map, overlays and minimap, with
|
|
450
|
+
recipes in the migration guide
|
|
451
|
+
- Embed: &autoplay=<ms> URL parameter for automatic slide playback
|
|
452
|
+
- Upstream audit: docs/KNOWN_ISSUES.md reconciled with the implementation
|
|
453
|
+
(60 of 109 triaged issues verified fixed, one-by-one verdicts and
|
|
454
|
+
regression specs for each)
|
|
30
455
|
|
|
31
456
|
0.9.5 (2025-11-05)
|
|
32
457
|
* Implement basic Audio and Video media types
|
|
@@ -117,16 +542,3 @@ Viewer-only restructure of the repository:
|
|
|
117
542
|
* PR #302 Media fixes including pause of video types when navigating away from slide
|
|
118
543
|
* PR #303 Adds custom map marker upload in editor
|
|
119
544
|
* PR #312 Adds Greek translation to StoryMap editor
|
|
120
|
-
|
|
121
|
-
## 1.0.0 (unreleased)
|
|
122
|
-
|
|
123
|
-
Viewer-only restructure of the repository:
|
|
124
|
-
- Removed the editor Flask backend, staging and legacy build artifacts
|
|
125
|
-
- Replaced webpack with Vite (dev/build/preview), default project layout
|
|
126
|
-
- Converted the source to strict TypeScript (target ES2022)
|
|
127
|
-
- Replaced Leaflet with OpenLayers; IIIF Image API replaces Zoomify (breaking)
|
|
128
|
-
- Converted Less to SASS; fonts bundled from npm (@fontsource) instead of runtime CDN requests
|
|
129
|
-
- Added a JSON Schema for storymap data, runtime validation with console reporting, and a CLI validator
|
|
130
|
-
- Added ESLint + Stylelint and GitHub Actions for linting/tests and release packaging
|
|
131
|
-
- Playwright e2e suite over all examples, Vitest for units
|
|
132
|
-
- Dropped code paths for pre-2022 browsers (legacy vendor prefixes, IE/old-engine fallbacks)
|