@projektemacher/storymapjs 0.10.7 → 0.10.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (532) hide show
  1. package/CHANGELOG +350 -19
  2. package/README.md +43 -9
  3. package/dist/assets/demo-DBpeF31K.js +1 -0
  4. package/dist/assets/harness-Cr0rYpvt.js +1 -0
  5. package/dist/assets/harness-multi-CYHgI0a9.js +1 -0
  6. package/dist/assets/harness-support-Do7sIp2j.js +1 -0
  7. package/dist/assets/index-wHPqGrBS.js +1 -0
  8. package/dist/assets/main-DXalctuR.js +17 -0
  9. package/dist/context.json +12 -9
  10. package/dist/css/fonts/files/amatic-sc-cyrillic-400-normal.woff2 +0 -0
  11. package/dist/css/fonts/files/amatic-sc-cyrillic-700-normal.woff2 +0 -0
  12. package/dist/css/fonts/files/amatic-sc-hebrew-400-normal.woff2 +0 -0
  13. package/dist/css/fonts/files/amatic-sc-hebrew-700-normal.woff2 +0 -0
  14. package/dist/css/fonts/files/amatic-sc-vietnamese-400-normal.woff2 +0 -0
  15. package/dist/css/fonts/files/amatic-sc-vietnamese-700-normal.woff2 +0 -0
  16. package/dist/css/fonts/files/bitter-cyrillic-100-italic.woff2 +0 -0
  17. package/dist/css/fonts/files/bitter-cyrillic-100-normal.woff2 +0 -0
  18. package/dist/css/fonts/files/bitter-cyrillic-200-italic.woff2 +0 -0
  19. package/dist/css/fonts/files/bitter-cyrillic-200-normal.woff2 +0 -0
  20. package/dist/css/fonts/files/bitter-cyrillic-300-italic.woff2 +0 -0
  21. package/dist/css/fonts/files/bitter-cyrillic-300-normal.woff2 +0 -0
  22. package/dist/css/fonts/files/bitter-cyrillic-400-italic.woff2 +0 -0
  23. package/dist/css/fonts/files/bitter-cyrillic-400-normal.woff2 +0 -0
  24. package/dist/css/fonts/files/bitter-cyrillic-500-italic.woff2 +0 -0
  25. package/dist/css/fonts/files/bitter-cyrillic-500-normal.woff2 +0 -0
  26. package/dist/css/fonts/files/bitter-cyrillic-600-italic.woff2 +0 -0
  27. package/dist/css/fonts/files/bitter-cyrillic-600-normal.woff2 +0 -0
  28. package/dist/css/fonts/files/bitter-cyrillic-700-italic.woff2 +0 -0
  29. package/dist/css/fonts/files/bitter-cyrillic-700-normal.woff2 +0 -0
  30. package/dist/css/fonts/files/bitter-cyrillic-800-italic.woff2 +0 -0
  31. package/dist/css/fonts/files/bitter-cyrillic-800-normal.woff2 +0 -0
  32. package/dist/css/fonts/files/bitter-cyrillic-900-italic.woff2 +0 -0
  33. package/dist/css/fonts/files/bitter-cyrillic-900-normal.woff2 +0 -0
  34. package/dist/css/fonts/files/bitter-cyrillic-ext-100-italic.woff2 +0 -0
  35. package/dist/css/fonts/files/bitter-cyrillic-ext-100-normal.woff2 +0 -0
  36. package/dist/css/fonts/files/bitter-cyrillic-ext-200-italic.woff2 +0 -0
  37. package/dist/css/fonts/files/bitter-cyrillic-ext-200-normal.woff2 +0 -0
  38. package/dist/css/fonts/files/bitter-cyrillic-ext-300-italic.woff2 +0 -0
  39. package/dist/css/fonts/files/bitter-cyrillic-ext-300-normal.woff2 +0 -0
  40. package/dist/css/fonts/files/bitter-cyrillic-ext-400-italic.woff2 +0 -0
  41. package/dist/css/fonts/files/bitter-cyrillic-ext-400-normal.woff2 +0 -0
  42. package/dist/css/fonts/files/bitter-cyrillic-ext-500-italic.woff2 +0 -0
  43. package/dist/css/fonts/files/bitter-cyrillic-ext-500-normal.woff2 +0 -0
  44. package/dist/css/fonts/files/bitter-cyrillic-ext-600-italic.woff2 +0 -0
  45. package/dist/css/fonts/files/bitter-cyrillic-ext-600-normal.woff2 +0 -0
  46. package/dist/css/fonts/files/bitter-cyrillic-ext-700-italic.woff2 +0 -0
  47. package/dist/css/fonts/files/bitter-cyrillic-ext-700-normal.woff2 +0 -0
  48. package/dist/css/fonts/files/bitter-cyrillic-ext-800-italic.woff2 +0 -0
  49. package/dist/css/fonts/files/bitter-cyrillic-ext-800-normal.woff2 +0 -0
  50. package/dist/css/fonts/files/bitter-cyrillic-ext-900-italic.woff2 +0 -0
  51. package/dist/css/fonts/files/bitter-cyrillic-ext-900-normal.woff2 +0 -0
  52. package/dist/css/fonts/files/bitter-cyrillic-ext-wght-italic.woff2 +0 -0
  53. package/dist/css/fonts/files/bitter-cyrillic-ext-wght-normal.woff2 +0 -0
  54. package/dist/css/fonts/files/bitter-cyrillic-wght-italic.woff2 +0 -0
  55. package/dist/css/fonts/files/bitter-cyrillic-wght-normal.woff2 +0 -0
  56. package/dist/css/fonts/files/bitter-vietnamese-100-italic.woff2 +0 -0
  57. package/dist/css/fonts/files/bitter-vietnamese-100-normal.woff2 +0 -0
  58. package/dist/css/fonts/files/bitter-vietnamese-200-italic.woff2 +0 -0
  59. package/dist/css/fonts/files/bitter-vietnamese-200-normal.woff2 +0 -0
  60. package/dist/css/fonts/files/bitter-vietnamese-300-italic.woff2 +0 -0
  61. package/dist/css/fonts/files/bitter-vietnamese-300-normal.woff2 +0 -0
  62. package/dist/css/fonts/files/bitter-vietnamese-400-italic.woff2 +0 -0
  63. package/dist/css/fonts/files/bitter-vietnamese-400-normal.woff2 +0 -0
  64. package/dist/css/fonts/files/bitter-vietnamese-500-italic.woff2 +0 -0
  65. package/dist/css/fonts/files/bitter-vietnamese-500-normal.woff2 +0 -0
  66. package/dist/css/fonts/files/bitter-vietnamese-600-italic.woff2 +0 -0
  67. package/dist/css/fonts/files/bitter-vietnamese-600-normal.woff2 +0 -0
  68. package/dist/css/fonts/files/bitter-vietnamese-700-italic.woff2 +0 -0
  69. package/dist/css/fonts/files/bitter-vietnamese-700-normal.woff2 +0 -0
  70. package/dist/css/fonts/files/bitter-vietnamese-800-italic.woff2 +0 -0
  71. package/dist/css/fonts/files/bitter-vietnamese-800-normal.woff2 +0 -0
  72. package/dist/css/fonts/files/bitter-vietnamese-900-italic.woff2 +0 -0
  73. package/dist/css/fonts/files/bitter-vietnamese-900-normal.woff2 +0 -0
  74. package/dist/css/fonts/files/bitter-vietnamese-wght-italic.woff2 +0 -0
  75. package/dist/css/fonts/files/bitter-vietnamese-wght-normal.woff2 +0 -0
  76. package/dist/css/fonts/files/cairo-arabic-200-normal.woff2 +0 -0
  77. package/dist/css/fonts/files/cairo-arabic-300-normal.woff2 +0 -0
  78. package/dist/css/fonts/files/cairo-arabic-400-normal.woff2 +0 -0
  79. package/dist/css/fonts/files/cairo-arabic-500-normal.woff2 +0 -0
  80. package/dist/css/fonts/files/cairo-arabic-600-normal.woff2 +0 -0
  81. package/dist/css/fonts/files/cairo-arabic-700-normal.woff2 +0 -0
  82. package/dist/css/fonts/files/cairo-arabic-800-normal.woff2 +0 -0
  83. package/dist/css/fonts/files/cairo-arabic-900-normal.woff2 +0 -0
  84. package/dist/css/fonts/files/cairo-latin-200-normal.woff2 +0 -0
  85. package/dist/css/fonts/files/cairo-latin-300-normal.woff2 +0 -0
  86. package/dist/css/fonts/files/cairo-latin-400-normal.woff2 +0 -0
  87. package/dist/css/fonts/files/cairo-latin-500-normal.woff2 +0 -0
  88. package/dist/css/fonts/files/cairo-latin-600-normal.woff2 +0 -0
  89. package/dist/css/fonts/files/cairo-latin-700-normal.woff2 +0 -0
  90. package/dist/css/fonts/files/cairo-latin-800-normal.woff2 +0 -0
  91. package/dist/css/fonts/files/cairo-latin-900-normal.woff2 +0 -0
  92. package/dist/css/fonts/files/cairo-latin-ext-200-normal.woff2 +0 -0
  93. package/dist/css/fonts/files/cairo-latin-ext-300-normal.woff2 +0 -0
  94. package/dist/css/fonts/files/cairo-latin-ext-400-normal.woff2 +0 -0
  95. package/dist/css/fonts/files/cairo-latin-ext-500-normal.woff2 +0 -0
  96. package/dist/css/fonts/files/cairo-latin-ext-600-normal.woff2 +0 -0
  97. package/dist/css/fonts/files/cairo-latin-ext-700-normal.woff2 +0 -0
  98. package/dist/css/fonts/files/cairo-latin-ext-800-normal.woff2 +0 -0
  99. package/dist/css/fonts/files/cairo-latin-ext-900-normal.woff2 +0 -0
  100. package/dist/css/fonts/files/dancing-script-vietnamese-wght-normal.woff2 +0 -0
  101. package/dist/css/fonts/files/eb-garamond-cyrillic-ext-wght-italic.woff2 +0 -0
  102. package/dist/css/fonts/files/eb-garamond-cyrillic-ext-wght-normal.woff2 +0 -0
  103. package/dist/css/fonts/files/eb-garamond-cyrillic-wght-italic.woff2 +0 -0
  104. package/dist/css/fonts/files/eb-garamond-cyrillic-wght-normal.woff2 +0 -0
  105. package/dist/css/fonts/files/eb-garamond-greek-ext-wght-italic.woff2 +0 -0
  106. package/dist/css/fonts/files/eb-garamond-greek-ext-wght-normal.woff2 +0 -0
  107. package/dist/css/fonts/files/eb-garamond-greek-wght-italic.woff2 +0 -0
  108. package/dist/css/fonts/files/eb-garamond-greek-wght-normal.woff2 +0 -0
  109. package/dist/css/fonts/files/eb-garamond-vietnamese-wght-italic.woff2 +0 -0
  110. package/dist/css/fonts/files/eb-garamond-vietnamese-wght-normal.woff2 +0 -0
  111. package/dist/css/fonts/files/gentium-book-plus-cyrillic-400-italic.woff2 +0 -0
  112. package/dist/css/fonts/files/gentium-book-plus-cyrillic-400-normal.woff2 +0 -0
  113. package/dist/css/fonts/files/gentium-book-plus-cyrillic-700-italic.woff2 +0 -0
  114. package/dist/css/fonts/files/gentium-book-plus-cyrillic-700-normal.woff2 +0 -0
  115. package/dist/css/fonts/files/gentium-book-plus-cyrillic-ext-400-italic.woff2 +0 -0
  116. package/dist/css/fonts/files/gentium-book-plus-cyrillic-ext-400-normal.woff2 +0 -0
  117. package/dist/css/fonts/files/gentium-book-plus-cyrillic-ext-700-italic.woff2 +0 -0
  118. package/dist/css/fonts/files/gentium-book-plus-cyrillic-ext-700-normal.woff2 +0 -0
  119. package/dist/css/fonts/files/gentium-book-plus-greek-400-italic.woff2 +0 -0
  120. package/dist/css/fonts/files/gentium-book-plus-greek-400-normal.woff2 +0 -0
  121. package/dist/css/fonts/files/gentium-book-plus-greek-700-italic.woff2 +0 -0
  122. package/dist/css/fonts/files/gentium-book-plus-greek-700-normal.woff2 +0 -0
  123. package/dist/css/fonts/files/gentium-book-plus-greek-ext-400-italic.woff2 +0 -0
  124. package/dist/css/fonts/files/gentium-book-plus-greek-ext-400-normal.woff2 +0 -0
  125. package/dist/css/fonts/files/gentium-book-plus-greek-ext-700-italic.woff2 +0 -0
  126. package/dist/css/fonts/files/gentium-book-plus-greek-ext-700-normal.woff2 +0 -0
  127. package/dist/css/fonts/files/gentium-book-plus-vietnamese-400-italic.woff2 +0 -0
  128. package/dist/css/fonts/files/gentium-book-plus-vietnamese-400-normal.woff2 +0 -0
  129. package/dist/css/fonts/files/gentium-book-plus-vietnamese-700-italic.woff2 +0 -0
  130. package/dist/css/fonts/files/gentium-book-plus-vietnamese-700-normal.woff2 +0 -0
  131. package/dist/css/fonts/files/old-standard-tt-cyrillic-400-italic.woff2 +0 -0
  132. package/dist/css/fonts/files/old-standard-tt-cyrillic-400-normal.woff2 +0 -0
  133. package/dist/css/fonts/files/old-standard-tt-cyrillic-700-normal.woff2 +0 -0
  134. package/dist/css/fonts/files/old-standard-tt-cyrillic-ext-400-italic.woff2 +0 -0
  135. package/dist/css/fonts/files/old-standard-tt-cyrillic-ext-400-normal.woff2 +0 -0
  136. package/dist/css/fonts/files/old-standard-tt-cyrillic-ext-700-normal.woff2 +0 -0
  137. package/dist/css/fonts/files/old-standard-tt-vietnamese-400-italic.woff2 +0 -0
  138. package/dist/css/fonts/files/old-standard-tt-vietnamese-400-normal.woff2 +0 -0
  139. package/dist/css/fonts/files/old-standard-tt-vietnamese-700-normal.woff2 +0 -0
  140. package/dist/css/fonts/files/open-sans-cyrillic-ext-wght-italic.woff2 +0 -0
  141. package/dist/css/fonts/files/open-sans-cyrillic-ext-wght-normal.woff2 +0 -0
  142. package/dist/css/fonts/files/open-sans-cyrillic-wght-italic.woff2 +0 -0
  143. package/dist/css/fonts/files/open-sans-cyrillic-wght-normal.woff2 +0 -0
  144. package/dist/css/fonts/files/open-sans-greek-ext-wght-italic.woff2 +0 -0
  145. package/dist/css/fonts/files/open-sans-greek-ext-wght-normal.woff2 +0 -0
  146. package/dist/css/fonts/files/open-sans-greek-wght-italic.woff2 +0 -0
  147. package/dist/css/fonts/files/open-sans-greek-wght-normal.woff2 +0 -0
  148. package/dist/css/fonts/files/open-sans-hebrew-wght-italic.woff2 +0 -0
  149. package/dist/css/fonts/files/open-sans-hebrew-wght-normal.woff2 +0 -0
  150. package/dist/css/fonts/files/open-sans-vietnamese-wght-italic.woff2 +0 -0
  151. package/dist/css/fonts/files/open-sans-vietnamese-wght-normal.woff2 +0 -0
  152. package/dist/css/fonts/files/playfair-display-cyrillic-wght-italic.woff2 +0 -0
  153. package/dist/css/fonts/files/playfair-display-cyrillic-wght-normal.woff2 +0 -0
  154. package/dist/css/fonts/files/playfair-display-sc-cyrillic-400-italic.woff2 +0 -0
  155. package/dist/css/fonts/files/playfair-display-sc-cyrillic-400-normal.woff2 +0 -0
  156. package/dist/css/fonts/files/playfair-display-sc-cyrillic-700-italic.woff2 +0 -0
  157. package/dist/css/fonts/files/playfair-display-sc-cyrillic-700-normal.woff2 +0 -0
  158. package/dist/css/fonts/files/playfair-display-sc-cyrillic-900-italic.woff2 +0 -0
  159. package/dist/css/fonts/files/playfair-display-sc-cyrillic-900-normal.woff2 +0 -0
  160. package/dist/css/fonts/files/playfair-display-sc-vietnamese-400-italic.woff2 +0 -0
  161. package/dist/css/fonts/files/playfair-display-sc-vietnamese-400-normal.woff2 +0 -0
  162. package/dist/css/fonts/files/playfair-display-sc-vietnamese-700-italic.woff2 +0 -0
  163. package/dist/css/fonts/files/playfair-display-sc-vietnamese-700-normal.woff2 +0 -0
  164. package/dist/css/fonts/files/playfair-display-sc-vietnamese-900-italic.woff2 +0 -0
  165. package/dist/css/fonts/files/playfair-display-sc-vietnamese-900-normal.woff2 +0 -0
  166. package/dist/css/fonts/files/playfair-display-vietnamese-wght-italic.woff2 +0 -0
  167. package/dist/css/fonts/files/playfair-display-vietnamese-wght-normal.woff2 +0 -0
  168. package/dist/css/fonts/files/pt-sans-cyrillic-400-italic.woff2 +0 -0
  169. package/dist/css/fonts/files/pt-sans-cyrillic-400-normal.woff2 +0 -0
  170. package/dist/css/fonts/files/pt-sans-cyrillic-700-italic.woff2 +0 -0
  171. package/dist/css/fonts/files/pt-sans-cyrillic-700-normal.woff2 +0 -0
  172. package/dist/css/fonts/files/pt-sans-cyrillic-ext-400-italic.woff2 +0 -0
  173. package/dist/css/fonts/files/pt-sans-cyrillic-ext-400-normal.woff2 +0 -0
  174. package/dist/css/fonts/files/pt-sans-cyrillic-ext-700-italic.woff2 +0 -0
  175. package/dist/css/fonts/files/pt-sans-cyrillic-ext-700-normal.woff2 +0 -0
  176. package/dist/css/fonts/files/pt-sans-narrow-cyrillic-400-normal.woff2 +0 -0
  177. package/dist/css/fonts/files/pt-sans-narrow-cyrillic-700-normal.woff2 +0 -0
  178. package/dist/css/fonts/files/pt-sans-narrow-cyrillic-ext-400-normal.woff2 +0 -0
  179. package/dist/css/fonts/files/pt-sans-narrow-cyrillic-ext-700-normal.woff2 +0 -0
  180. package/dist/css/fonts/files/pt-serif-cyrillic-400-italic.woff2 +0 -0
  181. package/dist/css/fonts/files/pt-serif-cyrillic-400-normal.woff2 +0 -0
  182. package/dist/css/fonts/files/pt-serif-cyrillic-700-italic.woff2 +0 -0
  183. package/dist/css/fonts/files/pt-serif-cyrillic-700-normal.woff2 +0 -0
  184. package/dist/css/fonts/files/pt-serif-cyrillic-ext-400-italic.woff2 +0 -0
  185. package/dist/css/fonts/files/pt-serif-cyrillic-ext-400-normal.woff2 +0 -0
  186. package/dist/css/fonts/files/pt-serif-cyrillic-ext-700-italic.woff2 +0 -0
  187. package/dist/css/fonts/files/pt-serif-cyrillic-ext-700-normal.woff2 +0 -0
  188. package/dist/css/fonts/files/raleway-cyrillic-ext-wght-italic.woff2 +0 -0
  189. package/dist/css/fonts/files/raleway-cyrillic-ext-wght-normal.woff2 +0 -0
  190. package/dist/css/fonts/files/raleway-cyrillic-wght-italic.woff2 +0 -0
  191. package/dist/css/fonts/files/raleway-cyrillic-wght-normal.woff2 +0 -0
  192. package/dist/css/fonts/files/raleway-vietnamese-wght-italic.woff2 +0 -0
  193. package/dist/css/fonts/files/raleway-vietnamese-wght-normal.woff2 +0 -0
  194. package/dist/css/fonts/files/roboto-slab-cyrillic-ext-wght-normal.woff2 +0 -0
  195. package/dist/css/fonts/files/roboto-slab-cyrillic-wght-normal.woff2 +0 -0
  196. package/dist/css/fonts/files/roboto-slab-greek-ext-wght-normal.woff2 +0 -0
  197. package/dist/css/fonts/files/roboto-slab-greek-wght-normal.woff2 +0 -0
  198. package/dist/css/fonts/files/roboto-slab-vietnamese-wght-normal.woff2 +0 -0
  199. package/dist/css/fonts/files/ubuntu-cyrillic-300-italic.woff2 +0 -0
  200. package/dist/css/fonts/files/ubuntu-cyrillic-300-normal.woff2 +0 -0
  201. package/dist/css/fonts/files/ubuntu-cyrillic-400-italic.woff2 +0 -0
  202. package/dist/css/fonts/files/ubuntu-cyrillic-400-normal.woff2 +0 -0
  203. package/dist/css/fonts/files/ubuntu-cyrillic-500-italic.woff2 +0 -0
  204. package/dist/css/fonts/files/ubuntu-cyrillic-500-normal.woff2 +0 -0
  205. package/dist/css/fonts/files/ubuntu-cyrillic-700-italic.woff2 +0 -0
  206. package/dist/css/fonts/files/ubuntu-cyrillic-700-normal.woff2 +0 -0
  207. package/dist/css/fonts/files/ubuntu-cyrillic-ext-300-italic.woff2 +0 -0
  208. package/dist/css/fonts/files/ubuntu-cyrillic-ext-300-normal.woff2 +0 -0
  209. package/dist/css/fonts/files/ubuntu-cyrillic-ext-400-italic.woff2 +0 -0
  210. package/dist/css/fonts/files/ubuntu-cyrillic-ext-400-normal.woff2 +0 -0
  211. package/dist/css/fonts/files/ubuntu-cyrillic-ext-500-italic.woff2 +0 -0
  212. package/dist/css/fonts/files/ubuntu-cyrillic-ext-500-normal.woff2 +0 -0
  213. package/dist/css/fonts/files/ubuntu-cyrillic-ext-700-italic.woff2 +0 -0
  214. package/dist/css/fonts/files/ubuntu-cyrillic-ext-700-normal.woff2 +0 -0
  215. package/dist/css/fonts/files/ubuntu-greek-300-italic.woff2 +0 -0
  216. package/dist/css/fonts/files/ubuntu-greek-300-normal.woff2 +0 -0
  217. package/dist/css/fonts/files/ubuntu-greek-400-italic.woff2 +0 -0
  218. package/dist/css/fonts/files/ubuntu-greek-400-normal.woff2 +0 -0
  219. package/dist/css/fonts/files/ubuntu-greek-500-italic.woff2 +0 -0
  220. package/dist/css/fonts/files/ubuntu-greek-500-normal.woff2 +0 -0
  221. package/dist/css/fonts/files/ubuntu-greek-700-italic.woff2 +0 -0
  222. package/dist/css/fonts/files/ubuntu-greek-700-normal.woff2 +0 -0
  223. package/dist/css/fonts/files/ubuntu-greek-ext-300-italic.woff2 +0 -0
  224. package/dist/css/fonts/files/ubuntu-greek-ext-300-normal.woff2 +0 -0
  225. package/dist/css/fonts/files/ubuntu-greek-ext-400-italic.woff2 +0 -0
  226. package/dist/css/fonts/files/ubuntu-greek-ext-400-normal.woff2 +0 -0
  227. package/dist/css/fonts/files/ubuntu-greek-ext-500-italic.woff2 +0 -0
  228. package/dist/css/fonts/files/ubuntu-greek-ext-500-normal.woff2 +0 -0
  229. package/dist/css/fonts/files/ubuntu-greek-ext-700-italic.woff2 +0 -0
  230. package/dist/css/fonts/files/ubuntu-greek-ext-700-normal.woff2 +0 -0
  231. package/dist/css/fonts/files/unica-one-vietnamese-400-normal.woff2 +0 -0
  232. package/dist/css/fonts/files/vollkorn-cyrillic-ext-wght-italic.woff2 +0 -0
  233. package/dist/css/fonts/files/vollkorn-cyrillic-ext-wght-normal.woff2 +0 -0
  234. package/dist/css/fonts/files/vollkorn-cyrillic-wght-italic.woff2 +0 -0
  235. package/dist/css/fonts/files/vollkorn-cyrillic-wght-normal.woff2 +0 -0
  236. package/dist/css/fonts/files/vollkorn-greek-wght-italic.woff2 +0 -0
  237. package/dist/css/fonts/files/vollkorn-greek-wght-normal.woff2 +0 -0
  238. package/dist/css/fonts/files/vollkorn-vietnamese-wght-italic.woff2 +0 -0
  239. package/dist/css/fonts/files/vollkorn-vietnamese-wght-normal.woff2 +0 -0
  240. package/dist/css/fonts/font.abril-droidsans.css +3 -0
  241. package/dist/css/fonts/font.amatic-andika.css +57 -0
  242. package/dist/css/fonts/font.bitter-raleway.css +111 -0
  243. package/dist/css/fonts/font.cairo.css +312 -0
  244. package/dist/css/fonts/font.clicker-garamond.css +93 -0
  245. package/dist/css/fonts/font.dancing-ledger.css +12 -0
  246. package/dist/css/fonts/font.default.css +183 -0
  247. package/dist/css/fonts/font.fjalla-average.css +3 -0
  248. package/dist/css/fonts/font.georgia-helvetica.css +3 -0
  249. package/dist/css/fonts/font.knightlab.css +642 -0
  250. package/dist/css/fonts/font.lustria-lato.css +3 -0
  251. package/dist/css/fonts/font.medula-lato.css +3 -0
  252. package/dist/css/fonts/font.oldstandard.css +84 -0
  253. package/dist/css/fonts/font.opensans-gentiumbook.css +183 -0
  254. package/dist/css/fonts/font.playfair-faunaone.css +39 -0
  255. package/dist/css/fonts/font.playfair.css +147 -0
  256. package/dist/css/fonts/font.pt.css +183 -0
  257. package/dist/css/fonts/font.roboto-megrim.css +3 -0
  258. package/dist/css/fonts/font.rufina-sintony.css +3 -0
  259. package/dist/css/fonts/font.ubuntu.css +291 -0
  260. package/dist/css/fonts/font.unicaone-vollkorn.css +84 -0
  261. package/dist/css/storymap.css +1 -1
  262. package/dist/demo.html +2 -2
  263. package/dist/docs/api/.nojekyll +1 -0
  264. package/dist/docs/api/assets/custom.css +47 -0
  265. package/dist/docs/api/assets/hierarchy.js +1 -0
  266. package/dist/docs/api/assets/highlight.css +57 -0
  267. package/dist/docs/api/assets/icons.js +18 -0
  268. package/dist/docs/api/assets/icons.svg +1 -0
  269. package/dist/docs/api/assets/main.js +60 -0
  270. package/dist/docs/api/assets/navigation.js +1 -0
  271. package/dist/docs/api/assets/search.js +1 -0
  272. package/dist/docs/api/assets/style.css +1648 -0
  273. package/dist/docs/api/classes/StoryMap.html +1604 -0
  274. package/dist/docs/api/functions/MediaType.html +51 -0
  275. package/dist/docs/api/functions/isPresentation3Collection.html +47 -0
  276. package/dist/docs/api/functions/isPresentation3Manifest.html +53 -0
  277. package/dist/docs/api/functions/loadCSS.html +63 -0
  278. package/dist/docs/api/functions/manifestToStorymapData.html +49 -0
  279. package/dist/docs/api/functions/setLanguage.html +54 -0
  280. package/dist/docs/api/functions/storymapToManifest.html +57 -0
  281. package/dist/docs/api/functions/validateStorymap.html +53 -0
  282. package/dist/docs/api/functions/validateStorymapAndReport.html +54 -0
  283. package/dist/docs/api/hierarchy.html +28 -0
  284. package/dist/docs/api/index.html +197 -0
  285. package/dist/docs/api/interfaces/AnimationHandle.html +60 -0
  286. package/dist/docs/api/interfaces/ImagereadyPayload.html +71 -0
  287. package/dist/docs/api/interfaces/LanguageEntry.html +102 -0
  288. package/dist/docs/api/interfaces/LatLngLiteral.html +73 -0
  289. package/dist/docs/api/interfaces/LoadOptions.html +59 -0
  290. package/dist/docs/api/interfaces/OlLayer.html +1400 -0
  291. package/dist/docs/api/interfaces/OlMap.html +1656 -0
  292. package/dist/docs/api/interfaces/OlProjection.html +332 -0
  293. package/dist/docs/api/interfaces/OlSource.html +784 -0
  294. package/dist/docs/api/interfaces/OlTileLayer.html +1497 -0
  295. package/dist/docs/api/interfaces/OlVectorLayer.html +1559 -0
  296. package/dist/docs/api/interfaces/OlView.html +1958 -0
  297. package/dist/docs/api/interfaces/StorymapData.html +71 -0
  298. package/dist/docs/api/interfaces/StorymapDataWrapper.html +60 -0
  299. package/dist/docs/api/interfaces/StorymapDocument.html +68 -0
  300. package/dist/docs/api/interfaces/StorymapError.html +63 -0
  301. package/dist/docs/api/interfaces/StorymapGeoreference.html +93 -0
  302. package/dist/docs/api/interfaces/StorymapGeoreferenceBody.html +74 -0
  303. package/dist/docs/api/interfaces/StorymapGroundControlPoint.html +69 -0
  304. package/dist/docs/api/interfaces/StorymapLanguageMap.html +57 -0
  305. package/dist/docs/api/interfaces/StorymapManifest.html +118 -0
  306. package/dist/docs/api/interfaces/StorymapManifestAnnotation.html +105 -0
  307. package/dist/docs/api/interfaces/StorymapManifestBackground.html +81 -0
  308. package/dist/docs/api/interfaces/StorymapManifestCanvas.html +140 -0
  309. package/dist/docs/api/interfaces/StorymapManifestContentResource.html +97 -0
  310. package/dist/docs/api/interfaces/StorymapManifestFeatureCollection.html +82 -0
  311. package/dist/docs/api/interfaces/StorymapManifestGeoreferencing.html +87 -0
  312. package/dist/docs/api/interfaces/StorymapManifestImageService.html +69 -0
  313. package/dist/docs/api/interfaces/StorymapManifestRange.html +75 -0
  314. package/dist/docs/api/interfaces/StorymapManifestService.html +77 -0
  315. package/dist/docs/api/interfaces/StorymapManifestSpecificResource.html +69 -0
  316. package/dist/docs/api/interfaces/StorymapManifestStatement.html +63 -0
  317. package/dist/docs/api/interfaces/StorymapMapOptions.html +92 -0
  318. package/dist/docs/api/interfaces/StorymapOptions.html +532 -0
  319. package/dist/docs/api/interfaces/StorymapOverlayLayer.html +126 -0
  320. package/dist/docs/api/interfaces/StorymapSlide.html +132 -0
  321. package/dist/docs/api/interfaces/StorymapSlideBackground.html +72 -0
  322. package/dist/docs/api/interfaces/StorymapSlideLocation.html +117 -0
  323. package/dist/docs/api/interfaces/StorymapSlideMarker.html +104 -0
  324. package/dist/docs/api/interfaces/StorymapSlideMedia.html +110 -0
  325. package/dist/docs/api/interfaces/StorymapSlideNarration.html +65 -0
  326. package/dist/docs/api/interfaces/StorymapSlideText.html +72 -0
  327. package/dist/docs/api/interfaces/StorymapTilejson.html +105 -0
  328. package/dist/docs/api/media/es.json +31 -0
  329. package/dist/docs/api/media/migration-from-knightlab.md +359 -0
  330. package/dist/docs/api/modules.html +50 -0
  331. package/dist/docs/api/types/ContentState.html +70 -0
  332. package/dist/docs/api/types/ImagereadyKind.html +34 -0
  333. package/dist/docs/api/types/MediaTypeMatch.html +78 -0
  334. package/dist/docs/api/types/TileSourceFactory.html +53 -0
  335. package/dist/docs/authoring.html +293 -0
  336. package/dist/docs/iiif.html +617 -62
  337. package/dist/docs/migration.html +313 -11
  338. package/dist/docs/readme.html +40 -9
  339. package/dist/embed/index.html +1 -1
  340. package/dist/examples/issue-242-nonlatin.json +55 -0
  341. package/dist/examples/issue-305-start-at-slide-data.json +96 -0
  342. package/dist/examples/issue-358-iframe.json +57 -0
  343. package/dist/examples/issue-iiif-geo.json +32 -0
  344. package/dist/examples/issue-image-alt.json +23 -0
  345. package/dist/examples/issue-image-region.json +42 -0
  346. package/dist/examples/issue-image-srcset.json +24 -0
  347. package/dist/examples/map-area-overlays.json +68 -0
  348. package/dist/examples/no-map.json +44 -0
  349. package/dist/examples-iiif/annotated-image.json +188 -0
  350. package/dist/examples-iiif/bob-boilen.json +11 -5
  351. package/dist/examples-iiif/courbet.json +9 -6
  352. package/dist/examples-iiif/empty.json +8 -4
  353. package/dist/examples-iiif/flickr-drewvigal.json +248 -24
  354. package/dist/examples-iiif/flickr-zach.wise.json +8 -4
  355. package/dist/examples-iiif/georeferenced-layer-unsupported.json +153 -0
  356. package/dist/examples-iiif/georeferenced-layer.json +318 -0
  357. package/dist/examples-iiif/iiif-wellcome.json +9 -6
  358. package/dist/examples-iiif/instagram-chenpamela.json +381 -36
  359. package/dist/examples-iiif/instagram_brentfoster.json +429 -40
  360. package/dist/examples-iiif/instagram_couch.json +261 -26
  361. package/dist/examples-iiif/instagram_joegermuska.json +441 -41
  362. package/dist/examples-iiif/instagram_matteich.json +261 -26
  363. package/dist/examples-iiif/instagram_mirandamulligan.json +261 -26
  364. package/dist/examples-iiif/instagram_raymondmccrea.json +261 -26
  365. package/dist/examples-iiif/instagram_test.json +261 -26
  366. package/dist/examples-iiif/issue-134-no-lines.json +9 -5
  367. package/dist/examples-iiif/issue-177-color-vars.json +9 -5
  368. package/dist/examples-iiif/issue-211-rtl.json +9 -5
  369. package/dist/examples-iiif/issue-242-nonlatin.json +239 -0
  370. package/dist/examples-iiif/issue-272-facebook.json +9 -5
  371. package/dist/examples-iiif/issue-305-start-at-slide-data.json +305 -0
  372. package/dist/examples-iiif/issue-305-start-at-slide.json +9 -5
  373. package/dist/examples-iiif/issue-341-distance.json +9 -5
  374. package/dist/examples-iiif/issue-358-iframe.json +190 -0
  375. package/dist/examples-iiif/issue-360-juxtapose.json +22 -7
  376. package/dist/examples-iiif/issue-368-null-fields.json +9 -5
  377. package/dist/examples-iiif/issue-375-code-lists.json +9 -5
  378. package/dist/examples-iiif/issue-381-dateline.json +9 -5
  379. package/dist/examples-iiif/issue-405-custom-icon.json +203 -0
  380. package/dist/examples-iiif/issue-425-many-slides.json +9 -5
  381. package/dist/examples-iiif/issue-428-background.json +20 -8
  382. package/dist/examples-iiif/issue-435-googlemaps.json +9 -5
  383. package/dist/examples-iiif/issue-437-documentcloud.json +22 -7
  384. package/dist/examples-iiif/issue-451-webp.json +9 -5
  385. package/dist/examples-iiif/issue-455-audio.json +9 -5
  386. package/dist/examples-iiif/issue-480-shorts.json +9 -5
  387. package/dist/examples-iiif/issue-506-marker-sync.json +9 -5
  388. package/dist/examples-iiif/issue-iiif-geo.json +200 -0
  389. package/dist/examples-iiif/issue-image-alt.json +90 -0
  390. package/dist/examples-iiif/issue-image-region.json +203 -0
  391. package/dist/examples-iiif/issue-image-srcset.json +87 -0
  392. package/dist/examples-iiif/jansteen.json +9 -6
  393. package/dist/examples-iiif/katrina.json +197 -41
  394. package/dist/examples-iiif/map-area-overlays.json +289 -0
  395. package/dist/examples-iiif/marktwain.json +255 -58
  396. package/dist/examples-iiif/no-map.json +148 -0
  397. package/dist/examples-iiif/population.json +440 -76
  398. package/dist/examples-iiif/president.json +456 -83
  399. package/dist/examples-iiif/scroll-hint.json +190 -0
  400. package/dist/examples-iiif/seurat.json +113 -22
  401. package/dist/examples-iiif/zoomify-clamp.json +153 -0
  402. package/dist/harness-multi.html +17 -0
  403. package/dist/harness.html +3 -2
  404. package/dist/index.html +16 -10
  405. package/dist/js/storymap.d.ts +1439 -114
  406. package/dist/js/storymap.js +24654 -21936
  407. package/dist/js/storymap.js.map +1 -1
  408. package/dist/navplace-properties.json +40 -0
  409. package/docs/migration-from-knightlab.md +229 -9
  410. package/docs/storymap-as-iiif-manifest.md +559 -135
  411. package/package.json +11 -8
  412. package/schema/storymap.schema.json +431 -78
  413. package/src/animation/easings.ts +8 -1
  414. package/src/animation/tween.ts +186 -0
  415. package/src/core/Browser.ts +6 -5
  416. package/src/core/Load.ts +54 -2
  417. package/src/core/Util.ts +255 -193
  418. package/src/core/mixins.ts +24 -7
  419. package/src/core/viewers.ts +94 -0
  420. package/src/dom/DomEvent.ts +27 -8
  421. package/src/globals.d.ts +8 -0
  422. package/src/language/Language.ts +199 -25
  423. package/src/language/locale/.expected-gaps.json +86 -0
  424. package/src/language/locale/be.json +15 -2
  425. package/src/language/locale/bg.json +15 -2
  426. package/src/language/locale/cs.json +15 -2
  427. package/src/language/locale/de.json +12 -1
  428. package/src/language/locale/el.json +15 -2
  429. package/src/language/locale/en.json +6 -2
  430. package/src/language/locale/es.json +15 -2
  431. package/src/language/locale/et.json +5 -1
  432. package/src/language/locale/fr.json +15 -2
  433. package/src/language/locale/he.json +16 -3
  434. package/src/language/locale/hu.json +15 -2
  435. package/src/language/locale/is.json +5 -1
  436. package/src/language/locale/it.json +15 -2
  437. package/src/language/locale/jp.json +15 -2
  438. package/src/language/locale/ko.json +15 -2
  439. package/src/language/locale/nl.json +15 -2
  440. package/src/language/locale/nn.json +5 -1
  441. package/src/language/locale/no.json +15 -2
  442. package/src/language/locale/pl.json +15 -2
  443. package/src/language/locale/pt.json +15 -2
  444. package/src/language/locale/ru.json +15 -2
  445. package/src/language/locale/sk.json +15 -2
  446. package/src/language/locale/sr.json +5 -1
  447. package/src/language/locale/sv.json +15 -2
  448. package/src/language/locale/tr.json +15 -2
  449. package/src/language/locale/uk.json +15 -2
  450. package/src/language/locale/ur.json +5 -1
  451. package/src/language/locale/zh-cn.json +15 -2
  452. package/src/language/locale/zh-tw.json +15 -2
  453. package/src/main.ts +92 -0
  454. package/src/map/Map.ts +183 -106
  455. package/src/map/MapMarker.ts +28 -5
  456. package/src/map/georeference.ts +325 -0
  457. package/src/map/openlayers/Map.OpenLayers.ts +850 -237
  458. package/src/map/openlayers/MapMarker.OpenLayers.ts +248 -24
  459. package/src/map/openlayers/zoomifyTiles.ts +1 -4
  460. package/src/media/EmbedUtil.ts +308 -24
  461. package/src/media/Media.ts +243 -55
  462. package/src/media/embedId.ts +104 -0
  463. package/src/media/types/Audio.ts +9 -82
  464. package/src/media/types/Blockquote.ts +2 -3
  465. package/src/media/types/DailyMotion.ts +5 -10
  466. package/src/media/types/DocumentCloud.ts +6 -35
  467. package/src/media/types/Facebook.ts +3 -4
  468. package/src/media/types/Flickr.ts +9 -9
  469. package/src/media/types/GoogleDoc.ts +3 -4
  470. package/src/media/types/HtmlMedia.ts +167 -0
  471. package/src/media/types/IFrame.ts +3 -4
  472. package/src/media/types/Image.ts +72 -6
  473. package/src/media/types/Juxtapose.ts +14 -5
  474. package/src/media/types/SoundCloud.ts +28 -6
  475. package/src/media/types/Text.ts +19 -13
  476. package/src/media/types/Twitter.ts +27 -14
  477. package/src/media/types/Video.ts +9 -79
  478. package/src/media/types/Vimeo.ts +10 -10
  479. package/src/media/types/Website.ts +23 -13
  480. package/src/media/types/Wikipedia.ts +18 -8
  481. package/src/media/types/YouTube.ts +71 -39
  482. package/src/scss/Typography.scss +1 -3
  483. package/src/scss/VCO.StoryMap.Dark.scss +18 -6
  484. package/src/scss/VCO.StoryMap.scss +37 -6
  485. package/src/scss/Variables.Dark.scss +3 -2
  486. package/src/scss/Variables.scss +3 -2
  487. package/src/scss/core/Mixins.scss +5 -63
  488. package/src/scss/fonts/font.amatic-andika.scss +3 -0
  489. package/src/scss/fonts/font.bitter-raleway.scss +6 -0
  490. package/src/scss/fonts/font.cairo.scss +79 -0
  491. package/src/scss/fonts/font.clicker-garamond.scss +5 -0
  492. package/src/scss/fonts/font.dancing-ledger.scss +1 -0
  493. package/src/scss/fonts/font.knightlab.scss +14 -0
  494. package/src/scss/fonts/font.oldstandard.scss +6 -0
  495. package/src/scss/fonts/font.opensans-gentiumbook.scss +5 -0
  496. package/src/scss/fonts/font.playfair-faunaone.scss +2 -0
  497. package/src/scss/fonts/font.playfair.scss +4 -0
  498. package/src/scss/fonts/font.pt.scss +6 -0
  499. package/src/scss/fonts/font.ubuntu.scss +4 -0
  500. package/src/scss/fonts/font.unicaone-vollkorn.scss +5 -0
  501. package/src/scss/map/VCO.MapMarker.scss +98 -3
  502. package/src/scss/media/VCO.Media.scss +7 -10
  503. package/src/scss/media/types/VCO.Media.Text.scss +8 -0
  504. package/src/scss/media/types/VCO.Media.Wikipedia.scss +2 -1
  505. package/src/scss/slider/VCO.Slide.scss +13 -3
  506. package/src/scss/slider/VCO.SlideNav.scss +11 -17
  507. package/src/scss/slider/VCO.StorySlider.scss +4 -2
  508. package/src/scss/ui/VCO.Consent.scss +44 -0
  509. package/src/scss/ui/VCO.MenuBar.Button.scss +8 -0
  510. package/src/scss/ui/VCO.Message.scss +2 -5
  511. package/src/site/site.ts +2 -1
  512. package/src/slider/Slide.ts +121 -27
  513. package/src/slider/SlideNav.ts +39 -5
  514. package/src/slider/StorySlider.ts +153 -42
  515. package/src/storymap/Consent.ts +407 -82
  516. package/src/storymap/StoryMap.ts +1192 -182
  517. package/src/storymap/content-state.ts +185 -0
  518. package/src/storymap/iiif.ts +1526 -68
  519. package/src/storymap/to-iiif.ts +921 -0
  520. package/src/storymap/validate.ts +80 -7
  521. package/src/types.ts +223 -26
  522. package/src/ui/MenuBar.ts +98 -45
  523. package/src/ui/Message.ts +9 -0
  524. package/src/ui/Swipable.ts +145 -78
  525. package/dist/assets/demo-D6cTmzn6.js +0 -1
  526. package/dist/assets/harness-BPFlzutp.js +0 -1
  527. package/dist/assets/index-DDsPBPZA.js +0 -1
  528. package/dist/assets/main-Y-MYUSJ4.js +0 -17
  529. package/src/animation/morpheus.d.ts +0 -41
  530. package/src/scss/media/types/VCO.Media.Instagram.scss +0 -7
  531. package/src/scss/media/types/VCO.Media.Profile.scss +0 -5
  532. package/src/ui/Draggable.ts +0 -374
