@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
@@ -36,6 +36,8 @@
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>
40
+ <li><a class="button" href="./events.html">Events</a></li>
39
41
  <li><a class="button" href="./api/index.html">API docs</a></li>
40
42
  <li><a class="button" href="../index.html#help">Help</a></li>
41
43
  </ul>
@@ -52,17 +54,67 @@ the fixtures in <a href="../examples/"><code>public/examples/</code></a> are rea
52
54
  (<a href="../examples-iiif/"><code>public/examples-iiif/</code></a>), and
53
55
  <code>scripts/validate-iiif.mjs</code> checks every converted manifest against the
54
56
  <a href="https://presentation-validator.iiif.io/">official IIIF presentation validator</a>
55
- (<code>npm run validate:iiif</code>). All converted fixtures pass the official validator.</p>
57
+ (<code>npm run validate:iiif</code>). All converted fixtures pass the official validator,
58
+ except the two hand-authored georeferenced-layer fixtures, which the base
59
+ validator schema cannot accept by design (see &quot;Geo-referenced layers&quot; below);
60
+ <code>npm run validate:iiif</code> reports those two as <em>not covered</em> rather than as
61
+ failures.</p>
56
62
  <h2>Contexts</h2>
57
- <p>A manifest carries three context URLs: the Presentation 3.0 context, the
58
- official <a href="https://iiif.io/api/extension/navplace/">navPlace extension</a> context,
59
- and the StoryMap extension context:</p>
63
+ <p>A manifest declares four context URLs, in this order: the official
64
+ <a href="https://iiif.io/api/extension/navplace/">navPlace extension</a> context (which
65
+ §3.1 of the extension requires before Presentation 3), the Presentation 3.0
66
+ context, the navPlace properties context, and the StoryMap extension context.
67
+ The last of the four resolves to the document below — shown inline here for
68
+ reference; a manifest must reference it by URL, not paste it in (see the
69
+ <code>@context</code> rule under &quot;Validator interop&quot;):</p>
60
70
  <pre><code class="language-json">{
61
- &quot;@context&quot;: [
62
- &quot;http://iiif.io/api/presentation/3/context.json&quot;,
63
- &quot;http://iiif.io/api/extension/navplace/context.json&quot;,
64
- &quot;https://cmahnke.github.io/StoryMapJS/context.json&quot;
65
- ]
71
+ &quot;@context&quot;: {
72
+ &quot;@version&quot;: 1.1,
73
+ &quot;storymap&quot;: &quot;https://christianmahnke.de/iiif/storymap#&quot;,
74
+ &quot;mapAsImage&quot;: &quot;storymap:mapAsImage&quot;,
75
+ &quot;tilejson&quot;: &quot;storymap:tilejson&quot;,
76
+ &quot;mapAccessToken&quot;: &quot;storymap:mapAccessToken&quot;,
77
+ &quot;mapBackgroundColor&quot;: &quot;storymap:mapBackgroundColor&quot;,
78
+ &quot;mapCenterOffset&quot;: &quot;storymap:mapCenterOffset&quot;,
79
+ &quot;fontCss&quot;: &quot;storymap:fontCss&quot;,
80
+ &quot;callToAction&quot;: &quot;storymap:callToAction&quot;,
81
+ &quot;callToActionText&quot;: &quot;storymap:callToActionText&quot;,
82
+ &quot;startAtSlide&quot;: &quot;storymap:startAtSlide&quot;,
83
+ &quot;language&quot;: &quot;storymap:language&quot;,
84
+ &quot;calculateZoom&quot;: &quot;storymap:calculateZoom&quot;,
85
+ &quot;lineFollowsPath&quot;: &quot;storymap:lineFollowsPath&quot;,
86
+ &quot;showLines&quot;: &quot;storymap:showLines&quot;,
87
+ &quot;showHistoryLine&quot;: &quot;storymap:showHistoryLine&quot;,
88
+ &quot;lineColor&quot;: &quot;storymap:lineColor&quot;,
89
+ &quot;lineColorInactive&quot;: &quot;storymap:lineColorInactive&quot;,
90
+ &quot;lineWeight&quot;: &quot;storymap:lineWeight&quot;,
91
+ &quot;lineOpacity&quot;: &quot;storymap:lineOpacity&quot;,
92
+ &quot;lineDash&quot;: &quot;storymap:lineDash&quot;,
93
+ &quot;lineJoin&quot;: &quot;storymap:lineJoin&quot;,
94
+ &quot;useCustomMarkers&quot;: &quot;storymap:useCustomMarkers&quot;,
95
+ &quot;mapArea&quot;: &quot;storymap:mapArea&quot;,
96
+ &quot;overviewExtent&quot;: &quot;storymap:overviewExtent&quot;,
97
+ &quot;keyboard&quot;: &quot;storymap:keyboard&quot;,
98
+ &quot;overlays&quot;: &quot;storymap:overlays&quot;,
99
+ &quot;type&quot;: {
100
+ &quot;@id&quot;: &quot;storymap:type&quot;,
101
+ &quot;@type&quot;: &quot;@id&quot;
102
+ },
103
+ &quot;mediaSrcset&quot;: &quot;storymap:mediaSrcset&quot;,
104
+ &quot;mediaSizes&quot;: &quot;storymap:mediaSizes&quot;,
105
+ &quot;rotation&quot;: &quot;storymap:rotation&quot;,
106
+ &quot;basemap&quot;: &quot;storymap:basemap&quot;,
107
+ &quot;filter&quot;: &quot;storymap:filter&quot;,
108
+ &quot;mask&quot;: &quot;storymap:mask&quot;,
109
+ &quot;slidetimeout&quot;: &quot;storymap:slidetimeout&quot;,
110
+ &quot;imgoverlay&quot;: &quot;storymap:imgoverlay&quot;,
111
+ &quot;loop&quot;: &quot;storymap:loop&quot;,
112
+ &quot;offset&quot;: &quot;storymap:offset&quot;,
113
+ &quot;play&quot;: &quot;storymap:play&quot;,
114
+ &quot;stopOnExit&quot;: &quot;storymap:stopOnExit&quot;,
115
+ &quot;stopAllPrevious&quot;: &quot;storymap:stopAllPrevious&quot;,
116
+ &quot;provenance&quot;: &quot;storymap:provenance&quot;
117
+ }
66
118
  }
67
119
  </code></pre>
68
120
  <h3>navPlace context (official)</h3>
