@bagelink/vue 1.2.89 → 1.2.97

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/dist/style.css CHANGED
@@ -2549,7 +2549,7 @@ input[type="range"][data-v-46e22f3e]:active::-webkit-slider-thumb {
2549
2549
  .bgl-toggle input:checked + label[data-v-c5e45931] {
2550
2550
  color: var(--bgl-primary) !important;
2551
2551
  }
2552
- .fileUploadWrap[data-v-d8f3ff01] {
2552
+ .fileUploadWrap[data-v-38a4d4a9] {
2553
2553
  outline: 1px solid var(--border-color);
2554
2554
  border-radius: var(--input-border-radius);
2555
2555
  text-align: center;
@@ -2561,7 +2561,7 @@ input[type="range"][data-v-46e22f3e]:active::-webkit-slider-thumb {
2561
2561
  background: var(--input-bg);
2562
2562
  height: 215px;
2563
2563
  }
2564
- .bagel-input .fileUploadWrap.fileDropZone[data-v-d8f3ff01] {
2564
+ .bagel-input .fileUploadWrap.fileDropZone[data-v-38a4d4a9] {
2565
2565
  background: var(--input-bg);
2566
2566
  display: flex;
2567
2567
  align-items: center;
@@ -2569,14 +2569,14 @@ input[type="range"][data-v-46e22f3e]:active::-webkit-slider-thumb {
2569
2569
  color: var(--bgl-gray);
2570
2570
  flex-direction: column;
2571
2571
  }
2572
- .fileUploadWrap.dragover[data-v-d8f3ff01],
2573
- .fileUploadWrap[data-v-d8f3ff01]:hover {
2572
+ .fileUploadWrap.dragover[data-v-38a4d4a9],
2573
+ .fileUploadWrap[data-v-38a4d4a9]:hover {
2574
2574
  box-shadow: inset 0 0 10px #00000012;
2575
2575
  }
2576
- .fileUploadWrap[style*='height: auto;'][data-v-d8f3ff01] {
2576
+ .fileUploadWrap[style*='height: auto;'][data-v-38a4d4a9] {
2577
2577
  min-height: 215px;
2578
2578
  }
2579
- .multi-image-item-preview[data-v-d8f3ff01] {
2579
+ .multi-image-item-preview[data-v-38a4d4a9] {
2580
2580
  border: 1px solid var(--border-color) !important;
2581
2581
  border-radius: var(--input-border-radius);
2582
2582
  margin: 0.5rem !important;
@@ -2590,12 +2590,12 @@ input[type="range"][data-v-46e22f3e]:active::-webkit-slider-thumb {
2590
2590
  gap: 1rem;
2591
2591
  align-items: center;
2592
2592
  }
2593
- .multi-image-item-preview p[data-v-d8f3ff01] {
2593
+ .multi-image-item-preview p[data-v-38a4d4a9] {
2594
2594
  overflow: hidden;
2595
2595
  text-overflow: ellipsis;
2596
2596
  white-space: nowrap;
2597
2597
  }
2598
- .multi-preview[data-v-d8f3ff01] {
2598
+ .multi-preview[data-v-38a4d4a9] {
2599
2599
  width: 40px;
2600
2600
  height: 40px;
2601
2601
  border-radius: var(--input-border-radius);
@@ -2606,17 +2606,17 @@ input[type="range"][data-v-46e22f3e]:active::-webkit-slider-thumb {
2606
2606
  align-items: center;
2607
2607
  display: flex;
2608
2608
  }
2609
- .bgl-single-preview[data-v-d8f3ff01] {
2609
+ .bgl-single-preview[data-v-38a4d4a9] {
2610
2610
  height: 100%;
2611
2611
  position: relative;
2612
2612
  }
2613
- .bgl-single-preview + .fileUploadPlaceHolder[data-v-d8f3ff01] {
2613
+ .bgl-single-preview + .fileUploadPlaceHolder[data-v-38a4d4a9] {
2614
2614
  position: absolute;
2615
2615
  inset: 0;
2616
2616
  margin: auto;
2617
2617
  top: calc(50% - 2rem);
2618
2618
  }
2619
- .single-image-item-preview[data-v-d8f3ff01] {
2619
+ .single-image-item-preview[data-v-38a4d4a9] {
2620
2620
  height: 100%;
2621
2621
  min-height: 100%;
2622
2622
  position: relative;
@@ -2624,13 +2624,13 @@ input[type="range"][data-v-46e22f3e]:active::-webkit-slider-thumb {
2624
2624
  align-items: center;
2625
2625
  justify-content: center;
2626
2626
  }
2627
- .fileUploadWrap[style*='height: auto'] .single-image-item-preview[data-v-d8f3ff01] {
2627
+ .fileUploadWrap[style*='height: auto'] .single-image-item-preview[data-v-38a4d4a9] {
2628
2628
  min-height: 215px;
2629
2629
  }
2630
- .fileUploadWrap[style*='height: auto'] .single-preview[data-v-d8f3ff01] {
2630
+ .fileUploadWrap[style*='height: auto'] .single-preview[data-v-38a4d4a9] {
2631
2631
  margin: 0rem !important;
2632
2632
  }
2633
- .single-preview[data-v-d8f3ff01] {
2633
+ .single-preview[data-v-38a4d4a9] {
2634
2634
  border-radius: var(--input-border-radius);
2635
2635
  margin: 1rem;
2636
2636
  padding: 0px;
@@ -2640,7 +2640,7 @@ input[type="range"][data-v-46e22f3e]:active::-webkit-slider-thumb {
2640
2640
  background: var(--bgl-gray-light);
2641
2641
  width: 90%;
2642
2642
  }
2643
- .single-image-item-preview[data-v-d8f3ff01]:hover::after {
2643
+ .single-image-item-preview[data-v-38a4d4a9]:hover::after {
2644
2644
  content: 'zoom_in';
2645
2645
  font-size: 32px;
2646
2646
  font-family: 'Material Symbols Outlined', serif;
@@ -2650,20 +2650,20 @@ input[type="range"][data-v-46e22f3e]:active::-webkit-slider-thumb {
2650
2650
  z-index: 9;
2651
2651
  pointer-events: none;
2652
2652
  }
2653
- .single-image-item-preview:hover img[data-v-d8f3ff01] {
2653
+ .single-image-item-preview:hover img[data-v-38a4d4a9] {
2654
2654
  filter: brightness(70%);
2655
2655
  }
2656
- .bgl_fill-image.single-image-item-preview[data-v-d8f3ff01] {
2656
+ .bgl_fill-image.single-image-item-preview[data-v-38a4d4a9] {
2657
2657
  height: 100%;
2658
2658
  }
2659
- .bgl_fill-image.single-image-item-preview .single-preview[data-v-d8f3ff01] {
2659
+ .bgl_fill-image.single-image-item-preview .single-preview[data-v-38a4d4a9] {
2660
2660
  border-radius: unset;
2661
2661
  object-fit: cover;
2662
2662
  box-shadow: unset;
2663
2663
  width: 100%;
2664
2664
  height: auto;
2665
2665
  }
2666
- .single-image-item-preview .pie[data-v-d8f3ff01] {
2666
+ .single-image-item-preview .pie[data-v-38a4d4a9] {
2667
2667
  transform-origin: top;
2668
2668
  transform: scale(1.4);
2669
2669
  position: absolute;
@@ -2677,31 +2677,31 @@ input[type="range"][data-v-46e22f3e]:active::-webkit-slider-thumb {
2677
2677
  border: none !important;
2678
2678
  padding: 0 !important;
2679
2679
  }
2680
- .bgl_oval-upload[data-v-d8f3ff01] {
2680
+ .bgl_oval-upload[data-v-38a4d4a9] {
2681
2681
  border-radius: 100% !important;
2682
2682
  overflow: hidden;
2683
2683
  }
2684
- .bgl_oval-upload p[data-v-d8f3ff01] {
2684
+ .bgl_oval-upload p[data-v-38a4d4a9] {
2685
2685
  padding: 0.75rem !important;
2686
2686
  font-size: 12px;
2687
2687
  }
2688
- .bgl_oval-upload .fileUploadPlaceHolder[data-v-d8f3ff01] {
2688
+ .bgl_oval-upload .fileUploadPlaceHolder[data-v-38a4d4a9] {
2689
2689
  top: 0;
2690
2690
  }
2691
- .bgl_oval-upload .pie[data-v-d8f3ff01] {
2691
+ .bgl_oval-upload .pie[data-v-38a4d4a9] {
2692
2692
  transform: scale(1);
2693
2693
  }
2694
- .bgl_oval-upload span.bgl_icon-font.color-primary[data-v-d8f3ff01] {
2694
+ .bgl_oval-upload span.bgl_icon-font.color-primary[data-v-38a4d4a9] {
2695
2695
  transform: scale(0.4) !important;
2696
2696
  }
2697
- .bgl_oval-upload .single-image-item-preview[data-v-d8f3ff01] {
2697
+ .bgl_oval-upload .single-image-item-preview[data-v-38a4d4a9] {
2698
2698
  height: 100%;
2699
2699
  }
2700
- .bgl_oval-upload .single-preview[data-v-d8f3ff01] {
2700
+ .bgl_oval-upload .single-preview[data-v-38a4d4a9] {
2701
2701
  margin: 0;
2702
2702
  height: 100% !important;
2703
2703
  }
2704
- .pie[data-v-d8f3ff01] {
2704
+ .pie[data-v-38a4d4a9] {
2705
2705
  width: 30px;
2706
2706
  height: 30px;
2707
2707
  position: relative;
@@ -2709,7 +2709,7 @@ input[type="range"][data-v-46e22f3e]:active::-webkit-slider-thumb {
2709
2709
  align-items: center;
2710
2710
  justify-content: center;
2711
2711
  }
2712
- .pie[data-v-d8f3ff01]:before {
2712
+ .pie[data-v-38a4d4a9]:before {
2713
2713
  content: '';
2714
2714
  position: absolute;
2715
2715
  border-radius: 50%;
@@ -2727,26 +2727,26 @@ input[type="range"][data-v-46e22f3e]:active::-webkit-slider-thumb {
2727
2727
  #000 calc(100% - var(--b))
2728
2728
  );
2729
2729
  }
2730
- .pie .success[data-v-d8f3ff01] {
2730
+ .pie .success[data-v-38a4d4a9] {
2731
2731
  transform: scale(0);
2732
2732
  opacity: 0;
2733
2733
  transition: all 0.3s ease-in-out;
2734
2734
  }
2735
- .pie .progress[data-v-d8f3ff01] {
2735
+ .pie .progress[data-v-38a4d4a9] {
2736
2736
  position: absolute;
2737
2737
  font-size: 10px;
2738
2738
  }
2739
- .pie.complete .progress[data-v-d8f3ff01] {
2739
+ .pie.complete .progress[data-v-38a4d4a9] {
2740
2740
  display: none;
2741
2741
  }
2742
- .pie.complete .success[data-v-d8f3ff01] {
2742
+ .pie.complete .success[data-v-38a4d4a9] {
2743
2743
  transform: scale(1.3);
2744
2744
  opacity: 1;
2745
2745
  }
2746
- .pie.complete[data-v-d8f3ff01]:before {
2746
+ .pie.complete[data-v-38a4d4a9]:before {
2747
2747
  background: conic-gradient(var(--bgl-green) calc(var(--p) * 1%), #0000 0);
2748
2748
  }
2749
- .pie.complete[data-v-d8f3ff01] {
2749
+ .pie.complete[data-v-38a4d4a9] {
2750
2750
  color: var(--bgl-green);
2751
2751
  }
2752
2752
 
@@ -4368,25 +4368,46 @@ body:has(.bg-dark.is-active) {
4368
4368
  }
4369
4369
  }
4370
4370
 
4371
- .bgl_pill-btn[data-v-764b6b8b]{
4371
+ .indicator[data-v-0443aea2] {
4372
+ position: absolute;
4373
+ height: 30px;
4374
+ background-color: var(--bgl-primary);
4375
+ transition: all 0.3s ease;
4376
+ z-index: -1;
4377
+ }
4378
+ .selected[data-v-0443aea2] {
4379
+ color: white !important;
4380
+ }
4381
+ .pagination-info[data-v-0443aea2] {
4382
+ min-width: 60px;
4383
+ text-align: center;
4384
+ font-size: 14px;
4385
+ }
4386
+ .pagination-ellipsis[data-v-0443aea2] {
4387
+ display: flex;
4388
+ align-items: center;
4389
+ padding: 0 4px;
4390
+ }
4391
+
4392
+ .bgl_pill-btn[data-v-ae730ec5]{
4372
4393
  color: var(--pill-btn-color);
4373
4394
  background: var(--pill-btn-bg);
4374
4395
  width: calc(var(--pill-height) / 1.25)!important;
4375
4396
  height: calc(var(--pill-height) / 1.25)!important;
4376
4397
  }
4377
- .loading[data-v-764b6b8b] {
4398
+ .loading[data-v-ae730ec5] {
4378
4399
  border: 1px solid var(--bgl-light-text);
4379
4400
  border-bottom: 2px solid var(--bgl-light-text);
4380
- animation: spin-764b6b8b 1s linear infinite;
4401
+ animation: spin-ae730ec5 1s linear infinite;
4381
4402
  border-radius: 100px;
4382
4403
  width: 1rem;
4383
4404
  height: 1rem;
4384
4405
  margin: auto;
4385
4406
  }
4386
- .bgl_flatPill .loading[data-v-764b6b8b] {
4407
+ .bgl_flatPill .loading[data-v-ae730ec5] {
4387
4408
  border-bottom: 2px solid var(--bgl-text-color);
4388
4409
  }
4389
- @keyframes spin-764b6b8b {
4410
+ @keyframes spin-ae730ec5 {
4390
4411
  0% {
4391
4412
  transform: rotate(0deg);
4392
4413
  }
@@ -4394,11 +4415,11 @@ body:has(.bg-dark.is-active) {
4394
4415
  transform: rotate(360deg);
4395
4416
  }
4396
4417
  }
4397
- .bgl_pill[data-v-764b6b8b] {
4418
+ .bgl_pill[data-v-ae730ec5] {
4398
4419
  padding-inline: 0.25rem;
4399
4420
  transition: var(--bgl-transition);
4400
- background-color: var(--dbb738e2);
4401
- color: var(--418961aa);
4421
+ background-color: var(--09d70b6a);
4422
+ color: var(--69df9534);
4402
4423
  display: inline-block;
4403
4424
  margin-inline-end: 0.25rem;
4404
4425
  border-radius: var(--pill-border-radius);
@@ -4406,26 +4427,26 @@ body:has(.bg-dark.is-active) {
4406
4427
  vertical-align: middle;
4407
4428
  margin-bottom: 0.25rem;
4408
4429
  }
4409
- .bgl_pill[disabled="true"][data-v-764b6b8b] {
4430
+ .bgl_pill[disabled="true"][data-v-ae730ec5] {
4410
4431
  opacity: 0.5;
4411
4432
  cursor: not-allowed;
4412
4433
  }
4413
- .bgl_pill-flex[data-v-764b6b8b] {
4434
+ .bgl_pill-flex[data-v-ae730ec5] {
4414
4435
  display: flex;
4415
4436
  align-items: center;
4416
4437
  gap: 0.25rem;
4417
4438
  justify-content: center;
4418
4439
  height: 100%;
4419
4440
  }
4420
- .bgl_pill.bgl_flatPill[data-v-764b6b8b] {
4441
+ .bgl_pill.bgl_flatPill[data-v-ae730ec5] {
4421
4442
  background: transparent;
4422
4443
  }
4423
- .bgl_pill.round[data-v-764b6b8b] {
4444
+ .bgl_pill.round[data-v-ae730ec5] {
4424
4445
  border-radius: 1000px;
4425
4446
  }
4426
- .bgl_pill-border[data-v-764b6b8b] {
4427
- outline: 1px solid var(--dbb738e2);
4428
- color: var(--dbb738e2);
4447
+ .bgl_pill-border[data-v-ae730ec5] {
4448
+ outline: 1px solid var(--09d70b6a);
4449
+ color: var(--09d70b6a);
4429
4450
  background: transparent;
4430
4451
  }
4431
4452
 
@@ -4620,22 +4641,22 @@ td[data-v-857ccb8b]:has(:checked){
4620
4641
  -moz-user-drag: none;
4621
4642
  }
4622
4643
 
4623
- .bgl-lightbox[data-v-fb2d5763]:has(.bgl_vid) {
4644
+ .bgl-lightbox[data-v-4789af69]:has(.bgl_vid) {
4624
4645
  width: 90vw;
4625
4646
  }
4626
- .lightbox-image[data-v-fb2d5763]{
4647
+ .lightbox-image[data-v-4789af69]{
4627
4648
  object-fit: contain;
4628
4649
  }
4629
- .bgl-lightbox-overlay[data-v-fb2d5763] {
4650
+ .bgl-lightbox-overlay[data-v-4789af69] {
4630
4651
  background: rgba(0, 0, 0, 0.8);
4631
4652
  }
4632
- .bgl-lightbox[data-v-fb2d5763] {
4653
+ .bgl-lightbox[data-v-4789af69] {
4633
4654
  max-height: 90%;
4634
4655
  }
4635
- .bgl-lightbox-item[data-v-fb2d5763]{
4636
- animation: 500ms ease bgl-lightbox-load-fb2d5763;
4656
+ .bgl-lightbox-item[data-v-4789af69]{
4657
+ animation: 500ms ease bgl-lightbox-load-4789af69;
4637
4658
  }
4638
- @keyframes bgl-lightbox-load-fb2d5763 {
4659
+ @keyframes bgl-lightbox-load-4789af69 {
4639
4660
  from {
4640
4661
  scale:0.7;
4641
4662
  }
@@ -4643,44 +4664,44 @@ to {
4643
4664
  scale:1;
4644
4665
  }
4645
4666
  }
4646
- .bgl-lightbox-item[data-v-fb2d5763] * {
4667
+ .bgl-lightbox-item[data-v-4789af69] * {
4647
4668
  max-height: calc(80vh - 90px);
4648
4669
  border-radius: 3px;
4649
4670
  margin: auto;
4650
- animation: 200ms ease bgl-lightbox-load-fb2d5763;
4671
+ animation: 200ms ease bgl-lightbox-load-4789af69;
4651
4672
  transition: max-height 200ms ease;
4652
4673
  }
4653
- .bgl-lightbox-item.zoomed[data-v-fb2d5763] * {
4674
+ .bgl-lightbox-item.zoomed[data-v-4789af69] * {
4654
4675
  max-height: calc(100vh - 90px);
4655
4676
  height: calc(100vh - 90px);
4656
4677
  }
4657
- .navigation[data-v-fb2d5763] {
4678
+ .navigation[data-v-4789af69] {
4658
4679
  top: 50%;
4659
4680
  transform: translateY(-50%);
4660
4681
  }
4661
- .thumbnail[data-v-fb2d5763] {
4682
+ .thumbnail[data-v-4789af69] {
4662
4683
  height: 50px;
4663
4684
  width: 50px;
4664
4685
  }
4665
- .thumbnail[data-v-fb2d5763]:hover {
4686
+ .thumbnail[data-v-4789af69]:hover {
4666
4687
  opacity: 1;
4667
4688
  }
4668
- .thumbnail[data-v-fb2d5763]:active {
4689
+ .thumbnail[data-v-4789af69]:active {
4669
4690
  opacity: 0.8;
4670
4691
  }
4671
- .thumbnail.active[data-v-fb2d5763] {
4692
+ .thumbnail.active[data-v-4789af69] {
4672
4693
  opacity: 1;
4673
4694
  outline: 2px solid white;
4674
4695
  }
4675
- .file-info[data-v-fb2d5763]{
4696
+ .file-info[data-v-4789af69]{
4676
4697
  max-width: 420px
4677
4698
  }
4678
4699
  @media screen and (max-width: 910px) {
4679
- .file-info[data-v-fb2d5763]{
4700
+ .file-info[data-v-4789af69]{
4680
4701
  max-width: 220px;
4681
4702
  text-align: center !important;
4682
4703
  }
4683
- .file-info[data-v-fb2d5763] *{
4704
+ .file-info[data-v-4789af69] *{
4684
4705
  text-align: center !important;
4685
4706
  margin-inline: 0 !important;
4686
4707
  max-width: 100% !important;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bagelink/vue",
3
3
  "type": "module",
4
- "version": "1.2.89",
4
+ "version": "1.2.97",
5
5
  "description": "Bagel core sdk packages",
6
6
  "author": {
7
7
  "name": "Neveh Allon",
@@ -0,0 +1,252 @@
1
+ <script setup lang="ts">
2
+ import { Btn } from '@bagelink/vue'
3
+ import { watch, nextTick } from 'vue'
4
+
5
+ interface Range {
6
+ start: number
7
+ end: number
8
+ }
9
+
10
+ interface PaginationProps {
11
+ totalItems: number
12
+ perPage?: number
13
+ totalPages?: number
14
+ variant?: 'default' | 'simple'
15
+ rtl?: boolean
16
+ maxVisiblePages?: number
17
+ }
18
+
19
+ const props = withDefaults(defineProps<PaginationProps>(), {
20
+ totalItems: 0,
21
+ perPage: 25,
22
+ totalPages: undefined,
23
+ variant: 'default',
24
+ rtl: false,
25
+ maxVisiblePages: 3
26
+ })
27
+
28
+ const page = defineModel<number>('page', { default: 1 })
29
+ const range = defineModel<Range>('range')
30
+
31
+ const paginationContainer = $ref<HTMLElement>()
32
+ let indicatorPosition = $ref(0)
33
+ let indicatorWidth = $ref(0)
34
+
35
+ // Calculate totalPages from totalItems and perPage if not provided directly
36
+ const computedTotalPages = $computed(() => {
37
+ if (props.totalPages !== undefined) return props.totalPages
38
+ const { perPage } = props
39
+ return Math.max(1, Math.ceil(props.totalItems / perPage))
40
+ })
41
+
42
+ watch(
43
+ [() => page.value, () => props.perPage, () => props.totalItems],
44
+ () => {
45
+ if (range.value) {
46
+ const { perPage } = props
47
+ // Calculate zero-based indices
48
+ const start = (page.value - 1) * perPage
49
+ const end = Math.min(start + perPage - 1, props.totalItems - 1)
50
+ range.value = { start, end }
51
+ }
52
+ // Update indicator position when page changes
53
+ nextTick(() => { updateIndicatorPosition() })
54
+ },
55
+ { immediate: true }
56
+ )
57
+
58
+ // Also watch for RTL changes
59
+ watch(() => props.rtl, updateIndicatorPosition)
60
+
61
+ // Calculate which page numbers to show
62
+ const visiblePages = $computed(() => {
63
+ const { maxVisiblePages } = props
64
+
65
+ // If we have few enough pages, show all of them
66
+ if (computedTotalPages <= maxVisiblePages * 2) {
67
+ return Array.from({ length: computedTotalPages }, (_, i) => i + 1)
68
+ }
69
+
70
+ // Always include current page and adjacent pages for navigation
71
+ const mustInclude = new Set<number>()
72
+
73
+ // Current page is always included
74
+ mustInclude.add(page.value)
75
+
76
+ // Ensure adjacent pages are included for navigation
77
+ if (page.value > 1) mustInclude.add(page.value - 1)
78
+ if (page.value < computedTotalPages) mustInclude.add(page.value + 1)
79
+
80
+ // Always include first and last pages
81
+ mustInclude.add(1)
82
+ mustInclude.add(computedTotalPages)
83
+
84
+ // Start with explicitly required pages
85
+ const pageArray = Array.from(mustInclude).sort((a, b) => a - b)
86
+
87
+ // Now fill remaining slots if there's room within maxVisiblePages
88
+ if (pageArray.length < maxVisiblePages + 2) {
89
+ // Try to add pages between existing ones
90
+ for (let i = 0; i < pageArray.length - 1; i++) {
91
+ const current = pageArray[i]
92
+ const next = pageArray[i + 1]
93
+
94
+ if (next - current > 1) {
95
+ // There's a gap - fill in additional pages
96
+ const pagesToAdd = Math.min(next - current - 1, maxVisiblePages + 2 - pageArray.length)
97
+
98
+ const newPages = Array.from(
99
+ { length: pagesToAdd },
100
+ (_, idx) => current + idx + 1
101
+ )
102
+
103
+ pageArray.splice(i + 1, 0, ...newPages)
104
+ i += newPages.length // Skip past inserted items
105
+ }
106
+ }
107
+ }
108
+
109
+ return pageArray
110
+ })
111
+
112
+ function updateIndicatorPosition() {
113
+ if (!paginationContainer) return
114
+
115
+ const selectedButton = paginationContainer.querySelector('.selected')
116
+ if (!selectedButton) return
117
+
118
+ const containerRect = paginationContainer.getBoundingClientRect()
119
+ const buttonRect = selectedButton.getBoundingClientRect()
120
+
121
+ // Get position and dimensions
122
+ indicatorWidth = buttonRect.width
123
+
124
+ if (props.rtl) {
125
+ // RTL positioning - align to right edge
126
+ const rightOffset = containerRect.right - buttonRect.right
127
+ indicatorPosition = rightOffset
128
+ } else {
129
+ // LTR positioning - align to left edge
130
+ const leftOffset = buttonRect.left - containerRect.left
131
+ indicatorPosition = leftOffset
132
+ }
133
+ }
134
+
135
+ function handleClick(p: number) {
136
+ if (p < 1 || p > computedTotalPages) return
137
+ page.value = p
138
+ }
139
+
140
+ function next() {
141
+ handleClick(page.value + 1)
142
+ }
143
+
144
+ function prev() {
145
+ handleClick(page.value - 1)
146
+ }
147
+
148
+ // Convert zero-based index to one-based for display
149
+ function displayIndex(index: number | undefined): string {
150
+ return index === undefined ? '-' : (index + 1).toString()
151
+ }
152
+
153
+ interface PageItem {
154
+ type: 'page' | 'ellipsis'
155
+ key: string | number
156
+ number?: number
157
+ }
158
+
159
+ // Enhanced rendering - creates UI with ellipses in the right positions
160
+ const renderPageButtons = $computed(() => {
161
+ const items: PageItem[] = []
162
+
163
+ for (let i = 0; i < visiblePages.length; i++) {
164
+ const pageNum = visiblePages[i]
165
+
166
+ // Insert ellipsis before this page if needed
167
+ if (i > 0) {
168
+ const prevPage = visiblePages[i - 1]
169
+ if (pageNum - prevPage > 1) {
170
+ items.push({
171
+ type: 'ellipsis',
172
+ key: `ellipsis-${i}`
173
+ })
174
+ }
175
+ }
176
+
177
+ // Add the page button
178
+ items.push({
179
+ type: 'page',
180
+ number: pageNum,
181
+ key: pageNum
182
+ })
183
+ }
184
+
185
+ return items
186
+ })
187
+ </script>
188
+
189
+ <template>
190
+ <div v-if="computedTotalPages > 1" ref="paginationContainer" class="relative flex gap-1 justify-content">
191
+ <!-- Default pagination with page numbers -->
192
+ <template v-if="variant !== 'simple'">
193
+ <div
194
+ class="indicator radius-1"
195
+ :style="{
196
+ [rtl ? 'right' : 'left']: `${indicatorPosition}px`,
197
+ width: `${indicatorWidth}px`,
198
+ }"
199
+ />
200
+ <!-- Render the page buttons and ellipses in order -->
201
+ <template v-for="item in renderPageButtons" :key="item.key">
202
+ <!-- Page button -->
203
+ <Btn
204
+ v-if="item.type === 'page'" flat thin
205
+ :class="{ selected: item.number === page }"
206
+ :value="item.number ? item.number.toString() : ''"
207
+ @click="item.number ? handleClick(item.number) : null"
208
+ />
209
+
210
+ <!-- Ellipsis -->
211
+ <div v-else-if="item.type === 'ellipsis'" class="pagination-ellipsis">
212
+ ...
213
+ </div>
214
+ </template>
215
+ </template>
216
+
217
+ <!-- Simple pagination with prev/next buttons -->
218
+ <template v-else>
219
+ <Btn flat thin :disabled="page <= 1" icon="chevron_left" @click="prev" />
220
+ <span class="pagination-info">
221
+ {{ displayIndex(range?.start) }}-{{ displayIndex(range?.end) }} / {{ props.totalItems }}
222
+ </span>
223
+ <Btn flat thin :disabled="page >= computedTotalPages" icon="chevron_right" @click="next" />
224
+ </template>
225
+ </div>
226
+ </template>
227
+
228
+ <style scoped>
229
+ .indicator {
230
+ position: absolute;
231
+ height: 30px;
232
+ background-color: var(--bgl-primary);
233
+ transition: all 0.3s ease;
234
+ z-index: -1;
235
+ }
236
+
237
+ .selected {
238
+ color: white !important;
239
+ }
240
+
241
+ .pagination-info {
242
+ min-width: 60px;
243
+ text-align: center;
244
+ font-size: 14px;
245
+ }
246
+
247
+ .pagination-ellipsis {
248
+ display: flex;
249
+ align-items: center;
250
+ padding: 0 4px;
251
+ }
252
+ </style>
@@ -100,7 +100,7 @@ const computedBackgroundColor = $computed(
100
100
  <div v-if="loading" class="loading" />
101
101
  <div v-else>
102
102
  <div v-if="btnEnd" class="flex h-100">
103
- <Btn class="bgl_pill-btn" round thin v-bind="btnEnd" />
103
+ <Btn class="bgl_pill-btn" round thin flat v-bind="btnEnd" />
104
104
  </div>
105
105
  </div>
106
106
  </div>