@@ -36,6 +36,7 @@
36
36
  <li><a class="button" href="./readme.html">README</a></li>
37
37
  <li><a class="button" href="./migration.html">Migration guide</a></li>
38
38
  <li><a class="button" href="./iiif.html">IIIF docs</a></li>
39
+ <li><a class="button" href="./authoring.html">Authoring</a></li>
39
40
  <li><a class="button" href="./api/index.html">API docs</a></li>
40
41
  <li><a class="button" href="../index.html#help">Help</a></li>
41
42
  </ul>
@@ -54,15 +55,50 @@ the fixtures in <a href="../examples/"><code>public/examples/</code></a> are rea
54
55
  <a href="https://presentation-validator.iiif.io/">official IIIF presentation validator</a>
55
56
  (<code>npm run validate:iiif</code>). All converted fixtures pass the official validator.</p>
56
57
  <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>
58
+ <p>A manifest declares four context URLs, in this order: the official
59
+ <a href="https://iiif.io/api/extension/navplace/">navPlace extension</a> context (which
60
+ §3.1 of the extension requires before Presentation 3), the Presentation 3.0
61
+ context, the navPlace properties context, and the StoryMap extension context.
62
+ The last of the four resolves to the document below — shown inline here for
63
+ reference; a manifest must reference it by URL, not paste it in (see the
64
+ <code>@context</code> rule under &quot;Validator interop&quot;):</p>
60
65
  <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
