@projektemacher/storymapjs 0.10.7 → 0.10.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (532) hide show
  1. package/CHANGELOG +350 -19
  2. package/README.md +43 -9
  3. package/dist/assets/demo-DBpeF31K.js +1 -0
  4. package/dist/assets/harness-Cr0rYpvt.js +1 -0
  5. package/dist/assets/harness-multi-CYHgI0a9.js +1 -0
  6. package/dist/assets/harness-support-Do7sIp2j.js +1 -0
  7. package/dist/assets/index-wHPqGrBS.js +1 -0
  8. package/dist/assets/main-DXalctuR.js +17 -0
  9. package/dist/context.json +12 -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 +2 -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 +1604 -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/loadCSS.html +63 -0
  278. package/dist/docs/api/functions/manifestToStorymapData.html +49 -0
  279. package/dist/docs/api/functions/setLanguage.html +54 -0
  280. package/dist/docs/api/functions/storymapToManifest.html +57 -0
  281. package/dist/docs/api/functions/validateStorymap.html +53 -0
  282. package/dist/docs/api/functions/validateStorymapAndReport.html +54 -0
  283. package/dist/docs/api/hierarchy.html +28 -0
  284. package/dist/docs/api/index.html +197 -0
  285. package/dist/docs/api/interfaces/AnimationHandle.html +60 -0
  286. package/dist/docs/api/interfaces/ImagereadyPayload.html +71 -0
  287. package/dist/docs/api/interfaces/LanguageEntry.html +102 -0
  288. package/dist/docs/api/interfaces/LatLngLiteral.html +73 -0
  289. package/dist/docs/api/interfaces/LoadOptions.html +59 -0
  290. package/dist/docs/api/interfaces/OlLayer.html +1400 -0
  291. package/dist/docs/api/interfaces/OlMap.html +1656 -0
  292. package/dist/docs/api/interfaces/OlProjection.html +332 -0
  293. package/dist/docs/api/interfaces/OlSource.html +784 -0
  294. package/dist/docs/api/interfaces/OlTileLayer.html +1497 -0
  295. package/dist/docs/api/interfaces/OlVectorLayer.html +1559 -0
  296. package/dist/docs/api/interfaces/OlView.html +1958 -0
  297. package/dist/docs/api/interfaces/StorymapData.html +71 -0
  298. package/dist/docs/api/interfaces/StorymapDataWrapper.html +60 -0
  299. package/dist/docs/api/interfaces/StorymapDocument.html +68 -0
  300. package/dist/docs/api/interfaces/StorymapError.html +63 -0
  301. package/dist/docs/api/interfaces/StorymapGeoreference.html +93 -0
  302. package/dist/docs/api/interfaces/StorymapGeoreferenceBody.html +74 -0
  303. package/dist/docs/api/interfaces/StorymapGroundControlPoint.html +69 -0
  304. package/dist/docs/api/interfaces/StorymapLanguageMap.html +57 -0
  305. package/dist/docs/api/interfaces/StorymapManifest.html +118 -0
  306. package/dist/docs/api/interfaces/StorymapManifestAnnotation.html +105 -0
  307. package/dist/docs/api/interfaces/StorymapManifestBackground.html +81 -0
  308. package/dist/docs/api/interfaces/StorymapManifestCanvas.html +140 -0
  309. package/dist/docs/api/interfaces/StorymapManifestContentResource.html +97 -0
  310. package/dist/docs/api/interfaces/StorymapManifestFeatureCollection.html +82 -0
  311. package/dist/docs/api/interfaces/StorymapManifestGeoreferencing.html +87 -0
  312. package/dist/docs/api/interfaces/StorymapManifestImageService.html +69 -0
  313. package/dist/docs/api/interfaces/StorymapManifestRange.html +75 -0
  314. package/dist/docs/api/interfaces/StorymapManifestService.html +77 -0
  315. package/dist/docs/api/interfaces/StorymapManifestSpecificResource.html +69 -0
  316. package/dist/docs/api/interfaces/StorymapManifestStatement.html +63 -0
  317. package/dist/docs/api/interfaces/StorymapMapOptions.html +92 -0
  318. package/dist/docs/api/interfaces/StorymapOptions.html +532 -0
  319. package/dist/docs/api/interfaces/StorymapOverlayLayer.html +126 -0
  320. package/dist/docs/api/interfaces/StorymapSlide.html +132 -0
  321. package/dist/docs/api/interfaces/StorymapSlideBackground.html +72 -0
  322. package/dist/docs/api/interfaces/StorymapSlideLocation.html +117 -0
  323. package/dist/docs/api/interfaces/StorymapSlideMarker.html +104 -0
  324. package/dist/docs/api/interfaces/StorymapSlideMedia.html +110 -0
  325. package/dist/docs/api/interfaces/StorymapSlideNarration.html +65 -0
  326. package/dist/docs/api/interfaces/StorymapSlideText.html +72 -0
  327. package/dist/docs/api/interfaces/StorymapTilejson.html +105 -0
  328. package/dist/docs/api/media/es.json +31 -0
  329. package/dist/docs/api/media/migration-from-knightlab.md +359 -0
  330. package/dist/docs/api/modules.html +50 -0
  331. package/dist/docs/api/types/ContentState.html +70 -0
  332. package/dist/docs/api/types/ImagereadyKind.html +34 -0
  333. package/dist/docs/api/types/MediaTypeMatch.html +78 -0
  334. package/dist/docs/api/types/TileSourceFactory.html +53 -0
  335. package/dist/docs/authoring.html +293 -0
  336. package/dist/docs/iiif.html +617 -62
  337. package/dist/docs/migration.html +313 -11
  338. package/dist/docs/readme.html +40 -9
  339. package/dist/embed/index.html +1 -1
  340. package/dist/examples/issue-242-nonlatin.json +55 -0
  341. package/dist/examples/issue-305-start-at-slide-data.json +96 -0
  342. package/dist/examples/issue-358-iframe.json +57 -0
  343. package/dist/examples/issue-iiif-geo.json +32 -0
  344. package/dist/examples/issue-image-alt.json +23 -0
  345. package/dist/examples/issue-image-region.json +42 -0
  346. package/dist/examples/issue-image-srcset.json +24 -0
  347. package/dist/examples/map-area-overlays.json +68 -0
  348. package/dist/examples/no-map.json +44 -0
  349. package/dist/examples-iiif/annotated-image.json +188 -0
  350. package/dist/examples-iiif/bob-boilen.json +11 -5
  351. package/dist/examples-iiif/courbet.json +9 -6
  352. package/dist/examples-iiif/empty.json +8 -4
  353. package/dist/examples-iiif/flickr-drewvigal.json +248 -24
  354. package/dist/examples-iiif/flickr-zach.wise.json +8 -4
  355. package/dist/examples-iiif/georeferenced-layer-unsupported.json +153 -0
  356. package/dist/examples-iiif/georeferenced-layer.json +318 -0
  357. package/dist/examples-iiif/iiif-wellcome.json +9 -6
  358. package/dist/examples-iiif/instagram-chenpamela.json +381 -36
  359. package/dist/examples-iiif/instagram_brentfoster.json +429 -40
  360. package/dist/examples-iiif/instagram_couch.json +261 -26
  361. package/dist/examples-iiif/instagram_joegermuska.json +441 -41
  362. package/dist/examples-iiif/instagram_matteich.json +261 -26
  363. package/dist/examples-iiif/instagram_mirandamulligan.json +261 -26
  364. package/dist/examples-iiif/instagram_raymondmccrea.json +261 -26
  365. package/dist/examples-iiif/instagram_test.json +261 -26
  366. package/dist/examples-iiif/issue-134-no-lines.json +9 -5
  367. package/dist/examples-iiif/issue-177-color-vars.json +9 -5
  368. package/dist/examples-iiif/issue-211-rtl.json +9 -5
  369. package/dist/examples-iiif/issue-242-nonlatin.json +239 -0
  370. package/dist/examples-iiif/issue-272-facebook.json +9 -5
  371. package/dist/examples-iiif/issue-305-start-at-slide-data.json +305 -0
  372. package/dist/examples-iiif/issue-305-start-at-slide.json +9 -5
  373. package/dist/examples-iiif/issue-341-distance.json +9 -5
  374. package/dist/examples-iiif/issue-358-iframe.json +190 -0
  375. package/dist/examples-iiif/issue-360-juxtapose.json +22 -7
  376. package/dist/examples-iiif/issue-368-null-fields.json +9 -5
  377. package/dist/examples-iiif/issue-375-code-lists.json +9 -5
  378. package/dist/examples-iiif/issue-381-dateline.json +9 -5
  379. package/dist/examples-iiif/issue-405-custom-icon.json +203 -0
  380. package/dist/examples-iiif/issue-425-many-slides.json +9 -5
  381. package/dist/examples-iiif/issue-428-background.json +20 -8
  382. package/dist/examples-iiif/issue-435-googlemaps.json +9 -5
  383. package/dist/examples-iiif/issue-437-documentcloud.json +22 -7
  384. package/dist/examples-iiif/issue-451-webp.json +9 -5
  385. package/dist/examples-iiif/issue-455-audio.json +9 -5
  386. package/dist/examples-iiif/issue-480-shorts.json +9 -5
  387. package/dist/examples-iiif/issue-506-marker-sync.json +9 -5
  388. package/dist/examples-iiif/issue-iiif-geo.json +200 -0
  389. package/dist/examples-iiif/issue-image-alt.json +90 -0
  390. package/dist/examples-iiif/issue-image-region.json +203 -0
  391. package/dist/examples-iiif/issue-image-srcset.json +87 -0
  392. package/dist/examples-iiif/jansteen.json +9 -6
  393. package/dist/examples-iiif/katrina.json +197 -41
  394. package/dist/examples-iiif/map-area-overlays.json +289 -0
  395. package/dist/examples-iiif/marktwain.json +255 -58
  396. package/dist/examples-iiif/no-map.json +148 -0
  397. package/dist/examples-iiif/population.json +440 -76
  398. package/dist/examples-iiif/president.json +456 -83
  399. package/dist/examples-iiif/scroll-hint.json +190 -0
  400. package/dist/examples-iiif/seurat.json +113 -22
  401. package/dist/examples-iiif/zoomify-clamp.json +153 -0
  402. package/dist/harness-multi.html +17 -0
  403. package/dist/harness.html +3 -2
  404. package/dist/index.html +16 -10
  405. package/dist/js/storymap.d.ts +1439 -114
  406. package/dist/js/storymap.js +24654 -21936
  407. package/dist/js/storymap.js.map +1 -1
  408. package/dist/navplace-properties.json +40 -0
  409. package/docs/migration-from-knightlab.md +229 -9
  410. package/docs/storymap-as-iiif-manifest.md +559 -135
  411. package/package.json +11 -8
  412. package/schema/storymap.schema.json +431 -78
  413. package/src/animation/easings.ts +8 -1
  414. package/src/animation/tween.ts +186 -0
  415. package/src/core/Browser.ts +6 -5
  416. package/src/core/Load.ts +54 -2
  417. package/src/core/Util.ts +255 -193
  418. package/src/core/mixins.ts +24 -7
  419. package/src/core/viewers.ts +94 -0
  420. package/src/dom/DomEvent.ts +27 -8
  421. package/src/globals.d.ts +8 -0
  422. package/src/language/Language.ts +199 -25
  423. package/src/language/locale/.expected-gaps.json +86 -0
  424. package/src/language/locale/be.json +15 -2
  425. package/src/language/locale/bg.json +15 -2
  426. package/src/language/locale/cs.json +15 -2
  427. package/src/language/locale/de.json +12 -1
  428. package/src/language/locale/el.json +15 -2
  429. package/src/language/locale/en.json +6 -2
  430. package/src/language/locale/es.json +15 -2
  431. package/src/language/locale/et.json +5 -1
  432. package/src/language/locale/fr.json +15 -2
  433. package/src/language/locale/he.json +16 -3
  434. package/src/language/locale/hu.json +15 -2
  435. package/src/language/locale/is.json +5 -1
  436. package/src/language/locale/it.json +15 -2
  437. package/src/language/locale/jp.json +15 -2
  438. package/src/language/locale/ko.json +15 -2
  439. package/src/language/locale/nl.json +15 -2
  440. package/src/language/locale/nn.json +5 -1
  441. package/src/language/locale/no.json +15 -2
  442. package/src/language/locale/pl.json +15 -2
  443. package/src/language/locale/pt.json +15 -2
  444. package/src/language/locale/ru.json +15 -2
  445. package/src/language/locale/sk.json +15 -2
  446. package/src/language/locale/sr.json +5 -1
  447. package/src/language/locale/sv.json +15 -2
  448. package/src/language/locale/tr.json +15 -2
  449. package/src/language/locale/uk.json +15 -2
  450. package/src/language/locale/ur.json +5 -1
  451. package/src/language/locale/zh-cn.json +15 -2
  452. package/src/language/locale/zh-tw.json +15 -2
  453. package/src/main.ts +92 -0
  454. package/src/map/Map.ts +183 -106
  455. package/src/map/MapMarker.ts +28 -5
  456. package/src/map/georeference.ts +325 -0
  457. package/src/map/openlayers/Map.OpenLayers.ts +850 -237
  458. package/src/map/openlayers/MapMarker.OpenLayers.ts +248 -24
  459. package/src/map/openlayers/zoomifyTiles.ts +1 -4
  460. package/src/media/EmbedUtil.ts +308 -24
  461. package/src/media/Media.ts +243 -55
  462. package/src/media/embedId.ts +104 -0
  463. package/src/media/types/Audio.ts +9 -82
  464. package/src/media/types/Blockquote.ts +2 -3
  465. package/src/media/types/DailyMotion.ts +5 -10
  466. package/src/media/types/DocumentCloud.ts +6 -35
  467. package/src/media/types/Facebook.ts +3 -4
  468. package/src/media/types/Flickr.ts +9 -9
  469. package/src/media/types/GoogleDoc.ts +3 -4
  470. package/src/media/types/HtmlMedia.ts +167 -0
  471. package/src/media/types/IFrame.ts +3 -4
  472. package/src/media/types/Image.ts +72 -6
  473. package/src/media/types/Juxtapose.ts +14 -5
  474. package/src/media/types/SoundCloud.ts +28 -6
  475. package/src/media/types/Text.ts +19 -13
  476. package/src/media/types/Twitter.ts +27 -14
  477. package/src/media/types/Video.ts +9 -79
  478. package/src/media/types/Vimeo.ts +10 -10
  479. package/src/media/types/Website.ts +23 -13
  480. package/src/media/types/Wikipedia.ts +18 -8
  481. package/src/media/types/YouTube.ts +71 -39
  482. package/src/scss/Typography.scss +1 -3
  483. package/src/scss/VCO.StoryMap.Dark.scss +18 -6
  484. package/src/scss/VCO.StoryMap.scss +37 -6
  485. package/src/scss/Variables.Dark.scss +3 -2
  486. package/src/scss/Variables.scss +3 -2
  487. package/src/scss/core/Mixins.scss +5 -63
  488. package/src/scss/fonts/font.amatic-andika.scss +3 -0
  489. package/src/scss/fonts/font.bitter-raleway.scss +6 -0
  490. package/src/scss/fonts/font.cairo.scss +79 -0
  491. package/src/scss/fonts/font.clicker-garamond.scss +5 -0
  492. package/src/scss/fonts/font.dancing-ledger.scss +1 -0
  493. package/src/scss/fonts/font.knightlab.scss +14 -0
  494. package/src/scss/fonts/font.oldstandard.scss +6 -0
  495. package/src/scss/fonts/font.opensans-gentiumbook.scss +5 -0
  496. package/src/scss/fonts/font.playfair-faunaone.scss +2 -0
  497. package/src/scss/fonts/font.playfair.scss +4 -0
  498. package/src/scss/fonts/font.pt.scss +6 -0
  499. package/src/scss/fonts/font.ubuntu.scss +4 -0
  500. package/src/scss/fonts/font.unicaone-vollkorn.scss +5 -0
  501. package/src/scss/map/VCO.MapMarker.scss +98 -3
  502. package/src/scss/media/VCO.Media.scss +7 -10
  503. package/src/scss/media/types/VCO.Media.Text.scss +8 -0
  504. package/src/scss/media/types/VCO.Media.Wikipedia.scss +2 -1
  505. package/src/scss/slider/VCO.Slide.scss +13 -3
  506. package/src/scss/slider/VCO.SlideNav.scss +11 -17
  507. package/src/scss/slider/VCO.StorySlider.scss +4 -2
  508. package/src/scss/ui/VCO.Consent.scss +44 -0
  509. package/src/scss/ui/VCO.MenuBar.Button.scss +8 -0
  510. package/src/scss/ui/VCO.Message.scss +2 -5
  511. package/src/site/site.ts +2 -1
  512. package/src/slider/Slide.ts +121 -27
  513. package/src/slider/SlideNav.ts +39 -5
  514. package/src/slider/StorySlider.ts +153 -42
  515. package/src/storymap/Consent.ts +407 -82
  516. package/src/storymap/StoryMap.ts +1192 -182
  517. package/src/storymap/content-state.ts +185 -0
  518. package/src/storymap/iiif.ts +1526 -68
  519. package/src/storymap/to-iiif.ts +921 -0
  520. package/src/storymap/validate.ts +80 -7
  521. package/src/types.ts +223 -26
  522. package/src/ui/MenuBar.ts +98 -45
  523. package/src/ui/Message.ts +9 -0
  524. package/src/ui/Swipable.ts +145 -78
  525. package/dist/assets/demo-D6cTmzn6.js +0 -1
  526. package/dist/assets/harness-BPFlzutp.js +0 -1
  527. package/dist/assets/index-DDsPBPZA.js +0 -1
  528. package/dist/assets/main-Y-MYUSJ4.js +0 -17
  529. package/src/animation/morpheus.d.ts +0 -41
  530. package/src/scss/media/types/VCO.Media.Instagram.scss +0 -7
  531. package/src/scss/media/types/VCO.Media.Profile.scss +0 -5
  532. package/src/ui/Draggable.ts +0 -374
