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.
- package/LICENSE +674 -0
- package/README.md +150 -0
- package/dist/App/App.svelte +54 -0
- package/dist/App/App.svelte.d.ts +65 -0
- package/dist/Section.svelte +25 -0
- package/dist/Section.svelte.d.ts +34 -0
- package/dist/actions/clickOutside.d.ts +9 -0
- package/dist/actions/clickOutside.js +19 -0
- package/dist/actions/index.d.ts +1 -0
- package/dist/actions/index.js +1 -0
- package/dist/components/Accordion/Accordion.svelte +75 -0
- package/dist/components/Accordion/Accordion.svelte.d.ts +39 -0
- package/dist/components/Accordion/AccordionItem.svelte +150 -0
- package/dist/components/Accordion/AccordionItem.svelte.d.ts +30 -0
- package/dist/components/App/App.story.md +8 -0
- package/dist/components/App/App.story.svelte +170 -0
- package/dist/components/App/App.story.svelte.d.ts +22 -0
- package/dist/components/App/App.svelte +77 -0
- package/dist/components/App/App.svelte.d.ts +66 -0
- package/dist/components/App/Split.svelte +346 -0
- package/dist/components/App/Split.svelte.d.ts +54 -0
- package/dist/components/App/index.d.ts +2 -0
- package/dist/components/App/index.js +3 -0
- package/dist/components/AppHeader/AppHeader.svelte +439 -0
- package/dist/components/AppHeader/AppHeader.svelte.d.ts +24 -0
- package/dist/components/Avatar/Avatar.svelte +300 -0
- package/dist/components/Avatar/Avatar.svelte.d.ts +48 -0
- package/dist/components/Avatar/AvatarGroup.svelte +185 -0
- package/dist/components/Avatar/AvatarGroup.svelte.d.ts +46 -0
- package/dist/components/Badge/Badge.svelte +186 -0
- package/dist/components/Badge/Badge.svelte.d.ts +51 -0
- package/dist/components/BottomBar/BottomBar.svelte +146 -0
- package/dist/components/BottomBar/BottomBar.svelte.d.ts +38 -0
- package/dist/components/Breadcrumb/Breadcrumb.svelte +77 -0
- package/dist/components/Breadcrumb/Breadcrumb.svelte.d.ts +42 -0
- package/dist/components/Breadcrumb/BreadcrumbItem.svelte +171 -0
- package/dist/components/Breadcrumb/BreadcrumbItem.svelte.d.ts +38 -0
- package/dist/components/Button/Button.svelte +252 -0
- package/dist/components/Button/Button.svelte.d.ts +80 -0
- package/dist/components/Button/ButtonGroup.svelte +127 -0
- package/dist/components/Button/ButtonGroup.svelte.d.ts +44 -0
- package/dist/components/Card/Card.svelte +152 -0
- package/dist/components/Card/Card.svelte.d.ts +55 -0
- package/dist/components/Carousel/Carousel.svelte +461 -0
- package/dist/components/Carousel/Carousel.svelte.d.ts +79 -0
- package/dist/components/Carousel/CarouselItem.svelte +149 -0
- package/dist/components/Carousel/CarouselItem.svelte.d.ts +35 -0
- package/dist/components/Chip/Chip.svelte +288 -0
- package/dist/components/Chip/Chip.svelte.d.ts +71 -0
- package/dist/components/Chip/ChipGroup.svelte +190 -0
- package/dist/components/Chip/ChipGroup.svelte.d.ts +71 -0
- package/dist/components/CodeBlock/CodeBlock.svelte +356 -0
- package/dist/components/CodeBlock/CodeBlock.svelte.d.ts +44 -0
- package/dist/components/CodeBlock/index.d.ts +1 -0
- package/dist/components/CodeBlock/index.js +1 -0
- package/dist/components/CodeBlockSpeed/CodeBlockSpeed.svelte +145 -0
- package/dist/components/CodeBlockSpeed/CodeBlockSpeed.svelte.d.ts +44 -0
- package/dist/components/CodeEditor/CodeEditor.svelte +229 -0
- package/dist/components/CodeEditor/CodeEditor.svelte.d.ts +23 -0
- package/dist/components/Combobox/Combobox.svelte +279 -0
- package/dist/components/Combobox/Combobox.svelte.d.ts +34 -0
- package/dist/components/Container/Container.svelte +45 -0
- package/dist/components/Container/Container.svelte.d.ts +36 -0
- package/dist/components/DataTable/DataTable.svelte +879 -0
- package/dist/components/DataTable/DataTable.svelte.d.ts +102 -0
- package/dist/components/Form/AutoComplete.svelte +357 -0
- package/dist/components/Form/AutoComplete.svelte.d.ts +73 -0
- package/dist/components/Form/Calendar.svelte +429 -0
- package/dist/components/Form/Calendar.svelte.d.ts +53 -0
- package/dist/components/Form/Checkbox.svelte +196 -0
- package/dist/components/Form/Checkbox.svelte.d.ts +50 -0
- package/dist/components/Form/ColorPicker.svelte +396 -0
- package/dist/components/Form/ColorPicker.svelte.d.ts +43 -0
- package/dist/components/Form/Combobox.svelte +645 -0
- package/dist/components/Form/Combobox.svelte.d.ts +93 -0
- package/dist/components/Form/Dropdown.svelte +773 -0
- package/dist/components/Form/Dropdown.svelte.d.ts +81 -0
- package/dist/components/Form/FileUpload.svelte +796 -0
- package/dist/components/Form/FileUpload.svelte.d.ts +78 -0
- package/dist/components/Form/FloatLabel.svelte +245 -0
- package/dist/components/Form/FloatLabel.svelte.d.ts +44 -0
- package/dist/components/Form/Form.svelte +281 -0
- package/dist/components/Form/Form.svelte.d.ts +54 -0
- package/dist/components/Form/FormField.svelte +218 -0
- package/dist/components/Form/FormField.svelte.d.ts +47 -0
- package/dist/components/Form/Input.svelte +340 -0
- package/dist/components/Form/Input.svelte.d.ts +79 -0
- package/dist/components/Form/InputSwitch.svelte +189 -0
- package/dist/components/Form/InputSwitch.svelte.d.ts +46 -0
- package/dist/components/Form/InvalidState.svelte +97 -0
- package/dist/components/Form/InvalidState.svelte.d.ts +37 -0
- package/dist/components/Form/Knob.svelte +537 -0
- package/dist/components/Form/Knob.svelte.d.ts +78 -0
- package/dist/components/Form/ListInput.svelte +469 -0
- package/dist/components/Form/ListInput.svelte.d.ts +70 -0
- package/dist/components/Form/Listbox.svelte +513 -0
- package/dist/components/Form/Listbox.svelte.d.ts +74 -0
- package/dist/components/Form/NumberInput.svelte +452 -0
- package/dist/components/Form/NumberInput.svelte.d.ts +82 -0
- package/dist/components/Form/Radio.svelte +192 -0
- package/dist/components/Form/Radio.svelte.d.ts +53 -0
- package/dist/components/Form/RadioGroup.svelte +155 -0
- package/dist/components/Form/RadioGroup.svelte.d.ts +48 -0
- package/dist/components/Form/Rating.svelte +380 -0
- package/dist/components/Form/Rating.svelte.d.ts +64 -0
- package/dist/components/Form/Select.svelte +436 -0
- package/dist/components/Form/Select.svelte.d.ts +49 -0
- package/dist/components/Form/SelectGroup.svelte +34 -0
- package/dist/components/Form/SelectGroup.svelte.d.ts +33 -0
- package/dist/components/Form/Slider.svelte +622 -0
- package/dist/components/Form/Slider.svelte.d.ts +73 -0
- package/dist/components/Form/Switch.svelte +192 -0
- package/dist/components/Form/Switch.svelte.d.ts +46 -0
- package/dist/components/Form/TextInput.svelte +274 -0
- package/dist/components/Form/TextInput.svelte.d.ts +74 -0
- package/dist/components/Form/Textarea.svelte +207 -0
- package/dist/components/Form/Textarea.svelte.d.ts +62 -0
- package/dist/components/Icon/Icon.svelte +140 -0
- package/dist/components/Icon/Icon.svelte.d.ts +25 -0
- package/dist/components/Icon/index.d.ts +1 -0
- package/dist/components/Icon/index.js +1 -0
- package/dist/components/Lazy/Lazy.svelte +158 -0
- package/dist/components/Lazy/Lazy.svelte.d.ts +42 -0
- package/dist/components/Masonry/Masonry.svelte +299 -0
- package/dist/components/Masonry/Masonry.svelte.d.ts +55 -0
- package/dist/components/Menu/Menu/Menu.svelte +65 -0
- package/dist/components/Menu/Menu/Menu.svelte.d.ts +17 -0
- package/dist/components/Menu/Menu/MenuItem.svelte +90 -0
- package/dist/components/Menu/Menu/MenuItem.svelte.d.ts +27 -0
- package/dist/components/Modal/Modal.svelte +334 -0
- package/dist/components/Modal/Modal.svelte.d.ts +55 -0
- package/dist/components/Panel/Card.svelte +141 -0
- package/dist/components/Panel/Card.svelte.d.ts +52 -0
- package/dist/components/Panel/Hero/Hero.story.md +9 -0
- package/dist/components/Panel/Hero/Hero.story.svelte +49 -0
- package/dist/components/Panel/Hero/Hero.story.svelte.d.ts +21 -0
- package/dist/components/Panel/Hero/Hero.svelte +24 -0
- package/dist/components/Panel/Hero/Hero.svelte.d.ts +32 -0
- package/dist/components/Panel/LazyPanel.svelte +110 -0
- package/dist/components/Panel/LazyPanel.svelte.d.ts +46 -0
- package/dist/components/Panel/Panel.svelte +205 -0
- package/dist/components/Panel/Panel.svelte.d.ts +23 -0
- package/dist/components/Progress/Progress.svelte +220 -0
- package/dist/components/Progress/Progress.svelte.d.ts +61 -0
- package/dist/components/Separator/Separator.svelte +109 -0
- package/dist/components/Separator/Separator.svelte.d.ts +35 -0
- package/dist/components/Sidebar/Sidebar.svelte +213 -0
- package/dist/components/Sidebar/Sidebar.svelte.d.ts +60 -0
- package/dist/components/Skeleton/Skeleton.svelte +170 -0
- package/dist/components/Skeleton/Skeleton.svelte.d.ts +48 -0
- package/dist/components/Stepper/Stepper.svelte +111 -0
- package/dist/components/Stepper/Stepper.svelte.d.ts +54 -0
- package/dist/components/Stepper/StepperStep.svelte +369 -0
- package/dist/components/Stepper/StepperStep.svelte.d.ts +63 -0
- package/dist/components/Table/Table.svelte +167 -0
- package/dist/components/Table/Table.svelte.d.ts +56 -0
- package/dist/components/Table/TableBody.svelte +41 -0
- package/dist/components/Table/TableBody.svelte.d.ts +33 -0
- package/dist/components/Table/TableCell.svelte +76 -0
- package/dist/components/Table/TableCell.svelte.d.ts +36 -0
- package/dist/components/Table/TableHead.svelte +41 -0
- package/dist/components/Table/TableHead.svelte.d.ts +32 -0
- package/dist/components/Table/TableHeader.svelte +148 -0
- package/dist/components/Table/TableHeader.svelte.d.ts +42 -0
- package/dist/components/Table/TableRow.svelte +99 -0
- package/dist/components/Table/TableRow.svelte.d.ts +40 -0
- package/dist/components/Tabs/Tab.svelte +145 -0
- package/dist/components/Tabs/Tab.svelte.d.ts +36 -0
- package/dist/components/Tabs/TabList.svelte +60 -0
- package/dist/components/Tabs/TabList.svelte.d.ts +32 -0
- package/dist/components/Tabs/TabPanel.svelte +118 -0
- package/dist/components/Tabs/TabPanel.svelte.d.ts +38 -0
- package/dist/components/Tabs/Tabs.svelte +287 -0
- package/dist/components/Tabs/Tabs.svelte.d.ts +50 -0
- package/dist/components/Tag/Tag.svelte +260 -0
- package/dist/components/Tag/Tag.svelte.d.ts +54 -0
- package/dist/components/Tag/TagGroup.svelte +147 -0
- package/dist/components/Tag/TagGroup.svelte.d.ts +62 -0
- package/dist/components/ThemeToggle/ThemeToggle.svelte +93 -0
- package/dist/components/ThemeToggle/ThemeToggle.svelte.d.ts +12 -0
- package/dist/components/Timeline/Timeline.svelte +144 -0
- package/dist/components/Timeline/Timeline.svelte.d.ts +48 -0
- package/dist/components/Timeline/TimelineItem.svelte +391 -0
- package/dist/components/Timeline/TimelineItem.svelte.d.ts +63 -0
- package/dist/components/Toast/Toast.svelte +313 -0
- package/dist/components/Toast/Toast.svelte.d.ts +44 -0
- package/dist/components/Toast/toastStore.d.ts +40 -0
- package/dist/components/Toast/toastStore.js +293 -0
- package/dist/components/Tooltip/Tooltip.svelte +282 -0
- package/dist/components/Tooltip/Tooltip.svelte.d.ts +55 -0
- package/dist/components/Tree/Tree.svelte +129 -0
- package/dist/components/Tree/Tree.svelte.d.ts +61 -0
- package/dist/components/Tree/TreeNode.svelte +332 -0
- package/dist/components/Tree/TreeNode.svelte.d.ts +55 -0
- package/dist/components/icons/TwintrinsicLogo.svelte +73 -0
- package/dist/components/icons/TwintrinsicLogo.svelte.d.ts +17 -0
- package/dist/components/icons/twintrinsic-source.svg +73 -0
- package/dist/components/icons/twintrinsic.svg +38 -0
- package/dist/docs/EventsTable.svelte +86 -0
- package/dist/docs/EventsTable.svelte.d.ts +27 -0
- package/dist/docs/PropsTable.svelte +103 -0
- package/dist/docs/PropsTable.svelte.d.ts +28 -0
- package/dist/docs/index.d.ts +2 -0
- package/dist/docs/index.js +2 -0
- package/dist/helpers/detectLanguage.d.ts +6 -0
- package/dist/helpers/detectLanguage.js +60 -0
- package/dist/helpers/index.d.ts +1 -0
- package/dist/helpers/index.js +1 -0
- package/dist/index.d.ts +86 -0
- package/dist/index.js +94 -0
- package/dist/twintrinsic.css +347 -0
- 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
|
+
};
|