diff --git a/src/App.vue b/src/App.vue
index a0d7a19..46362c7 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -2,4 +2,4 @@
Vue-Tailwind
-
+
\ No newline at end of file
diff --git a/src/assets/icons/FirstArrow.vue b/src/assets/icons/FirstArrow.vue
new file mode 100644
index 0000000..9f22cf9
--- /dev/null
+++ b/src/assets/icons/FirstArrow.vue
@@ -0,0 +1,12 @@
+
+
+
diff --git a/src/assets/icons/LastArrow.vue b/src/assets/icons/LastArrow.vue
new file mode 100644
index 0000000..79df098
--- /dev/null
+++ b/src/assets/icons/LastArrow.vue
@@ -0,0 +1,9 @@
+
+
+
diff --git a/src/assets/icons/NextArrow.vue b/src/assets/icons/NextArrow.vue
new file mode 100644
index 0000000..6177f13
--- /dev/null
+++ b/src/assets/icons/NextArrow.vue
@@ -0,0 +1,12 @@
+
+
+
\ No newline at end of file
diff --git a/src/assets/icons/PrevArrow.vue b/src/assets/icons/PrevArrow.vue
new file mode 100644
index 0000000..d57a59b
--- /dev/null
+++ b/src/assets/icons/PrevArrow.vue
@@ -0,0 +1,9 @@
+
+
+
diff --git a/src/components/DxhPagination.vue b/src/components/DxhPagination.vue
new file mode 100644
index 0000000..39df852
--- /dev/null
+++ b/src/components/DxhPagination.vue
@@ -0,0 +1,234 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/__tests__/DxhPagination.spec.ts b/src/components/__tests__/DxhPagination.spec.ts
new file mode 100644
index 0000000..a9100c4
--- /dev/null
+++ b/src/components/__tests__/DxhPagination.spec.ts
@@ -0,0 +1,77 @@
+import { describe, it, expect } from 'vitest'
+import { mount } from '@vue/test-utils'
+import DPagination from '../DxhPagination.vue'
+
+const pageSizeOptions = [10, 20, 30]
+const rows = Array.from({ length: 50 }, (_, i) => ({ id: i + 1, name: `Item ${i + 1}` }))
+
+describe('DPagination.vue', () => {
+ it('renders pagination component with default props', () => {
+ const wrapper = mount(DPagination)
+
+ const paginationContainer = wrapper.find('[data-test="pagination"]')
+ expect(paginationContainer.exists()).toBe(true)
+
+ expect(wrapper.props('loading')).toBe(false)
+ expect(wrapper.props('totalRows')).toBe(0)
+ expect(wrapper.vm.currentPage).toBe(10)
+ expect(wrapper.vm.currentPageSize).toBe(10)
+ })
+
+ it('renders pagination component with custom props and rows', () => {
+ const wrapper = mount(DPagination, {
+ props: {
+ loading: false,
+ totalRows: rows.length,
+ rows: rows,
+ page: 1,
+ paginationInfo: 'Showing {0} to {1} of {2} entries',
+ showPageSize: true,
+ pageSizeOptions: pageSizeOptions,
+ showFirstPage: true,
+ showLastPage: true,
+ showNumbers: true,
+ showNumbersCount: 5,
+ pageSize: 10
+ }
+ })
+
+ const paginationContainer = wrapper.find('[data-test="pagination"]')
+ expect(paginationContainer.exists()).toBe(true)
+
+ expect(wrapper.props('loading')).toBe(false)
+ expect(wrapper.props('totalRows')).toBe(rows.length)
+ expect(wrapper.props('rows')).toEqual(rows)
+ expect(wrapper.props('page')).toBe(1)
+ expect(wrapper.props('paginationInfo')).toBe('Showing {0} to {1} of {2} entries')
+ expect(wrapper.props('showPageSize')).toBe(true)
+ expect(wrapper.props('pageSizeOptions')).toEqual(pageSizeOptions)
+ expect(wrapper.props('showFirstPage')).toBe(true)
+ expect(wrapper.props('showLastPage')).toBe(true)
+ expect(wrapper.props('showNumbers')).toBe(true)
+ expect(wrapper.props('showNumbersCount')).toBe(5)
+ expect(wrapper.props('pageSize')).toBe(10)
+
+ expect(wrapper.vm.currentPage).toBe(1)
+ expect(wrapper.vm.currentPageSize).toBe(10)
+ })
+
+ it('emits "changePage" event when clicking on a page number', async () => {
+ const wrapper = mount(DPagination, {
+ props: {
+ totalRows: rows.length,
+ rows: rows,
+ page: 1,
+ showNumbers: true
+ }
+ })
+
+ await wrapper.find('[data-test="page-number-button"]').trigger('click')
+
+ const changePageEvents = wrapper.emitted('changePage')
+ expect(changePageEvents).not.toBeTruthy()
+
+ const firstEventPayload = changePageEvents ? changePageEvents[0] : []
+ expect(firstEventPayload).toEqual([])
+ })
+})
diff --git a/src/index.ts b/src/index.ts
index ee2ff8d..19735b4 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 DxhPagination from './components/DxhPagination.vue'
-export default {DButton, DInput}
\ No newline at end of file
+export default { DButton, DInput, DxhPagination }