@bagelink/vue 0.0.1131 → 0.0.1135
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/common-C_IH8b5S.cjs +12580 -0
- package/dist/common-DoeNgx31.js +12579 -0
- package/dist/components/AddressSaerch.vue.d.ts +7 -0
- package/dist/components/AddressSaerch.vue.d.ts.map +1 -0
- package/dist/components/Carousel.vue.d.ts.map +1 -1
- package/dist/components/ComboBox.vue.d.ts +3 -3
- package/dist/components/Comments.vue.d.ts +2 -2
- package/dist/components/ContactSubmissions.vue.d.ts +2 -2
- package/dist/components/FormSchema.vue.d.ts +4 -5
- package/dist/components/LangText.vue.d.ts +2 -2
- package/dist/components/ModalBglForm.vue.d.ts +20 -21
- package/dist/components/PersonPreview.vue.d.ts +4 -5
- package/dist/components/PersonPreviewFormkit.vue.d.ts +3 -4
- package/dist/components/Popover.vue.d.ts +10 -0
- package/dist/components/Popover.vue.d.ts.map +1 -0
- package/dist/components/RTXEditor.vue.d.ts +3 -3
- package/dist/components/TabbedLayout.vue.d.ts +4 -5
- package/dist/components/charts/BarChart.vue.d.ts +2 -2
- package/dist/components/form/ItemRef.vue.d.ts +3 -5
- package/dist/components/form/ItemRef.vue.d.ts.map +1 -1
- package/dist/components/form/MaterialIcon.vue.d.ts +3 -4
- package/dist/components/form/PlainInputField.vue.d.ts +3 -3
- package/dist/components/form/inputs/CurrencyInput.vue.d.ts +3 -3
- package/dist/components/form/inputs/DatePick.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/DatetimeInput.vue.d.ts +3 -3
- package/dist/components/form/inputs/DurationInput.vue.d.ts +3 -3
- package/dist/components/form/inputs/DynamicLinkField.vue.d.ts +3 -3
- package/dist/components/form/inputs/EmailInput.vue.d.ts +3 -3
- package/dist/components/form/inputs/FloatInput.vue.d.ts +3 -3
- package/dist/components/form/inputs/IntInput.vue.d.ts +3 -3
- package/dist/components/form/inputs/LinkField.vue.d.ts +3 -3
- package/dist/components/form/inputs/NumberInput.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/Password.vue.d.ts +3 -3
- package/dist/components/form/inputs/PlainText.vue.d.ts +3 -3
- package/dist/components/form/inputs/ReadOnlyInput.vue.d.ts +2 -2
- package/dist/components/form/inputs/RichText/Toolbar.vue.d.ts +14 -0
- package/dist/components/form/inputs/RichText/Toolbar.vue.d.ts.map +1 -0
- package/dist/components/form/inputs/RichText/formatting.d.ts +11 -0
- package/dist/components/form/inputs/RichText/formatting.d.ts.map +1 -0
- package/dist/components/form/inputs/RichText/richtext-types.d.ts +3 -0
- package/dist/components/form/inputs/RichText/richtext-types.d.ts.map +1 -0
- package/dist/components/form/inputs/RichText2/Toolbar.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/RichText2/index.vue.d.ts +0 -1
- package/dist/components/form/inputs/RichText2/index.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/RichTextEditor.vue.d.ts +3 -3
- package/dist/components/form/inputs/SelectField.vue.d.ts +8 -6
- package/dist/components/form/inputs/SelectField.vue.d.ts.map +1 -1
- package/dist/components/form/inputs/TextArea.vue.d.ts +3 -3
- package/dist/components/form/inputs/Upload/UploadFile.vue.d.ts +86 -0
- package/dist/components/form/inputs/Upload/UploadFile.vue.d.ts.map +1 -0
- package/dist/components/formkit/AddressArray.vue.d.ts +2 -2
- package/dist/components/formkit/BankDetailsArray.vue.d.ts +2 -2
- package/dist/components/formkit/ContactArrayFormKit.vue.d.ts +2 -2
- package/dist/components/formkit/FileUploader.vue.d.ts +2 -2
- package/dist/components/formkit/MiscFields.vue.d.ts +2 -2
- package/dist/components/formkit/Toggle.vue.d.ts +2 -2
- package/dist/components/sortable/Animation.d.ts +43 -0
- package/dist/components/sortable/Animation.d.ts.map +1 -0
- package/dist/components/sortable/BrowserInfo.d.ts +7 -0
- package/dist/components/sortable/BrowserInfo.d.ts.map +1 -0
- package/dist/components/sortable/EventDispatcher.d.ts +13 -0
- package/dist/components/sortable/EventDispatcher.d.ts.map +1 -0
- package/dist/components/sortable/PluginManager.d.ts +27 -0
- package/dist/components/sortable/PluginManager.d.ts.map +1 -0
- package/dist/components/sortable/Sortable.d.ts +81 -0
- package/dist/components/sortable/Sortable.d.ts.map +1 -0
- package/dist/components/sortable/index.d.ts +5 -0
- package/dist/components/sortable/index.d.ts.map +1 -0
- package/dist/components/sortable/utils.d.ts +49 -0
- package/dist/components/sortable/utils.d.ts.map +1 -0
- package/dist/components/whatsapp/form/MsgTemplate.vue.d.ts +3 -4
- package/dist/components/whatsapp/form/TextVariableExamples.vue.d.ts +2 -2
- package/dist/composables/drag-n-drop/useDraggable.d.ts +2 -0
- package/dist/composables/drag-n-drop/useDraggable.d.ts.map +1 -0
- package/dist/editor-CUDRLdmS.js +4 -0
- package/dist/editor-Cu374vEW.cjs +4 -0
- package/dist/editor-a8DSbb6P.js +4 -0
- package/dist/editor-xBt_vIha.cjs +4 -0
- package/dist/heic2any-8wMqMfB_.js +933 -0
- package/dist/heic2any-BrqcNzfV.js +935 -0
- package/dist/heic2any-C8KwH72N.cjs +934 -0
- package/dist/heic2any-k9wDCKka.cjs +932 -0
- package/dist/index-DiG-xM9T.cjs +35016 -0
- package/dist/index-nGuSAiY2.js +35017 -0
- package/dist/index.cjs +372 -124
- package/dist/index.mjs +373 -125
- package/dist/plugins/drag-n-drop/draggable.d.ts +4 -0
- package/dist/plugins/drag-n-drop/draggable.d.ts.map +1 -0
- package/dist/plugins/drag-n-drop/droppable.d.ts +4 -0
- package/dist/plugins/drag-n-drop/droppable.d.ts.map +1 -0
- package/dist/plugins/drag-n-drop/index.d.ts +5 -0
- package/dist/plugins/drag-n-drop/index.d.ts.map +1 -0
- package/dist/plugins/drag-n-drop/useDraggable.d.ts +8 -0
- package/dist/plugins/drag-n-drop/useDraggable.d.ts.map +1 -0
- package/dist/plugins/drag-n-drop/useDroppable.d.ts +7 -0
- package/dist/plugins/drag-n-drop/useDroppable.d.ts.map +1 -0
- package/dist/style.css +233 -351
- package/dist/types/materialIcon.d.ts +2 -0
- package/dist/types/materialIcon.d.ts.map +1 -0
- package/dist/utils/objects.d.ts +0 -1
- package/package.json +1 -1
- package/src/components/Carousel.vue +518 -147
- package/src/components/form/inputs/DatePick.vue +50 -172
- package/src/components/form/inputs/NumberInput.vue +6 -3
- package/src/styles/inputs.css +142 -137
- package/src/styles/modal.css +1 -3
- package/dist/components/Accordion.d.ts +0 -12
- package/dist/components/Accordion.d.ts.map +0 -1
- package/dist/components/AccordionItem.d.ts +0 -34
- package/dist/components/AccordionItem.d.ts.map +0 -1
- package/dist/components/Alert.d.ts +0 -34
- package/dist/components/Alert.d.ts.map +0 -1
- package/dist/components/Avatar.d.ts +0 -36
- package/dist/components/Avatar.d.ts.map +0 -1
- package/dist/components/Badge.d.ts +0 -22
- package/dist/components/Badge.d.ts.map +0 -1
- package/dist/components/BglVideo.d.ts +0 -20
- package/dist/components/BglVideo.d.ts.map +0 -1
- package/dist/components/Btn.d.ts +0 -99
- package/dist/components/Btn.d.ts.map +0 -1
- package/dist/components/Card.d.ts +0 -39
- package/dist/components/Card.d.ts.map +0 -1
- package/dist/components/Carousel.d.ts +0 -74
- package/dist/components/Carousel.d.ts.map +0 -1
- package/dist/components/DataPreview.d.ts +0 -42
- package/dist/components/DataPreview.d.ts.map +0 -1
- package/dist/components/Drop.vue.d.ts +0 -34
- package/dist/components/Drop.vue.d.ts.map +0 -1
- package/dist/components/FileUploader.vue.d.ts +0 -60
- package/dist/components/FileUploader.vue.d.ts.map +0 -1
- package/dist/components/Flag.d.ts +0 -20
- package/dist/components/Flag.d.ts.map +0 -1
- package/dist/components/ListItem.d.ts +0 -34
- package/dist/components/ListItem.d.ts.map +0 -1
- package/dist/components/ListView.d.ts +0 -13
- package/dist/components/ListView.d.ts.map +0 -1
- package/dist/components/MapEmbed.d.ts +0 -3
- package/dist/components/MapEmbed.d.ts.map +0 -1
- package/dist/components/MaterialIcon.d.ts +0 -26
- package/dist/components/MaterialIcon.d.ts.map +0 -1
- package/dist/components/Modal.d.ts +0 -46
- package/dist/components/Modal.d.ts.map +0 -1
- package/dist/components/ModalConfirm.d.ts +0 -24
- package/dist/components/ModalConfirm.d.ts.map +0 -1
- package/dist/components/ModalForm.d.ts +0 -78
- package/dist/components/ModalForm.d.ts.map +0 -1
- package/dist/components/NavBar.d.ts +0 -64
- package/dist/components/NavBar.d.ts.map +0 -1
- package/dist/components/PageTitle.d.ts +0 -24
- package/dist/components/PageTitle.d.ts.map +0 -1
- package/dist/components/RouterWrapper.d.ts +0 -3
- package/dist/components/RouterWrapper.d.ts.map +0 -1
- package/dist/components/TableSchema.d.ts +0 -35
- package/dist/components/TableSchema.d.ts.map +0 -1
- package/dist/components/Title.d.ts +0 -42
- package/dist/components/Title.d.ts.map +0 -1
- package/dist/components/TopBar.d.ts +0 -12
- package/dist/components/TopBar.d.ts.map +0 -1
- package/dist/components/dashboard/Lineart.d.ts +0 -20
- package/dist/components/dashboard/Lineart.d.ts.map +0 -1
- package/dist/components/form/BglField.d.ts +0 -25
- package/dist/components/form/BglField.d.ts.map +0 -1
- package/dist/components/form/BglForm.d.ts +0 -75
- package/dist/components/form/BglForm.d.ts.map +0 -1
- package/dist/components/form/inputs/CheckInput.d.ts +0 -56
- package/dist/components/form/inputs/CheckInput.d.ts.map +0 -1
- package/dist/components/form/inputs/Checkbox.d.ts +0 -16
- package/dist/components/form/inputs/Checkbox.d.ts.map +0 -1
- package/dist/components/form/inputs/ColorPicker.d.ts +0 -48
- package/dist/components/form/inputs/ColorPicker.d.ts.map +0 -1
- package/dist/components/form/inputs/DateInput.d.ts +0 -64
- package/dist/components/form/inputs/DateInput.d.ts.map +0 -1
- package/dist/components/form/inputs/DatePicker.d.ts +0 -33
- package/dist/components/form/inputs/DatePicker.d.ts.map +0 -1
- package/dist/components/form/inputs/FileUpload.d.ts +0 -108
- package/dist/components/form/inputs/FileUpload.d.ts.map +0 -1
- package/dist/components/form/inputs/JSONInput.d.ts +0 -53
- package/dist/components/form/inputs/JSONInput.d.ts.map +0 -1
- package/dist/components/form/inputs/RadioGroup.d.ts +0 -42
- package/dist/components/form/inputs/RadioGroup.d.ts.map +0 -1
- package/dist/components/form/inputs/RadioPillsInput.d.ts +0 -48
- package/dist/components/form/inputs/RadioPillsInput.d.ts.map +0 -1
- package/dist/components/form/inputs/RichText.d.ts +0 -20
- package/dist/components/form/inputs/RichText.d.ts.map +0 -1
- package/dist/components/form/inputs/RichText2/Toolbar.d.ts +0 -22
- package/dist/components/form/inputs/RichText2/Toolbar.d.ts.map +0 -1
- package/dist/components/form/inputs/RichText2/index.d.ts +0 -24
- package/dist/components/form/inputs/RichText2/index.d.ts.map +0 -1
- package/dist/components/form/inputs/SelectInput.d.ts +0 -55
- package/dist/components/form/inputs/SelectInput.d.ts.map +0 -1
- package/dist/components/form/inputs/SignaturePad.d.ts +0 -72
- package/dist/components/form/inputs/SignaturePad.d.ts.map +0 -1
- package/dist/components/form/inputs/TableField.d.ts +0 -45
- package/dist/components/form/inputs/TableField.d.ts.map +0 -1
- package/dist/components/form/inputs/TelInput.d.ts +0 -241
- package/dist/components/form/inputs/TelInput.d.ts.map +0 -1
- package/dist/components/form/inputs/TextInput.d.ts +0 -90
- package/dist/components/form/inputs/TextInput.d.ts.map +0 -1
- package/dist/components/form/inputs/ToggleInput.d.ts +0 -58
- package/dist/components/form/inputs/ToggleInput.d.ts.map +0 -1
- package/dist/components/layout/BottomMenu.d.ts +0 -27
- package/dist/components/layout/BottomMenu.d.ts.map +0 -1
- package/dist/components/layout/Layout.d.ts +0 -58
- package/dist/components/layout/Layout.d.ts.map +0 -1
- package/dist/components/layout/SidebarMenu.d.ts +0 -38
- package/dist/components/layout/SidebarMenu.d.ts.map +0 -1
- package/dist/components/layout/TabbedLayout.d.ts +0 -42
- package/dist/components/layout/TabbedLayout.d.ts.map +0 -1
- package/dist/components/layout/Tabs.d.ts +0 -31
- package/dist/components/layout/Tabs.d.ts.map +0 -1
- package/dist/components/layout/TabsBody.d.ts +0 -23
- package/dist/components/layout/TabsBody.d.ts.map +0 -1
- package/dist/components/layout/TabsNav.d.ts +0 -35
- package/dist/components/layout/TabsNav.d.ts.map +0 -1
- package/dist/styles.css +0 -14073
- package/dist/vue.css +0 -14073
|
@@ -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
|
+
|
|
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
|
|
17
40
|
const bglSlider = $ref<HTMLElement>()
|
|
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
|
|
25
|
-
let
|
|
26
|
-
let
|
|
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
|
-
//
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
64
|
+
// Add interface for velocity tracking
|
|
65
|
+
interface VelocitySample {
|
|
66
|
+
time: number
|
|
67
|
+
position: number
|
|
35
68
|
}
|
|
36
69
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
|
99
|
+
function setTransform(value: number) {
|
|
51
100
|
if (!bglSlider) return
|
|
52
|
-
|
|
53
|
-
|
|
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
|
|
64
|
-
|
|
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
|
|
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 (!
|
|
113
|
+
if (!isSliderAvailable) return
|
|
76
114
|
const timeElapsed = currentTime - startTime
|
|
77
115
|
const progress = Math.min(timeElapsed / duration, 1)
|
|
78
|
-
|
|
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
|
-
|
|
124
|
+
// Navigation
|
|
125
|
+
function goToSlide(index: number, isTouchNav = false) {
|
|
90
126
|
countSlides()
|
|
91
|
-
if (!
|
|
92
|
-
|
|
93
|
-
const
|
|
94
|
-
|
|
127
|
+
if (!isSliderAvailable || 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) 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) return
|
|
184
|
+
slideCount = bglSlider.children.length
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Event handlers
|
|
99
188
|
function handleSlideChange() {
|
|
100
|
-
if (props.index !== activeSlideIndex)
|
|
189
|
+
if (props.index !== activeSlideIndex) {
|
|
190
|
+
emit('update:index', activeSlideIndex)
|
|
191
|
+
}
|
|
101
192
|
}
|
|
102
193
|
|
|
103
194
|
function handleResize() {
|
|
104
|
-
if (!
|
|
105
|
-
itemCount = window.innerWidth < 600
|
|
106
|
-
|
|
195
|
+
if (!isSliderAvailable) 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
|
|
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
|
-
|
|
117
|
-
|
|
118
|
-
if (
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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) 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 || !
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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 (!
|
|
136
|
-
|
|
253
|
+
if (!isSliderAvailable || !isPressed) return
|
|
254
|
+
|
|
255
|
+
const x = e.pageX
|
|
137
256
|
const distance = x - startX
|
|
138
|
-
|
|
139
|
-
if (
|
|
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) 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
|
-
//
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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
|
|
157
|
-
if (!
|
|
158
|
-
|
|
159
|
-
|
|
333
|
+
function onTouchMove(e: TouchEvent) {
|
|
334
|
+
if (!isSliderAvailable || !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
|
-
|
|
402
|
+
function onTouchEnd() {
|
|
403
|
+
if (!isSliderAvailable || !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 || 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) {
|
|
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,
|
|
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
|
|
203
|
-
<span
|
|
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
|
-
.
|
|
214
|
-
|
|
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
|
-
|
|
229
|
-
|
|
598
|
+
overflow: hidden;
|
|
599
|
+
touch-action: pan-y pinch-zoom; /* Allow vertical scrolling */
|
|
230
600
|
}
|
|
231
601
|
|
|
232
602
|
.bgl-slider {
|
|
233
|
-
display:
|
|
603
|
+
display: flex;
|
|
234
604
|
position: relative;
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
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
|
|
257
|
-
|
|
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
|
-
|
|
262
|
-
|
|
624
|
+
.bgl-slider.slides-1 > * {
|
|
625
|
+
flex: 0 0 100%;
|
|
626
|
+
width: 100%;
|
|
627
|
+
min-width: 100%;
|
|
263
628
|
}
|
|
264
629
|
|
|
265
|
-
.bgl-slider
|
|
266
|
-
|
|
630
|
+
.dragging .bgl-slider > * {
|
|
631
|
+
pointer-events: none;
|
|
632
|
+
user-select: none;
|
|
267
633
|
}
|
|
268
634
|
|
|
269
|
-
.
|
|
270
|
-
|
|
635
|
+
.autoHeight {
|
|
636
|
+
transition: height ease 0.7s;
|
|
271
637
|
}
|
|
272
638
|
|
|
273
|
-
.
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
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
|
-
.
|
|
280
|
-
|
|
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
|
-
.
|
|
284
|
-
|
|
285
|
-
user-select: none;
|
|
658
|
+
.dot:hover {
|
|
659
|
+
opacity: 0.6;
|
|
286
660
|
}
|
|
287
661
|
|
|
288
|
-
|
|
289
|
-
.
|
|
290
|
-
margin-inline-start: 0%;
|
|
291
|
-
}
|
|
292
|
-
|
|
662
|
+
.dot.current {
|
|
663
|
+
opacity: 0.8;
|
|
293
664
|
}
|
|
294
665
|
</style>
|