spaper 1.3.0 → 2.0.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 (200) hide show
  1. package/README.md +20 -58
  2. package/dist/components/Alert.svelte +83 -0
  3. package/dist/components/Alert.svelte.d.ts +15 -0
  4. package/dist/components/Article.svelte +63 -0
  5. package/dist/components/Article.svelte.d.ts +17 -0
  6. package/dist/components/Avatar/Avatar.svelte +102 -0
  7. package/dist/components/Avatar/Avatar.svelte.d.ts +16 -0
  8. package/dist/components/Avatar/AvatarGroup.svelte +21 -0
  9. package/dist/components/Avatar/AvatarGroup.svelte.d.ts +9 -0
  10. package/dist/components/Avatar/index.d.ts +2 -0
  11. package/dist/components/Avatar/index.js +2 -0
  12. package/dist/components/Breadcrumb.svelte +33 -0
  13. package/dist/components/Breadcrumb.svelte.d.ts +12 -0
  14. package/dist/components/Button.svelte +174 -0
  15. package/dist/components/Button.svelte.d.ts +33 -0
  16. package/dist/components/Card.svelte +101 -0
  17. package/dist/components/Card.svelte.d.ts +22 -0
  18. package/dist/components/Carousel/Carousel.svelte +204 -0
  19. package/dist/components/Carousel/Carousel.svelte.d.ts +27 -0
  20. package/dist/components/Carousel/CarouselItem.svelte +48 -0
  21. package/dist/components/Carousel/CarouselItem.svelte.d.ts +7 -0
  22. package/{components → dist/components}/Carousel/index.d.ts +1 -0
  23. package/dist/components/Carousel/types.d.ts +22 -0
  24. package/dist/components/CloseButton.svelte +34 -0
  25. package/dist/components/CloseButton.svelte.d.ts +8 -0
  26. package/dist/components/Collapsible.svelte +64 -0
  27. package/dist/components/Collapsible.svelte.d.ts +16 -0
  28. package/dist/components/CopyButton.svelte +54 -0
  29. package/dist/components/CopyButton.svelte.d.ts +13 -0
  30. package/dist/components/Divider.svelte +9 -0
  31. package/dist/components/Divider.svelte.d.ts +6 -0
  32. package/dist/components/Form/Checkbox.svelte +54 -0
  33. package/dist/components/Form/Checkbox.svelte.d.ts +15 -0
  34. package/dist/components/Form/Input.svelte +105 -0
  35. package/dist/components/Form/Input.svelte.d.ts +21 -0
  36. package/dist/components/Form/NumberInput/DecrementButton.svelte +14 -0
  37. package/dist/components/Form/NumberInput/DecrementButton.svelte.d.ts +9 -0
  38. package/dist/components/Form/NumberInput/IncrementButton.svelte +14 -0
  39. package/dist/components/Form/NumberInput/IncrementButton.svelte.d.ts +9 -0
  40. package/dist/components/Form/NumberInput/NumberInput.svelte +227 -0
  41. package/dist/components/Form/NumberInput/NumberInput.svelte.d.ts +34 -0
  42. package/dist/components/Form/NumberInput/index.d.ts +3 -0
  43. package/dist/components/Form/NumberInput/index.js +3 -0
  44. package/dist/components/Form/Radio.svelte +42 -0
  45. package/dist/components/Form/Radio.svelte.d.ts +13 -0
  46. package/dist/components/Form/Select.svelte +61 -0
  47. package/dist/components/Form/Select.svelte.d.ts +12 -0
  48. package/dist/components/Form/Slider.svelte +129 -0
  49. package/dist/components/Form/Slider.svelte.d.ts +22 -0
  50. package/dist/components/Form/Switch.svelte +101 -0
  51. package/dist/components/Form/Switch.svelte.d.ts +22 -0
  52. package/dist/components/Form/index.d.ts +9 -0
  53. package/{components → dist/components}/Form/index.js +2 -2
  54. package/dist/components/Hero.svelte +78 -0
  55. package/dist/components/Hero.svelte.d.ts +17 -0
  56. package/dist/components/Icon.svelte +102 -0
  57. package/dist/components/Icon.svelte.d.ts +27 -0
  58. package/dist/components/Modal/Modal.svelte +120 -0
  59. package/dist/components/Modal/Modal.svelte.d.ts +19 -0
  60. package/dist/components/Modal/index.d.ts +12 -0
  61. package/dist/components/Modal/index.js +30 -0
  62. package/dist/components/Navbar.svelte +98 -0
  63. package/dist/components/Navbar.svelte.d.ts +11 -0
  64. package/dist/components/Pagination/Arrow.svelte +29 -0
  65. package/dist/components/Pagination/Arrow.svelte.d.ts +8 -0
  66. package/dist/components/Pagination/NavigationButton.svelte +33 -0
  67. package/dist/components/Pagination/NavigationButton.svelte.d.ts +13 -0
  68. package/dist/components/Pagination/Pagination.svelte +209 -0
  69. package/dist/components/Pagination/Pagination.svelte.d.ts +32 -0
  70. package/{components → dist/components}/Pagination/arrow-dimension.js +3 -3
  71. package/{components → dist/components}/Pagination/index.d.ts +1 -1
  72. package/dist/components/Popover.svelte +64 -0
  73. package/dist/components/Popover.svelte.d.ts +17 -0
  74. package/dist/components/Progress.svelte +87 -0
  75. package/dist/components/Progress.svelte.d.ts +19 -0
  76. package/dist/components/ScrollTop.svelte +79 -0
  77. package/dist/components/ScrollTop.svelte.d.ts +17 -0
  78. package/dist/components/Skeleton.svelte +104 -0
  79. package/dist/components/Skeleton.svelte.d.ts +21 -0
  80. package/dist/components/Spinner.svelte +59 -0
  81. package/dist/components/Spinner.svelte.d.ts +16 -0
  82. package/dist/components/Table/Table.svelte +292 -0
  83. package/dist/components/Table/Table.svelte.d.ts +25 -0
  84. package/dist/components/Table/TableColumn.svelte +62 -0
  85. package/dist/components/Table/TableColumn.svelte.d.ts +15 -0
  86. package/dist/components/Table/context.d.ts +13 -0
  87. package/dist/components/Table/context.js +1 -0
  88. package/dist/components/Table/index.d.ts +2 -0
  89. package/dist/components/Table/index.js +2 -0
  90. package/dist/components/Tabs/Tab.svelte +90 -0
  91. package/dist/components/Tabs/Tab.svelte.d.ts +14 -0
  92. package/dist/components/Tabs/Tabs.svelte +138 -0
  93. package/dist/components/Tabs/Tabs.svelte.d.ts +13 -0
  94. package/{components → dist/components}/Tabs/utils.d.ts +4 -3
  95. package/dist/components/Tag.svelte +38 -0
  96. package/dist/components/Tag.svelte.d.ts +10 -0
  97. package/dist/components/Toast/Toast.svelte +105 -0
  98. package/dist/components/Toast/Toast.svelte.d.ts +6 -0
  99. package/dist/components/Toast/ToastContainer.svelte +101 -0
  100. package/dist/components/Toast/ToastContainer.svelte.d.ts +8 -0
  101. package/{components → dist/components}/Toast/index.d.ts +19 -5
  102. package/dist/components/Toast/index.js +100 -0
  103. package/dist/icons.d.ts +3 -0
  104. package/dist/icons.js +2 -0
  105. package/dist/index.d.ts +31 -0
  106. package/{index.js → dist/index.js} +10 -5
  107. package/dist/type-icons.d.ts +4 -0
  108. package/dist/type-icons.js +9 -0
  109. package/dist/types.d.ts +29 -0
  110. package/dist/utils.d.ts +16 -0
  111. package/dist/utils.js +44 -0
  112. package/package.json +70 -64
  113. package/components/Alert.svelte +0 -34
  114. package/components/Alert.svelte.d.ts +0 -21
  115. package/components/Article.svelte +0 -39
  116. package/components/Article.svelte.d.ts +0 -26
  117. package/components/Badge.svelte +0 -16
  118. package/components/Badge.svelte.d.ts +0 -20
  119. package/components/Breadcrumb.svelte +0 -17
  120. package/components/Breadcrumb.svelte.d.ts +0 -21
  121. package/components/Button.svelte +0 -41
  122. package/components/Button.svelte.d.ts +0 -30
  123. package/components/Card.svelte +0 -70
  124. package/components/Card.svelte.d.ts +0 -32
  125. package/components/Carousel/Carousel.svelte +0 -128
  126. package/components/Carousel/Carousel.svelte.d.ts +0 -35
  127. package/components/Carousel/CarouselItem.svelte +0 -32
  128. package/components/Carousel/CarouselItem.svelte.d.ts +0 -18
  129. package/components/Carousel/types.d.ts +0 -14
  130. package/components/CloseButton.svelte +0 -23
  131. package/components/CloseButton.svelte.d.ts +0 -19
  132. package/components/Collapsible.svelte +0 -49
  133. package/components/Collapsible.svelte.d.ts +0 -21
  134. package/components/CopyButton.svelte +0 -43
  135. package/components/CopyButton.svelte.d.ts +0 -24
  136. package/components/Form/Checkbox.svelte +0 -37
  137. package/components/Form/Checkbox.svelte.d.ts +0 -26
  138. package/components/Form/Form.svelte +0 -11
  139. package/components/Form/Form.svelte.d.ts +0 -26
  140. package/components/Form/Input.svelte +0 -74
  141. package/components/Form/Input.svelte.d.ts +0 -28
  142. package/components/Form/Radio.svelte +0 -26
  143. package/components/Form/Radio.svelte.d.ts +0 -25
  144. package/components/Form/Select.svelte +0 -40
  145. package/components/Form/Select.svelte.d.ts +0 -24
  146. package/components/Form/Slider.svelte +0 -124
  147. package/components/Form/Slider.svelte.d.ts +0 -30
  148. package/components/Form/Switch.svelte +0 -71
  149. package/components/Form/index.d.ts +0 -9
  150. package/components/Form/style.scss +0 -4
  151. package/components/Hero.svelte +0 -78
  152. package/components/Hero.svelte.d.ts +0 -26
  153. package/components/Layout/Col.svelte +0 -25
  154. package/components/Layout/Col.svelte.d.ts +0 -27
  155. package/components/Layout/Row.svelte +0 -24
  156. package/components/Layout/Row.svelte.d.ts +0 -26
  157. package/components/Layout/index.d.ts +0 -2
  158. package/components/Layout/index.js +0 -2
  159. package/components/Modal/Modal.svelte +0 -62
  160. package/components/Modal/Modal.svelte.d.ts +0 -28
  161. package/components/Modal/index.d.ts +0 -13
  162. package/components/Modal/index.js +0 -17
  163. package/components/Navbar.svelte +0 -40
  164. package/components/Navbar.svelte.d.ts +0 -22
  165. package/components/Pagination/Arrow.svelte +0 -17
  166. package/components/Pagination/Arrow.svelte.d.ts +0 -19
  167. package/components/Pagination/NavigationButton.svelte +0 -23
  168. package/components/Pagination/NavigationButton.svelte.d.ts +0 -23
  169. package/components/Pagination/Pagination.svelte +0 -137
  170. package/components/Pagination/Pagination.svelte.d.ts +0 -36
  171. package/components/Popover.svelte +0 -57
  172. package/components/Popover.svelte.d.ts +0 -25
  173. package/components/Progress.svelte +0 -39
  174. package/components/Progress.svelte.d.ts +0 -25
  175. package/components/Skeleton.svelte +0 -55
  176. package/components/Skeleton.svelte.d.ts +0 -22
  177. package/components/Table.svelte +0 -73
  178. package/components/Table.svelte.d.ts +0 -24
  179. package/components/Tabs/Tab.svelte +0 -52
  180. package/components/Tabs/Tab.svelte.d.ts +0 -20
  181. package/components/Tabs/Tabs.svelte +0 -90
  182. package/components/Tabs/Tabs.svelte.d.ts +0 -25
  183. package/components/Toast/Toast.svelte +0 -91
  184. package/components/Toast/Toast.svelte.d.ts +0 -26
  185. package/components/Toast/ToastContainer.svelte +0 -37
  186. package/components/Toast/ToastContainer.svelte.d.ts +0 -18
  187. package/components/Toast/index.js +0 -37
  188. package/index.d.ts +0 -23
  189. package/types.d.ts +0 -16
  190. package/utils.d.ts +0 -16
  191. package/utils.js +0 -34
  192. /package/{components → dist/components}/Carousel/index.js +0 -0
  193. /package/{components → dist/components}/Carousel/types.js +0 -0
  194. /package/{components → dist/components}/Pagination/arrow-dimension.d.ts +0 -0
  195. /package/{components → dist/components}/Pagination/index.js +0 -0
  196. /package/{components → dist/components}/Tabs/index.d.ts +0 -0
  197. /package/{components → dist/components}/Tabs/index.js +0 -0
  198. /package/{components → dist/components}/Tabs/utils.js +0 -0
  199. /package/{components → dist/components}/style.scss +0 -0
  200. /package/{types.js → dist/types.js} +0 -0