- ]
66
+ &quot;@context&quot;: {
67
+ &quot;@version&quot;: 1.1,
68
+ &quot;storymap&quot;: &quot;https://christianmahnke.de/iiif/storymap#&quot;,
69
+ &quot;mapAsImage&quot;: &quot;storymap:mapAsImage&quot;,
70
+ &quot;basemap&quot;: &quot;storymap:basemap&quot;,
71
+ &quot;tilejson&quot;: &quot;storymap:tilejson&quot;,
72
+ &quot;mapAccessToken&quot;: &quot;storymap:mapAccessToken&quot;,
73
+ &quot;mapBackgroundColor&quot;: &quot;storymap:mapBackgroundColor&quot;,
74
+ &quot;mapCenterOffset&quot;: &quot;storymap:mapCenterOffset&quot;,
75
+ &quot;fontCss&quot;: &quot;storymap:fontCss&quot;,
76
+ &quot;callToAction&quot;: &quot;storymap:callToAction&quot;,
77
+ &quot;callToActionText&quot;: &quot;storymap:callToActionText&quot;,
78
+ &quot;startAtSlide&quot;: &quot;storymap:startAtSlide&quot;,
79
+ &quot;language&quot;: &quot;storymap:language&quot;,
80
+ &quot;calculateZoom&quot;: &quot;storymap:calculateZoom&quot;,
81
+ &quot;lineFollowsPath&quot;: &quot;storymap:lineFollowsPath&quot;,
82
+ &quot;showLines&quot;: &quot;storymap:showLines&quot;,
83
+ &quot;showHistoryLine&quot;: &quot;storymap:showHistoryLine&quot;,
84
+ &quot;lineColor&quot;: &quot;storymap:lineColor&quot;,
85
+ &quot;lineColorInactive&quot;: &quot;storymap:lineColorInactive&quot;,
86
+ &quot;lineWeight&quot;: &quot;storymap:lineWeight&quot;,
87
+ &quot;lineOpacity&quot;: &quot;storymap:lineOpacity&quot;,
88
+ &quot;lineDash&quot;: &quot;storymap:lineDash&quot;,
89
+ &quot;lineJoin&quot;: &quot;storymap:lineJoin&quot;,
90
+ &quot;useCustomMarkers&quot;: &quot;storymap:useCustomMarkers&quot;,
91
+ &quot;mapArea&quot;: &quot;storymap:mapArea&quot;,
92
+ &quot;overviewExtent&quot;: &quot;storymap:overviewExtent&quot;,
93
+ &quot;keyboard&quot;: &quot;storymap:keyboard&quot;,
94
+ &quot;overlays&quot;: &quot;storymap:overlays&quot;,
95
+ &quot;type&quot;: {
96
+ &quot;@id&quot;: &quot;storymap:type&quot;,
97
+ &quot;@type&quot;: &quot;@id&quot;
98
+ },
99
+ &quot;mediaSrcset&quot;: &quot;storymap:mediaSrcset&quot;,
100
+ &quot;mediaSizes&quot;: &quot;storymap:mediaSizes&quot;
101
+ }
66
102
  }
