@juspay/svelte-ui-components 2.10.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 +8 -1
@@ -1,10 +1,10 @@
1
1
  <script lang="ts">
2
2
  import type { BadgeProperties } from './properties';
3
3
 
4
- let { image, value }: BadgeProperties = $props();
4
+ let { image, value, classes }: BadgeProperties = $props();
5
5
  </script>
6
6
 
7
- <div class="badge-icon">
7
+ <div class="badge-icon {classes ?? ''}">
8
8
  <div class="badge-wrap">
9
9
  <img class="icon-img" src={image} alt="" />
10
10
  <div class="badge">{value}</div>
@@ -1,4 +1,5 @@
1
1
  export type BadgeProperties = {
2
2
  image: string;
3
3
  value: string;
4
+ classes?: string;
4
5
  };
@@ -1,74 +1,158 @@
1
1
  <script lang="ts">
2
2
  import type { BannerProperties } from './properties';
3
+ import { slide } from 'svelte/transition';
4
+ import Button from '../Button/Button.svelte';
5
+ import closeSvg from '../assets/close.svg?raw';
3
6
 
4
- let { icon, text, linkText, rightContent, onclick, onkeydown }: BannerProperties = $props();
7
+ let {
8
+ text,
9
+ icon,
10
+ linkText,
11
+ dismissible = false,
12
+ visible = $bindable(true),
13
+ testId,
14
+ rightContent,
15
+ dismissIcon,
16
+ onclick,
17
+ ondismiss,
18
+ classes
19
+ }: BannerProperties = $props();
20
+
21
+ let interactive = $derived(typeof onclick === 'function');
22
+
23
+ function handleClick(event: MouseEvent): void {
24
+ onclick?.(event);
25
+ }
26
+
27
+ function handleKeydown(event: KeyboardEvent): void {
28
+ if (event.key === 'Enter' || event.key === ' ') {
29
+ event.preventDefault();
30
+ if (event.currentTarget instanceof HTMLElement) {
31
+ event.currentTarget.click();
32
+ }
33
+ }
34
+ }
35
+
36
+ function handleDismiss(event: MouseEvent): void {
37
+ event.stopPropagation();
38
+ visible = false;
39
+ ondismiss?.();
40
+ }
5
41
  </script>
6
42
 