@@ -89,20 +141,17 @@ what the fixtures reference. Content:</p>
89
141
  &quot;@context&quot;: {
90
142
  &quot;@version&quot;: 1.1,
91
143
  &quot;storymap&quot;: &quot;https://christianmahnke.de/iiif/storymap#&quot;,
92
- &quot;mapType&quot;: &quot;storymap:mapType&quot;,
144
+ &quot;tilejson&quot;: &quot;storymap:tilejson&quot;,
93
145
  &quot;mapAsImage&quot;: &quot;storymap:mapAsImage&quot;,
94
146
  &quot;mapAccessToken&quot;: &quot;storymap:mapAccessToken&quot;,
95
147
  &quot;mapBackgroundColor&quot;: &quot;storymap:mapBackgroundColor&quot;,
96
148
  &quot;mapCenterOffset&quot;: &quot;storymap:mapCenterOffset&quot;,
97
- &quot;mapSubdomains&quot;: &quot;storymap:mapSubdomains&quot;,
98
- &quot;iiifUrl&quot;: { &quot;@id&quot;: &quot;storymap:iiifUrl&quot;, &quot;@type&quot;: &quot;@id&quot; },
99
149
  &quot;fontCss&quot;: &quot;storymap:fontCss&quot;,
100
150
  &quot;callToAction&quot;: &quot;storymap:callToAction&quot;,
101
151
  &quot;callToActionText&quot;: &quot;storymap:callToActionText&quot;,
102
152
  &quot;startAtSlide&quot;: &quot;storymap:startAtSlide&quot;,
103
153
  &quot;language&quot;: &quot;storymap:language&quot;,
104
154
  &quot;calculateZoom&quot;: &quot;storymap:calculateZoom&quot;,
105
- &quot;lessBounce&quot;: &quot;storymap:lessBounce&quot;,
106
155
  &quot;lineFollowsPath&quot;: &quot;storymap:lineFollowsPath&quot;,
107
156
  &quot;showLines&quot;: &quot;storymap:showLines&quot;,
108
157
  &quot;showHistoryLine&quot;: &quot;storymap:showHistoryLine&quot;,
@@ -113,11 +162,25 @@ what the fixtures reference. Content:</p>
113
162
  &quot;lineDash&quot;: &quot;storymap:lineDash&quot;,
114
163
  &quot;lineJoin&quot;: &quot;storymap:lineJoin&quot;,
115
164
  &quot;useCustomMarkers&quot;: &quot;storymap:useCustomMarkers&quot;,
165
+ &quot;mapArea&quot;: &quot;storymap:mapArea&quot;,
166
+ &quot;overviewExtent&quot;: &quot;storymap:overviewExtent&quot;,
167
+ &quot;keyboard&quot;: &quot;storymap:keyboard&quot;,
168
+ &quot;overlays&quot;: &quot;storymap:overlays&quot;,
116
169
  &quot;type&quot;: { &quot;@id&quot;: &quot;storymap:type&quot;, &quot;@type&quot;: &quot;@id&quot; },
117
- &quot;background&quot;: &quot;storymap:background&quot;,
118
- &quot;mediaCaption&quot;: &quot;storymap:mediaCaption&quot;,
119
- &quot;mediaCredit&quot;: &quot;storymap:mediaCredit&quot;,
120
- &quot;date&quot;: &quot;storymap:date&quot;
170
+ &quot;mediaSrcset&quot;: &quot;storymap:mediaSrcset&quot;,
171
+ &quot;mediaSizes&quot;: &quot;storymap:mediaSizes&quot;,
172
+ &quot;rotation&quot;: &quot;storymap:rotation&quot;,
173
+ &quot;basemap&quot;: &quot;storymap:basemap&quot;,
174
+ &quot;filter&quot;: &quot;storymap:filter&quot;,
175
+ &quot;mask&quot;: &quot;storymap:mask&quot;,
176
+ &quot;slidetimeout&quot;: &quot;storymap:slidetimeout&quot;,
177
+ &quot;imgoverlay&quot;: &quot;storymap:imgoverlay&quot;,
178
+ &quot;loop&quot;: &quot;storymap:loop&quot;,
179
+ &quot;offset&quot;: &quot;storymap:offset&quot;,
180
+ &quot;play&quot;: &quot;storymap:play&quot;,
181
+ &quot;stopOnExit&quot;: &quot;storymap:stopOnExit&quot;,
182
+ &quot;stopAllPrevious&quot;: &quot;storymap:stopAllPrevious&quot;,
183
+ &quot;provenance&quot;: &quot;storymap:provenance&quot;
121
184
  }
122
185
  }
123
186
  </code></pre>
@@ -217,7 +280,7 @@ what the fixtures reference. Content:</p>
217
280
  <tr>
218
281
  <td><code>items</code></td>
219
282
  <td><code>slide.media</code></td>
220
- <td>AnnotationPage with the painting annotation, see below</td>
283
+ <td>AnnotationPage with the painting annotation, see below — which also carries the caption, credit and alt text</td>
221
284
  </tr>
222
285
  <tr>
223
286
  <td><code>storymap:type</code></td>
@@ -225,24 +288,29 @@ what the fixtures reference. Content:</p>
225
288
  <td><code>&quot;overview&quot;</code> marks the map overview slide</td>
226
289
  </tr>
227
290
  <tr>
228
- <td><code>storymap:background</code></td>
291
+ <td><code>background</code></td>
229
292
  <td><code>slide.background</code></td>
230
- <td><code>{url, color}</code> — only present keys</td>
293
+ <td>A painting annotation whose body is an <code>Image</code> (the url) and/or a <code>Color</code> (the colour)</td>
231
294
  </tr>
232
295
  <tr>
233
- <td><code>storymap:mediaCaption</code></td>
234
- <td><code>slide.media.caption</code></td>
235
- <td></td>
296
+ <td><code>storymap:mediaSrcset</code></td>
297
+ <td><code>slide.media.srcset</code></td>
298
+ <td>Responsive image candidates, passed through to the <code>img</code> element</td>
236
299
  </tr>
237
300
  <tr>
238
- <td><code>storymap:mediaCredit</code></td>
239
- <td><code>slide.media.credit</code></td>
240
- <td></td>
301
+ <td><code>storymap:mediaSizes</code></td>
302
+ <td><code>slide.media.sizes</code></td>
303
+ <td>The <code>sizes</code> companion of <code>mediaSrcset</code></td>
241
304
  </tr>
242
305
  <tr>
243
- <td><code>storymap:date</code></td>
306
+ <td><em>(target selector)</em></td>
307
+ <td><code>slide.location.region</code></td>
308
+ <td><code>ImageApiSelector</code> <code>xywh=pixel:x,y,w,h</code>; image stops on image-map slides</td>
309
+ </tr>
310
+ <tr>
311
+ <td><code>navDate</code></td>
244
312
  <td><code>slide.date</code></td>
245
- <td>String or object, verbatim</td>
313
+ <td>Plain string, verbatim; the official validator applies no format rule at all, so a human date is fine</td>
246
314
  </tr>
247
315
  <tr>
248
316
  <td><code>navPlace</code></td>
@@ -260,11 +328,48 @@ with one GeoJSON Feature:</p>
260
328
  verbatim. For image-map storymaps (<code>storymap:mapAsImage: true</code>) the values are
261
329
  image coordinates rather than WGS84 degrees; consumers can detect this via
262
330
  <code>storymap:mapAsImage</code>.</li>
263
- <li><code>properties</code>: marker data — <code>zoom</code>, <code>line</code>, <code>icon</code>, <code>iconSize</code>, <code>image</code>,
264
- <code>use_custom_marker</code>, <code>name</code> (only present keys).</li>
331
+ <li><code>properties</code>: marker data — <code>name</code>, <code>zoom</code>, <code>rotation</code> (view rotation in
332
+ degrees clockwise), <code>basemap</code> (a per-slide basemap override: any <code>map_type</code>
333
+ value or IIIF <code>info.json</code> URL), <code>filter</code> (per-slide image grading:
334
+ <code>brightness</code>/<code>contrast</code>/<code>saturate</code> in percent, <code>hueRotate</code> in degrees,
335
+ <code>sepia</code> in percent, <code>blur</code> in CSS pixels), <code>mask</code> (a spotlight mask:
336
+ normalized <code>{x, y, w, h}</code> viewport fractions plus <code>color</code>/<code>invert</code>), <code>line</code>,
337
+ <code>icon</code>, <code>iconSize</code>, <code>image</code>, <code>use_custom_marker</code>, plus the
338
+ presentation-only <code>popup</code> and <code>audioBadge</code> (only present keys). Slides
339
+ without <code>lat</code>/<code>lon</code> carry <code>rotation</code>/<code>basemap</code>/<code>filter</code>/<code>mask</code> as the
340
+ canvas <code>storymap:</code> terms below instead.</li>
265
341
  <li><code>location.use_custom_marker</code> / <code>use_custom_markers</code> (manifest) opt into
266
342
  custom marker rendering; see the storymap terms below.</li>
267
343
  </ul>
344
+ <p>Those properties are described by <strong><code>https://cmahnke.github.io/StoryMapJS/navplace-properties.json</code></strong>,
345
+ which a manifest using a <code>properties</code> bag should name in its <code>@context</code>. The
346
+ extension requires it (§3.2): terms in a GeoJSON Feature&#39;s <code>properties</code> must be
347
+ described either by a registered IIIF extension or by a local linked-data
348
+ context, and a client that meets a property it does not understand must ignore
349
+ it. There is no IIIF extension for marker presentation — navPlace defines
350
+ exactly one term, <code>navPlace</code> itself — so the local context is the only option.
351
+ It is why <code>popup</code> and <code>audioBadge</code> need no <code>storymap:</code> term of their own, and
352
+ the same mechanism serves marker config. The thirteen local names hang off this project&#39;s existing namespace
353
+ (<code>https://christianmahnke.de/iiif/storymap#</code>), not a new one.</p>
354
+ <h3>Context order matters</h3>
355
+ <p>The navPlace extension&#39;s context <strong>must be listed before</strong> the Presentation 3
356
+ context — §3.1 of the extension:</p>
357
+ <blockquote>
358
+ <p>The navPlace extension linked data context must be included before the IIIF
359
+ Presentation API 3 linked data context on the top-level object.</p>
360
+ </blockquote>
361
+ <p>So a manifest that uses <code>navPlace</code> declares:</p>
362
+ <pre><code class="language-json">&quot;@context&quot;: [
363
+ &quot;http://iiif.io/api/extension/navplace/context.json&quot;,
364
+ &quot;http://iiif.io/api/presentation/3/context.json&quot;,
365
+ &quot;https://cmahnke.github.io/StoryMapJS/navplace-properties.json&quot;,
366
+ &quot;https://cmahnke.github.io/StoryMapJS/context.json&quot;
367
+ ]
368
+ </code></pre>
369
+ <p>Getting this backwards does not break a viewer — the reader does not consult
370
+ either context — but it does make the document wrong as linked data, which is
371
+ the point of shipping a context at all. Every fixture in this repository had it
372
+ backwards.</p>
268
373
  <p>Alternatively a manifest MAY aggregate all slide locations in a single
269
374
  manifest-level <code>navPlace</code> with one Feature per Canvas in <code>items</code> order.</p>
270
375
  <h2>Slide media</h2>
@@ -310,7 +415,7 @@ actual image dimensions. Two body variants are valid:</p>
310
415
  }