67
103
  </code></pre>
68
104
  <h3>navPlace context (official)</h3>
@@ -89,20 +125,18 @@ what the fixtures reference. Content:</p>
89
125
  &quot;@context&quot;: {
90
126
  &quot;@version&quot;: 1.1,
91
127
  &quot;storymap&quot;: &quot;https://christianmahnke.de/iiif/storymap#&quot;,
92
- &quot;mapType&quot;: &quot;storymap:mapType&quot;,
128
+ &quot;basemap&quot;: &quot;storymap:basemap&quot;,
129
+ &quot;tilejson&quot;: &quot;storymap:tilejson&quot;,
93
130
  &quot;mapAsImage&quot;: &quot;storymap:mapAsImage&quot;,
94
131
  &quot;mapAccessToken&quot;: &quot;storymap:mapAccessToken&quot;,
95
132
  &quot;mapBackgroundColor&quot;: &quot;storymap:mapBackgroundColor&quot;,
96
133
  &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
134
  &quot;fontCss&quot;: &quot;storymap:fontCss&quot;,
100
135
  &quot;callToAction&quot;: &quot;storymap:callToAction&quot;,
101
136
  &quot;callToActionText&quot;: &quot;storymap:callToActionText&quot;,
102
137
  &quot;startAtSlide&quot;: &quot;storymap:startAtSlide&quot;,
103
138
  &quot;language&quot;: &quot;storymap:language&quot;,
104
139
  &quot;calculateZoom&quot;: &quot;storymap:calculateZoom&quot;,
105
- &quot;lessBounce&quot;: &quot;storymap:lessBounce&quot;,
106
140
  &quot;lineFollowsPath&quot;: &quot;storymap:lineFollowsPath&quot;,
107
141
  &quot;showLines&quot;: &quot;storymap:showLines&quot;,
108
142
  &quot;showHistoryLine&quot;: &quot;storymap:showHistoryLine&quot;,
@@ -113,11 +147,13 @@ what the fixtures reference. Content:</p>
113
147
  &quot;lineDash&quot;: &quot;storymap:lineDash&quot;,
114
148
  &quot;lineJoin&quot;: &quot;storymap:lineJoin&quot;,
115
149
  &quot;useCustomMarkers&quot;: &quot;storymap:useCustomMarkers&quot;,
150
+ &quot;mapArea&quot;: &quot;storymap:mapArea&quot;,
151
+ &quot;overviewExtent&quot;: &quot;storymap:overviewExtent&quot;,
152
+ &quot;keyboard&quot;: &quot;storymap:keyboard&quot;,
153
+ &quot;overlays&quot;: &quot;storymap:overlays&quot;,
116
154
  &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;
155
+ &quot;mediaSrcset&quot;: &quot;storymap:mediaSrcset&quot;,
156
+ &quot;mediaSizes&quot;: &quot;storymap:mediaSizes&quot;
121
157
  }
