@projektemacher/storymapjs 0.10.8 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/CHANGELOG +81 -0
  2. package/README.md +129 -12
  3. package/dist/assets/{demo-DBpeF31K.js → demo-bWnOyfUw.js} +1 -1
  4. package/dist/assets/harness-C3JUv5Ii.js +1 -0
  5. package/dist/assets/{harness-multi-CYHgI0a9.js → harness-multi-XZNex3tb.js} +1 -1
  6. package/dist/assets/{harness-support-Do7sIp2j.js → harness-support-CjfZIVeb.js} +1 -1
  7. package/dist/assets/main-DQ32hWBM.js +17 -0
  8. package/dist/context.json +13 -2
  9. package/dist/css/storymap.css +1 -1
  10. package/dist/demo.html +3 -2
  11. package/dist/docs/api/assets/navigation.js +1 -1
  12. package/dist/docs/api/assets/search.js +1 -1
  13. package/dist/docs/api/classes/StoryMap.html +777 -269
  14. package/dist/docs/api/functions/MediaType.html +1 -1
  15. package/dist/docs/api/functions/isPresentation3Collection.html +1 -1
  16. package/dist/docs/api/functions/isPresentation3Manifest.html +1 -1
  17. package/dist/docs/api/functions/isSlideshowCollection.html +51 -0
  18. package/dist/docs/api/functions/loadCSS.html +1 -1
  19. package/dist/docs/api/functions/manifestToStorymapData.html +1 -1
  20. package/dist/docs/api/functions/setLanguage.html +1 -1
  21. package/dist/docs/api/functions/slideshowToStorymapData.html +51 -0
  22. package/dist/docs/api/functions/slideshowVersion.html +48 -0
  23. package/dist/docs/api/functions/storymapToManifest.html +1 -1
  24. package/dist/docs/api/functions/validateStorymap.html +1 -1
  25. package/dist/docs/api/functions/validateStorymapAndReport.html +1 -1
  26. package/dist/docs/api/index.html +115 -12
  27. package/dist/docs/api/interfaces/AnimationHandle.html +2 -2
  28. package/dist/docs/api/interfaces/ImagereadyPayload.html +4 -4
  29. package/dist/docs/api/interfaces/LanguageEntry.html +6 -6
  30. package/dist/docs/api/interfaces/LatLngLiteral.html +4 -4
  31. package/dist/docs/api/interfaces/LoadOptions.html +2 -2
  32. package/dist/docs/api/interfaces/MapEvents.html +116 -0
  33. package/dist/docs/api/interfaces/MapMarkerEvents.html +66 -0
  34. package/dist/docs/api/interfaces/MarkerEventPayload.html +57 -0
  35. package/dist/docs/api/interfaces/MediaEvents.html +78 -0
  36. package/dist/docs/api/interfaces/MenuBarEvents.html +114 -0
  37. package/dist/docs/api/interfaces/MessageEvents.html +72 -0
  38. package/dist/docs/api/interfaces/OlLayer.html +1 -1
  39. package/dist/docs/api/interfaces/OlMap.html +1 -1
  40. package/dist/docs/api/interfaces/OlSource.html +1 -1
  41. package/dist/docs/api/interfaces/OlTileLayer.html +1 -1
  42. package/dist/docs/api/interfaces/OlVectorLayer.html +1 -1
  43. package/dist/docs/api/interfaces/OlView.html +1 -1
  44. package/dist/docs/api/interfaces/SlideBackgroundState.html +66 -0
  45. package/dist/docs/api/interfaces/SlideEvents.html +78 -0
  46. package/dist/docs/api/interfaces/SlideNavEvents.html +72 -0
  47. package/dist/docs/api/interfaces/SlideshowPlayerSettings.html +182 -0
  48. package/dist/docs/api/interfaces/SlideshowToStorymapResult.html +60 -0
  49. package/dist/docs/api/interfaces/SlideshowTranslatorOptions.html +65 -0
  50. package/dist/docs/api/interfaces/SlideshowWarning.html +72 -0
  51. package/dist/docs/api/interfaces/StoryMapEvents.html +146 -0
  52. package/dist/docs/api/interfaces/StoryMapMarker.html +763 -0
  53. package/dist/docs/api/interfaces/StorySliderEvents.html +102 -0
  54. package/dist/docs/api/interfaces/StorymapBasemap.html +69 -0
  55. package/dist/docs/api/interfaces/StorymapData.html +12 -6
  56. package/dist/docs/api/interfaces/StorymapDataWrapper.html +2 -2
  57. package/dist/docs/api/interfaces/StorymapDocument.html +2 -2
  58. package/dist/docs/api/interfaces/StorymapError.html +3 -3
  59. package/dist/docs/api/interfaces/StorymapGeoreference.html +5 -5
  60. package/dist/docs/api/interfaces/StorymapGeoreferenceBody.html +4 -4
  61. package/dist/docs/api/interfaces/StorymapGroundControlPoint.html +4 -4
  62. package/dist/docs/api/interfaces/StorymapLanguageMap.html +2 -2
  63. package/dist/docs/api/interfaces/StorymapManifest.html +12 -12
  64. package/dist/docs/api/interfaces/StorymapManifestAnnotation.html +43 -11
  65. package/dist/docs/api/interfaces/StorymapManifestBackground.html +6 -6
  66. package/dist/docs/api/interfaces/StorymapManifestCanvas.html +65 -17
  67. package/dist/docs/api/interfaces/StorymapManifestContentResource.html +8 -8
  68. package/dist/docs/api/interfaces/StorymapManifestFeatureCollection.html +4 -4
  69. package/dist/docs/api/interfaces/StorymapManifestGeoreferencing.html +7 -7
  70. package/dist/docs/api/interfaces/StorymapManifestImageService.html +4 -4
  71. package/dist/docs/api/interfaces/StorymapManifestRange.html +5 -5
  72. package/dist/docs/api/interfaces/StorymapManifestService.html +4 -4
  73. package/dist/docs/api/interfaces/StorymapManifestSpecificResource.html +4 -4
  74. package/dist/docs/api/interfaces/StorymapManifestStatement.html +3 -3
  75. package/dist/docs/api/interfaces/StorymapMapOptions.html +5 -5
  76. package/dist/docs/api/interfaces/StorymapOptions.html +277 -75
  77. package/dist/docs/api/interfaces/StorymapOverlayLayer.html +42 -11
  78. package/dist/docs/api/interfaces/StorymapSlide.html +70 -16
  79. package/dist/docs/api/interfaces/StorymapSlideBackground.html +4 -4
  80. package/dist/docs/api/interfaces/StorymapSlideLocation.html +58 -14
  81. package/dist/docs/api/interfaces/StorymapSlideMarker.html +8 -9
  82. package/dist/docs/api/interfaces/StorymapSlideMedia.html +49 -10
  83. package/dist/docs/api/interfaces/StorymapSlideNarration.html +61 -9
  84. package/dist/docs/api/interfaces/StorymapSlideText.html +4 -4
  85. package/dist/docs/api/interfaces/StorymapTilejson.html +8 -8
  86. package/dist/docs/api/interfaces/SwipableEvents.html +102 -0
  87. package/dist/docs/api/interfaces/TextEvents.html +66 -0
  88. package/dist/docs/api/media/events.md +66 -0
  89. package/dist/docs/api/media/migration-from-knightlab.md +89 -49
  90. package/dist/docs/api/media/slideshow.md +109 -0
  91. package/dist/docs/api/media/storymap-as-iiif-manifest.md +1007 -0
  92. package/dist/docs/api/modules.html +6 -6
  93. package/dist/docs/api/types/ContentState.html +3 -3
  94. package/dist/docs/api/types/FiredEvent.html +43 -0
  95. package/dist/docs/api/types/ImagereadyKind.html +1 -1
  96. package/dist/docs/api/types/MediaTypeMatch.html +5 -5
  97. package/dist/docs/api/types/SwipeDirection.html +36 -0
  98. package/dist/docs/api/types/TileSourceFactory.html +1 -1
  99. package/dist/docs/authoring.html +20 -7
  100. package/dist/docs/events.html +263 -0
  101. package/dist/docs/iiif.html +136 -22
  102. package/dist/docs/migration.html +66 -19
  103. package/dist/docs/readme.html +113 -12
  104. package/dist/embed/index.html +7 -0
  105. package/dist/examples/font-css-false.json +33 -0
  106. package/dist/examples/issue-image-region.json +1 -1
  107. package/dist/examples/layers-control.json +60 -0
  108. package/dist/examples/map-template-provider.json +36 -0
  109. package/dist/examples/multi-media.json +71 -0
  110. package/dist/examples-iiif/annotated-image.json +16 -0
  111. package/dist/examples-iiif/font-css-false.json +114 -0
  112. package/dist/examples-iiif/issue-image-region.json +1 -1
  113. package/dist/examples-iiif/layers-control.json +226 -0
  114. package/dist/examples-iiif/map-template-provider.json +133 -0
  115. package/dist/examples-iiif/multi-media.json +237 -0
  116. package/dist/examples-slideshow/single.json +79 -0
  117. package/dist/examples-slideshow/static/pixel.png +0 -0
  118. package/dist/examples-slideshow/static.json +44 -0
  119. package/dist/harness-multi.html +3 -3
  120. package/dist/harness.html +4 -3
  121. package/dist/index.html +3 -2
  122. package/dist/js/storymap.d.ts +1326 -289
  123. package/dist/js/storymap.js +6690 -4784
  124. package/dist/js/storymap.js.map +1 -1
  125. package/dist/navplace-properties.json +14 -0
  126. package/dist/site.css +54 -36
  127. package/docs/migration-from-knightlab.md +89 -49
  128. package/docs/storymap-as-iiif-manifest.md +199 -126
  129. package/package.json +4 -2
  130. package/schema/storymap.schema.json +334 -34
  131. package/src/core/Util.ts +3 -1
  132. package/src/core/mixins.ts +42 -28
  133. package/src/language/Language.ts +7 -0
  134. package/src/language/locale/.expected-gaps.json +287 -27
  135. package/src/language/locale/de.json +11 -1
  136. package/src/language/locale/en.json +11 -1
  137. package/src/main.ts +51 -0
  138. package/src/map/Map.ts +44 -6
  139. package/src/map/MapMarker.ts +16 -3
  140. package/src/map/openlayers/Map.OpenLayers.ts +787 -62
  141. package/src/map/openlayers/MapMarker.OpenLayers.ts +113 -13
  142. package/src/map/slideView.ts +149 -0
  143. package/src/map/types.ts +2 -0
  144. package/src/media/EmbedUtil.ts +27 -2
  145. package/src/media/Media.ts +27 -4
  146. package/src/media/embedId.ts +6 -0
  147. package/src/media/types/Flickr.ts +14 -3
  148. package/src/media/types/HtmlMedia.ts +66 -0
  149. package/src/media/types/Image.ts +15 -3
  150. package/src/media/types/SoundCloud.ts +1 -1
  151. package/src/media/types/Text.ts +27 -8
  152. package/src/media/types/Twitter.ts +9 -7
  153. package/src/media/types/Vimeo.ts +1 -1
  154. package/src/media/types/YouTube.ts +2 -2
  155. package/src/scss/Typography.scss +15 -15
  156. package/src/scss/VCO.StoryMap.scss +173 -8
  157. package/src/scss/core/Reset.scss +5 -18
  158. package/src/scss/map/VCO.Map.scss +1 -1
  159. package/src/scss/map/VCO.MapMarker.scss +20 -9
  160. package/src/scss/map/openlayers/VCO.Map.OpenLayers.scss +7 -4
  161. package/src/scss/media/VCO.Media.scss +7 -7
  162. package/src/scss/media/types/VCO.Media.Blockquote.scss +1 -1
  163. package/src/scss/media/types/VCO.Media.Text.scss +5 -5
  164. package/src/scss/media/types/VCO.Media.Twitter.scss +4 -4
  165. package/src/scss/media/types/VCO.Media.Wikipedia.scss +2 -19
  166. package/src/scss/site/site.scss +55 -36
  167. package/src/scss/slider/VCO.Slide.scss +49 -11
  168. package/src/scss/slider/VCO.SlideNav.scss +23 -7
  169. package/src/scss/slider/VCO.StorySlider.scss +50 -0
  170. package/src/scss/snapmap/VCO.SnapMap.scss +3 -3
  171. package/src/scss/ui/VCO.Consent.scss +20 -14
  172. package/src/scss/ui/VCO.Layers.scss +119 -0
  173. package/src/scss/ui/VCO.MenuBar.Button.scss +140 -19
  174. package/src/scss/ui/VCO.MenuBar.scss +9 -2
  175. package/src/scss/ui/VCO.Message.scss +14 -0
  176. package/src/slider/Slide.ts +232 -74
  177. package/src/slider/SlideNav.ts +15 -4
  178. package/src/slider/StorySlider.ts +203 -22
  179. package/src/storymap/Consent.ts +22 -0
  180. package/src/storymap/StoryMap.ts +944 -131
  181. package/src/storymap/content-state.ts +3 -8
  182. package/src/storymap/font-css.ts +72 -0
  183. package/src/storymap/from-slideshow.ts +785 -0
  184. package/src/storymap/iiif-shared.ts +228 -0
  185. package/src/storymap/iiif.ts +289 -100
  186. package/src/storymap/to-iiif.ts +131 -44
  187. package/src/types.ts +382 -17
  188. package/src/ui/LayersControl.ts +302 -0
  189. package/src/ui/MenuBar.ts +232 -21
  190. package/src/ui/Message.ts +36 -3
  191. package/src/ui/Swipable.ts +25 -7
  192. package/dist/assets/harness-Cr0rYpvt.js +0 -1
  193. package/dist/assets/main-DXalctuR.js +0 -17
  194. package/src/scss/VCO.StoryMap.Dark.scss +0 -150
  195. package/src/scss/Variables.Dark.scss +0 -57