311
416
  </code></pre>
312
417
  <p>The converter emits variant (b). Legacy <code>zoomify</code> storymaps are converted to
313
- <code>storymap:mapType: &quot;iiif&quot;</code>; since the original zoomify tile paths are dead, the
418
+ <code>storymap:basemap: &quot;iiif&quot;</code>; since the original zoomify tile paths are dead, the
314
419
  converter substitutes the IIIF reference image above (the legacy pyramid
315
420
  definition is not carried — nothing reads it).</p>
316
421
  <h2>StoryMap-specific terms</h2>
@@ -326,12 +431,80 @@ properties):</p>
326
431
  {
327
432
  &quot;id&quot;: &quot;https://example.org/storymap/&lt;name&gt;/map-config&quot;,
328
433
  &quot;type&quot;: &quot;Service&quot;,
329
- &quot;profile&quot;: &quot;https://christianmahnke.de/iiif/storymap/mapconfig&quot;,
330
- &quot;storymap:mapType&quot;: &quot;osm:standard&quot;
434
+ &quot;profile&quot;: &quot;https://cmahnke.github.io/StoryMapJS/context.json/mapconfig&quot;,
435
+ &quot;storymap:basemap&quot;: &quot;osm:standard&quot;
436
+ }
437
+ ]
438
+ }
439
+ </code></pre>
440
+ <h3>TileJSON for a tile service</h3>
441
+ <p>A keyword basemap and a tile URL template are different kinds of thing, and
442
+ <code>mapType</code> used to be both. They are now separate: <code>storymap:basemap</code> names a
443
+ source the viewer knows how to configure, and an <strong>unprefixed</strong> <code>tilejson</code>
444
+ object describes any other tile service in the standard&#39;s own terms (the
445
+ <code>tilejson</code> context entry stays prefixed by JSON-LD convention; only the
446
+ unprefixed wire form is read). Only
447
+ <code>tiles</code> is required:</p>
448
+ <pre><code class="language-json">{
449
+ &quot;service&quot;: [
450
+ {
451
+ &quot;id&quot;: &quot;https://example.org/storymap/&lt;name&gt;/map-config&quot;,
452
+ &quot;type&quot;: &quot;Service&quot;,
453
+ &quot;profile&quot;: &quot;https://cmahnke.github.io/StoryMapJS/context.json/mapconfig&quot;,
454
+ &quot;tilejson&quot;: {
455
+ &quot;tiles&quot;: [&quot;https://tiles.example.org/{z}/{x}/{y}.png&quot;],
456
+ &quot;minzoom&quot;: 4,
457
+ &quot;maxzoom&quot;: 17,
458
+ &quot;bounds&quot;: [-122.7, 37.1, -121.1, 38.1],
459
+ &quot;scheme&quot;: &quot;tms&quot;,
460
+ &quot;center&quot;: [4.4777, 51.9244, 12]
461
+ }
462
+ // `tiles` may also be a single template string — that is what the
463
+ // converter writes. The reader accepts both forms.
331
464
  }
332
465
  ]
333
466
  }
334
467
  </code></pre>
468
+ <p><code>tiles</code> becomes <code>map_type</code>, so everything that dispatches on a template (the
469
+ <code>tile_source_factory</code> option, attribution, the minimap) works unchanged. The
470
+ rest is honoured where the map can act on it when <em>reading</em> a manifest; note
471
+ the converter only writes <code>{tiles}</code> back out, so a manifest → storymap →
472
+ manifest cycle drops <code>minzoom</code>/<code>maxzoom</code>/<code>bounds</code>/<code>scheme</code>/<code>center</code>:</p>
473
+ <table>
474
+ <thead>
475
+ <tr>
476
+ <th>Member</th>
477
+ <th>Effect</th>
478
+ </tr>
479
+ </thead>
480
+ <tbody><tr>
481
+ <td><code>tiles</code></td>
482
+ <td>the tile URL template, as <code>map_type</code></td>
483
+ </tr>
484
+ <tr>
485
+ <td><code>minzoom</code></td>
486
+ <td>the view&#39;s minimum zoom, and the tile grid&#39;s range</td>
487
+ </tr>
488
+ <tr>
489
+ <td><code>maxzoom</code></td>
490
+ <td>the view&#39;s maximum zoom, and the tile grid&#39;s range</td>
491
+ </tr>
492
+ <tr>
493
+ <td><code>bounds</code></td>
494
+ <td>a <code>[west, south, east, north]</code> lon/lat box the view center is kept inside</td>
495
+ </tr>
496
+ <tr>
497
+ <td><code>scheme</code></td>
498
+ <td><code>tms</code> flips the tile row, which is counted from the bottom in TMS</td>
499
+ </tr>
500
+ <tr>
501
+ <td><code>center</code></td>
502
+ <td><code>[lon, lat, zoom]</code>, the initial view</td>
503
+ </tr>
504
+ </tbody></table>
505
+ <p>The <code>center</code> is the initial view only, and <code>bounds</code> constrains the center
506
+ without pinning the resolution — a hard extent constraint would fight the panel
507
+ offset, the same reason <code>map_bbox</code> works the way it does.</p>
335
508
  <table>
336
509
  <thead>
337
510
  <tr>
@@ -341,9 +514,14 @@ properties):</p>
341
514
  </tr>
342
515
  </thead>
343
516
  <tbody><tr>
344
- <td><code>mapType</code></td>
517
+ <td><code>basemap</code></td>
345
518
  <td><code>map_type</code></td>
346
- <td><code>osm:standard</code>, <code>mapbox:...</code>, <code>stadia:...</code>, <code>iiif</code>, or an <code>https://...</code> tile URL; <code>zoomify</code> is replaced by <code>iiif</code></td>
519
+ <td>A keyword the viewer configures itself: <code>osm:standard</code>, <code>mapbox://styles/...</code>, <code>stadia:...</code>, <code>iiif</code>. <code>zoomify</code> is replaced by <code>iiif</code></td>
520
+ </tr>
521
+ <tr>
522
+ <td><em>(unprefixed)</em> <code>tilejson</code></td>
523
+ <td><code>map_type</code> + <code>tilejson</code></td>
524
+ <td>TileJSON 2.1 for an arbitrary tile service — see below</td>
347
525
  </tr>
348
526
  <tr>
349
527
  <td><code>mapAsImage</code></td>
@@ -366,19 +544,19 @@ properties):</p>
366
544
  <td><code>{left, top}</code></td>
367
545
  </tr>
368
546
  <tr>
369
- <td><code>mapSubdomains</code></td>
547
+ <td><em>(none — removed)</em></td>
370
548
  <td><code>map_subdomains</code></td>
371
- <td>Tile URL subdomains</td>
549
+ <td><em>dropped</em> (inert, no reader; see the full mapping table)</td>
372
550
  </tr>
373
551
  <tr>
374
- <td><code>iiifUrl</code></td>
552
+ <td><em>(none)</em></td>
375
553
  <td><code>iiif.url</code></td>
376
- <td>IIIF Image API <code>info.json</code> URL for image-map storymaps</td>
554
+ <td>From the Image API <code>service[]</code> a painting body carries, plus <code>/info.json</code>; see below</td>
377
555
  </tr>
378
556
  <tr>
379
557
  <td><code>fontCss</code></td>
380
558
  <td><code>font_css</code></td>
381
- <td>e.g. <code>stock:dancing-ledger</code></td>
559
+ <td>e.g. <code>stock:dancing-ledger</code>, or <code>false</code> for no injected theme</td>
382
560
  </tr>
383
561
  <tr>
384
562
  <td><code>callToAction</code></td>
@@ -406,9 +584,9 @@ properties):</p>
406
584
  <td>boolean</td>
407
585
  </tr>
408
586
  <tr>
409
- <td><code>lessBounce</code></td>
587
+ <td><em>(none — removed)</em></td>
410
588
  <td><code>less_bounce</code></td>
411
- <td>boolean</td>
589
+ <td><em>dropped</em> (inert, no reader; see the full mapping table)</td>
412
590
  </tr>