122
158
  }
123
159
  </code></pre>
@@ -217,7 +253,7 @@ what the fixtures reference. Content:</p>
217
253
  <tr>
218
254
  <td><code>items</code></td>
219
255
  <td><code>slide.media</code></td>
220
- <td>AnnotationPage with the painting annotation, see below</td>
256
+ <td>AnnotationPage with the painting annotation, see below — which also carries the caption, credit and alt text</td>
221
257
  </tr>
222
258
  <tr>
223
259
  <td><code>storymap:type</code></td>
@@ -225,24 +261,29 @@ what the fixtures reference. Content:</p>
225
261
  <td><code>&quot;overview&quot;</code> marks the map overview slide</td>
226
262
  </tr>
227
263
  <tr>
228
- <td><code>storymap:background</code></td>
264
+ <td><code>background</code></td>
229
265
  <td><code>slide.background</code></td>
230
- <td><code>{url, color}</code> — only present keys</td>
266
+ <td>A painting annotation whose body is an <code>Image</code> (the url) and/or a <code>Color</code> (the colour)</td>
231
267
  </tr>
232
268
  <tr>
233
- <td><code>storymap:mediaCaption</code></td>
234
- <td><code>slide.media.caption</code></td>
235
- <td></td>
269
+ <td><code>storymap:mediaSrcset</code></td>
270
+ <td><code>slide.media.srcset</code></td>
271
+ <td>Responsive image candidates, passed through to the <code>img</code> element</td>
236
272
  </tr>
237
273
  <tr>
238
- <td><code>storymap:mediaCredit</code></td>
239
- <td><code>slide.media.credit</code></td>
240
- <td></td>
274
+ <td><code>storymap:mediaSizes</code></td>
275
+ <td><code>slide.media.sizes</code></td>
276
+ <td>The <code>sizes</code> companion of <code>mediaSrcset</code></td>
241
277
  </tr>
242
278
  <tr>
243
- <td><code>storymap:date</code></td>
279
+ <td><em>(target selector)</em></td>
280
+ <td><code>slide.location.region</code></td>
281
+ <td><code>ImageApiSelector</code> <code>xywh=pixel:x,y,w,h</code>; image stops on image-map slides</td>
282
+ </tr>
283
+ <tr>
284
+ <td><code>navDate</code></td>
244
285
  <td><code>slide.date</code></td>
245
- <td>String or object, verbatim</td>
286
+ <td>Plain string, verbatim; the official validator applies no format rule at all, so a human date is fine</td>
246
287
  </tr>
247
288
  <tr>
248
289
  <td><code>navPlace</code></td>
@@ -260,11 +301,42 @@ with one GeoJSON Feature:</p>
260
301
  verbatim. For image-map storymaps (<code>storymap:mapAsImage: true</code>) the values are
261
302
  image coordinates rather than WGS84 degrees; consumers can detect this via
262
303
  <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>
304
+ <li><code>properties</code>: marker data — <code>name</code>, <code>zoom</code>, <code>line</code>, <code>icon</code>, <code>iconSize</code>,
305
+ <code>image</code>, <code>use_custom_marker</code>, plus the presentation-only <code>popup</code> and
306
+ <code>audioBadge</code> (only present keys).</li>
265
307
  <li><code>location.use_custom_marker</code> / <code>use_custom_markers</code> (manifest) opt into
266
308
  custom marker rendering; see the storymap terms below.</li>
267
309
  </ul>
310
+ <p>Those properties are described by <strong><code>https://cmahnke.github.io/StoryMapJS/navplace-properties.json</code></strong>,
311
+ which a manifest using a <code>properties</code> bag should name in its <code>@context</code>. The
312
+ extension requires it (§3.2): terms in a GeoJSON Feature&#39;s <code>properties</code> must be
313
+ described either by a registered IIIF extension or by a local linked-data
314
+ context, and a client that meets a property it does not understand must ignore
315
+ it. There is no IIIF extension for marker presentation — navPlace defines
316
+ exactly one term, <code>navPlace</code> itself — so the local context is the only option.
317
+ It is why <code>popup</code> and <code>audioBadge</code> need no <code>storymap:</code> term of their own, and
318
+ the same mechanism is what <code>docs/plans/iiif-media-tours.md</code> §2 wants for its
319
+ marker config. The nine local names hang off this project&#39;s existing namespace
320
+ (<code>https://christianmahnke.de/iiif/storymap#</code>), not a new one.</p>
321
+ <h3>Context order matters</h3>
322
+ <p>The navPlace extension&#39;s context <strong>must be listed before</strong> the Presentation 3
323
+ context — §3.1 of the extension:</p>
324
+ <blockquote>
325
+ <p>The navPlace extension linked data context must be included before the IIIF
326
+ Presentation API 3 linked data context on the top-level object.</p>
327
+ </blockquote>
328
+ <p>So a manifest that uses <code>navPlace</code> declares:</p>
329
+ <pre><code class="language-json">&quot;@context&quot;: [
330
+ &quot;http://iiif.io/api/extension/navplace/context.json&quot;,
331
+ &quot;http://iiif.io/api/presentation/3/context.json&quot;,
332
+ &quot;https://cmahnke.github.io/StoryMapJS/navplace-properties.json&quot;,
333
+ &quot;https://cmahnke.github.io/StoryMapJS/context.json&quot;
334
+ ]
335
+ </code></pre>
336
+ <p>Getting this backwards does not break a viewer — the reader does not consult
337
+ either context — but it does make the document wrong as linked data, which is
338
+ the point of shipping a context at all. Every fixture in this repository had it
339
+ backwards.</p>
268
340
  <p>Alternatively a manifest MAY aggregate all slide locations in a single
269
341
  manifest-level <code>navPlace</code> with one Feature per Canvas in <code>items</code> order.</p>
270
342
  <h2>Slide media</h2>
@@ -310,7 +382,7 @@ actual image dimensions. Two body variants are valid:</p>
310
382
  }
311
383
  </code></pre>
312
384
  <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
385
+ <code>storymap:basemap: &quot;iiif&quot;</code>; since the original zoomify tile paths are dead, the
314
386
  converter substitutes the IIIF reference image above (the legacy pyramid
315
387
  definition is not carried — nothing reads it).</p>
316
388
  <h2>StoryMap-specific terms</h2>
@@ -326,12 +398,76 @@ properties):</p>
326
398
  {
327
399
  &quot;id&quot;: &quot;https://example.org/storymap/&lt;name&gt;/map-config&quot;,
328
400
  &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;
401
+ &quot;profile&quot;: &quot;https://cmahnke.github.io/StoryMapJS/context.json/mapconfig&quot;,
402
+ &quot;storymap:basemap&quot;: &quot;osm:standard&quot;
403
+ }
404
+ ]
405
+ }
406
+ </code></pre>
407
+ <h3>TileJSON for a tile service</h3>
408
+ <p>A keyword basemap and a tile URL template are different kinds of thing, and
409
+ <code>mapType</code> used to be both. They are now separate: <code>storymap:basemap</code> names a
410
+ source the viewer knows how to configure, and an <strong>unprefixed</strong> <code>tilejson</code>
411
+ object describes any other tile service in the standard&#39;s own terms. Only
412
+ <code>tiles</code> is required:</p>
413
+ <pre><code class="language-json">{
414
+ &quot;service&quot;: [
415
+ {
416
+ &quot;id&quot;: &quot;https://example.org/storymap/&lt;name&gt;/map-config&quot;,
417
+ &quot;type&quot;: &quot;Service&quot;,
418
+ &quot;profile&quot;: &quot;https://cmahnke.github.io/StoryMapJS/context.json/mapconfig&quot;,
419
+ &quot;tilejson&quot;: {
420
+ &quot;tiles&quot;: [&quot;https://tiles.example.org/{z}/{x}/{y}.png&quot;],
421
+ &quot;minzoom&quot;: 4,
422
+ &quot;maxzoom&quot;: 17,
423
+ &quot;bounds&quot;: [-122.7, 37.1, -121.1, 38.1],
424
+ &quot;scheme&quot;: &quot;tms&quot;,
425
+ &quot;center&quot;: [4.4777, 51.9244, 12]
426
+ }
427
+ // `tiles` may also be a single template string — that is what the
428
+ // converter writes. The reader accepts both forms.
331
429
  }
332
430
  ]
333
431
  }
334
432
  </code></pre>
433
+ <p><code>tiles</code> becomes <code>map_type</code>, so everything that dispatches on a template (the
434
+ <code>tile_source_factory</code> option, attribution, the minimap) works unchanged. The
435
+ rest is honoured where the map can act on it:</p>
436
+ <table>
437
+ <thead>
438
+ <tr>
439
+ <th>Member</th>
440
+ <th>Effect</th>
441
+ </tr>
442
+ </thead>
443
+ <tbody><tr>
444
+ <td><code>tiles</code></td>
445
+ <td>the tile URL template, as <code>map_type</code></td>
446
+ </tr>
447
+ <tr>
448
+ <td><code>minzoom</code></td>
449
+ <td>the view&#39;s minimum zoom, and the tile grid&#39;s range</td>
450
+ </tr>
451
+ <tr>
452
+ <td><code>maxzoom</code></td>
453
+ <td>the view&#39;s maximum zoom, and the tile grid&#39;s range</td>
454
+ </tr>
455
+ <tr>
456
+ <td><code>bounds</code></td>
457
+ <td>a <code>[west, south, east, north]</code> lon/lat box the view center is kept inside</td>
458
+ </tr>
459
+ <tr>
460
+ <td><code>scheme</code></td>
461
+ <td><code>tms</code> flips the tile row, which is counted from the bottom in TMS</td>
462
+ </tr>
463
+ <tr>
464
+ <td><code>center</code></td>
465
+ <td><code>[lon, lat, zoom]</code>, the initial view</td>
466
+ </tr>
467
+ </tbody></table>
468
+ <p>The <code>center</code> is the initial view only, and <code>bounds</code> constrains the center
469
+ without pinning the resolution — a hard extent constraint would fight the panel
470
+ offset, the same reason <code>map_bbox</code> works the way it does.</p>
335
471
  <table>
336
472
  <thead>
337
473
  <tr>
@@ -341,9 +477,14 @@ properties):</p>
341
477
  </tr>
