diff --git a/src/components/DxhCarousel.vue b/src/components/DxhCarousel.vue
new file mode 100644
index 0000000..d6f03bb
--- /dev/null
+++ b/src/components/DxhCarousel.vue
@@ -0,0 +1,150 @@
+
+
+
+
+
diff --git a/src/components/__tests__/DxhCarousel.spec.ts b/src/components/__tests__/DxhCarousel.spec.ts
new file mode 100644
index 0000000..153fc9f
--- /dev/null
+++ b/src/components/__tests__/DxhCarousel.spec.ts
@@ -0,0 +1,67 @@
+import { describe, it, expect } from 'vitest'
+import { mount } from '@vue/test-utils'
+import DxhCarousel from '@/components/DxhCarousel.vue'
+
+describe('DxhCarousel.vue', () => {
+ it('renders carousel with images', async () => {
+ const items = [
+ { id: 1, title: 'Image 1', src: 'image1.jpg' },
+ { id: 2, title: 'Image 2', src: 'image2.jpg' },
+ { id: 3, title: 'Image 3', src: 'image3.jpg' }
+ ]
+
+ const wrapper = mount(DxhCarousel, {
+ props: {
+ items,
+ autoplay: false,
+ showArrows: true,
+ dots: true,
+ autoplaySpeed: 5000,
+ maxWidth: 600,
+ maxHeight: 400
+ }
+ })
+
+ const carousel = wrapper.find('[data-test="carousel"]')
+ expect(carousel.exists()).toBe(true)
+
+ const carouselImages = carousel.findAll('[data-test="carousel-item"] img')
+ expect(carouselImages.length).toBe(items.length)
+
+ const prevArrow = wrapper.find('[data-test="prev-arrow"]')
+ const nextArrow = wrapper.find('[data-test="next-arrow"]')
+ expect(prevArrow.exists()).toBe(true)
+ expect(nextArrow.exists()).toBe(true)
+
+ const dots = wrapper.findAll('[data-test="dot"]')
+ expect(dots.length).toBe(items.length)
+ })
+
+ it('stops autoplay on mouseenter and resumes on mouseleave', async () => {
+ const items = [
+ { id: 1, title: 'Image 1', src: 'image1.jpg' },
+ { id: 2, title: 'Image 2', src: 'image2.jpg' },
+ { id: 3, title: 'Image 3', src: 'image3.jpg' }
+ ]
+
+ const wrapper = mount(DxhCarousel, {
+ props: {
+ items,
+ autoplay: true,
+ showArrows: false,
+ dots: false,
+ autoplaySpeed: 5000,
+ maxWidth: 600,
+ maxHeight: 400
+ }
+ })
+
+ await new Promise((resolve) => setTimeout(resolve, 3000))
+
+ await wrapper.trigger('mouseenter')
+ expect(wrapper.vm.autoplayInterval).not.toBe(null)
+
+ await wrapper.trigger('mouseleave')
+ expect(wrapper.vm.autoplayInterval).not.toBe(null)
+ })
+})
diff --git a/src/index.ts b/src/index.ts
index ee2ff8d..f73a4d6 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,4 +1,5 @@
-import DButton from "./components/DButton.vue"
-import DInput from "./components/DInput.vue"
+import DButton from './components/DButton.vue'
+import DInput from './components/DInput.vue'
+import DxhCarousel from './components/DxhCarousel.vue'
-export default {DButton, DInput}
\ No newline at end of file
+export default { DButton, DInput, DxhCarousel }