7
- <div class="banner" {onclick} {onkeydown} role="button" tabindex="0">
8
- {#if icon}
9
- <div class="banner-image">
10
- <img src={icon} alt="" />
43
+ {#if visible}
44
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
45
+ <div
46
+ class="banner {classes ?? ''}"
47
+ onclick={interactive ? handleClick : null}
48
+ onkeydown={interactive ? handleKeydown : null}
49
+ role={interactive ? 'button' : null}
50
+ tabindex={interactive ? 0 : null}
51
+ data-pw={typeof testId === 'string' ? testId : null}
52
+ transition:slide={{ duration: 300 }}
53
+ >
54
+ {#if typeof icon === 'function'}
55
+ <div class="banner-icon">
56
+ {@render icon()}
57
+ </div>
58
+ {/if}
59
+ <div class="banner-text">
60
+ {text}
61
+ {#if typeof linkText === 'string' && linkText.length > 0}
62
+ <span class="banner-link-text">{linkText}</span>
63
+ {/if}
11
64
  </div>
12
- {/if}
13
- <div class="banner-text">
14
- {#if linkText}
15
- <div>{text}<span class="link-text">{linkText}</span></div>
16
- {:else}
17
- <div>{text}</div>
65
+ {#if typeof rightContent === 'function'}
66
+ <div class="banner-right">
67
+ {@render rightContent()}
68
+ </div>
69
+ {/if}
70
+ {#if dismissible}
71
+ <div class="banner-dismiss">
72
+ <Button
73
+ onclick={handleDismiss}
74
+ ariaLabel="Dismiss"
75
+ {...typeof testId === 'string' ? { testId: `${testId}-dismiss` } : {}}
76
+ >
77
+ {#if typeof dismissIcon === 'function'}
78
+ {@render dismissIcon()}
79
+ {:else}
80
+ <!-- eslint-disable svelte/no-at-html-tags -->
81
+ {@html closeSvg}
82
+ {/if}
83
+ </Button>
84
+ </div>
18
85
  {/if}
19
86
  </div>
20
- {#if rightContent}
21
- <div class="right-content">
22
- {@render rightContent()}
23
- </div>
24
- {/if}
25
- </div>
87
+ {/if}
26
88
 
27
89
  <style>
28
90
  .banner {
29
- position: var(--banner-position, sticky);
30
- top: var(--banner-top, 0px);
31
- display: var(--banner-display, flex);
32
- align-items: var(--banner-align-items, center);
33
- background-color: var(--banner-bg-color, #637c9529);
91
+ display: flex;
92
+ align-items: center;
34
93
  width: var(--banner-width, 100%);
35
- height: var(--banner-height, 37px);
36
- padding: var(--banner-padding, 10px 12px, 10px, 12px);
94
+ height: var(--banner-height);
95
+ padding: var(--banner-padding, 10px 12px);
37
96
  gap: var(--banner-gap, 8px);
38
97
  justify-content: var(--banner-justify-content, center);
98
+ background-color: var(--banner-background, #f0f4f8);
99
+ color: var(--banner-color, #637c95);
100
+ font-family: var(--banner-font-family);
101
+ font-size: var(--banner-font-size, 14px);
102
+ font-weight: var(--banner-font-weight, 500);
103
+ line-height: var(--banner-line-height, 1.3);
104
+ border-bottom: var(--banner-border-bottom, none);
39
105
  cursor: var(--banner-cursor, pointer);
106
+ position: var(--banner-position, sticky);
107
+ top: var(--banner-top, 0);
108
+ z-index: var(--banner-z-index, 100);
109
+ box-sizing: border-box;
40
110
  }
41
111
 
42
- .banner-image {
43
- color: var(--banner-img-color, #637c95);
44
- width: var(--banner-img-width, 18px);
45
- height: var(--banner-img-height, 11.69px);
46
- margin-bottom: var(--banner-img-margin-bottom, 6px);
47
- align-items: var(--banner-image-align-items, center);
112
+ .banner-icon {
113
+ display: flex;
114
+ align-items: center;
115
+ flex-shrink: 0;
116
+ color: var(--banner-icon-color, currentColor);
117
+ }
118
+
119
+ .banner-icon :global(svg) {
120
+ width: var(--banner-icon-size, 18px);
121
+ height: var(--banner-icon-size, 18px);
48
122
  }
49
123
 
50
124
  .banner-text {
51
- flex: var(--banner-text-flex);
52
- order: var(--banner-text-order);
53
- size: var(--banner-text-size, 14px);
54
- font-family: var(--banner-font-family, Euclid Circular A);
55
- font-style: var(--banner-font-style, normal);
56
- color: var(--banner-text-color, #637c95);
57
- font-size: var(--banner-font-size, 14px);
58
- line-height: var(--banner-line-height, 17.75px);
59
- font-weight: var(--banner-font-weight, 500);
60
- overflow: var(--banner-overflow, hidden);
61
- text-overflow: var(--banner-text-overflow, ellipsis);
62
- white-space: var(--banner-text-white-space, nowrap);
63
- align-items: var(--banner-text-align-items, center);
125
+ overflow: hidden;
126
+ text-overflow: ellipsis;
127
+ white-space: nowrap;
128
+ }
129
+
130
+ .banner-link-text {
131
+ color: var(--banner-link-color, #0099ff);
132
+ margin-left: var(--banner-link-gap, 4px);
133
+ }
134
+
135
+ .banner-right {
136
+ display: flex;
137
+ align-items: center;
138
+ flex-shrink: 0;
64
139
  }
65
140
 
66
- .link-text {
67
- color: var(--banner-linktext-color, #0099ff);
141
+ .banner-dismiss {
142
+ --button-color: transparent;
143
+ --button-border: none;
144
+ --button-padding: 2px;
145
+ --button-border-radius: var(--banner-dismiss-border-radius, 4px);
146
+ --button-text-color: var(--banner-dismiss-color, currentColor);
147
+ --button-hover-color: var(--banner-dismiss-hover-background, rgba(0, 0, 0, 0.1));
148
+ --cursor: inherit;
149
+ display: flex;
150
+ align-items: center;
151
+ flex-shrink: 0;
68
152
  }
69
153
 
70
- .right-content {
71
- order: var(--banner-right-content-order);
72
- display: var(--banner-right-content-display, flex);
154
+ .banner-dismiss :global(svg) {
155
+ width: var(--banner-dismiss-size, 14px);
156
+ height: var(--banner-dismiss-size, 14px);
73
157
  }
74
158
  </style>
@@ -1,4 +1,4 @@
1
1
  import type { BannerProperties } from './properties';
2
- declare const Banner: import("svelte").Component<BannerProperties, {}, "">;
2
+ declare const Banner: import("svelte").Component<BannerProperties, {}, "visible">;
3
3
  type Banner = ReturnType<typeof Banner>;
4
4
  export default Banner;
@@ -4,11 +4,16 @@ export type MandatoryBannerProperties = {
4
4
  text: string;
5
5
  };
6
6
  export type OptionalBannerProperties = {
7
- icon?: string | null;
8
- linkText?: string | null;
7
+ icon?: Snippet;
8
+ linkText?: string;
9
+ dismissible?: boolean;
10
+ visible?: boolean;
11
+ testId?: string;
9
12
  rightContent?: Snippet;
13
+ dismissIcon?: Snippet;
14
+ classes?: string;
10
15
  };
11
16
  export type BannerEventProperties = {
12
17
  onclick?: (event: MouseEvent) => void;
13
- onkeydown?: (event: KeyboardEvent) => void;
18
+ ondismiss?: () => void;
14
19
  };
@@ -0,0 +1,281 @@
1
+ <script lang="ts">
2
+ import type { BookProperties } from './properties';
3
+ import chevronLeftLgSvg from '../assets/chevron-left-lg.svg?raw';
4
+ import chevronRightLgSvg from '../assets/chevron-right-lg.svg?raw';
5
+ import Button from '../Button/Button.svelte';
6
+
7
+ let {
8
+ pages,
9
+ currentPage = $bindable(0),
10
+ transition = 'slide',
11
+ showNavigation = true,
12
+ showPageIndicator = true,
13
+ enableSwipe = false,
14
+ testId,
15
+ previousIcon,
16
+ nextIcon,
17
+ onpagechange,
18
+ classes
19
+ }: BookProperties = $props();
20
+
21
+ let startX = 0;
22
+ let isDragging = false;
23
+
24
+ function goToPage(page: number): void {
25
+ if (page < 0 || page >= pages.length || page === currentPage) {
26
+ return;
27
+ }
28
+ currentPage = page;
29
+ onpagechange?.(currentPage);
30
+ }
31
+
32
+ function previousPage(): void {
33
+ goToPage(currentPage - 1);
34
+ }
35
+
36
+ function nextPage(): void {
37
+ goToPage(currentPage + 1);
38
+ }
39
+
40
+ function handleKeyDown(event: KeyboardEvent): void {
41
+ if (event.key === 'ArrowLeft') {
42
+ event.preventDefault();
43
+ previousPage();
44
+ } else if (event.key === 'ArrowRight') {
45
+ event.preventDefault();
46
+ nextPage();
47
+ }
48
+ }
49
+
50
+ function handleTouchStart(event: TouchEvent): void {
51
+ if (!enableSwipe) {
52
+ return;
53
+ }
54
+ const touch = event.touches.item(0);
55
+ if (touch !== null) {
56
+ startX = touch.clientX;
57
+ isDragging = true;
58
+ }
59
+ }
60
+
61
+ function handleTouchEnd(event: TouchEvent): void {
62
+ if (!enableSwipe || !isDragging) {
63
+ return;
64
+ }
65
+ isDragging = false;
66
+ const changedTouch = event.changedTouches.item(0);
67
+ if (changedTouch !== null) {
68
+ const diff = startX - changedTouch.clientX;
69
+ if (diff > 20) {
70
+ nextPage();
71
+ } else if (diff < -20) {
72
+ previousPage();
73
+ }
74
+ }
75
+ }
76
+
77
+ function handleMouseDown(event: MouseEvent): void {
78
+ if (!enableSwipe) {
79
+ return;
80
+ }
81
+ startX = event.clientX;
82
+ isDragging = true;
83
+ }
84
+
85
+ function handleMouseUp(event: MouseEvent): void {
86
+ if (!enableSwipe || !isDragging) {
87
+ return;
88
+ }
89
+ isDragging = false;
90
+ const diff = startX - event.clientX;
91
+ if (diff > 20) {
92
+ nextPage();
93
+ } else if (diff < -20) {
94
+ previousPage();
95
+ }
96
+ }
97
+ </script>
98
+
99
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
100
+ <!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
101
+ <div
102
+ class="book {classes ?? ''}"
103
+ data-pw={testId}
104
+ onkeydown={handleKeyDown}
105
+ ontouchstart={handleTouchStart}
106
+ ontouchend={handleTouchEnd}
107
+ onmousedown={handleMouseDown}
108
+ onmouseup={handleMouseUp}
109
+ role="region"
110
+ tabindex="0"
111
+ >
112
+ <div class="book-viewport">
113
+ {#if showNavigation}
114
+ <div class="nav-button nav-prev" class:nav-disabled={currentPage === 0}>
115
+ <Button onclick={previousPage} disabled={currentPage === 0} ariaLabel="Previous page">
116
+ {#if typeof previousIcon === 'function'}
117
+ {@render previousIcon()}
118
+ {:else}
119
+ <!-- eslint-disable svelte/no-at-html-tags -->
120
+ {@html chevronLeftLgSvg}
121
+ {/if}
122
+ </Button>
123
+ </div>
124
+ {/if}
125
+
126
+ <div class="pages-container">
127
+ {#each pages as page, index (index)}
128
+ {#if transition === 'none'}
129
+ {#if index === currentPage}
130
+ <div class="page">
131
+ {@render page.content()}
132
+ </div>
133
+ {/if}
134
+ {:else if transition === 'fade'}
135
+ <div class="page page-fade" class:page-active={index === currentPage}>
136
+ {@render page.content()}
137
+ </div>
138
+ {:else}
139
+ <div class="page page-slide" style:transform="translateX({(index - currentPage) * 100}%)">
140
+ {@render page.content()}
141
+ </div>
142
+ {/if}
143
+ {/each}
144
+ </div>
145
+
146
+ {#if showNavigation}
147
+ <div class="nav-button nav-next" class:nav-disabled={currentPage === pages.length - 1}>
148
+ <Button
149
+ onclick={nextPage}
150
+ disabled={currentPage === pages.length - 1}
151
+ ariaLabel="Next page"
152
+ >
153
+ {#if typeof nextIcon === 'function'}
154
+ {@render nextIcon()}
155
+ {:else}
156
+ <!-- eslint-disable svelte/no-at-html-tags -->
157
+ {@html chevronRightLgSvg}
158
+ {/if}
159
+ </Button>
160
+ </div>
161
+ {/if}
162
+ </div>
163
+
164
+ {#if showPageIndicator}
165
+ <div class="page-indicator">
166
+ {#each pages as _, index (index)}
167
+ <button
168
+ class="dot"
169
+ class:dot-active={index === currentPage}
170
+ onclick={() => goToPage(index)}
171
+ aria-label="Go to page {index + 1}"
172
+ ></button>
173
+ {/each}
174
+ </div>
175
+ {/if}
176
+ </div>
177
+
178
+ <style>
179
+ .book {
180
+ width: var(--book-width, 100%);
181
+ background-color: var(--book-background, #ffffff);
182
+ border-radius: var(--book-border-radius, 8px);
183
+ border: var(--book-border, 1px solid #e0e0e0);
184
+ outline: none;
185
+ }
186
+
187
+ .book-viewport {
188
+ position: relative;
189
+ display: flex;
190
+ align-items: center;
191
+ }
192
+
193
+ .pages-container {
194
+ position: relative;
195
+ width: 100%;
196
+ height: var(--book-height, 400px);
197
+ overflow: var(--book-overflow, hidden);
198
+ }
199
+
200
+ .page {
201
+ width: 100%;
202
+ height: 100%;
203
+ }
204
+
205
+ .page-slide {
206
+ position: absolute;
207
+ top: 0;
208
+ left: 0;
209
+ transition: transform var(--book-transition-duration, 0.3s) ease;
210
+ }
211
+
212
+ .page-fade {
213
+ position: absolute;
214
+ top: 0;
215
+ left: 0;
216
+ opacity: 0;
217
+ transition: opacity var(--book-transition-duration, 0.3s) ease;
218
+ pointer-events: none;
219
+ }
220
+
221
+ .page-fade.page-active {
222
+ opacity: 1;
223
+ pointer-events: auto;
224
+ }
225
+
226
+ .nav-button {
227
+ display: flex;
228
+ align-items: center;
229
+ justify-content: center;
230
+
231
+ --button-width: var(--book-nav-size, 36px);
232
+ --button-height: var(--book-nav-size, 36px);
233
+ --button-min-width: var(--book-nav-size, 36px);
234
+ --button-background: var(--book-nav-background, rgba(0, 0, 0, 0.05));
235
+ --button-border: none;
236
+ --button-border-radius: var(--book-nav-border-radius, 50%);
237
+ --button-padding: 0;
238
+ --button-color: var(--book-nav-color, #333333);
239
+ --button-hover-background: var(--book-nav-hover-background, rgba(0, 0, 0, 0.1));
240
+ }
241
+
242
+ .nav-disabled {
243
+ opacity: var(--book-nav-disabled-opacity, 0.3);
244
+ }
245
+
246
+ .nav-button :global(svg) {
247
+ width: 18px;
248
+ height: 18px;
249
+ }
250
+
251
+ .nav-prev {
252
+ margin-right: 4px;
253
+ }
254
+
255
+ .nav-next {
256
+ margin-left: 4px;
257
+ }
258
+
259
+ .page-indicator {
260
+ display: flex;
261
+ justify-content: center;
262
+ align-items: center;
263
+ gap: var(--book-dot-gap, 8px);
264
+ padding: var(--book-indicator-padding, 12px 0);
265
+ }
266
+
267
+ .dot {
268
+ width: var(--book-dot-size, 8px);
269
+ height: var(--book-dot-size, 8px);
270
+ border-radius: var(--book-dot-border-radius, 50%);
271
+ background-color: var(--book-dot-color, #cccccc);
272
+ border: none;
273
+ padding: 0;
274
+ cursor: pointer;
275
+ transition: background-color 0.2s ease;
276
+ }
277
+
278
+ .dot-active {
279
+ background-color: var(--book-dot-active-color, #333333);
280
+ }
281
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { BookProperties } from './properties';
2
+ declare const Book: import("svelte").Component<BookProperties, {}, "currentPage">;
3
+ type Book = ReturnType<typeof Book>;
4
+ export default Book;
@@ -0,0 +1,24 @@
1
+ import type { Snippet } from 'svelte';
2
+ export type BookPage = {
3
+ content: Snippet;
4
+ title?: string;
5
+ };
6
+ export type BookTransition = 'slide' | 'fade' | 'none';
7
+ export type BookProperties = MandatoryBookProperties & OptionalBookProperties & BookEventProperties;
8
+ export type MandatoryBookProperties = {
9
+ pages: BookPage[];
10
+ };
11
+ export type OptionalBookProperties = {
12
+ currentPage?: number;
13
+ transition?: BookTransition;
14
+ showNavigation?: boolean;
15
+ showPageIndicator?: boolean;
16
+ enableSwipe?: boolean;
17
+ testId?: string;
18
+ previousIcon?: Snippet;
19
+ nextIcon?: Snippet;
20
+ classes?: string;
21
+ };
22
+ export type BookEventProperties = {
23
+ onpagechange?: (page: number) => void;
24
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -1,14 +1,14 @@
1
1
  <script lang="ts">
2
2
  import type { BrandLoaderProperties } from './properties';
3
3
 
4
- let { brandLogoURL, brandText, subText }: BrandLoaderProperties = $props();
4
+ let { brandLogoURL, brandText, subText, classes }: BrandLoaderProperties = $props();
5
5
  </script>
6
6
 
7
- <div class="background">
7
+ <div class="background {classes ?? ''}">
8
8
  <div class="loader">
9
9
  <img src={brandLogoURL} alt="" />
10
10
  <div class="text">{brandText}</div>
11
- {#if subText}
11
+ {#if typeof subText === 'string' && subText.length > 0}
12
12
  <div class="sub-text">{subText}</div>
13
13
  {/if}
14
14
  <div class="lds-ellipsis">
@@ -2,4 +2,5 @@ export type BrandLoaderProperties = {
2
2
  brandLogoURL: string;
3
3
  brandText: string;
4
4
  subText?: string | null;
5
+ classes?: string;
5
6
  };