twintrinsic 0.0.1

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 (212) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +150 -0
  3. package/dist/App/App.svelte +54 -0
  4. package/dist/App/App.svelte.d.ts +65 -0
  5. package/dist/Section.svelte +25 -0
  6. package/dist/Section.svelte.d.ts +34 -0
  7. package/dist/actions/clickOutside.d.ts +9 -0
  8. package/dist/actions/clickOutside.js +19 -0
  9. package/dist/actions/index.d.ts +1 -0
  10. package/dist/actions/index.js +1 -0
  11. package/dist/components/Accordion/Accordion.svelte +75 -0
  12. package/dist/components/Accordion/Accordion.svelte.d.ts +39 -0
  13. package/dist/components/Accordion/AccordionItem.svelte +150 -0
  14. package/dist/components/Accordion/AccordionItem.svelte.d.ts +30 -0
  15. package/dist/components/App/App.story.md +8 -0
  16. package/dist/components/App/App.story.svelte +170 -0
  17. package/dist/components/App/App.story.svelte.d.ts +22 -0
  18. package/dist/components/App/App.svelte +77 -0
  19. package/dist/components/App/App.svelte.d.ts +66 -0
  20. package/dist/components/App/Split.svelte +346 -0
  21. package/dist/components/App/Split.svelte.d.ts +54 -0
  22. package/dist/components/App/index.d.ts +2 -0
  23. package/dist/components/App/index.js +3 -0
  24. package/dist/components/AppHeader/AppHeader.svelte +439 -0
  25. package/dist/components/AppHeader/AppHeader.svelte.d.ts +24 -0
  26. package/dist/components/Avatar/Avatar.svelte +300 -0
  27. package/dist/components/Avatar/Avatar.svelte.d.ts +48 -0
  28. package/dist/components/Avatar/AvatarGroup.svelte +185 -0
  29. package/dist/components/Avatar/AvatarGroup.svelte.d.ts +46 -0
  30. package/dist/components/Badge/Badge.svelte +186 -0
  31. package/dist/components/Badge/Badge.svelte.d.ts +51 -0
  32. package/dist/components/BottomBar/BottomBar.svelte +146 -0
  33. package/dist/components/BottomBar/BottomBar.svelte.d.ts +38 -0
  34. package/dist/components/Breadcrumb/Breadcrumb.svelte +77 -0
  35. package/dist/components/Breadcrumb/Breadcrumb.svelte.d.ts +42 -0
  36. package/dist/components/Breadcrumb/BreadcrumbItem.svelte +171 -0
  37. package/dist/components/Breadcrumb/BreadcrumbItem.svelte.d.ts +38 -0
  38. package/dist/components/Button/Button.svelte +252 -0
  39. package/dist/components/Button/Button.svelte.d.ts +80 -0
  40. package/dist/components/Button/ButtonGroup.svelte +127 -0
  41. package/dist/components/Button/ButtonGroup.svelte.d.ts +44 -0
  42. package/dist/components/Card/Card.svelte +152 -0
  43. package/dist/components/Card/Card.svelte.d.ts +55 -0
  44. package/dist/components/Carousel/Carousel.svelte +461 -0
  45. package/dist/components/Carousel/Carousel.svelte.d.ts +79 -0
  46. package/dist/components/Carousel/CarouselItem.svelte +149 -0
  47. package/dist/components/Carousel/CarouselItem.svelte.d.ts +35 -0
  48. package/dist/components/Chip/Chip.svelte +288 -0
  49. package/dist/components/Chip/Chip.svelte.d.ts +71 -0
  50. package/dist/components/Chip/ChipGroup.svelte +190 -0
  51. package/dist/components/Chip/ChipGroup.svelte.d.ts +71 -0
  52. package/dist/components/CodeBlock/CodeBlock.svelte +356 -0
  53. package/dist/components/CodeBlock/CodeBlock.svelte.d.ts +44 -0
  54. package/dist/components/CodeBlock/index.d.ts +1 -0
  55. package/dist/components/CodeBlock/index.js +1 -0
  56. package/dist/components/CodeBlockSpeed/CodeBlockSpeed.svelte +145 -0
  57. package/dist/components/CodeBlockSpeed/CodeBlockSpeed.svelte.d.ts +44 -0
  58. package/dist/components/CodeEditor/CodeEditor.svelte +229 -0
  59. package/dist/components/CodeEditor/CodeEditor.svelte.d.ts +23 -0
  60. package/dist/components/Combobox/Combobox.svelte +279 -0
  61. package/dist/components/Combobox/Combobox.svelte.d.ts +34 -0
  62. package/dist/components/Container/Container.svelte +45 -0
  63. package/dist/components/Container/Container.svelte.d.ts +36 -0
  64. package/dist/components/DataTable/DataTable.svelte +879 -0
  65. package/dist/components/DataTable/DataTable.svelte.d.ts +102 -0
  66. package/dist/components/Form/AutoComplete.svelte +357 -0
  67. package/dist/components/Form/AutoComplete.svelte.d.ts +73 -0
  68. package/dist/components/Form/Calendar.svelte +429 -0
  69. package/dist/components/Form/Calendar.svelte.d.ts +53 -0
  70. package/dist/components/Form/Checkbox.svelte +196 -0
  71. package/dist/components/Form/Checkbox.svelte.d.ts +50 -0
  72. package/dist/components/Form/ColorPicker.svelte +396 -0
  73. package/dist/components/Form/ColorPicker.svelte.d.ts +43 -0
  74. package/dist/components/Form/Combobox.svelte +645 -0
  75. package/dist/components/Form/Combobox.svelte.d.ts +93 -0
  76. package/dist/components/Form/Dropdown.svelte +773 -0
  77. package/dist/components/Form/Dropdown.svelte.d.ts +81 -0
  78. package/dist/components/Form/FileUpload.svelte +796 -0
  79. package/dist/components/Form/FileUpload.svelte.d.ts +78 -0
  80. package/dist/components/Form/FloatLabel.svelte +245 -0
  81. package/dist/components/Form/FloatLabel.svelte.d.ts +44 -0
  82. package/dist/components/Form/Form.svelte +281 -0
  83. package/dist/components/Form/Form.svelte.d.ts +54 -0
  84. package/dist/components/Form/FormField.svelte +218 -0
  85. package/dist/components/Form/FormField.svelte.d.ts +47 -0
  86. package/dist/components/Form/Input.svelte +340 -0
  87. package/dist/components/Form/Input.svelte.d.ts +79 -0
  88. package/dist/components/Form/InputSwitch.svelte +189 -0
  89. package/dist/components/Form/InputSwitch.svelte.d.ts +46 -0
  90. package/dist/components/Form/InvalidState.svelte +97 -0
  91. package/dist/components/Form/InvalidState.svelte.d.ts +37 -0
  92. package/dist/components/Form/Knob.svelte +537 -0
  93. package/dist/components/Form/Knob.svelte.d.ts +78 -0
  94. package/dist/components/Form/ListInput.svelte +469 -0
  95. package/dist/components/Form/ListInput.svelte.d.ts +70 -0
  96. package/dist/components/Form/Listbox.svelte +513 -0
  97. package/dist/components/Form/Listbox.svelte.d.ts +74 -0
  98. package/dist/components/Form/NumberInput.svelte +452 -0
  99. package/dist/components/Form/NumberInput.svelte.d.ts +82 -0
  100. package/dist/components/Form/Radio.svelte +192 -0
  101. package/dist/components/Form/Radio.svelte.d.ts +53 -0
  102. package/dist/components/Form/RadioGroup.svelte +155 -0
  103. package/dist/components/Form/RadioGroup.svelte.d.ts +48 -0
  104. package/dist/components/Form/Rating.svelte +380 -0
  105. package/dist/components/Form/Rating.svelte.d.ts +64 -0
  106. package/dist/components/Form/Select.svelte +436 -0
  107. package/dist/components/Form/Select.svelte.d.ts +49 -0
  108. package/dist/components/Form/SelectGroup.svelte +34 -0
  109. package/dist/components/Form/SelectGroup.svelte.d.ts +33 -0
  110. package/dist/components/Form/Slider.svelte +622 -0
  111. package/dist/components/Form/Slider.svelte.d.ts +73 -0
  112. package/dist/components/Form/Switch.svelte +192 -0
  113. package/dist/components/Form/Switch.svelte.d.ts +46 -0
  114. package/dist/components/Form/TextInput.svelte +274 -0
  115. package/dist/components/Form/TextInput.svelte.d.ts +74 -0
  116. package/dist/components/Form/Textarea.svelte +207 -0
  117. package/dist/components/Form/Textarea.svelte.d.ts +62 -0
  118. package/dist/components/Icon/Icon.svelte +140 -0
  119. package/dist/components/Icon/Icon.svelte.d.ts +25 -0
  120. package/dist/components/Icon/index.d.ts +1 -0
  121. package/dist/components/Icon/index.js +1 -0
  122. package/dist/components/Lazy/Lazy.svelte +158 -0
  123. package/dist/components/Lazy/Lazy.svelte.d.ts +42 -0
  124. package/dist/components/Masonry/Masonry.svelte +299 -0
  125. package/dist/components/Masonry/Masonry.svelte.d.ts +55 -0
  126. package/dist/components/Menu/Menu/Menu.svelte +65 -0
  127. package/dist/components/Menu/Menu/Menu.svelte.d.ts +17 -0
  128. package/dist/components/Menu/Menu/MenuItem.svelte +90 -0
  129. package/dist/components/Menu/Menu/MenuItem.svelte.d.ts +27 -0
  130. package/dist/components/Modal/Modal.svelte +334 -0
  131. package/dist/components/Modal/Modal.svelte.d.ts +55 -0
  132. package/dist/components/Panel/Card.svelte +141 -0
  133. package/dist/components/Panel/Card.svelte.d.ts +52 -0
  134. package/dist/components/Panel/Hero/Hero.story.md +9 -0
  135. package/dist/components/Panel/Hero/Hero.story.svelte +49 -0
  136. package/dist/components/Panel/Hero/Hero.story.svelte.d.ts +21 -0
  137. package/dist/components/Panel/Hero/Hero.svelte +24 -0
  138. package/dist/components/Panel/Hero/Hero.svelte.d.ts +32 -0
  139. package/dist/components/Panel/LazyPanel.svelte +110 -0
  140. package/dist/components/Panel/LazyPanel.svelte.d.ts +46 -0
  141. package/dist/components/Panel/Panel.svelte +205 -0
  142. package/dist/components/Panel/Panel.svelte.d.ts +23 -0
  143. package/dist/components/Progress/Progress.svelte +220 -0
  144. package/dist/components/Progress/Progress.svelte.d.ts +61 -0
  145. package/dist/components/Separator/Separator.svelte +109 -0
  146. package/dist/components/Separator/Separator.svelte.d.ts +35 -0
  147. package/dist/components/Sidebar/Sidebar.svelte +213 -0
  148. package/dist/components/Sidebar/Sidebar.svelte.d.ts +60 -0
  149. package/dist/components/Skeleton/Skeleton.svelte +170 -0
  150. package/dist/components/Skeleton/Skeleton.svelte.d.ts +48 -0
  151. package/dist/components/Stepper/Stepper.svelte +111 -0
  152. package/dist/components/Stepper/Stepper.svelte.d.ts +54 -0
  153. package/dist/components/Stepper/StepperStep.svelte +369 -0
  154. package/dist/components/Stepper/StepperStep.svelte.d.ts +63 -0
  155. package/dist/components/Table/Table.svelte +167 -0
  156. package/dist/components/Table/Table.svelte.d.ts +56 -0
  157. package/dist/components/Table/TableBody.svelte +41 -0
  158. package/dist/components/Table/TableBody.svelte.d.ts +33 -0
  159. package/dist/components/Table/TableCell.svelte +76 -0
  160. package/dist/components/Table/TableCell.svelte.d.ts +36 -0
  161. package/dist/components/Table/TableHead.svelte +41 -0
  162. package/dist/components/Table/TableHead.svelte.d.ts +32 -0
  163. package/dist/components/Table/TableHeader.svelte +148 -0
  164. package/dist/components/Table/TableHeader.svelte.d.ts +42 -0
  165. package/dist/components/Table/TableRow.svelte +99 -0
  166. package/dist/components/Table/TableRow.svelte.d.ts +40 -0
  167. package/dist/components/Tabs/Tab.svelte +145 -0
  168. package/dist/components/Tabs/Tab.svelte.d.ts +36 -0
  169. package/dist/components/Tabs/TabList.svelte +60 -0
  170. package/dist/components/Tabs/TabList.svelte.d.ts +32 -0
  171. package/dist/components/Tabs/TabPanel.svelte +118 -0
  172. package/dist/components/Tabs/TabPanel.svelte.d.ts +38 -0
  173. package/dist/components/Tabs/Tabs.svelte +287 -0
  174. package/dist/components/Tabs/Tabs.svelte.d.ts +50 -0
  175. package/dist/components/Tag/Tag.svelte +260 -0
  176. package/dist/components/Tag/Tag.svelte.d.ts +54 -0
  177. package/dist/components/Tag/TagGroup.svelte +147 -0
  178. package/dist/components/Tag/TagGroup.svelte.d.ts +62 -0
  179. package/dist/components/ThemeToggle/ThemeToggle.svelte +93 -0
  180. package/dist/components/ThemeToggle/ThemeToggle.svelte.d.ts +12 -0
  181. package/dist/components/Timeline/Timeline.svelte +144 -0
  182. package/dist/components/Timeline/Timeline.svelte.d.ts +48 -0
  183. package/dist/components/Timeline/TimelineItem.svelte +391 -0
  184. package/dist/components/Timeline/TimelineItem.svelte.d.ts +63 -0
  185. package/dist/components/Toast/Toast.svelte +313 -0
  186. package/dist/components/Toast/Toast.svelte.d.ts +44 -0
  187. package/dist/components/Toast/toastStore.d.ts +40 -0
  188. package/dist/components/Toast/toastStore.js +293 -0
  189. package/dist/components/Tooltip/Tooltip.svelte +282 -0
  190. package/dist/components/Tooltip/Tooltip.svelte.d.ts +55 -0
  191. package/dist/components/Tree/Tree.svelte +129 -0
  192. package/dist/components/Tree/Tree.svelte.d.ts +61 -0
  193. package/dist/components/Tree/TreeNode.svelte +332 -0
  194. package/dist/components/Tree/TreeNode.svelte.d.ts +55 -0
  195. package/dist/components/icons/TwintrinsicLogo.svelte +73 -0
  196. package/dist/components/icons/TwintrinsicLogo.svelte.d.ts +17 -0
  197. package/dist/components/icons/twintrinsic-source.svg +73 -0
  198. package/dist/components/icons/twintrinsic.svg +38 -0
  199. package/dist/docs/EventsTable.svelte +86 -0
  200. package/dist/docs/EventsTable.svelte.d.ts +27 -0
  201. package/dist/docs/PropsTable.svelte +103 -0
  202. package/dist/docs/PropsTable.svelte.d.ts +28 -0
  203. package/dist/docs/index.d.ts +2 -0
  204. package/dist/docs/index.js +2 -0
  205. package/dist/helpers/detectLanguage.d.ts +6 -0
  206. package/dist/helpers/detectLanguage.js +60 -0
  207. package/dist/helpers/index.d.ts +1 -0
  208. package/dist/helpers/index.js +1 -0
  209. package/dist/index.d.ts +86 -0
  210. package/dist/index.js +94 -0
  211. package/dist/twintrinsic.css +347 -0
  212. package/package.json +98 -0
