@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
@@ -1,4 +1,4 @@
1
1
  import type { SelectProperties } from './properties';
2
- declare const Select: import("svelte").Component<SelectProperties, {}, "">;
2
+ declare const Select: import("svelte").Component<SelectProperties, {}, "value">;
3
3
  type Select = ReturnType<typeof Select>;
4
4
  export default Select;
@@ -1,30 +1,20 @@
1
- import type { Snippet } from 'svelte';
2
- import type { ImgProperties } from '../Img/properties';
3
- export type SelectProperties = SelectEventProperties & {
4
- dropDownIconAlt?: string;
5
- placeholder?: string | null;
6
- label?: string | null;
7
- allItems?: string[];
8
- selectedItem?: string | string[];
9
- selectedItemLabel?: string | string[] | null;
10
- showSelectedItemInDropdown?: boolean;
11
- selectMultipleItems?: boolean;
12
- hideDropDownIcon?: boolean;
13
- dropDownIcon?: string;
14
- leftIcon?: ImgProperties | null;
15
- showSingleSelectButton?: boolean;
16
- showSelectedItem?: boolean;
17
- showSelectedItemCount?: boolean;
1
+ export type SelectProperties = MandatorySelectProperties & OptionalSelectProperties & SelectEventProperties;
2
+ export type SelectItem = {
3
+ id: string;
4
+ label: string;
5
+ };
6
+ export type MandatorySelectProperties = {
7
+ items: SelectItem[];
8
+ };
9
+ export type OptionalSelectProperties = {
10
+ value?: string[];
11
+ multiple?: boolean;
12
+ searchable?: boolean;
13
+ placeholder?: string;
14
+ disabled?: boolean;
18
15
  testId?: string;
19
- labelTestId?: string;
20
- itemTestId?: string;
21
- leftContent?: Snippet;
22
- bottomContent?: Snippet;
16
+ classes?: string;
23
17
  };
24
18
  export type SelectEventProperties = {
25
- onselect?: (event: {
26
- selectedItems: string | string[];
27
- }) => void;
28
- ondropdownClick?: () => void;
29
- onkeydown?: (event: KeyboardEvent) => void;
19
+ onchange?: (value: string[]) => void;
30
20
  };
@@ -0,0 +1,264 @@
1
+ <script lang="ts">
2
+ import type { SheetProperties } from './properties';
3
+ import { fly, fade } from 'svelte/transition';
4
+ import { tick } from 'svelte';
5
+ import Button from '../Button/Button.svelte';
6
+
7
+ let {
8
+ open = $bindable(false),
9
+ side = 'right',
10
+ title,
11
+ showOverlay = true,
12
+ showCloseButton = true,
13
+ testId,
14
+ content,
15
+ footer,
16
+ onclose,
17
+ classes
18
+ }: SheetProperties = $props();
19
+
20
+ let overlayDiv: HTMLDivElement | null = $state(null);
21
+ let sheetPanel: HTMLDivElement | null = $state(null);
22
+
23
+ let flyParams = $derived.by(() => {
24
+ switch (side) {
25
+ case 'left':
26
+ return { x: -400, y: 0, duration: 300 };
27
+ case 'right':
28
+ return { x: 400, y: 0, duration: 300 };
29
+ case 'top':
30
+ return { x: 0, y: -400, duration: 300 };
31
+ case 'bottom':
32
+ return { x: 0, y: 400, duration: 300 };
33
+ }
34
+ });
35
+
36
+ function close() {
37
+ open = false;
38
+ onclose?.();
39
+ }
40
+
41
+ function handleOverlayClick(event: MouseEvent) {
42
+ if (event.target === overlayDiv) {
43
+ close();
44
+ }
45
+ }
46
+
47
+ function handleKeyDown(event: KeyboardEvent) {
48
+ if (event.key === 'Escape') {
49
+ close();
50
+ return;
51
+ }
52
+
53
+ if (event.key === 'Tab' && sheetPanel !== null) {
54
+ const focusable = sheetPanel.querySelectorAll<HTMLElement>(
55
+ 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])'
56
+ );
57
+ const first = focusable.item(0);
58
+ const last = focusable.item(focusable.length - 1);
59
+
60
+ if (first === null || last === null) {
61
+ return;
62
+ }
63
+
64
+ const atEdge = document.activeElement === (event.shiftKey ? first : last);
65
+ if (atEdge) {
66
+ event.preventDefault();
67
+ (event.shiftKey ? last : first).focus();
68
+ }
69
+ }
70
+ }
71
+
72
+ function lockScroll() {
73
+ document.body.style.overflow = 'hidden';
74
+ }
75
+
76
+ function unlockScroll() {
77
+ document.body.style.overflow = '';
78
+ }
79
+
80
+ function scrollLockAction(_node: HTMLElement) {
81
+ lockScroll();
82
+ tick().then(() => {
83
+ if (sheetPanel !== null) {
84
+ sheetPanel.focus();
85
+ }
86
+ });
87
+ return {
88
+ destroy() {
89
+ unlockScroll();
90
+ }
91
+ };
92
+ }
93
+ </script>
94
+
95
+ {#if open}
96
+ <div
97
+ bind:this={overlayDiv}
98
+ use:scrollLockAction
99
+ class="sheet-overlay {showOverlay ? 'overlay-active' : 'overlay-inactive'} {classes ?? ''}"
100
+ onclick={handleOverlayClick}
101
+ onkeydown={handleKeyDown}
102
+ role="button"
103
+ tabindex="-1"
104
+ data-pw={typeof testId === 'string' ? testId : null}
105
+ transition:fade={{ duration: 200 }}
106
+ >
107
+ <div
108
+ bind:this={sheetPanel}
109
+ class="sheet-panel {side}"
110
+ role="dialog"
111
+ aria-modal="true"
112
+ aria-label={title ?? 'Sheet'}
113
+ tabindex="-1"
114
+ transition:fly|global={flyParams}
115
+ >
116
+ {#if typeof title === 'string' || showCloseButton}
117
+ <div class="sheet-header">
118
+ {#if typeof title === 'string'}
119
+ <span class="sheet-title">{title}</span>
120
+ {/if}
121
+ {#if showCloseButton}
122
+ <div class="sheet-close-button">
123
+ <Button
124
+ onclick={close}
125
+ ariaLabel="Close"
126
+ {...typeof testId === 'string' ? { testId: `${testId}-close` } : {}}
127
+ >
128
+ &#x2715;
129
+ </Button>
130
+ </div>
131
+ {/if}
132
+ </div>
133
+ {/if}
134
+ <div class="sheet-content">
135
+ {@render content()}
136
+ </div>
137
+ {#if typeof footer === 'function'}
138
+ <div class="sheet-footer">
139
+ {@render footer()}
140
+ </div>
141
+ {/if}
142
+ </div>
143
+ </div>
144
+ {/if}
145
+
146
+ <style>
147
+ .sheet-overlay {
148
+ position: fixed;
149
+ top: 0;
150
+ left: 0;
151
+ right: 0;
152
+ bottom: 0;
153
+ z-index: var(--sheet-overlay-z-index, 15);
154
+ -webkit-tap-highlight-color: transparent;
155
+ }
156
+
157
+ .overlay-active {
158
+ background-color: var(--sheet-overlay-background, #00000066);
159
+ pointer-events: auto;
160
+ }
161
+
162
+ .overlay-inactive {
163
+ pointer-events: none;
164
+ }
165
+
166
+ .sheet-panel {
167
+ position: fixed;
168
+ display: flex;
169
+ flex-direction: column;
170
+ background-color: var(--sheet-background, #ffffff);
171
+ box-shadow: var(--sheet-box-shadow, -2px 0 8px rgba(0, 0, 0, 0.15));
172
+ z-index: var(--sheet-z-index, 16);
173
+ pointer-events: auto;
174
+ outline: none;
175
+ }
176
+
177
+ .sheet-panel.left,
178
+ .sheet-panel.right {
179
+ top: 0;
180
+ bottom: 0;
181
+ width: var(--sheet-width, 400px);
182
+ max-width: var(--sheet-max-width, 100vw);
183
+ }
184
+
185
+ .sheet-panel.left {
186
+ left: 0;
187
+ border-right: var(--sheet-border, none);
188
+ }
189
+
190
+ .sheet-panel.right {
191
+ right: 0;
192
+ border-left: var(--sheet-border, none);
193
+ }
194
+
195
+ .sheet-panel.top,
196
+ .sheet-panel.bottom {
197
+ left: 0;
198
+ right: 0;
199
+ height: var(--sheet-height, 300px);
200
+ max-height: var(--sheet-max-height, 100vh);
201
+ }
202
+
203
+ .sheet-panel.top {
204
+ top: 0;
205
+ border-bottom: var(--sheet-border, none);
206
+ }
207
+
208
+ .sheet-panel.bottom {
209
+ bottom: 0;
210
+ border-top: var(--sheet-border, none);
211
+ }
212
+
213
+ .sheet-header {
214
+ display: flex;
215
+ align-items: center;
216
+ padding: var(--sheet-header-padding, 16px 20px);
217
+ background-color: var(--sheet-header-background, inherit);
218
+ border-bottom: var(--sheet-header-border-bottom, 1px solid #e0e0e0);
219
+ flex-shrink: 0;
220
+ }
221
+
222
+ .sheet-title {
223
+ flex: 1;
224
+ font-size: var(--sheet-title-font-size, 18px);
225
+ font-weight: var(--sheet-title-font-weight, 600);
226
+ font-family: var(--sheet-title-font-family, inherit);
227
+ color: var(--sheet-title-color, #1a1a1a);
228
+ line-height: var(--sheet-title-line-height, 1.4);
229
+ }
230
+
231
+ .sheet-close-button {
232
+ --button-width: var(--sheet-close-button-size, 32px);
233
+ --button-height: var(--sheet-close-button-size, 32px);
234
+ --button-border: none;
235
+ --button-border-radius: var(--sheet-close-button-border-radius, 4px);
236
+ --button-color: var(--sheet-close-button-background, transparent);
237
+ --button-text-color: var(--sheet-close-button-color, #666666);
238
+ --button-font-size: var(--sheet-close-button-font-size, 16px);
239
+ --button-padding: 0;
240
+ --button-hover-color: var(--sheet-close-button-hover-background, #f0f0f0);
241
+ flex-shrink: 0;
242
+ display: flex;
243
+ align-items: center;
244
+ justify-content: center;
245
+ }
246
+
247
+ .sheet-content {
248
+ flex: 1;
249
+ overflow-y: var(--sheet-content-overflow-y, auto);
250
+ padding: var(--sheet-content-padding, 20px);
251
+ scrollbar-width: var(--sheet-scrollbar-width, none);
252
+ }
253
+
254
+ .sheet-content::-webkit-scrollbar {
255
+ display: none;
256
+ }
257
+
258
+ .sheet-footer {
259
+ padding: var(--sheet-footer-padding, 16px 20px);
260
+ background-color: var(--sheet-footer-background, inherit);
261
+ border-top: var(--sheet-footer-border-top, 1px solid #e0e0e0);
262
+ flex-shrink: 0;
263
+ }
264
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { SheetProperties } from './properties';
2
+ declare const Sheet: import("svelte").Component<SheetProperties, {}, "open">;
3
+ type Sheet = ReturnType<typeof Sheet>;
4
+ export default Sheet;
@@ -0,0 +1,19 @@
1
+ import type { Snippet } from 'svelte';
2
+ export type SheetSide = 'left' | 'right' | 'top' | 'bottom';
3
+ export type SheetProperties = MandatorySheetProperties & OptionalSheetProperties & SheetEventProperties;
4
+ export type MandatorySheetProperties = {
5
+ content: Snippet;
6
+ };
7
+ export type OptionalSheetProperties = {
8
+ open?: boolean;
9
+ side?: SheetSide;
10
+ title?: string;
11
+ showOverlay?: boolean;
12
+ showCloseButton?: boolean;
13
+ testId?: string;
14
+ footer?: Snippet;
15
+ classes?: string;
16
+ };
17
+ export type SheetEventProperties = {
18
+ onclose?: () => void;
19
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,44 @@
1
+ <script lang="ts">
2
+ import type { ShimmerProperties } from './properties';
3
+
4
+ let { testId, classes }: ShimmerProperties = $props();
5
+ </script>
6
+
7
+ <div class="shimmer {classes ?? ''}" data-pw={typeof testId === 'string' ? testId : null}></div>
8
+
9
+ <style>
10
+ .shimmer {
11
+ width: var(--shimmer-width, 100%);
12
+ height: var(--shimmer-height, 16px);
13
+ border-radius: var(--shimmer-border-radius, 4px);
14
+ background-color: var(--shimmer-background, #e0e0e0);
15
+ opacity: var(--shimmer-opacity, 1);
16
+ overflow: hidden;
17
+ position: relative;
18
+ }
19
+
20
+ .shimmer::after {
21
+ content: '';
22
+ position: absolute;
23
+ top: 0;
24
+ left: 0;
25
+ right: 0;
26
+ bottom: 0;
27
+ background: linear-gradient(
28
+ 90deg,
29
+ transparent,
30
+ var(--shimmer-highlight, rgba(255, 255, 255, 0.4)),
31
+ transparent
32
+ );
33
+ animation: shimmer var(--shimmer-duration, 1.5s) infinite;
34
+ }
35
+
36
+ @keyframes shimmer {
37
+ 0% {
38
+ transform: translateX(-100%);
39
+ }
40
+ 100% {
41
+ transform: translateX(100%);
42
+ }
43
+ }
44
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { ShimmerProperties } from './properties';
2
+ declare const Shimmer: import("svelte").Component<ShimmerProperties, {}, "">;
3
+ type Shimmer = ReturnType<typeof Shimmer>;
4
+ export default Shimmer;
@@ -0,0 +1,4 @@
1
+ export type ShimmerProperties = {
2
+ testId?: string;
3
+ classes?: string;
4
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,144 @@
1
+ <script lang="ts">
2
+ import type { SliderProperties } from './properties';
3
+
4
+ let {
5
+ value = $bindable(0),
6
+ min = 0,
7
+ max = 100,
8
+ step = 1,
9
+ disabled = false,
10
+ showValue = false,
11
+ testId,
12
+ onchange,
13
+ oninput,
14
+ classes
15
+ }: SliderProperties = $props();
16
+
17
+ let percentage = $derived(((value - min) / (max - min)) * 100);
18
+
19
+ function handleInput(e: Event) {
20
+ if (e.target instanceof HTMLInputElement) {
21
+ value = Number(e.target.value);
22
+ oninput?.(value);
23
+ }
24
+ }
25
+
26
+ function handleChange(e: Event) {
27
+ if (e.target instanceof HTMLInputElement) {
28
+ value = Number(e.target.value);
29
+ onchange?.(value);
30
+ }
31
+ }
32
+ </script>
33
+
34
+ <div class="slider-container {classes ?? ''}" class:disabled>
35
+ <input
36
+ type="range"
37
+ class="slider-input"
38
+ {min}
39
+ {max}
40
+ {step}
41
+ {value}
42
+ {disabled}
43
+ data-pw={typeof testId === 'string' ? testId : null}
44
+ oninput={handleInput}
45
+ onchange={handleChange}
46
+ style="--slider-fill-percent: {percentage}%"
47
+ />
48
+ {#if showValue}
49
+ <span class="slider-value">{value}</span>
50
+ {/if}
51
+ </div>
52
+
53
+ <style>
54
+ .slider-container {
55
+ display: flex;
56
+ align-items: center;
57
+ gap: 12px;
58
+ width: var(--slider-container-width, 100%);
59
+ padding: var(--slider-container-padding, 4px 0);
60
+ }
61
+
62
+ .slider-container.disabled {
63
+ opacity: var(--slider-disabled-opacity, 0.5);
64
+ cursor: var(--slider-disabled-cursor, not-allowed);
65
+ }
66
+
67
+ .slider-input {
68
+ -webkit-appearance: none;
69
+ appearance: none;
70
+ width: 100%;
71
+ height: var(--slider-track-height, 6px);
72
+ border-radius: var(--slider-track-border-radius, 3px);
73
+ background: linear-gradient(
74
+ to right,
75
+ var(--slider-track-active-color, #2196f3) 0%,
76
+ var(--slider-track-active-color, #2196f3) var(--slider-fill-percent, 0%),
77
+ var(--slider-track-background, #e0e0e0) var(--slider-fill-percent, 0%),
78
+ var(--slider-track-background, #e0e0e0) 100%
79
+ );
80
+ outline: none;
81
+ transition: var(--slider-transition, background 0.2s ease);
82
+ cursor: pointer;
83
+ }
84
+
85
+ .slider-container.disabled .slider-input {
86
+ cursor: var(--slider-disabled-cursor, not-allowed);
87
+ pointer-events: none;
88
+ }
89
+
90
+ .slider-input::-webkit-slider-thumb {
91
+ -webkit-appearance: none;
92
+ appearance: none;
93
+ width: var(--slider-thumb-size, 20px);
94
+ height: var(--slider-thumb-size, 20px);
95
+ border-radius: var(--slider-thumb-border-radius, 50%);
96
+ background: var(--slider-thumb-background, #ffffff);
97
+ border: var(--slider-thumb-border, 2px solid #2196f3);
98
+ box-shadow: var(--slider-thumb-shadow, 0 1px 3px rgba(0, 0, 0, 0.2));
99
+ cursor: pointer;
100
+ transition: transform 0.15s ease;
101
+ }
102
+
103
+ .slider-input::-moz-range-thumb {
104
+ width: var(--slider-thumb-size, 20px);
105
+ height: var(--slider-thumb-size, 20px);
106
+ border-radius: var(--slider-thumb-border-radius, 50%);
107
+ background: var(--slider-thumb-background, #ffffff);
108
+ border: var(--slider-thumb-border, 2px solid #2196f3);
109
+ box-shadow: var(--slider-thumb-shadow, 0 1px 3px rgba(0, 0, 0, 0.2));
110
+ cursor: pointer;
111
+ transition: transform 0.15s ease;
112
+ }
113
+
114
+ .slider-input:hover::-webkit-slider-thumb {
115
+ transform: scale(var(--slider-thumb-hover-scale, 1.15));
116
+ }
117
+
118
+ .slider-input:hover::-moz-range-thumb {
119
+ transform: scale(var(--slider-thumb-hover-scale, 1.15));
120
+ }
121
+
122
+ .slider-input:focus-visible::-webkit-slider-thumb {
123
+ outline: var(--slider-focus-ring, 2px solid #2196f3);
124
+ outline-offset: 2px;
125
+ }
126
+
127
+ .slider-input:focus-visible::-moz-range-thumb {
128
+ outline: var(--slider-focus-ring, 2px solid #2196f3);
129
+ outline-offset: 2px;
130
+ }
131
+
132
+ .slider-input::-moz-range-track {
133
+ height: var(--slider-track-height, 6px);
134
+ border-radius: var(--slider-track-border-radius, 3px);
135
+ background: transparent;
136
+ }
137
+
138
+ .slider-value {
139
+ font-size: var(--slider-value-font-size, 14px);
140
+ font-weight: var(--slider-value-font-weight, 500);
141
+ color: var(--slider-value-color, #333333);
142
+ white-space: nowrap;
143
+ }
144
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { SliderProperties } from './properties';
2
+ declare const Slider: import("svelte").Component<SliderProperties, {}, "value">;
3
+ type Slider = ReturnType<typeof Slider>;
4
+ export default Slider;
@@ -0,0 +1,17 @@
1
+ export type SliderProperties = MandatorySliderProperties & OptionalSliderProperties & SliderEventProperties;
2
+ export type MandatorySliderProperties = {
3
+ value: number;
4
+ };
5
+ export type OptionalSliderProperties = {
6
+ min?: number;
7
+ max?: number;
8
+ step?: number;
9
+ disabled?: boolean;
10
+ showValue?: boolean;
11
+ testId?: string;
12
+ classes?: string;
13
+ };
14
+ export type SliderEventProperties = {
15
+ onchange?: (value: number) => void;
16
+ oninput?: (value: number) => void;
17
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,123 @@
1
+ <script lang="ts">
2
+ import type { SnippetProperties } from './properties';
3
+ import Button from '../Button/Button.svelte';
4
+ import copySvg from '../assets/copy.svg?raw';
5
+
6
+ let {
7
+ text,
8
+ prompt = '$',
9
+ showCopyButton = true,
10
+ testId,
11
+ copyIcon,
12
+ oncopy,
13
+ classes
14
+ }: SnippetProperties = $props();
15
+
16
+ let copied = $state(false);
17
+
18
+ async function handleCopy() {
19
+ try {
20
+ await navigator.clipboard.writeText(text);
21
+ copied = true;
22
+ oncopy?.();
23
+ setTimeout(() => {
24
+ copied = false;
25
+ }, 2000);
26
+ } catch {
27
+ // Clipboard API unavailable (non-secure context, iframe restrictions)
28
+ }
29
+ }
30
+ </script>
31
+
32
+ <div class="snippet {classes ?? ''}" data-pw={typeof testId === 'string' ? testId : null}>
33
+ <code class="snippet-code">
34
+ <span class="snippet-prompt">{prompt}</span>
35
+ <span class="snippet-text">{text}</span>
36
+ </code>
37
+ {#if showCopyButton}
38
+ <div class="snippet-copy">
39
+ <Button onclick={handleCopy} ariaLabel="Copy to clipboard">
40
+ {#if copied}
41
+ <span class="snippet-copied">Copied!</span>
42
+ {:else if typeof copyIcon === 'function'}
43
+ {@render copyIcon()}
44
+ {:else}
45
+ <!-- eslint-disable svelte/no-at-html-tags -->
46
+ <span class="snippet-copy-icon">{@html copySvg}</span>
47
+ {/if}
48
+ </Button>
49
+ </div>
50
+ {/if}
51
+ </div>
52
+
53
+ <style>
54
+ .snippet {
55
+ display: flex;
56
+ align-items: center;
57
+ justify-content: space-between;
58
+ gap: var(--snippet-gap, 8px);
59
+ background: var(--snippet-background, #1e1e1e);
60
+ border: var(--snippet-border, 1px solid #333);
61
+ border-radius: var(--snippet-border-radius, 6px);
62
+ padding: var(--snippet-padding, 12px 16px);
63
+ font-family: var(--snippet-font-family, monospace);
64
+ font-size: var(--snippet-font-size, 14px);
65
+ color: var(--snippet-color, #e0e0e0);
66
+ margin: var(--snippet-margin, 0);
67
+ }
68
+
69
+ .snippet-code {
70
+ display: flex;
71
+ align-items: center;
72
+ overflow: hidden;
73
+ flex: 1;
74
+ min-width: 0;
75
+ }
76
+
77
+ .snippet-prompt {
78
+ color: var(--snippet-prompt-color, #888);
79
+ margin-right: var(--snippet-prompt-margin-right, 8px);
80
+ flex-shrink: 0;
81
+ }
82
+
83
+ .snippet-text {
84
+ color: var(--snippet-text-color, #e0e0e0);
85
+ font-family: var(--snippet-text-font-family, inherit);
86
+ white-space: nowrap;
87
+ overflow: hidden;
88
+ text-overflow: ellipsis;
89
+ }
90
+
91
+ .snippet-copy {
92
+ --button-color: var(--snippet-copy-background, transparent);
93
+ --button-text-color: var(--snippet-copy-color, #888);
94
+ --button-border: var(--snippet-copy-border, none);
95
+ --button-padding: var(--snippet-copy-padding, 4px);
96
+ --button-border-radius: var(--snippet-copy-border-radius, 4px);
97
+ --cursor: var(--snippet-copy-cursor, pointer);
98
+ --button-hover-color: var(--snippet-copy-hover-background, #333);
99
+ display: flex;
100
+ align-items: center;
101
+ justify-content: center;
102
+ flex-shrink: 0;
103
+ }
104
+
105
+ .snippet-copy-icon {
106
+ display: inline-flex;
107
+ align-items: center;
108
+ justify-content: center;
109
+ width: var(--snippet-copy-size, 16px);
110
+ height: var(--snippet-copy-size, 16px);
111
+ }
112
+
113
+ .snippet-copy-icon :global(svg) {
114
+ width: 100%;
115
+ height: 100%;
116
+ }
117
+
118
+ .snippet-copied {
119
+ color: var(--snippet-copied-color, #4caf50);
120
+ font-size: var(--snippet-copied-font-size, 12px);
121
+ font-family: var(--snippet-font-family, monospace);
122
+ }
123
+ </style>