@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
@@ -56,6 +56,14 @@
56
56
  // font-weight:normal;
57
57
  }
58
58
  }
59
+
60
+ // Inline images embedded in slide text HTML (e.g. sketches, maps):
61
+ // constrain to the text column, keep aspect ratio with explicit
62
+ // width/height attributes
63
+ img {
64
+ max-width: 100%;
65
+ height: auto;
66
+ }
59
67
  }
60
68
 
61
69
  // When the background is an image
@@ -44,7 +44,8 @@
44
44
  padding: 20px;
45
45
 
46
46
  @include background-color-opacity(0, 0, 0, 60);
47
- @include border-radius(7px);
47
+
48
+ border-radius: 7px;
48
49
 
49
50
  h4 a {
50
51
  @include slide-text-shadow;
@@ -61,8 +61,7 @@
61
61
  z-index: -1;
62
62
  overflow: hidden;
63
63
  display: none;
64
-
65
- @include opacity(50);
64
+ opacity: 0.5;
66
65
  }
67
66
 
68
67
  .vco-slide-scrollable-container {
@@ -348,6 +347,16 @@
348
347
  text-align: right;
349
348
  }
350
349
 
350
+ /* Extra iframe media in slide text (issue #358)
351
+ ================================================== */
352
+ .vco-text-content {
353
+ iframe {
354
+ width: 100%;
355
+ min-height: 280px;
356
+ border: 0;
357
+ }
358
+ }
359
+
351
360
  /* Text Background
352
361
  ================================================== */
353
362
  .vco-slide.vco-text-background {
@@ -356,7 +365,8 @@
356
365
  padding: 20px;
357
366
 
358
367
  @include background-color-opacity(0, 0, 0, 60);
359
- @include border-radius(7px);
368
+
369
+ border-radius: 7px;
360
370
 
361
371
  h2 {
362
372
  margin-top: 5px;
@@ -29,8 +29,7 @@
29
29
  word-break: break-all;
30
30
  overflow-wrap: anywhere;
31
31
  hyphens: auto;
32
-
33
- @include opacity(15);
32
+ opacity: 0.15;
34
33
  }
35
34
 
36
35
  .vco-slidenav-title {
@@ -93,7 +92,7 @@
93
92
  &:hover {
94
93
  .vco-slidenav-title,
95
94
  .vco-slidenav-description {
96
- @include opacity(100);
95
+ opacity: 1;
97
96
  }
98
97
  }
99
98
  }
@@ -149,8 +148,7 @@
149
148
  &:hover {
150
149
  .vco-slidenav-icon {
151
150
  margin-left: 32 - 20px;
152
-
153
- @include opacity(100);
151
+ opacity: 1;
154
152
  }
155
153
  }
156
154
  }
@@ -159,8 +157,7 @@
159
157
  &:hover {
160
158
  .vco-slidenav-icon {
161
159
  margin-left: -4px;
162
-
163
- @include opacity(100);
160
+ opacity: 1;
164
161
  }
165
162
  }
166
163
  }
@@ -194,7 +191,7 @@
194
191
  }
195
192
 
196
193
  .vco-slidenav-icon {
197
- @include opacity(33);
194
+ opacity: 0.33;
198
195
  }
199
196
  }
200
197
  }
@@ -208,16 +205,14 @@
208
205
 
209
206
  .vco-slidenav-icon {
210
207
  margin-left: 32 - 24px;
211
-
212
- @include opacity(100);
208
+ opacity: 1;
213
209
  }
214
210
  }
215
211
 
216
212
  &:active {
217
213
  .vco-slidenav-icon {
218
214
  margin-left: 0;
219
-
220
- @include opacity(100);
215
+ opacity: 1;
221
216
  }
222
217
  }
223
218
  }
@@ -227,14 +222,13 @@
227
222
  .vco-slidenav-icon {
228
223
  // margin-left: 0px;
229
224
  margin-left: 100 - 20px;
230
-
231
- @include opacity(100);
225
+ opacity: 1;
232
226
  }
233
227
  }
234
228
 
235
229
  &:active {
236
230
  .vco-slidenav-icon {
237
- @include opacity(100);
231
+ opacity: 1;
238
232
  }
239
233
  }
