@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/src/types.ts CHANGED
@@ -1,4 +1,7 @@
1
1
  // Shared types for the StoryMapJS codebase.
2
+ import type { Tile as TileLayer } from "ol/layer";
3
+ import type Layer from "ol/layer/Layer";
4
+ import type Source from "ol/source/Source";
2
5
 
3
6
  // ---------- Storymap data (exchange format) ----------
4
7
 
@@ -12,6 +15,40 @@ export interface StorymapSlideLocation {
12
15
  lat?: number;
13
16
  lon?: number;
14
17
  zoom?: number;
18
+ /**
19
+ * Image region `[x, y, w, h]` in image pixels (IIIF xywh convention,
20
+ * slideshow-style image stops): the view fits the region on
21
+ * navigation; image maps (`map_type: "iiif"` + `map_as_image`) only.
22
+ */
23
+ region?: [number, number, number, number];
24
+ /**
25
+ * View rotation in degrees clockwise (slideshow `rotation`). Applied to
26
+ * the map view on navigation; absent means north-up (0). Image and geo
27
+ * maps alike; purely presentational. Honored only with
28
+ * `slideshow_source`.
29
+ */
30
+ rotation?: number;
31
+ /**
32
+ * Per-slide image grading (slideshow `filters`): applied as a CSS
33
+ * `filter()` on the map viewport. All fields optional; absent means
34
+ * unfiltered. `hueRotate` is degrees (-180..180), `blur` is CSS pixels.
35
+ * Honored only with `slideshow_source`.
36
+ */
37
+ filter?: StorymapSlideFilter;
38
+ /**
39
+ * Spotlight mask (slideshow `passepartout`): normalized viewport
40
+ * fractions `{x, y, w, h}` (0..1) left visible while the rest is dimmed
41
+ * with `color`. `invert` dims the inside instead of the outside.
42
+ * Absent means no mask. Honored only with `slideshow_source`.
43
+ */
44
+ mask?: StorymapSlideMask;
45
+ /**
46
+ * Per-slide basemap override (multi-manifest slideshow tours): any
47
+ * `map_type` value or IIIF `info.json` URL. Absent keeps the story
48
+ * basemap. The layer is cached, so returning to a slide is free.
49
+ * Honored only with `slideshow_source`.
50
+ */
51
+ basemap?: string;
15
52
  line?: boolean;
16
53
  icon?: string;
17
54
  iconSize?: number[];
@@ -20,6 +57,35 @@ export interface StorymapSlideLocation {
20
57
  [key: string]: unknown;
21
58
  }
22
59
 
60
+ /**
61
+ * Declarative CSS filter grading for one slide (slideshow `filters`).
62
+ * Rendered by `buildSlideFilter()`; unknown keys never reach CSS.
63
+ */
64
+ export interface StorymapSlideFilter {
65
+ brightness?: number;
66
+ contrast?: number;
67
+ saturate?: number;
68
+ hueRotate?: number;
69
+ sepia?: number;
70
+ blur?: number;
71
+ [key: string]: unknown;
72
+ }
73
+
74
+ /**
75
+ * Spotlight mask geometry (slideshow `passepartout`). Fractions of the
76
+ * visible map area; `color` is a `#rgb`/`#rrggbb`/`#rrggbbaa`/`rgb(a)` string.
77
+ */
78
+ export interface StorymapSlideMask {
79
+ x: number;
80
+ y: number;
81
+ w: number;
82
+ h: number;
83
+ color?: string;
84
+ invert?: boolean;
85
+ opacity?: number;
86
+ [key: string]: unknown;
87
+ }
88
+
23
89
  export type MediaTypeMatch = {
24
90
  type: string;
25
91
  name: string;
@@ -32,8 +98,109 @@ export interface StorymapSlideMedia {
32
98
  url?: string | null;
33
99
  caption?: string | null;
34
100
  credit?: string | null;
101
+ /**
102
+ * Accessible description of the media, used as the image's `alt` when the
103
+ * media is an image. In IIIF this is the painting annotation's
104
+ * `accessibilitySummary`.
105
+ */
106
+ alt?: string | null;
35
107
  thumb?: string | null;
36
108
  mediatype?: MediaTypeMatch | null;
109
+ /**
110
+ * WebVTT subtitle file for an audio or video slide, rendered as a
111
+ * `<track kind="subtitles">`. IIIF has no subtitle term, so this stays a
112
+ * storymap-JSON field; the authoring guide notes the
113
+ * `TextualBody` + `format: text/vtt` shape we also accept.
114
+ */
115
+ subtitles?: string | null;
116
+ /**
117
+ * Start offset in seconds for audio/video media (slideshow `audio.offset`).
118
+ * Applied once the media metadata is available; absent or negative means 0.
119
+ * Honored only with `slideshow_source`.
120
+ */
121
+ offset?: number;
122
+ /**
123
+ * Loop audio/video media (slideshow `audio.loop`). Absent means no loop.
124
+ * Honored only with `slideshow_source`.
125
+ */
126
+ loop?: boolean;
127
+ /**
128
+ * `auto` (default) plays on activation; `click` arms the media paused and
129
+ * lets the visitor start it (slideshow `audio.play`). Absent means `auto`.
130
+ * Honored only with `slideshow_source`.
131
+ */
132
+ play?: "auto" | "click";
133
+ /**
134
+ * Stop this media when leaving the slide (default true). `false` lets an
135
+ * audio bed continue across slides (slideshow ambient audio). Honored
136
+ * only with `slideshow_source`.
137
+ */
138
+ stopOnExit?: boolean;
139
+ [key: string]: unknown;
140
+ }
141
+
142
+ /**
143
+ * Per-slide marker presentation, consolidated. `location.*` keeps working as
144
+ * the legacy spelling and `marker.*` wins when present.
145
+ *
146
+ * In a IIIF manifest none of this is a `storymap:` term: it all arrives in the
147
+ * `navPlace` Feature's `properties` bag (`icon`, `iconSize`, `image`, `name`,
148
+ * `popup`, `audioBadge`), which is a GeoJSON foreign-member bag and so needs
149
+ * no vocabulary registration.
150
+ */
151
+ export interface StorymapSlideMarker {
152
+ icon?: string;
153
+ iconSize?: number[];
154
+ image?: string;
155
+ /** The marker label; in a manifest this is `properties.name`. */
156
+ label?: string;
157
+ /** Show the popup card when this (active) marker is clicked. */
158
+ popup?: boolean;
159
+ /** Mark slides that carry narration or audio media with a small badge. */
160
+ audioBadge?: boolean;
161
+ [key: string]: unknown;
162
+ }
163
+
164
+ /**
165
+ * Optional spoken narration for one slide, played through a dedicated audio
166
+ * element rather than the slide's media frame — a tour stop usually has a
167
+ * picture and a recording, not one media item. In a IIIF manifest this is a
168
+ * `motivation: "supplementing"` Sound/Video body, read and written alongside
169
+ * the painting annotation.
170
+ */
171
+ export interface StorymapSlideNarration {
172
+ url: string;
173
+ /**
174
+ * Loop the narration (slideshow `audio.loop`). Absent means no loop.
175
+ * Note: a looping narration never fires `ended`, so `autoplay_media`
176
+ * falls back to its millisecond timer for that slide. Honored only with
177
+ * `slideshow_source`.
178
+ */
179
+ loop?: boolean;
180
+ /**
181
+ * Start offset in seconds (slideshow `audio.offset`), applied once the
182
+ * audio metadata is available. Absent or negative means 0. Honored only
183
+ * with `slideshow_source`.
184
+ */
185
+ offset?: number;
186
+ /**
187
+ * `auto` (default) plays on navigation; `click` arms the narration
188
+ * paused and lets the visitor start it (slideshow `audio.play`).
189
+ * Honored only with `slideshow_source`.
190
+ */
191
+ play?: "auto" | "click";
192
+ /**
193
+ * Stop the narration when leaving the slide (default true). `false`
194
+ * keeps an audio bed playing across slides while the URL is unchanged
195
+ * (slideshow ambient audio). Honored only with `slideshow_source`.
196
+ */
197
+ stopOnExit?: boolean;
198
+ /**
199
+ * Stop any other playing narration/ambient track before starting this
200
+ * one (default true). `false` allows the ambient overlap of two tracks.
201
+ * Honored only with `slideshow_source`.
202
+ */
203
+ stopAllPrevious?: boolean;
37
204
  [key: string]: unknown;
38
205
  }
39
206
 
@@ -43,21 +210,111 @@ export interface StorymapSlideBackground {
43
210
  opacity?: number;
44
211
  }
45
212
 
213
+ /**
214
+ * One slide of a storymap.
215
+ *
216
+ * The nullable members (`| null`) are not decoration: the storymap JSON uses
217
+ * `null` to mean "explicitly absent" and the viewer seeds its own defaults
218
+ * with `null` before the data is merged in, so a plain `?` would not type.
219
+ */
46
220
  export interface StorymapSlide {
47
221
  type?: string;
48
222
  date?: string | Record<string, unknown> | null;
49
223
  group?: string;
50
- location?: StorymapSlideLocation;
51
- media?: StorymapSlideMedia;
52
- text?: StorymapSlideText;
224
+ /**
225
+ * The language tag this slide's text was read in. A IIIF manifest states its text as a
226
+ * language map; the reader picks the viewer's configured language and
227
+ * reports which one it used, so a host can offer a language switch.
228
+ * Absent for language-neutral (`none`) text, and for a single-language
229
+ * storymap.
230
+ */
231
+ language?: string;
232
+ location?: StorymapSlideLocation | null;
233
+ media?: StorymapSlideMedia | null;
234
+ /**
235
+ * Additional visible media for this slide (#358), rendered after `media`
236
+ * in order. Items without a non-empty `url` are skipped, so a document
237
+ * without this field renders identically. In a IIIF manifest these are
238
+ * further `painting` annotations on the canvas; the slide layout
239
+ * (`media_layout`) has no IIIF term and stays viewer-side.
240
+ */
241
+ media_extra?: StorymapSlideMedia[] | null;
242
+ /**
243
+ * Layout of a multi-media slide (#358): `stack` piles the items
244
+ * vertically (the panel scrolls), `row` puts two items side by side.
245
+ * Defaults to `stack`; `row` with anything but two items falls back to
246
+ * `stack`. Ignored for a single media item.
247
+ */
248
+ media_layout?: "stack" | "row";
249
+ marker?: StorymapSlideMarker | null;
250
+ narration?: StorymapSlideNarration | null;
251
+ text?: StorymapSlideText | null;
53
252
  background?: StorymapSlideBackground | string | null;
54
- uniqueid?: string;
253
+ uniqueid?: string | null;
254
+ /**
255
+ * Provenance identifiers for the slide's source (slideshow
256
+ * `manifest_id`/`canvas_id`/`image_id`): which manifest, canvas and
257
+ * image the stop was translated from. Data-only (deep links, export);
258
+ * never rendered.
259
+ */
260
+ provenance?: StorymapSlideProvenance | null;
261
+ /**
262
+ * Per-slide autoplay dwell in milliseconds (slideshow `slidetimeout`):
263
+ * overrides the global `autoplay` interval for this slide; `0` holds on
264
+ * this slide. Absent means the global interval. Honored only with
265
+ * `slideshow_source`.
266
+ */
267
+ slidetimeout?: number;
268
+ /**
269
+ * Per-slide image overlay on the map (slideshow `imgoverlay`): a placed
270
+ * image shown while this slide is active. Absent means no overlay.
271
+ * Honored only with `slideshow_source`.
272
+ */
273
+ imgoverlay?: StorymapImageOverlay | null;
274
+ [key: string]: unknown;
275
+ }
276
+
277
+ /**
278
+ * A per-slide image overlay (slideshow `imgoverlay`). `url` is a full-size
279
+ * image; `extent` pins it to `[west, south, east, north]` (lon/lat, or raw
280
+ * image pixels on image-space maps) and defaults to the current view;
281
+ * `size` scales it as a fraction of the viewport width; `opacity` is 0..1.
282
+ */
283
+ export interface StorymapImageOverlay {
284
+ url: string;
285
+ size?: number;
286
+ opacity?: number;
287
+ extent?: [number, number, number, number];
288
+ [key: string]: unknown;
289
+ }
290
+
291
+ /**
292
+ * Provenance identifiers for one slide's source: the manifest, canvas and
293
+ * image a stop was translated from. Data-only.
294
+ */
295
+ export interface StorymapSlideProvenance {
296
+ manifest?: string;
297
+ canvas?: string;
298
+ image?: string;
299
+ [key: string]: unknown;
300
+ }
301
+
302
+ /**
303
+ * Authorship and rights for the story as a whole (slideshow
304
+ * `creator`/`rights`). Rendered into the map attribution line for
305
+ * slideshow tours; the license URL stays data-only for hosts.
306
+ */
307
+ export interface StorymapCredit {
308
+ creator?: string;
309
+ rights?: string;
310
+ licenseUrl?: string;
55
311
  [key: string]: unknown;
56
312
  }
57
313
 
58
314
  export interface StorymapData {
59
315
  uniqueid?: string;
60
316
  slides: StorymapSlide[];
317
+ credit?: StorymapCredit | null;
61
318
  [key: string]: unknown;
62
319
  }
63
320
 
@@ -67,6 +324,29 @@ export interface StorymapDataWrapper {
67
324
 
68
325
  // ---------- StoryMap / Map options ----------
69
326
 
327
+ /**
328
+ * Custom tile layer/source factory (see
329
+ * `StorymapOptions.tile_source_factory`). `createDefault` runs the
330
+ * built-in `map_type` handling, so a factory can decorate or delegate.
331
+ *
332
+ * May return any `ol/layer/Layer` (used as-is — this is what lets a
333
+ * third-party layer such as an Allmaps `WarpedMapLayer` render), a bare
334
+ * `Source` (wrapped in a `TileLayer`), or `null`/`undefined` to fall
335
+ * through to the default `map_type` handling.
336
+ */
337
+ export type TileSourceFactory = (
338
+ map_type: string,
339
+ context: { options: StorymapOptions; createDefault: () => TileLayer },
340
+ ) => Layer | TileLayer | Source | null | undefined;
341
+
342
+ /**
343
+ * Named progress indicator styles (slideshow `progressbar`), shared by the
344
+ * translator (which emits them) and the menubar (which renders them) so the
345
+ * set cannot drift.
346
+ */
347
+ export const PROGRESSBAR_STYLES = ["bar", "dots", "squares", "block", "thinblock"] as const;
348
+ export type ProgressbarStyle = (typeof PROGRESSBAR_STYLES)[number];
349
+
70
350
  export interface StorymapOptions {
71
351
  width: number;
72
352
  height: number;
@@ -75,7 +355,6 @@ export interface StorymapOptions {
75
355
  default_bg_color: { r: number; g: number; b: number };
76
356
  map_size_sticky: number;
77
357
  map_center_offset: { left: number; top: number } | null;
78
- less_bounce: boolean;
79
358
  start_at_slide: number;
80
359
  call_to_action: boolean;
81
360
  call_to_action_text: string;
@@ -89,7 +368,6 @@ export interface StorymapOptions {
89
368
  skinny_size: number;
90
369
  duration: number;
91
370
  ease: unknown;
92
- dragging: boolean;
93
371
  trackResize: boolean;
94
372
  /**
95
373
  * Navigate slides with arrow keys anywhere on the page (default false:
@@ -101,15 +379,61 @@ export interface StorymapOptions {
101
379
  nocache: boolean;
102
380
  /** Advance slides automatically every N milliseconds; 0 disables (issue #380) */
103
381
  autoplay: number;
382
+ /**
383
+ * With autoplay on, wait for the current slide's audio or video to end
384
+ * before advancing instead of using the `autoplay` millisecond timer,
385
+ * which stays as the fallback. Slides without playable media keep the
386
+ * timer, so a mixed story never stalls.
387
+ */
388
+ autoplay_media: boolean;
104
389
  /** Show a progress bar in the menubar (issue #247) */
105
390
  show_progress: boolean;
106
- /** Show the slide headline as a label on the active map marker (issue #243) */
391
+ /**
392
+ * Progress indicator style (slideshow `progressbar`): `false`/`"off"`
393
+ * hides it (same as `show_progress: false`), `true`/`"bar"` is the
394
+ * classic fill bar, `dots`/`squares` render one step per slide,
395
+ * `block`/`thinblock` are fill-bar height variants. Absent means the
396
+ * `show_progress` boolean decides and the style is `"bar"`. Honored
397
+ * only with `slideshow_source`.
398
+ */
399
+ progressbar?:
400
+ | boolean
401
+ | "bar"
402
+ | "dots"
403
+ | "squares"
404
+ | "block"
405
+ | "thinblock"
406
+ | "off"; /** Show the slide headline as a label on the active map marker (issue #243) */
107
407
  marker_labels: boolean;
108
408
  /** Default text alignment for slide text: left, center or right (issue #244) */
109
409
  text_align: "left" | "center" | "right";
410
+ /**
411
+ * Slide panel dock (slideshow `textmode`): which side the text panel
412
+ * occupies in landscape. `"right"` (default) is the current layout;
413
+ * `"left"` mirrors it; `"bottom"` docks the panel below the map.
414
+ * Portrait layouts always behave like `"bottom"`. Honored only with
415
+ * `slideshow_source`.
416
+ */
417
+ textmode?: "left" | "right" | "bottom";
418
+ /**
419
+ * Slide panel size as a percentage (slideshow `textsize`): percent of
420
+ * the width for side docks, of the height for the bottom dock.
421
+ * Range 10..80; absent keeps the built-in 50/50 split. Honored only
422
+ * with `slideshow_source`.
423
+ */
424
+ textsize?: number;
110
425
  /** Override the overview fit center (issues #107, #271) */
111
426
  map_overview_center: { lat: number; lon: number } | null;
112
427
  map_type: string;
428
+ /**
429
+ * Custom OpenLayers tile layer/source factory (issue #473): consulted
430
+ * by the tile layer factory before the built-in `map_type` switch, for
431
+ * every base, overlay and minimap layer. Return a `TileLayer` (or a
432
+ * bare `Source`, auto-wrapped in one) for custom handling — e.g. WMS —
433
+ * or `null`/`undefined` to fall through to the default types.
434
+ * Constructor- and runtime-only: functions cannot ride storymap JSON.
435
+ */
436
+ tile_source_factory: TileSourceFactory | null;
113
437
  attribution: string;
114
438
  /**
115
439
  * Stacked raster overlays above the base map, below the route lines.
@@ -118,8 +442,16 @@ export interface StorymapOptions {
118
442
  * (default) means base map only.
119
443
  */
120
444
  overlays: StorymapOverlayLayer[];
445
+ /** Show the basemap/overlay switcher in the menubar (default false) */
446
+ show_layers_control: boolean;
447
+ /**
448
+ * Selectable base maps for the layer switcher. Entry 0 is the initial
449
+ * basemap unless `map_type` says otherwise; omit for an overlays-only
450
+ * control. Constructor- and runtime-only when labels are functions
451
+ * (functions cannot ride storymap JSON — see `label`).
452
+ */
453
+ basemaps?: StorymapBasemap[];
121
454
  map_mini: boolean;
122
- map_subdomains: string;
123
455
  map_as_image: boolean;
124
456
  map_access_token: string;
125
457
  map_background_color: string;
@@ -160,7 +492,9 @@ export interface StorymapOptions {
160
492
  /**
161
493
  * Ask for permission before loading anything from external services
162
494
  * (media embeds, map tiles, external font CSS) — GDPR consent mode.
163
- * Grants are remembered per service in a cookie for 90 days.
495
+ * Decisions are remembered per service in `localStorage` under
496
+ * `storymapjs-consent` with no expiry: clearing site data is what makes
497
+ * the viewer ask again.
164
498
  */
165
499
  consent_required: boolean;
166
500
  /** Slide text color override, sets --vco-color-text (issue #177) */
@@ -170,14 +504,95 @@ export interface StorymapOptions {
170
504
  /** Show the great-circle route distance in the menubar (issue #341) */
171
505
  show_distance: boolean;
172
506
  /**
173
- * Raw OpenLayers map configuration. `controls` and `interactions` replace
174
- * the StoryMapJS defaults, `view` is merged over the computed default view
507
+ * Slide transition effect (slideshow `fxmode`): `"slide"` (default) is
508
+ * the current glide, `"fade"` cross-fades slides, `"none"` jumps without
509
+ * animation. `prefers-reduced-motion` still forces `"none"`. Honored
510
+ * only with `slideshow_source`.
511
+ */
512
+ fxmode?: "slide" | "fade" | "none";
513
+ /**
514
+ * Reading mode (slideshow `mode`): `"standard"` (default) is the
515
+ * slider; `"static"` stacks all slides in a scrollable list and follows
516
+ * the map to the slide in view. Honored only with `slideshow_source`.
517
+ */
518
+ mode?: "standard" | "static";
519
+ /**
520
+ * HUD foreground color override (slideshow `hudcolor`): sets the
521
+ * `--vco-hud-fg` CSS variable. Absent follows the theme. Honored only
522
+ * with `slideshow_source`.
523
+ */
524
+ hudcolor?: string;
525
+ /**
526
+ * HUD background color override (slideshow `hudbgcolor`): sets the
527
+ * `--vco-hud-bg` CSS variable. Absent follows the theme. Honored only
528
+ * with `slideshow_source`.
529
+ */
530
+ hudbgcolor?: string;
531
+ /**
532
+ * HUD opacity percent 0..100 (slideshow `hudopacity`): applied to the
533
+ * HUD background. Absent means fully opaque theme background. Honored
534
+ * only with `slideshow_source`.
535
+ */
536
+ hudopacity?: number;
537
+ /**
538
+ * Show the previous/next slide navigation (slideshow `shownav`).
539
+ * Default true; `false` hides the nav chrome (keyboard/AT navigation
540
+ * still works, like `show_progress: false` keeps the story usable).
541
+ * Honored only with `slideshow_source`.
542
+ */
543
+ shownav?: boolean;
544
+ /**
545
+ * Render slide headlines (slideshow `showheadings`). Default true;
546
+ * `false` hides headline elements via CSS. Honored only with
547
+ * `slideshow_source`.
548
+ */
549
+ show_headings?: boolean;
550
+ /**
551
+ * Show scrollbars in the slide panel (slideshow `showscrollbars`).
552
+ * Default true; `false` hides them via CSS (content still scrolls).
553
+ * Honored only with `slideshow_source`.
554
+ */
555
+ show_scrollbars?: boolean;
556
+ /**
557
+ * Fixed viewer height (slideshow `viewerheight`), e.g. `"400px"`:
558
+ * applied as a container height override when set. Absent keeps the
559
+ * measured-container behavior. Only `px`, `%` and `vh` units accepted.
560
+ * Honored only with `slideshow_source`.
561
+ */
562
+ viewerheight?: string;
563
+ /**
564
+ * Show media captions and credits (slideshow `showinfo`). Default true;
565
+ * `false` hides the caption/credit block. Honored only with
566
+ * `slideshow_source`.
567
+ */
568
+ show_info?: boolean;
569
+ /**
570
+ * Detect slideshow tours automatically (default `true`): an
571
+ * `AnnotationCollection` shaped like one loads through the translator.
572
+ * Set `false` to disable detection (such documents then fail validation
573
+ * as before).
574
+ */
575
+ slideshow?: boolean;
576
+ /**
577
+ * @internal Source marker: true when the loaded document came from a
578
+ * slideshow tour (set programmatically by the viewer, never from data).
579
+ * The slideshow-motivated presentation fields (location
580
+ * rotation/filter/mask/basemap, narration/media playback bags,
581
+ * slidetimeout, imgoverlay, and the player-chrome options above) render
582
+ * only with this set — internal documents keep the long-standing
583
+ * behavior. Absent from constructor defaults and schema, so storymap
584
+ * data cannot inject it; it travels via options copies. Hosts may pass
585
+ * it explicitly as an escape hatch.
586
+ */
587
+ slideshow_source?: boolean;
588
+ /**
589
+ * Raw OpenLayers map configuration. `controls` replaces the StoryMapJS
590
+ * defaults, `interactions` are *added to* the viewer's own pan/zoom
591
+ * interactions, and `view` is merged over the computed default view
175
592
  * and `element` (an HTMLElement or DOM id) replaces the auto-created map
176
593
  * container div.
177
594
  */
178
595
  map_options: StorymapMapOptions;
179
- map_popup: boolean;
180
- zoom_distance: number;
181
596
  calculate_zoom: boolean;
182
597
  line_follows_path: boolean;
183
598
  line_color: string;
@@ -189,16 +604,44 @@ export interface StorymapOptions {
189
604
  show_lines: boolean;
190
605
  show_history_line: boolean;
191
606
  use_custom_markers: boolean;
192
- iiif: { url: string; attribution: string };
607
+ /**
608
+ * IIIF image service for image maps. `url` is the `info.json`; `width`
609
+ * and `height` record the canvas size so region clamping and the static
610
+ * fallback work without another fetch; `fallbackUrl` is a full-size
611
+ * image used when `info.json` cannot be loaded (slideshow
612
+ * `image_static`).
613
+ */
614
+ iiif: {
615
+ url: string;
616
+ attribution: string;
617
+ width?: number;
618
+ height?: number;
619
+ fallbackUrl?: string;
620
+ };
621
+ tilejson?: StorymapTilejson;
622
+ /**
623
+ * The `seeAlso` targets a IIIF manifest points at, recorded but not
624
+ * fetched — see `loadSeeAlso()`.
625
+ */
626
+ see_also?: { id: string; type: string }[];
193
627
  map_height: number;
194
628
  storyslider_height: number;
195
629
  slide_padding_lr: number;
196
630
  slide_default_fade: string;
197
631
  menubar_default_y: number;
198
- path_gfx: string;
199
632
  script_path: string;
200
- font_css: string;
633
+ /**
634
+ * Font theme stylesheet: `stock:<name>`, a URL/path, or `false` for no
635
+ * injected stylesheet (the host bundles the theme itself).
636
+ */
637
+ font_css: string | false;
201
638
  language: string;
639
+ /**
640
+ * Colour theme: `"dark"` forces the dark palette, `"light"` pins the
641
+ * light one (overriding an OS dark preference), unset follows
642
+ * `prefers-color-scheme`. Construction-time only, like `map_type`.
643
+ */
644
+ theme?: "dark" | "light";
202
645
  api_key_flickr: string;
203
646
  [key: string]: unknown;
204
647
  }
@@ -219,14 +662,57 @@ export interface AnimationHandle {
219
662
 
220
663
  // ---------- map ----------
221
664
 
665
+ /**
666
+ * TileJSON 2.1 tile source metadata, from a manifest's map configuration
667
+ * service.
668
+ *
669
+ * This is how a manifest states a tile source: `tiles` is the URL template and
670
+ * the rest is the standard metadata around it, where a keyword basemap
671
+ * (`osm`, `stadia`, `iiif`, …) has no such thing to say. `minzoom`,
672
+ * `maxzoom`, `bounds` and `scheme` constrain the source; `center` and `zoom`
673
+ * set the initial view.
674
+ */
675
+ export interface StorymapTilejson {
676
+ /** URL template, e.g. `https://tiles.example.org/{z}/{x}/{y}.png` */
677
+ tiles: string | string[];
678
+ /** Lowest zoom level the source has tiles for */
679
+ minzoom?: number;
680
+ /** Highest zoom level the source has tiles for */
681
+ maxzoom?: number;
682
+ /** `[west, south, east, north]`, WGS84 lon/lat, of the covered area */
683
+ bounds?: [number, number, number, number];
684
+ /** `xyz` (default) or `tms`, which flips the tile row order */
685
+ scheme?: "xyz" | "tms";
686
+ /** `[lon, lat, zoom]` of the map's default view */
687
+ center?: [number, number, number];
688
+ }
689
+
690
+ /**
691
+ * A selectable base map for the layer switcher (`StorymapOptions.basemaps`).
692
+ */
693
+ export interface StorymapBasemap {
694
+ /** Any `map_type` value. */
695
+ map_type: string;
696
+ /**
697
+ * Control row label. Defaults to `map_type`. A function is re-invoked
698
+ * on every `refreshLabels()` for host i18n (constructor options only —
699
+ * see `StorymapOverlayLayer.label`).
700
+ */
701
+ label?: string | (() => string);
702
+ }
703
+
222
704
  /**
223
705
  * A stacked raster overlay above the base map (StorymapOptions.overlays).
224
706
  * Presentation is declarative: hosts no longer need to reach into the
225
707
  * layer objects for blend modes, clips or stacking tweaks.
226
708
  */
227
709
  export interface StorymapOverlayLayer {
228
- /** Any `map_type` value the tile layer factory accepts */
229
- map_type: string;
710
+ /**
711
+ * Any `map_type` value the tile layer factory accepts. Required unless
712
+ * the entry carries a `georeference` (a placed IIIF image instead of
713
+ * a tile source).
714
+ */
715
+ map_type?: string;
230
716
  /** Layer opacity 0..1 (default 1) */
231
717
  opacity?: number;
232
718
  /** Initial visibility (default true) */
@@ -243,8 +729,71 @@ export interface StorymapOverlayLayer {
243
729
  className?: string;
244
730
  /** CSS mix-blend-mode for the layer container (needs className) */
245
731
  blendMode?: string;
732
+ /**
733
+ * Control row label for the layer switcher (`show_layers_control`).
734
+ * Defaults to `map_type`. A function is re-invoked on every
735
+ * `refreshLabels()` for host i18n — but only when the entry comes from
736
+ * constructor options: `mergeData()` overwrites option keys with the
737
+ * storymap JSON, so a document carrying `overlays` replaces function
738
+ * labels with its own strings.
739
+ */
740
+ label?: string | (() => string);
741
+ /**
742
+ * Render the row checked and disabled: an overlay the visitor may add
743
+ * back but not remove (e.g. a georeferenced scan the story is built on).
744
+ * The control never toggles a locked entry.
745
+ */
746
+ locked?: boolean;
747
+ /** false hides the row from the control without removing the overlay. */
748
+ control?: boolean;
246
749
  /** Clip box `[west, south, east, north]` in lon/lat (mercator maps) */
247
750
  extent?: [number, number, number, number];
751
+ /**
752
+ * IIIF Georeference Extension placement instead of a tile source. The
753
+ * ground control points are fitted affinely and the image is placed on
754
+ * the geographic map, so this is the manifest-side equivalent of a
755
+ * georeferenced raster overlay.
756
+ */
757
+ georeference?: StorymapGeoreference;
758
+ }
759
+
760
+ /**
761
+ * A IIIF Georeference Extension annotation body plus the image it places
762
+ * (`overlays[].georeference`). The `body` is the annotation payload of
763
+ * `iiif.io/api/extension/georef` verbatim: a GeoJSON FeatureCollection of
764
+ * ground control points pairing `properties.resourceCoords` (image pixels)
765
+ * with `geometry.coordinates` (WGS84 lon/lat), optionally carrying a
766
+ * `transformation` hint.
767
+ *
768
+ * The viewer fits the affine (first-order polynomial) case and places the
769
+ * image with OpenLayers' reprojection, which requires an axis-aligned
770
+ * placement; rotated or skewed sheets, higher-order polynomials and thin
771
+ * plate splines are reported and skipped — see the "Geo-referenced layers"
772
+ * section of docs/storymap-as-iiif-manifest.md.
773
+ */
774
+ export interface StorymapGeoreference {
775
+ /** IIIF Image API service base (or a full-size image URL) to place */
776
+ url: string;
777
+ /** Image width in pixels (the resourceCoords space) */
778
+ width: number;
779
+ /** Image height in pixels */
780
+ height: number;
781
+ /** Georeference annotation body: the GCP FeatureCollection */
782
+ body: StorymapGeoreferenceBody;
783
+ }
784
+
785
+ export interface StorymapGeoreferenceBody {
786
+ type?: string;
787
+ /** `polynomial` with `order: 1`, or absent; other values are skipped */
788
+ transformation?: { type?: string; options?: { order?: number } };
789
+ features: StorymapGroundControlPoint[];
790
+ }
791
+
792
+ /** One ground control point: an image pixel paired with a WGS84 position */
793
+ export interface StorymapGroundControlPoint {
794
+ type?: string;
795
+ properties?: { resourceCoords?: [number, number] };
796
+ geometry?: { type?: string; coordinates?: number[] };
248
797
  }
249
798
 
250
799
  /** OpenLayers passthrough options (see StorymapOptions.map_options) */
@@ -255,26 +804,39 @@ export interface StorymapMapOptions {
255
804
  view?: Record<string, unknown>;
256
805
  /** Replaces the default (empty) controls list */
257
806
  controls?: unknown[];
258
- /** Replaces the default (empty) interactions list */
807
+ /**
808
+ * Added to the viewer's own pan/zoom interactions (not a replacement:
809
+ * the viewer's defaults are always added). `controls` *is* a
810
+ * replacement, since the viewer adds none of its own.
811
+ */
259
812
  interactions?: unknown[];
260
813
  /** Any other ol/Map constructor option (layers, pixelRatio, ...) */
261
814
  [key: string]: unknown;
262
815
  }
263
816
 
817
+ /**
818
+ * A resolved geographic coordinate.
819
+ *
820
+ * `lat`/`lon` are required: this type is for points the map can actually
821
+ * focus on. A *slide* may carry a `location` without coordinates (an image
822
+ * region, an icon only) — that is `StorymapSlideLocation`, which keeps them
823
+ * optional. `lng` is accepted as a legacy alias on input only.
824
+ */
264
825
  export interface LatLngLiteral {
265
- lat: number | undefined;
266
- lon?: number | undefined;
267
- lng?: number | undefined;
826
+ lat: number;
827
+ lon: number;
828
+ lng?: number;
268
829
  }
269
830
 
270
- export interface MapMarkerData {
831
+ /**
832
+ * A marker's data: the slide it was created from, plus the `real_marker` flag
833
+ * the marker sets once it has confirmed numeric lat/lon. A separate interface
834
+ * used to drift from `StorymapSlide` (narrower `text`, its own `location`),
835
+ * which then made `Map._createMarker(slide)` unassignable.
836
+ */
837
+ export type MapMarkerData = StorymapSlide & {
271
838
  real_marker?: boolean;
272
- location?: StorymapSlideLocation;
273
- media?: StorymapSlideMedia & { mediatype?: MediaTypeMatch | null };
274
- text?: { headline?: string };
275
- type?: string;
276
- [key: string]: unknown;
277
- }
839
+ };
278
840
 
279
841
  export type IconSpec = {
280
842
  url: string;