renusify 2.5.2 → 3.0.0

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 (212) hide show
  1. package/components/app/index.vue +74 -22
  2. package/components/app/toast/index.vue +76 -71
  3. package/components/app/toast/toast.vue +62 -44
  4. package/components/avatar/index.vue +208 -84
  5. package/components/button/buttonConfirm.vue +53 -26
  6. package/components/button/buttonGroup.js +0 -2
  7. package/components/button/buttonGroup.vue +310 -62
  8. package/components/button/index.vue +584 -100
  9. package/components/calendar/index.js +0 -2
  10. package/components/calendar/index.vue +326 -262
  11. package/components/calendar/month.vue +64 -55
  12. package/components/calendar/year.vue +30 -25
  13. package/components/card/index.vue +139 -59
  14. package/components/codeEditor/highlightCss.vue +38 -39
  15. package/components/codeEditor/highlightHtml.vue +64 -64
  16. package/components/codeEditor/highlightJs.vue +37 -38
  17. package/components/codeEditor/index.vue +129 -79
  18. package/components/codeEditor/run.vue +225 -39
  19. package/components/codeEditor/useCodeFormatter.js +150 -0
  20. package/components/confirm/index.vue +139 -80
  21. package/components/container/col.vue +5 -4
  22. package/components/container/divider.vue +28 -19
  23. package/components/container/index.vue +34 -15
  24. package/components/container/row.vue +26 -9
  25. package/components/container/spacer.vue +2 -4
  26. package/components/container/style.scss +3 -0
  27. package/components/content/index.vue +49 -32
  28. package/components/cropper/index.vue +401 -244
  29. package/components/float/index.vue +542 -415
  30. package/components/form/addressInput/index.vue +184 -109
  31. package/components/form/camInput/index.vue +370 -244
  32. package/components/form/checkInput/index.vue +138 -71
  33. package/components/form/checkboxInput/index.vue +87 -47
  34. package/components/form/colorInput/Alpha.vue +81 -83
  35. package/components/form/colorInput/Hue.vue +91 -68
  36. package/components/form/colorInput/Preview.vue +43 -47
  37. package/components/form/colorInput/Saturation.vue +101 -86
  38. package/components/form/colorInput/index.vue +71 -39
  39. package/components/form/colorInput/picker.vue +111 -106
  40. package/components/form/colorInput/useColor.js +153 -0
  41. package/components/form/dateInput/index.vue +691 -356
  42. package/components/form/dateInput/month.vue +63 -54
  43. package/components/form/dateInput/year.vue +35 -25
  44. package/components/form/fileInput/index.js +0 -1
  45. package/components/form/fileInput/index.vue +263 -106
  46. package/components/form/fileInput/single.vue +323 -164
  47. package/components/form/groupInput/index.vue +199 -101
  48. package/components/form/index.vue +189 -83
  49. package/components/form/input/index.vue +416 -377
  50. package/components/form/jsonInput/JsonView.vue +54 -56
  51. package/components/form/jsonInput/index.vue +247 -165
  52. package/components/form/maskInput/index.vue +252 -132
  53. package/components/form/numberInput/index.js +0 -1
  54. package/components/form/numberInput/index.vue +226 -117
  55. package/components/form/passwordInput/index.js +2 -1
  56. package/components/form/passwordInput/index.vue +269 -102
  57. package/components/form/radioInput/index.vue +143 -72
  58. package/components/form/rangeInput/index.vue +280 -167
  59. package/components/form/ratingInput/index.vue +57 -57
  60. package/components/form/selectInput/index.js +1 -3
  61. package/components/form/selectInput/index.vue +584 -296
  62. package/components/form/switchInput/index.vue +73 -59
  63. package/components/form/telInput/index.js +0 -1
  64. package/components/form/telInput/index.vue +238 -135
  65. package/components/form/textArea/index.vue +72 -35
  66. package/components/form/textEditor/index.vue +739 -0
  67. package/components/form/{text-editor → textEditor}/style.scss +8 -16
  68. package/components/form/textInput/index.vue +54 -32
  69. package/components/form/timeInput/index.vue +82 -55
  70. package/components/form/timeInput/range.vue +115 -94
  71. package/components/form/timeInput/timepicker.vue +382 -449
  72. package/components/form/uniqueInput/index.vue +105 -48
  73. package/components/form/unitInput/index.vue +139 -84
  74. package/components/formCreator/index.js +0 -1
  75. package/components/formCreator/index.vue +314 -148
  76. package/components/highlight/index.vue +41 -25
  77. package/components/highlight/style.scss +2 -2
  78. package/components/highlight/{mixin.js → useHighlight.js} +181 -160
  79. package/components/icon/index.vue +79 -33
  80. package/components/img/index.vue +249 -147
  81. package/components/img/preview.vue +180 -198
  82. package/components/img/svgImg.vue +42 -39
  83. package/components/index.js +5 -20
  84. package/components/infinite/index.js +1 -2
  85. package/components/infinite/index.vue +248 -66
  86. package/components/map/index.vue +428 -261
  87. package/components/map/route.vue +794 -487
  88. package/components/map/select.vue +118 -58
  89. package/components/menu/index.vue +201 -91
  90. package/components/meta/meta.js +26 -3
  91. package/components/modal/index.vue +382 -156
  92. package/components/notify/index.vue +204 -86
  93. package/components/notify/notification.vue +38 -55
  94. package/components/progress/circle.vue +189 -70
  95. package/components/progress/line.vue +266 -46
  96. package/components/searchBox/index.js +1 -3
  97. package/components/searchBox/index.vue +194 -101
  98. package/components/skeleton/index.vue +45 -20
  99. package/components/slider/index.vue +318 -156
  100. package/components/swiper/index.vue +254 -106
  101. package/components/table/crud/footer.vue +77 -53
  102. package/components/table/crud/header.vue +71 -72
  103. package/components/table/crud/index.vue +629 -399
  104. package/components/table/index.vue +721 -278
  105. package/components/timeAgo/index.vue +145 -96
  106. package/components/tour/index.vue +338 -235
  107. package/components/tree/index.vue +235 -89
  108. package/components/tree/tree-element.vue +106 -106
  109. package/directive/animate/index.js +77 -0
  110. package/directive/clickOutSide/index.js +98 -0
  111. package/directive/drag/index.js +153 -0
  112. package/directive/index.js +11 -13
  113. package/directive/intersect/index.js +263 -0
  114. package/directive/mask/index.js +67 -0
  115. package/directive/parallax/index.js +78 -0
  116. package/directive/ripple/index.js +14 -0
  117. package/directive/scroll/index.js +244 -0
  118. package/directive/sortable/index.js +274 -0
  119. package/directive/title/index.js +75 -0
  120. package/directive/touch/index.js +268 -0
  121. package/index.js +10 -8
  122. package/package.json +5 -2
  123. package/plugins/validation/Validate.js +88 -79
  124. package/scripts/generate-docs.mjs +226 -0
  125. package/scripts/menu.mjs +240 -0
  126. package/scripts/parser.mjs +1086 -0
  127. package/style/_index.scss +7 -0
  128. package/style/app.scss +13 -65
  129. package/style/colors.scss +5 -22
  130. package/style/functions/index.scss +8 -0
  131. package/style/mixins/index.scss +17 -5
  132. package/style/variables/base.scss +154 -175
  133. package/style/variables/color.scss +0 -12
  134. package/style/variables/utilities.scss +0 -180
  135. package/tools/helper.js +0 -8
  136. package/tools/icons.js +6 -1
  137. package/tools/root.js +71 -0
  138. package/components/app/style.scss +0 -41
  139. package/components/app/toast/style.scss +0 -20
  140. package/components/avatar/style.scss +0 -32
  141. package/components/bar/bottomNav.js +0 -1
  142. package/components/bar/bottomNav.vue +0 -28
  143. package/components/bar/bottomNavigationCircle.js +0 -2
  144. package/components/bar/bottomNavigationCircle.vue +0 -99
  145. package/components/bar/scss/bottomNav.scss +0 -67
  146. package/components/bar/scss/toolbar.scss +0 -174
  147. package/components/bar/toolbar/index.js +0 -8
  148. package/components/bar/toolbar/index.vue +0 -35
  149. package/components/bar/toolbar/laptop.vue +0 -33
  150. package/components/bar/toolbar/menuChilds.vue +0 -41
  151. package/components/bar/toolbar/menuLaptop.vue +0 -41
  152. package/components/bar/toolbar/menuMob.vue +0 -39
  153. package/components/bar/toolbar/mixin.js +0 -43
  154. package/components/bar/toolbar/mobile.vue +0 -34
  155. package/components/breadcrumb/bredcrumbItem.vue +0 -39
  156. package/components/breadcrumb/index.js +0 -3
  157. package/components/breadcrumb/index.vue +0 -71
  158. package/components/breadcrumb/style.scss +0 -51
  159. package/components/button/style.scss +0 -411
  160. package/components/card/style.scss +0 -86
  161. package/components/chart/chart.js +0 -1
  162. package/components/chart/chart.vue +0 -69
  163. package/components/chart/worldMap.js +0 -2
  164. package/components/chart/worldMap.vue +0 -1112
  165. package/components/chat/MessageList.vue +0 -163
  166. package/components/chat/chatInput.vue +0 -150
  167. package/components/chat/chatMsg.vue +0 -276
  168. package/components/chat/index.js +0 -11
  169. package/components/chat/index.vue +0 -113
  170. package/components/chip/index.js +0 -3
  171. package/components/chip/index.vue +0 -77
  172. package/components/chip/style.scss +0 -199
  173. package/components/codeEditor/mixin.js +0 -145
  174. package/components/countdown/index.js +0 -1
  175. package/components/countdown/index.vue +0 -105
  176. package/components/form/colorInput/mixin.js +0 -132
  177. package/components/form/fileInput/file.js +0 -148
  178. package/components/form/telInput/assets/flags.png +0 -0
  179. package/components/form/telInput/assets/flags@2x.png +0 -0
  180. package/components/form/text-editor/index.vue +0 -705
  181. package/components/icon/style.scss +0 -17
  182. package/components/infinite/div.js +0 -6
  183. package/components/infinite/div.vue +0 -193
  184. package/components/infinite/page.js +0 -3
  185. package/components/infinite/page.vue +0 -105
  186. package/components/list/index.js +0 -3
  187. package/components/list/index.vue +0 -122
  188. package/components/list/style.scss +0 -66
  189. package/components/message/index.js +0 -4
  190. package/components/message/index.vue +0 -40
  191. package/components/modal/style.scss +0 -146
  192. package/components/nestable/NestableItem.vue +0 -307
  193. package/components/nestable/editable.js +0 -44
  194. package/components/nestable/index.js +0 -1
  195. package/components/nestable/index.vue +0 -226
  196. package/components/nestable/methods.js +0 -416
  197. package/components/progress/style.scss +0 -229
  198. package/components/table/style.scss +0 -338
  199. package/components/tabs/index.js +0 -3
  200. package/components/tabs/index.vue +0 -151
  201. package/components/timeline/index.js +0 -6
  202. package/components/timeline/index.vue +0 -76
  203. package/directive/resize/index.js +0 -30
  204. package/directive/skeleton/index.js +0 -27
  205. package/directive/skeleton/style.scss +0 -37
  206. package/plugins/request/Request.js +0 -68
  207. package/style/animation.scss +0 -94
  208. package/style/style.scss +0 -8
  209. package/tools/rootable.js +0 -75
  210. /package/components/form/{text-editor → textEditor}/index.js +0 -0
  211. /package/components/form/{text-editor → textEditor}/preview.js +0 -0
  212. /package/components/form/{text-editor → textEditor}/preview.vue +0 -0