413
591
  <tr>
414
592
  <td><code>lineFollowsPath</code></td>
@@ -460,15 +638,387 @@ properties):</p>
460
638
  <td><code>use_custom_markers</code></td>
461
639
  <td>boolean</td>
462
640
  </tr>
641
+ <tr>
642
+ <td><code>mapArea</code></td>
643
+ <td><code>map_area</code></td>
644
+ <td><code>&quot;full&quot;</code> (default) or <code>&quot;left&quot;</code></td>
645
+ </tr>
646
+ <tr>
647
+ <td><code>overviewExtent</code></td>
648
+ <td><code>overview_extent</code></td>
649
+ <td><code>[west, south, east, north]</code> lon/lat box for the minimap overview</td>
650
+ </tr>
651
+ <tr>
652
+ <td><code>keyboard</code></td>
653
+ <td><code>keyboard</code></td>
654
+ <td>boolean: arrow keys navigate the story from anywhere</td>
655
+ </tr>
656
+ <tr>
657
+ <td><code>overlays</code></td>
658
+ <td><code>overlays</code></td>
659
+ <td>array of stacked layers (see below)</td>
660
+ </tr>
661
+ <tr>
662
+ <td><em>(georeferencing annotation)</em></td>
663
+ <td><code>overlays[]</code> (georeference entries)</td>
664
+ <td>IIIF images placed from ground control points — see &quot;Geo-referenced layers&quot;</td>
665
+ </tr>
666
+ <tr>
667
+ <td><em>(viewer option)</em></td>
668
+ <td><code>show_layers_control</code>, <code>basemaps</code></td>
669
+ <td>the layer switcher and its basemap list: viewer-side only, never read from a manifest; <code>label</code> functions likewise never cross the JSON boundary</td>
670
+ </tr>
463
671
  </tbody></table>
464
672
  <h3>Canvas level — direct properties</h3>
465
673
  <p>Canvas objects are open for extension terms, so slide-specific StoryMap data is
466
- carried directly on the Canvas: <code>storymap:type</code>, <code>storymap:background</code>,
467
- <code>storymap:mediaCaption</code>, <code>storymap:mediaCredit</code>, <code>storymap:date</code> (see the
468
- Canvas table above).</p>
674
+ carried directly on the Canvas: <code>storymap:type</code>, plus the two terms with no
675
+ standard home, <code>storymap:mediaSrcset</code> and <code>storymap:mediaSizes</code> (see the
676
+ Canvas table above), plus the view directives <code>storymap:rotation</code>,
677
+ <code>storymap:basemap</code>, <code>storymap:filter</code> and <code>storymap:mask</code> (the fallback for
678
+ slides without <code>lat</code>/<code>lon</code>, which have no <code>navPlace</code> to carry them — the
679
+ reader prefers <code>navPlace</code> when both spell a key), the per-slide autoplay
680
+ dwell <code>storymap:slidetimeout</code> (milliseconds, <code>0</code> holds), the per-slide
681
+ image overlay <code>storymap:imgoverlay</code> (<code>{url, size?, opacity?, extent?}</code>) and
682
+ the provenance identifiers <code>storymap:provenance</code>
683
+ (<code>{manifest?, canvas?, image?}</code>, data-only). A slide&#39;s date is the standard <code>navDate</code> and its
684
+ background is the standard <code>background</code> annotation. The media caption, credit and alt
685
+ text are <strong>not</strong> terms any more: they are the painting annotation&#39;s own <code>label</code>,
686
+ <code>requiredStatement</code> and <code>accessibilitySummary</code>, which is where Presentation 3
687
+ defines them. A manifest written against the old terms still loads — the strings
688
+ are simply no longer read.</p>
469
689
  <p>Readers must use the prefixed term for the slide type (<code>storymap:type</code>): the
470
690
  bare <code>type</code> key of a Canvas is the IIIF class type (<code>&quot;Canvas&quot;</code>) and can never
471
691
  carry the StoryMap slide type.</p>
