@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
@@ -27,6 +27,10 @@ interface SchemaNode {
27
27
  items?: SchemaNode;
28
28
  required?: string[];
29
29
  properties?: Record<string, SchemaNode>;
30
+ /** Value must satisfy at least one of these. */
31
+ anyOf?: SchemaNode[];
32
+ /** Annotation only — see `formatMatches`. */
33
+ format?: string;
30
34
  [key: string]: unknown;
31
35
  }
32
36
 
@@ -50,14 +54,46 @@ function typeMatches(value: unknown, type: string | string[]): boolean {
50
54
  return typeof value === "boolean";
51
55
  case "null":
52
56
  return value === null;
53
- case "uri":
54
- return typeof value === "string";
55
57
  default:
56
58
  return true;
57
59
  }
58
60
  });
59
61
  }
60
62
 
63
+ /**
64
+ * JSON Schema `format` is an annotation by default, so it is only checked
65
+ * where it costs nothing. The schema uses it twice, both for icon/image URLs.
66
+ * Note this was previously listed as a *type* in `typeMatches`, where it was
67
+ * unreachable: `typeMatches` is only ever called with `schemaNode.type`.
68
+ */
69
+ /**
70
+ * A malformed `pattern` in the schema used to throw straight out of
71
+ * validation, aborting `new StoryMap(...)` instead of reporting an error.
72
+ */
73
+ function safeRegExp(pattern: string, value: string): boolean {
74
+ try {
75
+ return new RegExp(pattern).test(value);
76
+ } catch {
77
+ // an unusable pattern must not make the document fail to load
78
+ return true;
79
+ }
80
+ }
81
+
82
+ function formatMatches(value: unknown, format: string): boolean {
83
+ if (typeof value !== "string") {
84
+ return true;
85
+ }
86
+ if (format === "uri" || format === "uri-reference") {
87
+ try {
88
+ new URL(value, "https://example.invalid/");
89
+ return true;
90
+ } catch {
91
+ return false;
92
+ }
93
+ }
94
+ return true;
95
+ }
96
+
61
97
  function validateAgainstSchema(
62
98
  value: unknown,
63
99
  schemaNode: SchemaNode,
@@ -78,6 +114,36 @@ function validateAgainstSchema(
78
114
  return;
79
115
  }
80
116
 
117
+ // anyOf — the schema uses it for map_bbox, map_overview_center and the
118
+ // legacy zoomify block. It was not implemented at all, so those three
119
+ // fields (including map_bbox's "exactly 4 numbers" rule) were accepted
120
+ // completely unvalidated at runtime and by the CLI.
121
+ if (schemaNode.anyOf) {
122
+ // try each branch into a scratch error list; the value is valid if any
123
+ // branch accepts it
124
+ const branchErrors: StorymapError[][] = schemaNode.anyOf.map((branch) => {
125
+ const collected: StorymapError[] = [];
126
+ validateAgainstSchema(value, branch, path, collected);
127
+ return collected;
128
+ });
129
+ const anyOfValid = branchErrors.some((collected) => collected.length === 0);
130
+ if (!anyOfValid) {
131
+ // report the closest branch: the most likely intent
132
+ let best = branchErrors[0] ?? [];
133
+ for (const candidate of branchErrors) {
134
+ if (candidate.length > 0 && candidate.length < best.length) {
135
+ best = candidate;
136
+ }
137
+ }
138
+ errors.push(...best);
139
+ errors.push({
140
+ path,
141
+ message: `must match one of the ${schemaNode.anyOf.length} allowed shapes`,
142
+ });
143
+ return;
144
+ }
145
+ }
146
+
81
147
  // type
82
148
  if (schemaNode.type) {
83
149
  if (!typeMatches(value, schemaNode.type)) {
@@ -115,11 +181,19 @@ function validateAgainstSchema(
115
181
  if (schemaNode.minLength !== undefined && value.length < schemaNode.minLength) {
116
182
  errors.push({ path, message: `must be at least ${schemaNode.minLength} characters` });
117
183
  }
118
- if (schemaNode.pattern !== undefined && !new RegExp(schemaNode.pattern).test(value)) {
184
+ if (schemaNode.maxLength !== undefined && value.length > schemaNode.maxLength) {
185
+ errors.push({ path, message: `must be at most ${schemaNode.maxLength} characters` });
186
+ }
187
+ if (schemaNode.pattern !== undefined && !safeRegExp(schemaNode.pattern, value)) {
119
188
  errors.push({ path, message: `must match ${schemaNode.pattern}` });
120
189
  }
121
190
  }
122
191
 
192
+ // format (annotation)
193
+ if (schemaNode.format && !formatMatches(value, schemaNode.format)) {
194
+ errors.push({ path, message: `must be a valid ${schemaNode.format}` });
195
+ }
196
+
123
197
  // array constraints
124
198
  if (Array.isArray(value)) {
125
199
  if (schemaNode.minItems !== undefined && value.length < schemaNode.minItems) {
@@ -128,10 +202,9 @@ function validateAgainstSchema(
128
202
  if (schemaNode.maxItems !== undefined && value.length > schemaNode.maxItems) {
129
203
  errors.push({ path, message: `must have at most ${schemaNode.maxItems} items` });
130
204
  }
131
- if (schemaNode.items) {
132
- value.forEach((item, i) =>
133
- validateAgainstSchema(item, schemaNode.items, `${path}[${i}]`, errors),
134
- );
205
+ const items = schemaNode.items;
206
+ if (items) {
207
+ value.forEach((item, i) => validateAgainstSchema(item, items, `${path}[${i}]`, errors));
135
208
  }
136
209
  }
137
210
 
package/src/types.ts CHANGED
@@ -1,4 +1,7 @@
1
1
  // Shared types for the StoryMapJS codebase.
2
+ import type { Tile as TileLayer } from "ol/layer";
3
+ import type Layer from "ol/layer/Layer";
4
+ import type Source from "ol/source/Source";
2
5
 
3
6
  // ---------- Storymap data (exchange format) ----------
4
7
 
@@ -12,6 +15,12 @@ export interface StorymapSlideLocation {
12
15
  lat?: number;
13
16
  lon?: number;
14
17
  zoom?: number;
18
+ /**
19
+ * Image region `[x, y, w, h]` in image pixels (IIIF xywh convention,
20
+ * StrollView-style image stops): the view fits the region on
21
+ * navigation; image maps (`map_type: "iiif"` + `map_as_image`) only.
22
+ */
23
+ region?: [number, number, number, number];
15
24
  line?: boolean;
16
25
  icon?: string;
17
26
  iconSize?: number[];
@@ -32,8 +41,56 @@ export interface StorymapSlideMedia {
32
41
  url?: string | null;
33
42
  caption?: string | null;
34
43
  credit?: string | null;
44
+ /**
45
+ * Accessible description of the media, used as the image's `alt` when the
46
+ * media is an image. In IIIF this is the painting annotation's
47
+ * `accessibilitySummary`.
48
+ */
49
+ alt?: string | null;
35
50
  thumb?: string | null;
36
51
  mediatype?: MediaTypeMatch | null;
52
+ /**
53
+ * WebVTT subtitle file for an audio or video slide, rendered as a
54
+ * `<track kind="subtitles">`. IIIF has no subtitle term, so this stays a
55
+ * storymap-JSON field; the authoring guide notes the
56
+ * `TextualBody` + `format: text/vtt` shape we also accept.
57
+ */
58
+ subtitles?: string | null;
59
+ [key: string]: unknown;
60
+ }
61
+
62
+ /**
63
+ * Optional spoken narration for one slide, played through a dedicated audio
64
+ * element rather than the slide's media frame — a tour stop usually has a
65
+ * picture and a recording, not one media item. Storymap JSON only: the
66
+ * closest manifest spelling is a `Sound` body, which currently lands in
67
+ * `media.url` rather than here.
68
+ */
69
+ /**
70
+ * Per-slide marker presentation, consolidated. `location.*` keeps working as
71
+ * the legacy spelling and `marker.*` wins when present — see
72
+ * docs/plans/iiif-media-tours.md §2.
73
+ *
74
+ * In a IIIF manifest none of this is a `storymap:` term: it all arrives in the
75
+ * `navPlace` Feature's `properties` bag (`icon`, `iconSize`, `image`, `name`,
76
+ * `popup`, `audioBadge`), which is a GeoJSON foreign-member bag and so needs
77
+ * no vocabulary registration.
78
+ */
79
+ export interface StorymapSlideMarker {
80
+ icon?: string;
81
+ iconSize?: number[];
82
+ image?: string;
83
+ /** The marker label; in a manifest this is `properties.name`. */
84
+ label?: string;
85
+ /** Show the popup card when this (active) marker is clicked. */
86
+ popup?: boolean;
87
+ /** Mark slides that carry narration or audio media with a small badge. */
88
+ audioBadge?: boolean;
89
+ [key: string]: unknown;
90
+ }
91
+
92
+ export interface StorymapSlideNarration {
93
+ url: string;
37
94
  [key: string]: unknown;
38
95
  }
39
96
 
@@ -43,15 +100,33 @@ export interface StorymapSlideBackground {
43
100
  opacity?: number;
44
101
  }
45
102
 
103
+ /**
104
+ * One slide of a storymap.
105
+ *
106
+ * The nullable members (`| null`) are not decoration: the storymap JSON uses
107
+ * `null` to mean "explicitly absent" and the viewer seeds its own defaults
108
+ * with `null` before the data is merged in, so a plain `?` would not type.
109
+ */
46
110
  export interface StorymapSlide {
47
111
  type?: string;
48
112
  date?: string | Record<string, unknown> | null;
49
113
  group?: string;
50
- location?: StorymapSlideLocation;
51
- media?: StorymapSlideMedia;
52
- text?: StorymapSlideText;
114
+ /**
115
+ * The language tag this slide's text was read in (§3.4 of
116
+ * docs/plans/iiif-interop.md). A IIIF manifest states its text as a
117
+ * language map; the reader picks the viewer's configured language and
118
+ * reports which one it used, so a host can offer a language switch.
119
+ * Absent for language-neutral (`none`) text, and for a single-language
120
+ * storymap.
121
+ */
122
+ language?: string;
123
+ location?: StorymapSlideLocation | null;
124
+ media?: StorymapSlideMedia | null;
125
+ marker?: StorymapSlideMarker | null;
126
+ narration?: StorymapSlideNarration | null;
127
+ text?: StorymapSlideText | null;
53
128
  background?: StorymapSlideBackground | string | null;
54
- uniqueid?: string;
129
+ uniqueid?: string | null;
55
130
  [key: string]: unknown;
56
131
  }
57
132
 
@@ -67,6 +142,21 @@ export interface StorymapDataWrapper {
67
142
 
68
143
  // ---------- StoryMap / Map options ----------
69
144
 
145
+ /**
146
+ * Custom tile layer/source factory (see
147
+ * `StorymapOptions.tile_source_factory`). `createDefault` runs the
148
+ * built-in `map_type` handling, so a factory can decorate or delegate.
149
+ *
150
+ * May return any `ol/layer/Layer` (used as-is — this is what lets a
151
+ * third-party layer such as an Allmaps `WarpedMapLayer` render), a bare
152
+ * `Source` (wrapped in a `TileLayer`), or `null`/`undefined` to fall
153
+ * through to the default `map_type` handling.
154
+ */
155
+ export type TileSourceFactory = (
156
+ map_type: string,
157
+ context: { options: StorymapOptions; createDefault: () => TileLayer },
158
+ ) => Layer | TileLayer | Source | null | undefined;
159
+
70
160
  export interface StorymapOptions {
71
161
  width: number;
72
162
  height: number;
@@ -75,7 +165,6 @@ export interface StorymapOptions {
75
165
  default_bg_color: { r: number; g: number; b: number };
76
166
  map_size_sticky: number;
77
167
  map_center_offset: { left: number; top: number } | null;
78
- less_bounce: boolean;
79
168
  start_at_slide: number;
80
169
  call_to_action: boolean;
81
170
  call_to_action_text: string;
@@ -89,7 +178,6 @@ export interface StorymapOptions {
89
178
  skinny_size: number;
90
179
  duration: number;
91
180
  ease: unknown;
92
- dragging: boolean;
93
181
  trackResize: boolean;
94
182
  /**
95
183
  * Navigate slides with arrow keys anywhere on the page (default false:
@@ -101,6 +189,13 @@ export interface StorymapOptions {
101
189
  nocache: boolean;
102
190
  /** Advance slides automatically every N milliseconds; 0 disables (issue #380) */
103
191
  autoplay: number;
192
+ /**
193
+ * With autoplay on, wait for the current slide's audio or video to end
194
+ * before advancing instead of using the `autoplay` millisecond timer,
195
+ * which stays as the fallback. Slides without playable media keep the
196
+ * timer, so a mixed story never stalls.
197
+ */
198
+ autoplay_media: boolean;
104
199
  /** Show a progress bar in the menubar (issue #247) */
105
200
  show_progress: boolean;
106
201
  /** Show the slide headline as a label on the active map marker (issue #243) */
@@ -110,6 +205,15 @@ export interface StorymapOptions {
110
205
  /** Override the overview fit center (issues #107, #271) */
111
206
  map_overview_center: { lat: number; lon: number } | null;
112
207
  map_type: string;
208
+ /**
209
+ * Custom OpenLayers tile layer/source factory (issue #473): consulted
210
+ * by the tile layer factory before the built-in `map_type` switch, for
211
+ * every base, overlay and minimap layer. Return a `TileLayer` (or a
212
+ * bare `Source`, auto-wrapped in one) for custom handling — e.g. WMS —
213
+ * or `null`/`undefined` to fall through to the default types.
214
+ * Constructor- and runtime-only: functions cannot ride storymap JSON.
215
+ */
216
+ tile_source_factory: TileSourceFactory | null;
113
217
  attribution: string;
114
218
  /**
115
219
  * Stacked raster overlays above the base map, below the route lines.
@@ -119,7 +223,6 @@ export interface StorymapOptions {
119
223
  */
120
224
  overlays: StorymapOverlayLayer[];
121
225
  map_mini: boolean;
122
- map_subdomains: string;
123
226
  map_as_image: boolean;
124
227
  map_access_token: string;
125
228
  map_background_color: string;
@@ -160,7 +263,9 @@ export interface StorymapOptions {
160
263
  /**
161
264
  * Ask for permission before loading anything from external services
162
265
  * (media embeds, map tiles, external font CSS) — GDPR consent mode.
163
- * Grants are remembered per service in a cookie for 90 days.
266
+ * Decisions are remembered per service in `localStorage` under
267
+ * `storymapjs-consent` with no expiry: clearing site data is what makes
268
+ * the viewer ask again.
164
269
  */
165
270
  consent_required: boolean;
166
271
  /** Slide text color override, sets --vco-color-text (issue #177) */
@@ -170,14 +275,13 @@ export interface StorymapOptions {
170
275
  /** Show the great-circle route distance in the menubar (issue #341) */
171
276
  show_distance: boolean;
172
277
  /**
173
- * Raw OpenLayers map configuration. `controls` and `interactions` replace
174
- * the StoryMapJS defaults, `view` is merged over the computed default view
278
+ * Raw OpenLayers map configuration. `controls` replaces the StoryMapJS
279
+ * defaults, `interactions` are *added to* the viewer's own pan/zoom
280
+ * interactions, and `view` is merged over the computed default view
175
281
  * and `element` (an HTMLElement or DOM id) replaces the auto-created map
176
282
  * container div.
177
283
  */
178
284
  map_options: StorymapMapOptions;
179
- map_popup: boolean;
180
- zoom_distance: number;
181
285
  calculate_zoom: boolean;
182
286
  line_follows_path: boolean;
183
287
  line_color: string;
@@ -190,12 +294,17 @@ export interface StorymapOptions {
190
294
  show_history_line: boolean;
191
295
  use_custom_markers: boolean;
192
296
  iiif: { url: string; attribution: string };
297
+ tilejson?: StorymapTilejson;
298
+ /**
299
+ * The `seeAlso` targets a IIIF manifest points at, recorded but not
300
+ * fetched — see `loadSeeAlso()` (§5.2 of docs/plans/iiif-interop.md).
301
+ */
302
+ see_also?: { id: string; type: string }[];
193
303
  map_height: number;
194
304
  storyslider_height: number;
195
305
  slide_padding_lr: number;
196
306
  slide_default_fade: string;
197
307
  menubar_default_y: number;
198
- path_gfx: string;
199
308
  script_path: string;
200
309
  font_css: string;
201
310
  language: string;
@@ -219,14 +328,43 @@ export interface AnimationHandle {
219
328
 
220
329
  // ---------- map ----------
221
330
 
331
+ /**
332
+ * TileJSON 2.1 tile source metadata, from a manifest's map configuration
333
+ * service (§2.9 of docs/plans/iiif-interop.md).
334
+ *
335
+ * This is how a manifest states a tile source: `tiles` is the URL template and
336
+ * the rest is the standard metadata around it, where a keyword basemap
337
+ * (`osm`, `stadia`, `iiif`, …) has no such thing to say. `minzoom`,
338
+ * `maxzoom`, `bounds` and `scheme` constrain the source; `center` and `zoom`
339
+ * set the initial view.
340
+ */
341
+ export interface StorymapTilejson {
342
+ /** URL template, e.g. `https://tiles.example.org/{z}/{x}/{y}.png` */
343
+ tiles: string | string[];
344
+ /** Lowest zoom level the source has tiles for */
345
+ minzoom?: number;
346
+ /** Highest zoom level the source has tiles for */
347
+ maxzoom?: number;
348
+ /** `[west, south, east, north]`, WGS84 lon/lat, of the covered area */
349
+ bounds?: [number, number, number, number];
350
+ /** `xyz` (default) or `tms`, which flips the tile row order */
351
+ scheme?: "xyz" | "tms";
352
+ /** `[lon, lat, zoom]` of the map's default view */
353
+ center?: [number, number, number];
354
+ }
355
+
222
356
  /**
223
357
  * A stacked raster overlay above the base map (StorymapOptions.overlays).
224
358
  * Presentation is declarative: hosts no longer need to reach into the
225
359
  * layer objects for blend modes, clips or stacking tweaks.
226
360
  */
227
361
  export interface StorymapOverlayLayer {
228
- /** Any `map_type` value the tile layer factory accepts */
229
- map_type: string;
362
+ /**
363
+ * Any `map_type` value the tile layer factory accepts. Required unless
364
+ * the entry carries a `georeference` (a placed IIIF image instead of
365
+ * a tile source).
366
+ */
367
+ map_type?: string;
230
368
  /** Layer opacity 0..1 (default 1) */
231
369
  opacity?: number;
232
370
  /** Initial visibility (default true) */
@@ -245,6 +383,52 @@ export interface StorymapOverlayLayer {
245
383
  blendMode?: string;
246
384
  /** Clip box `[west, south, east, north]` in lon/lat (mercator maps) */
247
385
  extent?: [number, number, number, number];
386
+ /**
387
+ * IIIF Georeference Extension placement instead of a tile source. The
388
+ * ground control points are fitted affinely and the image is placed on
389
+ * the geographic map, so this is the manifest-side equivalent of a
390
+ * georeferenced raster overlay.
391
+ */
392
+ georeference?: StorymapGeoreference;
393
+ }
394
+
395
+ /**
396
+ * A IIIF Georeference Extension annotation body plus the image it places
397
+ * (`overlays[].georeference`). The `body` is the annotation payload of
398
+ * `iiif.io/api/extension/georef` verbatim: a GeoJSON FeatureCollection of
399
+ * ground control points pairing `properties.resourceCoords` (image pixels)
400
+ * with `geometry.coordinates` (WGS84 lon/lat), optionally carrying a
401
+ * `transformation` hint.
402
+ *
403
+ * The viewer fits the affine (first-order polynomial) case and places the
404
+ * image with OpenLayers' reprojection, which requires an axis-aligned
405
+ * placement; rotated or skewed sheets, higher-order polynomials and thin
406
+ * plate splines are reported and skipped — see the "Geo-referenced layers"
407
+ * section of docs/storymap-as-iiif-manifest.md.
408
+ */
409
+ export interface StorymapGeoreference {
410
+ /** IIIF Image API service base (or a full-size image URL) to place */
411
+ url: string;
412
+ /** Image width in pixels (the resourceCoords space) */
413
+ width: number;
414
+ /** Image height in pixels */
415
+ height: number;
416
+ /** Georeference annotation body: the GCP FeatureCollection */
417
+ body: StorymapGeoreferenceBody;
418
+ }
419
+
420
+ export interface StorymapGeoreferenceBody {
421
+ type?: string;
422
+ /** `polynomial` with `order: 1`, or absent; other values are skipped */
423
+ transformation?: { type?: string; options?: { order?: number } };
424
+ features: StorymapGroundControlPoint[];
425
+ }
426
+
427
+ /** One ground control point: an image pixel paired with a WGS84 position */
428
+ export interface StorymapGroundControlPoint {
429
+ type?: string;
430
+ properties?: { resourceCoords?: [number, number] };
431
+ geometry?: { type?: string; coordinates?: number[] };
248
432
  }
249
433
 
250
434
  /** OpenLayers passthrough options (see StorymapOptions.map_options) */
@@ -255,26 +439,39 @@ export interface StorymapMapOptions {
255
439
  view?: Record<string, unknown>;
256
440
  /** Replaces the default (empty) controls list */
257
441
  controls?: unknown[];
258
- /** Replaces the default (empty) interactions list */
442
+ /**
443
+ * Added to the viewer's own pan/zoom interactions (not a replacement:
444
+ * the viewer's defaults are always added). `controls` *is* a
445
+ * replacement, since the viewer adds none of its own.
446
+ */
259
447
  interactions?: unknown[];
260
448
  /** Any other ol/Map constructor option (layers, pixelRatio, ...) */
261
449
  [key: string]: unknown;
262
450
  }
263
451
 
452
+ /**
453
+ * A resolved geographic coordinate.
454
+ *
455
+ * `lat`/`lon` are required: this type is for points the map can actually
456
+ * focus on. A *slide* may carry a `location` without coordinates (an image
457
+ * region, an icon only) — that is `StorymapSlideLocation`, which keeps them
458
+ * optional. `lng` is accepted as a legacy alias on input only.
459
+ */
264
460
  export interface LatLngLiteral {
265
- lat: number | undefined;
266
- lon?: number | undefined;
267
- lng?: number | undefined;
461
+ lat: number;
462
+ lon: number;
463
+ lng?: number;
268
464
  }
269
465
 
270
- export interface MapMarkerData {
466
+ /**
467
+ * A marker's data: the slide it was created from, plus the `real_marker` flag
468
+ * the marker sets once it has confirmed numeric lat/lon. A separate interface
469
+ * used to drift from `StorymapSlide` (narrower `text`, its own `location`),
470
+ * which then made `Map._createMarker(slide)` unassignable.
471
+ */
472
+ export type MapMarkerData = StorymapSlide & {
271
473
  real_marker?: boolean;
272
- location?: StorymapSlideLocation;
273
- media?: StorymapSlideMedia & { mediatype?: MediaTypeMatch | null };
274
- text?: { headline?: string };
275
- type?: string;
276
- [key: string]: unknown;
277
- }
474
+ };
278
475
 
279
476
  export type IconSpec = {
280
477
  url: string;