240
234
  }
@@ -247,13 +241,13 @@
247
241
  .vco-slidenav-previous {
248
242
  &:hover {
249
243
  .vco-slidenav-icon {
250
- @include opacity(33);
244
+ opacity: 0.33;
251
245
  }
252
246
  }
253
247
 
254
248
  &:active {
255
249
  .vco-slidenav-icon {
256
- @include opacity(100);
250
+ opacity: 1;
257
251
  }
258
252
  }
259
253
  }
@@ -10,8 +10,10 @@
10
10
  height: 100%;
11
11
  overflow: hidden;
12
12
 
13
- @include user-select(none);
14
-
13
+ // horizontal drags belong to the slider; vertical panning passes
14
+ // through to the page (mobile navigation, #288)
15
+ touch-action: pan-y;
16
+ user-select: none;
15
17
  position: relative;
16
18
 
17
19
  img,
@@ -75,3 +75,47 @@
75
75
  font-size: $base-font-size;
76
76
  text-align: center;
77
77
  }
78
+
79
+ /* Start-of-story consent: allow all / individually / decline all
80
+ ================================================= */
81
+ .vco-consent-start {
82
+ .vco-consent-services {
83
+ display: flex;
84
+ flex-direction: column;
85
+ gap: 6px;
86
+ max-width: 420px;
87
+ width: 100%;
88
+ margin-top: 6px;
89
+ }
90
+
91
+ .vco-consent-service {
92
+ display: flex;
93
+ align-items: center;
94
+ justify-content: space-between;
95
+ gap: 12px;
96
+ padding: 4px 0;
97
+ border-bottom: 1px solid rgb(0 0 0 / 10%);
98
+
99
+ &:last-child {
100
+ border-bottom: none;
101
+ }
102
+ }
103
+
104
+ .vco-consent-service-label {
105
+ color: $color-dark;
106
+ text-align: left;
107
+ }
108
+
109
+ .vco-consent-buttons {
110
+ margin-top: 0;
111
+
112
+ button:disabled {
113
+ opacity: 0.5;
114
+ cursor: default;
115
+ }
116
+ }
117
+
118
+ .vco-consent-start-actions {
119
+ margin-top: 12px;
120
+ }
121
+ }
@@ -31,6 +31,14 @@
31
31
  background: $color-theme;
32
32
  color: $color-background;
33
33
  }
34
+
35
+ // keyboard focus parity with the hover state
36
+ &:focus-visible {
37
+ background: $color-theme;
38
+ color: $color-background;
39
+ outline: 2px solid $color-theme;
40
+ outline-offset: -2px;
41
+ }
34
42
  }
35
43
 
36
44
  .vco-mobile {
@@ -43,9 +43,7 @@
43
43
  height: 30px;
44
44
  background-color: #666;
45
45
  vertical-align: middle;
46
-
47
- @include box-shadow(inset 0 1px 2px rgba(255, 255, 255, 0.1));
48
-
46
+ box-shadow: inset 0 1px 2px rgb(255 255 255 / 10%);
49
47
  margin-left: auto;
50
48
  margin-right: auto;
51
49
 
@@ -96,8 +94,7 @@
96
94
  color: #333;
97
95
  padding: 10px;
98
96
  margin-top: 10px;
99
-
100
- @include border-radius(7px);
97
+ border-radius: 7px;
101
98
  }
102
99
  }
103
100
  }