692
+ <p><strong>Gating.</strong> The slideshow-motivated fields above (<code>rotation</code>, <code>basemap</code>,
693
+ <code>filter</code>, <code>mask</code>, <code>slidetimeout</code>, <code>imgoverlay</code>, <code>provenance</code>) are read
694
+ data-preservingly from any manifest, but they render <strong>only for slideshow
695
+ tours</strong> (the viewer&#39;s internal <code>slideshow_source</code> marker, set when a
696
+ document arrives through the slideshow translator). Hand-written manifests
697
+ and storymap JSON keep the long-standing rendering; see the README&#39;s
698
+ slideshow section. The playback flags (<code>storymap:loop/offset/play/ stopOnExit/stopAllPrevious</code>) are gated the same way.</p>
699
+ <p><strong>Placement.</strong> The view directives live on the <strong>Canvas</strong> (direct
700
+ properties); the playback flags live as <strong>Annotation</strong> foreign members —
701
+ <code>storymap:loop/offset/play/stopOnExit</code> on the painting annotation (for
702
+ audio/video media) and the full set including <code>storymap:stopAllPrevious</code>
703
+ on the <code>supplementing</code> narration annotation. When a key is spelled both on
704
+ the Canvas and in <code>navPlace</code> properties, <code>navPlace</code> wins.</p>
705
+ <h2>Annotation-driven tour stops</h2>
706
+ <p>A Canvas annotation whose <code>motivation</code> is <code>commenting</code>, <code>tagging</code>,
707
+ <code>classifying</code> or <code>describing</code> and whose target resolves to a region becomes
708
+ one slide, appended after that Canvas&#39;s own slide. This is the shape Storiiies
709
+ and Micrio use for a guided tour of one image, and it is the subject of
710
+ <a href="./authoring.html"">docs/iiif-authoring.md</a>.</p>
711
+ <ul>
712
+ <li><strong>Target</strong> — <code>xywh=</code> fragment / Image API Selector, or a <code>PointSelector</code>
713
+ (synthesized into a square of 5% of the Canvas&#39;s smaller side, centred and
714
+ clamped). A <code>TextQuoteSelector</code>, <code>TimeState</code> or <code>SvgSelector</code> is preserved
715
+ but not resolved or drawn. A bare string target&#39;s <code>#xywh=</code> counts. An
716
+ annotation aimed at the whole Canvas is <strong>not</strong> a stop.</li>
717
+ <li><strong>Body</strong> — a <code>TextualBody</code> supplies the slide text (<code>text/plain</code> escaped and
718
+ split per blank-line block, <code>text/html</code> kept as markup); a body with an
719
+ <code>id</code> (e.g. <code>type: &quot;Sound&quot;</code>) supplies <code>media.url</code>, whose extension picks the
720
+ player. An annotation with a region but no body is not a stop.</li>
721
+ <li><strong>Region stops are honoured in image mode</strong> only — the same rule as a
722
+ <code>xywh=pixel:</code> region. A geographic map ignores them.</li>
723
+ <li><code>navPlace</code> may not appear on an Annotation (the extension forbids it), so
724
+ all stops on a Canvas share that Canvas&#39;s location and marker presentation.</li>
725
+ </ul>
726
+ <h2>What the body record carries</h2>
727
+ <p>The painting annotation&#39;s body is read into one shared record. The
728
+ <code>storymap:mediaCaption</code> / <code>mediaCredit</code> / <code>mediaAlt</code> extension terms are
729
+ dropped — a manifest still using them loads, but the strings are not read —
730
+ and the standard properties are the only source:</p>
731
+ <table>
732
+ <thead>
733
+ <tr>
734
+ <th>Body property</th>
735
+ <th>Slide media field</th>
736
+ </tr>
737
+ </thead>
738
+ <tbody><tr>
739
+ <td><code>label</code></td>
740
+ <td><code>caption</code></td>
741
+ </tr>
742
+ <tr>
743
+ <td><code>requiredStatement</code> (one <code>{label, value}</code> object) or <code>provider</code></td>
744
+ <td><code>credit</code></td>
745
+ </tr>
746
+ <tr>
747
+ <td><code>accessibilitySummary</code></td>
748
+ <td><code>alt</code></td>
749
+ </tr>
750
+ <tr>
751
+ <td><code>thumbnail</code></td>
752
+ <td><code>thumb</code></td>
753
+ </tr>
754
+ <tr>
755
+ <td><code>type</code>, <code>format</code></td>
756
+ <td>player selection (<code>MediaType()</code>)</td>
757
+ </tr>
758
+ <tr>
759
+ <td><code>duration</code>, <code>start</code>, <code>end</code></td>
760
+ <td>time-anchored stops</td>
761
+ </tr>
762
+ <tr>
763
+ <td>a sibling <code>TextualBody</code> with <code>format: text/vtt</code> <strong>and an <code>id</code></strong></td>
764
+ <td><code>subtitles</code> (both required — the <code>id</code> is the subtitle file URL)</td>
765
+ </tr>
766
+ </tbody></table>
767
+ <h2>Native IIIF vs. the StoryMap extension</h2>
768
+ <p>IIIF defines three approved Presentation API extensions — navPlace, Text
769
+ Granularity and Georeference — and <strong>no vocabulary for a basemap or a tile
770
+ layer stack</strong>. Everything the viewer draws under and over the story (basemap
771
+ type, layout, minimap bounds, stacked layers, keyboard navigation) therefore
772
+ stays in the <code>storymap:</code> terms of the map configuration service, which is the
773
+ JSON-LD-idiomatic place for extended configuration. What IIIF <em>does</em> model
774
+ natively is used wherever it exists:</p>
775
+ <table>
776
+ <thead>
777
+ <tr>
778
+ <th>Story</th>
779
+ <th>Native IIIF</th>
780
+ <th>Used here</th>
781
+ </tr>
782
+ </thead>
783
+ <tbody><tr>
784
+ <td>Slide location</td>
785
+ <td><code>navPlace</code> Point</td>
786
+ <td>yes</td>
787
+ </tr>
788
+ <tr>
789
+ <td>Story extent</td>
790
+ <td><code>navPlace</code> Polygon (an explicit navPlace use case)</td>
791
+ <td>yes — a canvas polygon becomes <code>map_bbox</code></td>
792
+ </tr>
793
+ <tr>
794
+ <td>Image region stops</td>
795
+ <td><code>ImageApiSelector</code> <code>xywh=pixel:</code> on the painting annotation target</td>
796
+ <td>yes — the selector is the only source (§2.8)</td>
797
+ </tr>
798
+ <tr>
799
+ <td>Raster layer placed on a map</td>
800
+ <td><a href="https://iiif.io/api/extension/georef">Georeference Extension</a> (GCPs, <code>motivation: &quot;georeferencing&quot;</code>)</td>
801
+ <td>yes — see below</td>
802
+ </tr>
803
+ <tr>
804
+ <td>Basemap, layer stack, layout, keyboard</td>
805
+ <td>—</td>
806
+ <td>no; <code>storymap:</code> terms</td>
807
+ </tr>
808
+ </tbody></table>
809
+ <h3>Groups and the slide order</h3>
810
+ <p><code>structures</code> does two jobs. A Range with a <code>label</code> and no <code>start</code> is a <strong>group</strong>,
811
+ and every canvas it contains gets that value as <code>slide.group</code>; nested Ranges are
812
+ chapters inside it, and the outermost labelled Range is the group. And the order
813
+ canvases appear in is the <strong>slide order</strong> — a Range is allowed to run them in a
814
+ order the document does not, which is what a storyboard is for:</p>
815
+ <pre><code class="language-json">{
816
+ &quot;structures&quot;: [
817
+ {
818
+ &quot;id&quot;: &quot;https://example.org/storymap/&lt;name&gt;/range/1&quot;,
819
+ &quot;type&quot;: &quot;Range&quot;,
820
+ &quot;label&quot;: { &quot;none&quot;: [&quot;Act I&quot;] },
821
+ &quot;items&quot;: [
822
+ &quot;https://example.org/storymap/&lt;name&gt;/canvas/1&quot;,
823
+ &quot;https://example.org/storymap/&lt;name&gt;/canvas/3&quot;
824
+ ]
825
+ }
826
+ ]
827
+ }
828
+ </code></pre>
829
+ <p>A canvas in no Range keeps its document position, after the ones a Range does
830
+ mention. A Range with a <code>start</code> is a time segment of a canvas, not a group: it
831
+ contributes order and nothing else.</p>
832
+ <h3>Deep links and external annotations</h3>
833
+ <p>Two things a manifest can offer that a viewer used to ignore.</p>
834
+ <p><strong>A stop can be linked by its identity.</strong> Every canvas id is a <code>uniqueid</code>
835
+ (§2.3), so a stop is addressable by something that survives a slide being
836
+ inserted above it. The viewer writes both forms:</p>
837
+ <table>
838
+ <thead>
839
+ <tr>
840
+ <th>Where</th>
841
+ <th>Form</th>
842
+ <th>Example</th>
843
+ </tr>
844
+ </thead>
845
+ <tbody><tr>
846
+ <td><code>change</code> payload</td>
847
+ <td><code>current_id</code>, next to <code>current_slide</code></td>
848
+ <td>—</td>
849
+ </tr>
850
+ <tr>
851
+ <td>URL hash</td>
852
+ <td><code>#slide-&lt;uniqueid&gt;</code>, or <code>#slide-3</code> for a storymap-JSON slide</td>
853
+ <td><code>#slide-https%3A%2F%2F…%2Fcanvas%2F3</code></td>
854
+ </tr>
855
+ <tr>
856
+ <td>Query parameter</td>
857
+ <td><code>iiif-content</code>, IIIF Content State 1.0</td>
858
+ <td><code>?iiif-content=https://…/canvas/3</code></td>
859
+ </tr>
860
+ </tbody></table>
861
+ <p>Both are read on load, and the hash again on every <code>hashchange</code>, so browser
862
+ back/forward keeps working. The index form is still accepted, so links shared
863
+ before ids were emitted keep resolving.</p>
864
+ <p>The <code>iiif-content</code> parameter is the standard&#39;s own format and follows its
865
+ encoding rule, which is deliberately asymmetric: a <strong>plain URI is written
866
+ unencoded</strong>, a <strong>JSON-LD form is content-state-encoded</strong> (base64url, no
867
+ padding). A whole canvas is therefore a bare target URI, while a region — which
868
+ the spec says a bare URI cannot express — is the encoded Target Body:</p>
869
+ <pre><code class="language-json">{
870
+ &quot;target&quot;: {
871
+ &quot;type&quot;: &quot;SpecificResource&quot;,
872
+ &quot;source&quot;: { &quot;id&quot;: &quot;https://example.org/canvas/7&quot;, &quot;type&quot;: &quot;Canvas&quot; },
873
+ &quot;selector&quot;: { &quot;type&quot;: &quot;ImageApiSelector&quot;, &quot;value&quot;: &quot;xywh=pixel:10,20,30,40&quot; }
874
+ }
875
+ }
876
+ </code></pre>
877
+ <p><strong>External annotations.</strong> A manifest&#39;s <code>seeAlso</code> points at annotation
878
+ collections or pages that live on an annotation server. They are recorded on the
879
+ data as <code>see_also</code> but <strong>not fetched</strong> — reading them is a network round trip
880
+ per document, and a viewer should not block its first paint on a third party. A
881
+ host opts in:</p>
882
+ <pre><code class="language-js">const { stops, searchService, failed } = await storymap.loadAnnotations();
883
+ </code></pre>
884
+ <p>which fetches, merges the annotations for the canvases being rendered into tour
885
+ stops, and fires <code>annotationsloaded</code> with the same value. A <code>SearchService1</code> in
886
+ <code>seeAlso</code> is reported as <code>searchService</code> rather than followed. One level of
887
+ indirection is followed, so a collection may reference its pages, but a cycle
888
+ cannot become an infinite walk. Fetching is cached per document, so two calls
889
+ share one request.</p>
890
+ <h3>Institutional credit</h3>
891
+ <p>A manifest says who published it and under what licence, and all of it ends up
892
+ on the one credit line the viewer renders — the map attribution the host can
893
+ also feed with <code>setExtraAttributions()</code>:</p>
894
+ <table>
895
+ <thead>
896
+ <tr>
897
+ <th>Manifest property</th>
898
+ <th>Becomes</th>
899
+ </tr>
900
+ </thead>
901
+ <tbody><tr>
902
+ <td><code>requiredStatement</code></td>
903
+ <td><code>Attribution: &lt;value&gt;</code></td>
904
+ </tr>
905
+ <tr>
906
+ <td><code>provider</code> (Agent)</td>
907
+ <td><code>Provider: &lt;label, or the id&gt;</code></td>
908
+ </tr>
909
+ <tr>
910
+ <td><code>rights</code></td>
911
+ <td><code>Licence: &lt;uri&gt;</code></td>
912
+ </tr>
913
+ <tr>
914
+ <td><code>homepage</code> (Agent)</td>
915
+ <td>the Agent&#39;s label or id, unlabelled</td>
916
+ </tr>
917
+ </tbody></table>
918
+ <p>They are joined with <code>·</code> in that order. <code>logo</code> is an image rather than a
919
+ credit line, so it is offered as <code>data.logo</code>, and <code>metadata</code>&#39;s label/value
920
+ pairs are handed on as <code>data.metadata[]</code> — arbitrary pairs cannot be rendered
921
+ generically, and dropping them loses provenance.</p>
922
+ <p>The converter writes a <code>metadata</code> pair reading &quot;Generated by: StoryMapJS&quot;
923
+ rather than claiming to be the manifest&#39;s <code>provider</code>. P3&#39;s <code>provider</code> is
924
+ whoever published the content, and the converter does not know that; writing
925
+ itself there would put &quot;Provider: StoryMapJS&quot; on the credit line of every
926
+ converted storymap.</p>
927
+ <h3>Geo-referenced layers</h3>
928
+ <p>A <code>motivation: &quot;georeferencing&quot;</code> annotation carries the Georeference Extension
929
+ payload: the IIIF Image API service to place in its <code>target</code>, and its ground
930
+ control points (<code>properties.resourceCoords</code> ↔ <code>geometry.coordinates</code>, WGS84) in
931
+ its <code>body</code>. Per the extension, a layer that is not part of the canvas it ships
932
+ in — which is every map layer — embeds the image it places in <code>target</code> rather
933
+ than referencing it. The viewer fits the points affinely and places the image,
934
+ which OpenLayers reprojects onto the view exactly like the IIIF basemap:</p>
935
+ <pre><code class="language-json">{
936
+ &quot;items&quot;: [
937
+ {
938
+ &quot;id&quot;: &quot;https://example.org/storymap/&lt;name&gt;/canvas/1&quot;,
939
+ &quot;type&quot;: &quot;Canvas&quot;,
940
+ &quot;items&quot;: [
941
+ {
942
+ &quot;id&quot;: &quot;https://example.org/storymap/&lt;name&gt;/canvas/1/georeferencing/1&quot;,
943
+ &quot;type&quot;: &quot;Annotation&quot;,
944
+ &quot;motivation&quot;: &quot;georeferencing&quot;,
945
+ &quot;target&quot;: {
946
+ &quot;id&quot;: &quot;https://iiif.example.org/image1&quot;,
947
+ &quot;type&quot;: &quot;Image&quot;,
948
+ &quot;width&quot;: 5965,
949
+ &quot;height&quot;: 2514,
950
+ &quot;service&quot;: [
951
+ {
952
+ &quot;id&quot;: &quot;https://iiif.example.org/image1&quot;,
953
+ &quot;type&quot;: &quot;ImageService3&quot;,
954
+ &quot;profile&quot;: &quot;level2&quot;
955
+ }
956
+ ]
957
+ },
958
+ &quot;requiredStatement&quot;: {
959
+ &quot;label&quot;: { &quot;none&quot;: [&quot;Attribution&quot;] },
960
+ &quot;value&quot;: { &quot;none&quot;: [&quot;Sheet 12, 1789&quot;] }
961
+ },
962
+ &quot;body&quot;: {
963
+ &quot;type&quot;: &quot;FeatureCollection&quot;,
964
+ &quot;transformation&quot;: { &quot;type&quot;: &quot;polynomial&quot;, &quot;options&quot;: { &quot;order&quot;: 1 } },
965
+ &quot;features&quot;: [
966
+ {
967
+ &quot;type&quot;: &quot;Feature&quot;,
968
+ &quot;properties&quot;: { &quot;resourceCoords&quot;: [5085, 782] },
969
+ &quot;geometry&quot;: {
970
+ &quot;type&quot;: &quot;Point&quot;,
971
+ &quot;coordinates&quot;: [4.4885839, 51.9101828]
972
+ }
973
+ }
974
+ ]
975
+ }
976
+ }
977
+ ]
978
+ }
979
+ ]
980
+ }
981
+ </code></pre>
982
+ <p>An annotation is canvas-scoped but the layer it describes is map-wide, so the
983
+ annotations are collected from <strong>every</strong> canvas: a layer annotated on the first
984
+ canvas still applies to the whole story. <code>requiredStatement</code> is read as the
985
+ layer&#39;s attribution. The other presentation keys the term could carry —
986
+ <code>opacity</code>, <code>visible</code>, <code>className</code>, <code>blendMode</code> — have no IIIF vocabulary for a
987
+ georeferencing annotation and are not read; the extent is not lost in substance,
988
+ because the control points describe it. Entries with fewer than three usable
989
+ points are dropped while reading.</p>
990
+ <p><strong>A caveat about the official validator.</strong> The Presentation 3.0 validator checks
991
+ against the base JSON Schema, which predates the Georeference Extension, so it
992
+ rejects a <code>FeatureCollection</code> body and an embedded <code>Image</code> target with <em>&quot;is not
993
+ valid under any of the given schemas&quot;</em> — even with the extension&#39;s own context
994
+ declared, which does resolve at
995
+ <code>http://iiif.io/api/extension/georef/1/context.json</code>. We keep the extension&#39;s
996
+ spelling anyway: a georeferenced manifest that other IIIF tools can read is
997
+ worth more than one this particular validator accepts. <code>npm run validate:iiif</code>
998
+ reports the two georeferenced fixtures as <em>not covered</em> rather than as failures,
999
+ with that reason.</p>
1000
+ <p>The result is an <code>overlays[]</code> entry, so <code>setOverlayVisible()</code> /
1001
+ <code>setOverlayOpacity()</code> and the rest of the layer API work on it as for any other
1002
+ layer. A storymap-JSON <code>overlays[]</code> entry may carry a <code>georeference</code> in place
1003
+ of a <code>map_type</code>, which is the shape the converter writes these annotations
1004
+ from.</p>
1005
+ <p><strong>Limits.</strong> The extension also allows second/third-order polynomials, thin
1006
+ plate splines and rotated or skewed sheets. OpenLayers places an image as an
1007
+ axis-aligned extent, so the viewer fits the affine (first-order) case only:
1008
+ anything else is reported in the console and skipped rather than drawn in the
1009
+ wrong place. For true warping, plug
1010
+ <a href="https://www.npmjs.com/package/@allmaps/openlayers">Allmaps&#39; <code>WarpedMapLayer</code></a>
1011
+ (or any OpenLayers layer) into the <code>tile_source_factory</code> option and keep the
1012
+ georeference data on your side — see the &quot;IIIF extensions&quot; recipe in
1013
+ <a href="./migration.html">docs/migration-from-knightlab.md</a>. Image-space
1014
+ maps (<code>map_as_image</code>, zoomify) have no geographic view, so a placed sheet is
1015
+ skipped there as well.</p>
1016
+ <p>A storymap-JSON <code>overlays[]</code> entry can carry a <code>georeference</code> — url, width,
1017
+ height and the FeatureCollection body — instead of a <code>map_type</code>, and the
1018
+ converter writes it as the annotation above, on the first canvas. The two
1019
+ georeferenced fixtures are still hand-authored: they are the only manifests in
1020
+ the set with no storymap-JSON source. <code>georeferenced-layer.json</code> places its
1021
+ sheet; <code>georeferenced-layer-unsupported.json</code> shows the skip path.</p>
472
1022
  <h2>Validator interop</h2>
473
1023
  <p>The official IIIF presentation validator
474
1024
  (<code>https://presentation-validator.iiif.io/validate?version=3.0&amp;format=json</code>)
@@ -489,8 +1039,9 @@ official validator and fails CI when any of them is rejected.</p>
489
1039
  photo, and a slide with a YouTube video — full manifest:</p>
490
1040
  <pre><code class="language-json">{
491
1041
  &quot;@context&quot;: [
492
- &quot;http://iiif.io/api/presentation/3/context.json&quot;,
493
1042
  &quot;http://iiif.io/api/extension/navplace/context.json&quot;,
1043
+ &quot;http://iiif.io/api/presentation/3/context.json&quot;,
1044
+ &quot;https://cmahnke.github.io/StoryMapJS/navplace-properties.json&quot;,
494
1045
  &quot;https://cmahnke.github.io/StoryMapJS/context.json&quot;
495
1046
  ],
496
1047
  &quot;id&quot;: &quot;https://example.org/storymap/storm&quot;,
@@ -508,8 +1059,8 @@ photo, and a slide with a YouTube video — full manifest:</p>
508
1059
  {
509
1060
  &quot;id&quot;: &quot;https://example.org/storymap/storm/map-config&quot;,
510
1061
  &quot;type&quot;: &quot;Service&quot;,
511
- &quot;profile&quot;: &quot;https://christianmahnke.de/iiif/storymap/mapconfig&quot;,
512
- &quot;storymap:mapType&quot;: &quot;osm:standard&quot;,
1062
+ &quot;profile&quot;: &quot;https://cmahnke.github.io/StoryMapJS/context.json/mapconfig&quot;,
1063
+ &quot;storymap:basemap&quot;: &quot;osm:standard&quot;,
513
1064
  &quot;storymap:language&quot;: &quot;en&quot;,
514
1065
  &quot;storymap:showLines&quot;: true,
515
1066
  &quot;storymap:showHistoryLine&quot;: true,
@@ -546,7 +1097,7 @@ photo, and a slide with a YouTube video — full manifest:</p>
546
1097
  }
547
1098
  ],
548
1099
  &quot;storymap:type&quot;: &quot;overview&quot;,
549
- &quot;storymap:date&quot;: &quot;Sep 1&quot;
1100
+ &quot;navDate&quot;: &quot;Sep 1&quot;
550
1101
  },
551
1102
  {
552
1103
  &quot;id&quot;: &quot;https://example.org/storymap/storm/canvas/2&quot;,
@@ -569,14 +1120,17 @@ photo, and a slide with a YouTube video — full manifest:</p>
569
1120
  &quot;type&quot;: &quot;Image&quot;,
570
1121
  &quot;format&quot;: &quot;image/jpeg&quot;
571
1122
  },
572
- &quot;target&quot;: &quot;https://example.org/storymap/storm/canvas/2&quot;
1123
+ &quot;target&quot;: &quot;https://example.org/storymap/storm/canvas/2&quot;,
1124
+ &quot;label&quot;: &quot;Landfall&quot;,
1125
+ &quot;requiredStatement&quot;: {
1126
+ &quot;label&quot;: { &quot;none&quot;: [&quot;Credit&quot;] },
1127
+ &quot;value&quot;: { &quot;none&quot;: [&quot;Weather Service&quot;] }
1128
+ }
573
1129
  }