@@ -1,37 +1,62 @@
1
1
  <template>
2
2
  <div :class="[$r.prefix+'skeleton']">
3
+ <!-- Main content slot - shown when loading is true or showPreData is true
4
+ @example
5
+ <div class="tilte-1">title</div>
6
+ -->
3
7
  <slot v-if="loading||showPreData"></slot>
8
+
9
+ <!-- Skeleton slot - shown when loading is false -->
4
10
  <slot v-if="!loading" name="case">
5
11
  <div :class="['sk-'+type]" :style="{width:width,height:height}"></div>
6
12
  </slot>
7
13
  </div>
8
14
  </template>
9
15
 
10
- <script>
11
- export default {
12
- name: "r-skeleton",
13
- props: {
14
- showPreData: Boolean,
15
- loading: Boolean,
16
- width: String,
17
- height: String,
18
- type: {
19
- type: String,
20
- default: 'card',
21
- validator: function (value) {
22
- return ['line', 'avatar', 'card'].indexOf(value) !== -1
23
- }
24
- },
25
- }
26
- };
16
+ <script setup>
17
+ defineProps({
18
+ /**
19
+ * Shows pre-loaded data content instead of skeleton
20
+ * @type {Boolean}
21
+ */
22
+ showPreData: Boolean,
23
+ /**
24
+ * Controls loading state - shows skeleton when false, shows content when true
25
+ * @type {Boolean}
26
+ */
27
+ loading: Boolean,
28
+ /**
29
+ * Width of the skeleton element
30
+ * @type {String}
31
+ */
32
+ width: String,
33
+ /**
34
+ * Height of the skeleton element
35
+ * @type {String}
36
+ */
37
+ height: String,
38
+ /**
39
+ * Type of skeleton to display
40
+ * @type {String}
41
+ * @default 'card'
42
+ * @values 'line', 'avatar', 'card'
43
+ */
44
+ type: {
45
+ type: String,
46
+ default: 'card',
47
+ validator: function (value) {
48
+ return ['line', 'avatar', 'card'].indexOf(value) !== -1
49
+ }
50
+ },
51
+ })
27
52
  </script>
