@reuters-graphics/graphics-components 3.0.12 → 3.0.13
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.
- package/dist/components/@types/global.d.ts +45 -0
- package/dist/components/Scroller/Scroller.mdx +2 -2
- package/dist/components/ScrollerBase/ScrollerBase.mdx +0 -5
- package/dist/components/ScrollerVideo/Debug.svelte +207 -0
- package/dist/components/ScrollerVideo/Debug.svelte.d.ts +5 -0
- package/dist/components/ScrollerVideo/ScrollerVideo.mdx +462 -0
- package/dist/components/ScrollerVideo/ScrollerVideo.stories.svelte +190 -0
- package/dist/components/ScrollerVideo/ScrollerVideo.stories.svelte.d.ts +19 -0
- package/dist/components/ScrollerVideo/ScrollerVideo.svelte +292 -0
- package/dist/components/ScrollerVideo/ScrollerVideo.svelte.d.ts +58 -0
- package/dist/components/ScrollerVideo/ScrollerVideoForeground.svelte +164 -0
- package/dist/components/ScrollerVideo/ScrollerVideoForeground.svelte.d.ts +17 -0
- package/dist/components/ScrollerVideo/demo/AdvancedUsecases.svelte +114 -0
- package/dist/components/ScrollerVideo/demo/AdvancedUsecases.svelte.d.ts +3 -0
- package/dist/components/ScrollerVideo/demo/Embedded.svelte +94 -0
- package/dist/components/ScrollerVideo/demo/Embedded.svelte.d.ts +3 -0
- package/dist/components/ScrollerVideo/demo/WithAi2svelteForegrounds.svelte +117 -0
- package/dist/components/ScrollerVideo/demo/WithAi2svelteForegrounds.svelte.d.ts +3 -0
- package/dist/components/ScrollerVideo/demo/WithScrollerBase.svelte +80 -0
- package/dist/components/ScrollerVideo/demo/WithScrollerBase.svelte.d.ts +3 -0
- package/dist/components/ScrollerVideo/demo/WithTextForegrounds.svelte +72 -0
- package/dist/components/ScrollerVideo/demo/WithTextForegrounds.svelte.d.ts +18 -0
- package/dist/components/ScrollerVideo/demo/graphic/ai2svelte/ai-chart.svelte +631 -0
- package/dist/components/ScrollerVideo/demo/graphic/ai2svelte/ai-chart.svelte.d.ts +3 -0
- package/dist/components/ScrollerVideo/demo/graphic/ai2svelte/annotation1.svelte +428 -0
- package/dist/components/ScrollerVideo/demo/graphic/ai2svelte/annotation1.svelte.d.ts +26 -0
- package/dist/components/ScrollerVideo/demo/graphic/ai2svelte/annotation2.svelte +402 -0
- package/dist/components/ScrollerVideo/demo/graphic/ai2svelte/annotation2.svelte.d.ts +26 -0
- package/dist/components/ScrollerVideo/demo/graphic/ai2svelte/annotation3.svelte +398 -0
- package/dist/components/ScrollerVideo/demo/graphic/ai2svelte/annotation3.svelte.d.ts +26 -0
- package/dist/components/ScrollerVideo/demo/graphic/ai2svelte/annotation4.svelte +360 -0
- package/dist/components/ScrollerVideo/demo/graphic/ai2svelte/annotation4.svelte.d.ts +26 -0
- package/dist/components/ScrollerVideo/demo/graphic/imgs/ai-chart-md.png +0 -0
- package/dist/components/ScrollerVideo/demo/graphic/imgs/ai-chart-sm.png +0 -0
- package/dist/components/ScrollerVideo/demo/graphic/imgs/ai-chart-xs.png +0 -0
- package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation1-lg.png +0 -0
- package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation1-md.png +0 -0
- package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation1-sm.png +0 -0
- package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation1-xl.png +0 -0
- package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation1-xs.png +0 -0
- package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation2-lg.png +0 -0
- package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation2-md.png +0 -0
- package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation2-sm.png +0 -0
- package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation2-xl.png +0 -0
- package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation2-xs.png +0 -0
- package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation3-lg.png +0 -0
- package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation3-md.png +0 -0
- package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation3-sm.png +0 -0
- package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation3-xl.png +0 -0
- package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation3-xs.png +0 -0
- package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation4-lg.png +0 -0
- package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation4-md.png +0 -0
- package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation4-sm.png +0 -0
- package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation4-xl.png +0 -0
- package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation4-xs.png +0 -0
- package/dist/components/ScrollerVideo/ts/ScrollerVideo.d.ts +248 -0
- package/dist/components/ScrollerVideo/ts/ScrollerVideo.js +762 -0
- package/dist/components/ScrollerVideo/ts/mp4box.d.ts +137 -0
- package/dist/components/ScrollerVideo/ts/state.svelte.d.ts +51 -0
- package/dist/components/ScrollerVideo/ts/state.svelte.js +25 -0
- package/dist/components/ScrollerVideo/ts/utils.d.ts +70 -0
- package/dist/components/ScrollerVideo/ts/utils.js +92 -0
- package/dist/components/ScrollerVideo/ts/videoDecoder.d.ts +11 -0
- package/dist/components/ScrollerVideo/ts/videoDecoder.js +193 -0
- package/dist/components/ScrollerVideo/videos/HPO.mp4 +0 -0
- package/dist/components/ScrollerVideo/videos/drone.mp4 +0 -0
- package/dist/components/ScrollerVideo/videos/goldengate.mp4 +0 -0
- package/dist/components/ScrollerVideo/videos/tennis.mp4 +0 -0
- package/dist/components/ScrollerVideo/videos/waves_lg.mp4 +0 -0
- package/dist/components/ScrollerVideo/videos/waves_md.mp4 +0 -0
- package/dist/components/ScrollerVideo/videos/waves_sm.mp4 +0 -0
- package/dist/components/SiteHeadline/SiteHeadline.mdx +4 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +2 -0
- package/package.json +3 -1
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { Component } from 'svelte';
|
|
2
|
+
import type { TransitionOptions } from '../ScrollerVideo/ts/ScrollerVideo.js';
|
|
3
|
+
import type { ScrollerVideoState } from '../ScrollerVideo/ts/state.svelte.js';
|
|
2
4
|
/**
|
|
3
5
|
* Used for the list of <option> tags nested in a <select> input.
|
|
4
6
|
*/
|
|
@@ -40,3 +42,46 @@ export interface ScrollerStep {
|
|
|
40
42
|
altText?: string;
|
|
41
43
|
}
|
|
42
44
|
export type ForegroundPosition = 'middle' | 'left' | 'right' | 'left opposite' | 'right opposite';
|
|
45
|
+
export type ScrollerVideoForegroundPosition = 'top center' | 'top left' | 'top right' | 'bottom center' | 'bottom left' | 'bottom right' | 'center center' | 'center left' | 'center right';
|
|
46
|
+
export interface ScrollerVideoInstance {
|
|
47
|
+
container: HTMLElement | null;
|
|
48
|
+
scrollerVideoContainer: Element | string | undefined;
|
|
49
|
+
src: string;
|
|
50
|
+
transitionSpeed: number;
|
|
51
|
+
frameThreshold: number;
|
|
52
|
+
useWebCodecs: boolean;
|
|
53
|
+
objectFit: string;
|
|
54
|
+
sticky: boolean;
|
|
55
|
+
trackScroll: boolean;
|
|
56
|
+
onReady: () => void;
|
|
57
|
+
onChange: (percentage?: number) => void;
|
|
58
|
+
debug: boolean;
|
|
59
|
+
autoplay: boolean;
|
|
60
|
+
video: HTMLVideoElement | undefined;
|
|
61
|
+
videoPercentage: number;
|
|
62
|
+
isSafari: boolean;
|
|
63
|
+
currentTime: number;
|
|
64
|
+
targetTime: number;
|
|
65
|
+
canvas: HTMLCanvasElement | null;
|
|
66
|
+
context: CanvasRenderingContext2D | null;
|
|
67
|
+
frames: ImageBitmap[] | null;
|
|
68
|
+
frameRate: number;
|
|
69
|
+
targetScrollPosition: number | null;
|
|
70
|
+
currentFrame: number;
|
|
71
|
+
usingWebCodecs: boolean;
|
|
72
|
+
totalTime: number;
|
|
73
|
+
transitioningRaf: number | null;
|
|
74
|
+
componentState: ScrollerVideoState;
|
|
75
|
+
updateScrollPercentage: ((jump: boolean) => void) | undefined;
|
|
76
|
+
resize: (() => void) | undefined;
|
|
77
|
+
setVideoPercentage(percentage: number, options?: TransitionOptions): void;
|
|
78
|
+
setCoverStyle(el: HTMLElement | HTMLCanvasElement | undefined): void;
|
|
79
|
+
decodeVideo(): Promise<void>;
|
|
80
|
+
paintCanvasFrame(frameNum: number): void;
|
|
81
|
+
transitionToTargetTime(options: TransitionOptions): void;
|
|
82
|
+
setTargetTimePercent(percentage: number, options?: TransitionOptions): void;
|
|
83
|
+
setScrollPercent(percentage: number): void;
|
|
84
|
+
destroy(): void;
|
|
85
|
+
autoplayScroll(): void;
|
|
86
|
+
updateDebugInfo(): void;
|
|
87
|
+
}
|
|
@@ -72,7 +72,7 @@ In your graphics kit project, import your ai2svelte graphics in `App.svelte` and
|
|
|
72
72
|
</script>
|
|
73
73
|
```
|
|
74
74
|
|
|
75
|
-
Then add the following structure to your ArchieML
|
|
75
|
+
Then add the following structure to your ArchieML doc, making sure that the names of your charts in the `aiCharts` object match the names of each step's `background` in the ArchieML doc:
|
|
76
76
|
|
|
77
77
|
```yaml
|
|
78
78
|
# ArchieML doc
|
|
@@ -217,7 +217,7 @@ In your graphics kit project's `App.svelte`, import your custom foregroud compon
|
|
|
217
217
|
</script>
|
|
218
218
|
```
|
|
219
219
|
|
|
220
|
-
Then add the following structure to your ArchieML
|
|
220
|
+
Then add the following structure to your ArchieML doc, making sure that the names of your charts in the `aiCharts` and `foregroundComponents` objects match the names of each step's `background` and `foreground` in the ArchieML doc:
|
|
221
221
|
|
|
222
222
|
```yaml
|
|
223
223
|
# ArchieML doc
|
|
@@ -64,11 +64,6 @@ The `ScrollerBase` component powers the [`Scroller` component](?path=/story/comp
|
|
|
64
64
|
<style lang="scss">
|
|
65
65
|
@use '@reuters-graphics/graphics-components/dist/scss/mixins' as mixins;
|
|
66
66
|
|
|
67
|
-
.scroller-demo-container {
|
|
68
|
-
width: mixins.$column-width-normal;
|
|
69
|
-
margin: auto;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
67
|
.step-foreground-container {
|
|
73
68
|
height: 100vh;
|
|
74
69
|
width: 50%;
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
const { componentState } = $props();
|
|
3
|
+
|
|
4
|
+
let isMoving = $state(false);
|
|
5
|
+
let preventDetails = $state(false);
|
|
6
|
+
let position = $state({ x: 8, y: 8 });
|
|
7
|
+
|
|
8
|
+
function onMouseDown(e: MouseEvent) {
|
|
9
|
+
isMoving = true;
|
|
10
|
+
e.preventDefault();
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function onMouseMove(e: MouseEvent) {
|
|
14
|
+
if (isMoving) {
|
|
15
|
+
position = {
|
|
16
|
+
x: position.x + e.movementX,
|
|
17
|
+
y: position.y + e.movementY,
|
|
18
|
+
};
|
|
19
|
+
preventDetails = true;
|
|
20
|
+
}
|
|
21
|
+
e.preventDefault();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function onMouseUp(e: MouseEvent) {
|
|
25
|
+
if (isMoving) {
|
|
26
|
+
isMoving = false;
|
|
27
|
+
setTimeout(() => {
|
|
28
|
+
preventDetails = false;
|
|
29
|
+
}, 5);
|
|
30
|
+
e.stopImmediatePropagation();
|
|
31
|
+
}
|
|
32
|
+
e.preventDefault();
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function onClick(e: MouseEvent) {
|
|
36
|
+
if (preventDetails) {
|
|
37
|
+
e.preventDefault();
|
|
38
|
+
}
|
|
39
|
+
isMoving = false;
|
|
40
|
+
}
|
|
41
|
+
</script>
|
|
42
|
+
|
|
43
|
+
<svelte:window onmousemove={onMouseMove} />
|
|
44
|
+
|
|
45
|
+
<div
|
|
46
|
+
style="position: absolute; top: {position.y}px; left: {position.x}px; z-index: 5; user-select: none;"
|
|
47
|
+
role="region"
|
|
48
|
+
>
|
|
49
|
+
<details class="debug-info" open>
|
|
50
|
+
<summary
|
|
51
|
+
class="text-xxs font-sans font-bold title"
|
|
52
|
+
style="grid-column: span 2;"
|
|
53
|
+
onmousedown={onMouseDown}
|
|
54
|
+
onmouseup={onMouseUp}
|
|
55
|
+
onclick={onClick}
|
|
56
|
+
>
|
|
57
|
+
CONSOLE
|
|
58
|
+
</summary>
|
|
59
|
+
<div class="state-debug">
|
|
60
|
+
<p>Source:</p>
|
|
61
|
+
<p class="state-value">{componentState.generalData.src}</p>
|
|
62
|
+
<!-- -->
|
|
63
|
+
<p>Progress:</p>
|
|
64
|
+
<div style="display: flex; flex-direction: column; gap: 4px;">
|
|
65
|
+
<p class="state-value">{componentState.generalData.videoPercentage}</p>
|
|
66
|
+
<div id="video-progress-bar">
|
|
67
|
+
<div
|
|
68
|
+
style="width: {componentState.generalData.videoPercentage *
|
|
69
|
+
100}%; height: 100%;"
|
|
70
|
+
></div>
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
73
|
+
<!-- -->
|
|
74
|
+
<p>Framerate:</p>
|
|
75
|
+
<p class="state-value">{componentState.generalData.frameRate}</p>
|
|
76
|
+
<!-- -->
|
|
77
|
+
<p>Current time:</p>
|
|
78
|
+
<p class="state-value">
|
|
79
|
+
{componentState.generalData.currentTime}/{componentState.generalData
|
|
80
|
+
.totalTime}
|
|
81
|
+
</p>
|
|
82
|
+
<!-- -->
|
|
83
|
+
{#if componentState.usingWebCodecs}
|
|
84
|
+
<p>Codec:</p>
|
|
85
|
+
<p class="state-value">
|
|
86
|
+
<span class="tag">{componentState.framesData.codec}</span>
|
|
87
|
+
</p>
|
|
88
|
+
|
|
89
|
+
<!-- -->
|
|
90
|
+
<p>Current frame:</p>
|
|
91
|
+
<p class="state-value">
|
|
92
|
+
{componentState.framesData.currentFrame}/{componentState.framesData
|
|
93
|
+
.totalFrames}
|
|
94
|
+
</p>
|
|
95
|
+
{/if}
|
|
96
|
+
<!-- -->
|
|
97
|
+
<p>Will Autoplay?:</p>
|
|
98
|
+
<p class="state-value">
|
|
99
|
+
<span class="tag">{componentState.willAutoPlay}</span>
|
|
100
|
+
</p>
|
|
101
|
+
<!-- -->
|
|
102
|
+
{#if componentState.willAutoPlay}
|
|
103
|
+
<p>Autoplaying:</p>
|
|
104
|
+
<p class="state-value">
|
|
105
|
+
<span class="tag">{componentState.isAutoPlaying}</span>
|
|
106
|
+
</p>
|
|
107
|
+
<p>Autoplay progress:</p>
|
|
108
|
+
<div style="display: flex; flex-direction: column; gap: 4px;">
|
|
109
|
+
<p class="state-value">{componentState.autoplayProgress}</p>
|
|
110
|
+
<div id="video-progress-bar">
|
|
111
|
+
<div
|
|
112
|
+
style="width: {componentState.autoplayProgress *
|
|
113
|
+
100}%; height: 100%;"
|
|
114
|
+
></div>
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
{/if}
|
|
118
|
+
</div>
|
|
119
|
+
</details>
|
|
120
|
+
</div>
|
|
121
|
+
|
|
122
|
+
<style>@import url("https://fonts.googleapis.com/css2?family=Geist+Mono:wght@100..900&display=swap");
|
|
123
|
+
.debug-info {
|
|
124
|
+
position: absolute;
|
|
125
|
+
top: 0;
|
|
126
|
+
left: 0;
|
|
127
|
+
background-color: rgb(0, 0, 0);
|
|
128
|
+
z-index: 3;
|
|
129
|
+
margin: 0;
|
|
130
|
+
width: 50vmin;
|
|
131
|
+
min-width: 50vmin;
|
|
132
|
+
padding: 8px;
|
|
133
|
+
border-radius: 8px;
|
|
134
|
+
overflow: auto;
|
|
135
|
+
resize: horizontal;
|
|
136
|
+
opacity: 0.6;
|
|
137
|
+
transition: opacity 0.3s ease;
|
|
138
|
+
filter: drop-shadow(0 0 16px rgba(0, 0, 0, 0.5));
|
|
139
|
+
}
|
|
140
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
141
|
+
.debug-info {
|
|
142
|
+
interpolate-size: allow-keywords;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
.debug-info::details-content {
|
|
146
|
+
opacity: 0;
|
|
147
|
+
block-size: 0;
|
|
148
|
+
overflow-y: clip;
|
|
149
|
+
transition: content-visibility 0.4s allow-discrete, opacity 0.4s, block-size 0.4s cubic-bezier(0.87, 0, 0.13, 1);
|
|
150
|
+
}
|
|
151
|
+
.debug-info[open]::details-content {
|
|
152
|
+
opacity: 1;
|
|
153
|
+
block-size: auto;
|
|
154
|
+
}
|
|
155
|
+
.debug-info .title {
|
|
156
|
+
width: 100%;
|
|
157
|
+
font-family: "Geist Mono", monospace;
|
|
158
|
+
color: white;
|
|
159
|
+
margin: 0;
|
|
160
|
+
}
|
|
161
|
+
.debug-info * {
|
|
162
|
+
user-select: none;
|
|
163
|
+
}
|
|
164
|
+
.debug-info[open] {
|
|
165
|
+
opacity: 1;
|
|
166
|
+
}
|
|
167
|
+
div.state-debug {
|
|
168
|
+
display: grid;
|
|
169
|
+
width: 100%;
|
|
170
|
+
padding: 8px 8px 16px 8px;
|
|
171
|
+
grid-template-columns: 20vmin 1fr;
|
|
172
|
+
align-items: center;
|
|
173
|
+
gap: 0.75rem 0.25rem;
|
|
174
|
+
background-color: #1e1e1e;
|
|
175
|
+
border-radius: 4px;
|
|
176
|
+
margin-top: 8px;
|
|
177
|
+
}
|
|
178
|
+
p {
|
|
179
|
+
font-size: var(--theme-font-size-xxs);
|
|
180
|
+
font-family: "Geist Mono", monospace;
|
|
181
|
+
padding: 0;
|
|
182
|
+
margin: 0;
|
|
183
|
+
color: rgba(255, 255, 255, 0.7);
|
|
184
|
+
overflow-wrap: anywhere;
|
|
185
|
+
line-height: 100%;
|
|
186
|
+
font-variant: tabular-nums;
|
|
187
|
+
}
|
|
188
|
+
.state-value {
|
|
189
|
+
color: white;
|
|
190
|
+
}
|
|
191
|
+
#video-progress-bar {
|
|
192
|
+
width: 100%;
|
|
193
|
+
background-color: rgba(255, 255, 255, 0.2);
|
|
194
|
+
height: 2px;
|
|
195
|
+
border-radius: 50px;
|
|
196
|
+
}
|
|
197
|
+
#video-progress-bar div {
|
|
198
|
+
background-color: white;
|
|
199
|
+
border-radius: 50px;
|
|
200
|
+
}
|
|
201
|
+
.tag {
|
|
202
|
+
padding: 0.1rem 0.2rem;
|
|
203
|
+
border-radius: 4px;
|
|
204
|
+
background-color: rgba(255, 255, 255, 0.2);
|
|
205
|
+
text-transform: uppercase;
|
|
206
|
+
font-weight: 500;
|
|
207
|
+
}</style>
|