574
1130
  ]
575
1131
  }
576
1132
  ],
577
- &quot;storymap:mediaCaption&quot;: &quot;Landfall&quot;,
578
- &quot;storymap:mediaCredit&quot;: &quot;Weather Service&quot;,
579
- &quot;storymap:date&quot;: &quot;Sep 2&quot;,
1133
+ &quot;navDate&quot;: &quot;Sep 2&quot;,
580
1134
  &quot;navPlace&quot;: {
581
1135
  &quot;id&quot;: &quot;https://example.org/storymap/storm/canvas/2/navplace&quot;,
582
1136
  &quot;type&quot;: &quot;FeatureCollection&quot;,
@@ -609,13 +1163,16 @@ photo, and a slide with a YouTube video — full manifest:</p>
609
1163
  &quot;id&quot;: &quot;https://www.youtube.com/watch?v=example&quot;,
610
1164
  &quot;type&quot;: &quot;Video&quot;
611
1165
  },
612
- &quot;target&quot;: &quot;https://example.org/storymap/storm/canvas/3&quot;
1166
+ &quot;target&quot;: &quot;https://example.org/storymap/storm/canvas/3&quot;,
1167
+ &quot;requiredStatement&quot;: {
1168
+ &quot;label&quot;: { &quot;none&quot;: [&quot;Credit&quot;] },
1169
+ &quot;value&quot;: { &quot;none&quot;: [&quot;News&quot;] }
1170
+ }
613
1171
  }
