@bagelink/vue 0.0.1133 → 0.0.1137

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 (281) hide show
  1. package/dist/common-C_IH8b5S.cjs +12580 -0
  2. package/dist/common-DoeNgx31.js +12579 -0
  3. package/dist/components/AddressSaerch.vue.d.ts +7 -0
  4. package/dist/components/AddressSaerch.vue.d.ts.map +1 -0
  5. package/dist/components/AddressSearch.vue.d.ts +6 -6
  6. package/dist/components/Alert.vue.d.ts +2 -2
  7. package/dist/components/Alert.vue.d.ts.map +1 -1
  8. package/dist/components/Badge.vue.d.ts +3 -3
  9. package/dist/components/Badge.vue.d.ts.map +1 -1
  10. package/dist/components/Btn.vue.d.ts +3 -3
  11. package/dist/components/Btn.vue.d.ts.map +1 -1
  12. package/dist/components/Carousel.vue.d.ts.map +1 -1
  13. package/dist/components/ComboBox.vue.d.ts +3 -3
  14. package/dist/components/Comments.vue.d.ts +2 -2
  15. package/dist/components/ContactSubmissions.vue.d.ts +2 -2
  16. package/dist/components/DropDown.vue.d.ts +3 -3
  17. package/dist/components/DropDown.vue.d.ts.map +1 -1
  18. package/dist/components/FormSchema.vue.d.ts +4 -5
  19. package/dist/components/Icon/Icon.vue.d.ts +11 -0
  20. package/dist/components/Icon/Icon.vue.d.ts.map +1 -0
  21. package/dist/components/Icon/constants.d.ts +4 -0
  22. package/dist/components/Icon/constants.d.ts.map +1 -0
  23. package/dist/components/Icon/types.d.ts +5 -0
  24. package/dist/components/Icon/types.d.ts.map +1 -0
  25. package/dist/components/LangText.vue.d.ts +2 -2
  26. package/dist/components/ListItem.vue.d.ts +2 -2
  27. package/dist/components/ListItem.vue.d.ts.map +1 -1
  28. package/dist/components/ModalBglForm.vue.d.ts +20 -21
  29. package/dist/components/NavBar.vue.d.ts +3 -3
  30. package/dist/components/NavBar.vue.d.ts.map +1 -1
  31. package/dist/components/PersonPreview.vue.d.ts +4 -5
  32. package/dist/components/PersonPreviewFormkit.vue.d.ts +3 -4
  33. package/dist/components/Pill.vue.d.ts +4 -4
  34. package/dist/components/Pill.vue.d.ts.map +1 -1
  35. package/dist/components/Popover.vue.d.ts +10 -0
  36. package/dist/components/Popover.vue.d.ts.map +1 -0
  37. package/dist/components/RTXEditor.vue.d.ts +3 -3
  38. package/dist/components/TabbedLayout.vue.d.ts +4 -5
  39. package/dist/components/TableSchema.vue.d.ts.map +1 -1
  40. package/dist/components/charts/BarChart.vue.d.ts +2 -2
  41. package/dist/components/form/ItemRef.vue.d.ts +3 -5
  42. package/dist/components/form/ItemRef.vue.d.ts.map +1 -1
  43. package/dist/components/form/MaterialIcon.vue.d.ts +3 -4
  44. package/dist/components/form/PlainInputField.vue.d.ts +3 -3
  45. package/dist/components/form/inputs/CurrencyInput.vue.d.ts +3 -3
  46. package/dist/components/form/inputs/DatePick.vue.d.ts.map +1 -1
  47. package/dist/components/form/inputs/DatetimeInput.vue.d.ts +3 -3
  48. package/dist/components/form/inputs/DurationInput.vue.d.ts +3 -3
  49. package/dist/components/form/inputs/DynamicLinkField.vue.d.ts +3 -3
  50. package/dist/components/form/inputs/EmailInput.vue.d.ts +3 -3
  51. package/dist/components/form/inputs/FloatInput.vue.d.ts +3 -3
  52. package/dist/components/form/inputs/IntInput.vue.d.ts +3 -3
  53. package/dist/components/form/inputs/LinkField.vue.d.ts +3 -3
  54. package/dist/components/form/inputs/NumberInput.vue.d.ts +3 -3
  55. package/dist/components/form/inputs/NumberInput.vue.d.ts.map +1 -1
  56. package/dist/components/form/inputs/Password.vue.d.ts +3 -3
  57. package/dist/components/form/inputs/PasswordInput.vue.d.ts +3 -3
  58. package/dist/components/form/inputs/PasswordInput.vue.d.ts.map +1 -1
  59. package/dist/components/form/inputs/PlainText.vue.d.ts +3 -3
  60. package/dist/components/form/inputs/ReadOnlyInput.vue.d.ts +2 -2
  61. package/dist/components/form/inputs/RichText/Toolbar.vue.d.ts +14 -0
  62. package/dist/components/form/inputs/RichText/Toolbar.vue.d.ts.map +1 -0
  63. package/dist/components/form/inputs/RichText/formatting.d.ts +11 -0
  64. package/dist/components/form/inputs/RichText/formatting.d.ts.map +1 -0
  65. package/dist/components/form/inputs/RichText/richtext-types.d.ts +3 -0
  66. package/dist/components/form/inputs/RichText/richtext-types.d.ts.map +1 -0
  67. package/dist/components/form/inputs/RichText2/Toolbar.vue.d.ts.map +1 -1
  68. package/dist/components/form/inputs/RichText2/index.vue.d.ts +0 -1
  69. package/dist/components/form/inputs/RichText2/index.vue.d.ts.map +1 -1
  70. package/dist/components/form/inputs/RichTextEditor.vue.d.ts +3 -3
  71. package/dist/components/form/inputs/SelectField.vue.d.ts +8 -6
  72. package/dist/components/form/inputs/SelectField.vue.d.ts.map +1 -1
  73. package/dist/components/form/inputs/SelectInput.vue.d.ts +22 -22
  74. package/dist/components/form/inputs/SelectInput.vue.d.ts.map +1 -1
  75. package/dist/components/form/inputs/TelInput.vue.d.ts +6 -6
  76. package/dist/components/form/inputs/TextArea.vue.d.ts +3 -3
  77. package/dist/components/form/inputs/TextInput.vue.d.ts +3 -3
  78. package/dist/components/form/inputs/TextInput.vue.d.ts.map +1 -1
  79. package/dist/components/form/inputs/Upload/UploadFile.vue.d.ts +86 -0
  80. package/dist/components/form/inputs/Upload/UploadFile.vue.d.ts.map +1 -0
  81. package/dist/components/formkit/AddressArray.vue.d.ts +2 -2
  82. package/dist/components/formkit/BankDetailsArray.vue.d.ts +2 -2
  83. package/dist/components/formkit/ContactArrayFormKit.vue.d.ts +2 -2
  84. package/dist/components/formkit/FileUploader.vue.d.ts +2 -2
  85. package/dist/components/formkit/MiscFields.vue.d.ts +2 -2
  86. package/dist/components/formkit/Toggle.vue.d.ts +2 -2
  87. package/dist/components/index.d.ts +1 -2
  88. package/dist/components/index.d.ts.map +1 -1
  89. package/dist/components/layout/TabsNav.vue.d.ts +2 -2
  90. package/dist/components/layout/TabsNav.vue.d.ts.map +1 -1
  91. package/dist/components/sortable/Animation.d.ts +43 -0
  92. package/dist/components/sortable/Animation.d.ts.map +1 -0
  93. package/dist/components/sortable/BrowserInfo.d.ts +7 -0
  94. package/dist/components/sortable/BrowserInfo.d.ts.map +1 -0
  95. package/dist/components/sortable/EventDispatcher.d.ts +13 -0
  96. package/dist/components/sortable/EventDispatcher.d.ts.map +1 -0
  97. package/dist/components/sortable/PluginManager.d.ts +27 -0
  98. package/dist/components/sortable/PluginManager.d.ts.map +1 -0
  99. package/dist/components/sortable/Sortable.d.ts +81 -0
  100. package/dist/components/sortable/Sortable.d.ts.map +1 -0
  101. package/dist/components/sortable/index.d.ts +5 -0
  102. package/dist/components/sortable/index.d.ts.map +1 -0
  103. package/dist/components/sortable/utils.d.ts +49 -0
  104. package/dist/components/sortable/utils.d.ts.map +1 -0
  105. package/dist/components/whatsapp/form/MsgTemplate.vue.d.ts +3 -4
  106. package/dist/components/whatsapp/form/TextVariableExamples.vue.d.ts +2 -2
  107. package/dist/composables/drag-n-drop/useDraggable.d.ts +2 -0
  108. package/dist/composables/drag-n-drop/useDraggable.d.ts.map +1 -0
  109. package/dist/editor-CUDRLdmS.js +4 -0
  110. package/dist/editor-Cu374vEW.cjs +4 -0
  111. package/dist/editor-a8DSbb6P.js +4 -0
  112. package/dist/editor-xBt_vIha.cjs +4 -0
  113. package/dist/heic2any-8wMqMfB_.js +933 -0
  114. package/dist/heic2any-BrqcNzfV.js +935 -0
  115. package/dist/heic2any-C8KwH72N.cjs +934 -0
  116. package/dist/heic2any-k9wDCKka.cjs +932 -0
  117. package/dist/index-DiG-xM9T.cjs +35016 -0
  118. package/dist/index-nGuSAiY2.js +35017 -0
  119. package/dist/index.cjs +5006 -335
  120. package/dist/index.mjs +5007 -336
  121. package/dist/plugins/drag-n-drop/draggable.d.ts +4 -0
  122. package/dist/plugins/drag-n-drop/draggable.d.ts.map +1 -0
  123. package/dist/plugins/drag-n-drop/droppable.d.ts +4 -0
  124. package/dist/plugins/drag-n-drop/droppable.d.ts.map +1 -0
  125. package/dist/plugins/drag-n-drop/index.d.ts +5 -0
  126. package/dist/plugins/drag-n-drop/index.d.ts.map +1 -0
  127. package/dist/plugins/drag-n-drop/useDraggable.d.ts +8 -0
  128. package/dist/plugins/drag-n-drop/useDraggable.d.ts.map +1 -0
  129. package/dist/plugins/drag-n-drop/useDroppable.d.ts +7 -0
  130. package/dist/plugins/drag-n-drop/useDroppable.d.ts.map +1 -0
  131. package/dist/style.css +2215 -3839
  132. package/dist/types/BtnOptions.d.ts +2 -2
  133. package/dist/types/BtnOptions.d.ts.map +1 -1
  134. package/dist/types/NavLink.d.ts +2 -2
  135. package/dist/types/NavLink.d.ts.map +1 -1
  136. package/dist/types/index.d.ts +3 -3
  137. package/dist/types/index.d.ts.map +1 -1
  138. package/dist/types/materialIcon.d.ts +2 -0
  139. package/dist/types/materialIcon.d.ts.map +1 -0
  140. package/dist/utils/objects.d.ts +0 -1
  141. package/package.json +1 -1
  142. package/src/components/AccordionItem.vue +3 -3
  143. package/src/components/Alert.vue +2 -2
  144. package/src/components/Badge.vue +3 -3
  145. package/src/components/Btn.vue +6 -6
  146. package/src/components/Carousel.vue +519 -148
  147. package/src/components/Dropdown.vue +3 -3
  148. package/src/components/Icon/Icon.vue +49 -0
  149. package/src/components/Icon/constants.ts +4427 -0
  150. package/src/components/Icon/types.ts +6 -0
  151. package/src/components/ListItem.vue +2 -2
  152. package/src/components/NavBar.vue +6 -6
  153. package/src/components/Pill.vue +7 -7
  154. package/src/components/TableSchema.vue +3 -4
  155. package/src/components/form/inputs/DatePick.vue +50 -172
  156. package/src/components/form/inputs/NumberInput.vue +9 -6
  157. package/src/components/form/inputs/PasswordInput.vue +3 -3
  158. package/src/components/form/inputs/RichText/richTextTypes.d.ts +2 -2
  159. package/src/components/form/inputs/SelectInput.vue +2 -2
  160. package/src/components/form/inputs/TableField.vue +3 -3
  161. package/src/components/form/inputs/TextInput.vue +6 -6
  162. package/src/components/index.ts +1 -2
  163. package/src/components/layout/TabsNav.vue +2 -2
  164. package/src/styles/inputs.css +142 -137
  165. package/src/styles/modal.css +1 -3
  166. package/src/styles/theme.css +258 -266
  167. package/src/types/BtnOptions.ts +2 -2
  168. package/src/types/NavLink.ts +2 -2
  169. package/src/types/index.ts +4 -3
  170. package/dist/components/Accordion.d.ts +0 -12
  171. package/dist/components/Accordion.d.ts.map +0 -1
  172. package/dist/components/AccordionItem.d.ts +0 -34
  173. package/dist/components/AccordionItem.d.ts.map +0 -1
  174. package/dist/components/Alert.d.ts +0 -34
  175. package/dist/components/Alert.d.ts.map +0 -1
  176. package/dist/components/Avatar.d.ts +0 -36
  177. package/dist/components/Avatar.d.ts.map +0 -1
  178. package/dist/components/Badge.d.ts +0 -22
  179. package/dist/components/Badge.d.ts.map +0 -1
  180. package/dist/components/BglVideo.d.ts +0 -20
  181. package/dist/components/BglVideo.d.ts.map +0 -1
  182. package/dist/components/Btn.d.ts +0 -99
  183. package/dist/components/Btn.d.ts.map +0 -1
  184. package/dist/components/Card.d.ts +0 -39
  185. package/dist/components/Card.d.ts.map +0 -1
  186. package/dist/components/Carousel.d.ts +0 -74
  187. package/dist/components/Carousel.d.ts.map +0 -1
  188. package/dist/components/DataPreview.d.ts +0 -42
  189. package/dist/components/DataPreview.d.ts.map +0 -1
  190. package/dist/components/Drop.vue.d.ts +0 -34
  191. package/dist/components/Drop.vue.d.ts.map +0 -1
  192. package/dist/components/FileUploader.vue.d.ts +0 -60
  193. package/dist/components/FileUploader.vue.d.ts.map +0 -1
  194. package/dist/components/Flag.d.ts +0 -20
  195. package/dist/components/Flag.d.ts.map +0 -1
  196. package/dist/components/ListItem.d.ts +0 -34
  197. package/dist/components/ListItem.d.ts.map +0 -1
  198. package/dist/components/ListView.d.ts +0 -13
  199. package/dist/components/ListView.d.ts.map +0 -1
  200. package/dist/components/MapEmbed.d.ts +0 -3
  201. package/dist/components/MapEmbed.d.ts.map +0 -1
  202. package/dist/components/MaterialIcon.d.ts +0 -26
  203. package/dist/components/MaterialIcon.d.ts.map +0 -1
  204. package/dist/components/Modal.d.ts +0 -46
  205. package/dist/components/Modal.d.ts.map +0 -1
  206. package/dist/components/ModalConfirm.d.ts +0 -24
  207. package/dist/components/ModalConfirm.d.ts.map +0 -1
  208. package/dist/components/ModalForm.d.ts +0 -78
  209. package/dist/components/ModalForm.d.ts.map +0 -1
  210. package/dist/components/NavBar.d.ts +0 -64
  211. package/dist/components/NavBar.d.ts.map +0 -1
  212. package/dist/components/PageTitle.d.ts +0 -24
  213. package/dist/components/PageTitle.d.ts.map +0 -1
  214. package/dist/components/RouterWrapper.d.ts +0 -3
  215. package/dist/components/RouterWrapper.d.ts.map +0 -1
  216. package/dist/components/TableSchema.d.ts +0 -35
  217. package/dist/components/TableSchema.d.ts.map +0 -1
  218. package/dist/components/Title.d.ts +0 -42
  219. package/dist/components/Title.d.ts.map +0 -1
  220. package/dist/components/TopBar.d.ts +0 -12
  221. package/dist/components/TopBar.d.ts.map +0 -1
  222. package/dist/components/dashboard/Lineart.d.ts +0 -20
  223. package/dist/components/dashboard/Lineart.d.ts.map +0 -1
  224. package/dist/components/form/BglField.d.ts +0 -25
  225. package/dist/components/form/BglField.d.ts.map +0 -1
  226. package/dist/components/form/BglForm.d.ts +0 -75
  227. package/dist/components/form/BglForm.d.ts.map +0 -1
  228. package/dist/components/form/inputs/CheckInput.d.ts +0 -56
  229. package/dist/components/form/inputs/CheckInput.d.ts.map +0 -1
  230. package/dist/components/form/inputs/Checkbox.d.ts +0 -16
  231. package/dist/components/form/inputs/Checkbox.d.ts.map +0 -1
  232. package/dist/components/form/inputs/ColorPicker.d.ts +0 -48
  233. package/dist/components/form/inputs/ColorPicker.d.ts.map +0 -1
  234. package/dist/components/form/inputs/DateInput.d.ts +0 -64
  235. package/dist/components/form/inputs/DateInput.d.ts.map +0 -1
  236. package/dist/components/form/inputs/DatePicker.d.ts +0 -33
  237. package/dist/components/form/inputs/DatePicker.d.ts.map +0 -1
  238. package/dist/components/form/inputs/FileUpload.d.ts +0 -108
  239. package/dist/components/form/inputs/FileUpload.d.ts.map +0 -1
  240. package/dist/components/form/inputs/JSONInput.d.ts +0 -53
  241. package/dist/components/form/inputs/JSONInput.d.ts.map +0 -1
  242. package/dist/components/form/inputs/RadioGroup.d.ts +0 -42
  243. package/dist/components/form/inputs/RadioGroup.d.ts.map +0 -1
  244. package/dist/components/form/inputs/RadioPillsInput.d.ts +0 -48
  245. package/dist/components/form/inputs/RadioPillsInput.d.ts.map +0 -1
  246. package/dist/components/form/inputs/RichText.d.ts +0 -20
  247. package/dist/components/form/inputs/RichText.d.ts.map +0 -1
  248. package/dist/components/form/inputs/RichText2/Toolbar.d.ts +0 -22
  249. package/dist/components/form/inputs/RichText2/Toolbar.d.ts.map +0 -1
  250. package/dist/components/form/inputs/RichText2/index.d.ts +0 -24
  251. package/dist/components/form/inputs/RichText2/index.d.ts.map +0 -1
  252. package/dist/components/form/inputs/SelectInput.d.ts +0 -55
  253. package/dist/components/form/inputs/SelectInput.d.ts.map +0 -1
  254. package/dist/components/form/inputs/SignaturePad.d.ts +0 -72
  255. package/dist/components/form/inputs/SignaturePad.d.ts.map +0 -1
  256. package/dist/components/form/inputs/TableField.d.ts +0 -45
  257. package/dist/components/form/inputs/TableField.d.ts.map +0 -1
  258. package/dist/components/form/inputs/TelInput.d.ts +0 -241
  259. package/dist/components/form/inputs/TelInput.d.ts.map +0 -1
  260. package/dist/components/form/inputs/TextInput.d.ts +0 -90
  261. package/dist/components/form/inputs/TextInput.d.ts.map +0 -1
  262. package/dist/components/form/inputs/ToggleInput.d.ts +0 -58
  263. package/dist/components/form/inputs/ToggleInput.d.ts.map +0 -1
  264. package/dist/components/layout/BottomMenu.d.ts +0 -27
  265. package/dist/components/layout/BottomMenu.d.ts.map +0 -1
  266. package/dist/components/layout/Layout.d.ts +0 -58
  267. package/dist/components/layout/Layout.d.ts.map +0 -1
  268. package/dist/components/layout/SidebarMenu.d.ts +0 -38
  269. package/dist/components/layout/SidebarMenu.d.ts.map +0 -1
  270. package/dist/components/layout/TabbedLayout.d.ts +0 -42
  271. package/dist/components/layout/TabbedLayout.d.ts.map +0 -1
  272. package/dist/components/layout/Tabs.d.ts +0 -31
  273. package/dist/components/layout/Tabs.d.ts.map +0 -1
  274. package/dist/components/layout/TabsBody.d.ts +0 -23
  275. package/dist/components/layout/TabsBody.d.ts.map +0 -1
  276. package/dist/components/layout/TabsNav.d.ts +0 -35
  277. package/dist/components/layout/TabsNav.d.ts.map +0 -1
  278. package/dist/styles.css +0 -14073
  279. package/dist/vue.css +0 -14073
  280. package/src/components/MaterialIcon.vue +0 -21
  281. package/src/types/materialIcons.ts +0 -3761