@@ -0,0 +1,33 @@
1
+ import type { PaperSize, PaperType } from '../types';
2
+ import type { IconNode } from '../icons';
3
+ interface Props {
4
+ type?: PaperType | null;
5
+ /** Icon shown to the left of the label. */
6
+ icon?: IconNode | null;
7
+ size?: PaperSize;
8
+ block?: boolean;
9
+ disabled?: boolean;
10
+ loading?: boolean;
11
+ outline?: PaperType | null;
12
+ /**
13
+ * The `type` attribute for `<button>`. Useful for forms.
14
+ * Ignored if rendered as a link.
15
+ */
16
+ nativeType?: 'submit' | 'reset' | 'button' | null;
17
+ /** When true, the button is rendered as an `<a>` element. */
18
+ isLink?: boolean;
19
+ href?: string | null;
20
+ /** When true and `isLink` is set,
21
+ * adds `target="_blank"` and `rel="noopener noreferrer"`
22
+ * to the link for external navigation.
23
+ */
24
+ external?: boolean;
25
+ onclick?: (e: MouseEvent) => void;
26
+ children?: import('svelte').Snippet;
27
+ /** Replaces the default spinner while `loading` is set. */
28
+ loader?: import('svelte').Snippet;
29
+ [key: string]: any;
30
+ }
31
+ declare const Button: import("svelte").Component<Props, {}, "">;
32
+ type Button = ReturnType<typeof Button>;
33
+ export default Button;
@@ -0,0 +1,101 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte'
3
+ import type { PositionY, StringOrSnippet } from '../types'
4
+ import { isSnippet } from '../utils'
5
+
6
+ interface Props {
7
+ title?: StringOrSnippet
8
+ subTitle?: StringOrSnippet
9
+ image?: string
10
+ imageAlt?: string
11
+ imagePlacement?: PositionY
12
+ header?: StringOrSnippet
13
+ footer?: StringOrSnippet
14
+ /** @deprecated Use a width class, e.g. `class="w-1/2"`. */
15
+ width?: string
16
+ /** Root element. */
17
+ as?: keyof HTMLElementTagNameMap
18
+ children?: Snippet
19
+ bottom?: Snippet
20
+ class?: string
21
+ [key: string]: unknown
22
+ }
23
+
24
+ let {
25
+ title = '',
26
+ subTitle = '',
27
+ image = '',
28
+ imageAlt = '',
29
+ imagePlacement = 'top',
30
+ header = '',
31
+ footer = '',
32
+ width,
33
+ as = 'article',
34
+ children,
35
+ bottom,
36
+ class: className = '',
37
+ ...rest
38
+ }: Props = $props()
39
+
40
+ const showImage = $derived(Boolean(image))
41
+ </script>
42
+
43
+ <svelte:element
44
+ this={as}
45
+ {...rest}
46
+ class={['card-paper', className]}
47
+ {...width ? { style: `width: ${width}` } : {}}
48
+ >
49
+ {#if header}
50
+ <header class="card-paper-header">
51
+ {#if isSnippet(header)}
52
+ {@render header()}
53
+ {:else}
54
+ {header}
55
+ {/if}
56
+ </header>
57
+ {/if}
58
+
59
+ {#if showImage && imagePlacement === 'top'}
60
+ <img class="w-full object-cover" src={image} alt={imageAlt} />
61
+ {/if}
62
+
63
+ <div class="card-paper-body">
64
+ <h4 class="card-paper-title">
65
+ {#if isSnippet(title)}
66
+ {@render title()}
67
+ {:else}
68
+ {title}
69
+ {/if}
70
+ </h4>
71
+ <h5 class="card-paper-subtitle">
72
+ {#if isSnippet(subTitle)}
73
+ {@render subTitle()}
74
+ {:else}
75
+ {subTitle}
76
+ {/if}
77
+ </h5>
78
+
79
+ <p class="card-text">
80
+ {@render children?.()}
81
+ </p>
82
+
83
+ {#if bottom}
84
+ {@render bottom()}
85
+ {/if}
86
+ </div>
87
+
88
+ {#if showImage && imagePlacement === 'bottom'}
89
+ <img class="image-bottom w-full object-cover" src={image} alt={imageAlt} />
90
+ {/if}
91
+
92
+ {#if footer}
93
+ <footer class="card-paper-footer">
94
+ {#if isSnippet(footer)}
95
+ {@render footer()}
96
+ {:else}
97
+ {footer}
98
+ {/if}
99
+ </footer>
100
+ {/if}
101
+ </svelte:element>
@@ -0,0 +1,22 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { PositionY, StringOrSnippet } from '../types';
3
+ interface Props {
4
+ title?: StringOrSnippet;
5
+ subTitle?: StringOrSnippet;
6
+ image?: string;
7
+ imageAlt?: string;
8
+ imagePlacement?: PositionY;
9
+ header?: StringOrSnippet;
10
+ footer?: StringOrSnippet;
11
+ /** @deprecated Use a width class, e.g. `class="w-1/2"`. */
12
+ width?: string;
13
+ /** Root element. */
14
+ as?: keyof HTMLElementTagNameMap;
15
+ children?: Snippet;
16
+ bottom?: Snippet;
17
+ class?: string;
18
+ [key: string]: unknown;
19
+ }
20
+ declare const Card: import("svelte").Component<Props, {}, "">;
21
+ type Card = ReturnType<typeof Card>;
22
+ export default Card;
@@ -0,0 +1,204 @@
1
+ <script lang="ts">
2
+ import { onMount, setContext } from 'svelte'
3
+ import { writable } from 'svelte/store'
4
+ import type { Transition } from '../../types'
5
+ import type {
6
+ CarouselControls,
7
+ CarouselItemsStore,
8
+ CarouselItemsData,
9
+ TransitionStore,
10
+ } from './types'
11
+ import Pagination from '../Pagination/Pagination.svelte'
12
+
13
+ interface Props {
14
+ index?: number
15
+ /** The interval in milliseconds between slides. */
16
+ interval?: number
17
+ autoplay?: boolean
18
+ repeat?: boolean
19
+ pauseOnHover?: boolean
20
+ bullets?: boolean
21
+ keyNavigation?: boolean
22
+ transition?: Transition | null
23
+ onchange?: (index: number) => void
24
+ onclick?: (e: MouseEvent) => void
25
+ onkeydown?: (e: KeyboardEvent) => void
26
+ onmouseover?: (e: MouseEvent) => void
27
+ onmouseenter?: (e: MouseEvent) => void
28
+ onmouseleave?: (e: MouseEvent) => void
29
+ onfocus?: (e: FocusEvent) => void
30
+ /** Replaces the default bullets. Receives 0-based index helpers. */
31
+ controls?: import('svelte').Snippet<[CarouselControls]>
32
+ children?: import('svelte').Snippet
33
+ [key: string]: any
34
+ }
35
+
36
+ let {
37
+ index = $bindable(0),
38
+ interval = 2500,
39
+ autoplay = true,
40
+ repeat = true,
41
+ pauseOnHover = true,
42
+ bullets = true,
43
+ keyNavigation = true,
44
+ transition = 'fade',
45
+ onchange,
46
+ onclick,
47
+ onkeydown,
48
+ onmouseover,
49
+ onmouseenter,
50
+ onmouseleave,
51
+ onfocus,
52
+ controls,
53
+ children,
54
+ ...rest
55
+ }: Props = $props()
56
+
57
+ let intervalId: number
58
+
59
+ const items: CarouselItemsStore = writable([])
60
+ const transitionStore: TransitionStore = writable(null)
61
+ $effect(() => {
62
+ // Use .set() — `$store =` inside an effect re-subscribes and loops forever.
63
+ transitionStore.set(transition)
64
+ })
65
+ const itemsData: CarouselItemsData = {
66
+ activeItem: index,
67
+ items,
68
+ transition: transitionStore,
69
+ }
70
+
71
+ setContext('carouselItems', itemsData)
72
+
73
+ onMount(() => {
74
+ $items[index]?.show()
75
+ if (autoplay) {
76
+ setUpAutoplay()
77
+ return () => clearInterval(intervalId)
78
+ }
79
+ })
80
+
81
+ function setUpAutoplay() {
82
+ if (intervalId) clearInterval(intervalId)
83
+ if (!autoplay) return
84
+
85
+ intervalId = window.setInterval(() => {
86
+ if (!length) return
87
+ index = (index + 1) % length
88
+ if (!repeat && index === length - 1) {
89
+ clearInterval(intervalId)
90
+ }
91
+ }, interval)
92
+ }
93
+
94
+ function navigationHandler(value: number) {
95
+ goToItem(value - 1)
96
+ }
97
+
98
+ function goToItem(idx: number) {
99
+ if (autoplay) {
100
+ setUpAutoplay()
101
+ }
102
+ index = idx
103
+ }
104
+
105
+ function next() {
106
+ if (!length) return
107
+ goToItem((index + 1) % length)
108
+ }
109
+
110
+ function previous() {
111
+ if (!length) return
112
+ goToItem((length + index - 1) % length)
113
+ }
114
+
115
+ function pause() {
116
+ if (!pauseOnHover || !autoplay) return
117
+
118
+ clearInterval(intervalId)
119
+ }
120
+
121
+ function resume() {
122
+ if (!pauseOnHover || !autoplay) return
123
+
124
+ setUpAutoplay()
125
+ }
126
+
127
+ function handleKeydown(e: KeyboardEvent) {
128
+ onkeydown?.(e)
129
+ if (!keyNavigation || !length) return
130
+
131
+ switch (e.key) {
132
+ case 'ArrowRight':
133
+ next()
134
+ break
135
+ case 'ArrowLeft':
136
+ previous()
137
+ break
138
+ }
139
+ }
140
+
141
+ function handleMouseEnter(e: MouseEvent) {
142
+ onmouseenter?.(e)
143
+ pause()
144
+ }
145
+
146
+ function handleMouseLeave(e: MouseEvent) {
147
+ onmouseleave?.(e)
148
+ resume()
149
+ }
150
+
151
+ function updateTabsVisility() {
152
+ $items.forEach((item, idx) => {
153
+ if (idx === index) item.show()
154
+ else item.hide()
155
+ })
156
+ }
157
+
158
+ $effect(() => {
159
+ if (index > -1) {
160
+ updateTabsVisility()
161
+ onchange?.(index)
162
+ }
163
+ })
164
+ let { length } = $derived($items)
165
+ </script>
166
+
167
+ <section
168
+ {...rest}
169
+ class={['outline-none', rest.class]}
170
+ {onclick}
171
+ onkeydown={handleKeydown}
172
+ {onmouseover}
173
+ {onfocus}
174
+ onmouseenter={handleMouseEnter}
175
+ onmouseleave={handleMouseLeave}
176
+ >
177
+ <div
178
+ class={[
179
+ 'relative inline-block',
180
+ 'min-h-(--min-height,120px) h-(--height,auto) max-h-(--max-height,none)',
181
+ 'min-w-(--min-width,0) w-(--width,auto) max-w-(--max-width,none)',
182
+ ]}
183
+ >
184
+ {@render children?.()}
185
+ {#if controls}
186
+ {@render controls({
187
+ index,
188
+ length,
189
+ goTo: goToItem,
190
+ next,
191
+ previous,
192
+ })}
193
+ {:else if bullets}
194
+ <Pagination
195
+ class="mt-2 flex w-full justify-center"
196
+ total={length}
197
+ pageSize={1}
198
+ current={index + 1}
199
+ bullets
200
+ onchange={navigationHandler}
201
+ />
202
+ {/if}
203
+ </div>
204
+ </section>
@@ -0,0 +1,27 @@
1
+ import type { Transition } from '../../types';
2
+ import type { CarouselControls } from './types';
3
+ interface Props {
4
+ index?: number;
5
+ /** The interval in milliseconds between slides. */
6
+ interval?: number;
7
+ autoplay?: boolean;
8
+ repeat?: boolean;
9
+ pauseOnHover?: boolean;
10
+ bullets?: boolean;
11
+ keyNavigation?: boolean;
12
+ transition?: Transition | null;
13
+ onchange?: (index: number) => void;
14
+ onclick?: (e: MouseEvent) => void;
15
+ onkeydown?: (e: KeyboardEvent) => void;
16
+ onmouseover?: (e: MouseEvent) => void;
17
+ onmouseenter?: (e: MouseEvent) => void;
18
+ onmouseleave?: (e: MouseEvent) => void;
19
+ onfocus?: (e: FocusEvent) => void;
20
+ /** Replaces the default bullets. Receives 0-based index helpers. */
21
+ controls?: import('svelte').Snippet<[CarouselControls]>;
22
+ children?: import('svelte').Snippet;
23
+ [key: string]: any;
24
+ }
25
+ declare const Carousel: import("svelte").Component<Props, {}, "index">;
26
+ type Carousel = ReturnType<typeof Carousel>;
27
+ export default Carousel;
@@ -0,0 +1,48 @@
1
+ <script lang="ts">
2
+ import { onDestroy, getContext } from 'svelte'
3
+ import type { CarouselItemsData } from './types'
4
+ import { configureTransition } from '../../utils'
5
+ interface Props {
6
+ children?: import('svelte').Snippet
7
+ [key: string]: any
8
+ }
9
+
10
+ let { children, ...rest }: Props = $props()
11
+
12
+ const key = Symbol()
13
+ let active: boolean = $state(false)
14
+
15
+ const itemsData: CarouselItemsData = getContext('carouselItems')
16
+
17
+ if (!itemsData)
18
+ throw new Error('CarouselItem should be nested inside a Carousel')
19
+
20
+ // Register during init so the parent can show the first slide without racing onMount.
21
+ itemsData.items.update((list) => [
22
+ ...list,
23
+ {
24
+ key,
25
+ show: () => (active = true),
26
+ hide: () => (active = false),
27
+ },
28
+ ])
29
+
30
+ onDestroy(() => {
31
+ itemsData.items.update((list) => list.filter((item) => item.key !== key))
32
+ })
33
+
34
+ let { transition } = $derived(itemsData)
35
+ </script>
36
+
37
+ {#if active}
38
+ <div
39
+ {...rest}
40
+ class={['carousel-item', rest.class]}
41
+ in:configureTransition={{
42
+ name: $transition,
43
+ disabled: !$transition,
44
+ }}
45
+ >
46
+ {@render children?.()}
47
+ </div>
48
+ {/if}
@@ -0,0 +1,7 @@
1
+ interface Props {
2
+ children?: import('svelte').Snippet;
3
+ [key: string]: any;
4
+ }
5
+ declare const CarouselItem: import("svelte").Component<Props, {}, "">;
6
+ type CarouselItem = ReturnType<typeof CarouselItem>;
7
+ export default CarouselItem;
@@ -1,2 +1,3 @@
1
1
  export { default as Carousel } from './Carousel.svelte';
2
2
  export { default as CarouselItem } from './CarouselItem.svelte';
3
+ export type { CarouselControls } from './types';
@@ -0,0 +1,22 @@
1
+ import type { Transition } from '../../types';
2
+ import type { Writable } from 'svelte/store';
3
+ export interface iCarouselItem {
4
+ key: symbol;
5
+ show: () => void;
6
+ hide: () => void;
7
+ }
8
+ export type CarouselItemsStore = Writable<iCarouselItem[]>;
9
+ export type TransitionStore = Writable<Transition | null>;
10
+ export interface CarouselItemsData {
11
+ activeItem: number;
12
+ items: CarouselItemsStore;
13
+ transition: TransitionStore;
14
+ }
15
+ /** Arguments passed to the Carousel `controls` snippet. Index is 0-based. */
16
+ export interface CarouselControls {
17
+ index: number;
18
+ length: number;
19
+ goTo: (index: number) => void;
20
+ next: () => void;
21
+ previous: () => void;
22
+ }
@@ -0,0 +1,34 @@
1
+ <script lang="ts">
2
+ import Icon from './Icon.svelte'
3
+ import { X } from '../icons'
4
+
5
+ interface Props {
6
+ ariaLabel?: string
7
+ onclick?: (e: MouseEvent) => void
8
+ [key: string]: any
9
+ }
10
+
11
+ let { ariaLabel = 'close', onclick, ...rest }: Props = $props()
12
+ </script>
13
+
14
+ <button {...rest} aria-label={ariaLabel} onclick={(e) => onclick?.(e)}>
15
+ <Icon name={X} size={18} />
16
+ </button>
17
+
18
+ <style>
19
+ button {
20
+ cursor: pointer;
21
+ float: right;
22
+ border: 0;
23
+ padding: 0;
24
+ background: none;
25
+ box-shadow: none;
26
+ transform: none;
27
+ &:hover,
28
+ &:focus {
29
+ transform: none;
30
+ box-shadow: none;
31
+ border: 0;
32
+ }
33
+ }
34
+ </style>
@@ -0,0 +1,8 @@
1
+ interface Props {
2
+ ariaLabel?: string;
3
+ onclick?: (e: MouseEvent) => void;
4
+ [key: string]: any;
5
+ }
6
+ declare const CloseButton: import("svelte").Component<Props, {}, "">;
7
+ type CloseButton = ReturnType<typeof CloseButton>;
8
+ export default CloseButton;
@@ -0,0 +1,64 @@
1
+ <script lang="ts">
2
+ import Icon from './Icon.svelte'
3
+ import { ChevronDown } from '../icons'
4
+
5
+ interface Props {
6
+ label?: string
7
+ open?: boolean
8
+ /** Shared `name` → native exclusive accordion (only one open at a time). */
9
+ name?: string
10
+ /** Show the expand/collapse chevron next to the trigger. */
11
+ chevron?: boolean
12
+ onopen?: () => void
13
+ onclose?: () => void
14
+ trigger?: import('svelte').Snippet<[boolean]>
15
+ children?: import('svelte').Snippet
16
+ [key: string]: any
17
+ }
18
+
19
+ let {
20
+ label = '',
21
+ open = $bindable(false),
22
+ name = undefined,
23
+ chevron = true,
24
+ onopen,
25
+ onclose,
26
+ trigger,
27
+ children,
28
+ ...rest
29
+ }: Props = $props()
30
+
31
+ function onToggle(e: Event) {
32
+ const el = e.currentTarget as HTMLDetailsElement
33
+ open = el.open
34
+ if (open) onopen?.()
35
+ else onclose?.()
36
+ }
37
+ </script>
38
+
39
+ <details
40
+ {...rest}
41
+ class={['collapsible-paper', rest.class]}
42
+ {name}
43
+ bind:open
44
+ ontoggle={onToggle}
45
+ >
46
+ <summary class="flex! items-center justify-center gap-2">
47
+ <span class="min-w-0">
48
+ {#if trigger}{@render trigger(open)}{:else}{label}{/if}
49
+ </span>
50
+ {#if chevron}
51
+ <Icon
52
+ name={ChevronDown}
53
+ size={18}
54
+ class={[
55
+ 'shrink-0 transition-transform ease-[ease]',
56
+ 'duration-(--paper-collapsible-duration,0.3s)',
57
+ { 'rotate-180': open },
58
+ ]}
59
+ aria-hidden="true"
60
+ />
61
+ {/if}
62
+ </summary>
63
+ {@render children?.()}
64
+ </details>
@@ -0,0 +1,16 @@
1
+ interface Props {
2
+ label?: string;
3
+ open?: boolean;
4
+ /** Shared `name` → native exclusive accordion (only one open at a time). */
5
+ name?: string;
6
+ /** Show the expand/collapse chevron next to the trigger. */
7
+ chevron?: boolean;
8
+ onopen?: () => void;
9
+ onclose?: () => void;
10
+ trigger?: import('svelte').Snippet<[boolean]>;
11
+ children?: import('svelte').Snippet;
12
+ [key: string]: any;
13
+ }
14
+ declare const Collapsible: import("svelte").Component<Props, {}, "open">;
15
+ type Collapsible = ReturnType<typeof Collapsible>;
16
+ export default Collapsible;
@@ -0,0 +1,54 @@
1
+ <script lang="ts">
2
+ import Button from './Button.svelte'
3
+ import Icon from './Icon.svelte'
4
+ import { Copy } from '../icons'
5
+ import { success } from './Toast'
6
+
7
+ interface Props {
8
+ /** The text to copy. */
9
+ text: string
10
+ successMessage?: string
11
+ ariaLabel?: string
12
+ onclick?: (e: MouseEvent) => void
13
+ oncopy?: (text: string) => void
14
+ children?: import('svelte').Snippet
15
+ [key: string]: any
16
+ }
17
+
18
+ let {
19
+ text,
20
+ successMessage = 'Copied!',
21
+ ariaLabel = 'Copy to clipboard',
22
+ onclick,
23
+ oncopy,
24
+ children,
25
+ ...rest
26
+ }: Props = $props()
27
+
28
+ async function copy(e: MouseEvent) {
29
+ onclick?.(e)
30
+ if (!text) return
31
+
32
+ try {
33
+ await navigator.clipboard.writeText(text)
34
+ oncopy?.(text)
35
+
36
+ if (successMessage)
37
+ success({
38
+ message: successMessage,
39
+ position: 'top',
40
+ duration: 1000,
41
+ })
42
+ } catch (e) {
43
+ console.error(e)
44
+ }
45
+ }
46
+ </script>
47
+
48
+ <Button {...rest} aria-label={ariaLabel} onclick={copy}>
49
+ {#if children}
50
+ {@render children()}
51
+ {:else}
52
+ <Icon name={Copy} size={18} />
53
+ {/if}
54
+ </Button>
@@ -0,0 +1,13 @@
1
+ interface Props {
2
+ /** The text to copy. */
3
+ text: string;
4
+ successMessage?: string;
5
+ ariaLabel?: string;
6
+ onclick?: (e: MouseEvent) => void;
7
+ oncopy?: (text: string) => void;
8
+ children?: import('svelte').Snippet;
9
+ [key: string]: any;
10
+ }
11
+ declare const CopyButton: import("svelte").Component<Props, {}, "">;
12
+ type CopyButton = ReturnType<typeof CopyButton>;
13
+ export default CopyButton;
@@ -0,0 +1,9 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ [key: string]: any
4
+ }
5
+
6
+ let { ...rest }: Props = $props()
7
+ </script>
8
+
9
+ <hr {...rest} class={['divider-paper', rest.class]} />
@@ -0,0 +1,6 @@
1
+ interface Props {
2
+ [key: string]: any;
3
+ }
4
+ declare const Divider: import("svelte").Component<Props, {}, "">;
5
+ type Divider = ReturnType<typeof Divider>;
6
+ export default Divider;