@@ -36,6 +36,7 @@
36
36
  <li><a class="button" href="./readme.html">README</a></li>
37
37
  <li><a class="button" href="./migration.html">Migration guide</a></li>
38
38
  <li><a class="button" href="./iiif.html">IIIF docs</a></li>
39
+ <li><a class="button" href="./authoring.html">Authoring</a></li>
39
40
  <li><a class="button" href="./api/index.html">API docs</a></li>
40
41
  <li><a class="button" href="../index.html#help">Help</a></li>
41
42
  </ul>
@@ -154,6 +155,34 @@ are rendered wider with a visible track for contrast.</li>
154
155
  <td>paths now resolve against the page URL (not the library location), plus the font files ship via <code>@fontsource-utils/scss</code>; no separate font CSS link needed</td>
155
156
  </tr>
156
157
  </tbody></table>
158
+ <h2>A story with no map</h2>
159
+ <p><code>map_type: &quot;none&quot;</code> runs the storymap as text and media only. Nothing is
160
+ constructed: no <code>ol/Map</code>, no tile layer, no tile consent row, and the overview
161
+ control is hidden. The slider panel takes the full width, because there is no
162
+ map behind it to fade over.</p>
163
+ <p>This is the shape a photo essay or a transcript-led story wants, and it is the
164
+ one the map engine&#39;s unconditional construction used to make impossible. Note
165
+ that <code>map_type: &quot;&quot;</code> and an absent <code>map_type</code> both still mean OpenStreetMap, and
166
+ <code>map_type: null</code> now falls back to that default instead of throwing out of the
167
+ constructor — absence is not reinterpreted, so no existing document changes
168
+ meaning. Map-derived accessors (<code>getBaseLayer()</code>, <code>getMarkers()</code>, …) return
169
+ their neutral values, and the map setters are no-ops.</p>
170
+ <table>
171
+ <thead>
172
+ <tr>
173
+ <th>Old</th>
174
+ <th>New</th>
175
+ </tr>
176
+ </thead>
177
+ <tbody><tr>
178
+ <td>a text-only story with a dummy <code>map_type</code></td>
179
+ <td><code>map_type: &quot;none&quot;</code></td>
180
+ </tr>
181
+ <tr>
182
+ <td><code>map_type: null</code> (crashed the constructor)</td>
183
+ <td>normalised to the default, <code>&quot;&quot;</code> → OSM</td>
184
+ </tr>
185
+ </tbody></table>
157
186
  <h2>Removed globals and exports</h2>