@@ -28,10 +28,10 @@
28
28
 
29
29
  .vco-media-loaderror {
30
30
  p {
31
- color: $ui-background-color;
31
+ color: var(--vco-color-text, #{$color-text});
32
32
 
33
33
  span {
34
- color: $ui-background-color;
34
+ color: var(--vco-color-text, #{$color-text});
35
35
  }
36
36
 
37
37
  text-align: center;
@@ -105,14 +105,14 @@
105
105
  }
106
106
 
107
107
  a {
108
- color: color.adjust($color-dark, $lightness: 20%);
108
+ color: var(--vco-color-link, #{color.adjust($color-dark, $lightness: 20%)});
109
109
  text-decoration: none;
110
110
  }
111
111
 
112
112
  a:hover {
113
113
  .fn,
114
114
  .nickname {
115
- color: $color-theme;
115
+ color: var(--vco-color-theme, #{$color-theme});
116
116
 
117
117
  // text-decoration: underline;
118
118
  }
@@ -130,7 +130,7 @@
130
130
 
131
131
  .nickname {
132
132
  margin-top: 1px;
133
- color: color.adjust($color-dark, $lightness: 40%);
133
+ color: var(--vco-color-text-muted, #{color.adjust($color-dark, $lightness: 40%)});
134
134
  }
135
135
 
136
136
  .avatar {
@@ -150,14 +150,14 @@
150
150
  .vcard a {
151
151
  @include slide-text-shadow;
152
152
 
153
- color: color.adjust($color-theme, $lightness: 90%);
153
+ color: var(--vco-color-theme-faint, #{color.adjust($color-theme, $lightness: 90%)});
154
154
  }
155
155
  }
156
156
 
157
157
  /* Credit
158
158
  ================================================== */
159
159
  .vco-credit {
160
- color: #999;
160
+ color: var(--vco-color-text, #{$color-text});
161
161
  text-align: right;
162
162
  display: block;
163
163
  margin: 0 auto;
@@ -19,7 +19,7 @@
19
19
  cite {
20
20
  font-size: $base-font-size;
21
21
  line-height: math.floor($base-font-size * $base-line-height);
22
- color: $color-foreground;
22
+ color: var(--vco-color-foreground, #{$color-foreground});
23
23
  text-align: right;
24
24
  }
25
25
  }
@@ -35,13 +35,13 @@
35
35
  line-height: $base-font-size;
36
36
  font-weight: normal;
37
37
  margin: 0 0 2px;
38
- color: color.adjust($color-text, $lightness: 25%);
38
+ color: var(--vco-color-text, #{$color-text});
39
39
 
40
40
  small {
41
41
  font-size: $base-font-size;
42
42
  line-height: $base-font-size;
43
43
  font-weight: normal;
44
- color: color.adjust($color-text, $lightness: 25%);
44
+ color: var(--vco-color-text, #{$color-text});
45
45
  }
46
46
  }
47
47
 
@@ -71,15 +71,15 @@
71
71
  .vco-full-color-background {
72
72
  .vco-text,
73
73
  .vco-text p {
74
- color: $color-text-inverted !important;
74
+ color: var(--vco-color-text-inverted, #{$color-text-inverted}) !important;
75
75
  text-shadow: 1px 1px 2px #000;
76
76
 
77
77
  .vco-headline-date,
78
78
  h3.vco-headline-date {
79
- color: $color-text-inverted !important;
79
+ color: var(--vco-color-text-inverted, #{$color-text-inverted}) !important;
80
80
 
81
81
  small {
82
- color: $color-text-inverted !important;
82
+ color: var(--vco-color-text-inverted, #{$color-text-inverted}) !important;
83
83
  }
84
84
  }
85
85
  }
@@ -15,12 +15,12 @@
15
15
  margin-right: $base-spacing;
16
16
  font-size: $base-font-size;
17
17
  line-height: math.floor($base-font-size * $base-line-height);
18
- color: $color-foreground;
18
+ color: var(--vco-color-foreground, #{$color-foreground});
19
19
 
20
20
  p {
21
21
  font-size: $base-font-size-xlarge;
22
22
  line-height: math.floor($base-font-size-xlarge * 1.1);
23
- color: $color-dark;
23
+ color: var(--vco-color-dark, #{$color-dark});
24
24
  }
25
25
  }
26
26
 
@@ -36,11 +36,11 @@
36
36
  a:hover,
37
37
  a.vco-date:hover {
38
38
  text-decoration: none;
39
- color: #55acee;
39
+ color: #1a7ab5;
40
40
 
41
41
  .fn,
42
42
  .nickname {
43
- color: #55acee;
43
+ color: #1a7ab5;
44
44
  }
45
45
  }
46
46
  }
@@ -19,21 +19,8 @@
19
19
  font-style: italic;
20
20
  }
21
21
 
22
- h4 {
23
- margin-top: 0;
24
-
25
- // border-bottom: 1px solid @color-line;
26
- margin-bottom: 0;
27
- }
28
-
29
- h4 a {
30
- color: $color-dark; // $color-theme;
31
- text-decoration: none;
32
- }
33
-
34
- h4 a:hover {
35
- text-decoration: underline;
36
- }
22
+ // no h4 rules: the sanitizer strips the tag, so these were dead
23
+ // (issue #385 wave; see docs/plans/css-followups.md)
37
24
  }
38
25
  }
39
26
 
@@ -46,10 +33,6 @@
46
33
  @include background-color-opacity(0, 0, 0, 60);
47
34
 
48
35
  border-radius: 7px;
49
-
50
- h4 a {
51
- @include slide-text-shadow;
52
- }
53
36
  }
54
37
  }
55
38
  }
@@ -25,6 +25,8 @@ $sm-color-green: #24a549; // button-secondary
25
25
  $sm-color-green-border: #1f9040;
26
26
  $sm-color-border: #b8b8b8;
27
27
  $sm-color-border-light: #d4d4d4;
28
+ $sm-color-page: #fff;
29
+ $sm-color-muted: #9c9c9c;
28
30
  $sm-font-serif: georgia, "Times New Roman", times, serif;
29
31
  $sm-font-sans: "Helvetica Neue", helvetica, arial, "Segoe UI", system-ui, sans-serif;
30
32
 
@@ -36,8 +38,8 @@ $sm-font-sans: "Helvetica Neue", helvetica, arial, "Segoe UI", system-ui, sans-s
36
38
  font-family: $sm-font-serif;
37
39
  font-size: 18px;
38
40
  line-height: 1.618;
39
- color: $sm-color-text;
40
- background-color: #fff;
41
+ color: var(--sm-color-text, #{$sm-color-text});
42
+ background-color: var(--sm-color-page, #fff);
41
43
 
42
44
  *,
43
45
  *::before,
@@ -57,7 +59,7 @@ $sm-font-sans: "Helvetica Neue", helvetica, arial, "Segoe UI", system-ui, sans-s
57
59
  pre {
58
60
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
59
61
  font-size: 0.85em;
60
- background-color: $sm-color-light;
62
+ background-color: var(--sm-color-light, #{$sm-color-light});
61
63
  border-radius: 3px;
62
64
  }
63
65
 
@@ -105,7 +107,7 @@ $sm-font-sans: "Helvetica Neue", helvetica, arial, "Segoe UI", system-ui, sans-s
105
107
  font-style: italic;
106
108
  font-weight: normal;
107
109
  font-size: 3.82rem;
108
- color: $sm-color-text;
110
+ color: var(--sm-color-text, #{$sm-color-text});
109
111
  margin: 0;
110
112
 
111
113
  @media (width <= 767px) {
@@ -152,10 +154,10 @@ $sm-font-sans: "Helvetica Neue", helvetica, arial, "Segoe UI", system-ui, sans-s
152
154
  position: relative;
153
155
  overflow: hidden;
154
156
  padding: 0.89rem 1.78rem 0.94rem;
155
- border: 1px solid $sm-color-border-light;
157
+ border: 1px solid var(--sm-color-border-light, #{$sm-color-border-light});
156
158
  border-radius: 4px;
157
159
  background-color: transparent;
158
- color: $sm-color-grey;
160
+ color: var(--sm-color-grey, #{$sm-color-grey});
159
161
  font-family: $sm-font-sans;
160
162
  font-size: 0.89rem;
161
163
  text-align: center;
@@ -171,7 +173,7 @@ $sm-font-sans: "Helvetica Neue", helvetica, arial, "Segoe UI", system-ui, sans-s
171
173
  &:hover {
172
174
  background-color: #fdfdfd;
173
175
  border-color: #d7d7d7;
174
- color: $sm-color-grey;
176
+ color: var(--sm-color-grey, #{$sm-color-grey});
175
177
  text-decoration: none;
176
178
  }
177
179
 
@@ -287,11 +289,11 @@ $sm-font-sans: "Helvetica Neue", helvetica, arial, "Segoe UI", system-ui, sans-s
287
289
  }
288
290
 
289
291
  .button-active {
290
- background-color: $sm-color-border-light;
291
- color: $sm-color-text;
292
+ background-color: var(--sm-color-border-light, #{$sm-color-border-light});
293
+ color: var(--sm-color-text, #{$sm-color-text});
292
294
 
293
295
  &:hover {
294
- background-color: $sm-color-border-light;
296
+ background-color: var(--sm-color-border-light, #{$sm-color-border-light});
295
297
  }
296
298
  }
297
299
  }
@@ -313,8 +315,8 @@ $sm-font-sans: "Helvetica Neue", helvetica, arial, "Segoe UI", system-ui, sans-s
313
315
  .header-product {
314
316
  padding: 2rem 2rem 0;
315
317
  margin-bottom: 0;
316
- border-bottom: 1px solid $sm-color-border;
317
- background-color: $sm-color-light;
318
+ border-bottom: 1px solid var(--sm-color-border, #{$sm-color-border});
319
+ background-color: var(--sm-color-light, #{$sm-color-light});
318
320
  text-align: center;
319
321
 
320
322
  .product-tagline {
@@ -334,7 +336,7 @@ $sm-font-sans: "Helvetica Neue", helvetica, arial, "Segoe UI", system-ui, sans-s
334
336
 
335
337
  .navbar-subnav {
336
338
  margin-top: 1rem;
337
- background-color: $sm-color-light;
339
+ background-color: var(--sm-color-light, #{$sm-color-light});
338
340
 
339
341
  // the original hides the subnav on phones entirely
340
342
  @media (width <= 767px) {
@@ -342,12 +344,12 @@ $sm-font-sans: "Helvetica Neue", helvetica, arial, "Segoe UI", system-ui, sans-s
342
344
  }
343
345
 
344
346
  .button {
345
- border-color: $sm-color-border-light;
347
+ border-color: var(--sm-color-border-light, #{$sm-color-border-light});
346
348
  box-shadow: none;
347
- color: $sm-color-grey;
349
+ color: var(--sm-color-grey, #{$sm-color-grey});
348
350
 
349
351
  &:hover {
350
- color: $sm-color-text;
352
+ color: var(--sm-color-text, #{$sm-color-text});
351
353
  background-color: rgb(255 255 255 / 60%);
352
354
  }
353
355
  }
@@ -402,13 +404,13 @@ $sm-font-sans: "Helvetica Neue", helvetica, arial, "Segoe UI", system-ui, sans-s
402
404
  }
403
405
 
404
406
  .fill-color-grey {
405
- background-color: $sm-color-light;
407
+ background-color: var(--sm-color-light, #{$sm-color-light});
406
408
  }
407
409
 
408
410
  .note {
409
- background-color: $sm-color-light;
411
+ background-color: var(--sm-color-light, #{$sm-color-light});
410
412
  border-radius: 8px;
411
- color: #9c9c9c;
413
+ color: var(--sm-color-muted, #{$sm-color-muted});
412
414
  font-family: $sm-font-sans;
413
415
  font-size: 0.9em;
414
416
  font-style: italic;
@@ -428,7 +430,7 @@ $sm-font-sans: "Helvetica Neue", helvetica, arial, "Segoe UI", system-ui, sans-s
428
430
  display: block;
429
431
  width: 100%;
430
432
  border: 0;
431
- background-color: $sm-color-light;
433
+ background-color: var(--sm-color-light, #{$sm-color-light});
432
434
  }
433
435
 
434
436
  // ---------------------------------------------------------------------
@@ -457,7 +459,7 @@ $sm-font-sans: "Helvetica Neue", helvetica, arial, "Segoe UI", system-ui, sans-s
457
459
 
458
460
  .card {
459
461
  padding: 0;
460
- border: 1px solid $sm-color-border-light;
462
+ border: 1px solid var(--sm-color-border-light, #{$sm-color-border-light});
461
463
  border-radius: 4px;
462
464
  background-color: #fff;
463
465
  overflow: hidden;
@@ -482,7 +484,7 @@ $sm-font-sans: "Helvetica Neue", helvetica, arial, "Segoe UI", system-ui, sans-s
482
484
  height: 100%;
483
485
  background-position: center;
484
486
  background-size: cover;
485
- background-color: $sm-color-grey;
487
+ background-color: var(--sm-color-grey, #{$sm-color-grey});
486
488
  transition: filter 0.3s ease;
487
489
 
488
490
  &.bw {
@@ -496,7 +498,7 @@ $sm-font-sans: "Helvetica Neue", helvetica, arial, "Segoe UI", system-ui, sans-s
496
498
  h3 {
497
499
  font-size: 1rem;
498
500
  margin: 0;
499
- color: $sm-color-text;
501
+ color: var(--sm-color-text, #{$sm-color-text});
500
502
  }
501
503
  }
502
504
 
@@ -505,11 +507,11 @@ $sm-font-sans: "Helvetica Neue", helvetica, arial, "Segoe UI", system-ui, sans-s
505
507
  padding: 0.6rem 1rem 0.8rem;
506
508
  font-family: $sm-font-sans;
507
509
  font-size: 0.75em;
508
- color: #9c9c9c;
510
+ color: var(--sm-color-muted, #{$sm-color-muted});
509
511
  }
510
512
 
511
513
  &:hover {
512
- border-color: $sm-color-text;
514
+ border-color: var(--sm-color-text, #{$sm-color-text});
513
515
 
514
516
  .header-image-background.bw {
515
517
  filter: grayscale(0%);
@@ -532,15 +534,15 @@ $sm-font-sans: "Helvetica Neue", helvetica, arial, "Segoe UI", system-ui, sans-s
532
534
  position: relative;
533
535
  padding: 0.5rem;
534
536
  margin-bottom: 0.5rem;
535
- background-color: $sm-color-lighter;
536
- border: 1px solid $sm-color-border-light;
537
+ background-color: var(--sm-color-lighter, #{$sm-color-lighter});
538
+ border: 1px solid var(--sm-color-border-light, #{$sm-color-border-light});
537
539
  border-radius: 8px;
538
540
 
539
541
  &:hover {
540
542
  border-color: $sm-color-navbar;
541
543
 
542
544
  h3 {
543
- color: $sm-color-text;
545
+ color: var(--sm-color-text, #{$sm-color-text});
544
546
  }
545
547
  }
546
548
 
@@ -584,7 +586,7 @@ $sm-font-sans: "Helvetica Neue", helvetica, arial, "Segoe UI", system-ui, sans-s
584
586
  font-size: 1.2rem;
585
587
  font-weight: 700;
586
588
  margin: 0.4rem 1.5rem 0.4rem 0.6rem;
587
- color: $sm-color-text;
589
+ color: var(--sm-color-text, #{$sm-color-text});
588
590
  }
589
591
 
590
592
  .accordion-content {
@@ -647,13 +649,13 @@ $sm-font-sans: "Helvetica Neue", helvetica, arial, "Segoe UI", system-ui, sans-s
647
649
  th,
648
650
  td {
649
651
  padding: 0.5rem 0.75rem;
650
- border: 1px solid $sm-color-border-light;
652
+ border: 1px solid var(--sm-color-border-light, #{$sm-color-border-light});
651
653
  text-align: left;
652
654
  vertical-align: top;
653
655
  }
654
656
 
655
657
  th {
656
- background-color: $sm-color-light;
658
+ background-color: var(--sm-color-light, #{$sm-color-light});
657
659
  }
658
660
 
659
661
  code {
@@ -665,8 +667,8 @@ $sm-font-sans: "Helvetica Neue", helvetica, arial, "Segoe UI", system-ui, sans-s
665
667
  blockquote {
666
668
  margin: 1rem 0;
667
669
  padding: 0.25rem 1rem;
668
- border-left: 4px solid $sm-color-border-light;
669
- color: $sm-color-grey;
670
+ border-left: 4px solid var(--sm-color-border-light, #{$sm-color-border-light});
671
+ color: var(--sm-color-grey, #{$sm-color-grey});
670
672
  }
671
673
 
672
674
  img {
@@ -686,8 +688,8 @@ $sm-font-sans: "Helvetica Neue", helvetica, arial, "Segoe UI", system-ui, sans-s
686
688
  padding: 60px 80px 30px;
687
689
  font-family: $sm-font-sans;
688
690
  font-size: 0.85em;
689
- background-color: $sm-color-light;
690
- border-top: 1px solid $sm-color-border;
691
+ background-color: var(--sm-color-light, #{$sm-color-light});
692
+ border-top: 1px solid var(--sm-color-border, #{$sm-color-border});
691
693
 
692
694
  .footer-grid {
693
695
  display: flex;
@@ -735,7 +737,7 @@ $sm-font-sans: "Helvetica Neue", helvetica, arial, "Segoe UI", system-ui, sans-s
735
737
  list-style: none;
736
738
 
737
739
  a {
738
- color: $sm-color-grey;
740
+ color: var(--sm-color-grey, #{$sm-color-grey});
739
741
  font-size: 1.1em;
740
742
  font-weight: 700;
741
743
 
@@ -746,3 +748,20 @@ $sm-font-sans: "Helvetica Neue", helvetica, arial, "Segoe UI", system-ui, sans-s
746
748
  }
747
749
  }
748
750
  }
751
+
752
+ /* Dark landing (dark theme plan): the surfaces above redeclared. Brand
753
+ accents (badge, green, navbar, orange links) keep their light values —
754
+ they read on both. Follows the OS setting; the widget additionally
755
+ honours an explicit `theme` option. */
756
+ @media (prefers-color-scheme: dark) {
757
+ .sm-site {
758
+ --sm-color-page: #1a1a1a;
759
+ --sm-color-text: #e0e0e0;
760
+ --sm-color-grey: #a8a8a8;
761
+ --sm-color-light: #262626;
762
+ --sm-color-lighter: #2e2e2e;
763
+ --sm-color-border: #555;
764
+ --sm-color-border-light: #444;
765
+ --sm-color-muted: #b0b0b0;
766
+ }
767
+ }
@@ -11,6 +11,10 @@
11
11
  padding: 0;
12
12
  margin: 0;
13
13
 
14
+ // authored inline styles (trusted tour content) cannot reorder above
15
+ // viewer chrome: a stacking context without any layout effect
16
+ isolation: isolate;
17
+
14
18
  // display:table;
15
19
  // table-layout: fixed;
16
20
  overflow: hidden auto;
@@ -18,7 +22,7 @@
18
22
  // Visible, app-styled vertical scrollbar whenever the slide content
19
23
  // overflows (desktop); touch devices get a wider one
20
24
  scrollbar-width: thin;
21
- scrollbar-color: $color-theme transparent;
25
+ scrollbar-color: var(--vco-color-theme, #{$color-theme}) transparent;
22
26
 
23
27
  // overflow-y:auto;
24
28
  // z-index:26;
@@ -30,10 +34,20 @@
30
34
  margin-bottom: 10px;
31
35
  padding-bottom: 10px;
32
36
 
37
+ // real <button>: strip the UA chrome, the classes carry the look
38
+ // (issue #385 wave). No `font` shorthand: it would reset the
39
+ // font-weight above.
40
+ appearance: none;
41
+ background: none;
42
+ border: 0;
43
+ font-family: inherit;
44
+ font-size: inherit;
45
+ text-align: inherit;
46
+
33
47
  .vco-slide-calltoaction-button-text {
34
48
  display: inline-block;
35
- background-color: $color-theme;
36
- color: $color-background;
49
+ background-color: var(--vco-color-theme, #{$color-theme});
50
+ color: var(--vco-color-background, #{$color-background});
37
51
 
38
52
  // padding:10px;
39
53
  padding: 10px 15px;
@@ -42,8 +56,8 @@
42
56
 
43
57
  &:hover {
44
58
  .vco-slide-calltoaction-button-text {
45
- background-color: $color-theme-dark;
46
- color: $color-background;
59
+ background-color: var(--vco-color-theme-dark, #{$color-theme-dark});
60
+ color: var(--vco-color-background, #{$color-background});
47
61
  }
48
62
  }
49
63
  }
@@ -68,6 +82,7 @@
68
82
  display: table;
69
83
  table-layout: fixed;
70
84
  height: 100%;
85
+ position: relative;
71
86
  z-index: 1;
72
87
  }
73
88
 
@@ -81,8 +96,8 @@
81
96
  // width:100%;
82
97
  // display:table;
83
98
  vertical-align: middle;
84
- padding-left: 100px;
85
- padding-right: 100px;
99
+ padding-left: clamp(10px, 5vw, 100px);
100
+ padding-right: clamp(10px, 5vw, 100px);
86
101
  position: relative;
87
102
  max-width: 100%;
88
103
 
@@ -111,7 +126,7 @@
111
126
  .vco-text {
112
127
  width: 50%;
113
128
  max-width: 50%;
114
- min-width: 120px;
129
+ min-width: 0;
115
130
 
116
131
  // height:100%;
117
132
  // overflow-y:auto;
@@ -127,6 +142,23 @@
127
142
  }
128
143
  }
129
144
  }
145
+
146
+ // Second visible media slot (#358): every rule below is gated behind
147
+ // .vco-slide-media-multiple, so single-media slides render unchanged.
148
+ // stack drops the float (items pile vertically, the panel scrolls);
149
+ // row seats exactly two items side by side (D4).
150
+ &.vco-slide-media-multiple[data-layout="stack"] {
151
+ .vco-slide-content .vco-media {
152
+ float: none;
153
+ }
154
+ }
155
+
156
+ &.vco-slide-media-multiple[data-layout="row"] {
157
+ .vco-slide-content .vco-media {
158
+ width: 50%;
159
+ min-width: 0;
160
+ }
161
+ }
130
162
  }
131
163
 
132
164
  // touch devices (the container carries .vco-mobile on Browser.touch):
@@ -135,7 +167,7 @@
135
167
  // keep their system overlay scrollbars)
136
168
  .vco-mobile .vco-slide {
137
169
  scrollbar-width: auto;
138
- scrollbar-color: $color-theme-dark rgb(0 0 0 / 12%);
170
+ scrollbar-color: var(--vco-color-theme-dark, #{$color-theme-dark}) rgb(0 0 0 / 12%);
139
171
  }
140
172
 
141
173
  /* Scroll hint: a bouncing downward arrow when the slide content overflows
@@ -171,6 +203,12 @@
171
203
  cursor: pointer;
172
204
  animation: vco-scroll-hint-bounce 1.2s ease-in-out infinite;
173
205
 
206
+ // real <button>: strip the UA chrome (issue #385 wave)
207
+ appearance: none;
208
+ border: 0;
209
+ padding: 0;
210
+ font: inherit;
211
+
174
212
  @media (prefers-reduced-motion: reduce) {
175
213
  animation: none;
176
214
  transform: translate(-50%, 0);
@@ -267,7 +305,7 @@
267
305
  blockquote p {
268
306
  @include slide-text-shadow;
269
307
 
270
- color: color.adjust($color-theme, $lightness: 90%);
308
+ color: var(--vco-color-theme-faint, #{color.adjust($color-theme, $lightness: 90%)});
271
309
  }
272
310
 
273
311
  .vco-caption,
@@ -352,7 +390,7 @@
352
390
  .vco-text-content {
353
391
  iframe {
354
392
  width: 100%;
355
- min-height: 280px;
393
+ min-height: min(280px, 50vh);
356
394
  border: 0;
357
395
  }
358
396
  }
@@ -60,10 +60,10 @@
60
60
  .vco-slidenav-icon,
61
61
  .vco-slidenav-title,
62
62
  .vco-slidenav-description {
63
- text-shadow: 1px 1px 1px $color-background;
63
+ text-shadow: 1px 1px 1px var(--vco-color-background, #{$color-background});
64
64
 
65
65
  // color: $color-foreground;
66
- color: $color-background;
66
+ color: var(--vco-color-background, #{$color-background});
67
67
  }
68
68
 
69
69
  &.vco-slidenav-inverted {
@@ -71,8 +71,8 @@
71
71
  .vco-slidenav-title,
72
72
  .vco-slidenav-description {
73
73
  // color:$color-background;
74
- color: $color-foreground;
75
- text-shadow: 1px 1px 1px $color-foreground;
74
+ color: var(--vco-color-foreground, #{$color-foreground});
75
+ text-shadow: 1px 1px 1px var(--vco-color-foreground, #{$color-foreground});
76
76
  }
77
77
  }
78
78
  }
@@ -95,6 +95,18 @@
95
95
  opacity: 1;
96
96
  }
97
97
  }
98
+
99
+ // keyboard parity with the hover reveal, plus a visible ring: the
100
+ // container is a focusable div acting as a button
101
+ &:focus-visible {
102
+ outline: 2px solid var(--vco-color-theme, #{$color-theme});
103
+ outline-offset: 2px;
104
+
105
+ .vco-slidenav-title,
106
+ .vco-slidenav-description {
107
+ opacity: 1;
108
+ }
109
+ }
98
110
  }
99
111
 
100
112
  .vco-slidenav-next {
@@ -178,7 +190,7 @@
178
190
  .vco-slidenav-icon,
179
191
  .vco-slidenav-title,
180
192
  .vco-slidenav-description {
181
- color: $color-background;
193
+ color: var(--vco-color-background, #{$color-background});
182
194
 
183
195
  // color: $color-foreground;
184
196
  }
@@ -274,12 +286,16 @@
274
286
  .vco-slidenav-icon {
275
287
  &::before {
276
288
  // background-color:$color-background;
277
- background-color: $color-foreground;
289
+ background-color: var(--vco-color-foreground, #{$color-foreground});
278
290
 
279
291
  // .translucent-background($color-background, .85);
280
292
  // .box-shadow(1px 1px 7px rgba(0,0,0,.30));
281
293
  padding: 20px;
282
- border: 1px solid color.adjust($color-background, $lightness: -30%);
294
+ border: 1px solid
295
+ var(
296
+ --vco-color-nav-border,
297
+ #{color.adjust($color-background, $lightness: -30%)}
298
+ );
283
299
  }
284
300
  }
285
301