@@ -1,5 +1,5 @@
1
1
  <script setup lang="ts">
2
- import { onMounted, onUnmounted, watch } from 'vue'
2
+ import { nextTick, onMounted, onUnmounted, watch } from 'vue'
3
3
 
4
4
  const props = defineProps({
5
5
  autoHeight: { type: Boolean, default: false },
@@ -14,173 +14,547 @@ const props = defineProps({
14
14
  })
15
15
 
16
16
  const emit = defineEmits(['update:index'])
17
- const bglSlider = $ref<HTMLElement>()
17
+
18
+ // Constants
19
+ const ANIMATION_TIMINGS = {
20
+ TOUCH: 150,
21
+ MOBILE: 300,
22
+ DESKTOP: 400,
23
+ MAX_DURATION: 300,
24
+ BASE_DURATION: 150,
25
+ DURATION_PER_PANEL: 50,
26
+ } as const
27
+
28
+ const THRESHOLDS = {
29
+ DRAG: 20,
30
+ TOUCH: 5,
31
+ SWIPE_PERCENT: 0.1,
32
+ VELOCITY: 0.15,
33
+ WHEEL_PERCENT: 0.3,
34
+ } as const
35
+
36
+ // Add gap constant
37
+ const GAP_PERCENT = 1
38
+
39
+ // Template refs and state
40
+ const bglSlider = $ref<HTMLElement | undefined>()
41
+ const isSliderAvailable = $computed(() => !!bglSlider)
18
42
 
19
43
  let itemCount = $ref(props.items)
20
44
  let activeSlideIndex = $ref(props.index)
45
+ let slideCount = $ref(0)
46
+ let yHeight = $ref('auto')
47
+
48
+ // Interaction state
21
49
  let isDragging = $ref(false)
22
50
  let isPressed = $ref(false)
23
51
  let startX = $ref(0)
24
- let scrollStart = $ref(0)
25
- let yHeight = $ref('auto')
26
- let slideCount = $ref(0)
52
+ let startY = $ref(0)
53
+ let translateX = $ref(0)
54
+ let lastX = $ref(0)
55
+ let lastTime = $ref(0)
56
+ let swipeVelocity = $ref(0)
57
+ let accumulatedDeltaX = $ref(0)
58
+
59
+ // Timers
27
60
  let timeout: NodeJS.Timeout
61
+ let wheelTimeout: NodeJS.Timeout
28
62
  let autoPlayInterval: NodeJS.Timeout
29
63
 
30
- // Helper Functions
31
- function preventDefaultClick(e: MouseEvent) {
32
- if (isDragging) {
33
- e.preventDefault()
34
- }
64
+ // Add interface for velocity tracking
65
+ interface VelocitySample {
66
+ time: number
67
+ position: number
35
68
  }
36
69
 
37
- function countSlides() {
38
- if (!bglSlider) return
39
- slideCount = bglSlider.children.length
70
+ let velocityTracker = $ref<VelocitySample[]>([])
71
+ const VELOCITY_SAMPLE_DURATION = 100 // ms to track velocity
72
+
73
+ function getAverageVelocity(): number {
74
+ if (velocityTracker.length < 2) return 0
75
+
76
+ const now = Date.now()
77
+ // Only consider samples within our sample duration
78
+ const recentSamples = velocityTracker.filter((sample: VelocitySample) => now - sample.time < VELOCITY_SAMPLE_DURATION)
79
+
80
+ if (recentSamples.length < 2) return 0
81
+
82
+ const first = recentSamples[0]
83
+ const last = recentSamples[recentSamples.length - 1]
84
+ const timeDelta = last.time - first.time
85
+
86
+ if (timeDelta === 0) return 0
87
+
88
+ return (last.position - first.position) / timeDelta
40
89
  }
41
90
 
42
- function disableDrag() {
43
- bglSlider?.querySelectorAll('img').forEach((img) => { img.setAttribute('draggable', 'false') })
44
- Array.from(bglSlider?.children || []).forEach((child) => {
45
- child.setAttribute('draggable', 'false');
46
- (child as HTMLElement).addEventListener('click', preventDefaultClick)
47
- })
91
+ // Transform helpers
92
+ function getCurrentTransform(): number {
93
+ if (!bglSlider) return 0
94
+ const { transform } = bglSlider.style
95
+ const value = transform ? Number.parseInt(transform.replace(/[^-\d.]/g, '')) : 0
96
+ return props.rtl ? -value : value
48
97
  }
49
98
 
50
- function calcHeight() {
99
+ function setTransform(value: number) {
51
100
  if (!bglSlider) return
52
- try {
53
- const slide = bglSlider.children[activeSlideIndex]
54
- if (!slide) return
55
- const children = Array.from(slide.children)
56
- const totalHeight = children.reduce((sum, el) => sum + el.clientHeight, 0)
57
- yHeight = `${totalHeight}px`
58
- } catch (error) {
59
- console.error(error)
60
- }
101
+ const rtlValue = props.rtl ? -value : value
102
+ bglSlider.style.transform = `translateX(${rtlValue}px)`
61
103
  }
62
104
 
63
- function updateHeight() {
64
- if (!props.autoHeight) return
65
- setTimeout(calcHeight, 200)
105
+ function easeInOutQuad(t: number) {
106
+ return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t
66
107
  }
67
108
 
68
- function easeScroll(target: number, duration = 500) {
69
- if (!bglSlider || isPressed) return
70
- const start = bglSlider.scrollLeft
71
- const change = target - start
109
+ function animateTransform(start: number, end: number, duration: number) {
72
110
  const startTime = performance.now()
73
111
 
74
112
  function animate(currentTime: number) {
75
- if (!bglSlider) return
113
+ if (!isSliderAvailable) return
76
114
  const timeElapsed = currentTime - startTime
77
115
  const progress = Math.min(timeElapsed / duration, 1)
78
- bglSlider.scrollLeft = start + change * easeInOutQuad(progress)
116
+ const currentTransform = start + (end - start) * easeInOutQuad(progress)
117
+ setTransform(currentTransform)
79
118
  if (progress < 1) requestAnimationFrame(animate)
80
119
  }
81
120
 
82
- function easeInOutQuad(t: number) {
83
- return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t
84
- }
85
-
86
121
  requestAnimationFrame(animate)
87
122
  }
88
123
 
89
- function goToSlide(index: number) {
124
+ // Navigation
125
+ function goToSlide(index: number, isTouchNav = false) {
90
126
  countSlides()
91
- if (!bglSlider || index < 0 || index >= slideCount) return
92
- const offset = bglSlider.offsetWidth * index * (props.rtl ? -1 : 1)
93
- const duration = window.innerWidth < 600 ? 400 : window.innerWidth < 991 ? 500 : 700
94
- easeScroll(offset, duration)
127
+ if (!isSliderAvailable || !bglSlider || index < 0 || index >= slideCount) return
128
+
129
+ const containerWidth = bglSlider.offsetWidth
130
+ const gapWidth = (containerWidth * GAP_PERCENT) / 100
131
+ const totalGapWidth = (itemCount - 1) * gapWidth
132
+ const singleItemWidth = (containerWidth - totalGapWidth) / itemCount
133
+
134
+ // Account for all gaps before this slide
135
+ const gapsBeforeSlide = index * gapWidth
136
+ const targetTransform = -(singleItemWidth * index + gapsBeforeSlide)
137
+
138
+ const currentTransform = getCurrentTransform()
139
+ const duration = isTouchNav
140
+ ? ANIMATION_TIMINGS.TOUCH
141
+ : window.innerWidth < 600
142
+ ? ANIMATION_TIMINGS.MOBILE
143
+ : ANIMATION_TIMINGS.DESKTOP
144
+
145
+ animateTransform(currentTransform, targetTransform, duration)
95
146
  activeSlideIndex = index
96
147
  updateHeight()
97
148
  }
98
149
 
150
+ function next() {
151
+ if (!isSliderAvailable) return
152
+ countSlides()
153
+ goToSlide((activeSlideIndex + 1) % slideCount)
154
+ }
155
+
156
+ function prev() {
157
+ if (!isSliderAvailable) return
158
+ countSlides()
159
+ goToSlide((activeSlideIndex - 1 + slideCount) % slideCount)
160
+ }
161
+
162
+ // Height management
163
+ function calcHeight() {
164
+ if (!isSliderAvailable || !bglSlider) return
165
+ try {
166
+ const activeSlide = bglSlider.children[activeSlideIndex]
167
+ if (!activeSlide) return
168
+ const children = Array.from(activeSlide.children) as HTMLElement[]
169
+ const totalHeight = children.reduce((sum, el) => sum + el.clientHeight, 0)
170
+ yHeight = `${totalHeight}px`
171
+ } catch (error) {
172
+ console.error('Error calculating height:', error)
173
+ }
174
+ }
175
+
176
+ function updateHeight() {
177
+ if (!props.autoHeight) return
178
+ setTimeout(calcHeight, 200)
179
+ }
180
+
181
+ // Slide management
182
+ function countSlides() {
183
+ if (!isSliderAvailable || !bglSlider) return
184
+ slideCount = bglSlider.children.length
185
+ }
186
+
187
+ // Event handlers
99
188
  function handleSlideChange() {
100
- if (props.index !== activeSlideIndex) emit('update:index', activeSlideIndex)
189
+ if (props.index !== activeSlideIndex) {
190
+ emit('update:index', activeSlideIndex)
191
+ }
101
192
  }
102
193
 
103
194
  function handleResize() {
104
- if (!bglSlider) return
105
- itemCount = window.innerWidth < 600 ? 1 : window.innerWidth < 991 ? Math.min(props.items, 2) : props.items
106
- goToSlide(activeSlideIndex)
195
+ if (!isSliderAvailable || !bglSlider) return
196
+ itemCount = window.innerWidth < 600
197
+ ? 1
198
+ : window.innerWidth < 991
199
+ ? Math.min(props.items, 2)
200
+ : props.items
201
+
202
+ const containerWidth = bglSlider.offsetWidth
203
+ const gapWidth = (containerWidth * GAP_PERCENT) / 100
204
+ const totalGapWidth = (itemCount - 1) * gapWidth
205
+ const singleItemWidth = (containerWidth - totalGapWidth) / itemCount
206
+ const gapsBeforeSlide = activeSlideIndex * gapWidth
207
+ const targetTransform = -(singleItemWidth * activeSlideIndex + gapsBeforeSlide)
208
+
209
+ setTransform(targetTransform)
210
+ updateHeight()
107
211
  }
108
212
 
109
- function onScrollEnd() {
110
- if ((!props.freeDrag && !props.allowScroll) || !bglSlider) return
213
+ function clearAutoplay() {
111
214
  if (autoPlayInterval) clearInterval(autoPlayInterval)
112
- if (timeout) clearTimeout(timeout)
113
- timeout = setTimeout(() => { finalizeScroll() }, 400)
114
215
  }
115
216
 
116
- function finalizeScroll() {
117
- if (!bglSlider) return
118
- if (props.autoplay) autoPlayInterval = setInterval(next, props.autoPlaySpeed)
119
- scrollStart = props.rtl ? -bglSlider.scrollLeft : bglSlider.scrollLeft
120
- activeSlideIndex = Math.round(scrollStart / bglSlider.offsetWidth)
121
- goToSlide(activeSlideIndex)
217
+ // Mouse events
218
+ function preventDefaultClick(e: MouseEvent) {
219
+ if (isDragging) e.preventDefault()
220
+ }
221
+
222
+ async function disableDrag() {
223
+ await nextTick()
224
+ if (!isSliderAvailable || !bglSlider) return
225
+
226
+ const elements = Array.from(bglSlider.querySelectorAll('img, a')) as HTMLElement[]
227
+ elements.forEach((el) => {
228
+ el.setAttribute('draggable', 'false')
229
+ })
230
+
231
+ const slides = Array.from(bglSlider.children)
232
+ slides.forEach((slide) => {
233
+ const element = slide as HTMLElement
234
+ element.setAttribute('draggable', 'false')
235
+ element.removeEventListener('click', preventDefaultClick)
236
+ element.addEventListener('click', preventDefaultClick)
237
+ })
122
238
  }
123
239
 
124
240
  function startDrag(e: MouseEvent) {
125
- if (e.button !== 0 || !props.freeDrag || !bglSlider) return
126
- if (autoPlayInterval) clearInterval(autoPlayInterval)
127
- startX = e.pageX - bglSlider.offsetLeft
128
- scrollStart = bglSlider.scrollLeft
241
+ if (e.button !== 0 || !props.freeDrag || !isSliderAvailable) return
242
+
243
+ clearAutoplay()
244
+ startX = e.pageX
245
+ translateX = getCurrentTransform()
129
246
  isPressed = true
247
+
130
248
  document.addEventListener('mousemove', onDrag)
131
249
  document.addEventListener('mouseup', endDrag)
132
250
  }
133
251
 
134
252
  function onDrag(e: MouseEvent) {
135
- if (!bglSlider) return
136
- const x = e.pageX - bglSlider.offsetLeft
253
+ if (!isSliderAvailable || !bglSlider || !isPressed) return
254
+
255
+ const x = e.pageX
137
256
  const distance = x - startX
138
- if (Math.abs(distance) > 20) isDragging = true
139
- if (isDragging) bglSlider.scrollLeft = scrollStart - distance
257
+
258
+ if (Math.abs(distance) > THRESHOLDS.DRAG) isDragging = true
259
+ if (isDragging) {
260
+ const newTranslate = translateX + distance
261
+ const maxTranslate = 0
262
+
263
+ const containerWidth = bglSlider.offsetWidth
264
+ const gapWidth = (containerWidth * GAP_PERCENT) / 100
265
+ const totalGapWidth = (itemCount - 1) * gapWidth
266
+ const singleItemWidth = (containerWidth - totalGapWidth) / itemCount
267
+ const minTranslate = -(singleItemWidth * (slideCount - 1) + gapWidth * (slideCount - 1))
268
+
269
+ const boundedTranslate = Math.max(minTranslate, Math.min(maxTranslate, newTranslate))
270
+ setTransform(boundedTranslate)
271
+ }
140
272
  }
141
273
 
142
274
  function endDrag() {
143
275
  isPressed = false
144
276
  document.removeEventListener('mousemove', onDrag)
145
277
  document.removeEventListener('mouseup', endDrag)
278
+
279
+ if (!isSliderAvailable || !bglSlider) return
280
+
281
+ const currentTransform = getCurrentTransform()
282
+ const singleItemWidth = bglSlider.offsetWidth / itemCount
283
+ const currentPanel = -currentTransform / singleItemWidth
284
+
285
+ const totalDragDistance = currentTransform - translateX
286
+ const dragPercentage = Math.abs(totalDragDistance) / singleItemWidth
287
+
288
+ let targetPanel = currentPanel
289
+ if (dragPercentage > THRESHOLDS.SWIPE_PERCENT) {
290
+ const direction = totalDragDistance > 0 ? -1 : 1
291
+ targetPanel = Math.floor(currentPanel) + (direction < 0 ? 0 : 1)
292
+ } else {
293
+ targetPanel = Math.round(currentPanel)
294
+ }
295
+
296
+ targetPanel = Math.max(0, Math.min(targetPanel, slideCount - 1))
297
+ goToSlide(targetPanel, true)
146
298
  setTimeout(() => (isDragging = false), 100)
147
299
  }
148
300
 
149
- // Navigation Functions
150
- function next() {
151
- if (!bglSlider) return
152
- countSlides()
153
- goToSlide((activeSlideIndex + 1) % slideCount)
301
+ // Add a new state variable for tracking scroll direction
302
+ let hasScrollDirectionLock = $ref(false)
303
+ let isHorizontalScroll = $ref(false)
304
+
305
+ function onTouchStart(e: TouchEvent) {
306
+ if (!props.freeDrag || !isSliderAvailable) return
307
+
308
+ const target = e.target as HTMLElement
309
+ const isInteractive = target.matches('button, a, input, select, textarea, [role="button"]')
310
+ || target.closest('button, a, input, select, textarea, [role="button"]')
311
+
312
+ if (!isInteractive) {
313
+ // Don't prevent default immediately - let's wait to see the direction
314
+ clearAutoplay()
315
+ const touch = e.touches[0]
316
+ startX = touch.pageX
317
+ startY = touch.pageY
318
+ lastX = touch.pageX
319
+ lastTime = Date.now()
320
+ translateX = getCurrentTransform()
321
+ velocityTracker = [{ time: lastTime, position: lastX }]
322
+ swipeVelocity = 0
323
+ isPressed = true
324
+ hasScrollDirectionLock = false
325
+
326
+ // Ensure no transition is active when starting touch
327
+ if (bglSlider) {
328
+ bglSlider.style.transition = 'none'
329
+ }
330
+ }
154
331
  }
155
332
 
156
- function prev() {
157
- if (!bglSlider) return
158
- countSlides()
159
- goToSlide((activeSlideIndex - 1 + slideCount) % slideCount)
333
+ function onTouchMove(e: TouchEvent) {
334
+ if (!isSliderAvailable || !bglSlider || !isPressed) return
335
+
336
+ const touch = e.touches[0]
337
+ const x = touch.pageX
338
+ const y = touch.pageY
339
+ const deltaX = x - startX
340
+ const deltaY = y - startY
341
+
342
+ // Determine scroll direction if we haven't already
343
+ if (!hasScrollDirectionLock) {
344
+ // Only lock in a direction if there's significant movement
345
+ if (Math.abs(deltaX) > 5 || Math.abs(deltaY) > 5) {
346
+ isHorizontalScroll = Math.abs(deltaX) > Math.abs(deltaY)
347
+ hasScrollDirectionLock = true
348
+
349
+ // If it's vertical scrolling, release the touch capture
350
+ if (!isHorizontalScroll) {
351
+ isPressed = false
352
+ return
353
+ }
354
+ }
355
+ // Wait for more movement before deciding
356
+ return
357
+ }
358
+
359
+ // If we've determined this is a vertical scroll, don't handle the touch
360
+ if (!isHorizontalScroll) return
361
+
362
+ // Update velocity tracking
363
+ const now = Date.now()
364
+ velocityTracker.push({ time: now, position: x })
365
+ lastX = x
366
+
367
+ // Keep only recent samples
368
+ const cutoffTime = now - VELOCITY_SAMPLE_DURATION
369
+ velocityTracker = velocityTracker.filter((sample: VelocitySample) => sample.time >= cutoffTime)
370
+
371
+ // Calculate instantaneous velocity for immediate feedback
372
+ swipeVelocity = getAverageVelocity()
373
+
374
+ if (Math.abs(deltaX) > THRESHOLDS.TOUCH) {
375
+ isDragging = true
376
+ e.preventDefault() // Only prevent default if we're sure it's a horizontal drag
377
+ }
378
+
379
+ if (isDragging) {
380
+ const containerWidth = bglSlider.offsetWidth
381
+ const gapWidth = (containerWidth * GAP_PERCENT) / 100
382
+ const totalGapWidth = (itemCount - 1) * gapWidth
383
+ const singleItemWidth = (containerWidth - totalGapWidth) / itemCount
384
+ const totalWidth = (singleItemWidth * slideCount) + (gapWidth * (slideCount - 1))
385
+
386
+ // Calculate the new position based on touch movement
387
+ let newTranslate = translateX + (props.rtl ? -deltaX : deltaX)
388
+
389
+ // Add smooth resistance when pulling beyond bounds
390
+ if (newTranslate > 0) {
391
+ newTranslate = newTranslate * 0.5 // Softer resistance at start
392
+ } else if (newTranslate < -totalWidth + containerWidth) {
393
+ const overDrag = -totalWidth + containerWidth - newTranslate
394
+ newTranslate = -totalWidth + containerWidth - (overDrag * 0.5) // Softer resistance at end
395
+ }
396
+
397
+ // Apply the transform immediately without any easing
398
+ setTransform(newTranslate)
399
+ }
160
400
  }
161
401
 
162
- // Lifecycle Hooks
402
+ function onTouchEnd() {
403
+ if (!isSliderAvailable || !bglSlider || !isPressed || !isHorizontalScroll) {
404
+ isPressed = false
405
+ hasScrollDirectionLock = false
406
+ return
407
+ }
408
+
409
+ const containerWidth = bglSlider.offsetWidth
410
+ const gapWidth = (containerWidth * GAP_PERCENT) / 100
411
+ const totalGapWidth = (itemCount - 1) * gapWidth
412
+ const singleItemWidth = (containerWidth - totalGapWidth) / itemCount
413
+ const totalSlideWidth = singleItemWidth + gapWidth
414
+
415
+ const currentTransform = getCurrentTransform()
416
+
417
+ // Normalize the transform value to handle overscroll
418
+ let normalizedTransform = currentTransform
419
+ if (currentTransform > 0) {
420
+ normalizedTransform = 0
421
+ } else {
422
+ const minTransform = -(singleItemWidth * (slideCount - 1) + gapWidth * (slideCount - 1))
423
+ if (currentTransform < minTransform) {
424
+ normalizedTransform = minTransform
425
+ }
426
+ }
427
+
428
+ const currentPanel = Math.abs(normalizedTransform / totalSlideWidth)
429
+
430
+ const totalSwipeDistance = lastX - startX
431
+ const swipePercentage = Math.abs(totalSwipeDistance) / totalSlideWidth
432
+
433
+ // Get final velocity from tracker
434
+ const finalVelocity = getAverageVelocity()
435
+
436
+ let targetPanel = currentPanel
437
+ let velocityDirection = 0
438
+
439
+ // Determine direction based on velocity and distance
440
+ if (Math.abs(finalVelocity) > THRESHOLDS.VELOCITY) {
441
+ velocityDirection = finalVelocity < 0 ? 1 : -1
442
+ }
443
+
444
+ const isMobile = window.innerWidth < 600
445
+
446
+ if (swipePercentage > THRESHOLDS.SWIPE_PERCENT || Math.abs(finalVelocity) > THRESHOLDS.VELOCITY) {
447
+ const direction = swipePercentage > THRESHOLDS.SWIPE_PERCENT
448
+ ? (totalSwipeDistance > 0 ? -1 : 1)
449
+ : velocityDirection
450
+
451
+ const rtlDirection = props.rtl ? -direction : direction
452
+
453
+ if (isMobile) {
454
+ // On mobile, only move one slide at a time
455
+ targetPanel = activeSlideIndex + rtlDirection
456
+ } else {
457
+ // On desktop, keep the current behavior
458
+ targetPanel = Math.round(currentPanel) + rtlDirection
459
+ }
460
+ } else {
461
+ // If the swipe wasn't strong enough, snap back to the current slide
462
+ targetPanel = isMobile ? activeSlideIndex : Math.round(currentPanel)
463
+ }
464
+
465
+ targetPanel = Math.max(0, Math.min(targetPanel, slideCount - 1))
466
+ activeSlideIndex = targetPanel
467
+
468
+ // Adjust animation duration based on velocity and distance to travel
469
+ const distance = Math.abs(targetPanel - currentPanel)
470
+ const velocityFactor = Math.min(Math.abs(finalVelocity) * 1000, 1)
471
+ const duration = Math.min(
472
+ ANIMATION_TIMINGS.BASE_DURATION * (1 - velocityFactor * 0.5) + (distance * ANIMATION_TIMINGS.DURATION_PER_PANEL),
473
+ ANIMATION_TIMINGS.MAX_DURATION
474
+ )
475
+
476
+ // Re-enable transitions for the snap animation
477
+ bglSlider.style.transition = `transform ${duration}ms cubic-bezier(0.4, 0, 0.2, 1)`
478
+
479
+ const gapsBeforeSlide = targetPanel * gapWidth
480
+ const targetTransform = -(singleItemWidth * targetPanel + gapsBeforeSlide)
481
+ setTransform(targetTransform)
482
+
483
+ // Clear transition after animation
484
+ setTimeout(() => {
485
+ if (bglSlider) bglSlider.style.transition = 'none'
486
+ }, duration)
487
+
488
+ velocityTracker = []
489
+ swipeVelocity = 0
490
+ isDragging = false
491
+ hasScrollDirectionLock = false
492
+ }
493
+
494
+ // Wheel events
495
+ function onWheel(e: WheelEvent) {
496
+ if (!props.allowScroll || !isSliderAvailable || !bglSlider || isPressed || isDragging) return
497
+
498
+ const isHorizontal = Math.abs(e.deltaX) > Math.abs(e.deltaY)
499
+ if (!isHorizontal) return
500
+
501
+ clearAutoplay()
502
+ if (wheelTimeout) clearTimeout(wheelTimeout)
503
+
504
+ accumulatedDeltaX += e.deltaX
505
+
506
+ wheelTimeout = setTimeout(() => {
507
+ accumulatedDeltaX = 0
508
+ }, 50)
509
+
510
+ const singleItemWidth = bglSlider.offsetWidth / itemCount
511
+ const moveThreshold = singleItemWidth * THRESHOLDS.WHEEL_PERCENT
512
+
513
+ if (Math.abs(accumulatedDeltaX) > moveThreshold) {
514
+ const direction = accumulatedDeltaX > 0 ? 1 : -1
515
+ const nextPanel = Math.max(0, Math.min(activeSlideIndex + direction, slideCount - 1))
516
+
517
+ if (nextPanel !== activeSlideIndex) {
518
+ goToSlide(nextPanel, true)
519
+ accumulatedDeltaX = 0
520
+ }
521
+ }
522
+ }
523
+
524
+ // Lifecycle
163
525
  onMounted(() => {
164
526
  window.addEventListener('resize', handleResize)
165
- disableDrag()
166
527
  updateHeight()
167
528
  handleResize()
168
529
  countSlides()
530
+ disableDrag()
531
+
532
+ if (bglSlider) {
533
+ slideCount = bglSlider.children.length
534
+ }
535
+
169
536
  if (props.autoplay) {
170
537
  autoPlayInterval = setInterval(next, props.autoPlaySpeed)
171
538
  }
172
539
  })
173
540
 
174
- function clearAutoplay() {
175
- if (autoPlayInterval) clearInterval(autoPlayInterval)
176
- }
177
-
178
541
  onUnmounted(() => {
542
+ if (isSliderAvailable && bglSlider) {
543
+ Array.from(bglSlider.children).forEach((child) => {
544
+ const element = child as HTMLElement
545
+ element.removeEventListener('click', preventDefaultClick)
546
+ })
547
+ }
179
548
  window.removeEventListener('resize', handleResize)
549
+ document.removeEventListener('mousemove', onDrag)
550
+ document.removeEventListener('mouseup', endDrag)
551
+ clearAutoplay()
552
+ if (timeout) clearTimeout(timeout)
553
+ if (wheelTimeout) clearTimeout(wheelTimeout)
180
554
  })
181
555
 
182
556
  // Watchers
183
- watch(() => props.index, goToSlide)
557
+ watch(() => props.index, (newIndex: number) => { goToSlide(newIndex) })
184
558
  watch(() => activeSlideIndex, handleSlideChange)
185
559
  </script>
186
560
 
@@ -189,18 +563,26 @@ watch(() => activeSlideIndex, handleSlideChange)
189
563
  <div
190
564
  ref="bglSlider"
191
565
  class="bgl-slider"
192
- :class="{ dragging: isDragging, clicking: isPressed, allowScroll, odd: itemCount % 2 !== 0, [`slides-${itemCount}`]: itemCount === 1 }"
566
+ :class="{ dragging: isDragging, clicking: isPressed, [`slides-${itemCount}`]: true }"
193
567
  :style="{ '--item-count': itemCount }"
194
- @scroll="onScrollEnd"
195
568
  @mousedown="startDrag"
196
569
  @mouseover="clearAutoplay"
197
570
  @focusin="clearAutoplay"
571
+ @touchstart="onTouchStart"
572
+ @touchmove="onTouchMove"
573
+ @touchend="onTouchEnd"
574
+ @wheel="onWheel"
198
575
  >
199
- <div v-if="isDragging" class="blocker" />
200
576
  <slot />
201
577
  </div>
202
- <div v-if="dots && slideCount > 1" class="dots flex-center gap-05 mt-1">
203
- <span v-for="i in slideCount" :key="i" class="dot cursor" :class="{ current: activeSlideIndex === i - 1 }" @click="goToSlide(i - 1)" />
578
+ <div v-if="props.dots && slideCount > 1" class="dots">
579
+ <span
580
+ v-for="i in slideCount"
581
+ :key="i"
582
+ class="dot"
583
+ :class="{ current: activeSlideIndex === i - 1 }"
584
+ @click="goToSlide(i - 1)"
585
+ />
204
586
  </div>
205
587
  <div class="Handlers">
206
588
  <span @click="prev"><slot name="prev" :index="activeSlideIndex" :prev="prev" /></span>
@@ -210,85 +592,74 @@ watch(() => activeSlideIndex, handleSlideChange)
210
592
  </template>
211
593
 
212
594
  <style scoped>
213
- .dot{
214
- height: 10px;
215
- width: 10px;
216
- border-radius: 50%;
217
- background-color: var(--bgl-black);
218
- opacity: 0.4;
219
- }
220
- .dot.current{
221
- opacity: 0.8;
222
- }
223
- .blocker {
224
- position: fixed;
225
- top: 0;
226
- left: 0;
595
+ .BglCarousel {
596
+ position: relative;
227
597
  width: 100%;
228
- height: 100%;
229
- z-index: 100;
598
+ overflow: hidden;
599
+ touch-action: pan-y pinch-zoom; /* Allow vertical scrolling */
230
600
  }
231
601
 
232
602
  .bgl-slider {
233
- display: grid;
603
+ display: flex;
234
604
  position: relative;
235
- grid-auto-flow: column;
236
- grid-auto-columns: 100%;
237
- overflow-x: hidden;
238
- /* scroll-snap-type: x mandatory; */
239
- /* scroll-behavior: smooth; */
240
-
241
- }
242
-
243
- .autoHeight {
244
- transition: height ease 0.7s;
245
- }
246
-
247
- .bgl-slider.allowScroll {
248
- overflow-x: scroll;
249
- }
250
-
251
- .bgl-slider {
252
- grid-auto-columns: calc(100% / var(--item-count) - calc(var(--item-count) - 1) * 1%);
605
+ width: 100%;
606
+ touch-action: pan-y pinch-zoom; /* Allow vertical scrolling */
607
+ will-change: transform;
608
+ transform: translateX(0);
253
609
  gap: 1%;
610
+ cursor: grab;
611
+ transition: none;
612
+ -webkit-user-select: none;
613
+ user-select: none;
254
614
  }
255
615
 
256
- .bgl-slider.odd {
257
- grid-auto-columns: calc(100% / var(--item-count) - calc(var(--item-count) - 2) * 1%);
616
+ .bgl-slider > * {
617
+ flex: 0 0 calc((100% - (var(--item-count) - 1) * 1%) / var(--item-count));
618
+ width: calc((100% - (var(--item-count) - 1) * 1%) / var(--item-count));
619
+ min-width: calc((100% - (var(--item-count) - 1) * 1%) / var(--item-count));
620
+ position: relative;
621
+ overflow: hidden;
258
622
  }
259
623
 
260
- .bgl-slider.slides-1 {
261
- grid-auto-columns: 100%;
262
- gap: 0;
624
+ .bgl-slider.slides-1 > * {
625
+ flex: 0 0 100%;
626
+ width: 100%;
627
+ min-width: 100%;
263
628
  }
264
629
 
265
- .bgl-slider::-webkit-scrollbar {
266
- display: none;
630
+ .dragging .bgl-slider > * {
631
+ pointer-events: none;
632
+ user-select: none;
267
633
  }
268
634
 
269
- .bgl-slider * {
270
- scroll-snap-align: start;
635
+ .autoHeight {
636
+ transition: height ease 0.7s;
271
637
  }
272
638
 
273
- .dragging.bgl-slider {
274
- cursor: grabbing;
275
- cursor: -webkit-grabbing;
276
- scroll-snap-type: unset;
639
+ .dots {
640
+ display: flex;
641
+ justify-content: center;
642
+ align-items: center;
643
+ width: 100%;
644
+ margin-top: 1rem;
645
+ gap: 8px;
277
646
  }
278
647
 
279
- .clicking.bgl-slider {
280
- scroll-behavior: unset;
648
+ .dot {
649
+ height: 10px;
650
+ width: 10px;
651
+ border-radius: 50%;
652
+ background-color: var(--bgl-black);
653
+ opacity: 0.4;
654
+ transition: opacity 0.3s ease;
655
+ cursor: pointer;
281
656
  }
282
657
 
283
- .dragging.bgl-slider * {
284
- scroll-snap-align: unset;
285
- user-select: none;
658
+ .dot:hover {
659
+ opacity: 0.6;
286
660
  }
287
661
 
288
- @media screen and (max-width: 600px) {
289
- .bgl-slider.slides-1> * {
290
- margin-inline-start: 0%;
291
- }
292
-
662
+ .dot.current {
663
+ opacity: 0.8;
293
664
  }
294
665
  </style>