614
1172
  ]
615
1173
  }
616
1174
  ],
617
- &quot;storymap:mediaCredit&quot;: &quot;News&quot;,
618
- &quot;storymap:date&quot;: &quot;Sep 3&quot;,
1175
+ &quot;navDate&quot;: &quot;Sep 3&quot;,
619
1176
  &quot;navPlace&quot;: {
620
1177
  &quot;id&quot;: &quot;https://example.org/storymap/storm/canvas/3/navplace&quot;,
621
1178
  &quot;type&quot;: &quot;FeatureCollection&quot;,
@@ -650,7 +1207,7 @@ photo, and a slide with a YouTube video — full manifest:</p>
650
1207
  </tr>
651
1208
  <tr>
652
1209
  <td><code>map_type</code></td>
653
- <td><code>service[0].storymap:mapType</code> (<code>zoomify</code> → <code>iiif</code>)</td>
1210
+ <td><code>service[0].storymap:basemap</code> (<code>zoomify</code> → <code>iiif</code>), or <code>tilejson.tiles</code></td>
654
1211
  </tr>
655
1212
  <tr>
656
1213
  <td><code>map_as_image</code></td>
@@ -662,7 +1219,7 @@ photo, and a slide with a YouTube video — full manifest:</p>
662
1219
  </tr>
663
1220
  <tr>
664
1221
  <td><code>map_subdomains</code></td>
665
- <td><code>service[0].storymap:mapSubdomains</code></td>
1222
+ <td><em>dropped</em> (inert, no reader)</td>
666
1223
  </tr>
667
1224
  <tr>
668
1225
  <td><code>map_access_token</code></td>
@@ -685,6 +1242,22 @@ photo, and a slide with a YouTube video — full manifest:</p>
685
1242
  <td><code>service[0].storymap:useCustomMarkers</code></td>
686
1243
  </tr>
687
1244
  <tr>
1245
+ <td><code>map_area</code></td>
1246
+ <td><code>service[0].storymap:mapArea</code></td>
1247
+ </tr>
1248
+ <tr>
1249
+ <td><code>overview_extent</code></td>
1250
+ <td><code>service[0].storymap:overviewExtent</code></td>
1251
+ </tr>
1252
+ <tr>
1253
+ <td><code>keyboard</code></td>
1254
+ <td><code>service[0].storymap:keyboard</code></td>
1255
+ </tr>
1256
+ <tr>
1257
+ <td><code>overlays</code> (georeference)</td>
1258
+ <td>Georeferencing annotation <code>target</code> + <code>body</code></td>
1259
+ </tr>
1260
+ <tr>
688
1261
  <td><code>zoom_distance</code></td>
689
1262
  <td><em>dropped</em> (viewer setting)</td>
690
1263
  </tr>
@@ -694,7 +1267,7 @@ photo, and a slide with a YouTube video — full manifest:</p>
694
1267
  </tr>
695
1268
  <tr>
696
1269
  <td><code>less_bounce</code></td>
697
- <td><code>service[0].storymap:lessBounce</code></td>
1270
+ <td><em>dropped</em> (inert, no reader)</td>
698
1271
  </tr>
699
1272
  <tr>
700
1273
  <td><code>line_follows_path</code></td>
@@ -734,7 +1307,7 @@ photo, and a slide with a YouTube video — full manifest:</p>
734
1307
  </tr>
735
1308
  <tr>
736
1309
  <td><code>iiif.url</code></td>
737
- <td><code>service[0].storymap:iiifUrl</code> + canvas Image annotation <code>service[]</code></td>
1310
+ <td>Canvas Image annotation <code>service[0].id</code> + <code>/info.json</code> (only when the story uses <code>map_type: &quot;iiif&quot;</code>)</td>
738
1311
  </tr>
739
1312
  <tr>
740
1313
  <td><code>iiif.attribution</code></td>
@@ -746,7 +1319,7 @@ photo, and a slide with a YouTube video — full manifest:</p>
746
1319
  </tr>
747
1320
  <tr>
748
1321
  <td><code>font_css</code></td>
749
- <td><code>service[0].storymap:fontCss</code></td>
1322
+ <td><code>service[0].storymap:fontCss</code> (<code>false</code> disables the injected theme)</td>
750
1323
  </tr>
751
1324
  <tr>
752
1325
  <td><code>call_to_action</code></td>
@@ -768,6 +1341,18 @@ photo, and a slide with a YouTube video — full manifest:</p>
768
1341
  <td><em>(root) <code>width</code>, <code>height</code></em></td>
769
1342
  <td><em>dropped</em> (viewer embed size)</td>
770
1343
  </tr>
1344
+ <tr>
1345
+ <td><em>(slideshow tours) player chrome (<code>textmode</code>, <code>textsize</code>, <code>progressbar</code>, <code>fxmode</code>, <code>mode</code>, <code>hud*</code>, <code>shownav</code>, <code>show_*</code>, <code>viewerheight</code>, <code>autoplay</code>)</em></td>
1346
+ <td><em>dropped</em> (no IIIF vocabulary; translator-only, see docs/slideshow.md)</td>
1347
+ </tr>
1348
+ <tr>
1349
+ <td><code>credit.creator</code> / <code>credit.rights</code></td>
1350
+ <td>Manifest <code>metadata</code> entries (&quot;Creator&quot; / &quot;Rights&quot;) — one way: the reader keeps all metadata in <code>data.metadata[]</code> and never reconstructs <code>credit</code>, and <code>credit.licenseUrl</code> is not written at all</td>
1351
+ </tr>
1352
+ <tr>
1353
+ <td><code>iiif.fallbackUrl</code></td>
1354
+ <td><em>dropped</em> (runtime fallback; tour documents carry <code>image_static</code> per stop)</td>
1355
+ </tr>
771
1356
  </tbody></table>
772
1357
  <table>
773
1358
  <thead>
@@ -782,7 +1367,7 @@ photo, and a slide with a YouTube video — full manifest:</p>
782
1367
  </tr>
783
1368
  <tr>
784
1369
  <td><code>date</code></td>
785
- <td>Canvas <code>storymap:date</code></td>
1370
+ <td>Canvas <code>navDate</code></td>
786
1371
  </tr>
787
1372
  <tr>
788
1373
  <td><code>text.headline</code></td>
@@ -825,6 +1410,46 @@ photo, and a slide with a YouTube video — full manifest:</p>
825
1410
  <td>Canvas <code>navPlace</code> Feature <code>properties.use_custom_marker</code></td>
826
1411
  </tr>
827
1412
  <tr>
1413
+ <td><code>location.rotation</code></td>
1414
+ <td>Canvas <code>navPlace</code> Feature <code>properties.rotation</code>, else Canvas <code>storymap:rotation</code></td>
1415
+ </tr>
1416
+ <tr>
1417
+ <td><code>location.basemap</code></td>
1418
+ <td>Canvas <code>navPlace</code> Feature <code>properties.basemap</code>, else Canvas <code>storymap:basemap</code></td>
1419
+ </tr>
1420
+ <tr>
1421
+ <td><code>location.filter</code></td>
1422
+ <td>Canvas <code>navPlace</code> Feature <code>properties.filter</code>, else Canvas <code>storymap:filter</code></td>
1423
+ </tr>
1424
+ <tr>
1425
+ <td><code>location.mask</code></td>
1426
+ <td>Canvas <code>navPlace</code> Feature <code>properties.mask</code>, else Canvas <code>storymap:mask</code></td>
1427
+ </tr>
1428
+ <tr>
1429
+ <td><code>slidetimeout</code></td>
1430
+ <td>Canvas <code>storymap:slidetimeout</code> (milliseconds, <code>0</code> holds)</td>
1431
+ </tr>
1432
+ <tr>
1433
+ <td><code>imgoverlay</code></td>
1434
+ <td>Canvas <code>storymap:imgoverlay</code></td>
1435
+ </tr>
1436
+ <tr>
1437
+ <td><code>provenance</code></td>
1438
+ <td>Canvas <code>storymap:provenance</code> (data-only identifiers)</td>
1439
+ </tr>
1440
+ <tr>
1441
+ <td><code>narration.url</code></td>
1442
+ <td>Supplementing annotation body <code>{type: &quot;Sound&quot;}</code></td>
1443
+ </tr>
1444
+ <tr>
1445
+ <td><code>narration.loop/offset/play/stopOnExit/stopAllPrevious</code></td>
1446
+ <td>Supplementing annotation <code>storymap:</code> members (foreign members, only when set)</td>
1447
+ </tr>
1448
+ <tr>
1449
+ <td><code>media.offset/loop/play/stopOnExit</code></td>
1450
+ <td>Painting annotation <code>storymap:</code> members (foreign members, only when set)</td>
1451
+ </tr>
1452
+ <tr>
828
1453
  <td><code>media.url</code> (image)</td>
829
1454
  <td>Annotation body <code>{type: &quot;Image&quot;, format: ...}</code></td>
830
1455
  </tr>
@@ -846,28 +1471,65 @@ photo, and a slide with a YouTube video — full manifest:</p>
846
1471
  </tr>
847
1472
  <tr>
848
1473
  <td><code>media.caption</code></td>
849
- <td>Canvas <code>storymap:mediaCaption</code></td>
1474
+ <td>Painting annotation <code>label</code></td>
850
1475
  </tr>
851
1476
  <tr>
852
1477
  <td><code>media.credit</code></td>
853
- <td>Canvas <code>storymap:mediaCredit</code></td>
1478
+ <td>Painting annotation <code>requiredStatement</code> (<code>{label, value}</code>)</td>
1479
+ </tr>
1480
+ <tr>
1481
+ <td><code>media.alt</code></td>
1482
+ <td>Painting annotation <code>accessibilitySummary</code></td>
1483
+ </tr>
1484
+ <tr>
1485
+ <td><code>media.srcset</code></td>
1486
+ <td>Canvas <code>storymap:mediaSrcset</code></td>
1487
+ </tr>
1488
+ <tr>
1489
+ <td><code>media.sizes</code></td>
1490
+ <td>Canvas <code>storymap:mediaSizes</code></td>
1491
+ </tr>
1492
+ <tr>
1493
+ <td><code>location.region</code></td>
1494
+ <td>Painting annotation target <code>ImageApiSelector</code> <code>xywh=pixel:</code></td>
854
1495
  </tr>
855
1496
  <tr>
856
1497
  <td><code>media.thumb</code></td>
857
- <td><em>dropped</em> (thumbnails may be added via Canvas <code>thumbnail</code>)</td>
1498
+ <td>Canvas <code>thumbnail[]</code> or the body <code>thumbnail[]</code></td>
858
1499
  </tr>
859
1500
  <tr>
860
1501
  <td><code>background</code></td>
861
- <td>Canvas <code>storymap:background</code> <code>{url, color}</code></td>
1502
+ <td>Canvas <code>background</code> painting annotation (Image + Color body)</td>
862
1503
  </tr>
863
1504
  <tr>
864
1505
  <td><code>uniqueid</code></td>
865
- <td><em>dropped</em> (canvas <code>id</code>s are the canonical identifiers)</td>
1506
+ <td>Canvas <code>id</code></td>
1507
+ </tr>
1508
+ <tr>
1509
+ <td><code>group</code></td>
1510
+ <td>A <code>structures</code> Range label; the Range order is the slide order</td>
1511
+ </tr>
1512
+ <tr>
1513
+ <td><code>language</code> (per slide)</td>
1514
+ <td>The language tag the slide&#39;s text was read in (§3.4)</td>
1515
+ </tr>
1516
+ <tr>
1517
+ <td><code>logo</code>, <code>metadata</code></td>
1518
+ <td>Read into <code>data.logo</code> / <code>data.metadata[]</code></td>
1519
+ </tr>
1520
+ <tr>
1521
+ <td><code>tilejson</code></td>
1522
+ <td><code>service[0].tilejson</code></td>
1523
+ </tr>
1524
+ <tr>
1525
+ <td><code>title</code></td>
1526
+ <td>Manifest <code>label</code> (a label is required, so the converter uses the file name)</td>
866
1527
  </tr>
867
1528
  </tbody></table>
868
1529
  <h2>Conversion</h2>
869
- <p><code>node scripts/convert-to-iiif.mjs</code> regenerates <code>public/examples-iiif/</code> from
870
- <code>public/examples/</code>. Ids are deterministic:</p>
1530
+ <p><code>npm run convert:iiif</code> regenerates <code>public/examples-iiif/</code> from
1531
+ <code>public/examples/</code> (it needs Node 22.6+, since the script imports the
1532
+ TypeScript library source via type stripping). Ids are deterministic:</p>
871
1533
  <ul>
872
1534
  <li>Manifest: <code>https://example.org/storymap/&lt;name&gt;</code></li>
873
1535
  <li>Canvas: <code>&lt;manifest-id&gt;/canvas/&lt;n&gt;</code> (1-based, slide order)</li>
@@ -875,6 +1537,13 @@ photo, and a slide with a YouTube video — full manifest:</p>
875
1537
  <li>Annotation: <code>&lt;canvas-id&gt;/annotation/1</code></li>
876
1538
  <li>FeatureCollection / Feature: <code>&lt;canvas-id&gt;/navplace[.../feature/1]</code></li>
877
1539
  </ul>
1540
+ <p>Three fixtures in <code>public/examples-iiif/</code> are hand-authored and not
1541
+ overwritten by a full run: <code>georeferenced-layer.json</code> and
1542
+ <code>georeferenced-layer-unsupported.json</code>, which exercise the Georeference
1543
+ Extension payloads (the legacy format cannot express ground control points,
1544
+ so there is nothing to convert from), and <code>annotated-image.json</code>, the
1545
+ annotation-driven tour (there is no storymap document to convert from —
1546
+ annotation stops only exist on the manifest side).</p>
878
1547
 
879
1548
  </main>
880
1549