@onsvisual/svelte-components 1.0.44 → 1.0.45

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 (224) hide show
  1. package/README.md +24 -24
  2. package/dist/css/main.css +513 -2
  3. package/dist/datavis/BarChart/BarChart.stories.svelte +84 -84
  4. package/dist/datavis/BarChart/docs/component.md +19 -19
  5. package/dist/datavis/Chart/Chart.stories.svelte +128 -128
  6. package/dist/datavis/Chart/docs/component.md +31 -31
  7. package/dist/datavis/Chart/docs/example.md +28 -28
  8. package/dist/datavis/ColumnChart/ColumnChart.stories.svelte +84 -84
  9. package/dist/datavis/ColumnChart/docs/component.md +19 -19
  10. package/dist/datavis/DataCard/DataCard.stories.svelte +45 -45
  11. package/dist/datavis/DataCard/DataCard.svelte +70 -70
  12. package/dist/datavis/DataCard/Sparkline.svelte +117 -117
  13. package/dist/datavis/DataCard/docs/component.md +20 -20
  14. package/dist/datavis/DataCard/docs/example.md +25 -25
  15. package/dist/datavis/DotPlotChart/DotPlotChart.stories.svelte +40 -40
  16. package/dist/datavis/DotPlotChart/docs/component.md +19 -19
  17. package/dist/datavis/LineChart/LineChart.stories.svelte +64 -64
  18. package/dist/datavis/LineChart/docs/component.md +31 -31
  19. package/dist/datavis/ScatterChart/ScatterChart.stories.svelte +55 -55
  20. package/dist/datavis/ScatterChart/docs/component.md +53 -53
  21. package/dist/datavis/Table/Table.stories.svelte +48 -48
  22. package/dist/datavis/Table/Table.svelte +161 -161
  23. package/dist/datavis/Table/docs/component.md +20 -20
  24. package/dist/datavis/demo-data/data-scatter.js +40 -40
  25. package/dist/datavis/demo-data/data.js +18 -18
  26. package/dist/datavis/intro.mdx +21 -21
  27. package/dist/decorators/Blockquote/Blockquote.stories.svelte +25 -25
  28. package/dist/decorators/Blockquote/Blockquote.svelte +27 -27
  29. package/dist/decorators/Blockquote/docs/component.md +10 -10
  30. package/dist/decorators/Divider/Divider.stories.svelte +29 -29
  31. package/dist/decorators/Divider/Divider.svelte +52 -52
  32. package/dist/decorators/Divider/docs/component.md +12 -12
  33. package/dist/decorators/Em/Em.stories.svelte +30 -30
  34. package/dist/decorators/Em/Em.svelte +58 -58
  35. package/dist/decorators/Em/docs/component.md +12 -12
  36. package/dist/decorators/Icon/Icon.stories.svelte +27 -27
  37. package/dist/decorators/Icon/Icon.svelte +101 -93
  38. package/dist/decorators/Icon/Icon.svelte.d.ts +2 -2
  39. package/dist/decorators/Icon/docs/component.md +10 -10
  40. package/dist/decorators/Indent/Indent.stories.svelte +22 -22
  41. package/dist/decorators/Indent/Indent.svelte +3 -3
  42. package/dist/decorators/Indent/docs/component.md +10 -10
  43. package/dist/index.js +86 -86
  44. package/dist/inputs/Button/Button.stories.svelte +70 -70
  45. package/dist/inputs/Button/Button.svelte +152 -152
  46. package/dist/inputs/Button/Button.svelte.d.ts +2 -2
  47. package/dist/inputs/Button/docs/component.md +17 -17
  48. package/dist/inputs/ButtonGroup/ButtonGroup.stories.svelte +40 -40
  49. package/dist/inputs/ButtonGroup/ButtonGroup.svelte +57 -57
  50. package/dist/inputs/ButtonGroup/ButtonGroupItem.svelte +101 -101
  51. package/dist/inputs/ButtonGroup/docs/component.md +23 -23
  52. package/dist/inputs/Checkbox/Checkbox.stories.svelte +34 -34
  53. package/dist/inputs/Checkbox/Checkbox.svelte +180 -180
  54. package/dist/inputs/Checkbox/docs/component.md +14 -14
  55. package/dist/inputs/Checkboxes/Checkboxes.stories.svelte +34 -34
  56. package/dist/inputs/Checkboxes/Checkboxes.svelte +62 -62
  57. package/dist/inputs/Checkboxes/docs/component.md +20 -20
  58. package/dist/inputs/Checkboxes/docs/example.md +16 -16
  59. package/dist/inputs/Dropdown/Dropdown.stories.svelte +54 -54
  60. package/dist/inputs/Dropdown/Dropdown.svelte +66 -66
  61. package/dist/inputs/Dropdown/docs/component.md +22 -22
  62. package/dist/inputs/ErrorPanel/ErrorPanel.stories.svelte +25 -25
  63. package/dist/inputs/ErrorPanel/ErrorPanel.svelte +24 -24
  64. package/dist/inputs/ErrorPanel/docs/component.md +14 -14
  65. package/dist/inputs/ErrorSummary/ErrorSummary.stories.svelte +34 -34
  66. package/dist/inputs/ErrorSummary/ErrorSummary.svelte +47 -47
  67. package/dist/inputs/ErrorSummary/docs/component.md +17 -17
  68. package/dist/inputs/ErrorSummary/docs/example.md +12 -12
  69. package/dist/inputs/Input/Input.stories.svelte +73 -73
  70. package/dist/inputs/Input/Input.svelte +151 -151
  71. package/dist/inputs/Input/docs/component.md +16 -16
  72. package/dist/inputs/Radios/Radio.svelte +90 -90
  73. package/dist/inputs/Radios/Radios.stories.svelte +51 -51
  74. package/dist/inputs/Radios/Radios.svelte +62 -62
  75. package/dist/inputs/Radios/docs/component.md +24 -24
  76. package/dist/inputs/Radios/docs/example.md +21 -21
  77. package/dist/inputs/Select/Select.stories.svelte +63 -63
  78. package/dist/inputs/Select/Select.svelte +326 -326
  79. package/dist/inputs/Select/docs/component.md +27 -27
  80. package/dist/inputs/Textarea/Textarea.stories.svelte +40 -40
  81. package/dist/inputs/Textarea/Textarea.svelte +113 -113
  82. package/dist/inputs/Textarea/docs/component.md +16 -16
  83. package/dist/inputs/Toolbar/HelpModal.svelte +234 -234
  84. package/dist/inputs/Toolbar/ToolControl.svelte +23 -23
  85. package/dist/inputs/Toolbar/ToolControls.svelte +9 -9
  86. package/dist/inputs/Toolbar/Toolbar.stories.svelte +148 -148
  87. package/dist/inputs/Toolbar/Toolbar.svelte +70 -70
  88. package/dist/inputs/Toolbar/ToolbarButton.svelte +184 -184
  89. package/dist/inputs/Toolbar/ToolbarDivider.svelte +29 -29
  90. package/dist/inputs/Toolbar/ToolbarIcon.svelte +106 -106
  91. package/dist/inputs/Toolbar/ToolbarsContainer.svelte +69 -69
  92. package/dist/inputs/Toolbar/docs/component.md +101 -101
  93. package/dist/intro.mdx +66 -66
  94. package/dist/js/menuOptions.js +14 -14
  95. package/dist/js/utils.js +133 -133
  96. package/dist/js/withParams.js +43 -43
  97. package/dist/layout/Accordion/Accordion.stories.svelte +30 -30
  98. package/dist/layout/Accordion/Accordion.svelte +55 -55
  99. package/dist/layout/Accordion/AccordionItem.svelte +51 -51
  100. package/dist/layout/Accordion/accordion.js +64 -64
  101. package/dist/layout/Accordion/details.js +83 -83
  102. package/dist/layout/Accordion/docs/component.md +19 -19
  103. package/dist/layout/AnalyticsBanner/AnalyticsBanner.stories.svelte +16 -16
  104. package/dist/layout/AnalyticsBanner/AnalyticsBanner.svelte +314 -314
  105. package/dist/layout/AnalyticsBanner/docs/component.md +44 -44
  106. package/dist/layout/BackLink/BackLink.stories.svelte +16 -16
  107. package/dist/layout/BackLink/BackLink.svelte +30 -30
  108. package/dist/layout/BackLink/docs/component.md +12 -12
  109. package/dist/layout/Breadcrumb/Breadcrumb.stories.svelte +31 -31
  110. package/dist/layout/Breadcrumb/Breadcrumb.svelte +69 -69
  111. package/dist/layout/Breadcrumb/docs/component.md +15 -15
  112. package/dist/layout/Card/Card.stories.svelte +39 -39
  113. package/dist/layout/Card/Card.svelte +127 -127
  114. package/dist/layout/Card/docs/component.md +14 -14
  115. package/dist/layout/Card/docs/eg-images.md +27 -27
  116. package/dist/layout/Card/docs/eg-links.md +12 -12
  117. package/dist/layout/Card/docs/eg-spans.md +12 -12
  118. package/dist/layout/Contents/Contents.stories.svelte +27 -27
  119. package/dist/layout/Contents/Contents.svelte +51 -51
  120. package/dist/layout/Contents/docs/component.md +18 -18
  121. package/dist/layout/DescriptionList/DescriptionList.stories.svelte +22 -22
  122. package/dist/layout/DescriptionList/DescriptionList.svelte +59 -59
  123. package/dist/layout/DescriptionList/docs/component.md +18 -18
  124. package/dist/layout/Details/Details.stories.svelte +32 -32
  125. package/dist/layout/Details/Details.svelte +75 -75
  126. package/dist/layout/Details/docs/component.md +14 -14
  127. package/dist/layout/DocumentList/Document.svelte +103 -103
  128. package/dist/layout/DocumentList/DocumentList.stories.svelte +88 -88
  129. package/dist/layout/DocumentList/DocumentList.svelte +33 -33
  130. package/dist/layout/DocumentList/docs/component.md +28 -28
  131. package/dist/layout/DocumentList/docs/example.md +23 -23
  132. package/dist/layout/ErrorPage/ErrorPage.stories.svelte +18 -18
  133. package/dist/layout/ErrorPage/ErrorPage.svelte +48 -48
  134. package/dist/layout/ErrorPage/docs/component.md +13 -13
  135. package/dist/layout/Footer/Footer.stories.svelte +24 -24
  136. package/dist/layout/Footer/Footer.svelte +366 -366
  137. package/dist/layout/Footer/docs/component.md +10 -10
  138. package/dist/layout/Grid/Grid.stories.svelte +50 -50
  139. package/dist/layout/Grid/Grid.svelte +117 -117
  140. package/dist/layout/Grid/GridCell.svelte +65 -65
  141. package/dist/layout/Grid/docs/component.md +14 -14
  142. package/dist/layout/Header/Header.stories.svelte +26 -26
  143. package/dist/layout/Header/Header.svelte +875 -875
  144. package/dist/layout/Header/docs/component.md +11 -11
  145. package/dist/layout/Hero/Hero.stories.svelte +79 -79
  146. package/dist/layout/Hero/Hero.svelte +364 -364
  147. package/dist/layout/Hero/docs/component.md +14 -14
  148. package/dist/layout/Highlight/Highlight.stories.svelte +29 -29
  149. package/dist/layout/Highlight/Highlight.svelte +77 -77
  150. package/dist/layout/Highlight/docs/component.md +12 -12
  151. package/dist/layout/Image/Image.stories.svelte +23 -23
  152. package/dist/layout/Image/Image.svelte +29 -29
  153. package/dist/layout/Image/docs/component.md +15 -15
  154. package/dist/layout/List/Li.svelte +3 -3
  155. package/dist/layout/List/List.stories.svelte +40 -40
  156. package/dist/layout/List/List.svelte +46 -46
  157. package/dist/layout/List/docs/component.md +14 -14
  158. package/dist/layout/List/docs/example.md +12 -12
  159. package/dist/layout/NavSections/NavSection.svelte +90 -90
  160. package/dist/layout/NavSections/NavSections.stories.svelte +51 -51
  161. package/dist/layout/NavSections/NavSections.svelte +160 -160
  162. package/dist/layout/NavSections/docs/component.md +25 -25
  163. package/dist/layout/Notice/Notice.stories.svelte +61 -61
  164. package/dist/layout/Notice/Notice.svelte +56 -56
  165. package/dist/layout/Notice/docs/component.md +14 -14
  166. package/dist/layout/PhaseBanner/PhaseBanner.stories.svelte +24 -24
  167. package/dist/layout/PhaseBanner/PhaseBanner.svelte +66 -66
  168. package/dist/layout/PhaseBanner/docs/component.md +14 -14
  169. package/dist/layout/RelatedContent/RelatedContent.stories.svelte +36 -36
  170. package/dist/layout/RelatedContent/RelatedContent.svelte +54 -54
  171. package/dist/layout/RelatedContent/docs/component.md +16 -16
  172. package/dist/layout/Scroller/Scroller.stories.svelte +60 -60
  173. package/dist/layout/Scroller/Scroller.svelte +368 -368
  174. package/dist/layout/Scroller/ScrollerSection.svelte +70 -70
  175. package/dist/layout/Scroller/docs/component.md +39 -39
  176. package/dist/layout/Section/Section.stories.svelte +33 -33
  177. package/dist/layout/Section/Section.svelte +60 -60
  178. package/dist/layout/Section/docs/component.md +12 -12
  179. package/dist/layout/ShareButtons/ShareButtons.stories.svelte +20 -20
  180. package/dist/layout/ShareButtons/ShareButtons.svelte +131 -131
  181. package/dist/layout/ShareButtons/docs/component.md +14 -14
  182. package/dist/layout/SkipLink/SkipLink.stories.svelte +16 -16
  183. package/dist/layout/SkipLink/SkipLink.svelte +9 -9
  184. package/dist/layout/SkipLink/docs/component.md +11 -11
  185. package/dist/layout/Summary/Summary.stories.svelte +21 -21
  186. package/dist/layout/Summary/Summary.svelte +60 -60
  187. package/dist/layout/Summary/docs/component.md +17 -17
  188. package/dist/layout/Tabs/Tab.svelte +53 -53
  189. package/dist/layout/Tabs/Tabs.stories.svelte +29 -29
  190. package/dist/layout/Tabs/Tabs.svelte +89 -89
  191. package/dist/layout/Tabs/docs/component.md +16 -16
  192. package/dist/layout/Tabs/tabs.js +302 -302
  193. package/dist/layout/Timeline/Timeline.stories.svelte +44 -44
  194. package/dist/layout/Timeline/Timeline.svelte +17 -17
  195. package/dist/layout/Timeline/TimelineItem.svelte +14 -14
  196. package/dist/layout/Timeline/docs/component.md +27 -27
  197. package/dist/layout/Timeline/docs/example.md +20 -20
  198. package/dist/templates/EmbedArticle/EmbedArticle.stories.svelte +72 -72
  199. package/dist/templates/EmbedArticle/docs/component.md +56 -56
  200. package/dist/templates/FeatureArticle/FeatureArticle.stories.svelte +150 -150
  201. package/dist/templates/FeatureArticle/docs/component.md +125 -125
  202. package/dist/templates/StandardArticle/StandardArticle.stories.svelte +86 -86
  203. package/dist/templates/StandardArticle/docs/component.md +76 -76
  204. package/dist/templates/intro.mdx +18 -18
  205. package/dist/wrappers/Container/Container.stories.svelte +38 -38
  206. package/dist/wrappers/Container/Container.svelte +77 -77
  207. package/dist/wrappers/Container/docs/component.md +12 -12
  208. package/dist/wrappers/Embed/Embed.stories.svelte +24 -24
  209. package/dist/wrappers/Embed/Embed.svelte +44 -44
  210. package/dist/wrappers/Embed/docs/component.md +15 -15
  211. package/dist/wrappers/LazyLoad/LazyLoad.stories.svelte +37 -37
  212. package/dist/wrappers/LazyLoad/LazyLoad.svelte +50 -50
  213. package/dist/wrappers/LazyLoad/docs/component.md +29 -29
  214. package/dist/wrappers/Main/Main.stories.svelte +24 -24
  215. package/dist/wrappers/Main/Main.svelte +11 -11
  216. package/dist/wrappers/Main/docs/component.md +16 -16
  217. package/dist/wrappers/Observe/Observe.stories.svelte +29 -29
  218. package/dist/wrappers/Observe/Observe.svelte +40 -40
  219. package/dist/wrappers/Observe/docs/component.md +22 -22
  220. package/dist/wrappers/Theme/Theme.stories.svelte +70 -70
  221. package/dist/wrappers/Theme/Theme.svelte +76 -76
  222. package/dist/wrappers/Theme/docs/component.md +10 -10
  223. package/dist/wrappers/Theme/themes.js +70 -70
  224. package/package.json +88 -88
