@juspay/svelte-ui-components 2.9.0 → 2.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 (189) hide show
  1. package/README.md +337 -77
  2. package/dist/Accordion/Accordion.svelte +4 -2
  3. package/dist/Accordion/Accordion.svelte.d.ts +2 -4
  4. package/dist/Accordion/properties.d.ts +6 -0
  5. package/dist/Accordion/properties.js +1 -0
  6. package/dist/Animations/ModalAnimation.svelte +11 -9
  7. package/dist/Avatar/Avatar.svelte +122 -0
  8. package/dist/Avatar/Avatar.svelte.d.ts +4 -0
  9. package/dist/Avatar/properties.d.ts +15 -0
  10. package/dist/Avatar/properties.js +1 -0
  11. package/dist/Badge/Badge.svelte +2 -2
  12. package/dist/Badge/properties.d.ts +1 -0
  13. package/dist/Banner/Banner.svelte +132 -48
  14. package/dist/Banner/Banner.svelte.d.ts +1 -1
  15. package/dist/Banner/properties.d.ts +8 -3
  16. package/dist/Book/Book.svelte +281 -0
  17. package/dist/Book/Book.svelte.d.ts +4 -0
  18. package/dist/Book/properties.d.ts +24 -0
  19. package/dist/Book/properties.js +1 -0
  20. package/dist/BrandLoader/BrandLoader.svelte +3 -3
  21. package/dist/BrandLoader/properties.d.ts +1 -0
  22. package/dist/Browser/Browser.svelte +193 -0
  23. package/dist/Browser/Browser.svelte.d.ts +3 -0
  24. package/dist/Browser/properties.d.ts +16 -0
  25. package/dist/Browser/properties.js +1 -0
  26. package/dist/Button/Button.svelte +20 -7
  27. package/dist/Button/properties.d.ts +7 -4
  28. package/dist/Calendar/Calendar.svelte +476 -0
  29. package/dist/Calendar/Calendar.svelte.d.ts +4 -0
  30. package/dist/Calendar/properties.d.ts +30 -0
  31. package/dist/Calendar/properties.js +1 -0
  32. package/dist/Carousel/Carousel.svelte +19 -16
  33. package/dist/Carousel/properties.d.ts +1 -0
  34. package/dist/CheckListItem/CheckListItem.svelte +31 -26
  35. package/dist/CheckListItem/properties.d.ts +4 -1
  36. package/dist/Checkbox/Checkbox.svelte +157 -0
  37. package/dist/Checkbox/Checkbox.svelte.d.ts +4 -0
  38. package/dist/Checkbox/properties.d.ts +17 -0
  39. package/dist/Checkbox/properties.js +1 -0
  40. package/dist/Choicebox/Choicebox.svelte +85 -0
  41. package/dist/Choicebox/Choicebox.svelte.d.ts +4 -0
  42. package/dist/Choicebox/properties.d.ts +14 -0
  43. package/dist/Choicebox/properties.js +1 -0
  44. package/dist/CommandMenu/CommandMenu.svelte +452 -0
  45. package/dist/CommandMenu/CommandMenu.svelte.d.ts +4 -0
  46. package/dist/CommandMenu/properties.d.ts +26 -0
  47. package/dist/CommandMenu/properties.js +1 -0
  48. package/dist/ContextMenu/ContextMenu.svelte +308 -0
  49. package/dist/ContextMenu/ContextMenu.svelte.d.ts +4 -0
  50. package/dist/ContextMenu/properties.d.ts +26 -0
  51. package/dist/ContextMenu/properties.js +1 -0
  52. package/dist/Gauge/Gauge.svelte +70 -0
  53. package/dist/Gauge/Gauge.svelte.d.ts +4 -0
  54. package/dist/Gauge/properties.d.ts +9 -0
  55. package/dist/Gauge/properties.js +1 -0
  56. package/dist/GridItem/GridItem.svelte +5 -4
  57. package/dist/GridItem/properties.d.ts +1 -0
  58. package/dist/Icon/Icon.svelte +3 -3
  59. package/dist/Icon/properties.d.ts +1 -0
  60. package/dist/IconStack/IconStack.svelte +3 -3
  61. package/dist/IconStack/properties.d.ts +1 -0
  62. package/dist/Img/Img.svelte +5 -3
  63. package/dist/Img/properties.d.ts +5 -1
  64. package/dist/Input/Input.svelte +12 -6
  65. package/dist/Input/properties.d.ts +1 -0
  66. package/dist/InputButton/InputButton.svelte +4 -3
  67. package/dist/InputButton/properties.d.ts +5 -6
  68. package/dist/KeyboardInput/KeyboardInput.svelte +93 -0
  69. package/dist/KeyboardInput/KeyboardInput.svelte.d.ts +4 -0
  70. package/dist/KeyboardInput/properties.d.ts +12 -0
  71. package/dist/KeyboardInput/properties.js +1 -0
  72. package/dist/ListItem/ListItem.svelte +31 -28
  73. package/dist/ListItem/properties.d.ts +1 -0
  74. package/dist/Loader/Loader.svelte +10 -6
  75. package/dist/Loader/Loader.svelte.d.ts +3 -25
  76. package/dist/Loader/properties.d.ts +3 -0
  77. package/dist/Loader/properties.js +1 -0
  78. package/dist/LoadingDots/LoadingDots.svelte +64 -0
  79. package/dist/LoadingDots/LoadingDots.svelte.d.ts +3 -0
  80. package/dist/LoadingDots/properties.d.ts +8 -0
  81. package/dist/LoadingDots/properties.js +1 -0
  82. package/dist/Menu/Menu.svelte +349 -0
  83. package/dist/Menu/Menu.svelte.d.ts +4 -0
  84. package/dist/Menu/properties.d.ts +24 -0
  85. package/dist/Menu/properties.js +1 -0
  86. package/dist/Modal/Modal.svelte +10 -9
  87. package/dist/Modal/properties.d.ts +1 -0
  88. package/dist/Pagination/Pagination.svelte +152 -0
  89. package/dist/Pagination/Pagination.svelte.d.ts +4 -0
  90. package/dist/Pagination/properties.d.ts +14 -0
  91. package/dist/Pagination/properties.js +1 -0
  92. package/dist/Phone/Phone.svelte +234 -0
  93. package/dist/Phone/Phone.svelte.d.ts +3 -0
  94. package/dist/Phone/properties.d.ts +11 -0
  95. package/dist/Phone/properties.js +1 -0
  96. package/dist/Pill/Pill.svelte +130 -0
  97. package/dist/Pill/Pill.svelte.d.ts +4 -0
  98. package/dist/Pill/properties.d.ts +16 -0
  99. package/dist/Pill/properties.js +1 -0
  100. package/dist/Progress/Progress.svelte +68 -0
  101. package/dist/Progress/Progress.svelte.d.ts +4 -0
  102. package/dist/Progress/properties.d.ts +10 -0
  103. package/dist/Progress/properties.js +1 -0
  104. package/dist/Radio/Radio.svelte +128 -0
  105. package/dist/Radio/Radio.svelte.d.ts +4 -0
  106. package/dist/Radio/properties.d.ts +15 -0
  107. package/dist/Radio/properties.js +1 -0
  108. package/dist/RelativeTime/RelativeTime.svelte +117 -0
  109. package/dist/RelativeTime/RelativeTime.svelte.d.ts +4 -0
  110. package/dist/RelativeTime/properties.d.ts +13 -0
  111. package/dist/RelativeTime/properties.js +1 -0
  112. package/dist/Scroller/Scroller.svelte +389 -0
  113. package/dist/Scroller/Scroller.svelte.d.ts +4 -0
  114. package/dist/Scroller/properties.d.ts +30 -0
  115. package/dist/Scroller/properties.js +1 -0
  116. package/dist/Select/Select.svelte +382 -344
  117. package/dist/Select/Select.svelte.d.ts +1 -1
  118. package/dist/Select/properties.d.ts +16 -26
  119. package/dist/Sheet/Sheet.svelte +264 -0
  120. package/dist/Sheet/Sheet.svelte.d.ts +4 -0
  121. package/dist/Sheet/properties.d.ts +19 -0
  122. package/dist/Sheet/properties.js +1 -0
  123. package/dist/Shimmer/Shimmer.svelte +44 -0
  124. package/dist/Shimmer/Shimmer.svelte.d.ts +4 -0
  125. package/dist/Shimmer/properties.d.ts +4 -0
  126. package/dist/Shimmer/properties.js +1 -0
  127. package/dist/Slider/Slider.svelte +144 -0
  128. package/dist/Slider/Slider.svelte.d.ts +4 -0
  129. package/dist/Slider/properties.d.ts +17 -0
  130. package/dist/Slider/properties.js +1 -0
  131. package/dist/Snippet/Snippet.svelte +123 -0
  132. package/dist/Snippet/Snippet.svelte.d.ts +4 -0
  133. package/dist/Snippet/properties.d.ts +15 -0
  134. package/dist/Snippet/properties.js +1 -0
  135. package/dist/SplitButton/SplitButton.svelte +135 -0
  136. package/dist/SplitButton/SplitButton.svelte.d.ts +4 -0
  137. package/dist/SplitButton/properties.d.ts +17 -0
  138. package/dist/SplitButton/properties.js +1 -0
  139. package/dist/Status/Status.svelte +5 -3
  140. package/dist/Status/properties.d.ts +1 -0
  141. package/dist/Stepper/Step.svelte +3 -3
  142. package/dist/Stepper/Stepper.svelte +3 -3
  143. package/dist/Stepper/properties.d.ts +2 -0
  144. package/dist/Table/Table.svelte +15 -8
  145. package/dist/Table/properties.d.ts +1 -0
  146. package/dist/Tabs/Tabs.svelte +240 -0
  147. package/dist/Tabs/Tabs.svelte.d.ts +4 -0
  148. package/dist/Tabs/properties.d.ts +16 -0
  149. package/dist/Tabs/properties.js +1 -0
  150. package/dist/ThemeSwitcher/ThemeSwitcher.svelte +249 -0
  151. package/dist/ThemeSwitcher/ThemeSwitcher.svelte.d.ts +4 -0
  152. package/dist/ThemeSwitcher/properties.d.ts +19 -0
  153. package/dist/ThemeSwitcher/properties.js +1 -0
  154. package/dist/Toast/Toast.svelte +25 -30
  155. package/dist/Toast/properties.d.ts +1 -0
  156. package/dist/Toggle/Toggle.svelte +2 -2
  157. package/dist/Toggle/properties.d.ts +1 -0
  158. package/dist/Toolbar/Toolbar.svelte +8 -7
  159. package/dist/Toolbar/properties.d.ts +1 -0
  160. package/dist/Tooltip/Tooltip.svelte +153 -0
  161. package/dist/Tooltip/Tooltip.svelte.d.ts +4 -0
  162. package/dist/Tooltip/properties.d.ts +13 -0
  163. package/dist/Tooltip/properties.js +1 -0
  164. package/dist/assets/battery.svg +5 -0
  165. package/dist/assets/checkmark.svg +3 -0
  166. package/dist/assets/chevron-down-sm.svg +3 -0
  167. package/dist/assets/chevron-down.svg +3 -0
  168. package/dist/assets/chevron-left-lg.svg +3 -0
  169. package/dist/assets/chevron-left.svg +3 -0
  170. package/dist/assets/chevron-right-lg.svg +3 -0
  171. package/dist/assets/chevron-right.svg +3 -0
  172. package/dist/assets/chevron-up.svg +3 -0
  173. package/dist/assets/close.svg +4 -0
  174. package/dist/assets/copy.svg +4 -0
  175. package/dist/assets/error-circle.svg +5 -0
  176. package/dist/assets/lock.svg +3 -0
  177. package/dist/assets/minus.svg +3 -0
  178. package/dist/assets/monitor.svg +5 -0
  179. package/dist/assets/moon.svg +3 -0
  180. package/dist/assets/palette.svg +7 -0
  181. package/dist/assets/search.svg +4 -0
  182. package/dist/assets/signal.svg +6 -0
  183. package/dist/assets/sun.svg +11 -0
  184. package/dist/assets/wifi.svg +3 -0
  185. package/dist/index.d.ts +55 -0
  186. package/dist/index.js +27 -0
  187. package/dist/utils.d.ts +2 -0
  188. package/dist/utils.js +18 -4
  189. package/package.json +26 -1