158
187
  <table>
159
188
  <thead>
@@ -197,7 +226,7 @@ are rendered wider with a visible track for contrast.</li>
197
226
  </thead>
198
227
  <tbody><tr>
199
228
  <td><code>vine</code> media type (service shut down)</td>
200
- <td>vine URLs fall back to the <code>website</code> iframe — use another media source for those slides</td>
229
+ <td>vine URLs fall back to the <code>website</code> iframe — or paste the provider&#39;s <code>&lt;iframe&gt;</code> snippet into the slide text (sanitized, https-only); use another media source for those slides</td>
201
230
  </tr>
202
231
  <tr>
203
232
  <td>Juxtapose <code>frame/?uid=</code> embed URLs</td>
@@ -207,7 +236,25 @@ are rendered wider with a visible track for contrast.</li>
207
236
  <td>Twitter <code>@nickname</code> rendering</td>
208
237
  <td>tweets from <code>x.com</code> URLs are now parsed too (fixes <code>@undefined</code> nicknames); no migration needed</td>
209
238
  </tr>
239
+ <tr>
240
+ <td>Ricoh360/theta360 embeds (#391)</td>
241
+ <td>service no longer available (won&#39;t fix) — paste the provider&#39;s <code>&lt;iframe&gt;</code> snippet into the slide text if the service returns</td>
242
+ </tr>
210
243
  </tbody></table>
244
+ <p>Extra media per slide (#358, partial): each slide still has one primary
245
+ <code>media</code> item, but an <code>&lt;iframe&gt;</code> embed snippet pasted into the slide <code>text</code>
246
+ field now renders sanitized (scripts, event handlers and non-https sources
247
+ dropped) — use this for a second video/map/embed or as the migration path
248
+ for removed media types:</p>
249
+ <pre><code class="language-html">&lt;p&gt;Extra footage:&lt;/p&gt;
250
+ &lt;iframe
251
+ src=&quot;https://example.com/embed/123&quot;
252
+ width=&quot;560&quot;
253
+ height=&quot;315&quot;
254
+ frameborder=&quot;0&quot;
255
+ allowfullscreen
256
+ &gt;&lt;/iframe&gt;
257
+ </code></pre>
211
258
  <p><code>map_type: &quot;zoomify&quot;</code> is supported again (legacy): the image pyramid renders
212
259
  via the storymap data&#39;s <code>zoomify</code> options (<code>path</code>, <code>width</code>, <code>height</code>), using a
213
260
  JS warning instead of the previous removal error. Cropped edge/remainder tiles
@@ -219,29 +266,284 @@ storymap JSON sources.</p>
219
266
  <h2>Map engine: Leaflet → OpenLayers</h2>
220
267
  <ul>
221
268
  <li><code>storymap.map</code> now exposes the <strong>OpenLayers <code>Map</code></strong> instance instead of a
222
- Leaflet map. Port any direct Leaflet calls (e.g. <code>setView</code>, <code>flyTo</code>) to the
223
- OpenLayers API (<code>getView().animate(...)</code>, ...).</li>
269
+ Leaflet map. Port any direct Leaflet calls to the OpenLayers API (table
270
+ below). It is <code>null</code> until the map has been built.</li>
224
271
  <li>Markers are DOM overlays (<code>.vco-mapmarker</code> / <code>.vco-mapmarker-active</code>) like
225
272
  before; the mini map is an OpenLayers <code>OverviewMap</code> control.</li>
226
273
  <li>New basemap options: vector styles via <code>map_type: &quot;osm:&lt;style&gt;&quot;</code> (OpenFreeMap)
227
274
  or a Mapbox style JSON URL.</li>
275
+ <li>All OL types (<code>Map</code>, <code>View</code>, <code>Layer</code>, <code>Source</code>, <code>Feature</code>, ...) are
276
+ re-exported, so a consumer can type its own overlays without depending on
277
+ <code>ol</code> directly.</li>
228
278
  </ul>
279
+ <h3>Direct Leaflet calls → OpenLayers</h3>
280
+ <p>Both maps are reachable from the same place (<code>storymap.map</code>), so only the
281
+ call syntax changes:</p>
282
+ <table>
283
+ <thead>
284
+ <tr>
285
+ <th>Leaflet</th>
286
+ <th>OpenLayers</th>
287
+ </tr>
288
+ </thead>
289
+ <tbody><tr>
290
+ <td><code>map.getCenter()</code></td>
291
+ <td><code>map.getView().getCenter()</code> — panel-shifted, see below</td>
292
+ </tr>
293
+ <tr>
294
+ <td><code>map.getZoom()</code></td>
295
+ <td><code>map.getView().getZoom()</code></td>
296
+ </tr>
297
+ <tr>
298
+ <td><code>map.setView(c, z)</code> / <code>map.fitBounds(b)</code></td>
299
+ <td><code>map.getView().fit(extent, { size: map.getSize() })</code></td>
300
+ </tr>
301
+ <tr>
302
+ <td><code>map.panTo(c)</code> / <code>map.flyTo(c, z)</code></td>
303
+ <td><code>map.getView().animate({ center: c, duration: 300 })</code></td>
304
+ </tr>
305
+ <tr>
306
+ <td><code>map.setZoom(z)</code></td>
307
+ <td><code>map.getView().setZoom(z)</code> (or <code>.animate({ zoom: z })</code>)</td>
308
+ </tr>
309
+ <tr>
310
+ <td><code>map.getSize()</code> / <code>map.getBounds()</code></td>
311
+ <td><code>map.getSize()</code> / <code>map.getView().calculateExtent(map.getSize())</code></td>
312
+ </tr>
313
+ <tr>
314
+ <td><code>map.on(&quot;moveend&quot;, fn)</code></td>
315
+ <td><code>map.on(&quot;moveend&quot;, fn)</code> (same event names; <code>movestart</code>/<code>move</code> also exist)</td>
316
+ </tr>
317
+ <tr>
318
+ <td><code>L.tileLayer(url, opts).addTo(map)</code></td>
319
+ <td><code>new TileLayer({ source: new XYZ({ url, attributions }) }).setMap(map)</code></td>
320
+ </tr>
321
+ <tr>
322
+ <td><code>L.control.attribution</code> / <code>L.control.zoom</code></td>
323
+ <td>OL <code>Attribution</code> / <code>Zoom</code> controls (pass them via <code>map_options.controls</code>)</td>
324
+ </tr>
325
+ <tr>
326
+ <td><code>map.getPane(&quot;overlayPane&quot;)</code></td>
327
+ <td><code>map.getOverlayContainer()</code> (markers are DOM siblings, not OL features)</td>
328
+ </tr>
329
+ <tr>
330
+ <td><code>map.invalidateSize()</code></td>
331
+ <td><code>map.updateSize()</code></td>
332
+ </tr>
333
+ <tr>
334
+ <td><code>map.remove()</code></td>
335
+ <td><code>map.setTarget(undefined); map.dispose();</code> (or <code>storymap.dispose()</code>)</td>
336
+ </tr>
337
+ </tbody></table>
338
+ <p>The exposed center is deliberately panel-shifted: in landscape the view is
339
+ offset so the visible map sits left of the slide panel, which means
340
+ <code>getView().getCenter()</code> does <strong>not</strong> equal the current slide&#39;s location.
341
+ That is a display concern, not a data one — read the location from the
342
+ slide, not from the view. There is intentionally no offset-aware getter;
343
+ an earlier <code>_getMapCenter(offset)</code> parameter promised that correction and
344
+ never applied it, so it was removed rather than left to mislead.
345
+ | <code>map.options.crs</code> / <code>map.getPixelOrigin()</code> | <code>map.getView().getProjection()</code> / <code>map.getPixelFromCoordinate(coord)</code> |</p>
346
+ <p>Marker positions are still DOM elements, so <code>marker.getLatLng()</code> has no
347
+ equivalent — read the slide data (<code>storymap.data.stlides[n].location</code>) or use
348
+ <code>storymap._map.getMarker(n).latLon()</code>.</p>
349
+ <h3>Map and marker methods</h3>
350
+ <p>The map/marker methods of the original viewer are still there with the same
351
+ names and behaviour (<code>storymap._map.&lt;method&gt;()</code>, <code>marker.&lt;method&gt;()</code>); the OL
352
+ engine implements them as thin wrappers over <code>storymap.map</code>. Two methods are
353
+ deprecated no-ops and one is gone:</p>
354
+ <table>
355
+ <thead>
356
+ <tr>
357
+ <th>Original method</th>
358
+ <th>Status</th>
359
+ </tr>
360
+ </thead>
361
+ <tbody><tr>
362
+ <td><code>updateDisplay</code>, <code>goTo</code>, <code>panTo</code>, <code>zoomTo</code>, <code>viewTo</code></td>
363
+ <td>unchanged</td>
364
+ </tr>
365
+ <tr>
366
+ <td><code>getBoundsZoom</code>, <code>markerOverview</code>, <code>calculateMarkerZooms</code></td>
367
+ <td>unchanged (<code>getBoundsZoom()</code> now returns <code>number | undefined</code> instead of a falsy value)</td>
368
+ </tr>
369
+ <tr>
370
+ <td><code>createMiniMap</code>, <code>createMarkers</code>, <code>createMarker</code></td>
371
+ <td>unchanged</td>
372
+ </tr>
373
+ <tr>
374
+ <td><code>setMapOffset</code>, <code>calculateMinMaxZoom</code>, <code>updateMinMaxZoom</code>, <code>initialMapLocation</code></td>
375
+ <td>unchanged</td>
376
+ </tr>
377
+ <tr>
378
+ <td><code>show()</code> / <code>hide()</code> (map and marker)</td>
379
+ <td><strong>deprecated no-ops</strong> — they were already empty in the original viewer. Style <code>.vco-mapmarker</code> or use <code>marker.active(false)</code></td>
380
+ </tr>
381
+ <tr>
382
+ <td><code>map.addTo(container)</code> / <code>map.removeFrom(container)</code></td>
383
+ <td>unchanged — inherited from the <code>DomMixed</code> mixin: append/remove the map container and fire <code>added</code>/<code>removed</code>. The engine override re-targets and re-measures the OpenLayers viewport, so a move into a differently sized parent works</td>
384
+ </tr>
385
+ <tr>
386
+ <td><code>marker.createPopup()</code></td>
387
+ <td><strong>deprecated no-op</strong> — it never did anything upstream either (empty base body, commented-out Leaflet body), so the <code>map_popup</code> option that called it had no effect. Still accepted, still inert</td>
388
+ </tr>
389
+ <tr>
390
+ <td><code>marker.addTo()</code>, <code>marker.removeFrom()</code>, <code>marker.updateDisplay()</code>, <code>marker.active()</code>, <code>marker.location()</code></td>
391
+ <td>unchanged</td>
392
+ </tr>
393
+ </tbody></table>
394
+ <p>Marker helpers that Leaflet provided on the marker object (<code>getLatLng</code>,
395
+ <code>setIcon</code>, <code>bindPopup</code>) are gone; use <code>marker.latLon()</code>, the
396
+ <code>.vco-mapmarker</code> element and your own DOM/CSS.</p>
397
+ <h2>Reaching the map, layers and markers</h2>
398
+ <p><code>storymap.map</code> is the raw <code>ol/Map</code> (typed as <code>OlMap | null</code> — it is set during
399
+ construction, so check it before first use in an async setup). Everything the
400
+ viewer keeps internally is available through accessors on <code>storymap</code> (and on
401
+ <code>storymap._map</code> for the engine methods):</p>
402
+ <table>
403
+ <thead>
404
+ <tr>
405
+ <th>Accessor</th>
406
+ <th>Returns</th>
407
+ </tr>
408
+ </thead>
409
+ <tbody><tr>
410
+ <td><code>getBaseLayer()</code></td>
411
+ <td>the base tile/vector layer</td>
412
+ </tr>
413
+ <tr>
414
+ <td><code>getOverlayLayers()</code> / <code>getOverlayLayer(i)</code></td>
415
+ <td>overlay layers / one by index (<code>null</code> if out of range)</td>
416
+ </tr>
417
+ <tr>
418
+ <td><code>getOverlayCount()</code></td>
419
+ <td>number of overlays</td>
420
+ </tr>
421
+ <tr>
422
+ <td><code>setOverlayVisible(i, on)</code> / <code>setOverlayOpacity(i, opacity)</code></td>
423
+ <td>show/hide and fade one overlay</td>
424
+ </tr>
425
+ <tr>
426
+ <td><code>getMinimap()</code></td>
427
+ <td>the <code>OverviewMap</code> control, or its inner map via <code>getOverviewMap()</code></td>
428
+ </tr>
429
+ <tr>
430
+ <td><code>getLine()</code> / <code>getLineActive()</code></td>
431
+ <td>the full and the travelled route <code>VectorLayer</code></td>
432
+ </tr>
433
+ <tr>
434
+ <td><code>getMarker(n)</code> / <code>getMarkers()</code></td>
435
+ <td>one marker or all of them, in slide order</td>
436
+ </tr>
437
+ <tr>
438
+ <td><code>setExtraAttributions(html)</code></td>
439
+ <td>extra attribution HTML, listed after the source credits</td>
440
+ </tr>
441
+ <tr>
442
+ <td><code>isImageSpace()</code></td>
443
+ <td>whether the map is a IIIF image in image space (see below)</td>
444
+ </tr>
445
+ </tbody></table>
446
+ <p><code>tile_source_factory</code> may return a full <code>ol/layer/Layer</code> (not just a source)
447
+ anywhere a layer is built, so custom layers can carry their own opacity,
448
+ z-index and events. A custom layer without a source (Allmaps&#39;
449
+ <code>WarpedMapLayer</code>) passes through untouched; source reads go through a
450
+ capability check, so it simply skips the tile-grid fits.</p>
451
+ <p>The viewer reserves three z-index ranges and custom layers should stay out
452
+ of them: <strong>0</strong> for the base tiles, <strong>1..n</strong> for the stacked <code>overlays[]</code>
453
+ entries in order, and <strong>10/11</strong> for the full and travelled route lines. A
454
+ custom layer with no explicit z-index lands wherever OpenLayers puts it,
455
+ which is above the lines — set one explicitly if the layer must sit inside
456
+ the stack.</p>
457
+ <h3>Image space vs. georeferenced</h3>
458
+ <p><code>map_type: &quot;iiif&quot;</code> is a mercator map by default. With <code>map_as_image: true</code> the
459
+ image <em>is</em> the map: the view projection becomes <code>EPSG:4326</code>, the view is
460
+ fitted to the image extent and marker locations are pixel offsets into the
461
+ image rather than lat/lon. Ask <code>storymap.isImageSpace()</code> instead of testing
462
+ <code>map_type</code> — georeferenced IIIF (a manifest with <code>navPlace</code> regions) is an
463
+ ordinary mercator map, and <code>map_bbox</code> with a georeferenced layer is one too.</p>
464
+ <h3>Knowing when the imagery is there</h3>
465
+ <p>Tile and image sources attach asynchronously, so <code>loaded</code> can fire before the
466
+ imagery exists. Listen for <code>imageready</code>, which fires once a source is ready and
467
+ carries <code>{ source, kind, layer }</code> (<code>kind</code> is <code>&quot;iiif&quot;</code>, <code>&quot;zoomify&quot;</code> or
468
+ <code>&quot;tiles&quot;</code>); it is re-fired on the <code>storymap</code> as well:</p>
469
+ <pre><code class="language-js">storymap.on(&quot;imageready&quot;, ({ kind, source }) =&gt; {
470
+ console.log(&quot;imagery ready&quot;, kind, source);
471
+ });
472
+ </code></pre>
473
+ <h3>Tearing a storymap down</h3>
474
+ <p>Call <code>storymap.dispose()</code> when the embedding view goes away (SPA route change,
475
+ dialog close). It clears the timers and the resize observer, removes the
476
+ <code>window</code>/<code>document</code> listeners, cancels running slide animations, disposes the
477
+ slider and the OpenLayers map, and sets <code>storymap.map</code> to <code>null</code>. Calling it
478
+ twice is safe; the instance is unusable afterwards.</p>
479
+ <h2>Custom map providers</h2>
480
+ <p>Any slippy-map tile URL works as <code>map_type</code> — pass the template verbatim
481
+ (including <code>{z}/{x}/{y}</code>), relative or absolute:</p>
482
+ <pre><code class="language-js">new StoryMap(&quot;embed&quot;, data, {
483
+ map_type: &quot;https://tiles.example.org/base/{z}/{x}/{y}.png&quot;,
484
+ });
485
+ </code></pre>
486
+ <p>Mapbox style JSON URLs render as vector tile layers; OpenLayers
487
+ <code>Map</code>/<code>View</code> pass-through stays available via <code>options.map_options</code>
488
+ (<code>controls</code> replaces the defaults, <code>interactions</code> are added to the
489
+ viewer&#39;s own pan/zoom set, <code>view</code> merges over the computed default).</p>
490
+ <p>For source classes the templates cannot express (WMS, authenticated or
491
+ gridded sources), use the <code>tile_source_factory</code> option. It is consulted
492
+ for every base, overlay and minimap layer before the built-in
493
+ <code>map_type</code> handling — return a <code>TileLayer</code> (or a bare <code>Source</code>, which
494
+ is wrapped in one), or <code>null</code>/<code>undefined</code> to fall through:</p>
495
+ <pre><code class="language-js">import TileLayer from &quot;ol/layer/Tile&quot;;
496
+ import TileWMS from &quot;ol/source/TileWMS&quot;;
497
+
498
+ new StoryMap(&quot;embed&quot;, data, {
499
+ map_type: &quot;wms:flood&quot;,
500
+ tile_source_factory: (map_type, { createDefault }) =&gt;
501
+ map_type.startsWith(&quot;wms:&quot;)
502
+ ? new TileLayer({
503
+ source: new TileWMS({
504
+ url: &quot;https://geoserver.example.org/wms&quot;,
505
+ params: { LAYERS: map_type.slice(4) },
506
+ crossOrigin: &quot;anonymous&quot;,
507
+ }),
508
+ })
509
+ : createDefault(),
510
+ });
511
+ </code></pre>
512
+ <p>Custom sources must carry their own attributions (via the returned
513
+ source or the <code>attribution</code> option) — only the built-in <code>osm*</code> types
514
+ are credited automatically. <code>tile_source_factory</code> is constructor- and
515
+ runtime-only (functions cannot ride storymap JSON) and also applies to
516
+ <code>overlays[]</code> entries, whose <code>map_type</code> values go through the same
517
+ factory.</p>
229
518
  <h2>Data and tooling</h2>
230
519
  <ul>
231
520
  <li>Storymap JSON is now validated against a JSON Schema
232
521
  (<code>schema/storymap.schema.json</code>); invalid documents are reported to the
233
522
  console at load time.</li>
234
- <li>IIIF Presentation 3 manifests are accepted directly as storymap sources.</li>
235
- <li>The StoryMap IIIF extension context changed to
236
- <code>https://christianmahnke.de/iiif/storymap</code> — manifests produced with the old
237
- <code>https://example.org/ns/storymap/v1</code> context need re-converting
238
- (<code>scripts/convert-to-iiif.mjs</code>).</li>
523
+ <li>IIIF Presentation 3 manifests are accepted directly as storymap sources.
524
+ The map settings map onto <code>storymap:</code> terms of a map configuration service
525
+ (IIIF has no basemap or tile-layer vocabulary of its own), and the
526
+ geospatial parts use the native extensions where they exist: <code>navPlace</code>
527
+ Points for slide locations, a <code>navPlace</code> Polygon for the story extent
528
+ (<code>map_bbox</code>), an IIIF Image API Selector for <code>location.region</code>, and the
529
+ Georeference Extension for placed rasters. A georeferenced layer is
530
+ manifest-only (the legacy format cannot express ground control points); see
531
+ <a href="./iiif.html#geo-referenced-layers">docs/storymap-as-iiif-manifest.md</a>.</li>
239
532
  <li>The editor, staging/backend infrastructure, AWS/GitHub hosting scripts and the
240
533
  Python authoring server are gone — this is a viewer-only library.</li>
241
534
  </ul>
242
- <h2>Events (unchanged)</h2>
243
- <p><code>change</code> (with <code>current_slide</code>), <code>loaded</code>, <code>title</code>, <code>dataloaded</code>,
244
- <code>fontLoaded</code>, plus the listener map in the constructor — all work as before.</p>
535
+ <h2>Events (unchanged, plus two new ones)</h2>
536
+ <p><code>change</code> (with <code>current_slide</code>, and now also <code>current_id</code> — the slide&#39;s
537
+ <code>uniqueid</code>, for deep-linking), <code>loaded</code>, <code>title</code>, <code>dataloaded</code>,
538
+ <code>fontLoaded</code>, plus the listener map in the constructor — all work as before.
539
+ <code>markerAdded</code>/<code>markerRemoved</code> still fire on the map object, and <code>imageready</code>
540
+ is new (see above).</p>
541
+ <p>Two additions for IIIF tours: <code>await storymap.loadAnnotations()</code> fetches a
542
+ manifest&#39;s externally referenced annotation pages and appends them as stops,
543
+ then fires <code>annotationsloaded</code> with <code>{ stops, searchService, failed }</code>. A
544
+ slide&#39;s stable identity is available as <code>storymap.getSlideId(index)</code>, which
545
+ is what the <code>#slide-N</code> hash and the <code>iiif-content</code> deep link resolve
546
+ through.</p>
245
547
 
246
548
  </main>
247
549
 
@@ -36,6 +36,7 @@
36
36
  <li><a class="button" href="./readme.html">README</a></li>
37
37
  <li><a class="button" href="./migration.html">Migration guide</a></li>
38
38
  <li><a class="button" href="./iiif.html">IIIF docs</a></li>
39
+ <li><a class="button" href="./authoring.html">Authoring</a></li>
39
40
  <li><a class="button" href="./api/index.html">API docs</a></li>
40
41
  <li><a class="button" href="../index.html#help">Help</a></li>
41
42
  </ul>
@@ -54,7 +55,9 @@ affiliated with, or supported by Northwestern University Knight Lab.</p>
54
55
  files (or IIIF Presentation manifests) with TypeScript + Vite + OpenLayers.
55
56
  There is no authoring tool — create your storymap JSON by hand or with your
56
57
  own code, and see <code>docs/</code> for the migration notes from the original
57
- Knight Lab release.</p>
58
+ Knight Lab release. The library also exports <code>storymapToManifest()</code>, which
59
+ produces a IIIF manifest from a storymap document (<code>npm run convert:iiif</code>
60
+ does the same from the command line; see <code>docs/storymap-as-iiif-manifest.md</code>).</p>
58
61
  <h2>Development</h2>
59
62
  <p>See docs/DEVELOPMENT.md to get setup for local development of StoryMapJS. This
60
63
  repository is the viewer library only (TypeScript + Vite + OpenLayers);
@@ -74,6 +77,13 @@ value of the storymap&#39;s <code>language</code> option must match the file nam
74
77
  <h2>Map Options</h2>
75
78
  <p>To disable connecting lines on maps set <code>map_as_image: true</code> in the storymap
76
79
  options (the default <code>false</code> renders cartography).</p>
80
+ <p><code>storymap.map</code> is the raw OpenLayers map, typed with the re-exported <code>ol</code>
81
+ types, and <code>getBaseLayer()</code>, <code>getOverlayLayers()</code>, <code>getMinimap()</code>,
82
+ <code>getMarkers()</code> and friends hand out the layers the viewer built. Listen for
83
+ <code>imageready</code> to run code against the real imagery, and call
84
+ <code>storymap.dispose()</code> when the embedding view goes away — see
85
+ <a href="./migration.html#reaching-the-map-layers-and-markers">docs/migration-from-knightlab.md</a>
86
+ for the full surface.</p>
77
87
  <p>The menubar buttons can be disabled individually:</p>
78
88
  <pre><code>show_overview: false, // map overview button
79
89
  show_back_to_start: false, // back to the beginning button
@@ -115,7 +125,8 @@ map_type: &quot;https://tiles.openfreemap.org/styles/bright&quot;, // vector st
115
125
  </code></pre>
116
126
  <p>Any value containing <code>{z}</code> renders as a raster XYZ layer; a path without <code>{z}</code>
117
127
  that looks like a URL/path renders as a vector style layer; anything else falls
118
- back to classic OSM raster.</p>
128
+ back to classic OSM raster — except <code>&quot;none&quot;</code>, which builds no map at all and
129
+ runs the story as text and media only.</p>
119
130
  <h3>Switching the basemap at runtime</h3>
120
131
  <p><code>storymap.setMapOption(&quot;map_type&quot;, next)</code> / <code>setMapOptions({...})</code> rebuilds the
121
132
  main tile layer <strong>and</strong> the minimap (<code>ol/control/OverviewMap</code>) layer, keeping
@@ -138,23 +149,43 @@ images, lists, emphasis and spans in your slides, e.g.:</p>
138
149
  }
139
150
  </code></pre>
140
151
  <p>The <code>vco-note</code> span renders as a small grey note, like the built-in credits.</p>
141
- <p><strong>Caution:</strong> the text is rendered raw — it is not sanitized. Only load
142
- storymaps from sources you trust.</p>
152
+ <p><strong>Caution:</strong> the text is sanitized, but sanitizing is a mitigation rather
153
+ than a guarantee. Prose and media formatting survive (<code>class</code>, <code>alt</code>, <code>width</code>,
154
+ table attributes, and so on), scripts and other executable tags are dropped
155
+ with their contents, event-handler attributes are stripped, every URL
156
+ attribute is checked to be <code>http(s)</code>, and <code>&lt;iframe&gt;</code> embeds are rebuilt into
157
+ a sandboxed, <code>no-referrer</code> element. <code>style</code>, <code>id</code> and <code>name</code> are <em>not</em> allowed,
158
+ and a link&#39;s <code>target</code> is always forced to <code>_blank</code>. The same sanitizer covers
159
+ media credit, media caption, the navigation headline and the map attribution
160
+ line. Still: only load storymaps from sources you trust.</p>
143
161
  <h2>GDPR consent for external services</h2>
144
162
  <p>Set the <code>consent_required</code> option to <code>true</code> to ask for permission before
145
163
  anything is loaded from external services (media embeds such as YouTube,
146
- Twitter or SoundCloud, map tiles, and external font CSS):</p>
164
+ Twitter or SoundCloud, slide narration audio, map tiles, and external font
165
+ CSS):</p>
147
166
  <pre><code>{
148
167
  &quot;consent_required&quot;: true,
149
168
  ...
150
169
  }
151
170
  </code></pre>
152
171
  <p>Each service asks with an Allow/Deny panel; answering one panel resolves every
153
- pending panel of the same service. If a decision was already stored in the
154
- cookie, the panel is skipped entirely. Denied services show a placeholder
172
+ pending panel of the same service. Denied services show a placeholder
155
173
  instead of the media, and the map renders without tiles until they are
156
- allowed. Decisions are stored in a cookie (<code>storymapjs-consent</code>) for 90
157
- days — clearing cookies asks again.</p>
174
+ allowed.</p>
175
+ <p>Before the story loads, one dialog lists every external service it uses (map
176
+ tiles, media services including slide narration, external fonts) with three
177
+ choices: <strong>Allow all</strong>, <strong>Decline all</strong>, or a decision per service. A story
178
+ with no map (<code>map_type: &quot;none&quot;</code>) has no tile row to answer. The dialog is
179
+ skipped once every service has a stored decision; per-service panels still
180
+ appear for services discovered later (e.g. a preloaded slide).</p>
181
+ <p>Decisions are stored in <code>localStorage</code> under <code>storymapjs-consent</code> and have no
182
+ expiry — clearing site data asks again.</p>
183
+ <p>The consent labels are <strong>not</strong> fully translated. <code>src/language/locale/en.json</code>
184
+ defines every string; 28 bundled locales fall back to English for the keys
185
+ they lack — most are missing one, a handful are missing around ten (the
186
+ per-service consent prompts and the fullscreen button labels). Run
187
+ <code>npm run check:locales</code> to see the current state — it reports the gap per
188
+ locale and is expected to be runnable without failing.</p>
158
189
  <h2>Troubleshooting</h2>
159
190
  <p>If a storymap fails to render, open the browser console: the viewer logs
160
191
  fetch and validation errors (e.g. &quot;could not load storymap data from ...&quot;).
@@ -7,7 +7,7 @@
7
7
  <meta name="apple-mobile-web-app-capable" content="yes">
8
8
  <meta name="mobile-web-app-capable" content="yes">
9
9
  <meta name="apple-touch-fullscreen" content="yes">
10
- <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
10
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
11
11
  <link rel="stylesheet" href="../css/storymap.css">
12
12
  <style>
13
13
  html, body {
@@ -0,0 +1,55 @@
1
+ {
2
+ "storymap": {
3
+ "call_to_action": false,
4
+ "map_as_image": false,
5
+ "map_type": "osm",
6
+ "slides": [
7
+ {
8
+ "date": "",
9
+ "type": "overview",
10
+ "text": {
11
+ "headline": "Карта мира",
12
+ "text": "Обзор на русском языке."
13
+ },
14
+ "media": {
15
+ "url": "",
16
+ "caption": "",
17
+ "credit": ""
18
+ }
19
+ },
20
+ {
21
+ "date": "",
22
+ "text": {
23
+ "headline": "Αθήνα",
24
+ "text": "Ελληνικό κείμενο για την Αθήνα."
25
+ },
26
+ "location": {
27
+ "lat": 37.98,
28
+ "lon": 23.73
29
+ }
30
+ },
31
+ {
32
+ "date": "",
33
+ "text": {
34
+ "headline": "ירושלים",
35
+ "text": "טקסט עברי לירושלים."
36
+ },
37
+ "location": {
38
+ "lat": 31.77,
39
+ "lon": 35.21
40
+ }
41
+ },
42
+ {
43
+ "date": "",
44
+ "text": {
45
+ "headline": "القاهرة",
46
+ "text": "نص عربي عن القاهرة."
47
+ },
48
+ "location": {
49
+ "lat": 30.04,
50
+ "lon": 31.24
51
+ }
52
+ }
53
+ ]
54
+ }
55
+ }
@@ -0,0 +1,96 @@
1
+ {
2
+ "storymap": {
3
+ "call_to_action": false,
4
+ "zoomify": false,
5
+ "map_as_image": false,
6
+ "map_type": "osm",
7
+ "slides": [
8
+ {
9
+ "date": "",
10
+ "type": "overview",
11
+ "text": {
12
+ "headline": "Start slide test",
13
+ "text": "Overview"
14
+ },
15
+ "media": {
16
+ "url": "",
17
+ "caption": "",
18
+ "credit": ""
19
+ }
20
+ },
21
+ {
22
+ "date": "",
23
+ "text": {
24
+ "headline": "One",
25
+ "text": "First."
26
+ },
27
+ "media": {
28
+ "url": "",
29
+ "caption": "",
30
+ "credit": ""
31
+ },
32
+ "location": {
33
+ "lat": 48.85,
34
+ "lon": 2.35,
35
+ "zoom": 6,
36
+ "line": true
37
+ }
38
+ },
39
+ {
40
+ "date": "",
41
+ "text": {
42
+ "headline": "Two",
43
+ "text": "Second."
44
+ },
45
+ "media": {
46
+ "url": "",
47
+ "caption": "",
48
+ "credit": ""
49
+ },
50
+ "location": {
51
+ "lat": 52.52,
52
+ "lon": 13.4,
53
+ "zoom": 6,
54
+ "line": true
55
+ }
56
+ },
57
+ {
58
+ "date": "",
59
+ "text": {
60
+ "headline": "Three",
61
+ "text": "Third."
62
+ },
63
+ "media": {
64
+ "url": "",
65
+ "caption": "",
66
+ "credit": ""
67
+ },
68
+ "location": {
69
+ "lat": 41.9,
70
+ "lon": 12.49,
71
+ "zoom": 6,
72
+ "line": true
73
+ }
74
+ },
75
+ {
76
+ "date": "",
77
+ "text": {
78
+ "headline": "Four",
79
+ "text": "Fourth."
80
+ },
81
+ "media": {
82
+ "url": "",
83
+ "caption": "",
84
+ "credit": ""
85
+ },
86
+ "location": {
87
+ "lat": 45.46,
88
+ "lon": 9.19,
89
+ "zoom": 6,
90
+ "line": true
91
+ }
92
+ }
93
+ ],
94
+ "start_at_slide": 3
95
+ }
96
+ }