@@ -1,368 +1,368 @@
1
- <script context="module">
2
- // Based on svelte-scroller by Rich Harris
3
- // https://github.com/sveltejs/svelte-scroller
4
- // Extended to allow for split-screen mode, section IDs and on:change event
5
- const handlers = [];
6
- let manager;
7
-
8
- if (typeof window !== "undefined") {
9
- const run_all = () => handlers.forEach((fn) => fn());
10
-
11
- window.addEventListener("scroll", run_all);
12
- window.addEventListener("resize", run_all);
13
- }
14
-
15
- if (typeof IntersectionObserver !== "undefined") {
16
- const map = new Map();
17
-
18
- const observer = new IntersectionObserver(
19
- (entries, observer) => {
20
- entries.forEach((entry) => {
21
- const update = map.get(entry.target);
22
- const index = handlers.indexOf(update);
23
-
24
- if (entry.isIntersecting) {
25
- if (index === -1) handlers.push(update);
26
- } else {
27
- update();
28
- if (index !== -1) handlers.splice(index, 1);
29
- }
30
- });
31
- },
32
- {
33
- rootMargin: "400px 0px" // TODO why 400?
34
- }
35
- );
36
-
37
- manager = {
38
- add: ({ outer, update }) => {
39
- const { top, bottom } = outer.getBoundingClientRect();
40
-
41
- if (top < window.innerHeight && bottom > 0) handlers.push(update);
42
-
43
- map.set(outer, update);
44
- observer.observe(outer);
45
- },
46
-
47
- remove: ({ outer, update }) => {
48
- if (map.get(outer)) {
49
- const index = handlers.indexOf(update);
50
- if (index !== -1) handlers.splice(index, 1);
51
-
52
- map.delete(outer);
53
- observer.unobserve(outer);
54
- }
55
- }
56
- };
57
- } else {
58
- manager = {
59
- add: ({ update }) => {
60
- handlers.push(update);
61
- },
62
-
63
- remove: ({ update }) => {
64
- const index = handlers.indexOf(update);
65
- if (index !== -1) handlers.splice(index, 1);
66
- }
67
- };
68
- }
69
- </script>
70
-
71
- <script>
72
- import { onMount, setContext, createEventDispatcher } from "svelte";
73
- import { writable } from "svelte/store";
74
-
75
- const dispatch = createEventDispatcher();
76
-
77
- // config
78
- /**
79
- * Sets the unique ID of the scroller
80
- * @type {string}
81
- */
82
- export let id = null;
83
- /**
84
- * Enables splitscreen view (captions appear on left on larger screens)
85
- * @type {boolean}
86
- */
87
- export let splitscreen = false;
88
- /**
89
- * Adds a margin under the scroller section
90
- * @type {boolean}
91
- */
92
- export let marginTop = false;
93
- /**
94
- * Adds a margin under the scroller section
95
- * @type {boolean}
96
- */
97
- export let marginBottom = true;
98
- /**
99
- * Set the threshold for the transition between scroller sections (0-1)
100
- * @type {number}
101
- */
102
- export let threshold = 0.7;
103
-
104
- let top = 0;
105
- let bottom = 1;
106
- let parallax = false;
107
-
108
- // bindings
109
- /**
110
- * Binding: Total number of sections within scroller
111
- * @type {number}
112
- */
113
- export let count = 0;
114
- /**
115
- * Binding: Current section index (number)
116
- * @type {number|null}
117
- */
118
- export let index = null;
119
- /**
120
- * Binding: Current section id, if it has one set
121
- * @type {string|null}
122
- */
123
- export let sectionId = null; // ID for current section within scroller
124
- /**
125
- * Binding: The progress between the start of current scroller section and next (0-1)
126
- * @type {number}
127
- */
128
- export let offset = 0;
129
- /**
130
- * Binding: The progress through the whole scroller (0-1)
131
- * @type {number}
132
- */
133
- export let progress = 0;
134
- /**
135
- * Binding: Whether the scroller is visible on screen or not
136
- * @type {boolean}
137
- */
138
- export let visible = false;
139
- /**
140
- * Optional: Set an additional CSS class for the component
141
- * @type {string|null}
142
- */
143
- export let cls = null;
144
-
145
- const sections = writable([]);
146
- setContext("sections", sections);
147
-
148
- let scroller;
149
- let outer;
150
- let foreground;
151
- let background;
152
- let left;
153
- let wh = 0;
154
- let fixed;
155
- let offset_top = 0;
156
- let width = 1;
157
- let height;
158
- let inverted;
159
-
160
- $: top_px = Math.round(top * wh);
161
- $: bottom_px = Math.round(bottom * wh);
162
- $: threshold_px = Math.round(threshold * wh);
163
-
164
- $: top, bottom, threshold, parallax, update();
165
-
166
- $: style = `
167
- position: ${fixed ? "fixed" : "absolute"};
168
- top: 0;
169
- transform: translate(0, ${offset_top}px);
170
- z-index: ${inverted ? 3 : 1};
171
- `;
172
-
173
- $: widthStyle = fixed ? `width:${width}px;` : "";
174
-
175
- function initSections(sections) {
176
- if (scroller) manager.remove(scroller);
177
-
178
- count = sections.length;
179
-
180
- update();
181
-
182
- scroller = { outer, update };
183
-
184
- manager.add(scroller);
185
- return () => manager.remove(scroller);
186
- }
187
- $: outer && initSections($sections);
188
-
189
- function update() {
190
- if (!foreground) return;
191
-
192
- // re-measure outer container
193
- const bcr = outer.getBoundingClientRect();
194
- left = bcr.left;
195
- width = bcr.right - left;
196
-
197
- // determine fix state
198
- const fg = foreground.getBoundingClientRect();
199
- const bg = background.getBoundingClientRect();
200
-
201
- const visible_new = fg.top < wh && fg.bottom > 0;
202
- const entered = visible_new && !visible;
203
- const exited = !visible_new && visible;
204
- visible = visible_new;
205
-
206
- const foreground_height = fg.bottom - fg.top;
207
- const background_height = bg.bottom - bg.top;
208
-
209
- const available_space = bottom_px - top_px;
210
- progress = (top_px - fg.top) / (foreground_height - available_space);
211
-
212
- if (progress <= 0) {
213
- offset_top = 0;
214
- fixed = false;
215
- } else if (progress >= 1) {
216
- offset_top = parallax
217
- ? foreground_height - background_height
218
- : foreground_height - available_space;
219
- fixed = false;
220
- } else {
221
- offset_top = parallax
222
- ? Math.round(top_px - progress * (background_height - available_space))
223
- : top_px;
224
- fixed = true;
225
- }
226
-
227
- for (let i = 0; i < $sections.length; i++) {
228
- const section = $sections[i];
229
- const { top } = section.getBoundingClientRect();
230
-
231
- const next = $sections[i + 1];
232
- const bottom = next ? next.getBoundingClientRect().top : fg.bottom;
233
-
234
- offset = (threshold_px - top) / (bottom - top);
235
- if (bottom >= threshold_px) {
236
- if (index !== i) {
237
- index = i;
238
- sectionId = section.dataset.id ? section.dataset.id : null;
239
- dispatch("change", { id, index, sectionId });
240
- }
241
- break;
242
- }
243
- }
244
-
245
- if (entered) {
246
- dispatch("enter", { id, index, sectionId });
247
- dispatch("change", { id, index, sectionId });
248
- }
249
- if (exited) dispatch("exit", { id, index, sectionId });
250
- }
251
- </script>
252
-
253
- <svelte:window bind:innerHeight={wh} />
254
-
255
- {#if marginTop}
256
- <div class="ons-u-mt-xl"></div>
257
- {/if}
258
-
259
- <svelte-scroller-outer {id} bind:this={outer} class={cls} class:splitscreen>
260
- <svelte-scroller-background-container class="background-container" style="{style}{widthStyle}">
261
- <svelte-scroller-background bind:this={background}>
262
- <slot name="background" />
263
- </svelte-scroller-background>
264
- </svelte-scroller-background-container>
265
-
266
- <svelte-scroller-foreground bind:this={foreground}>
267
- <slot name="foreground" />
268
- </svelte-scroller-foreground>
269
- </svelte-scroller-outer>
270
-
271
- {#if marginBottom}
272
- <div class="ons-u-mb-xl"></div>
273
- {/if}
274
-
275
- <style>
276
- svelte-scroller-outer {
277
- display: block;
278
- position: relative;
279
- }
280
-
281
- svelte-scroller-background {
282
- display: block;
283
- position: relative;
284
- width: 100%;
285
- }
286
-
287
- svelte-scroller-foreground {
288
- display: block;
289
- position: relative;
290
- z-index: 2;
291
- }
292
-
293
- svelte-scroller-foreground::after {
294
- content: " ";
295
- display: block;
296
- clear: both;
297
- }
298
-
299
- svelte-scroller-background-container {
300
- display: block;
301
- position: absolute;
302
- width: 100%;
303
- max-width: 100%;
304
- pointer-events: none;
305
- /* height: 100%; */
306
-
307
- /* in theory this helps prevent jumping */
308
- will-change: transform;
309
- /* -webkit-transform: translate3d(0, 0, 0);
310
- -moz-transform: translate3d(0, 0, 0);
311
- transform: translate3d(0, 0, 0); */
312
- }
313
-
314
- svelte-scroller-background-container {
315
- pointer-events: all !important;
316
- }
317
-
318
- :global([slot="foreground"] section) {
319
- padding: 40vh 0 100vh 0;
320
- }
321
-
322
- :global([slot="foreground"] section + section) {
323
- padding: 0 0 100vh 0;
324
- }
325
-
326
- :global([slot="foreground"] section:last-of-type) {
327
- padding: 0 0 70vh 0;
328
- }
329
-
330
- :global([slot="foreground"] section > div) {
331
- position: relative;
332
- }
333
-
334
- :global([slot="foreground"] section > div:before) {
335
- background-color: var(--background, white);
336
- opacity: 80%;
337
- }
338
-
339
- :global([slot="foreground"] section div p) {
340
- margin: 0;
341
- }
342
-
343
- :global([slot="foreground"] section div p + p) {
344
- margin-top: 30px;
345
- }
346
-
347
- :global([slot="foreground"] section div h2),
348
- :global([slot="foreground"] section div h3) {
349
- margin: 10px 0 20px 0;
350
- }
351
-
352
- @media (min-width: 992px) {
353
- .splitscreen svelte-scroller-background {
354
- width: calc(100% - 480px) !important;
355
- min-width: 65%;
356
- margin: 0 0 0 auto;
357
- }
358
- :global(.splitscreen [slot="foreground"] section div::before) {
359
- opacity: 0;
360
- }
361
- :global(.splitscreen [slot="foreground"] section) {
362
- width: 480px;
363
- max-width: 35%;
364
- margin: 0 auto 0 0;
365
- background-color: var(--background, white);
366
- }
367
- }
368
- </style>
1
+ <script context="module">
2
+ // Based on svelte-scroller by Rich Harris
3
+ // https://github.com/sveltejs/svelte-scroller
4
+ // Extended to allow for split-screen mode, section IDs and on:change event
5
+ const handlers = [];
6
+ let manager;
7
+
8
+ if (typeof window !== "undefined") {
9
+ const run_all = () => handlers.forEach((fn) => fn());
10
+
11
+ window.addEventListener("scroll", run_all);
12
+ window.addEventListener("resize", run_all);
13
+ }
14
+
15
+ if (typeof IntersectionObserver !== "undefined") {
16
+ const map = new Map();
17
+
18
+ const observer = new IntersectionObserver(
19
+ (entries, observer) => {
20
+ entries.forEach((entry) => {
21
+ const update = map.get(entry.target);
22
+ const index = handlers.indexOf(update);
23
+
24
+ if (entry.isIntersecting) {
25
+ if (index === -1) handlers.push(update);
26
+ } else {
27
+ update();
28
+ if (index !== -1) handlers.splice(index, 1);
29
+ }
30
+ });
31
+ },
32
+ {
33
+ rootMargin: "400px 0px" // TODO why 400?
34
+ }
35
+ );
36
+
37
+ manager = {
38
+ add: ({ outer, update }) => {
39
+ const { top, bottom } = outer.getBoundingClientRect();
40
+
41
+ if (top < window.innerHeight && bottom > 0) handlers.push(update);
42
+
43
+ map.set(outer, update);
44
+ observer.observe(outer);
45
+ },
46
+
47
+ remove: ({ outer, update }) => {
48
+ if (map.get(outer)) {
49
+ const index = handlers.indexOf(update);
50
+ if (index !== -1) handlers.splice(index, 1);
51
+
52
+ map.delete(outer);
53
+ observer.unobserve(outer);
54
+ }
55
+ }
56
+ };
57
+ } else {
58
+ manager = {
59
+ add: ({ update }) => {
60
+ handlers.push(update);
61
+ },
62
+
63
+ remove: ({ update }) => {
64
+ const index = handlers.indexOf(update);
65
+ if (index !== -1) handlers.splice(index, 1);
66
+ }
67
+ };
68
+ }
69
+ </script>
70
+
71
+ <script>
72
+ import { onMount, setContext, createEventDispatcher } from "svelte";
73
+ import { writable } from "svelte/store";
74
+
75
+ const dispatch = createEventDispatcher();
76
+
77
+ // config
78
+ /**
79
+ * Sets the unique ID of the scroller
80
+ * @type {string}
81
+ */
82
+ export let id = null;
83
+ /**
84
+ * Enables splitscreen view (captions appear on left on larger screens)
85
+ * @type {boolean}
86
+ */
87
+ export let splitscreen = false;
88
+ /**
89
+ * Adds a margin under the scroller section
90
+ * @type {boolean}
91
+ */
92
+ export let marginTop = false;
93
+ /**
94
+ * Adds a margin under the scroller section
95
+ * @type {boolean}
96
+ */
97
+ export let marginBottom = true;
98
+ /**
99
+ * Set the threshold for the transition between scroller sections (0-1)
100
+ * @type {number}
101
+ */
102
+ export let threshold = 0.7;
103
+
104
+ let top = 0;
105
+ let bottom = 1;
106
+ let parallax = false;
107
+
108
+ // bindings
109
+ /**
110
+ * Binding: Total number of sections within scroller
111
+ * @type {number}
112
+ */
113
+ export let count = 0;
114
+ /**
115
+ * Binding: Current section index (number)
116
+ * @type {number|null}
117
+ */
118
+ export let index = null;
119
+ /**
120
+ * Binding: Current section id, if it has one set
121
+ * @type {string|null}
122
+ */
123
+ export let sectionId = null; // ID for current section within scroller
124
+ /**
125
+ * Binding: The progress between the start of current scroller section and next (0-1)
126
+ * @type {number}
127
+ */
128
+ export let offset = 0;
129
+ /**
130
+ * Binding: The progress through the whole scroller (0-1)
131
+ * @type {number}
132
+ */
133
+ export let progress = 0;
134
+ /**
135
+ * Binding: Whether the scroller is visible on screen or not
136
+ * @type {boolean}
137
+ */
138
+ export let visible = false;
139
+ /**
140
+ * Optional: Set an additional CSS class for the component
141
+ * @type {string|null}
142
+ */
143
+ export let cls = null;
144
+
145
+ const sections = writable([]);
146
+ setContext("sections", sections);
147
+
148
+ let scroller;
149
+ let outer;
150
+ let foreground;
151
+ let background;
152
+ let left;
153
+ let wh = 0;
154
+ let fixed;
155
+ let offset_top = 0;
156
+ let width = 1;
157
+ let height;
158
+ let inverted;
159
+
160
+ $: top_px = Math.round(top * wh);
161
+ $: bottom_px = Math.round(bottom * wh);
162
+ $: threshold_px = Math.round(threshold * wh);
163
+
164
+ $: top, bottom, threshold, parallax, update();
165
+
166
+ $: style = `
167
+ position: ${fixed ? "fixed" : "absolute"};
168
+ top: 0;
169
+ transform: translate(0, ${offset_top}px);
170
+ z-index: ${inverted ? 3 : 1};
171
+ `;
172
+
173
+ $: widthStyle = fixed ? `width:${width}px;` : "";
174
+
175
+ function initSections(sections) {
176
+ if (scroller) manager.remove(scroller);
177
+
178
+ count = sections.length;
179
+
180
+ update();
181
+
182
+ scroller = { outer, update };
183
+
184
+ manager.add(scroller);
185
+ return () => manager.remove(scroller);
186
+ }
187
+ $: outer && initSections($sections);
188
+
189
+ function update() {
190
+ if (!foreground) return;
191
+
192
+ // re-measure outer container
193
+ const bcr = outer.getBoundingClientRect();
194
+ left = bcr.left;
195
+ width = bcr.right - left;
196
+
197
+ // determine fix state
198
+ const fg = foreground.getBoundingClientRect();
199
+ const bg = background.getBoundingClientRect();
200
+
201
+ const visible_new = fg.top < wh && fg.bottom > 0;
202
+ const entered = visible_new && !visible;
203
+ const exited = !visible_new && visible;
204
+ visible = visible_new;
205
+
206
+ const foreground_height = fg.bottom - fg.top;
207
+ const background_height = bg.bottom - bg.top;
208
+
209
+ const available_space = bottom_px - top_px;
210
+ progress = (top_px - fg.top) / (foreground_height - available_space);
211
+
212
+ if (progress <= 0) {
213
+ offset_top = 0;
214
+ fixed = false;
215
+ } else if (progress >= 1) {
216
+ offset_top = parallax
217
+ ? foreground_height - background_height
218
+ : foreground_height - available_space;
219
+ fixed = false;
220
+ } else {
221
+ offset_top = parallax
222
+ ? Math.round(top_px - progress * (background_height - available_space))
223
+ : top_px;
224
+ fixed = true;
225
+ }
226
+
227
+ for (let i = 0; i < $sections.length; i++) {
228
+ const section = $sections[i];
229
+ const { top } = section.getBoundingClientRect();
230
+
231
+ const next = $sections[i + 1];
232
+ const bottom = next ? next.getBoundingClientRect().top : fg.bottom;
233
+
234
+ offset = (threshold_px - top) / (bottom - top);
235
+ if (bottom >= threshold_px) {
236
+ if (index !== i) {
237
+ index = i;
238
+ sectionId = section.dataset.id ? section.dataset.id : null;
239
+ dispatch("change", { id, index, sectionId });
240
+ }
241
+ break;
242
+ }
243
+ }
244
+
245
+ if (entered) {
246
+ dispatch("enter", { id, index, sectionId });
247
+ dispatch("change", { id, index, sectionId });
248
+ }
249
+ if (exited) dispatch("exit", { id, index, sectionId });
250
+ }
251
+ </script>
252
+
253
+ <svelte:window bind:innerHeight={wh} />
254
+
255
+ {#if marginTop}
256
+ <div class="ons-u-mt-xl"></div>
257
+ {/if}
258
+
259
+ <svelte-scroller-outer {id} bind:this={outer} class={cls} class:splitscreen>
260
+ <svelte-scroller-background-container class="background-container" style="{style}{widthStyle}">
261
+ <svelte-scroller-background bind:this={background}>
262
+ <slot name="background" />
263
+ </svelte-scroller-background>
264
+ </svelte-scroller-background-container>
265
+
266
+ <svelte-scroller-foreground bind:this={foreground}>
267
+ <slot name="foreground" />
268
+ </svelte-scroller-foreground>
269
+ </svelte-scroller-outer>
270
+
271
+ {#if marginBottom}
272
+ <div class="ons-u-mb-xl"></div>
273
+ {/if}
274
+
275
+ <style>
276
+ svelte-scroller-outer {
277
+ display: block;
278
+ position: relative;
279
+ }
280
+
281
+ svelte-scroller-background {
282
+ display: block;
283
+ position: relative;
284
+ width: 100%;
285
+ }
286
+
287
+ svelte-scroller-foreground {
288
+ display: block;
289
+ position: relative;
290
+ z-index: 2;
291
+ }
292
+
293
+ svelte-scroller-foreground::after {
294
+ content: " ";
295
+ display: block;
296
+ clear: both;
297
+ }
298
+
299
+ svelte-scroller-background-container {
300
+ display: block;
301
+ position: absolute;
302
+ width: 100%;
303
+ max-width: 100%;
304
+ pointer-events: none;
305
+ /* height: 100%; */
306
+
307
+ /* in theory this helps prevent jumping */
308
+ will-change: transform;
309
+ /* -webkit-transform: translate3d(0, 0, 0);
310
+ -moz-transform: translate3d(0, 0, 0);
311
+ transform: translate3d(0, 0, 0); */
312
+ }
313
+
314
+ svelte-scroller-background-container {
315
+ pointer-events: all !important;
316
+ }
317
+
318
+ :global([slot="foreground"] section) {
319
+ padding: 40vh 0 100vh 0;
320
+ }
321
+
322
+ :global([slot="foreground"] section + section) {
323
+ padding: 0 0 100vh 0;
324
+ }
325
+
326
+ :global([slot="foreground"] section:last-of-type) {
327
+ padding: 0 0 70vh 0;
328
+ }
329
+
330
+ :global([slot="foreground"] section > div) {
331
+ position: relative;
332
+ }
333
+
334
+ :global([slot="foreground"] section > div:before) {
335
+ background-color: var(--background, white);
336
+ opacity: 80%;
337
+ }
338
+
339
+ :global([slot="foreground"] section div p) {
340
+ margin: 0;
341
+ }
342
+
343
+ :global([slot="foreground"] section div p + p) {
344
+ margin-top: 30px;
345
+ }
346
+
347
+ :global([slot="foreground"] section div h2),
348
+ :global([slot="foreground"] section div h3) {
349
+ margin: 10px 0 20px 0;
350
+ }
351
+
352
+ @media (min-width: 992px) {
353
+ .splitscreen svelte-scroller-background {
354
+ width: calc(100% - 480px) !important;
355
+ min-width: 65%;
356
+ margin: 0 0 0 auto;
357
+ }
358
+ :global(.splitscreen [slot="foreground"] section div::before) {
359
+ opacity: 0;
360
+ }
361
+ :global(.splitscreen [slot="foreground"] section) {
362
+ width: 480px;
363
+ max-width: 35%;
364
+ margin: 0 auto 0 0;
365
+ background-color: var(--background, white);
366
+ }
367
+ }
368
+ </style>