@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.
Files changed (587) hide show
  1. package/CHANGELOG +431 -19
  2. package/README.md +168 -17
  3. package/dist/assets/demo-bWnOyfUw.js +1 -0
  4. package/dist/assets/harness-C3JUv5Ii.js +1 -0
  5. package/dist/assets/harness-multi-XZNex3tb.js +1 -0
  6. package/dist/assets/harness-support-CjfZIVeb.js +1 -0
  7. package/dist/assets/index-wHPqGrBS.js +1 -0
  8. package/dist/assets/main-DQ32hWBM.js +17 -0
  9. package/dist/context.json +23 -9
  10. package/dist/css/fonts/files/amatic-sc-cyrillic-400-normal.woff2 +0 -0
  11. package/dist/css/fonts/files/amatic-sc-cyrillic-700-normal.woff2 +0 -0
  12. package/dist/css/fonts/files/amatic-sc-hebrew-400-normal.woff2 +0 -0
  13. package/dist/css/fonts/files/amatic-sc-hebrew-700-normal.woff2 +0 -0
  14. package/dist/css/fonts/files/amatic-sc-vietnamese-400-normal.woff2 +0 -0
  15. package/dist/css/fonts/files/amatic-sc-vietnamese-700-normal.woff2 +0 -0
  16. package/dist/css/fonts/files/bitter-cyrillic-100-italic.woff2 +0 -0
  17. package/dist/css/fonts/files/bitter-cyrillic-100-normal.woff2 +0 -0
  18. package/dist/css/fonts/files/bitter-cyrillic-200-italic.woff2 +0 -0
  19. package/dist/css/fonts/files/bitter-cyrillic-200-normal.woff2 +0 -0
  20. package/dist/css/fonts/files/bitter-cyrillic-300-italic.woff2 +0 -0
  21. package/dist/css/fonts/files/bitter-cyrillic-300-normal.woff2 +0 -0
  22. package/dist/css/fonts/files/bitter-cyrillic-400-italic.woff2 +0 -0
  23. package/dist/css/fonts/files/bitter-cyrillic-400-normal.woff2 +0 -0
  24. package/dist/css/fonts/files/bitter-cyrillic-500-italic.woff2 +0 -0
  25. package/dist/css/fonts/files/bitter-cyrillic-500-normal.woff2 +0 -0
  26. package/dist/css/fonts/files/bitter-cyrillic-600-italic.woff2 +0 -0
  27. package/dist/css/fonts/files/bitter-cyrillic-600-normal.woff2 +0 -0
  28. package/dist/css/fonts/files/bitter-cyrillic-700-italic.woff2 +0 -0
  29. package/dist/css/fonts/files/bitter-cyrillic-700-normal.woff2 +0 -0
  30. package/dist/css/fonts/files/bitter-cyrillic-800-italic.woff2 +0 -0
  31. package/dist/css/fonts/files/bitter-cyrillic-800-normal.woff2 +0 -0
  32. package/dist/css/fonts/files/bitter-cyrillic-900-italic.woff2 +0 -0
  33. package/dist/css/fonts/files/bitter-cyrillic-900-normal.woff2 +0 -0
  34. package/dist/css/fonts/files/bitter-cyrillic-ext-100-italic.woff2 +0 -0
  35. package/dist/css/fonts/files/bitter-cyrillic-ext-100-normal.woff2 +0 -0
  36. package/dist/css/fonts/files/bitter-cyrillic-ext-200-italic.woff2 +0 -0
  37. package/dist/css/fonts/files/bitter-cyrillic-ext-200-normal.woff2 +0 -0
  38. package/dist/css/fonts/files/bitter-cyrillic-ext-300-italic.woff2 +0 -0
  39. package/dist/css/fonts/files/bitter-cyrillic-ext-300-normal.woff2 +0 -0
  40. package/dist/css/fonts/files/bitter-cyrillic-ext-400-italic.woff2 +0 -0
  41. package/dist/css/fonts/files/bitter-cyrillic-ext-400-normal.woff2 +0 -0
  42. package/dist/css/fonts/files/bitter-cyrillic-ext-500-italic.woff2 +0 -0
  43. package/dist/css/fonts/files/bitter-cyrillic-ext-500-normal.woff2 +0 -0
  44. package/dist/css/fonts/files/bitter-cyrillic-ext-600-italic.woff2 +0 -0
  45. package/dist/css/fonts/files/bitter-cyrillic-ext-600-normal.woff2 +0 -0
  46. package/dist/css/fonts/files/bitter-cyrillic-ext-700-italic.woff2 +0 -0
  47. package/dist/css/fonts/files/bitter-cyrillic-ext-700-normal.woff2 +0 -0
  48. package/dist/css/fonts/files/bitter-cyrillic-ext-800-italic.woff2 +0 -0
  49. package/dist/css/fonts/files/bitter-cyrillic-ext-800-normal.woff2 +0 -0
  50. package/dist/css/fonts/files/bitter-cyrillic-ext-900-italic.woff2 +0 -0
  51. package/dist/css/fonts/files/bitter-cyrillic-ext-900-normal.woff2 +0 -0
  52. package/dist/css/fonts/files/bitter-cyrillic-ext-wght-italic.woff2 +0 -0
  53. package/dist/css/fonts/files/bitter-cyrillic-ext-wght-normal.woff2 +0 -0
  54. package/dist/css/fonts/files/bitter-cyrillic-wght-italic.woff2 +0 -0
  55. package/dist/css/fonts/files/bitter-cyrillic-wght-normal.woff2 +0 -0
  56. package/dist/css/fonts/files/bitter-vietnamese-100-italic.woff2 +0 -0
  57. package/dist/css/fonts/files/bitter-vietnamese-100-normal.woff2 +0 -0
  58. package/dist/css/fonts/files/bitter-vietnamese-200-italic.woff2 +0 -0
  59. package/dist/css/fonts/files/bitter-vietnamese-200-normal.woff2 +0 -0
  60. package/dist/css/fonts/files/bitter-vietnamese-300-italic.woff2 +0 -0
  61. package/dist/css/fonts/files/bitter-vietnamese-300-normal.woff2 +0 -0
  62. package/dist/css/fonts/files/bitter-vietnamese-400-italic.woff2 +0 -0
  63. package/dist/css/fonts/files/bitter-vietnamese-400-normal.woff2 +0 -0
  64. package/dist/css/fonts/files/bitter-vietnamese-500-italic.woff2 +0 -0
  65. package/dist/css/fonts/files/bitter-vietnamese-500-normal.woff2 +0 -0
  66. package/dist/css/fonts/files/bitter-vietnamese-600-italic.woff2 +0 -0
  67. package/dist/css/fonts/files/bitter-vietnamese-600-normal.woff2 +0 -0
  68. package/dist/css/fonts/files/bitter-vietnamese-700-italic.woff2 +0 -0
  69. package/dist/css/fonts/files/bitter-vietnamese-700-normal.woff2 +0 -0
  70. package/dist/css/fonts/files/bitter-vietnamese-800-italic.woff2 +0 -0
  71. package/dist/css/fonts/files/bitter-vietnamese-800-normal.woff2 +0 -0
  72. package/dist/css/fonts/files/bitter-vietnamese-900-italic.woff2 +0 -0
  73. package/dist/css/fonts/files/bitter-vietnamese-900-normal.woff2 +0 -0
  74. package/dist/css/fonts/files/bitter-vietnamese-wght-italic.woff2 +0 -0
  75. package/dist/css/fonts/files/bitter-vietnamese-wght-normal.woff2 +0 -0
  76. package/dist/css/fonts/files/cairo-arabic-200-normal.woff2 +0 -0
  77. package/dist/css/fonts/files/cairo-arabic-300-normal.woff2 +0 -0
  78. package/dist/css/fonts/files/cairo-arabic-400-normal.woff2 +0 -0
  79. package/dist/css/fonts/files/cairo-arabic-500-normal.woff2 +0 -0
  80. package/dist/css/fonts/files/cairo-arabic-600-normal.woff2 +0 -0
  81. package/dist/css/fonts/files/cairo-arabic-700-normal.woff2 +0 -0
  82. package/dist/css/fonts/files/cairo-arabic-800-normal.woff2 +0 -0
  83. package/dist/css/fonts/files/cairo-arabic-900-normal.woff2 +0 -0
  84. package/dist/css/fonts/files/cairo-latin-200-normal.woff2 +0 -0
  85. package/dist/css/fonts/files/cairo-latin-300-normal.woff2 +0 -0
  86. package/dist/css/fonts/files/cairo-latin-400-normal.woff2 +0 -0
  87. package/dist/css/fonts/files/cairo-latin-500-normal.woff2 +0 -0
  88. package/dist/css/fonts/files/cairo-latin-600-normal.woff2 +0 -0
  89. package/dist/css/fonts/files/cairo-latin-700-normal.woff2 +0 -0
  90. package/dist/css/fonts/files/cairo-latin-800-normal.woff2 +0 -0
  91. package/dist/css/fonts/files/cairo-latin-900-normal.woff2 +0 -0
  92. package/dist/css/fonts/files/cairo-latin-ext-200-normal.woff2 +0 -0
  93. package/dist/css/fonts/files/cairo-latin-ext-300-normal.woff2 +0 -0
  94. package/dist/css/fonts/files/cairo-latin-ext-400-normal.woff2 +0 -0
  95. package/dist/css/fonts/files/cairo-latin-ext-500-normal.woff2 +0 -0
  96. package/dist/css/fonts/files/cairo-latin-ext-600-normal.woff2 +0 -0
  97. package/dist/css/fonts/files/cairo-latin-ext-700-normal.woff2 +0 -0
  98. package/dist/css/fonts/files/cairo-latin-ext-800-normal.woff2 +0 -0
  99. package/dist/css/fonts/files/cairo-latin-ext-900-normal.woff2 +0 -0
  100. package/dist/css/fonts/files/dancing-script-vietnamese-wght-normal.woff2 +0 -0
  101. package/dist/css/fonts/files/eb-garamond-cyrillic-ext-wght-italic.woff2 +0 -0
  102. package/dist/css/fonts/files/eb-garamond-cyrillic-ext-wght-normal.woff2 +0 -0
  103. package/dist/css/fonts/files/eb-garamond-cyrillic-wght-italic.woff2 +0 -0
  104. package/dist/css/fonts/files/eb-garamond-cyrillic-wght-normal.woff2 +0 -0
  105. package/dist/css/fonts/files/eb-garamond-greek-ext-wght-italic.woff2 +0 -0
  106. package/dist/css/fonts/files/eb-garamond-greek-ext-wght-normal.woff2 +0 -0
  107. package/dist/css/fonts/files/eb-garamond-greek-wght-italic.woff2 +0 -0
  108. package/dist/css/fonts/files/eb-garamond-greek-wght-normal.woff2 +0 -0
  109. package/dist/css/fonts/files/eb-garamond-vietnamese-wght-italic.woff2 +0 -0
  110. package/dist/css/fonts/files/eb-garamond-vietnamese-wght-normal.woff2 +0 -0
  111. package/dist/css/fonts/files/gentium-book-plus-cyrillic-400-italic.woff2 +0 -0
  112. package/dist/css/fonts/files/gentium-book-plus-cyrillic-400-normal.woff2 +0 -0
  113. package/dist/css/fonts/files/gentium-book-plus-cyrillic-700-italic.woff2 +0 -0
  114. package/dist/css/fonts/files/gentium-book-plus-cyrillic-700-normal.woff2 +0 -0
  115. package/dist/css/fonts/files/gentium-book-plus-cyrillic-ext-400-italic.woff2 +0 -0
  116. package/dist/css/fonts/files/gentium-book-plus-cyrillic-ext-400-normal.woff2 +0 -0
  117. package/dist/css/fonts/files/gentium-book-plus-cyrillic-ext-700-italic.woff2 +0 -0
  118. package/dist/css/fonts/files/gentium-book-plus-cyrillic-ext-700-normal.woff2 +0 -0
  119. package/dist/css/fonts/files/gentium-book-plus-greek-400-italic.woff2 +0 -0
  120. package/dist/css/fonts/files/gentium-book-plus-greek-400-normal.woff2 +0 -0
  121. package/dist/css/fonts/files/gentium-book-plus-greek-700-italic.woff2 +0 -0
  122. package/dist/css/fonts/files/gentium-book-plus-greek-700-normal.woff2 +0 -0
  123. package/dist/css/fonts/files/gentium-book-plus-greek-ext-400-italic.woff2 +0 -0
  124. package/dist/css/fonts/files/gentium-book-plus-greek-ext-400-normal.woff2 +0 -0
  125. package/dist/css/fonts/files/gentium-book-plus-greek-ext-700-italic.woff2 +0 -0
  126. package/dist/css/fonts/files/gentium-book-plus-greek-ext-700-normal.woff2 +0 -0
  127. package/dist/css/fonts/files/gentium-book-plus-vietnamese-400-italic.woff2 +0 -0
  128. package/dist/css/fonts/files/gentium-book-plus-vietnamese-400-normal.woff2 +0 -0
  129. package/dist/css/fonts/files/gentium-book-plus-vietnamese-700-italic.woff2 +0 -0
  130. package/dist/css/fonts/files/gentium-book-plus-vietnamese-700-normal.woff2 +0 -0
  131. package/dist/css/fonts/files/old-standard-tt-cyrillic-400-italic.woff2 +0 -0
  132. package/dist/css/fonts/files/old-standard-tt-cyrillic-400-normal.woff2 +0 -0
  133. package/dist/css/fonts/files/old-standard-tt-cyrillic-700-normal.woff2 +0 -0
  134. package/dist/css/fonts/files/old-standard-tt-cyrillic-ext-400-italic.woff2 +0 -0
  135. package/dist/css/fonts/files/old-standard-tt-cyrillic-ext-400-normal.woff2 +0 -0
  136. package/dist/css/fonts/files/old-standard-tt-cyrillic-ext-700-normal.woff2 +0 -0
  137. package/dist/css/fonts/files/old-standard-tt-vietnamese-400-italic.woff2 +0 -0
  138. package/dist/css/fonts/files/old-standard-tt-vietnamese-400-normal.woff2 +0 -0
  139. package/dist/css/fonts/files/old-standard-tt-vietnamese-700-normal.woff2 +0 -0
  140. package/dist/css/fonts/files/open-sans-cyrillic-ext-wght-italic.woff2 +0 -0
  141. package/dist/css/fonts/files/open-sans-cyrillic-ext-wght-normal.woff2 +0 -0
  142. package/dist/css/fonts/files/open-sans-cyrillic-wght-italic.woff2 +0 -0
  143. package/dist/css/fonts/files/open-sans-cyrillic-wght-normal.woff2 +0 -0
  144. package/dist/css/fonts/files/open-sans-greek-ext-wght-italic.woff2 +0 -0
  145. package/dist/css/fonts/files/open-sans-greek-ext-wght-normal.woff2 +0 -0
  146. package/dist/css/fonts/files/open-sans-greek-wght-italic.woff2 +0 -0
  147. package/dist/css/fonts/files/open-sans-greek-wght-normal.woff2 +0 -0
  148. package/dist/css/fonts/files/open-sans-hebrew-wght-italic.woff2 +0 -0
  149. package/dist/css/fonts/files/open-sans-hebrew-wght-normal.woff2 +0 -0
  150. package/dist/css/fonts/files/open-sans-vietnamese-wght-italic.woff2 +0 -0
  151. package/dist/css/fonts/files/open-sans-vietnamese-wght-normal.woff2 +0 -0
  152. package/dist/css/fonts/files/playfair-display-cyrillic-wght-italic.woff2 +0 -0
  153. package/dist/css/fonts/files/playfair-display-cyrillic-wght-normal.woff2 +0 -0
  154. package/dist/css/fonts/files/playfair-display-sc-cyrillic-400-italic.woff2 +0 -0
  155. package/dist/css/fonts/files/playfair-display-sc-cyrillic-400-normal.woff2 +0 -0
  156. package/dist/css/fonts/files/playfair-display-sc-cyrillic-700-italic.woff2 +0 -0
  157. package/dist/css/fonts/files/playfair-display-sc-cyrillic-700-normal.woff2 +0 -0
  158. package/dist/css/fonts/files/playfair-display-sc-cyrillic-900-italic.woff2 +0 -0
  159. package/dist/css/fonts/files/playfair-display-sc-cyrillic-900-normal.woff2 +0 -0
  160. package/dist/css/fonts/files/playfair-display-sc-vietnamese-400-italic.woff2 +0 -0
  161. package/dist/css/fonts/files/playfair-display-sc-vietnamese-400-normal.woff2 +0 -0
  162. package/dist/css/fonts/files/playfair-display-sc-vietnamese-700-italic.woff2 +0 -0
  163. package/dist/css/fonts/files/playfair-display-sc-vietnamese-700-normal.woff2 +0 -0
  164. package/dist/css/fonts/files/playfair-display-sc-vietnamese-900-italic.woff2 +0 -0
  165. package/dist/css/fonts/files/playfair-display-sc-vietnamese-900-normal.woff2 +0 -0
  166. package/dist/css/fonts/files/playfair-display-vietnamese-wght-italic.woff2 +0 -0
  167. package/dist/css/fonts/files/playfair-display-vietnamese-wght-normal.woff2 +0 -0
  168. package/dist/css/fonts/files/pt-sans-cyrillic-400-italic.woff2 +0 -0
  169. package/dist/css/fonts/files/pt-sans-cyrillic-400-normal.woff2 +0 -0
  170. package/dist/css/fonts/files/pt-sans-cyrillic-700-italic.woff2 +0 -0
  171. package/dist/css/fonts/files/pt-sans-cyrillic-700-normal.woff2 +0 -0
  172. package/dist/css/fonts/files/pt-sans-cyrillic-ext-400-italic.woff2 +0 -0
  173. package/dist/css/fonts/files/pt-sans-cyrillic-ext-400-normal.woff2 +0 -0
  174. package/dist/css/fonts/files/pt-sans-cyrillic-ext-700-italic.woff2 +0 -0
  175. package/dist/css/fonts/files/pt-sans-cyrillic-ext-700-normal.woff2 +0 -0
  176. package/dist/css/fonts/files/pt-sans-narrow-cyrillic-400-normal.woff2 +0 -0
  177. package/dist/css/fonts/files/pt-sans-narrow-cyrillic-700-normal.woff2 +0 -0
  178. package/dist/css/fonts/files/pt-sans-narrow-cyrillic-ext-400-normal.woff2 +0 -0
  179. package/dist/css/fonts/files/pt-sans-narrow-cyrillic-ext-700-normal.woff2 +0 -0
  180. package/dist/css/fonts/files/pt-serif-cyrillic-400-italic.woff2 +0 -0
  181. package/dist/css/fonts/files/pt-serif-cyrillic-400-normal.woff2 +0 -0
  182. package/dist/css/fonts/files/pt-serif-cyrillic-700-italic.woff2 +0 -0
  183. package/dist/css/fonts/files/pt-serif-cyrillic-700-normal.woff2 +0 -0
  184. package/dist/css/fonts/files/pt-serif-cyrillic-ext-400-italic.woff2 +0 -0
  185. package/dist/css/fonts/files/pt-serif-cyrillic-ext-400-normal.woff2 +0 -0
  186. package/dist/css/fonts/files/pt-serif-cyrillic-ext-700-italic.woff2 +0 -0
  187. package/dist/css/fonts/files/pt-serif-cyrillic-ext-700-normal.woff2 +0 -0
  188. package/dist/css/fonts/files/raleway-cyrillic-ext-wght-italic.woff2 +0 -0
  189. package/dist/css/fonts/files/raleway-cyrillic-ext-wght-normal.woff2 +0 -0
  190. package/dist/css/fonts/files/raleway-cyrillic-wght-italic.woff2 +0 -0
  191. package/dist/css/fonts/files/raleway-cyrillic-wght-normal.woff2 +0 -0
  192. package/dist/css/fonts/files/raleway-vietnamese-wght-italic.woff2 +0 -0
  193. package/dist/css/fonts/files/raleway-vietnamese-wght-normal.woff2 +0 -0
  194. package/dist/css/fonts/files/roboto-slab-cyrillic-ext-wght-normal.woff2 +0 -0
  195. package/dist/css/fonts/files/roboto-slab-cyrillic-wght-normal.woff2 +0 -0
  196. package/dist/css/fonts/files/roboto-slab-greek-ext-wght-normal.woff2 +0 -0
  197. package/dist/css/fonts/files/roboto-slab-greek-wght-normal.woff2 +0 -0
  198. package/dist/css/fonts/files/roboto-slab-vietnamese-wght-normal.woff2 +0 -0
  199. package/dist/css/fonts/files/ubuntu-cyrillic-300-italic.woff2 +0 -0
  200. package/dist/css/fonts/files/ubuntu-cyrillic-300-normal.woff2 +0 -0
  201. package/dist/css/fonts/files/ubuntu-cyrillic-400-italic.woff2 +0 -0
  202. package/dist/css/fonts/files/ubuntu-cyrillic-400-normal.woff2 +0 -0
  203. package/dist/css/fonts/files/ubuntu-cyrillic-500-italic.woff2 +0 -0
  204. package/dist/css/fonts/files/ubuntu-cyrillic-500-normal.woff2 +0 -0
  205. package/dist/css/fonts/files/ubuntu-cyrillic-700-italic.woff2 +0 -0
  206. package/dist/css/fonts/files/ubuntu-cyrillic-700-normal.woff2 +0 -0
  207. package/dist/css/fonts/files/ubuntu-cyrillic-ext-300-italic.woff2 +0 -0
  208. package/dist/css/fonts/files/ubuntu-cyrillic-ext-300-normal.woff2 +0 -0
  209. package/dist/css/fonts/files/ubuntu-cyrillic-ext-400-italic.woff2 +0 -0
  210. package/dist/css/fonts/files/ubuntu-cyrillic-ext-400-normal.woff2 +0 -0
  211. package/dist/css/fonts/files/ubuntu-cyrillic-ext-500-italic.woff2 +0 -0
  212. package/dist/css/fonts/files/ubuntu-cyrillic-ext-500-normal.woff2 +0 -0
  213. package/dist/css/fonts/files/ubuntu-cyrillic-ext-700-italic.woff2 +0 -0
  214. package/dist/css/fonts/files/ubuntu-cyrillic-ext-700-normal.woff2 +0 -0
  215. package/dist/css/fonts/files/ubuntu-greek-300-italic.woff2 +0 -0
  216. package/dist/css/fonts/files/ubuntu-greek-300-normal.woff2 +0 -0
  217. package/dist/css/fonts/files/ubuntu-greek-400-italic.woff2 +0 -0
  218. package/dist/css/fonts/files/ubuntu-greek-400-normal.woff2 +0 -0
  219. package/dist/css/fonts/files/ubuntu-greek-500-italic.woff2 +0 -0
  220. package/dist/css/fonts/files/ubuntu-greek-500-normal.woff2 +0 -0
  221. package/dist/css/fonts/files/ubuntu-greek-700-italic.woff2 +0 -0
  222. package/dist/css/fonts/files/ubuntu-greek-700-normal.woff2 +0 -0
  223. package/dist/css/fonts/files/ubuntu-greek-ext-300-italic.woff2 +0 -0
  224. package/dist/css/fonts/files/ubuntu-greek-ext-300-normal.woff2 +0 -0
  225. package/dist/css/fonts/files/ubuntu-greek-ext-400-italic.woff2 +0 -0
  226. package/dist/css/fonts/files/ubuntu-greek-ext-400-normal.woff2 +0 -0
  227. package/dist/css/fonts/files/ubuntu-greek-ext-500-italic.woff2 +0 -0
  228. package/dist/css/fonts/files/ubuntu-greek-ext-500-normal.woff2 +0 -0
  229. package/dist/css/fonts/files/ubuntu-greek-ext-700-italic.woff2 +0 -0
  230. package/dist/css/fonts/files/ubuntu-greek-ext-700-normal.woff2 +0 -0
  231. package/dist/css/fonts/files/unica-one-vietnamese-400-normal.woff2 +0 -0
  232. package/dist/css/fonts/files/vollkorn-cyrillic-ext-wght-italic.woff2 +0 -0
  233. package/dist/css/fonts/files/vollkorn-cyrillic-ext-wght-normal.woff2 +0 -0
  234. package/dist/css/fonts/files/vollkorn-cyrillic-wght-italic.woff2 +0 -0
  235. package/dist/css/fonts/files/vollkorn-cyrillic-wght-normal.woff2 +0 -0
  236. package/dist/css/fonts/files/vollkorn-greek-wght-italic.woff2 +0 -0
  237. package/dist/css/fonts/files/vollkorn-greek-wght-normal.woff2 +0 -0
  238. package/dist/css/fonts/files/vollkorn-vietnamese-wght-italic.woff2 +0 -0
  239. package/dist/css/fonts/files/vollkorn-vietnamese-wght-normal.woff2 +0 -0
  240. package/dist/css/fonts/font.abril-droidsans.css +3 -0
  241. package/dist/css/fonts/font.amatic-andika.css +57 -0
  242. package/dist/css/fonts/font.bitter-raleway.css +111 -0
  243. package/dist/css/fonts/font.cairo.css +312 -0
  244. package/dist/css/fonts/font.clicker-garamond.css +93 -0
  245. package/dist/css/fonts/font.dancing-ledger.css +12 -0
  246. package/dist/css/fonts/font.default.css +183 -0
  247. package/dist/css/fonts/font.fjalla-average.css +3 -0
  248. package/dist/css/fonts/font.georgia-helvetica.css +3 -0
  249. package/dist/css/fonts/font.knightlab.css +642 -0
  250. package/dist/css/fonts/font.lustria-lato.css +3 -0
  251. package/dist/css/fonts/font.medula-lato.css +3 -0
  252. package/dist/css/fonts/font.oldstandard.css +84 -0
  253. package/dist/css/fonts/font.opensans-gentiumbook.css +183 -0
  254. package/dist/css/fonts/font.playfair-faunaone.css +39 -0
  255. package/dist/css/fonts/font.playfair.css +147 -0
  256. package/dist/css/fonts/font.pt.css +183 -0
  257. package/dist/css/fonts/font.roboto-megrim.css +3 -0
  258. package/dist/css/fonts/font.rufina-sintony.css +3 -0
  259. package/dist/css/fonts/font.ubuntu.css +291 -0
  260. package/dist/css/fonts/font.unicaone-vollkorn.css +84 -0
  261. package/dist/css/storymap.css +1 -1
  262. package/dist/demo.html +3 -2
  263. package/dist/docs/api/.nojekyll +1 -0
  264. package/dist/docs/api/assets/custom.css +47 -0
  265. package/dist/docs/api/assets/hierarchy.js +1 -0
  266. package/dist/docs/api/assets/highlight.css +57 -0
  267. package/dist/docs/api/assets/icons.js +18 -0
  268. package/dist/docs/api/assets/icons.svg +1 -0
  269. package/dist/docs/api/assets/main.js +60 -0
  270. package/dist/docs/api/assets/navigation.js +1 -0
  271. package/dist/docs/api/assets/search.js +1 -0
  272. package/dist/docs/api/assets/style.css +1648 -0
  273. package/dist/docs/api/classes/StoryMap.html +2112 -0
  274. package/dist/docs/api/functions/MediaType.html +51 -0
  275. package/dist/docs/api/functions/isPresentation3Collection.html +47 -0
  276. package/dist/docs/api/functions/isPresentation3Manifest.html +53 -0
  277. package/dist/docs/api/functions/isSlideshowCollection.html +51 -0
  278. package/dist/docs/api/functions/loadCSS.html +63 -0
  279. package/dist/docs/api/functions/manifestToStorymapData.html +49 -0
  280. package/dist/docs/api/functions/setLanguage.html +54 -0
  281. package/dist/docs/api/functions/slideshowToStorymapData.html +51 -0
  282. package/dist/docs/api/functions/slideshowVersion.html +48 -0
  283. package/dist/docs/api/functions/storymapToManifest.html +57 -0
  284. package/dist/docs/api/functions/validateStorymap.html +53 -0
  285. package/dist/docs/api/functions/validateStorymapAndReport.html +54 -0
  286. package/dist/docs/api/hierarchy.html +28 -0
  287. package/dist/docs/api/index.html +300 -0
  288. package/dist/docs/api/interfaces/AnimationHandle.html +60 -0
  289. package/dist/docs/api/interfaces/ImagereadyPayload.html +71 -0
  290. package/dist/docs/api/interfaces/LanguageEntry.html +102 -0
  291. package/dist/docs/api/interfaces/LatLngLiteral.html +73 -0
  292. package/dist/docs/api/interfaces/LoadOptions.html +59 -0
  293. package/dist/docs/api/interfaces/MapEvents.html +116 -0
  294. package/dist/docs/api/interfaces/MapMarkerEvents.html +66 -0
  295. package/dist/docs/api/interfaces/MarkerEventPayload.html +57 -0
  296. package/dist/docs/api/interfaces/MediaEvents.html +78 -0
  297. package/dist/docs/api/interfaces/MenuBarEvents.html +114 -0
  298. package/dist/docs/api/interfaces/MessageEvents.html +72 -0
  299. package/dist/docs/api/interfaces/OlLayer.html +1400 -0
  300. package/dist/docs/api/interfaces/OlMap.html +1656 -0
  301. package/dist/docs/api/interfaces/OlProjection.html +332 -0
  302. package/dist/docs/api/interfaces/OlSource.html +784 -0
  303. package/dist/docs/api/interfaces/OlTileLayer.html +1497 -0
  304. package/dist/docs/api/interfaces/OlVectorLayer.html +1559 -0
  305. package/dist/docs/api/interfaces/OlView.html +1958 -0
  306. package/dist/docs/api/interfaces/SlideBackgroundState.html +66 -0
  307. package/dist/docs/api/interfaces/SlideEvents.html +78 -0
  308. package/dist/docs/api/interfaces/SlideNavEvents.html +72 -0
  309. package/dist/docs/api/interfaces/SlideshowPlayerSettings.html +182 -0
  310. package/dist/docs/api/interfaces/SlideshowToStorymapResult.html +60 -0
  311. package/dist/docs/api/interfaces/SlideshowTranslatorOptions.html +65 -0
  312. package/dist/docs/api/interfaces/SlideshowWarning.html +72 -0
  313. package/dist/docs/api/interfaces/StoryMapEvents.html +146 -0
  314. package/dist/docs/api/interfaces/StoryMapMarker.html +763 -0
  315. package/dist/docs/api/interfaces/StorySliderEvents.html +102 -0
  316. package/dist/docs/api/interfaces/StorymapBasemap.html +69 -0
  317. package/dist/docs/api/interfaces/StorymapData.html +77 -0
  318. package/dist/docs/api/interfaces/StorymapDataWrapper.html +60 -0
  319. package/dist/docs/api/interfaces/StorymapDocument.html +68 -0
  320. package/dist/docs/api/interfaces/StorymapError.html +63 -0
  321. package/dist/docs/api/interfaces/StorymapGeoreference.html +93 -0
  322. package/dist/docs/api/interfaces/StorymapGeoreferenceBody.html +74 -0
  323. package/dist/docs/api/interfaces/StorymapGroundControlPoint.html +69 -0
  324. package/dist/docs/api/interfaces/StorymapLanguageMap.html +57 -0
  325. package/dist/docs/api/interfaces/StorymapManifest.html +118 -0
  326. package/dist/docs/api/interfaces/StorymapManifestAnnotation.html +137 -0
  327. package/dist/docs/api/interfaces/StorymapManifestBackground.html +81 -0
  328. package/dist/docs/api/interfaces/StorymapManifestCanvas.html +188 -0
  329. package/dist/docs/api/interfaces/StorymapManifestContentResource.html +97 -0
  330. package/dist/docs/api/interfaces/StorymapManifestFeatureCollection.html +82 -0
  331. package/dist/docs/api/interfaces/StorymapManifestGeoreferencing.html +87 -0
  332. package/dist/docs/api/interfaces/StorymapManifestImageService.html +69 -0
  333. package/dist/docs/api/interfaces/StorymapManifestRange.html +75 -0
  334. package/dist/docs/api/interfaces/StorymapManifestService.html +77 -0
  335. package/dist/docs/api/interfaces/StorymapManifestSpecificResource.html +69 -0
  336. package/dist/docs/api/interfaces/StorymapManifestStatement.html +63 -0
  337. package/dist/docs/api/interfaces/StorymapMapOptions.html +92 -0
  338. package/dist/docs/api/interfaces/StorymapOptions.html +734 -0
  339. package/dist/docs/api/interfaces/StorymapOverlayLayer.html +157 -0
  340. package/dist/docs/api/interfaces/StorymapSlide.html +186 -0
  341. package/dist/docs/api/interfaces/StorymapSlideBackground.html +72 -0
  342. package/dist/docs/api/interfaces/StorymapSlideLocation.html +161 -0
  343. package/dist/docs/api/interfaces/StorymapSlideMarker.html +103 -0
  344. package/dist/docs/api/interfaces/StorymapSlideMedia.html +149 -0
  345. package/dist/docs/api/interfaces/StorymapSlideNarration.html +117 -0
  346. package/dist/docs/api/interfaces/StorymapSlideText.html +72 -0
  347. package/dist/docs/api/interfaces/StorymapTilejson.html +105 -0
  348. package/dist/docs/api/interfaces/SwipableEvents.html +102 -0
  349. package/dist/docs/api/interfaces/TextEvents.html +66 -0
  350. package/dist/docs/api/media/es.json +31 -0
  351. package/dist/docs/api/media/events.md +66 -0
  352. package/dist/docs/api/media/migration-from-knightlab.md +399 -0
  353. package/dist/docs/api/media/slideshow.md +109 -0
  354. package/dist/docs/api/media/storymap-as-iiif-manifest.md +1007 -0
  355. package/dist/docs/api/modules.html +50 -0
  356. package/dist/docs/api/types/ContentState.html +70 -0
  357. package/dist/docs/api/types/FiredEvent.html +43 -0
  358. package/dist/docs/api/types/ImagereadyKind.html +34 -0
  359. package/dist/docs/api/types/MediaTypeMatch.html +78 -0
  360. package/dist/docs/api/types/SwipeDirection.html +36 -0
  361. package/dist/docs/api/types/TileSourceFactory.html +53 -0
  362. package/dist/docs/authoring.html +306 -0
  363. package/dist/docs/events.html +263 -0
  364. package/dist/docs/iiif.html +738 -69
  365. package/dist/docs/migration.html +360 -11
  366. package/dist/docs/readme.html +149 -17
  367. package/dist/embed/index.html +8 -1
  368. package/dist/examples/font-css-false.json +33 -0
  369. package/dist/examples/issue-242-nonlatin.json +55 -0
  370. package/dist/examples/issue-305-start-at-slide-data.json +96 -0
  371. package/dist/examples/issue-358-iframe.json +57 -0
  372. package/dist/examples/issue-iiif-geo.json +32 -0
  373. package/dist/examples/issue-image-alt.json +23 -0
  374. package/dist/examples/issue-image-region.json +42 -0
  375. package/dist/examples/issue-image-srcset.json +24 -0
  376. package/dist/examples/layers-control.json +60 -0
  377. package/dist/examples/map-area-overlays.json +68 -0
  378. package/dist/examples/map-template-provider.json +36 -0
  379. package/dist/examples/multi-media.json +71 -0
  380. package/dist/examples/no-map.json +44 -0
  381. package/dist/examples-iiif/annotated-image.json +204 -0
  382. package/dist/examples-iiif/bob-boilen.json +11 -5
  383. package/dist/examples-iiif/courbet.json +9 -6
  384. package/dist/examples-iiif/empty.json +8 -4
  385. package/dist/examples-iiif/flickr-drewvigal.json +248 -24
  386. package/dist/examples-iiif/flickr-zach.wise.json +8 -4
  387. package/dist/examples-iiif/font-css-false.json +114 -0
  388. package/dist/examples-iiif/georeferenced-layer-unsupported.json +153 -0
  389. package/dist/examples-iiif/georeferenced-layer.json +318 -0
  390. package/dist/examples-iiif/iiif-wellcome.json +9 -6
  391. package/dist/examples-iiif/instagram-chenpamela.json +381 -36
  392. package/dist/examples-iiif/instagram_brentfoster.json +429 -40
  393. package/dist/examples-iiif/instagram_couch.json +261 -26
  394. package/dist/examples-iiif/instagram_joegermuska.json +441 -41
  395. package/dist/examples-iiif/instagram_matteich.json +261 -26
  396. package/dist/examples-iiif/instagram_mirandamulligan.json +261 -26
  397. package/dist/examples-iiif/instagram_raymondmccrea.json +261 -26
  398. package/dist/examples-iiif/instagram_test.json +261 -26
  399. package/dist/examples-iiif/issue-134-no-lines.json +9 -5
  400. package/dist/examples-iiif/issue-177-color-vars.json +9 -5
  401. package/dist/examples-iiif/issue-211-rtl.json +9 -5
  402. package/dist/examples-iiif/issue-242-nonlatin.json +239 -0
  403. package/dist/examples-iiif/issue-272-facebook.json +9 -5
  404. package/dist/examples-iiif/issue-305-start-at-slide-data.json +305 -0
  405. package/dist/examples-iiif/issue-305-start-at-slide.json +9 -5
  406. package/dist/examples-iiif/issue-341-distance.json +9 -5
  407. package/dist/examples-iiif/issue-358-iframe.json +190 -0
  408. package/dist/examples-iiif/issue-360-juxtapose.json +22 -7
  409. package/dist/examples-iiif/issue-368-null-fields.json +9 -5
  410. package/dist/examples-iiif/issue-375-code-lists.json +9 -5
  411. package/dist/examples-iiif/issue-381-dateline.json +9 -5
  412. package/dist/examples-iiif/issue-405-custom-icon.json +203 -0
  413. package/dist/examples-iiif/issue-425-many-slides.json +9 -5
  414. package/dist/examples-iiif/issue-428-background.json +20 -8
  415. package/dist/examples-iiif/issue-435-googlemaps.json +9 -5
  416. package/dist/examples-iiif/issue-437-documentcloud.json +22 -7
  417. package/dist/examples-iiif/issue-451-webp.json +9 -5
  418. package/dist/examples-iiif/issue-455-audio.json +9 -5
  419. package/dist/examples-iiif/issue-480-shorts.json +9 -5
  420. package/dist/examples-iiif/issue-506-marker-sync.json +9 -5
  421. package/dist/examples-iiif/issue-iiif-geo.json +200 -0
  422. package/dist/examples-iiif/issue-image-alt.json +90 -0
  423. package/dist/examples-iiif/issue-image-region.json +203 -0
  424. package/dist/examples-iiif/issue-image-srcset.json +87 -0
  425. package/dist/examples-iiif/jansteen.json +9 -6
  426. package/dist/examples-iiif/katrina.json +197 -41
  427. package/dist/examples-iiif/layers-control.json +226 -0
  428. package/dist/examples-iiif/map-area-overlays.json +289 -0
  429. package/dist/examples-iiif/map-template-provider.json +133 -0
  430. package/dist/examples-iiif/marktwain.json +255 -58
  431. package/dist/examples-iiif/multi-media.json +237 -0
  432. package/dist/examples-iiif/no-map.json +148 -0
  433. package/dist/examples-iiif/population.json +440 -76
  434. package/dist/examples-iiif/president.json +456 -83
  435. package/dist/examples-iiif/scroll-hint.json +190 -0
  436. package/dist/examples-iiif/seurat.json +113 -22
  437. package/dist/examples-iiif/zoomify-clamp.json +153 -0
  438. package/dist/examples-slideshow/single.json +79 -0
  439. package/dist/examples-slideshow/static/pixel.png +0 -0
  440. package/dist/examples-slideshow/static.json +44 -0
  441. package/dist/harness-multi.html +17 -0
  442. package/dist/harness.html +4 -2
  443. package/dist/index.html +19 -12
  444. package/dist/js/storymap.d.ts +2669 -307
  445. package/dist/js/storymap.js +10820 -6196
  446. package/dist/js/storymap.js.map +1 -1
  447. package/dist/navplace-properties.json +54 -0
  448. package/dist/site.css +54 -36
  449. package/docs/migration-from-knightlab.md +279 -19
  450. package/docs/storymap-as-iiif-manifest.md +633 -136
  451. package/package.json +12 -7
  452. package/schema/storymap.schema.json +733 -80
  453. package/src/animation/easings.ts +8 -1
  454. package/src/animation/tween.ts +186 -0
  455. package/src/core/Browser.ts +6 -5
  456. package/src/core/Load.ts +54 -2
  457. package/src/core/Util.ts +257 -193
  458. package/src/core/mixins.ts +66 -35
  459. package/src/core/viewers.ts +94 -0
  460. package/src/dom/DomEvent.ts +27 -8
  461. package/src/globals.d.ts +8 -0
  462. package/src/language/Language.ts +206 -25
  463. package/src/language/locale/.expected-gaps.json +346 -0
  464. package/src/language/locale/be.json +15 -2
  465. package/src/language/locale/bg.json +15 -2
  466. package/src/language/locale/cs.json +15 -2
  467. package/src/language/locale/de.json +23 -2
  468. package/src/language/locale/el.json +15 -2
  469. package/src/language/locale/en.json +17 -3
  470. package/src/language/locale/es.json +15 -2
  471. package/src/language/locale/et.json +5 -1
  472. package/src/language/locale/fr.json +15 -2
  473. package/src/language/locale/he.json +16 -3
  474. package/src/language/locale/hu.json +15 -2
  475. package/src/language/locale/is.json +5 -1
  476. package/src/language/locale/it.json +15 -2
  477. package/src/language/locale/jp.json +15 -2
  478. package/src/language/locale/ko.json +15 -2
  479. package/src/language/locale/nl.json +15 -2
  480. package/src/language/locale/nn.json +5 -1
  481. package/src/language/locale/no.json +15 -2
  482. package/src/language/locale/pl.json +15 -2
  483. package/src/language/locale/pt.json +15 -2
  484. package/src/language/locale/ru.json +15 -2
  485. package/src/language/locale/sk.json +15 -2
  486. package/src/language/locale/sr.json +5 -1
  487. package/src/language/locale/sv.json +15 -2
  488. package/src/language/locale/tr.json +15 -2
  489. package/src/language/locale/uk.json +15 -2
  490. package/src/language/locale/ur.json +5 -1
  491. package/src/language/locale/zh-cn.json +15 -2
  492. package/src/language/locale/zh-tw.json +15 -2
  493. package/src/main.ts +143 -0
  494. package/src/map/Map.ts +227 -112
  495. package/src/map/MapMarker.ts +44 -8
  496. package/src/map/georeference.ts +325 -0
  497. package/src/map/openlayers/Map.OpenLayers.ts +1601 -263
  498. package/src/map/openlayers/MapMarker.OpenLayers.ts +348 -24
  499. package/src/map/openlayers/zoomifyTiles.ts +1 -4
  500. package/src/map/slideView.ts +149 -0
  501. package/src/map/types.ts +2 -0
  502. package/src/media/EmbedUtil.ts +333 -24
  503. package/src/media/Media.ts +270 -59
  504. package/src/media/embedId.ts +110 -0
  505. package/src/media/types/Audio.ts +9 -82
  506. package/src/media/types/Blockquote.ts +2 -3
  507. package/src/media/types/DailyMotion.ts +5 -10
  508. package/src/media/types/DocumentCloud.ts +6 -35
  509. package/src/media/types/Facebook.ts +3 -4
  510. package/src/media/types/Flickr.ts +23 -12
  511. package/src/media/types/GoogleDoc.ts +3 -4
  512. package/src/media/types/HtmlMedia.ts +233 -0
  513. package/src/media/types/IFrame.ts +3 -4
  514. package/src/media/types/Image.ts +87 -9
  515. package/src/media/types/Juxtapose.ts +14 -5
  516. package/src/media/types/SoundCloud.ts +28 -6
  517. package/src/media/types/Text.ts +46 -21
  518. package/src/media/types/Twitter.ts +35 -20
  519. package/src/media/types/Video.ts +9 -79
  520. package/src/media/types/Vimeo.ts +11 -11
  521. package/src/media/types/Website.ts +23 -13
  522. package/src/media/types/Wikipedia.ts +18 -8
  523. package/src/media/types/YouTube.ts +72 -40
  524. package/src/scss/Typography.scss +16 -18
  525. package/src/scss/VCO.StoryMap.scss +208 -12
  526. package/src/scss/Variables.scss +3 -2
  527. package/src/scss/core/Mixins.scss +5 -63
  528. package/src/scss/core/Reset.scss +5 -18
  529. package/src/scss/fonts/font.amatic-andika.scss +3 -0
  530. package/src/scss/fonts/font.bitter-raleway.scss +6 -0
  531. package/src/scss/fonts/font.cairo.scss +79 -0
  532. package/src/scss/fonts/font.clicker-garamond.scss +5 -0
  533. package/src/scss/fonts/font.dancing-ledger.scss +1 -0
  534. package/src/scss/fonts/font.knightlab.scss +14 -0
  535. package/src/scss/fonts/font.oldstandard.scss +6 -0
  536. package/src/scss/fonts/font.opensans-gentiumbook.scss +5 -0
  537. package/src/scss/fonts/font.playfair-faunaone.scss +2 -0
  538. package/src/scss/fonts/font.playfair.scss +4 -0
  539. package/src/scss/fonts/font.pt.scss +6 -0
  540. package/src/scss/fonts/font.ubuntu.scss +4 -0
  541. package/src/scss/fonts/font.unicaone-vollkorn.scss +5 -0
  542. package/src/scss/map/VCO.Map.scss +1 -1
  543. package/src/scss/map/VCO.MapMarker.scss +114 -8
  544. package/src/scss/map/openlayers/VCO.Map.OpenLayers.scss +7 -4
  545. package/src/scss/media/VCO.Media.scss +14 -17
  546. package/src/scss/media/types/VCO.Media.Blockquote.scss +1 -1
  547. package/src/scss/media/types/VCO.Media.Text.scss +13 -5
  548. package/src/scss/media/types/VCO.Media.Twitter.scss +4 -4
  549. package/src/scss/media/types/VCO.Media.Wikipedia.scss +3 -19
  550. package/src/scss/site/site.scss +55 -36
  551. package/src/scss/slider/VCO.Slide.scss +61 -13
  552. package/src/scss/slider/VCO.SlideNav.scss +34 -24
  553. package/src/scss/slider/VCO.StorySlider.scss +53 -1
  554. package/src/scss/snapmap/VCO.SnapMap.scss +3 -3
  555. package/src/scss/ui/VCO.Consent.scss +63 -13
  556. package/src/scss/ui/VCO.Layers.scss +119 -0
  557. package/src/scss/ui/VCO.MenuBar.Button.scss +143 -14
  558. package/src/scss/ui/VCO.MenuBar.scss +9 -2
  559. package/src/scss/ui/VCO.Message.scss +16 -5
  560. package/src/site/site.ts +2 -1
  561. package/src/slider/Slide.ts +326 -74
  562. package/src/slider/SlideNav.ts +54 -9
  563. package/src/slider/StorySlider.ts +352 -60
  564. package/src/storymap/Consent.ts +429 -82
  565. package/src/storymap/StoryMap.ts +2163 -340
  566. package/src/storymap/content-state.ts +180 -0
  567. package/src/storymap/font-css.ts +72 -0
  568. package/src/storymap/from-slideshow.ts +785 -0
  569. package/src/storymap/iiif-shared.ts +228 -0
  570. package/src/storymap/iiif.ts +1742 -95
  571. package/src/storymap/to-iiif.ts +1008 -0
  572. package/src/storymap/validate.ts +80 -7
  573. package/src/types.ts +591 -29
  574. package/src/ui/LayersControl.ts +302 -0
  575. package/src/ui/MenuBar.ts +325 -61
  576. package/src/ui/Message.ts +44 -2
  577. package/src/ui/Swipable.ts +170 -85
  578. package/dist/assets/demo-D6cTmzn6.js +0 -1
  579. package/dist/assets/harness-BPFlzutp.js +0 -1
  580. package/dist/assets/index-DDsPBPZA.js +0 -1
  581. package/dist/assets/main-Y-MYUSJ4.js +0 -17
  582. package/src/animation/morpheus.d.ts +0 -41
  583. package/src/scss/VCO.StoryMap.Dark.scss +0 -138
  584. package/src/scss/Variables.Dark.scss +0 -56
  585. package/src/scss/media/types/VCO.Media.Instagram.scss +0 -7
  586. package/src/scss/media/types/VCO.Media.Profile.scss +0 -5
  587. package/src/ui/Draggable.ts +0 -374
package/CHANGELOG CHANGED
@@ -1,10 +1,385 @@
1
- 1.0.0 (unreleased)
1
+ 0.11.0 (2026-10-07)
2
2
  ------------------------
3
- Viewer-only restructure of the repository:
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 &amp;
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; IIIF Image API replaces Zoomify (breaking: map_type "zoomify" is gone, use "iiif")
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); route
28
- lines pinned above rebuilt tile layers; font_css resolves page-relative;
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)