28
53
 
29
54
  <style lang="scss">
30
55
  @use "sass:map";
31
- @use "../../style/variables/base";
56
+ @use "../../style" as *;
32
57
 
33
58
 
34
- .#{base.$prefix}skeleton {
59
+ .#{$prefix}skeleton {
35
60
  .sk-card, .sk-line, .sk-avatar {
36
61
  background: rgba(0, 0, 0, 0.12);
37
62
  overflow: hidden;
@@ -57,7 +82,7 @@ export default {
57
82
  }
58
83
 
59
84
  .sk-card {
60
- border-radius: map.get(base.$borders, 'sm');
85
+ border-radius: map.get($borders, 'sm');
61
86
  }
62
87
 
63
88
  .sk-line {
@@ -4,7 +4,7 @@
4
4
  width:width+'px',
5
5
  height:(width/wPH)+'px'
6
6
  }"
7
- ref="slider"
7
+ ref="sliderRef"
8
8
  v-touch="{
9
9
  'left':$r.rtl?prev:next,
10
10
  'right':$r.rtl?next:prev
@@ -22,6 +22,8 @@
22
22
  class="slider-slides">
23
23
  <r-progress-line v-if="autoplay&&progress" :model-value="remain" class="slider-progress"
24
24
  color="color-one"></r-progress-line>
25
+ <!-- @slot Default slot for slide content.
26
+ Provide item(Current slide data), width(Width of the slide container), height(Height of the slide container) -->
25
27
  <slot v-if="width>0" :item="currentSlide" :width="width" :height="width/wPH">
26
28
  {{ currentSlide }}
27
29
  </slot>
@@ -33,8 +35,11 @@
33
35
  :key="n"
34
36
  class="slider-dot"
35
37
  v-for="(i,n) in slides">
38
+ <!-- Slot for custom dots rendering
39
+ Provide {Function} go - Function to go to a specific slide
40
+ Provide {Number} index - Slide index -->
36
41
  <slot name="dots" :go="goToSlide" :index="n">
37
- <button @click.prevent="goToSlide(n)" type="button">{{ n }}</button>
42
+ <span @click.prevent="goToSlide(n)">{{ n }}</span>
38
43
  </slot>
39
44
  </li>
40
45
  </ul>
@@ -42,154 +47,311 @@
42
47
  </div>
43
48
  </template>
44
49
 
45
- <script>
46
-
47
- export default {
48
- name: 'r-slider',
49
- props: {
50
- slides: {
51
- type: Array,
52
- default: () => {
53
- return []
54
- }
55
- },
56
- speed: {
57
- type: Number,
58
- default: 5000
59
- },
60
- wPH: {
61
- type: Number,
62
- default: 2
63
- },
64
- startIndex: {
65
- type: Number,
66
- default: 0
67
- },
68
- autoplay: {
69
- type: Boolean,
70
- default: false
71
- },
72
- progress: {
73
- type: Boolean,
74
- default: false
75
- },
76
- arrow: {
77
- type: Boolean,
78
- default: false
79
- },
80
- dots: {
81
- type: Boolean,
82
- default: true
83
- },
84
- appear: {
85
- type: Boolean,
86
- default: true
87
- },
88
- slidesClass: [String, Object, Array],
89
- mode: {type: String, default: 'out-in'},
90
- transitionRight: {type: String, default: 'slider-right'},
91
- transitionLeft: {type: String, default: 'slider-left'}
50
+ <script setup>
51
+ import {ref, computed, onMounted, onUnmounted} from 'vue'
52
+
53
+ /**
54
+ * @example // Slider usage
55
+ * <template>
56
+ * <r-slider
57
+ * :slides="slides"
58
+ * :startIndex="startIndex"
59
+ * :appear="appear"
60
+ * :speed="speed"
61
+ * :w-p-h="wPH"
62
+ * :slidesClass="slidesClass"
63
+ * :mode="mode"
64
+ * :transitionRight="transitionRight"
65
+ * :transitionLeft="transitionLeft"
66
+ * :autoplay="autoplay"
67
+ * :progress="progress"
68
+ * :arrow="arrow"
69
+ * :dots="dots"
70
+ * @index="log('index', $event)"
71
+ * >
72
+ * <template v-slot="{ item }">
73
+ * <div
74
+ * class="d-flex w-full h-full v-center h-center display-4 color-white-text"
75
+ * :style="{ backgroundColor: item.color }"
76
+ * >
77
+ * {{ item.name }}
78
+ * </div>
79
+ * </template>
80
+ * </r-slider>
81
+ * </template>
82
+ *
83
+ * <script>
84
+ * import { ref } from 'vue'
85
+ *
86
+ * const slides = ref([
87
+ * { name: "one", color: "red" },
88
+ * { name: "two", color: "blue" },
89
+ * { name: "three", color: "green" }
90
+ * ])
91
+ *
92
+ * const speed = ref(5000)
93
+ * const wPH = ref(2)
94
+ * const autoplay = ref(false)
95
+ * const progress = ref(false)
96
+ * const arrow = ref(false)
97
+ * const dots = ref(true)
98
+ * const startIndex = ref(0)
99
+ * const appear = ref(true)
100
+ * const slidesClass = ref("position-absolute h-full")
101
+ * const mode = ref("")
102
+ * const transitionRight = ref("slide-start-to-end")
103
+ * const transitionLeft = ref("slide-end-to-start")
104
+ *
105
+ * // Methods
106
+ * const log = (name, e) => {
107
+ * console.log(name, e)
108
+ * }
109
+ * <//script>
110
+ *
111
+ * */
112
+ const props = defineProps({
113
+ /**
114
+ * Array of slide data items
115
+ * @type {Array}
116
+ * @default () => []
117
+ */
118
+ slides: {
119
+ type: Array,
120
+ default: () => []
92
121
  },
93
- emits:['index'],
94
- data() {
95
- return {
96
- direction: this.transitionRight,
97
- loaded: false,
98
- currentIndex: this.startIndex,
99
- loaded_timer: null,
100
- timer: null,
101
- width: null,
102
- remain_id: null,
103
- remain: 0,
104
- }
122
+ /**
123
+ * Autoplay interval in milliseconds
124
+ * @type {Number}
125
+ * @default 5000
126
+ */
127
+ speed: {
128
+ type: Number,
129
+ default: 5000
105
130
  },
106
-
107
- mounted: function () {
108
- this.init()
131
+ /**
132
+ * Width to height ratio (width/height)
133
+ * @type {Number}
134
+ * @default 2
135
+ */
136
+ wPH: {
137
+ type: Number,
138
+ default: 2
109
139
  },
110
- methods: {
111
- do_remain() {
112
- this.remain = 0
113
- clearInterval(this.remain_id)
114
- this.remain_id = setInterval(() => {
115
- this.remain += 10000 / this.speed
116
- if (this.remain >= 100) {
117
- this.remain = 100
118
- clearInterval(this.remain_id)
119
- }
120
- }, 100)
121
- },
122
- init() {
123
- const w = this.$refs.slider.clientWidth
124
- this.width = w || 1200
125
- this.startSlide()
126
- this.loaded = true
127
- },
128
- toggle() {
129
- clearInterval(this.timer)
130
- this.loaded = false
131
- clearTimeout(this.loaded_timer)
132
- this.loaded_timer = setTimeout(() => {
133
- this.loaded = true
134
- }, 500)
135
- this.startSlide()
136
- },
137
- startSlide: function () {
138
- if (this.autoplay) {
139
- this.timer = setInterval(this.next, this.speed)
140
- this.do_remain()
141
- }
142
- },
143
-
144
- next: function () {
145
- this.toggle()
146
- this.direction = this.transitionRight
147
- if (this.currentIndex > this.slides.length - 2) {
148
- this.currentIndex = 0
149
- } else {
150
- this.currentIndex += 1
151
- }
152
- this.$emit('index', this.currentIndex)
153
- },
154
- prev: function () {
155
- this.toggle()
156
- this.direction = this.transitionLeft
157
- if (this.currentIndex === 0) {
158
- this.currentIndex = this.slides.length - 1
159
- } else {
160
- this.currentIndex -= 1
161
- }
162
- this.$emit('index', this.currentIndex)
163
- },
164
- goToSlide(i) {
165
- this.toggle()
166
- if (i < this.currentIndex) {
167
- this.direction = this.transitionLeft
168
- } else {
169
- this.direction = this.transitionRight
170
- }
171
-
172
- this.currentIndex = i
173
- this.$emit('index', this.currentIndex)
174
- }
140
+ /**
141
+ * Initial slide index to display
142
+ * @type {Number}
143
+ * @default 0
144
+ */
145
+ startIndex: {
146
+ type: Number,
147
+ default: 0
175
148
  },
176
- computed: {
177
- currentSlide: function () {
178
- return this.slides[
179
- (this.currentIndex) % this.slides.length]
180
- }
149
+ /**
150
+ * Enables automatic slide progression
151
+ * @type {Boolean}
152
+ * @default false
153
+ */
154
+ autoplay: {
155
+ type: Boolean,
156
+ default: false
157
+ },
158
+ /**
159
+ * Shows progress bar during autoplay
160
+ * @type {Boolean}
161
+ * @default false
162
+ */
163
+ progress: {
164
+ type: Boolean,
165
+ default: false
181
166
  },
182
- beforeUnmount() {
183
- clearInterval(this.timer)
184
- clearTimeout(this.loaded_timer)
185
- clearInterval(this.remain_id)
167
+ /**
168
+ * Shows navigation arrows
169
+ * @type {Boolean}
170
+ * @default false
171
+ */
172
+ arrow: {
173
+ type: Boolean,
174
+ default: false
175
+ },
176
+ /**
177
+ * Shows navigation dots
178
+ * @type {Boolean}
179
+ * @default true
180
+ */
181
+ dots: {
182
+ type: Boolean,
183
+ default: true
184
+ },
185
+ /**
186
+ * Enables appear transition on initial render
187
+ * @type {Boolean}
188
+ * @default true
189
+ */
190
+ appear: {
191
+ type: Boolean,
192
+ default: true
193
+ },
194
+ /**
195
+ * Additional CSS classes for slides container
196
+ * @type {String|Object|Array}
197
+ */
198
+ slidesClass: [String, Object, Array],
199
+ /**
200
+ * Vue transition mode
201
+ * @type {String}
202
+ * @default 'out-in'
203
+ */
204
+ mode: {type: String, default: 'out-in'},
205
+ /**
206
+ * CSS transition name for right/next direction
207
+ * @type {String}
208
+ * @default 'slider-right'
209
+ */
210
+ transitionRight: {type: String, default: 'slider-right'},
211
+ /**
212
+ * CSS transition name for left/previous direction
213
+ * @type {String}
214
+ * @default 'slider-left'
215
+ */
216
+ transitionLeft: {type: String, default: 'slider-left'}
217
+ })
218
+
219
+ const emit = defineEmits([
220
+ /**
221
+ * Emitted when slide index changes
222
+ * @param {Number} index - New slide index
223
+ */
224
+ 'index'
225
+ ])
226
+
227
+ const direction = ref(props.transitionRight)
228
+ const loaded = ref(false)
229
+ const currentIndex = ref(props.startIndex)
230
+ const loadedTimer = ref(null)
231
+ const timer = ref(null)
232
+ const width = ref(null)
233
+ const remainId = ref(null)
234
+ const remain = ref(0)
235
+ const sliderRef = ref(null)
236
+
237
+ const currentSlide = computed(() => {
238
+ if (!props.slides.length) return null
239
+ return props.slides[currentIndex.value % props.slides.length]
240
+ })
241
+
242
+ const doRemain = () => {
243
+ remain.value = 0
244
+ clearInterval(remainId.value)
245
+
246
+ if (!props.autoplay || !props.progress) return
247
+
248
+ remainId.value = setInterval(() => {
249
+ remain.value += 10000 / props.speed
250
+ if (remain.value >= 100) {
251
+ remain.value = 100
252
+ clearInterval(remainId.value)
253
+ }
254
+ }, 100)
255
+ }
256
+
257
+ const init = () => {
258
+ if (sliderRef.value) {
259
+ const w = sliderRef.value.clientWidth
260
+ width.value = w || 1200
261
+ startSlide()
262
+ loaded.value = true
263
+ }
264
+ }
265
+
266
+ const toggle = () => {
267
+ clearInterval(timer.value)
268
+ loaded.value = false
269
+
270
+ clearTimeout(loadedTimer.value)
271
+ loadedTimer.value = setTimeout(() => {
272
+ loaded.value = true
273
+ }, 500)
274
+
275
+ startSlide()
276
+ }
277
+
278
+ const startSlide = () => {
279
+ if (props.autoplay && props.slides.length > 1) {
280
+ clearInterval(timer.value)
281
+ timer.value = setInterval(next, props.speed)
282
+ doRemain()
283
+ }
284
+ }
285
+
286
+ /**
287
+ * Navigates to the next slide
288
+ */
289
+ const next = () => {
290
+ if (props.slides.length <= 1) return
291
+
292
+ toggle()
293
+ direction.value = props.transitionRight
294
+
295
+ if (currentIndex.value > props.slides.length - 2) {
296
+ currentIndex.value = 0
297
+ } else {
298
+ currentIndex.value += 1
186
299
  }
300
+
301
+ emit('index', currentIndex.value)
187
302
  }
303
+
304
+ /**
305
+ * Navigates to the previous slide
306
+ */
307
+ const prev = () => {
308
+ if (props.slides.length <= 1) return
309
+
310
+ toggle()
311
+ direction.value = props.transitionLeft
312
+
313
+ if (currentIndex.value === 0) {
314
+ currentIndex.value = props.slides.length - 1
315
+ } else {
316
+ currentIndex.value -= 1
317
+ }
318
+
319
+ emit('index', currentIndex.value)
320
+ }
321
+
322
+ /**
323
+ * Navigates to a specific slide
324
+ * @param {Number} i - Slide index to navigate to
325
+ */
326
+ const goToSlide = (i) => {
327
+ if (i === currentIndex.value || i < 0 || i >= props.slides.length) return
328
+
329
+ toggle()
330
+
331
+ if (i < currentIndex.value) {
332
+ direction.value = props.transitionLeft
333
+ } else {
334
+ direction.value = props.transitionRight
335
+ }
336
+
337
+ currentIndex.value = i
338
+ emit('index', currentIndex.value)
339
+ }
340
+
341
+ onMounted(() => {
342
+ init()
343
+ })
344
+
345
+ onUnmounted(() => {
346
+ clearInterval(timer.value)
347
+ clearTimeout(loadedTimer.value)
348
+ clearInterval(remainId.value)
349
+ })
188
350
  </script>
351
+
189
352
  <style lang="scss">
190
353
  @use "sass:map";
191
- @use "../../style/variables/base";
192
- @use "../../style/mixins";
354
+ @use "../../style" as *;
193
355
 
194
356
 
195
357
  .slider-progress {
@@ -202,25 +364,25 @@ export default {
202
364
  .btn-left-arrow {
203
365
  position: absolute;
204
366
  top: 50%;
205
- @include mixins.ltr() {
367
+ @include ltr() {
206
368
  left: 20px;
207
369
  }
208
- @include mixins.rtl() {
370
+ @include rtl() {
209
371
  right: 20px
210
372
  }
211
- z-index: map.get(base.$z-index, 'low');
373
+ z-index: map.get($z-index, 'low');
212
374
  }
213
375
 
214
376
  .btn-right-arrow {
215
377
  position: absolute;
216
378
  top: 50%;
217
- @include mixins.rtl() {
379
+ @include rtl() {
218
380
  left: 20px;
219
381
  }
220
- @include mixins.ltr() {
382
+ @include ltr() {
221
383
  right: 20px
222
384
  }
223
- z-index: map.get(base.$z-index, 'low');
385
+ z-index: map.get($z-index, 'low');
224
386
  }
225
387
 
226
388
  .slider-right {
@@ -233,10 +395,10 @@ export default {
233
395
  }
234
396
 
235
397
  &-enter-from {
236
- @include mixins.rtl() {
398
+ @include rtl() {
237
399
  transform: translateX(-200px);
238
400
  }
239
- @include mixins.ltr() {
401
+ @include ltr() {
240
402
  transform: translateX(200px);
241
403
  }
242
404
 
@@ -244,10 +406,10 @@ export default {
244
406
  }
245
407
 
246
408
  &-leave-to {
247
- @include mixins.rtl() {
409
+ @include rtl() {
248
410
  transform: translateX(200px);
249
411
  }
250
- @include mixins.ltr() {
412
+ @include ltr() {
251
413
  transform: translateX(-200px);
252
414
  }
253
415
 
@@ -265,10 +427,10 @@ export default {
265
427
  }
266
428
 
267
429
  &-enter-from {
268
- @include mixins.rtl() {
430
+ @include rtl() {
269
431
  transform: translateX(200px);
270
432
  }
271
- @include mixins.ltr() {
433
+ @include ltr() {
272
434
  transform: translateX(-200px);
273
435
  }
274
436
 
@@ -276,10 +438,10 @@ export default {
276
438
  }
277
439
 
278
440
  &-leave-to {
279
- @include mixins.rtl() {
441
+ @include rtl() {
280
442
  transform: translateX(-200px);
281
443
  }
282
- @include mixins.ltr() {
444
+ @include ltr() {
283
445
  transform: translateX(200px);
284
446
  }
285
447
 
@@ -318,7 +480,7 @@ export default {
318
480
  display: flex;
319
481
  padding: 5px;
320
482
 
321
- button {
483
+ span {
322
484
  transition: 0.3s all ease-in-out;
323
485
  background-color: #bfbfbf;
324
486
  outline: none;
@@ -335,7 +497,7 @@ export default {
335
497
  }
336
498
  }
337
499
 
338
- .slider-dot--current button {
500
+ .slider-dot--current span {
339
501
  transition: 0.5s all ease-in-out;
340
502
  background-color: currentColor;
341
503
  width: 30px;