342
478
  </thead>
343
479
  <tbody><tr>
344
- <td><code>mapType</code></td>
480
+ <td><code>basemap</code></td>
345
481
  <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>
482
+ <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>
483
+ </tr>
484
+ <tr>
485
+ <td><em>(unprefixed)</em> <code>tilejson</code></td>
486
+ <td><code>map_type</code> + <code>tilejson</code></td>
487
+ <td>TileJSON 2.1 for an arbitrary tile service — see below</td>
347
488
  </tr>
348
489
  <tr>
349
490
  <td><code>mapAsImage</code></td>
@@ -371,9 +512,9 @@ properties):</p>
371
512
  <td>Tile URL subdomains</td>
372
513
  </tr>
373
514
  <tr>
374
- <td><code>iiifUrl</code></td>
515
+ <td><em>(none)</em></td>
375
516
  <td><code>iiif.url</code></td>
376
- <td>IIIF Image API <code>info.json</code> URL for image-map storymaps</td>
517
+ <td>From the Image API <code>service[]</code> a painting body carries, plus <code>/info.json</code>; see below</td>
377
518
  </tr>
378
519
  <tr>
379
520
  <td><code>fontCss</code></td>
@@ -460,15 +601,362 @@ properties):</p>
460
601
  <td><code>use_custom_markers</code></td>
461
602
  <td>boolean</td>
462
603
  </tr>
604
+ <tr>
605
+ <td><code>mapArea</code></td>
606
+ <td><code>map_area</code></td>
607
+ <td><code>&quot;full&quot;</code> (default) or <code>&quot;left&quot;</code></td>
608
+ </tr>
609
+ <tr>
610
+ <td><code>overviewExtent</code></td>
611
+ <td><code>overview_extent</code></td>
612
+ <td><code>[west, south, east, north]</code> lon/lat box for the minimap overview</td>
613
+ </tr>
614
+ <tr>
615
+ <td><code>keyboard</code></td>
616
+ <td><code>keyboard</code></td>
617
+ <td>boolean: arrow keys navigate the story from anywhere</td>
618
+ </tr>
619
+ <tr>
620
+ <td><code>overlays</code></td>
621
+ <td><code>overlays</code></td>
622
+ <td>array of stacked layers (see below)</td>
623
+ </tr>
624
+ <tr>
625
+ <td><em>(georeferencing annotation)</em></td>
626
+ <td><code>overlays[]</code> (georeference entries)</td>
627
+ <td>IIIF images placed from ground control points — see &quot;Geo-referenced layers&quot;</td>
628
+ </tr>
463
629
  </tbody></table>
464
630
  <h3>Canvas level — direct properties</h3>
465
631
  <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>
632
+ carried directly on the Canvas: <code>storymap:type</code>, plus the two terms with no
633
+ standard home, <code>storymap:mediaSrcset</code> and <code>storymap:mediaSizes</code> (see the
634
+ Canvas table above). A slide&#39;s date is the standard <code>navDate</code> and its
635
+ background is the standard <code>background</code> annotation. The media caption, credit and alt
636
+ text are <strong>not</strong> terms any more: they are the painting annotation&#39;s own <code>label</code>,
637
+ <code>requiredStatement</code> and <code>accessibilitySummary</code>, which is where Presentation 3
638
+ defines them. A manifest written against the old terms still loads — the strings
639
+ are simply no longer read.</p>
469
640
  <p>Readers must use the prefixed term for the slide type (<code>storymap:type</code>): the
470
641
  bare <code>type</code> key of a Canvas is the IIIF class type (<code>&quot;Canvas&quot;</code>) and can never
471
642
  carry the StoryMap slide type.</p>