package/src/site/site.ts CHANGED
@@ -18,7 +18,8 @@ const EXAMPLES: ExampleEntry[] = [
18
18
  { id: "katrina", title: "Hurricane Katrina", kind: "Map" },
19
19
  { id: "population", title: "US Population Shifts", kind: "Map" },
20
20
  { id: "marktwain", title: "Mark Twain's Travels", kind: "Map" },
21
- { id: "seurat", title: "A Sunday on La Grande Jatte", kind: "Gigapixel" },
21
+ // a legacy Zoomify pyramid, not IIIF — labelled accordingly
22
+ { id: "seurat", title: "A Sunday on La Grande Jatte", kind: "Large image (legacy)" },
22
23
  { id: "iiif-wellcome", title: "Wellcome Collection (IIIF)", kind: "IIIF" },
23
24
  { id: "president", title: "A Month in the Life of President Obama", kind: "Map" },
24
25
  // remote showcase examples, rendered by the embed player
@@ -4,6 +4,7 @@ import { DomEvent } from "../dom/DomEvent";
4
4
  import Dom from "../dom/Dom";
5
5
  import { easeInSpline } from "../animation/easings";
6
6
  import MediaType from "../media/MediaType";
7
+ import { sanitizeSlideText } from "../media/EmbedUtil";
7
8
  import Text from "../media/types/Text";
8
9
  import { Browser } from "../core/Browser";
9
10
  import { MediaTypeMatch, StorymapSlide, StorymapSlideBackground } from "../types";
@@ -27,6 +28,19 @@ interface SlideOptions {
27
28
  [key: string]: unknown;
28
29
  }
29
30
 
31
+ /**
32
+ * The slide's element cache. `call_to_action` is null until the slide is told
33
+ * to show one (`addCallToAction`).
34
+ */
35
+ type SlideElements = {
36
+ container: HTMLElement;
37
+ scroll_container: HTMLElement;
38
+ background: HTMLElement;
39
+ content_container: HTMLElement;
40
+ content: HTMLElement;
41
+ call_to_action: HTMLElement | null;
42
+ };
43
+
30
44
  /* Media instance surface as used by Slide; instances are created
31
45
  dynamically via the matched MediaTypeMatch.cls constructor. Media is
32
46
  Evented — "media_loaded" signals that content heights may have changed. */
@@ -35,8 +49,10 @@ interface MediaInstance {
35
49
  loadMedia: () => void;
36
50
  stopMedia: () => void;
37
51
  updateDisplay: (w?: number, h?: number, l?: string) => void;
52
+ dispose?: () => void;
38
53
  on?: EventedInstance["on"];
39
- _state?: { loaded?: boolean };
54
+ off?: EventedInstance["off"];
55
+ _state?: { loaded?: boolean; eager?: boolean };
40
56
  }
41
57
 
42
58
  interface SlideHas {
@@ -52,13 +68,17 @@ interface SlideHas {
52
68
  }
53
69
 
54
70
  class SlideBase {
55
- declare "_el": Record<string, HTMLElement>;
71
+ /** `call_to_action` is only created when the slide shows one. */
72
+ declare "_el": SlideElements;
56
73
  declare "_media": MediaInstance | null;
57
74
  declare "_mediaclass": unknown;
58
75
  declare "_text": Text;
59
76
  declare "_state": { loaded: boolean };
60
77
  declare "_scroll_hint": HTMLElement | null;
61
78
  declare "_scroll_hint_dismissed": boolean;
79
+ declare "_onSlideScrollBound": EventListener;
80
+ /** Every `media_ended` handler registered via `onMediaEnded`, kept so `dispose()` can remove them. */
81
+ declare "_media_ended_fns": (() => void)[];
62
82
  declare "has": SlideHas;
63
83
  declare "title": string;
64
84
  declare "data": StorymapSlide;
@@ -107,7 +127,7 @@ class SlideBase {
107
127
  },
108
128
  };
109
129
 
110
- this.has.title = title_slide;
130
+ this.has.title = title_slide === true;
111
131
 
112
132
  this.title = "";
113
133
 
@@ -139,7 +159,8 @@ class SlideBase {
139
159
  // Animation Object
140
160
  this.animator = {};
141
161
 
142
- // Merge Data and Options
162
+ this._onSlideScrollBound = null as unknown as EventListener;
163
+ this._media_ended_fns = [];
143
164
  mergeData(this.options, options);
144
165
  mergeData(this.data, data);
145
166
 
@@ -154,6 +175,37 @@ class SlideBase {
154
175
 
155
176
  hide() {}
156
177
 
178
+ /**
179
+ * Release the slide's listeners, media and DOM. Called by
180
+ * `StorySlider.dispose()`; the slide must not be used afterwards.
181
+ */
182
+ dispose() {
183
+ // the scroll listener was registered against a bound copy, so this
184
+ // only works because that reference was kept
185
+ if (this._onSlideScrollBound) {
186
+ this._el.container?.removeEventListener("scroll", this._onSlideScrollBound);
187
+ this._onSlideScrollBound = null as unknown as EventListener;
188
+ }
189
+ if (this._el.call_to_action) {
190
+ DomEvent.removeListener(this._el.call_to_action, "click", this._onCallToAction, this);
191
+ }
192
+ if (this._scroll_hint) {
193
+ DomEvent.removeListener(this._scroll_hint, "click", this._onScrollHintClick, this);
194
+ this._scroll_hint = null;
195
+ }
196
+ this._el.container?.getAnimations?.().forEach((a) => a.cancel());
197
+ // the media_ended handlers registered via onMediaEnded() live on the
198
+ // media object, which outlives this slide once nulled — remove them
199
+ // here or a disposed slide's advance closure fires on a later ended
200
+ for (const fn of this._media_ended_fns) {
201
+ this._media?.off?.("media_ended", fn);
202
+ }
203
+ this._media_ended_fns = [];
204
+ this._media?.dispose?.();
205
+ this._media = null;
206
+ this._el.container?.remove();
207
+ }
208
+
157
209
  setActive(is_active: boolean) {
158
210
  this.active = is_active;
159
211
 
@@ -164,7 +216,14 @@ class SlideBase {
164
216
  // the hint may re-appear on a revisit if the content still
165
217
  // overflows (the dismissed flag resets per activation)
166
218
  this._scroll_hint_dismissed = false;
219
+ // the active slide's images load eagerly: media built after this
220
+ // point (the 1200ms load timer) honors the flag, already-built
221
+ // images are upgraded below
222
+ if (this._media?._state) {
223
+ this._media._state.eager = true;
224
+ }
167
225
  this.loadMedia();
226
+ this._eagerLoadImages();
168
227
  this._updateScrollHint();
169
228
  } else {
170
229
  this.stopMedia();
@@ -183,6 +242,17 @@ class SlideBase {
183
242
  }
184
243
  }
185
244
 
245
+ /* Perf: preloaded slide images are `lazy`; make them `eager` the
246
+ moment the slide becomes active so navigation never waits on a
247
+ deferred fetch (loading starts now, not on intersection). */
248
+ _eagerLoadImages() {
249
+ this._el.container
250
+ .querySelectorAll<HTMLImageElement>("img.vco-media-image")
251
+ .forEach((img) => {
252
+ img.loading = "eager";
253
+ });
254
+ }
255
+
186
256
  stopMedia() {
187
257
  if (this._media && this._state.loaded) {
188
258
  try {
@@ -211,6 +281,28 @@ class SlideBase {
211
281
  return this.has.background;
212
282
  }
213
283
 
284
+ /**
285
+ * True when this slide's media is a timed, playable one (audio or video).
286
+ * `autoplay_media` waits for such a slide's media to end instead of using
287
+ * its timer; everything else keeps the timer.
288
+ */
289
+ hasPlayableMedia(): boolean {
290
+ const kind = this.options.media_type as string | undefined;
291
+ return kind === "audio" || kind === "video";
292
+ }
293
+
294
+ /**
295
+ * Call `fn` when this slide's media finishes playing. A slide with no
296
+ * media — or media that cannot end — never calls it, which is why
297
+ * `autoplay_media` keeps its timer as a fallback rather than waiting on
298
+ * an event that may not arrive.
299
+ */
300
+ onMediaEnded(fn: () => void): void {
301
+ if (!this.hasPlayableMedia() || !this._media?.on) return;
302
+ this._media.on("media_ended", fn);
303
+ this._media_ended_fns.push(fn);
304
+ }
305
+
214
306
  scrollToTop() {
215
307
  this._el.container.scrollTop = 0;
216
308
  }
@@ -235,11 +327,7 @@ class SlideBase {
235
327
  return;
236
328
  }
237
329
  if (!this._scroll_hint) {
238
- this._scroll_hint = Dom.create(
239
- "div",
240
- "vco-slide-scroll-hint",
241
- el,
242
- );
330
+ this._scroll_hint = Dom.create("div", "vco-slide-scroll-hint", el);
243
331
  this._scroll_hint.innerHTML = "<span class='vco-icon-arrow-down'></span>";
244
332
  DomEvent.addListener(this._scroll_hint, "click", this._onScrollHintClick, this);
245
333
  }
@@ -276,8 +364,12 @@ class SlideBase {
276
364
  "vco-slide-calltoaction",
277
365
  this._el.content_container,
278
366
  );
279
- this._el.call_to_action.innerHTML =
280
- "<span class='vco-slide-calltoaction-button-text'>" + str + "</span>";
367
+ // The text comes from `call_to_action_text` in the storymap JSON, so
368
+ // it goes through the sanitizer like every other author string
369
+ // instead of being concatenated into markup.
370
+ const button_text = Dom.create("span", "vco-slide-calltoaction-button-text");
371
+ button_text.appendChild(sanitizeSlideText(str));
372
+ this._el.call_to_action?.appendChild(button_text);
281
373
  DomEvent.addListener(this._el.call_to_action, "click", this._onCallToAction, this);
282
374
  }
283
375
 
@@ -308,8 +400,11 @@ class SlideBase {
308
400
  this._el.content = Dom.create("div", "vco-slide-content", this._el.content_container);
309
401
  this._el.background = Dom.create("div", "vco-slide-background", this._el.container);
310
402
  // first scroll of any kind hides the scroll hint (passive: the
311
- // listener never prevents default)
312
- this._el.container.addEventListener("scroll", this._onSlideScroll.bind(this), {
403
+ // listener never prevents default). The reference is kept because
404
+ // `.bind()` returns a new function each call, so the listener could
405
+ // otherwise never be removed again.
406
+ this._onSlideScrollBound = this._onSlideScroll.bind(this);
407
+ this._el.container.addEventListener("scroll", this._onSlideScrollBound, {
313
408
  passive: true,
314
409
  });
315
410
  // Style Slide Background
@@ -341,46 +436,45 @@ class SlideBase {
341
436
  if (this.data.text && this.data.text.text) {
342
437
  this.has.text = true;
343
438
  }
344
- if (this.data.text && this.data.text.headline) {
439
+ if (this.data.text?.headline) {
345
440
  this.has.headline = true;
346
441
  this.title = this.data.text.headline;
347
442
  }
348
443
 
349
444
  // Create Media
350
- if (this.has.media) {
445
+ const slide_media = this.data.media;
446
+ if (this.has.media && slide_media) {
351
447
  // Determine the media type
352
- this.data.media.mediatype = MediaType(this.data.media) as MediaTypeMatch;
353
- this.options.media_name = this.data.media.mediatype.name;
354
- this.options.media_type = this.data.media.mediatype.type;
448
+ slide_media.mediatype = MediaType(slide_media) as MediaTypeMatch;
449
+ this.options.media_name = slide_media.mediatype.name;
450
+ this.options.media_type = slide_media.mediatype.type;
355
451
 
356
452
  // Create a media object using the matched class name
357
- this._media = new this.data.media.mediatype.cls(
358
- this.data.media,
359
- this.options,
360
- ) as MediaInstance;
453
+ this._media = new slide_media.mediatype.cls(slide_media, this.options) as MediaInstance;
361
454
  // loaded media changes the content height — the scroll hint
362
455
  // may appear or disappear
363
456
  this._media.on?.("media_loaded", () => this._updateScrollHint());
364
457
  }
365
458
 
366
459
  // Create Text
367
- if (this.has.text || this.has.headline) {
460
+ if ((this.has.text || this.has.headline) && this.data.text) {
368
461
  this._text = new Text(this.data.text, {
369
462
  title: this.has.title,
370
463
  text_align: this.options.text_align as string | undefined,
371
464
  });
372
465
  }
373
466
 
374
- // Add to DOM
467
+ // Add to DOM. Each branch has just established the members it uses
468
+ // (has.media -> _media, has.text/headline -> _text).
375
469
  if (!this.has.text && !this.has.headline && this.has.media) {
376
470
  this._el.container.className += " vco-slide-media-only";
377
- this._media.addTo(this._el.content);
471
+ this._media?.addTo(this._el.content);
378
472
  } else if (this.has.headline && this.has.media && !this.has.text) {
379
473
  this._el.container.className += " vco-slide-media-only";
380
474
  this._text.addTo(this._el.content);
381
- this._media.addTo(this._el.content);
475
+ this._media?.addTo(this._el.content);
382
476
  } else if (this.has.text && this.has.media) {
383
- this._media.addTo(this._el.content);
477
+ this._media?.addTo(this._el.content);
384
478
  this._text.addTo(this._el.content);
385
479
  } else if (this.has.text || this.has.headline) {
386
480
  this._el.container.className += " vco-slide-text-only";
@@ -1,9 +1,10 @@
1
1
  import { mergeData } from "../core/Util";
2
2
  import { DomMixed, Evented, type EventedInstance } from "../core/mixins";
3
3
  import Dom from "../dom/Dom";
4
- import Animate from "morpheus";
4
+ import Animate from "../animation/tween";
5
5
  import { DomEvent } from "../dom/DomEvent";
6
6
  import { Browser } from "../core/Browser";
7
+ import { sanitizeSlideText } from "../media/EmbedUtil";
7
8
  import { AnimateOptions, AnimationHandle } from "../types";
8
9
  /* SlideNav
9
10
  Navigation for Slideshows
@@ -169,18 +170,27 @@ class SlideNavBase {
169
170
  // update data
170
171
  this.data = mergeData(this.data, d);
171
172
 
172
- // Title
173
+ // Title and date are the slide's own headline/date — sanitized like
174
+ // the slide body. They were the reachable twin of an already-sanitized
175
+ // field: a hostile headline executed as soon as a nav arrow rendered.
173
176
  if (this.data.title !== "") {
174
- this._el.title.innerHTML = this.data.title;
177
+ this._el.title.replaceChildren(sanitizeSlideText(this.data.title));
175
178
  }
176
179
 
177
180
  // Date
178
- if (this.data.date !== "") {
179
- this._el.description.innerHTML = this.data.description;
181
+ if (this.data.date) {
182
+ this._el.description.replaceChildren(sanitizeSlideText(this.data.date));
180
183
  }
181
184
  }
182
185
 
183
186
  _initLayout() {
187
+ // Accessibility (issue #385 wave): the nav container is operable by
188
+ // keyboard — focusable, announced as a button, Enter/Space activate
189
+ this._el.container.setAttribute("role", "button");
190
+ this._el.container.setAttribute("tabindex", "0");
191
+ const label = this.options.direction === "next" ? "Next slide" : "Previous slide";
192
+ this._el.container.setAttribute("aria-label", label);
193
+
184
194
  // Create Layout
185
195
  this._el.content_container = Dom.create(
186
196
  "div",
@@ -188,6 +198,7 @@ class SlideNavBase {
188
198
  this._el.container,
189
199
  );
190
200
  this._el.icon = Dom.create("div", "vco-slidenav-icon", this._el.content_container);
201
+ this._el.icon.setAttribute("aria-hidden", "true");
191
202
  this._el.title = Dom.create("div", "vco-slidenav-title", this._el.content_container);
192
203
  this._el.description = Dom.create(
193
204
  "div",
@@ -202,6 +213,29 @@ class SlideNavBase {
202
213
 
203
214
  _initEvents() {
204
215
  DomEvent.addListener(this._el.container, "click", this._onMouseClick, this);
216
+ DomEvent.addListener(this._el.container, "keydown", this._onKeyDown, this);
217
+ }
218
+
219
+ _onKeyDown(e: Event) {
220
+ const key = (e as KeyboardEvent).key;
221
+ if (key === "Enter" || key === " " || key === "Spacebar") {
222
+ e.preventDefault();
223
+ this._onMouseClick();
224
+ }
225
+ }
226
+
227
+ /**
228
+ * Release the listeners and the position animation. Called by
229
+ * `StorySlider.dispose()`; the nav must not be used afterwards.
230
+ */
231
+ dispose() {
232
+ if (this.animator_position) {
233
+ this.animator_position.stop();
234
+ this.animator_position = null;
235
+ }
236
+ DomEvent.removeListener(this._el.container, "click", this._onMouseClick, this);
237
+ DomEvent.removeListener(this._el.container, "keydown", this._onKeyDown, this);
238
+ this._el.container.remove();
205
239
  }
206
240
  }
207
241