@reuters-graphics/graphics-components 3.0.11 → 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.
Files changed (76) hide show
  1. package/dist/components/@types/global.d.ts +45 -0
  2. package/dist/components/Framer/Framer.svelte +1 -0
  3. package/dist/components/Scroller/Scroller.mdx +2 -2
  4. package/dist/components/ScrollerBase/ScrollerBase.mdx +0 -5
  5. package/dist/components/ScrollerVideo/Debug.svelte +207 -0
  6. package/dist/components/ScrollerVideo/Debug.svelte.d.ts +5 -0
  7. package/dist/components/ScrollerVideo/ScrollerVideo.mdx +462 -0
  8. package/dist/components/ScrollerVideo/ScrollerVideo.stories.svelte +190 -0
  9. package/dist/components/ScrollerVideo/ScrollerVideo.stories.svelte.d.ts +19 -0
  10. package/dist/components/ScrollerVideo/ScrollerVideo.svelte +292 -0
  11. package/dist/components/ScrollerVideo/ScrollerVideo.svelte.d.ts +58 -0
  12. package/dist/components/ScrollerVideo/ScrollerVideoForeground.svelte +164 -0
  13. package/dist/components/ScrollerVideo/ScrollerVideoForeground.svelte.d.ts +17 -0
  14. package/dist/components/ScrollerVideo/demo/AdvancedUsecases.svelte +114 -0
  15. package/dist/components/ScrollerVideo/demo/AdvancedUsecases.svelte.d.ts +3 -0
  16. package/dist/components/ScrollerVideo/demo/Embedded.svelte +94 -0
  17. package/dist/components/ScrollerVideo/demo/Embedded.svelte.d.ts +3 -0
  18. package/dist/components/ScrollerVideo/demo/WithAi2svelteForegrounds.svelte +117 -0
  19. package/dist/components/ScrollerVideo/demo/WithAi2svelteForegrounds.svelte.d.ts +3 -0
  20. package/dist/components/ScrollerVideo/demo/WithScrollerBase.svelte +80 -0
  21. package/dist/components/ScrollerVideo/demo/WithScrollerBase.svelte.d.ts +3 -0
  22. package/dist/components/ScrollerVideo/demo/WithTextForegrounds.svelte +72 -0
  23. package/dist/components/ScrollerVideo/demo/WithTextForegrounds.svelte.d.ts +18 -0
  24. package/dist/components/ScrollerVideo/demo/graphic/ai2svelte/ai-chart.svelte +631 -0
  25. package/dist/components/ScrollerVideo/demo/graphic/ai2svelte/ai-chart.svelte.d.ts +3 -0
  26. package/dist/components/ScrollerVideo/demo/graphic/ai2svelte/annotation1.svelte +428 -0
  27. package/dist/components/ScrollerVideo/demo/graphic/ai2svelte/annotation1.svelte.d.ts +26 -0
  28. package/dist/components/ScrollerVideo/demo/graphic/ai2svelte/annotation2.svelte +402 -0
  29. package/dist/components/ScrollerVideo/demo/graphic/ai2svelte/annotation2.svelte.d.ts +26 -0
  30. package/dist/components/ScrollerVideo/demo/graphic/ai2svelte/annotation3.svelte +398 -0
  31. package/dist/components/ScrollerVideo/demo/graphic/ai2svelte/annotation3.svelte.d.ts +26 -0
  32. package/dist/components/ScrollerVideo/demo/graphic/ai2svelte/annotation4.svelte +360 -0
  33. package/dist/components/ScrollerVideo/demo/graphic/ai2svelte/annotation4.svelte.d.ts +26 -0
  34. package/dist/components/ScrollerVideo/demo/graphic/imgs/ai-chart-md.png +0 -0
  35. package/dist/components/ScrollerVideo/demo/graphic/imgs/ai-chart-sm.png +0 -0
  36. package/dist/components/ScrollerVideo/demo/graphic/imgs/ai-chart-xs.png +0 -0
  37. package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation1-lg.png +0 -0
  38. package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation1-md.png +0 -0
  39. package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation1-sm.png +0 -0
  40. package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation1-xl.png +0 -0
  41. package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation1-xs.png +0 -0
  42. package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation2-lg.png +0 -0
  43. package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation2-md.png +0 -0
  44. package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation2-sm.png +0 -0
  45. package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation2-xl.png +0 -0
  46. package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation2-xs.png +0 -0
  47. package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation3-lg.png +0 -0
  48. package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation3-md.png +0 -0
  49. package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation3-sm.png +0 -0
  50. package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation3-xl.png +0 -0
  51. package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation3-xs.png +0 -0
  52. package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation4-lg.png +0 -0
  53. package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation4-md.png +0 -0
  54. package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation4-sm.png +0 -0
  55. package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation4-xl.png +0 -0
  56. package/dist/components/ScrollerVideo/demo/graphic/imgs/annotation4-xs.png +0 -0
  57. package/dist/components/ScrollerVideo/ts/ScrollerVideo.d.ts +248 -0
  58. package/dist/components/ScrollerVideo/ts/ScrollerVideo.js +762 -0
  59. package/dist/components/ScrollerVideo/ts/mp4box.d.ts +137 -0
  60. package/dist/components/ScrollerVideo/ts/state.svelte.d.ts +51 -0
  61. package/dist/components/ScrollerVideo/ts/state.svelte.js +25 -0
  62. package/dist/components/ScrollerVideo/ts/utils.d.ts +70 -0
  63. package/dist/components/ScrollerVideo/ts/utils.js +92 -0
  64. package/dist/components/ScrollerVideo/ts/videoDecoder.d.ts +11 -0
  65. package/dist/components/ScrollerVideo/ts/videoDecoder.js +193 -0
  66. package/dist/components/ScrollerVideo/videos/HPO.mp4 +0 -0
  67. package/dist/components/ScrollerVideo/videos/drone.mp4 +0 -0
  68. package/dist/components/ScrollerVideo/videos/goldengate.mp4 +0 -0
  69. package/dist/components/ScrollerVideo/videos/tennis.mp4 +0 -0
  70. package/dist/components/ScrollerVideo/videos/waves_lg.mp4 +0 -0
  71. package/dist/components/ScrollerVideo/videos/waves_md.mp4 +0 -0
  72. package/dist/components/ScrollerVideo/videos/waves_sm.mp4 +0 -0
  73. package/dist/components/SiteHeadline/SiteHeadline.mdx +4 -1
  74. package/dist/index.d.ts +3 -1
  75. package/dist/index.js +2 -0
  76. 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
+ }
@@ -209,6 +209,7 @@ div#preview-label p {
209
209
  }
210
210
 
211
211
  #frame-parent {
212
+ box-sizing: content-box;
212
213
  border: 1px solid #ddd;
213
214
  margin: 0 auto;
214
215
  width: var(--width);
@@ -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 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:
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 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:
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>
@@ -0,0 +1,5 @@
1
+ declare const Debug: import("svelte").Component<{
2
+ componentState: any;
3
+ }, {}, "">;
4
+ type Debug = ReturnType<typeof Debug>;
5
+ export default Debug;