643
+ <h2>Annotation-driven tour stops</h2>
644
+ <p>A Canvas annotation whose <code>motivation</code> is <code>commenting</code>, <code>tagging</code>,
645
+ <code>classifying</code> or <code>describing</code> and whose target resolves to a region becomes
646
+ one slide, appended after that Canvas&#39;s own slide. This is the shape Storiiies
647
+ and Micrio use for a guided tour of one image, and it is the subject of
648
+ <a href="./authoring.html"">docs/iiif-authoring.md</a>.</p>
649
+ <ul>
650
+ <li><strong>Target</strong> — <code>xywh=</code> fragment / Image API Selector, or a <code>PointSelector</code>
651
+ (synthesized into a square of 5% of the Canvas&#39;s smaller side, centred and
652
+ clamped). A <code>TextQuoteSelector</code>, <code>TimeState</code> or <code>SvgSelector</code> is preserved
653
+ but not resolved or drawn. A bare string target&#39;s <code>#xywh=</code> counts. An
654
+ annotation aimed at the whole Canvas is <strong>not</strong> a stop.</li>
655
+ <li><strong>Body</strong> — a <code>TextualBody</code> supplies the slide text (<code>text/plain</code> escaped and
656
+ split per blank-line block, <code>text/html</code> kept as markup); a body with an
657
+ <code>id</code> (e.g. <code>type: &quot;Sound&quot;</code>) supplies <code>media.url</code>, whose extension picks the
658
+ player. An annotation with a region but no body is not a stop.</li>
659
+ <li><strong>Region stops are honoured in image mode</strong> only — the same rule as a
660
+ <code>xywh=pixel:</code> region. A geographic map ignores them.</li>
661
+ <li><code>navPlace</code> may not appear on an Annotation (the extension forbids it), so
662
+ all stops on a Canvas share that Canvas&#39;s location and marker presentation.</li>
663
+ </ul>
664
+ <h2>What the body record carries</h2>
665
+ <p>The painting annotation&#39;s body is read into one shared record. The
666
+ <code>storymap:mediaCaption</code> / <code>mediaCredit</code> / <code>mediaAlt</code> extension terms are
667
+ dropped — a manifest still using them loads, but the strings are not read —
668
+ and the standard properties are the only source:</p>
669
+ <table>
670
+ <thead>
671
+ <tr>
672
+ <th>Body property</th>
673
+ <th>Slide media field</th>
674
+ </tr>
675
+ </thead>
676
+ <tbody><tr>
677
+ <td><code>label</code></td>
678
+ <td><code>caption</code></td>
679
+ </tr>
680
+ <tr>
681
+ <td><code>requiredStatement</code> (one <code>{label, value}</code> object) or <code>provider</code></td>
682
+ <td><code>credit</code></td>
683
+ </tr>
684
+ <tr>
685
+ <td><code>accessibilitySummary</code></td>
686
+ <td><code>alt</code></td>
687
+ </tr>
688
+ <tr>
689
+ <td><code>thumbnail</code></td>
690
+ <td><code>thumb</code></td>
691
+ </tr>
692
+ <tr>
693
+ <td><code>type</code>, <code>format</code></td>
694
+ <td>player selection (<code>MediaType()</code>)</td>
695
+ </tr>
696
+ <tr>
697
+ <td><code>duration</code>, <code>start</code>, <code>end</code></td>
698
+ <td>time-anchored stops</td>
699
+ </tr>
700
+ <tr>
701
+ <td>a sibling <code>TextualBody</code> with <code>format: text/vtt</code></td>
702
+ <td><code>subtitles</code></td>
703
+ </tr>
704
+ </tbody></table>
705
+ <h2>Native IIIF vs. the StoryMap extension</h2>
706
+ <p>IIIF defines three approved Presentation API extensions — navPlace, Text
707
+ Granularity and Georeference — and <strong>no vocabulary for a basemap or a tile
708
+ layer stack</strong>. Everything the viewer draws under and over the story (basemap
709
+ type, layout, minimap bounds, stacked layers, keyboard navigation) therefore
710
+ stays in the <code>storymap:</code> terms of the map configuration service, which is the
711
+ JSON-LD-idiomatic place for extended configuration. What IIIF <em>does</em> model
712
+ natively is used wherever it exists:</p>
713
+ <table>
714
+ <thead>
715
+ <tr>
716
+ <th>Story</th>
717
+ <th>Native IIIF</th>
718
+ <th>Used here</th>
719
+ </tr>
720
+ </thead>
721
+ <tbody><tr>
722
+ <td>Slide location</td>
723
+ <td><code>navPlace</code> Point</td>
724
+ <td>yes</td>
725
+ </tr>
726
+ <tr>
727
+ <td>Story extent</td>
728
+ <td><code>navPlace</code> Polygon (an explicit navPlace use case)</td>
729
+ <td>yes — a canvas polygon becomes <code>map_bbox</code></td>
730
+ </tr>
731
+ <tr>
732
+ <td>Image region stops</td>
733
+ <td><code>ImageApiSelector</code> <code>xywh=pixel:</code> on the painting annotation target</td>
734
+ <td>yes — the selector is the only source (§2.8)</td>
735
+ </tr>
736
+ <tr>
737
+ <td>Raster layer placed on a map</td>
738
+ <td><a href="https://iiif.io/api/extension/georef">Georeference Extension</a> (GCPs, <code>motivation: &quot;georeferencing&quot;</code>)</td>
739
+ <td>yes — see below</td>
740
+ </tr>
741
+ <tr>
742
+ <td>Basemap, layer stack, layout, keyboard</td>
743
+ <td>—</td>
744
+ <td>no; <code>storymap:</code> terms</td>
745
+ </tr>
746
+ </tbody></table>
747
+ <h3>Groups and the slide order</h3>
748
+ <p><code>structures</code> does two jobs. A Range with a <code>label</code> and no <code>start</code> is a <strong>group</strong>,
749
+ and every canvas it contains gets that value as <code>slide.group</code>; nested Ranges are
750
+ chapters inside it, and the outermost labelled Range is the group. And the order
751
+ canvases appear in is the <strong>slide order</strong> — a Range is allowed to run them in a
752
+ order the document does not, which is what a storyboard is for:</p>
753
+ <pre><code class="language-json">{
754
+ &quot;structures&quot;: [
755
+ {
756
+ &quot;id&quot;: &quot;https://example.org/storymap/&lt;name&gt;/range/1&quot;,
757
+ &quot;type&quot;: &quot;Range&quot;,
758
+ &quot;label&quot;: { &quot;none&quot;: [&quot;Act I&quot;] },
759
+ &quot;items&quot;: [
760
+ &quot;https://example.org/storymap/&lt;name&gt;/canvas/1&quot;,
761
+ &quot;https://example.org/storymap/&lt;name&gt;/canvas/3&quot;
762
+ ]
763
+ }
764
+ ]
765
+ }
766
+ </code></pre>
767
+ <p>A canvas in no Range keeps its document position, after the ones a Range does
768
+ mention. A Range with a <code>start</code> is a time segment of a canvas, not a group: it
769
+ contributes order and nothing else.</p>
770
+ <h3>Deep links and external annotations</h3>
771
+ <p>Two things a manifest can offer that a viewer used to ignore.</p>
772
+ <p><strong>A stop can be linked by its identity.</strong> Every canvas id is a <code>uniqueid</code>
773
+ (§2.3), so a stop is addressable by something that survives a slide being
774
+ inserted above it. The viewer writes both forms:</p>
775
+ <table>
776
+ <thead>
777
+ <tr>
778
+ <th>Where</th>
779
+ <th>Form</th>
780
+ <th>Example</th>
781
+ </tr>
782
+ </thead>
783
+ <tbody><tr>
784
+ <td><code>change</code> payload</td>
785
+ <td><code>current_id</code>, next to <code>current_slide</code></td>
786
+ <td>—</td>
787
+ </tr>
788
+ <tr>
789
+ <td>URL hash</td>
790
+ <td><code>#slide-&lt;uniqueid&gt;</code>, or <code>#slide-3</code> for a storymap-JSON slide</td>
791
+ <td><code>#slide-https%3A%2F%2F…%2Fcanvas%2F3</code></td>
792
+ </tr>
793
+ <tr>
794
+ <td>Query parameter</td>
795
+ <td><code>iiif-content</code>, IIIF Content State 1.0</td>
796
+ <td><code>?iiif-content=https://…/canvas/3</code></td>
797
+ </tr>
798
+ </tbody></table>
799
+ <p>Both are read on load, and the hash again on every <code>hashchange</code>, so browser
800
+ back/forward keeps working. The index form is still accepted, so links shared
801
+ before ids were emitted keep resolving.</p>
802
+ <p>The <code>iiif-content</code> parameter is the standard&#39;s own format and follows its
803
+ encoding rule, which is deliberately asymmetric: a <strong>plain URI is written
804
+ unencoded</strong>, a <strong>JSON-LD form is content-state-encoded</strong> (base64url, no
805
+ padding). A whole canvas is therefore a bare target URI, while a region — which
806
+ the spec says a bare URI cannot express — is the encoded Target Body:</p>
807
+ <pre><code class="language-json">{
808
+ &quot;target&quot;: {
809
+ &quot;type&quot;: &quot;SpecificResource&quot;,
810
+ &quot;source&quot;: { &quot;id&quot;: &quot;https://example.org/canvas/7&quot;, &quot;type&quot;: &quot;Canvas&quot; },
811
+ &quot;selector&quot;: { &quot;type&quot;: &quot;ImageApiSelector&quot;, &quot;value&quot;: &quot;xywh=pixel:10,20,30,40&quot; }
812
+ }
813
+ }
814
+ </code></pre>
815
+ <p><strong>External annotations.</strong> A manifest&#39;s <code>seeAlso</code> points at annotation
816
+ collections or pages that live on an annotation server. They are recorded on the
817
+ data as <code>see_also</code> but <strong>not fetched</strong> — reading them is a network round trip
818
+ per document, and a viewer should not block its first paint on a third party. A
819
+ host opts in:</p>
820
+ <pre><code class="language-js">const { stops, searchService, failed } = await storymap.loadAnnotations();
821
+ </code></pre>
822
+ <p>which fetches, merges the annotations for the canvases being rendered into tour
823
+ stops, and fires <code>annotationsloaded</code> with the same value. A <code>SearchService1</code> in
824
+ <code>seeAlso</code> is reported as <code>searchService</code> rather than followed. One level of
825
+ indirection is followed, so a collection may reference its pages, but a cycle
826
+ cannot become an infinite walk. Fetching is cached per document, so two calls
827
+ share one request.</p>
828
+ <h3>Institutional credit</h3>
829
+ <p>A manifest says who published it and under what licence, and all of it ends up
830
+ on the one credit line the viewer renders — the map attribution the host can
831
+ also feed with <code>setExtraAttributions()</code>:</p>
832
+ <table>
833
+ <thead>
834
+ <tr>
835
+ <th>Manifest property</th>
836
+ <th>Becomes</th>
837
+ </tr>
838
+ </thead>
839
+ <tbody><tr>
840
+ <td><code>requiredStatement</code></td>
841
+ <td><code>Attribution: &lt;value&gt;</code></td>
842
+ </tr>
843
+ <tr>
844
+ <td><code>provider</code> (Agent)</td>
845
+ <td><code>Provider: &lt;label, or the id&gt;</code></td>
846
+ </tr>
847
+ <tr>
848
+ <td><code>rights</code></td>
849
+ <td><code>Licence: &lt;uri&gt;</code></td>
850
+ </tr>
851
+ <tr>
852
+ <td><code>homepage</code> (Agent)</td>
853
+ <td>the Agent&#39;s label or id, unlabelled</td>
854
+ </tr>
855
+ </tbody></table>
856
+ <p>They are joined with <code>·</code> in that order. <code>logo</code> is an image rather than a
857
+ credit line, so it is offered as <code>data.logo</code>, and <code>metadata</code>&#39;s label/value
858
+ pairs are handed on as <code>data.metadata[]</code> — arbitrary pairs cannot be rendered
859
+ generically, and dropping them loses provenance.</p>
860
+ <p>The converter writes a <code>metadata</code> pair reading &quot;Generated by: StoryMapJS&quot;
861
+ rather than claiming to be the manifest&#39;s <code>provider</code>. P3&#39;s <code>provider</code> is
862
+ whoever published the content, and the converter does not know that; writing
863
+ itself there would put &quot;Provider: StoryMapJS&quot; on the credit line of every
864
+ converted storymap.</p>
865
+ <h3>Geo-referenced layers</h3>
866
+ <p>A <code>motivation: &quot;georeferencing&quot;</code> annotation carries the Georeference Extension
867
+ payload: the IIIF Image API service to place in its <code>target</code>, and its ground
868
+ control points (<code>properties.resourceCoords</code> ↔ <code>geometry.coordinates</code>, WGS84) in
869
+ its <code>body</code>. Per the extension, a layer that is not part of the canvas it ships
870
+ in — which is every map layer — embeds the image it places in <code>target</code> rather
871
+ than referencing it. The viewer fits the points affinely and places the image,
872
+ which OpenLayers reprojects onto the view exactly like the IIIF basemap:</p>
873
+ <pre><code class="language-json">{
874
+ &quot;items&quot;: [
875
+ {
876
+ &quot;id&quot;: &quot;https://example.org/storymap/&lt;name&gt;/canvas/1&quot;,
877
+ &quot;type&quot;: &quot;Canvas&quot;,
878
+ &quot;items&quot;: [
879
+ {
880
+ &quot;id&quot;: &quot;https://example.org/storymap/&lt;name&gt;/canvas/1/georeferencing/1&quot;,
881
+ &quot;type&quot;: &quot;Annotation&quot;,
882
+ &quot;motivation&quot;: &quot;georeferencing&quot;,
883
+ &quot;target&quot;: {
884
+ &quot;id&quot;: &quot;https://iiif.example.org/image1&quot;,
885
+ &quot;type&quot;: &quot;Image&quot;,
886
+ &quot;width&quot;: 5965,
887
+ &quot;height&quot;: 2514,
888
+ &quot;service&quot;: [
889
+ {
890
+ &quot;id&quot;: &quot;https://iiif.example.org/image1&quot;,
891
+ &quot;type&quot;: &quot;ImageService3&quot;,
892
+ &quot;profile&quot;: &quot;level2&quot;
893
+ }
894
+ ]
895
+ },
896
+ &quot;requiredStatement&quot;: {
897
+ &quot;label&quot;: { &quot;none&quot;: [&quot;Attribution&quot;] },
898
+ &quot;value&quot;: { &quot;none&quot;: [&quot;Sheet 12, 1789&quot;] }
899
+ },
900
+ &quot;body&quot;: {
901
+ &quot;type&quot;: &quot;FeatureCollection&quot;,
902
+ &quot;transformation&quot;: { &quot;type&quot;: &quot;polynomial&quot;, &quot;options&quot;: { &quot;order&quot;: 1 } },
903
+ &quot;features&quot;: [
904
+ {
905
+ &quot;type&quot;: &quot;Feature&quot;,
906
+ &quot;properties&quot;: { &quot;resourceCoords&quot;: [5085, 782] },
907
+ &quot;geometry&quot;: {
908
+ &quot;type&quot;: &quot;Point&quot;,
909
+ &quot;coordinates&quot;: [4.4885839, 51.9101828]
910
+ }
911
+ }
912
+ ]
913
+ }
914
+ }
915
+ ]
916
+ }
917
+ ]
918
+ }
919
+ </code></pre>
920
+ <p>An annotation is canvas-scoped but the layer it describes is map-wide, so the
921
+ annotations are collected from <strong>every</strong> canvas: a layer annotated on the first
922
+ canvas still applies to the whole story. <code>requiredStatement</code> is read as the
923
+ layer&#39;s attribution. The other presentation keys the term could carry —
924
+ <code>opacity</code>, <code>visible</code>, <code>className</code>, <code>blendMode</code> — have no IIIF vocabulary for a
925
+ georeferencing annotation and are not read; the extent is not lost in substance,
926
+ because the control points describe it. Entries with fewer than three usable
927
+ points are dropped while reading.</p>
928
+ <p><strong>A caveat about the official validator.</strong> The Presentation 3.0 validator checks
929
+ against the base JSON Schema, which predates the Georeference Extension, so it
930
+ rejects a <code>FeatureCollection</code> body and an embedded <code>Image</code> target with <em>&quot;is not
931
+ valid under any of the given schemas&quot;</em> — even with the extension&#39;s own context
932
+ declared, which does resolve at
933
+ <code>http://iiif.io/api/extension/georef/1/context.json</code>. We keep the extension&#39;s
934
+ spelling anyway: a georeferenced manifest that other IIIF tools can read is
935
+ worth more than one this particular validator accepts. <code>npm run validate:iiif</code>
936
+ reports the two georeferenced fixtures as <em>not covered</em> rather than as failures,
937
+ with that reason.</p>
938
+ <p>The result is an <code>overlays[]</code> entry, so <code>setOverlayVisible()</code> /
939
+ <code>setOverlayOpacity()</code> and the rest of the layer API work on it as for any other
940
+ layer. A storymap-JSON <code>overlays[]</code> entry may carry a <code>georeference</code> in place
941
+ of a <code>map_type</code>, which is the shape the converter writes these annotations
942
+ from.</p>
943
+ <p><strong>Limits.</strong> The extension also allows second/third-order polynomials, thin
944
+ plate splines and rotated or skewed sheets. OpenLayers places an image as an
945
+ axis-aligned extent, so the viewer fits the affine (first-order) case only:
946
+ anything else is reported in the console and skipped rather than drawn in the
947
+ wrong place. For true warping, plug
948
+ <a href="https://www.npmjs.com/package/@allmaps/openlayers">Allmaps&#39; <code>WarpedMapLayer</code></a>
949
+ (or any OpenLayers layer) into the <code>tile_source_factory</code> option and keep the
950
+ georeference data on your side — see the &quot;IIIF extensions&quot; recipe in
951
+ <a href="./migration.html">docs/migration-from-knightlab.md</a>. Image-space
952
+ maps (<code>map_as_image</code>, zoomify) have no geographic view, so a placed sheet is
953
+ skipped there as well.</p>
954
+ <p>A storymap-JSON <code>overlays[]</code> entry can carry a <code>georeference</code> — url, width,
955
+ height and the FeatureCollection body — instead of a <code>map_type</code>, and the
956
+ converter writes it as the annotation above, on the first canvas. The two
957
+ georeferenced fixtures are still hand-authored: they are the only manifests in
958
+ the set with no storymap-JSON source. <code>georeferenced-layer.json</code> places its
959
+ sheet; <code>georeferenced-layer-unsupported.json</code> shows the skip path.</p>
472
960
  <h2>Validator interop</h2>
473
961
  <p>The official IIIF presentation validator
474
962
  (<code>https://presentation-validator.iiif.io/validate?version=3.0&amp;format=json</code>)
@@ -489,8 +977,9 @@ official validator and fails CI when any of them is rejected.</p>
489
977
  photo, and a slide with a YouTube video — full manifest:</p>
490
978
  <pre><code class="language-json">{
491
979
  &quot;@context&quot;: [
492
- &quot;http://iiif.io/api/presentation/3/context.json&quot;,
493
980
  &quot;http://iiif.io/api/extension/navplace/context.json&quot;,
981
+ &quot;http://iiif.io/api/presentation/3/context.json&quot;,
982
+ &quot;https://cmahnke.github.io/StoryMapJS/navplace-properties.json&quot;,
494
983
  &quot;https://cmahnke.github.io/StoryMapJS/context.json&quot;
495
984
  ],
496
985
  &quot;id&quot;: &quot;https://example.org/storymap/storm&quot;,
@@ -508,8 +997,8 @@ photo, and a slide with a YouTube video — full manifest:</p>
508
997
  {
509
998
  &quot;id&quot;: &quot;https://example.org/storymap/storm/map-config&quot;,
510
999
  &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;,
1000
+ &quot;profile&quot;: &quot;https://cmahnke.github.io/StoryMapJS/context.json/mapconfig&quot;,
1001
+ &quot;storymap:basemap&quot;: &quot;osm:standard&quot;,
513
1002
  &quot;storymap:language&quot;: &quot;en&quot;,
514
1003
  &quot;storymap:showLines&quot;: true,
515
1004
  &quot;storymap:showHistoryLine&quot;: true,
@@ -546,7 +1035,7 @@ photo, and a slide with a YouTube video — full manifest:</p>
546
1035
  }
547
1036
  ],
548
1037
  &quot;storymap:type&quot;: &quot;overview&quot;,
549
- &quot;storymap:date&quot;: &quot;Sep 1&quot;
1038
+ &quot;navDate&quot;: &quot;Sep 1&quot;
550
1039
  },
551
1040
  {
552
1041
  &quot;id&quot;: &quot;https://example.org/storymap/storm/canvas/2&quot;,
@@ -569,14 +1058,17 @@ photo, and a slide with a YouTube video — full manifest:</p>
569
1058
  &quot;type&quot;: &quot;Image&quot;,
570
1059
  &quot;format&quot;: &quot;image/jpeg&quot;
571
1060
  },
572
- &quot;target&quot;: &quot;https://example.org/storymap/storm/canvas/2&quot;
1061
+ &quot;target&quot;: &quot;https://example.org/storymap/storm/canvas/2&quot;,
1062
+ &quot;label&quot;: &quot;Landfall&quot;,
1063
+ &quot;requiredStatement&quot;: {
1064
+ &quot;label&quot;: { &quot;none&quot;: [&quot;Credit&quot;] },
1065
+ &quot;value&quot;: { &quot;none&quot;: [&quot;Weather Service&quot;] }
1066
+ }
573
1067
  }