@@ -0,0 +1,117 @@
1
+ <script lang="ts">
2
+ import type { RelativeTimeProperties } from './properties';
3
+ import Tooltip from '../Tooltip/Tooltip.svelte';
4
+ import { onMount } from 'svelte';
5
+
6
+ let {
7
+ date,
8
+ locale,
9
+ format = 'long',
10
+ updateInterval = 60000,
11
+ tooltip = false,
12
+ testId,
13
+ classes
14
+ }: RelativeTimeProperties = $props();
15
+
16
+ let resolvedDate = $derived(date instanceof Date ? date : new Date(date));
17
+
18
+ let isoString = $derived(resolvedDate.toISOString());
19
+
20
+ let fullDateText = $derived(
21
+ resolvedDate.toLocaleString(locale, {
22
+ dateStyle: 'full',
23
+ timeStyle: 'short'
24
+ })
25
+ );
26
+
27
+ let relativeText = $state('');
28
+
29
+ function computeRelativeTime(): string {
30
+ const now = Date.now();
31
+ const target = resolvedDate.getTime();
32
+ const diffMs = target - now;
33
+ const absDiffMs = Math.abs(diffMs);
34
+
35
+ const seconds = Math.round(absDiffMs / 1000);
36
+ const minutes = Math.round(absDiffMs / 60000);
37
+ const hours = Math.round(absDiffMs / 3600000);
38
+ const days = Math.round(absDiffMs / 86400000);
39
+ const weeks = Math.round(absDiffMs / 604800000);
40
+ const months = Math.round(absDiffMs / 2592000000);
41
+ const years = Math.round(absDiffMs / 31536000000);
42
+
43
+ const formatter = new Intl.RelativeTimeFormat(locale, { style: format });
44
+
45
+ let unit: Intl.RelativeTimeFormatUnit;
46
+ let value: number;
47
+
48
+ if (seconds < 60) {
49
+ unit = 'second';
50
+ value = seconds;
51
+ } else if (minutes < 60) {
52
+ unit = 'minute';
53
+ value = minutes;
54
+ } else if (hours < 24) {
55
+ unit = 'hour';
56
+ value = hours;
57
+ } else if (days < 7) {
58
+ unit = 'day';
59
+ value = days;
60
+ } else if (weeks < 4) {
61
+ unit = 'week';
62
+ value = weeks;
63
+ } else if (months < 12) {
64
+ unit = 'month';
65
+ value = months;
66
+ } else {
67
+ unit = 'year';
68
+ value = years;
69
+ }
70
+
71
+ const sign = diffMs < 0 ? -1 : 1;
72
+ return formatter.format(sign * value, unit);
73
+ }
74
+
75
+ function updateRelativeTime() {
76
+ relativeText = computeRelativeTime();
77
+ }
78
+
79
+ onMount(() => {
80
+ updateRelativeTime();
81
+
82
+ if (updateInterval > 0) {
83
+ const intervalId = setInterval(updateRelativeTime, updateInterval);
84
+ return () => clearInterval(intervalId);
85
+ }
86
+ });
87
+ </script>
88
+
89
+ {#if tooltip}
90
+ <Tooltip text={fullDateText}>
91
+ <time
92
+ class="relative-time {classes ?? ''}"
93
+ datetime={isoString}
94
+ data-pw={typeof testId === 'string' ? testId : null}
95
+ >
96
+ {relativeText}
97
+ </time>
98
+ </Tooltip>
99
+ {:else}
100
+ <time
101
+ class="relative-time {classes ?? ''}"
102
+ datetime={isoString}
103
+ data-pw={typeof testId === 'string' ? testId : null}
104
+ >
105
+ {relativeText}
106
+ </time>
107
+ {/if}
108
+
109
+ <style>
110
+ .relative-time {
111
+ font-size: var(--relative-time-font-size, 14px);
112
+ font-weight: var(--relative-time-font-weight, 400);
113
+ font-family: var(--relative-time-font-family);
114
+ color: var(--relative-time-color, inherit);
115
+ cursor: var(--relative-time-cursor, default);
116
+ }
117
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { RelativeTimeProperties } from './properties';
2
+ declare const RelativeTime: import("svelte").Component<RelativeTimeProperties, {}, "">;
3
+ type RelativeTime = ReturnType<typeof RelativeTime>;
4
+ export default RelativeTime;
@@ -0,0 +1,13 @@
1
+ export type RelativeTimeFormat = 'long' | 'short' | 'narrow';
2
+ export type MandatoryRelativeTimeProperties = {
3
+ date: Date | string | number;
4
+ };
5
+ export type OptionalRelativeTimeProperties = {
6
+ locale?: string;
7
+ format?: RelativeTimeFormat;
8
+ updateInterval?: number;
9
+ tooltip?: boolean;
10
+ testId?: string;
11
+ classes?: string;
12
+ };
13
+ export type RelativeTimeProperties = MandatoryRelativeTimeProperties & OptionalRelativeTimeProperties;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,389 @@
1
+ <script lang="ts">
2
+ import { onMount } from 'svelte';
3
+ import type { ScrollerProperties, ScrollPosition } from './properties';
4
+ import Button from '../Button/Button.svelte';
5
+ import chevronLeft from '../assets/chevron-left.svg?raw';
6
+ import chevronRight from '../assets/chevron-right.svg?raw';
7
+ import chevronUp from '../assets/chevron-up.svg?raw';
8
+ import chevronDown from '../assets/chevron-down.svg?raw';
9
+
10
+ let {
11
+ children,
12
+ direction = 'horizontal',
13
+ scrollAmount,
14
+ showArrows = true,
15
+ showGradient = true,
16
+ dragToScroll = false,
17
+ snapToItem = false,
18
+ hideScrollbar = true,
19
+ hideArrowsOnTouch = true,
20
+ smoothScroll = true,
21
+ testId,
22
+ arrowPrevious,
23
+ arrowNext,
24
+ onscrollposition,
25
+ classes
26
+ }: ScrollerProperties = $props();
27
+
28
+ let containerEl: HTMLDivElement | null = $state(null);
29
+ let canScrollPrev = $state(false);
30
+ let canScrollNext = $state(false);
31
+ let isTouchDevice = $state(false);
32
+ let isDragging = $state(false);
33
+ let dragStartPos = 0;
34
+ let dragScrollStart = 0;
35
+ let resizeObserver: ResizeObserver | null = null;
36
+
37
+ function getScrollProps(el: HTMLElement) {
38
+ if (direction === 'horizontal') {
39
+ return {
40
+ scrollOffset: el.scrollLeft,
41
+ scrollSize: el.scrollWidth,
42
+ clientSize: el.clientWidth
43
+ };
44
+ }
45
+ return {
46
+ scrollOffset: el.scrollTop,
47
+ scrollSize: el.scrollHeight,
48
+ clientSize: el.clientHeight
49
+ };
50
+ }
51
+
52
+ function updateScrollState() {
53
+ if (containerEl === null) {
54
+ return;
55
+ }
56
+ const { scrollOffset, scrollSize, clientSize } = getScrollProps(containerEl);
57
+ canScrollPrev = scrollOffset > 1;
58
+ canScrollNext = scrollOffset < scrollSize - clientSize - 1;
59
+
60
+ if (typeof onscrollposition === 'function') {
61
+ const maxScroll = scrollSize - clientSize;
62
+ const position: ScrollPosition = {
63
+ scrollOffset,
64
+ scrollSize,
65
+ clientSize,
66
+ progress: maxScroll > 0 ? scrollOffset / maxScroll : 0
67
+ };
68
+ onscrollposition(position);
69
+ }
70
+ }
71
+
72
+ function scrollBy(delta: number) {
73
+ if (containerEl === null) {
74
+ return;
75
+ }
76
+ const { clientSize } = getScrollProps(containerEl);
77
+ const amount = scrollAmount ?? clientSize;
78
+ const options: ScrollToOptions = {
79
+ behavior: smoothScroll ? 'smooth' : 'auto'
80
+ };
81
+ if (direction === 'horizontal') {
82
+ options.left = delta * amount;
83
+ } else {
84
+ options.top = delta * amount;
85
+ }
86
+ containerEl.scrollBy(options);
87
+ }
88
+
89
+ function scrollPrev() {
90
+ scrollBy(-1);
91
+ }
92
+
93
+ function scrollNext() {
94
+ scrollBy(1);
95
+ }
96
+
97
+ function handleDragStart(event: MouseEvent) {
98
+ if (!dragToScroll || containerEl === null) {
99
+ return;
100
+ }
101
+ isDragging = true;
102
+ dragStartPos = direction === 'horizontal' ? event.clientX : event.clientY;
103
+ dragScrollStart = direction === 'horizontal' ? containerEl.scrollLeft : containerEl.scrollTop;
104
+ containerEl.style.scrollBehavior = 'auto';
105
+ containerEl.style.userSelect = 'none';
106
+ }
107
+
108
+ function handleDragMove(event: MouseEvent) {
109
+ if (!isDragging || containerEl === null) {
110
+ return;
111
+ }
112
+ const currentPos = direction === 'horizontal' ? event.clientX : event.clientY;
113
+ const delta = dragStartPos - currentPos;
114
+ if (direction === 'horizontal') {
115
+ containerEl.scrollLeft = dragScrollStart + delta;
116
+ } else {
117
+ containerEl.scrollTop = dragScrollStart + delta;
118
+ }
119
+ }
120
+
121
+ function handleDragEnd() {
122
+ if (!isDragging || containerEl === null) {
123
+ return;
124
+ }
125
+ isDragging = false;
126
+ containerEl.style.scrollBehavior = smoothScroll ? 'smooth' : 'auto';
127
+ containerEl.style.userSelect = '';
128
+ }
129
+
130
+ onMount(() => {
131
+ isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0;
132
+ if (containerEl !== null) {
133
+ updateScrollState();
134
+ resizeObserver = new ResizeObserver(() => {
135
+ updateScrollState();
136
+ });
137
+ resizeObserver.observe(containerEl);
138
+
139
+ if (dragToScroll) {
140
+ window.addEventListener('mousemove', handleDragMove);
141
+ window.addEventListener('mouseup', handleDragEnd);
142
+ }
143
+ }
144
+ return () => {
145
+ resizeObserver?.disconnect();
146
+ if (dragToScroll) {
147
+ window.removeEventListener('mousemove', handleDragMove);
148
+ window.removeEventListener('mouseup', handleDragEnd);
149
+ }
150
+ };
151
+ });
152
+
153
+ let showArrowControls = $derived(showArrows && !(hideArrowsOnTouch && isTouchDevice));
154
+ </script>
155
+
156
+ <div
157
+ class="scroller {classes ?? ''}"
158
+ class:horizontal={direction === 'horizontal'}
159
+ class:vertical={direction === 'vertical'}
160
+ data-pw={typeof testId === 'string' ? testId : null}
161
+ >
162
+ {#if showArrowControls && canScrollPrev}
163
+ <div class="arrow arrow-prev">
164
+ <Button
165
+ onclick={scrollPrev}
166
+ ariaLabel="Scroll previous"
167
+ {...typeof testId === 'string' ? { testId: `${testId}-prev` } : {}}
168
+ >
169
+ {#if typeof arrowPrevious === 'function'}
170
+ {@render arrowPrevious()}
171
+ {:else}
172
+ <span class="arrow-icon">
173
+ <!-- eslint-disable svelte/no-at-html-tags -->
174
+ {@html direction === 'horizontal' ? chevronLeft : chevronUp}
175
+ </span>
176
+ {/if}
177
+ </Button>
178
+ </div>
179
+ {/if}
180
+
181
+ {#if showGradient && canScrollPrev}
182
+ <div class="gradient gradient-start"></div>
183
+ {/if}
184
+
185
+ <!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
186
+ <div
187
+ class="scroll-container"
188
+ class:hide-scrollbar={hideScrollbar}
189
+ class:snap={snapToItem}
190
+ class:dragging={isDragging}
191
+ bind:this={containerEl}
192
+ onscroll={updateScrollState}
193
+ onmousedown={dragToScroll ? handleDragStart : null}
194
+ role="region"
195
+ tabindex="-1"
196
+ >
197
+ {@render children()}
198
+ </div>
199
+
200
+ {#if showGradient && canScrollNext}
201
+ <div class="gradient gradient-end"></div>
202
+ {/if}
203
+
204
+ {#if showArrowControls && canScrollNext}
205
+ <div class="arrow arrow-next">
206
+ <Button
207
+ onclick={scrollNext}
208
+ ariaLabel="Scroll next"
209
+ {...typeof testId === 'string' ? { testId: `${testId}-next` } : {}}
210
+ >
211
+ {#if typeof arrowNext === 'function'}
212
+ {@render arrowNext()}
213
+ {:else}
214
+ <span class="arrow-icon">
215
+ <!-- eslint-disable svelte/no-at-html-tags -->
216
+ {@html direction === 'horizontal' ? chevronRight : chevronDown}
217
+ </span>
218
+ {/if}
219
+ </Button>
220
+ </div>
221
+ {/if}
222
+ </div>
223
+
224
+ <style>
225
+ .scroller {
226
+ position: relative;
227
+ display: flex;
228
+ width: var(--scroller-width, 100%);
229
+ height: var(--scroller-height, fit-content);
230
+ }
231
+
232
+ .scroller.horizontal {
233
+ flex-direction: row;
234
+ align-items: center;
235
+ }
236
+
237
+ .scroller.vertical {
238
+ flex-direction: column;
239
+ align-items: stretch;
240
+ }
241
+
242
+ .scroll-container {
243
+ flex: 1;
244
+ display: flex;
245
+ overflow: auto;
246
+ gap: var(--scroller-gap, 0px);
247
+ padding: var(--scroller-padding, 0px);
248
+ }
249
+
250
+ .scroller.horizontal .scroll-container {
251
+ flex-direction: row;
252
+ overflow-x: auto;
253
+ overflow-y: hidden;
254
+ scroll-behavior: var(--scroller-scroll-behavior, smooth);
255
+ }
256
+
257
+ .scroller.vertical .scroll-container {
258
+ flex-direction: column;
259
+ overflow-y: auto;
260
+ overflow-x: hidden;
261
+ scroll-behavior: var(--scroller-scroll-behavior, smooth);
262
+ }
263
+
264
+ .scroll-container.snap {
265
+ scroll-snap-type: var(--scroller-snap-type, x mandatory);
266
+ }
267
+
268
+ .scroller.vertical .scroll-container.snap {
269
+ scroll-snap-type: var(--scroller-snap-type, y mandatory);
270
+ }
271
+
272
+ .scroll-container.hide-scrollbar {
273
+ -ms-overflow-style: none;
274
+ scrollbar-width: none;
275
+ }
276
+
277
+ .scroll-container.hide-scrollbar::-webkit-scrollbar {
278
+ display: none;
279
+ }
280
+
281
+ .scroll-container.dragging {
282
+ cursor: grabbing;
283
+ }
284
+
285
+ .arrow {
286
+ display: flex;
287
+ align-items: center;
288
+ justify-content: center;
289
+ flex-shrink: 0;
290
+ z-index: 1;
291
+ margin: var(--scroller-arrow-margin, 0px);
292
+
293
+ --button-width: var(--scroller-arrow-size, 32px);
294
+ --button-height: var(--scroller-arrow-size, 32px);
295
+ --button-border-radius: var(--scroller-arrow-border-radius, 50%);
296
+ --button-color: var(--scroller-arrow-background, #ffffff);
297
+ --button-border: var(--scroller-arrow-border, 1px solid #e0e0e0);
298
+ --button-text-color: var(--scroller-arrow-color, #333333);
299
+ --button-padding: var(--scroller-arrow-padding, 4px);
300
+ --button-box-shadow: var(--scroller-arrow-box-shadow, 0 1px 3px rgba(0, 0, 0, 0.12));
301
+ --button-hover-color: var(--scroller-arrow-hover-background, #f5f5f5);
302
+ --button-hover-text-color: var(
303
+ --scroller-arrow-hover-color,
304
+ var(--scroller-arrow-color, #333333)
305
+ );
306
+ }
307
+
308
+ .arrow-icon {
309
+ display: flex;
310
+ align-items: center;
311
+ justify-content: center;
312
+ line-height: 0;
313
+ }
314
+
315
+ .arrow-icon :global(svg) {
316
+ width: var(--scroller-arrow-icon-size, 16px);
317
+ height: var(--scroller-arrow-icon-size, 16px);
318
+ }
319
+
320
+ .gradient {
321
+ position: absolute;
322
+ z-index: 1;
323
+ pointer-events: none;
324
+ }
325
+
326
+ .scroller.horizontal .gradient {
327
+ top: 0;
328
+ bottom: 0;
329
+ width: var(--scroller-gradient-size, 80px);
330
+ }
331
+
332
+ .scroller.horizontal .gradient-start {
333
+ left: var(--scroller-arrow-size, 32px);
334
+ background: var(
335
+ --scroller-gradient-start,
336
+ linear-gradient(
337
+ to right,
338
+ rgba(255, 255, 255, 1) 0%,
339
+ rgba(255, 255, 255, 0.5) 40%,
340
+ rgba(255, 255, 255, 0) 100%
341
+ )
342
+ );
343
+ }
344
+
345
+ .scroller.horizontal .gradient-end {
346
+ right: var(--scroller-arrow-size, 32px);
347
+ background: var(
348
+ --scroller-gradient-end,
349
+ linear-gradient(
350
+ to left,
351
+ rgba(255, 255, 255, 1) 0%,
352
+ rgba(255, 255, 255, 0.5) 40%,
353
+ rgba(255, 255, 255, 0) 100%
354
+ )
355
+ );
356
+ }
357
+
358
+ .scroller.vertical .gradient {
359
+ left: 0;
360
+ right: 0;
361
+ height: var(--scroller-gradient-size, 80px);
362
+ }
363
+
364
+ .scroller.vertical .gradient-start {
365
+ top: var(--scroller-arrow-size, 32px);
366
+ background: var(
367
+ --scroller-gradient-start,
368
+ linear-gradient(
369
+ to bottom,
370
+ rgba(255, 255, 255, 1) 0%,
371
+ rgba(255, 255, 255, 0.5) 40%,
372
+ rgba(255, 255, 255, 0) 100%
373
+ )
374
+ );
375
+ }
376
+
377
+ .scroller.vertical .gradient-end {
378
+ bottom: var(--scroller-arrow-size, 32px);
379
+ background: var(
380
+ --scroller-gradient-end,
381
+ linear-gradient(
382
+ to top,
383
+ rgba(255, 255, 255, 1) 0%,
384
+ rgba(255, 255, 255, 0.5) 40%,
385
+ rgba(255, 255, 255, 0) 100%
386
+ )
387
+ );
388
+ }
389
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { ScrollerProperties } from './properties';
2
+ declare const Scroller: import("svelte").Component<ScrollerProperties, {}, "">;
3
+ type Scroller = ReturnType<typeof Scroller>;
4
+ export default Scroller;
@@ -0,0 +1,30 @@
1
+ import type { Snippet } from 'svelte';
2
+ export type ScrollDirection = 'horizontal' | 'vertical';
3
+ export type ScrollPosition = {
4
+ scrollOffset: number;
5
+ scrollSize: number;
6
+ clientSize: number;
7
+ progress: number;
8
+ };
9
+ export type ScrollerProperties = OptionalScrollerProperties & ScrollerEventProperties & MandatoryScrollerProperties;
10
+ export type MandatoryScrollerProperties = {
11
+ children: Snippet;
12
+ };
13
+ export type OptionalScrollerProperties = {
14
+ direction?: ScrollDirection;
15
+ scrollAmount?: number;
16
+ showArrows?: boolean;
17
+ showGradient?: boolean;
18
+ dragToScroll?: boolean;
19
+ snapToItem?: boolean;
20
+ hideScrollbar?: boolean;
21
+ hideArrowsOnTouch?: boolean;
22
+ smoothScroll?: boolean;
23
+ testId?: string;
24
+ arrowPrevious?: Snippet;
25
+ arrowNext?: Snippet;
26
+ classes?: string;
27
+ };
28
+ export type ScrollerEventProperties = {
29
+ onscrollposition?: (position: ScrollPosition) => void;
30
+ };
@@ -0,0 +1 @@
1
+ export {};