@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
package/src/ui/MenuBar.ts CHANGED
@@ -5,7 +5,7 @@ import { easeInOutQuint } from "../animation/easings";
5
5
 
6
6
  import { DomEvent } from "../dom/DomEvent";
7
7
  import { Browser } from "../core/Browser";
8
- import { Language } from "../language/Language";
8
+ import { Language, currentLocale } from "../language/Language";
9
9
 
10
10
  /* MenuBar
11
11
  Buttons, progress and distance display for the storymap
@@ -53,7 +53,11 @@ class MenuBarBase {
53
53
  if (typeof elem === "object") {
54
54
  this._el.container = elem;
55
55
  } else {
56
- this._el.container = Dom.get(elem);
56
+ const found = Dom.get(elem);
57
+ if (!found) {
58
+ throw new Error("StoryMapJS: no element with id " + elem);
59
+ }
60
+ this._el.container = found;
57
61
  }
58
62
 
59
63
  if (parent_elem) {
@@ -116,6 +120,40 @@ class MenuBarBase {
116
120
  }
117
121
  }
118
122
 
123
+ /**
124
+ * Repaint the overview button label. An image map has no interactive
125
+ * overview, so it gets the shorter wording.
126
+ */
127
+ _renderOverviewLabel(): void {
128
+ this._el.button_overview.innerHTML = this.options.map_as_image
129
+ ? Language.buttons.overview
130
+ : Language.buttons.map_overview;
131
+ }
132
+
133
+ /**
134
+ * Repaint the "back to start" button label. Icon-only on mobile.
135
+ */
136
+ _renderBackToStartLabel(): void {
137
+ this._el.button_backtostart.innerHTML = Browser.mobile
138
+ ? "<span class='vco-icon-goback'></span>"
139
+ : Language.buttons.backtostart + " <span class='vco-icon-goback'></span>";
140
+ }
141
+
142
+ /**
143
+ * Repaint the collapse/expand toggle. Icon-only on mobile.
144
+ */
145
+ _renderCollapseLabel(collapsed: boolean): void {
146
+ const arrow = collapsed ? "arrow-down" : "arrow-up";
147
+ if (Browser.mobile) {
148
+ this._el.button_collapse_toggle.innerHTML = `<span class='vco-icon-${arrow}'></span>`;
149
+ } else {
150
+ const text = collapsed
151
+ ? Language.buttons.uncollapse_toggle
152
+ : Language.buttons.collapse_toggle;
153
+ this._el.button_collapse_toggle.innerHTML = `${text} <span class='vco-icon-${arrow}'></span>`;
154
+ }
155
+ }
156
+
119
157
  /**
120
158
  * Repaint every text label from the active language (see `setLanguage`).
121
159
  * Icon-only mobile buttons carry no text and are left untouched.
@@ -124,21 +162,10 @@ class MenuBarBase {
124
162
  if (Browser.mobile) {
125
163
  return;
126
164
  }
127
- if (this.options.map_as_image) {
128
- this._el.button_overview.innerHTML = Language.buttons.overview;
129
- } else {
130
- this._el.button_overview.innerHTML = Language.buttons.map_overview;
131
- }
132
- this._el.button_backtostart.innerHTML =
133
- Language.buttons.backtostart + " <span class='vco-icon-goback'></span>";
165
+ this._renderOverviewLabel();
166
+ this._renderBackToStartLabel();
134
167
  this.setFullscreenState(this._fullscreenActive);
135
- if (this.collapsed) {
136
- this._el.button_collapse_toggle.innerHTML =
137
- Language.buttons.uncollapse_toggle + "<span class='vco-icon-arrow-down'></span>";
138
- } else {
139
- this._el.button_collapse_toggle.innerHTML =
140
- Language.buttons.collapse_toggle + "<span class='vco-icon-arrow-up'></span>";
141
- }
168
+ this._renderCollapseLabel(this.collapsed);
142
169
  }
143
170
 
144
171
  /**
@@ -171,7 +198,7 @@ class MenuBarBase {
171
198
  }
172
199
  this._el.distance.style.display = "";
173
200
  const miles = kilometers * 0.621371;
174
- const locale = typeof Language.lang === "string" && Language.lang ? Language.lang : "en";
201
+ const locale = currentLocale();
175
202
  this._el.distance.textContent =
176
203
  kilometers >= 10
177
204
  ? `${Math.round(kilometers).toLocaleString(locale)} km · ${Math.round(miles).toLocaleString("en-US")} mi`
@@ -203,28 +230,23 @@ class MenuBarBase {
203
230
  if (this.collapsed) {
204
231
  this.collapsed = false;
205
232
  this.show();
206
- this._el.button_overview.style.display = "inline";
207
- this.fire("collapse", { y: this.options.menubar_default_y });
208
- if (Browser.mobile) {
209
- this._el.button_collapse_toggle.innerHTML =
210
- "<span class='vco-icon-arrow-up'></span>";
211
- } else {
212
- this._el.button_collapse_toggle.innerHTML =
213
- Language.buttons.collapse_toggle + "<span class='vco-icon-arrow-up'></span>";
214
- }
233
+ // Restore from the option, not unconditionally: a story with
234
+ // show_overview false (including every mapless story, which the
235
+ // viewer forces off) would otherwise resurrect a dead overview
236
+ // button on every un-collapse.
237
+ this._el.button_overview.style.display =
238
+ this.options.show_overview === false ? "none" : "inline";
239
+ // `collapsed` is the authoritative signal: `y` is the menubar
240
+ // position, and reading it back as a map height made the
241
+ // un-collapse pass shrink the map to the menubar's pixel height.
242
+ this.fire("collapse", { y: this.options.menubar_default_y, collapsed: false });
243
+ this._renderCollapseLabel(false);
215
244
  } else {
216
245
  this.collapsed = true;
217
246
  this.hide(25);
218
247
  this._el.button_overview.style.display = "none";
219
- this.fire("collapse", { y: 1 });
220
- if (Browser.mobile) {
221
- this._el.button_collapse_toggle.innerHTML =
222
- "<span class='vco-icon-arrow-down'></span>";
223
- } else {
224
- this._el.button_collapse_toggle.innerHTML =
225
- Language.buttons.uncollapse_toggle +
226
- "<span class='vco-icon-arrow-down'></span>";
227
- }
248
+ this.fire("collapse", { y: 1, collapsed: true });
249
+ this._renderCollapseLabel(true);
228
250
  }
229
251
  }
230
252
 
@@ -233,31 +255,40 @@ class MenuBarBase {
233
255
  _initLayout() {
234
256
  // Create Layout
235
257
 
236
- // Buttons
237
- this._el.button_overview = Dom.create("span", "vco-menubar-button", this._el.container);
258
+ // Buttons — real <button> elements for keyboard/AT operability
259
+ // (issue #385 wave); class styling carries the look
260
+ this._el.button_overview = Dom.create("button", "vco-menubar-button", this._el.container);
261
+ this._el.button_overview.setAttribute("type", "button");
238
262
  DomEvent.addListener(this._el.button_overview, "click", this._onButtonOverview, this);
239
263
  if (this.options.show_overview === false) {
240
264
  this._el.button_overview.style.display = "none";
241
265
  }
242
266
 
243
- this._el.button_backtostart = Dom.create("span", "vco-menubar-button", this._el.container);
267
+ this._el.button_backtostart = Dom.create(
268
+ "button",
269
+ "vco-menubar-button",
270
+ this._el.container,
271
+ );
272
+ this._el.button_backtostart.setAttribute("type", "button");
244
273
  DomEvent.addListener(this._el.button_backtostart, "click", this._onButtonBackToStart, this);
245
274
  if (this.options.show_back_to_start === false) {
246
275
  this._el.button_backtostart.style.display = "none";
247
276
  }
248
277
 
249
278
  // Fullscreen toggle (hidden via CSS/display when disabled by options)
250
- this._el.button_fullscreen = Dom.create("span", "vco-menubar-button", this._el.container);
279
+ this._el.button_fullscreen = Dom.create("button", "vco-menubar-button", this._el.container);
280
+ this._el.button_fullscreen.setAttribute("type", "button");
251
281
  DomEvent.addListener(this._el.button_fullscreen, "click", this._onButtonFullscreen, this);
252
282
  if (this.options.fullscreen === false) {
253
283
  this._el.button_fullscreen.style.display = "none";
254
284
  }
255
285
 
256
286
  this._el.button_collapse_toggle = Dom.create(
257
- "span",
287
+ "button",
258
288
  "vco-menubar-button",
259
289
  this._el.container,
260
290
  );
291
+ this._el.button_collapse_toggle.setAttribute("type", "button");
261
292
  DomEvent.addListener(
262
293
  this._el.button_collapse_toggle,
263
294
  "click",
@@ -292,15 +323,16 @@ class MenuBarBase {
292
323
  this._el.button_fullscreen.innerHTML = "<span class='vco-icon-resize-full'></span>";
293
324
  this._el.container.setAttribute("ontouchstart", " ");
294
325
  } else {
295
- this._el.button_backtostart.innerHTML =
296
- Language.buttons.backtostart + " <span class='vco-icon-goback'></span>";
297
- this._el.button_collapse_toggle.innerHTML =
298
- Language.buttons.collapse_toggle + "<span class='vco-icon-arrow-up'></span>";
326
+ this._renderBackToStartLabel();
327
+ this._renderCollapseLabel(this.collapsed);
299
328
  this._el.button_fullscreen.innerHTML =
300
329
  Language.buttons.fullscreen + " <span class='vco-icon-resize-full'></span>";
301
330
  }
302
331
 
303
- if (this.options.layout === "landscape") {
332
+ if (this.options.layout === "landscape" || this.options.map_type === "none") {
333
+ // Landscape has no map split to collapse; a mapless story has no
334
+ // map at all, so the toggle would flip its label while nothing
335
+ // on screen changes.
304
336
  this._el.button_collapse_toggle.style.display = "none";
305
337
  }
306
338
  }
@@ -314,6 +346,27 @@ class MenuBarBase {
314
346
  this.options.height = height;
315
347
  }
316
348
  }
349
+
350
+ /**
351
+ * Release the button listeners, the progress animation and the element.
352
+ * Called by `StoryMap.dispose()`; the menubar must not be used afterwards.
353
+ */
354
+ dispose(): void {
355
+ const buttons: [string, EventListener][] = [
356
+ ["button_overview", this._onButtonOverview as EventListener],
357
+ ["button_backtostart", this._onButtonBackToStart as EventListener],
358
+ ["button_fullscreen", this._onButtonFullscreen as EventListener],
359
+ ["button_collapse_toggle", this._onButtonCollapseMap as EventListener],
360
+ ];
361
+ for (const [key, handler] of buttons) {
362
+ const el = this._el[key];
363
+ if (el) {
364
+ DomEvent.removeListener(el, "click", handler, this);
365
+ }
366
+ }
367
+ this._el.container?.getAnimations?.().forEach((a) => a.cancel());
368
+ this._el.container?.remove();
369
+ }
317
370
  }