574
1068
  ]
575
1069
  }
576
1070
  ],
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;,
1071
+ &quot;navDate&quot;: &quot;Sep 2&quot;,
580
1072
  &quot;navPlace&quot;: {
581
1073
  &quot;id&quot;: &quot;https://example.org/storymap/storm/canvas/2/navplace&quot;,
582
1074
  &quot;type&quot;: &quot;FeatureCollection&quot;,
@@ -609,13 +1101,16 @@ photo, and a slide with a YouTube video — full manifest:</p>
609
1101
  &quot;id&quot;: &quot;https://www.youtube.com/watch?v=example&quot;,
610
1102
  &quot;type&quot;: &quot;Video&quot;
611
1103
  },
612
- &quot;target&quot;: &quot;https://example.org/storymap/storm/canvas/3&quot;
1104
+ &quot;target&quot;: &quot;https://example.org/storymap/storm/canvas/3&quot;,
1105
+ &quot;requiredStatement&quot;: {
1106
+ &quot;label&quot;: { &quot;none&quot;: [&quot;Credit&quot;] },
1107
+ &quot;value&quot;: { &quot;none&quot;: [&quot;News&quot;] }
1108
+ }
613
1109
  }
614
1110
  ]
615
1111
  }
616
1112
  ],
617
- &quot;storymap:mediaCredit&quot;: &quot;News&quot;,
618
- &quot;storymap:date&quot;: &quot;Sep 3&quot;,
1113
+ &quot;navDate&quot;: &quot;Sep 3&quot;,
619
1114
  &quot;navPlace&quot;: {
620
1115
  &quot;id&quot;: &quot;https://example.org/storymap/storm/canvas/3/navplace&quot;,
621
1116
  &quot;type&quot;: &quot;FeatureCollection&quot;,
@@ -650,7 +1145,7 @@ photo, and a slide with a YouTube video — full manifest:</p>
650
1145
  </tr>
651
1146
  <tr>
652
1147
  <td><code>map_type</code></td>
653
- <td><code>service[0].storymap:mapType</code> (<code>zoomify</code> → <code>iiif</code>)</td>
1148
+ <td><code>service[0].storymap:basemap</code> (<code>zoomify</code> → <code>iiif</code>), or <code>tilejson.tiles</code></td>
654
1149
  </tr>
655
1150
  <tr>
656
1151
  <td><code>map_as_image</code></td>
@@ -662,7 +1157,7 @@ photo, and a slide with a YouTube video — full manifest:</p>
662
1157
  </tr>
663
1158
  <tr>
664
1159
  <td><code>map_subdomains</code></td>
665
- <td><code>service[0].storymap:mapSubdomains</code></td>
1160
+ <td><em>dropped</em> (inert, no reader)</td>
666
1161
  </tr>
667
1162
  <tr>
668
1163
  <td><code>map_access_token</code></td>
@@ -685,6 +1180,22 @@ photo, and a slide with a YouTube video — full manifest:</p>
685
1180
  <td><code>service[0].storymap:useCustomMarkers</code></td>
686
1181
  </tr>
687
1182
  <tr>
1183
+ <td><code>map_area</code></td>
1184
+ <td><code>service[0].storymap:mapArea</code></td>
1185
+ </tr>
1186
+ <tr>
1187
+ <td><code>overview_extent</code></td>
1188
+ <td><code>service[0].storymap:overviewExtent</code></td>
1189
+ </tr>
1190
+ <tr>
1191
+ <td><code>keyboard</code></td>
1192
+ <td><code>service[0].storymap:keyboard</code></td>
1193
+ </tr>
1194
+ <tr>
1195
+ <td><code>overlays</code> (georeference)</td>
1196
+ <td>Georeferencing annotation <code>target</code> + <code>body</code></td>
1197
+ </tr>
1198
+ <tr>
688
1199
  <td><code>zoom_distance</code></td>
689
1200
  <td><em>dropped</em> (viewer setting)</td>
690
1201
  </tr>
@@ -694,7 +1205,7 @@ photo, and a slide with a YouTube video — full manifest:</p>
694
1205
  </tr>
695
1206
  <tr>
696
1207
  <td><code>less_bounce</code></td>
697
- <td><code>service[0].storymap:lessBounce</code></td>
1208
+ <td><em>dropped</em> (inert, no reader)</td>
698
1209
  </tr>
699
1210
  <tr>
700
1211
  <td><code>line_follows_path</code></td>
@@ -734,7 +1245,7 @@ photo, and a slide with a YouTube video — full manifest:</p>
734
1245
  </tr>
735
1246
  <tr>
736
1247
  <td><code>iiif.url</code></td>
737
- <td><code>service[0].storymap:iiifUrl</code> + canvas Image annotation <code>service[]</code></td>
1248
+ <td>Canvas Image annotation <code>service[0].id</code> + <code>/info.json</code></td>
738
1249
  </tr>
739
1250
  <tr>
740
1251
  <td><code>iiif.attribution</code></td>
@@ -782,7 +1293,7 @@ photo, and a slide with a YouTube video — full manifest:</p>
782
1293
  </tr>
783
1294
  <tr>
784
1295
  <td><code>date</code></td>
785
- <td>Canvas <code>storymap:date</code></td>
1296
+ <td>Canvas <code>navDate</code></td>
786
1297
  </tr>
787
1298
  <tr>
788
1299
  <td><code>text.headline</code></td>
@@ -846,28 +1357,65 @@ photo, and a slide with a YouTube video — full manifest:</p>
846
1357
  </tr>
847
1358
  <tr>
848
1359
  <td><code>media.caption</code></td>
849
- <td>Canvas <code>storymap:mediaCaption</code></td>
1360
+ <td>Painting annotation <code>label</code></td>
850
1361
  </tr>
851
1362
  <tr>
852
1363
  <td><code>media.credit</code></td>
853
- <td>Canvas <code>storymap:mediaCredit</code></td>
1364
+ <td>Painting annotation <code>requiredStatement</code> (<code>{label, value}</code>)</td>
1365
+ </tr>
1366
+ <tr>
1367
+ <td><code>media.alt</code></td>
1368
+ <td>Painting annotation <code>accessibilitySummary</code></td>
1369
+ </tr>
1370
+ <tr>
1371
+ <td><code>media.srcset</code></td>
1372
+ <td>Canvas <code>storymap:mediaSrcset</code></td>
1373
+ </tr>
1374
+ <tr>
1375
+ <td><code>media.sizes</code></td>
1376
+ <td>Canvas <code>storymap:mediaSizes</code></td>
1377
+ </tr>
1378
+ <tr>
1379
+ <td><code>location.region</code></td>
1380
+ <td>Painting annotation target <code>ImageApiSelector</code> <code>xywh=pixel:</code></td>
854
1381
  </tr>
855
1382
  <tr>
856
1383
  <td><code>media.thumb</code></td>
857
- <td><em>dropped</em> (thumbnails may be added via Canvas <code>thumbnail</code>)</td>
1384
+ <td>Canvas <code>thumbnail[]</code> or the body <code>thumbnail[]</code></td>
858
1385
  </tr>
859
1386
  <tr>
860
1387
  <td><code>background</code></td>
861
- <td>Canvas <code>storymap:background</code> <code>{url, color}</code></td>
1388
+ <td>Canvas <code>background</code> painting annotation (Image + Color body)</td>
862
1389
  </tr>
863
1390
  <tr>
864
1391
  <td><code>uniqueid</code></td>
865
- <td><em>dropped</em> (canvas <code>id</code>s are the canonical identifiers)</td>
1392
+ <td>Canvas <code>id</code></td>
1393
+ </tr>
1394
+ <tr>
1395
+ <td><code>group</code></td>
1396
+ <td>A <code>structures</code> Range label; the Range order is the slide order</td>
1397
+ </tr>
1398
+ <tr>
1399
+ <td><code>language</code> (per slide)</td>
1400
+ <td>The language tag the slide&#39;s text was read in (§3.4)</td>
1401
+ </tr>
1402
+ <tr>
1403
+ <td><code>logo</code>, <code>metadata</code></td>
1404
+ <td>Read into <code>data.logo</code> / <code>data.metadata[]</code></td>
1405
+ </tr>
1406
+ <tr>
1407
+ <td><code>tilejson</code></td>
1408
+ <td><code>service[0].tilejson</code></td>
1409
+ </tr>
1410
+ <tr>
1411
+ <td><code>title</code></td>
1412
+ <td>Manifest <code>label</code> (a label is required, so the converter uses the file name)</td>
866
1413
  </tr>
867
1414
  </tbody></table>
868
1415
  <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>
1416
+ <p><code>npm run convert:iiif</code> regenerates <code>public/examples-iiif/</code> from
1417
+ <code>public/examples/</code> (it needs Node 22.6+, since the script imports the
1418
+ TypeScript library source via type stripping). Ids are deterministic:</p>
871
1419
  <ul>
872
1420
  <li>Manifest: <code>https://example.org/storymap/&lt;name&gt;</code></li>
873
1421
  <li>Canvas: <code>&lt;manifest-id&gt;/canvas/&lt;n&gt;</code> (1-based, slide order)</li>
@@ -875,6 +1423,13 @@ photo, and a slide with a YouTube video — full manifest:</p>
875
1423
  <li>Annotation: <code>&lt;canvas-id&gt;/annotation/1</code></li>
876
1424
  <li>FeatureCollection / Feature: <code>&lt;canvas-id&gt;/navplace[.../feature/1]</code></li>
877
1425
  </ul>
1426
+ <p>Three fixtures in <code>public/examples-iiif/</code> are hand-authored and not
1427
+ overwritten by a full run: <code>georeferenced-layer.json</code> and
1428
+ <code>georeferenced-layer-unsupported.json</code>, which exercise the Georeference
1429
+ Extension payloads (the legacy format cannot express ground control points,
1430
+ so there is nothing to convert from), and <code>annotated-image.json</code>, the
1431
+ annotation-driven tour (there is no storymap document to convert from —
1432
+ annotation stops only exist on the manifest side).</p>
878
1433
 
879
1434
  </main>
880
1435