@@ -0,0 +1,55 @@
1
+ export default Card;
2
+ type Card = {
3
+ $on?(type: string, callback: (e: any) => void): () => void;
4
+ $set?(props: Partial<$$ComponentProps>): void;
5
+ };
6
+ /**
7
+ * Card - A container for content with optional header, footer, and media sections.
8
+ * Provides a consistent visual style for displaying grouped information.
9
+ *
10
+ * Usage:
11
+ * ```svelte
12
+ * <Card>
13
+ * <svelte:fragment slot="header">Card Title</svelte:fragment>
14
+ * <p>Card content goes here</p>
15
+ * <svelte:fragment slot="footer">Footer content</svelte:fragment>
16
+ * </Card>
17
+ *
18
+ * <Card
19
+ * href="/some-link"
20
+ * image="/path/to/image.jpg"
21
+ * imageAlt="Description of image"
22
+ * >
23
+ * <svelte:fragment slot="header">Linked Card</svelte:fragment>
24
+ * This card is clickable
25
+ * </Card>
26
+ * ```
27
+ */
28
+ declare const Card: import("svelte").Component<{
29
+ class?: string;
30
+ id?: any;
31
+ href: any;
32
+ image: any;
33
+ imageAlt?: string;
34
+ bordered?: boolean;
35
+ shadowed?: boolean;
36
+ compact?: boolean;
37
+ hoverable?: boolean;
38
+ children: any;
39
+ header: any;
40
+ footer: any;
41
+ }, {}, "">;
42
+ type $$ComponentProps = {
43
+ class?: string;
44
+ id?: any;
45
+ href: any;
46
+ image: any;
47
+ imageAlt?: string;
48
+ bordered?: boolean;
49
+ shadowed?: boolean;
50
+ compact?: boolean;
51
+ hoverable?: boolean;
52
+ children: any;
53
+ header: any;
54
+ footer: any;
55
+ };
@@ -0,0 +1,461 @@
1
+ <!--
2
+ @component
3
+ Carousel - A component for displaying slideshows of content.
4
+ Provides consistent styling, accessibility features, and various display options.
5
+
6
+ Usage:
7
+ ```svelte
8
+ <Carousel>
9
+ <div slot="items">
10
+ <CarouselItem>Slide 1 content</CarouselItem>
11
+ <CarouselItem>Slide 2 content</CarouselItem>
12
+ <CarouselItem>Slide 3 content</CarouselItem>
13
+ </div>
14
+ </Carousel>
15
+
16
+ <Carousel
17
+ autoplay
18
+ interval={5000}
19
+ showArrows
20
+ showIndicators
21
+ circular
22
+ >
23
+ <div slot="items">
24
+ <CarouselItem>
25
+ <img src="/image1.jpg" alt="Image 1" />
26
+ </CarouselItem>
27
+ <CarouselItem>
28
+ <img src="/image2.jpg" alt="Image 2" />
29
+ </CarouselItem>
30
+ </div>
31
+ </Carousel>
32
+ ```
33
+ -->
34
+ <script>
35
+ import { onDestroy, onMount, setContext } from "svelte"
36
+
37
+ const {
38
+ /** @type {string} - Additional CSS classes */
39
+ class: className = "",
40
+
41
+ /** @type {string} - HTML id for accessibility */
42
+ id = crypto.randomUUID(),
43
+
44
+ /** @type {number} - Index of the active slide (0-based) */
45
+ activeIndex = 0,
46
+
47
+ /** @type {boolean} - Whether to show navigation arrows */
48
+ showArrows = true,
49
+
50
+ /** @type {boolean} - Whether to show slide indicators */
51
+ showIndicators = true,
52
+
53
+ /** @type {boolean} - Whether to enable autoplay */
54
+ autoplay = false,
55
+
56
+ /** @type {number} - Autoplay interval in milliseconds */
57
+ interval = 3000,
58
+
59
+ /** @type {boolean} - Whether to pause autoplay on hover */
60
+ pauseOnHover = true,
61
+
62
+ /** @type {boolean} - Whether to enable circular navigation */
63
+ circular = true,
64
+
65
+ /** @type {boolean} - Whether to enable swipe gestures on touch devices */
66
+ swipeable = true,
67
+
68
+ /** @type {string} - Transition effect (slide, fade) */
69
+ transition = "slide",
70
+
71
+ /** @type {number} - Transition duration in milliseconds */
72
+ transitionDuration = 300,
73
+
74
+ /** @type {string} - ARIA label for the carousel */
75
+ ariaLabel = "Carousel",
76
+
77
+ /** @type {string} - ARIA label for the previous button */
78
+ prevAriaLabel = "Previous slide",
79
+
80
+ /** @type {string} - ARIA label for the next button */
81
+ nextAriaLabel = "Next slide",
82
+
83
+ /** @type {string} - Custom previous arrow icon */
84
+ prevIcon,
85
+
86
+ /** @type {string} - Custom next arrow icon */
87
+ nextIcon,
88
+
89
+ /** @type {(event: CustomEvent) => void} - Change event handler */
90
+ onchange,
91
+
92
+ items,
93
+ } = $props()
94
+
95
+ // Component state
96
+ let currentIndex = $state(0)
97
+ let totalSlides = $state(0)
98
+ let isPlaying = $state(false)
99
+ let isHovering = $state(false)
100
+ let isDragging = $state(false)
101
+ let startX = $state(0)
102
+ let currentX = $state(0)
103
+ let carouselElement = $state()
104
+ let itemsElement = $state()
105
+ let autoplayInterval = $state()
106
+ let slideWidth = $state(0)
107
+ let touchStartTime = $state(0)
108
+
109
+ // Update current index when activeIndex prop changes
110
+ $effect(() => {
111
+ currentIndex = activeIndex
112
+ })
113
+
114
+ // Update autoplay state when prop changes
115
+ $effect(() => {
116
+ isPlaying = autoplay
117
+ })
118
+
119
+ // Provide context for child components
120
+ $effect(() => {
121
+ setContext("carousel", {
122
+ registerItem: () => {
123
+ totalSlides++
124
+ return totalSlides - 1
125
+ },
126
+ currentIndex,
127
+ transition,
128
+ transitionDuration,
129
+ })
130
+ })
131
+
132
+ // Set up autoplay
133
+ $effect(() => {
134
+ clearInterval(autoplayInterval)
135
+
136
+ if (isPlaying && !isHovering && !isDragging && totalSlides > 1) {
137
+ autoplayInterval = setInterval(() => {
138
+ goToNext()
139
+ }, interval)
140
+ }
141
+
142
+ return () => clearInterval(autoplayInterval)
143
+ })
144
+
145
+ /**
146
+ * Goes to the previous slide
147
+ */
148
+ function goToPrev() {
149
+ if (currentIndex > 0) {
150
+ currentIndex--
151
+ } else if (circular) {
152
+ currentIndex = totalSlides - 1
153
+ }
154
+
155
+ dispatchChange()
156
+ }
157
+
158
+ /**
159
+ * Goes to the next slide
160
+ */
161
+ function goToNext() {
162
+ if (currentIndex < totalSlides - 1) {
163
+ currentIndex++
164
+ } else if (circular) {
165
+ currentIndex = 0
166
+ }
167
+
168
+ dispatchChange()
169
+ }
170
+
171
+ /**
172
+ * Goes to a specific slide
173
+ * @param {number} index - Slide index
174
+ */
175
+ function goToSlide(index) {
176
+ if (index >= 0 && index < totalSlides) {
177
+ currentIndex = index
178
+ dispatchChange()
179
+ }
180
+ }
181
+
182
+ /**
183
+ * Dispatches change event
184
+ */
185
+ function dispatchChange() {
186
+ onchange?.(new CustomEvent("change", { detail: { index: currentIndex } }))
187
+ }
188
+
189
+ /**
190
+ * Handles mouse enter event
191
+ */
192
+ function handleMouseEnter() {
193
+ if (pauseOnHover) {
194
+ isHovering = true
195
+ }
196
+ }
197
+
198
+ /**
199
+ * Handles mouse leave event
200
+ */
201
+ function handleMouseLeave() {
202
+ isHovering = false
203
+ }
204
+
205
+ /**
206
+ * Handles touch start event
207
+ * @param {TouchEvent} event - Touch event
208
+ */
209
+ function handleTouchStart(event) {
210
+ if (!swipeable) return
211
+
212
+ isDragging = true
213
+ startX = event.touches[0].clientX
214
+ currentX = startX
215
+ touchStartTime = Date.now()
216
+ }
217
+
218
+ /**
219
+ * Handles touch move event
220
+ * @param {TouchEvent} event - Touch event
221
+ */
222
+ function handleTouchMove(event) {
223
+ if (!swipeable || !isDragging) return
224
+
225
+ currentX = event.touches[0].clientX
226
+
227
+ // Prevent default to avoid scrolling
228
+ event.preventDefault()
229
+ }
230
+
231
+ /**
232
+ * Handles touch end event
233
+ */
234
+ function handleTouchEnd() {
235
+ if (!swipeable || !isDragging) return
236
+
237
+ const deltaX = currentX - startX
238
+ const deltaTime = Date.now() - touchStartTime
239
+
240
+ // Determine if it was a swipe (fast movement)
241
+ const isSwipe = Math.abs(deltaX) > 50 && deltaTime < 300
242
+
243
+ // Determine if it was a drag (slow movement but significant distance)
244
+ const isDrag = Math.abs(deltaX) > slideWidth / 3
245
+
246
+ if (isSwipe || isDrag) {
247
+ if (deltaX > 0) {
248
+ goToPrev()
249
+ } else {
250
+ goToNext()
251
+ }
252
+ }
253
+
254
+ isDragging = false
255
+ }
256
+
257
+ /**
258
+ * Handles key down event
259
+ * @param {KeyboardEvent} event - Key event
260
+ */
261
+ function handleKeyDown(event) {
262
+ switch (event.key) {
263
+ case "ArrowLeft":
264
+ goToPrev()
265
+ event.preventDefault()
266
+ break
267
+ case "ArrowRight":
268
+ goToNext()
269
+ event.preventDefault()
270
+ break
271
+ case "Home":
272
+ goToSlide(0)
273
+ event.preventDefault()
274
+ break
275
+ case "End":
276
+ goToSlide(totalSlides - 1)
277
+ event.preventDefault()
278
+ break
279
+ }
280
+ }
281
+
282
+ // Update slide width on mount and resize
283
+ function updateDimensions() {
284
+ if (carouselElement) {
285
+ slideWidth = carouselElement.offsetWidth
286
+ }
287
+ }
288
+
289
+ // Set up resize observer
290
+ onMount(() => {
291
+ updateDimensions()
292
+
293
+ const resizeObserver = new ResizeObserver(updateDimensions)
294
+
295
+ if (carouselElement) {
296
+ resizeObserver.observe(carouselElement)
297
+ }
298
+
299
+ return () => {
300
+ resizeObserver.disconnect()
301
+ }
302
+ })
303
+
304
+ // Clean up on destroy
305
+ onDestroy(() => {
306
+ clearInterval(autoplayInterval)
307
+ })
308
+ </script>
309
+
310
+ <div
311
+ {id}
312
+ class="
313
+ carousel
314
+ carousel-transition-{transition}
315
+ {className}
316
+ "
317
+ style="--transition-duration: {transitionDuration}ms;"
318
+ role="region"
319
+ aria-label={ariaLabel}
320
+ aria-roledescription="carousel"
321
+ tabindex="0"
322
+ onmouseenter={handleMouseEnter}
323
+ onmouseleave={handleMouseLeave}
324
+ ontouchstart={handleTouchStart}
325
+ ontouchmove={handleTouchMove}
326
+ ontouchend={handleTouchEnd}
327
+ onkeydown={handleKeyDown}
328
+ bind:this={carouselElement}
329
+ >
330
+ <div
331
+ class="carousel-items"
332
+ bind:this={itemsElement}
333
+ >
334
+ {@render items?.()}
335
+ </div>
336
+
337
+ {#if showArrows && totalSlides > 1}
338
+ <div class="carousel-arrows">
339
+ <button
340
+ type="button"
341
+ class="carousel-arrow carousel-arrow-prev"
342
+ aria-label={prevAriaLabel}
343
+ disabled={!circular && currentIndex === 0}
344
+ onclick={goToPrev}
345
+ >
346
+ {#if prevIcon}
347
+ {@html prevIcon}
348
+ {:else}
349
+ <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
350
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7"></path>
351
+ </svg>
352
+ {/if}
353
+ </button>
354
+
355
+ <button
356
+ type="button"
357
+ class="carousel-arrow carousel-arrow-next"
358
+ aria-label={nextAriaLabel}
359
+ disabled={!circular && currentIndex === totalSlides - 1}
360
+ onclick={goToNext}
361
+ >
362
+ {#if nextIcon}
363
+ {@html nextIcon}
364
+ {:else}
365
+ <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
366
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path>
367
+ </svg>
368
+ {/if}
369
+ </button>
370
+ </div>
371
+ {/if}
372
+
373
+ {#if showIndicators && totalSlides > 1}
374
+ <div class="carousel-indicators" role="tablist">
375
+ {#each Array(totalSlides) as _, i}
376
+ <button
377
+ type="button"
378
+ class="
379
+ carousel-indicator
380
+ {i === currentIndex ? 'carousel-indicator-active' : ''}
381
+ "
382
+ role="tab"
383
+ aria-label={`Slide ${i + 1}`}
384
+ aria-selected={i === currentIndex}
385
+ onclick={() => goToSlide(i)}
386
+ ></button>
387
+ {/each}
388
+ </div>
389
+ {/if}
390
+ </div>
391
+
392
+ <style>
393
+ @reference "../../twintrinsic.css";
394
+
395
+ .carousel {
396
+ @apply relative overflow-hidden;
397
+ @apply w-full;
398
+ }
399
+
400
+ .carousel-items {
401
+ @apply flex;
402
+ }
403
+
404
+ .carousel-transition-slide .carousel-items {
405
+ @apply transition-transform ease-in-out;
406
+ transition-duration: var(--transition-duration);
407
+ }
408
+
409
+ .carousel-transition-fade .carousel-items {
410
+ @apply relative;
411
+ }
412
+
413
+ .carousel-arrows {
414
+ @apply absolute inset-0;
415
+ @apply flex items-center justify-between;
416
+ @apply pointer-events-none;
417
+ }
418
+
419
+ .carousel-arrow {
420
+ @apply flex items-center justify-center;
421
+ @apply w-10 h-10 rounded-full;
422
+ @apply bg-background/60 dark:bg-background/60;
423
+ @apply text-text dark:text-text;
424
+ @apply pointer-events-auto;
425
+ @apply focus:outline-none focus:ring-2 focus:ring-primary-500 dark:focus:ring-primary-400;
426
+ @apply hover:bg-background/80 dark:hover:bg-background/80;
427
+ @apply transition-colors duration-150;
428
+ @apply z-10;
429
+ }
430
+
431
+ .carousel-arrow:disabled {
432
+ @apply opacity-50 cursor-not-allowed;
433
+ }
434
+
435
+ .carousel-arrow-prev {
436
+ @apply ml-2;
437
+ }
438
+
439
+ .carousel-arrow-next {
440
+ @apply mr-2;
441
+ }
442
+
443
+ .carousel-indicators {
444
+ @apply absolute bottom-4 left-1/2 -translate-x-1/2;
445
+ @apply flex items-center justify-center gap-2;
446
+ @apply z-10;
447
+ }
448
+
449
+ .carousel-indicator {
450
+ @apply w-2.5 h-2.5 rounded-full;
451
+ @apply bg-background/60 dark:bg-background/60;
452
+ @apply hover:bg-background/80 dark:hover:bg-background/80;
453
+ @apply focus:outline-none focus:ring-2 focus:ring-primary-500 dark:focus:ring-primary-400;
454
+ @apply transition-colors duration-150;
455
+ }
456
+
457
+ .carousel-indicator-active {
458
+ @apply bg-primary-500 dark:bg-primary-500;
459
+ @apply w-3 h-3;
460
+ }
461
+ </style>
@@ -0,0 +1,79 @@
1
+ export default Carousel;
2
+ type Carousel = {
3
+ $on?(type: string, callback: (e: any) => void): () => void;
4
+ $set?(props: Partial<$$ComponentProps>): void;
5
+ };
6
+ /**
7
+ * Carousel - A component for displaying slideshows of content.
8
+ * Provides consistent styling, accessibility features, and various display options.
9
+ *
10
+ * Usage:
11
+ * ```svelte
12
+ * <Carousel>
13
+ * <div slot="items">
14
+ * <CarouselItem>Slide 1 content</CarouselItem>
15
+ * <CarouselItem>Slide 2 content</CarouselItem>
16
+ * <CarouselItem>Slide 3 content</CarouselItem>
17
+ * </div>
18
+ * </Carousel>
19
+ *
20
+ * <Carousel
21
+ * autoplay
22
+ * interval={5000}
23
+ * showArrows
24
+ * showIndicators
25
+ * circular
26
+ * >
27
+ * <div slot="items">
28
+ * <CarouselItem>
29
+ * <img src="/image1.jpg" alt="Image 1" />
30
+ * </CarouselItem>
31
+ * <CarouselItem>
32
+ * <img src="/image2.jpg" alt="Image 2" />
33
+ * </CarouselItem>
34
+ * </div>
35
+ * </Carousel>
36
+ * ```
37
+ */
38
+ declare const Carousel: import("svelte").Component<{
39
+ class?: string;
40
+ id?: any;
41
+ activeIndex?: number;
42
+ showArrows?: boolean;
43
+ showIndicators?: boolean;
44
+ autoplay?: boolean;
45
+ interval?: number;
46
+ pauseOnHover?: boolean;
47
+ circular?: boolean;
48
+ swipeable?: boolean;
49
+ transition?: string;
50
+ transitionDuration?: number;
51
+ ariaLabel?: string;
52
+ prevAriaLabel?: string;
53
+ nextAriaLabel?: string;
54
+ prevIcon: any;
55
+ nextIcon: any;
56
+ onchange: any;
57
+ items: any;
58
+ }, {}, "">;
59
+ type $$ComponentProps = {
60
+ class?: string;
61
+ id?: any;
62
+ activeIndex?: number;
63
+ showArrows?: boolean;
64
+ showIndicators?: boolean;
65
+ autoplay?: boolean;
66
+ interval?: number;
67
+ pauseOnHover?: boolean;
68
+ circular?: boolean;
69
+ swipeable?: boolean;
70
+ transition?: string;
71
+ transitionDuration?: number;
72
+ ariaLabel?: string;
73
+ prevAriaLabel?: string;
74
+ nextAriaLabel?: string;
75
+ prevIcon: any;
76
+ nextIcon: any;
77
+ onchange: any;
78
+ items: any;
79
+ };