318
371
 
319
372
  export default class MenuBar extends DomMixed(Evented(MenuBarBase)) {
package/src/ui/Message.ts CHANGED
@@ -109,6 +109,15 @@ class MessageBase {
109
109
  _initEvents() {
110
110
  DomEvent.addListener(this._el.container, "click", this._onMouseClick, this);
111
111
  }
112
+
113
+ /**
114
+ * Release the click listener and drop the element. Called by
115
+ * `StorySlider.dispose()`; the message must not be used afterwards.
116
+ */
117
+ dispose() {
118
+ DomEvent.removeListener(this._el.container, "click", this._onMouseClick, this);
119
+ this._el.container.remove();
120
+ }
112
121
  }
113
122
 
114
123
  export default class Message extends DomMixed(Evented(MessageBase)) {
@@ -1,4 +1,4 @@
1
- import Animate from "morpheus";
1
+ import Animate from "../animation/tween";
2
2
  import { easeInOutQuint, easeOutStrong } from "../animation/easings";
3
3
  import { Browser } from "../core/Browser";
4
4
  import { Evented, type EventedInstance } from "../core/mixins";
@@ -7,13 +7,28 @@ import { DomEvent, type LegacyEvent } from "../dom/DomEvent";
7
7
  import type { AnimateOptions, AnimationHandle } from "../types";
8
8
 
9
9
  /* Swipable
10
- Draggable allows you to add dragging capabilities to any element. Supports mobile devices too.
11
- TODO Enable constraints
10
+ Adds drag/swipe capabilities to an element, with momentum on release.
12
11
  ================================================== */
13
12
 
13
+ /**
14
+ * Clamp `value` into `[min, max]`. Either bound may be `false` (unset) or a
15
+ * number; `0` is a real bound, so this tests for a number rather than
16
+ * truthiness.
17
+ */
18
+ function clampAxis(value: number, min: number | boolean, max: number | boolean): number {
19
+ if (typeof max === "number" && value > max) {
20
+ return max;
21
+ }
22
+ if (typeof min === "number" && value < min) {
23
+ return min;
24
+ }
25
+ return value;
26
+ }
27
+
14
28
  interface DragEventNames {
15
29
  down: string;
16
30
  up: string;
31
+ cancel?: string;
17
32
  leave: string;
18
33
  move: string;
19
34
  }
@@ -70,6 +85,7 @@ class SwipableBase {
70
85
  this.touchdrag = {
71
86
  down: "touchstart",
72
87
  up: "touchend",
88
+ cancel: "touchcancel",
73
89
  leave: "mouseleave",
74
90
  move: "touchmove",
75
91
  };
@@ -148,7 +164,16 @@ class SwipableBase {
148
164
  enable(e?: LegacyEvent): void {
149
165
  DomEvent.addListener(this._el.drag, this.dragevent.down, this._onDragStart, this);
150
166
  DomEvent.addListener(this._el.drag, this.dragevent.up, this._onDragEnd, this);
151
- this.data.pos.start = 0 as unknown as { x: number; y: number }; //VCO.Dom.getPosition(this._el.move);
167
+ // iOS fires touchcancel when the browser claims the gesture (page
168
+ // scroll): without it, touchend never runs and the move/leave
169
+ // listeners registered in _onDragStart leak on every cancelled touch
170
+ if (this.dragevent === this.touchdrag && this.touchdrag.cancel) {
171
+ DomEvent.addListener(this._el.drag, this.touchdrag.cancel, this._onDragEnd, this);
172
+ }
173
+ // reset the dragged element to its origin. `pos.start` used to be
174
+ // assigned the *number* 0 and then read as `pos.start.x`, which is
175
+ // undefined — so this wrote `left: "undefinedpx"`.
176
+ this.data.pos.start = { x: 0, y: 0 };
152
177
  this._el.move.style.left = this.data.pos.start.x + "px";
153
178
  this._el.move.style.top = this.data.pos.start.y + "px";
154
179
  this._el.move.style.position = "absolute";
@@ -159,6 +184,21 @@ class SwipableBase {
159
184
  disable() {
160
185
  DomEvent.removeListener(this._el.drag, this.dragevent.down, this._onDragStart, this);
161
186
  DomEvent.removeListener(this._el.drag, this.dragevent.up, this._onDragEnd, this);
187
+ if (this.dragevent === this.touchdrag && this.touchdrag.cancel) {
188
+ DomEvent.removeListener(this._el.drag, this.touchdrag.cancel, this._onDragEnd, this);
189
+ }
190
+ }
191
+
192
+ /**
193
+ * Full teardown for `dispose()`: `disable()` only covers the listeners
194
+ * `enable()` adds, but a gesture in flight also holds the `move`/`leave`
195
+ * pair plus the momentum animation.
196
+ */
197
+ dispose() {
198
+ this.stopMomentum();
199
+ this.disable();
200
+ DomEvent.removeListener(this._el.drag, this.dragevent.move, this._onDragMove, this);
201
+ DomEvent.removeListener(this._el.drag, this.dragevent.leave, this._onDragEnd, this);
162
202
  }
163
203
 
164
204
  stopMomentum() {
@@ -175,21 +215,29 @@ class SwipableBase {
175
215
  /* Private Methods
176
216
  ================================================== */
177
217
  _onDragStart(e: LegacyEvent) {
218
+ // an in-flight momentum animation must not fight the new gesture
178
219
  if (this.animator) {
179
220
  this.animator.stop();
180
221
  }
222
+ // guard against duplicate move/leave listeners when a previous
223
+ // gesture never ended (e.g. a touchcancel before the fix) — an
224
+ // in-flight gesture is restarted from the new touch position
225
+ if (this.data.sliding) {
226
+ this._detachGestureListeners();
227
+ }
181
228
  if (Browser.touch) {
182
- if (e.originalEvent) {
183
- this.data.pagex.start = e.originalEvent.touches[0].screenX;
184
- this.data.pagey.start = e.originalEvent.touches[0].screenY;
185
- } else {
186
- this.data.pagex.start = e.targetTouches[0].screenX;
187
- this.data.pagey.start = e.targetTouches[0].screenY;
188
- }
229
+ const touch = e.originalEvent
230
+ ? e.originalEvent.touches[0]
231
+ : e.targetTouches
232
+ ? e.targetTouches[0]
233
+ : null;
234
+ this.data.pagex.start = touch ? touch.clientX : (e.pageX ?? 0);
235
+ this.data.pagey.start = touch ? touch.clientY : (e.pageY ?? 0);
189
236
  } else {
190
- this.data.pagex.start = e.pageX;
191
- this.data.pagey.start = e.pageY;
237
+ this.data.pagex.start = e.pageX ?? 0;
238
+ this.data.pagey.start = e.pageY ?? 0;
192
239
  }
240
+ this.data.sliding = true;
193
241
  // Center element to finger or mouse
194
242
  if (this.options.enable.x) {
195
243
  //this._el.move.style.left = this.data.pagex.start - (this._el.move.offsetWidth / 2) + "px";
@@ -200,18 +248,44 @@ class SwipableBase {
200
248
  this.data.pos.start = { x: this._el.move.offsetLeft, y: this._el.move.offsetTop };
201
249
  this.data.time.start = Date.now();
202
250
  this.fire("dragstart", this.data);
203
- DomEvent.addListener(this._el.drag, this.dragevent.move, this._onDragMove, this);
204
- DomEvent.addListener(this._el.drag, this.dragevent.leave, this._onDragEnd, this);
251
+ this._attachGestureListeners();
205
252
  }
206
253
 
207
254
  _onDragEnd(e: LegacyEvent) {
255
+ // touchcancel/touchend may arrive without a move, or twice (touchend
256
+ // after touchcancel): record the position and finish exactly once
257
+ const was_sliding = this.data.sliding;
258
+ if (Browser.touch && was_sliding) {
259
+ const touch = e.originalEvent
260
+ ? (e.originalEvent.changedTouches[0] ?? e.originalEvent.touches[0])
261
+ : null;
262
+ if (touch) {
263
+ this.data.pagex.end = touch.clientX;
264
+ this.data.pagey.end = touch.clientY;
265
+ }
266
+ } else if (!Browser.touch && was_sliding) {
267
+ this.data.pagex.end = e.pageX ?? this.data.pagex.end;
268
+ this.data.pagey.end = e.pageY ?? this.data.pagey.end;
269
+ }
208
270
  this.data.sliding = false;
209
- DomEvent.removeListener(this._el.drag, this.dragevent.move, this._onDragMove, this);
210
- DomEvent.removeListener(this._el.drag, this.dragevent.leave, this._onDragEnd, this);
271
+ this._detachGestureListeners();
272
+ if (!was_sliding) {
273
+ return;
274
+ }
211
275
  this.fire("dragend", this.data);
212
276
  this._momentum();
213
277
  }
214
278
 
279
+ _attachGestureListeners(): void {
280
+ DomEvent.addListener(this._el.drag, this.dragevent.move, this._onDragMove, this);
281
+ DomEvent.addListener(this._el.drag, this.dragevent.leave, this._onDragEnd, this);
282
+ }
283
+
284
+ _detachGestureListeners(): void {
285
+ DomEvent.removeListener(this._el.drag, this.dragevent.move, this._onDragMove, this);
286
+ DomEvent.removeListener(this._el.drag, this.dragevent.leave, this._onDragEnd, this);
287
+ }
288
+
215
289
  _onDragMove(e: LegacyEvent) {
216
290
  const change = {
217
291
  x: 0,
@@ -220,22 +294,25 @@ class SwipableBase {
220
294
  //e.preventDefault();
221
295
  this.data.sliding = true;
222
296
  if (Browser.touch) {
223
- if (e.originalEvent) {
224
- this.data.pagex.end = e.originalEvent.touches[0].screenX;
225
- this.data.pagey.end = e.originalEvent.touches[0].screenY;
226
- } else {
227
- this.data.pagex.end = e.targetTouches[0].screenX;
228
- this.data.pagey.end = e.targetTouches[0].screenY;
229
- }
297
+ const touch = e.originalEvent
298
+ ? e.originalEvent.touches[0]
299
+ : e.targetTouches
300
+ ? e.targetTouches[0]
301
+ : null;
302
+ this.data.pagex.end = touch ? touch.clientX : (e.pageX ?? this.data.pagex.end);
303
+ this.data.pagey.end = touch ? touch.clientY : (e.pageY ?? this.data.pagey.end);
230
304
  } else {
231
- this.data.pagex.end = e.pageX;
232
- this.data.pagey.end = e.pageY;
305
+ this.data.pagex.end = e.pageX ?? this.data.pagex.end;
306
+ this.data.pagey.end = e.pageY ?? this.data.pagey.end;
233
307
  }
234
- change.x = this.data.pagex.start - this.data.pagex.end;
235
- change.y = this.data.pagey.start - this.data.pagey.end;
236
- this.data.pos.end = { x: this._el.drag.offsetLeft, y: this._el.drag.offsetTop };
237
- this.data.new_pos.x = -(change.x - this.data.pos.start.x);
238
- this.data.new_pos.y = -(change.y - this.data.pos.start.y);
308
+ // signed gesture deltas: direction must follow the movement, not the
309
+ // absolute screen position (|end| - |start| misread rightward swipes
310
+ // that stay on the left half of the screen as "left")
311
+ change.x = this.data.pagex.end - this.data.pagex.start;
312
+ change.y = this.data.pagey.end - this.data.pagey.start;
313
+ this.data.pos.end = { x: this.data.pos.start.x, y: this.data.pos.start.y };
314
+ this.data.new_pos.x = this.data.pos.start.x - change.x;
315
+ this.data.new_pos.y = this.data.pos.start.y - change.y;
239
316
  if (this.options.enable.x && Math.abs(change.x) > Math.abs(change.y)) {
240
317
  e.preventDefault();
241
318
  this._el.move.style.left = this.data.new_pos.x + "px";
@@ -263,29 +340,22 @@ class SwipableBase {
263
340
  y: false,
264
341
  };
265
342
  let swipe = false;
266
- const _swipe_direction = "";
267
343
  this.data.direction = null;
268
- pos_adjust.time = (Date.now() - this.data.time.start) * 10;
269
- pos_change.time = (Date.now() - this.data.time.start) * 10;
344
+ // signed travel distance of the gesture (px), scaled by speed
270
345
  pos_change.x =
271
- this.options.momentum_multiplier *
272
- (Math.abs(this.data.pagex.end) - Math.abs(this.data.pagex.start));
346
+ this.options.momentum_multiplier * (this.data.pagex.end - this.data.pagex.start);
273
347
  pos_change.y =
274
- this.options.momentum_multiplier *
275
- (Math.abs(this.data.pagey.end) - Math.abs(this.data.pagey.start));
276
- pos_adjust.x = Math.round(pos_change.x / pos_change.time);
277
- pos_adjust.y = Math.round(pos_change.y / pos_change.time);
278
- this.data.new_pos.x = this.data.pos.end.x + pos_adjust.x;
279
- this.data.new_pos.y = this.data.pos.end.y + pos_adjust.y;
348
+ this.options.momentum_multiplier * (this.data.pagey.end - this.data.pagey.start);
349
+ pos_change.time = (Date.now() - this.data.time.start) * 10;
350
+ pos_adjust.x = Math.round(pos_change.x / Math.max(pos_change.time, 1));
351
+ pos_adjust.y = Math.round(pos_change.y / Math.max(pos_change.time, 1));
352
+ this.data.new_pos.x = this.data.pos.start.x + pos_adjust.x;
353
+ this.data.new_pos.y = this.data.pos.start.y + pos_adjust.y;
280
354
  if (!this.options.enable.x) {
281
355
  this.data.new_pos.x = this.data.pos.start.x;
282
- } else if (this.data.new_pos.x > 0) {
283
- this.data.new_pos.x = 0;
284
356
  }
285
357
  if (!this.options.enable.y) {
286
358
  this.data.new_pos.y = this.data.pos.start.y;
287
- } else if (this.data.new_pos.y < 0) {
288
- this.data.new_pos.y = 0;
289
359
  }
290
360
  // Detect Swipe
291
361
  if (pos_change.time < 2000) {
@@ -309,26 +379,29 @@ class SwipableBase {
309
379
  // Detect Direction and long swipe
310
380
  if (swipe_detect.x) {
311
381
  // Long Swipe
312
- if (Math.abs(pos_change.x) > this._el.drag.offsetWidth / 2) {
382
+ if (
383
+ Math.abs(this.data.pagex.end - this.data.pagex.start) >
384
+ this._el.drag.offsetWidth / 2
385
+ ) {
313
386
  swipe = true;
314
387
  }
315
388
  if (Math.abs(pos_change.x) > 10000) {
316
- this.data.direction = "left";
317
- if (pos_change.x > 0) {
318
- this.data.direction = "right";
319
- }
389
+ // leftward finger travel (end < start) pulls the next slide
390
+ // into view → "left"; rightward travel goes back → "right"
391
+ this.data.direction =
392
+ this.data.pagex.end < this.data.pagex.start ? "left" : "right";
320
393
  }
321
394
  }
322
395
  if (swipe_detect.y) {
323
396
  // Long Swipe
324
- if (Math.abs(pos_change.y) > this._el.drag.offsetHeight / 2) {
397
+ if (
398
+ Math.abs(this.data.pagey.end - this.data.pagey.start) >
399
+ this._el.drag.offsetHeight / 2
400
+ ) {
325
401
  swipe = true;
326
402
  }
327
403
  if (Math.abs(pos_change.y) > 10000) {
328
- this.data.direction = "up";
329
- if (pos_change.y > 0) {
330
- this.data.direction = "down";
331
- }
404
+ this.data.direction = this.data.pagey.end < this.data.pagey.start ? "up" : "down";
332
405
  }
333
406
  }
334
407
  this._animateMomentum();
@@ -337,7 +410,7 @@ class SwipableBase {
337
410
  } else if (this.data.direction) {
338
411
  this.fire("swipe_nodirection", this.data);
339
412
  } else if (this.options.snap) {
340
- this.animator.stop();
413
+ this.animator?.stop();
341
414
  this.animator = Animate(this._el.move, {
342
415
  top: this.data.pos.start.y,
343
416
  left: this.data.pos.start.x,
@@ -349,31 +422,25 @@ class SwipableBase {
349
422
 
350
423
  _animateMomentum() {
351
424
  const pos = {
352
- x: this.data.new_pos.x,
353
- y: this.data.new_pos.y,
354
- },
355
- animate: AnimateOptions = {
356
- duration: this.options.duration,
357
- easing: easeOutStrong,
358
- };
425
+ x: this.data.new_pos.x,
426
+ y: this.data.new_pos.y,
427
+ };
428
+ const animate: AnimateOptions = {
429
+ duration: this.options.duration,
430
+ easing: easeOutStrong,
431
+ };
432
+ // Clamp the resting position into the configured range. Each bound is
433
+ // optional and defaults to `false`, so test for a number rather than
434
+ // truthiness (0 is a meaningful bound). The x pair was inverted —
435
+ // `left` was treated as the maximum and `right` as the minimum — so a
436
+ // real horizontal constraint snapped every momentum animation to the
437
+ // left edge.
359
438
  if (this.options.enable.y) {
360
- if (this.options.constraint.top || this.options.constraint.bottom) {
361
- if (pos.y > (this.options.constraint.bottom as number)) {
362
- pos.y = this.options.constraint.bottom as number;
363
- } else if (pos.y < (this.options.constraint.top as number)) {
364
- pos.y = this.options.constraint.top as number;
365
- }
366
- }
439
+ pos.y = clampAxis(pos.y, this.options.constraint.top, this.options.constraint.bottom);
367
440
  animate.top = Math.floor(pos.y) + "px";
368
441
  }
369
442
  if (this.options.enable.x) {
370
- if (this.options.constraint.left || this.options.constraint.right) {
371
- if (pos.x >= (this.options.constraint.left as number)) {
372
- pos.x = this.options.constraint.left as number;
373
- } else if (pos.x < (this.options.constraint.right as number)) {
374
- pos.x = this.options.constraint.right as number;
375
- }
376
- }
443
+ pos.x = clampAxis(pos.x, this.options.constraint.left, this.options.constraint.right);
377
444
  animate.left = Math.floor(pos.x) + "px";
378
445
  }
379
446
  this.animator = Animate(this._el.move, animate);
@@ -1 +0,0 @@
1
- import{t as e}from"./main-Y-MYUSJ4.js";import"./modulepreload-polyfill-P2Xu9kJm.js";function t(e){document.title=`StoryMapJS: `+e.title}window.storymap=new e(`storymap-embed`,`./demo.json`,{},{title:t});
@@ -1 +0,0 @@
1
- import{t as e}from"./main-Y-MYUSJ4.js";import"./modulepreload-polyfill-P2Xu9kJm.js";window.__smErrors=[],window.__smReady=!1,window.addEventListener(`error`,e=>{window.__smErrors.push(String(e.message||e))});var t=new URLSearchParams(window.location.search),n=t.get(`manifest`),r=t.get(`url`),i=n===null?t.get(`example`):n,a=n===null?`/examples/`:`/examples-iiif/`,o={};if(t.get(`options`))try{o=JSON.parse(t.get(`options`))}catch(e){window.__smErrors.push(`harness: bad options param: `+e)}var s=r??a+i+`.json`;fetch(s).then(e=>e.json()).then(t=>{window.__sm=new e(`storymap-embed`,t,o,{}),window.__smReady=!0}).catch(e=>{window.__smErrors.push(`harness: `+(e&&e.message?e.message:String(e))),window.__smReady=!0});
@@ -1 +0,0 @@
1
- import"./modulepreload-polyfill-P2Xu9kJm.js";var e=[{id:`katrina`,title:`Hurricane Katrina`,kind:`Map`},{id:`population`,title:`US Population Shifts`,kind:`Map`},{id:`marktwain`,title:`Mark Twain's Travels`,kind:`Map`},{id:`seurat`,title:`A Sunday on La Grande Jatte`,kind:`Gigapixel`},{id:`iiif-wellcome`,title:`Wellcome Collection (IIIF)`,kind:`IIIF`},{id:`president`,title:`A Month in the Life of President Obama`,kind:`Map`},{url:`https://s3.amazonaws.com/uploads.knightlab.com/storymapjs/a1a349b51799ee49e96bed10cc235e7f/garden-of-earthly-delights/published.json`,thumb:`bosch-garden`,title:`The Garden of Earthly Delights – Hieronymus Bosch`,kind:`Knight Lab example`},{url:`https://uploads.knightlab.com/storymapjs/3df56e350378e51781746bfb2a2ea428/test/published.json`,thumb:`southern-literary-trail`,title:`Southern Literary Trail`,kind:`Georgia Humanities`}];function t(e){let t=e.url??`examples/`+e.id+`.json`,n=e.thumb??e.id??``,r=document.createElement(`a`);r.className=`card`,r.href=`./embed/index.html?url=${encodeURIComponent(t)}`;let i=document.createElement(`span`);i.className=`header-image`;let a=document.createElement(`span`);a.className=`header-image-background bw`,a.style.backgroundImage=`url('./thumbs/${n}.jpg'), linear-gradient(135deg, #b8b8b8, #646464)`,a.setAttribute(`role`,`img`),a.setAttribute(`aria-label`,e.title),i.append(a);let o=document.createElement(`article`);o.className=`card-content`;let s=document.createElement(`h3`);s.textContent=e.title,o.append(s);let c=document.createElement(`footer`);return c.textContent=e.kind,r.append(i,o,c),r}var n=document.getElementById(`examples-cards`);if(n){n.classList.add(`cards-link`);for(let r of e)n.append(t(r))}var r=document.getElementById(`demo-frame`);if(r){let e=()=>{r.style.height=window.innerHeight-20+`px`};e(),window.addEventListener(`resize`,e)}