oxy-uni-ui 1.2.3 → 2.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 (235) hide show
  1. package/attributes.json +1 -1
  2. package/components/common/abstracts/variable.scss +353 -328
  3. package/components/common/util.ts +185 -32
  4. package/components/composables/index.ts +1 -0
  5. package/components/composables/usePopover.ts +24 -20
  6. package/components/composables/useVirtualScroll.ts +10 -9
  7. package/components/composables/useWindowResize.ts +35 -0
  8. package/components/oxy-action-sheet/index.scss +24 -11
  9. package/components/oxy-action-sheet/oxy-action-sheet.vue +27 -19
  10. package/components/oxy-action-sheet/types.ts +7 -0
  11. package/components/oxy-backtop/index.scss +3 -3
  12. package/components/oxy-backtop/oxy-backtop.vue +9 -6
  13. package/components/oxy-backtop/types.ts +7 -7
  14. package/components/oxy-badge/index.scss +4 -4
  15. package/components/oxy-badge/oxy-badge.vue +3 -3
  16. package/components/oxy-badge/types.ts +2 -2
  17. package/components/oxy-button/index.scss +5 -5
  18. package/components/oxy-button/oxy-button.vue +5 -1
  19. package/components/oxy-calendar/index.scss +11 -11
  20. package/components/oxy-calendar/oxy-calendar.vue +1 -0
  21. package/components/oxy-calendar/types.ts +5 -0
  22. package/components/oxy-calendar-view/month/index.scss +4 -4
  23. package/components/oxy-calendar-view/month/types.ts +36 -0
  24. package/components/oxy-calendar-view/monthPanel/index.scss +7 -7
  25. package/components/oxy-calendar-view/monthPanel/month-panel.vue +14 -8
  26. package/components/oxy-calendar-view/year/index.scss +4 -4
  27. package/components/oxy-calendar-view/yearPanel/index.scss +4 -4
  28. package/components/oxy-calendar-view/yearPanel/year-panel.vue +21 -5
  29. package/components/oxy-card/index.scss +2 -2
  30. package/components/oxy-cell/index.scss +8 -8
  31. package/components/oxy-checkbox/index.scss +7 -7
  32. package/components/oxy-checkbox-group/index.scss +2 -2
  33. package/components/oxy-circle/oxy-circle.vue +10 -7
  34. package/components/oxy-circle/types.ts +5 -5
  35. package/components/oxy-col/oxy-col.vue +2 -2
  36. package/components/oxy-col-picker/index.scss +4 -4
  37. package/components/oxy-col-picker/oxy-col-picker.vue +6 -5
  38. package/components/oxy-col-picker/types.ts +7 -2
  39. package/components/oxy-collapse/index.scss +2 -2
  40. package/components/oxy-collapse-item/oxy-collapse-item.vue +3 -3
  41. package/components/oxy-corner/index.scss +32 -32
  42. package/components/oxy-count-to/oxy-count-to.vue +3 -3
  43. package/components/oxy-curtain/index.scss +15 -15
  44. package/components/oxy-curtain/oxy-curtain.vue +4 -2
  45. package/components/oxy-curtain/types.ts +6 -1
  46. package/components/oxy-date-strip/oxy-date-strip.vue +2 -2
  47. package/components/oxy-date-strip/types.ts +1 -1
  48. package/components/oxy-date-strip-item/index.scss +3 -3
  49. package/components/oxy-datetime-picker/index.scss +11 -11
  50. package/components/oxy-datetime-picker/oxy-datetime-picker.vue +1 -0
  51. package/components/oxy-datetime-picker/types.ts +5 -0
  52. package/components/oxy-drop-menu/index.scss +3 -3
  53. package/components/oxy-drop-menu/oxy-drop-menu.vue +3 -3
  54. package/components/oxy-drop-menu-item/index.scss +1 -1
  55. package/components/oxy-drop-menu-item/oxy-drop-menu-item.vue +4 -3
  56. package/components/oxy-drop-menu-item/types.ts +5 -0
  57. package/components/oxy-echarts/types.ts +6 -0
  58. package/components/oxy-fab/index.scss +8 -8
  59. package/components/oxy-fab/oxy-fab.vue +22 -3
  60. package/components/oxy-file-list/index.scss +24 -23
  61. package/components/oxy-file-list/oxy-file-list.vue +2 -2
  62. package/components/oxy-floating-panel/oxy-floating-panel.vue +13 -9
  63. package/components/oxy-floating-panel/{type.ts → types.ts} +8 -8
  64. package/components/oxy-footer/index.scss +19 -0
  65. package/components/oxy-footer/oxy-footer.vue +78 -0
  66. package/components/oxy-footer/types.ts +17 -0
  67. package/components/oxy-form-item/types.ts +22 -1
  68. package/components/oxy-gap/oxy-gap.vue +2 -2
  69. package/components/oxy-gap/types.ts +2 -2
  70. package/components/oxy-grid/oxy-grid.vue +1 -1
  71. package/components/oxy-grid/types.ts +1 -1
  72. package/components/oxy-grid-item/index.scss +1 -1
  73. package/components/oxy-grid-item/oxy-grid-item.vue +7 -5
  74. package/components/oxy-grid-item/types.ts +1 -1
  75. package/components/oxy-guidance/index.scss +75 -0
  76. package/components/oxy-guidance/oxy-guidance.vue +201 -0
  77. package/components/oxy-guidance/types.ts +33 -0
  78. package/components/oxy-icon/oxy-icon.vue +2 -2
  79. package/components/oxy-icon/types.ts +1 -1
  80. package/components/oxy-img/oxy-img.vue +4 -4
  81. package/components/oxy-img/types.ts +3 -3
  82. package/components/oxy-img-cropper/index.scss +12 -12
  83. package/components/oxy-img-cropper/oxy-img-cropper.vue +97 -52
  84. package/components/oxy-img-cropper/types.ts +2 -2
  85. package/components/oxy-img-lazy/oxy-img-lazy.vue +3 -3
  86. package/components/oxy-img-lazy/types.ts +3 -3
  87. package/components/oxy-index-anchor/index.scss +2 -2
  88. package/components/oxy-index-anchor/oxy-index-anchor.vue +2 -2
  89. package/components/oxy-index-anchor/{type.ts → types.ts} +3 -0
  90. package/components/oxy-index-bar/index.scss +3 -3
  91. package/components/oxy-index-bar/oxy-index-bar.vue +3 -3
  92. package/components/oxy-index-bar/{type.ts → types.ts} +2 -2
  93. package/components/oxy-input/index.scss +1 -1
  94. package/components/oxy-input-number/index.scss +5 -5
  95. package/components/oxy-input-number/oxy-input-number.vue +2 -2
  96. package/components/oxy-input-number/types.ts +3 -2
  97. package/components/oxy-keyboard/index.scss +5 -5
  98. package/components/oxy-keyboard/key/index.scss +3 -3
  99. package/components/oxy-keyboard/key/index.vue +2 -2
  100. package/components/oxy-keyboard/key/types.ts +15 -0
  101. package/components/oxy-keyboard/oxy-keyboard.vue +1 -0
  102. package/components/oxy-keyboard/types.ts +5 -0
  103. package/components/oxy-link/index.scss +2 -2
  104. package/components/oxy-list/oxy-list.vue +4 -3
  105. package/components/oxy-loading/oxy-loading.vue +8 -4
  106. package/components/oxy-loading/types.ts +1 -1
  107. package/components/oxy-loadmore/index.scss +3 -3
  108. package/components/oxy-long-press-menu/index.scss +93 -0
  109. package/components/oxy-long-press-menu/oxy-long-press-menu.vue +338 -0
  110. package/components/oxy-long-press-menu/types.ts +34 -0
  111. package/components/oxy-message-box/index.scss +12 -11
  112. package/components/oxy-message-box/oxy-message-box.vue +11 -3
  113. package/components/oxy-message-box/types.ts +14 -0
  114. package/components/oxy-navbar/index.scss +2 -2
  115. package/components/oxy-navbar/oxy-navbar.vue +58 -13
  116. package/components/oxy-navbar/types.ts +8 -1
  117. package/components/oxy-navbar-capsule/types.ts +3 -0
  118. package/components/oxy-notice-bar/index.scss +3 -3
  119. package/components/oxy-notice-bar/oxy-notice-bar.vue +9 -5
  120. package/components/oxy-notice-bar/types.ts +3 -3
  121. package/components/oxy-notify/index.ts +1 -0
  122. package/components/oxy-notify/oxy-notify.vue +3 -2
  123. package/components/oxy-notify/types.ts +7 -0
  124. package/components/oxy-pagination/index.scss +1 -1
  125. package/components/oxy-password-input/oxy-password-input.vue +2 -2
  126. package/components/oxy-password-input/types.ts +1 -1
  127. package/components/oxy-picker/index.scss +45 -2
  128. package/components/oxy-picker/oxy-picker.vue +100 -14
  129. package/components/oxy-picker/types.ts +29 -1
  130. package/components/oxy-picker-view/index.scss +3 -3
  131. package/components/oxy-picker-view/oxy-picker-view.vue +4 -4
  132. package/components/oxy-popover/index.scss +9 -9
  133. package/components/oxy-popup/index.scss +2 -2
  134. package/components/oxy-popup/oxy-popup.vue +35 -2
  135. package/components/oxy-popup/types.ts +8 -1
  136. package/components/oxy-progress/index.scss +3 -3
  137. package/components/oxy-qrcode/draw.ts +398 -0
  138. package/components/oxy-qrcode/index.scss +2 -0
  139. package/components/oxy-qrcode/oxy-qrcode.vue +124 -0
  140. package/components/oxy-qrcode/qrcode.ts +936 -0
  141. package/components/oxy-qrcode/types.ts +42 -0
  142. package/components/oxy-radio/index.scss +10 -10
  143. package/components/oxy-radio-group/index.scss +2 -2
  144. package/components/oxy-rate/types.ts +4 -4
  145. package/components/oxy-resize/index.scss +2 -2
  146. package/components/oxy-resize/oxy-resize.vue +4 -4
  147. package/components/oxy-resize/types.ts +3 -0
  148. package/components/oxy-rich-text/index.scss +30 -29
  149. package/components/oxy-rich-text/mp-html/mp-html.vue +33 -24
  150. package/components/oxy-rich-text/mp-html/node/node.vue +30 -19
  151. package/components/oxy-rich-text/oxy-rich-text.vue +31 -31
  152. package/components/oxy-rich-text/types.ts +6 -1
  153. package/components/oxy-row/oxy-row.vue +3 -3
  154. package/components/oxy-row/types.ts +1 -1
  155. package/components/oxy-search/index.scss +3 -3
  156. package/components/oxy-segmented/index.scss +16 -16
  157. package/components/oxy-segmented/oxy-segmented.vue +23 -3
  158. package/components/oxy-select/index.scss +144 -68
  159. package/components/oxy-select/oxy-select.vue +85 -50
  160. package/components/oxy-select/types.ts +13 -1
  161. package/components/oxy-select-picker/index.scss +7 -7
  162. package/components/oxy-select-picker/oxy-select-picker.vue +1 -0
  163. package/components/oxy-select-picker/types.ts +2 -0
  164. package/components/oxy-sidebar-item/index.scss +1 -1
  165. package/components/oxy-signature/oxy-signature.vue +18 -10
  166. package/components/oxy-signature/types.ts +106 -13
  167. package/components/oxy-skeleton/oxy-skeleton.vue +6 -6
  168. package/components/oxy-skeleton/types.ts +1 -1
  169. package/components/oxy-slider/index.scss +3 -3
  170. package/components/oxy-sort-button/index.scss +8 -8
  171. package/components/oxy-status-tip/index.scss +4 -4
  172. package/components/oxy-status-tip/oxy-status-tip.vue +5 -5
  173. package/components/oxy-status-tip/types.ts +3 -3
  174. package/components/oxy-step/index.scss +14 -14
  175. package/components/oxy-sticky/oxy-sticky.vue +6 -6
  176. package/components/oxy-stream-render/types.ts +4 -1
  177. package/components/oxy-swipe-action/oxy-swipe-action.vue +27 -2
  178. package/components/oxy-swiper/oxy-swiper.vue +6 -6
  179. package/components/oxy-swiper/types.ts +5 -5
  180. package/components/oxy-switch/index.scss +8 -8
  181. package/components/oxy-switch/oxy-switch.vue +2 -2
  182. package/components/oxy-switch/types.ts +1 -1
  183. package/components/oxy-tab/index.scss +11 -1
  184. package/components/oxy-tabbar/index.scss +1 -1
  185. package/components/oxy-tabbar/oxy-tabbar.vue +39 -10
  186. package/components/oxy-table/index.scss +5 -5
  187. package/components/oxy-table/oxy-table.vue +8 -6
  188. package/components/oxy-table/types.ts +2 -2
  189. package/components/oxy-table-col/oxy-table-col.vue +3 -3
  190. package/components/oxy-table-col/types.ts +2 -2
  191. package/components/oxy-tabs/index.scss +43 -15
  192. package/components/oxy-tabs/oxy-tabs.vue +53 -19
  193. package/components/oxy-tabs/types.ts +15 -3
  194. package/components/oxy-tag/index.scss +15 -15
  195. package/components/oxy-text/index.scss +5 -1
  196. package/components/oxy-text/oxy-text.vue +76 -7
  197. package/components/oxy-text/types.ts +12 -0
  198. package/components/oxy-textarea/index.scss +6 -6
  199. package/components/oxy-toast/oxy-toast.vue +24 -8
  200. package/components/oxy-tooltip/index.scss +9 -9
  201. package/components/oxy-tree/index.scss +51 -15
  202. package/components/oxy-tree/oxy-tree.vue +13 -9
  203. package/components/oxy-tree/types.ts +12 -9
  204. package/components/oxy-upload/index.scss +21 -21
  205. package/components/oxy-upload/types.ts +2 -2
  206. package/components/oxy-verification-code/index.scss +6 -0
  207. package/components/oxy-verification-code/oxy-verification-code.vue +187 -0
  208. package/components/oxy-verification-code/types.ts +82 -0
  209. package/components/oxy-video-preview/index.scss +4 -4
  210. package/components/oxy-virtual-scroll/index.scss +4 -4
  211. package/components/oxy-virtual-scroll/oxy-virtual-scroll.vue +11 -7
  212. package/components/oxy-virtual-scroll/types.ts +14 -14
  213. package/components/oxy-voice-player/index.scss +908 -0
  214. package/components/oxy-voice-player/oxy-voice-player.vue +821 -0
  215. package/components/oxy-voice-player/types.ts +567 -0
  216. package/components/oxy-waterfall/oxy-waterfall.vue +6 -6
  217. package/components/oxy-waterfall/types.ts +6 -6
  218. package/components/oxy-watermark/oxy-watermark.vue +35 -13
  219. package/components/oxy-watermark/types.ts +14 -14
  220. package/global.d.ts +2 -0
  221. package/locale/lang/ar-SA.ts +3 -0
  222. package/locale/lang/en-US.ts +3 -0
  223. package/locale/lang/zh-CN.ts +3 -0
  224. package/package.json +97 -1
  225. package/tags.json +1 -1
  226. package/web-types.json +1 -1
  227. package/components/oxy-number-keyboard/index.scss +0 -78
  228. package/components/oxy-number-keyboard/key/index.scss +0 -81
  229. package/components/oxy-number-keyboard/key/index.vue +0 -78
  230. package/components/oxy-number-keyboard/key/types.ts +0 -11
  231. package/components/oxy-number-keyboard/oxy-number-keyboard.vue +0 -151
  232. package/components/oxy-number-keyboard/types.ts +0 -83
  233. package/components/oxy-tree/components/tree-node-content.vue +0 -72
  234. package/components/oxy-tree/index.ts +0 -51
  235. package/oxy-uni-ui.zip +0 -0
@@ -14,11 +14,11 @@
14
14
  :circular="loop"
15
15
  :vertical="direction == 'vertical'"
16
16
  :easing-function="easingFunction"
17
- :previous-margin="addUnit(previousMargin)"
18
- :next-margin="addUnit(nextMargin)"
17
+ :previous-margin="withDefaultUnit(previousMargin)"
18
+ :next-margin="withDefaultUnit(nextMargin)"
19
19
  :snap-to-edge="snapToEdge"
20
20
  :display-multiple-items="displayMultipleItems"
21
- :style="{ height: addUnit(height) }"
21
+ :style="{ height: withDefaultUnit(height) }"
22
22
  @change="handleChange"
23
23
  @animationfinish="handleAnimationfinish"
24
24
  >
@@ -27,7 +27,7 @@
27
27
  <video
28
28
  v-if="isVideo(item)"
29
29
  :id="`video-${index}-${uid}`"
30
- :style="{ height: addUnit(height) }"
30
+ :style="{ height: withDefaultUnit(height) }"
31
31
  :src="isObj(item) ? item[valueKey] : item"
32
32
  :poster="isObj(item) ? item.poster : ''"
33
33
  :class="`oxy-swiper__video ${customItemClass} ${getCustomItemClass(currentValue, index, list)}`"
@@ -44,7 +44,7 @@
44
44
  v-else
45
45
  :src="isObj(item) ? item[valueKey] : item"
46
46
  :class="`oxy-swiper__image ${customImageClass} ${customItemClass} ${getCustomItemClass(currentValue, index, list)}`"
47
- :style="{ height: addUnit(height) }"
47
+ :style="{ height: withDefaultUnit(height) }"
48
48
  :mode="imageMode"
49
49
  @click="handleClick(index, item)"
50
50
  />
@@ -89,7 +89,7 @@ export default {
89
89
  <script lang="ts" setup>
90
90
  import OxySwiperNav from '../oxy-swiper-nav/oxy-swiper-nav.vue'
91
91
  import { computed, watch, ref, getCurrentInstance, useSlots } from 'vue'
92
- import { addUnit, isObj, isImageUrl, isVideoUrl, uuid, isDef } from '../common/util'
92
+ import { withDefaultUnit, isObj, isImageUrl, isVideoUrl, uuid, isDef } from '../common/util'
93
93
  import { swiperProps, type SwiperList } from './types'
94
94
  import type { SwiperNavProps } from '../oxy-swiper-nav/types'
95
95
  const slots = useSlots()
@@ -86,10 +86,10 @@ export const swiperProps = {
86
86
 
87
87
  /**
88
88
  * 轮播的高度
89
- * 类型:number 或 string(数字或可转换为数字的字符串)
90
- * 默认值:'192'
89
+ * 类型:number 或 string(数字或纯数字字符串默认按 rpx 处理)
90
+ * 默认值:'384'
91
91
  */
92
- height: makeNumericProp('192'),
92
+ height: makeNumericProp('384'),
93
93
 
94
94
  /**
95
95
  * 轮播间隔时间,单位为毫秒
@@ -131,7 +131,7 @@ export const swiperProps = {
131
131
 
132
132
  /**
133
133
  * 后边距
134
- * 类型:number 或 string(数字或可转换为数字的字符串)
134
+ * 类型:number 或 string(数字或纯数字字符串默认按 rpx 处理)
135
135
  * 默认值:'0'
136
136
  */
137
137
  nextMargin: makeNumericProp('0'),
@@ -144,7 +144,7 @@ export const swiperProps = {
144
144
  indicatorPosition: makeStringProp<IndicatorPositionType>('bottom'),
145
145
  /**
146
146
  * 前边距
147
- * 类型:number 或 string(数字或可转换为数字的字符串)
147
+ * 类型:number 或 string(数字或纯数字字符串默认按 rpx 处理)
148
148
  * 默认值:'0'
149
149
  */
150
150
  previousMargin: makeNumericProp('0'),
@@ -24,22 +24,22 @@
24
24
  display: inline-block;
25
25
  width: $-switch-circle-size;
26
26
  height: $-switch-circle-size;
27
- top: 2px;
28
- left: 2px;
27
+ top: 4rpx;
28
+ left: 4rpx;
29
29
  background: #fff;
30
30
  border-radius: 50%;
31
31
  transition: left .3s ease-out;
32
- box-shadow: 0 2px 4px 0 $-switch-inactive-shadow-color;
32
+ box-shadow: 0 4rpx 8rpx 0 $-switch-inactive-shadow-color;
33
33
 
34
34
  &::after {
35
35
  position: absolute;
36
36
  content: '';
37
- width: calc(200% - 2px);
38
- height: calc(200% - 2px);
37
+ width: calc(200% - 4rpx);
38
+ height: calc(200% - 4rpx);
39
39
  top: 50%;
40
40
  left: 50%;
41
41
  transform: translate(-50%, -50%) scale(0.5);
42
- border: 1px solid $-switch-border-color;
42
+ border: 2rpx solid $-switch-border-color;
43
43
  border-radius: 50%;
44
44
  }
45
45
  }
@@ -48,8 +48,8 @@
48
48
  border-color: $-switch-active-color;
49
49
 
50
50
  .oxy-switch__circle {
51
- left: calc($-switch-width - $-switch-circle-size - 2px);
52
- box-shadow: 0 2px 4px 0 $-switch-active-shadow-color
51
+ left: calc($-switch-width - $-switch-circle-size - 4rpx);
52
+ box-shadow: 0 4rpx 8rpx 0 $-switch-active-shadow-color
53
53
  }
54
54
  }
55
55
  @include when(disabled) {
@@ -16,7 +16,7 @@ export default {
16
16
 
17
17
  <script lang="ts" setup>
18
18
  import { computed, type CSSProperties, onBeforeMount } from 'vue'
19
- import { addUnit, isFunction, objToStyle } from '../common/util'
19
+ import { withDefaultUnit, isFunction, objToStyle } from '../common/util'
20
20
  import { switchProps } from './types'
21
21
 
22
22
  const props = defineProps(switchProps)
@@ -32,7 +32,7 @@ const rootStyle = computed(() => {
32
32
  'border-color': props.modelValue === props.activeValue ? props.activeColor : props.inactiveColor
33
33
  }
34
34
  if (props.size) {
35
- rootStyle['font-size'] = addUnit(props.size)
35
+ rootStyle['font-size'] = withDefaultUnit(props.size)
36
36
  }
37
37
  return `${objToStyle(rootStyle)}${props.customStyle}`
38
38
  })
@@ -45,7 +45,7 @@ export const switchProps = {
45
45
  */
46
46
  inactiveColor: String,
47
47
  /**
48
- * 大小
48
+ * 大小,number 类型按 `rpx` 语义处理
49
49
  */
50
50
  size: {
51
51
  type: numericProp
@@ -13,4 +13,14 @@
13
13
  transition: height 0.3s ease-in-out;
14
14
  }
15
15
  }
16
- }
16
+ }
17
+
18
+ .is-fullscreen {
19
+ .oxy-tab {
20
+ height: 100%;
21
+ overflow: hidden;
22
+ .oxy-tab__body {
23
+ height: 100%;
24
+ }
25
+ }
26
+ }
@@ -24,7 +24,7 @@
24
24
  @include m(round) {
25
25
  margin-left: 32rpx;
26
26
  margin-right: 32rpx;
27
- border-radius: 999px;
27
+ border-radius: 999rpx;
28
28
  box-shadow: $-tabbar-box-shadow;
29
29
 
30
30
  @include when(fixed) {
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <view :class="{ 'oxy-tabbar__placeholder': fixed && placeholder && safeAreaInsetBottom && shape === 'round' }" :style="{ height: addUnit(height) }">
2
+ <view :class="{ 'oxy-tabbar__placeholder': fixed && placeholder && safeAreaInsetBottom && shape === 'round' }" :style="placeholderStyle">
3
3
  <view
4
4
  :class="`oxy-tabbar oxy-tabbar--${shape} ${customClass} ${fixed ? 'is-fixed' : ''} ${safeAreaInsetBottom ? 'is-safe' : ''} ${
5
5
  bordered ? 'is-border' : ''
@@ -23,14 +23,15 @@ export default {
23
23
  <script lang="ts" setup>
24
24
  import { getCurrentInstance, onMounted, ref, watch, nextTick, computed, type CSSProperties } from 'vue'
25
25
  import type { TabbarItem } from '../oxy-tabbar-item/types'
26
- import { addUnit, getRect, isDef, objToStyle } from '../common/util'
26
+ import { getRect, isDef, objToStyle } from '../common/util'
27
27
  import { useChildren } from '../composables/useChildren'
28
+ import { useWindowResize } from '../composables/useWindowResize'
28
29
  import { TABBAR_KEY, tabbarProps } from './types'
29
30
 
30
31
  const props = defineProps(tabbarProps)
31
32
  const emit = defineEmits(['change', 'update:modelValue'])
32
33
 
33
- const height = ref<number | string>('') // 占位高度
34
+ const placeholderHeight = ref<number | string>('') // 占位高度(rpx 语义)
34
35
  const { proxy } = getCurrentInstance() as any
35
36
 
36
37
  const { linkChildren } = useChildren(TABBAR_KEY)
@@ -48,19 +49,26 @@ const rootStyle = computed(() => {
48
49
  return `${objToStyle(style)}${props.customStyle}`
49
50
  })
50
51
 
52
+ const placeholderStyle = computed(() => {
53
+ if (!props.fixed || !props.placeholder) {
54
+ return {}
55
+ }
56
+ return {
57
+ height: `${Number(placeholderHeight.value) || 0}rpx`
58
+ }
59
+ })
60
+
51
61
  watch(
52
- [() => props.fixed, () => props.placeholder],
62
+ [() => props.fixed, () => props.placeholder, () => props.safeAreaInsetBottom, () => props.shape, () => props.customStyle],
53
63
  () => {
54
64
  setPlaceholderHeight()
55
65
  },
56
- { deep: true, immediate: false }
66
+ { immediate: false }
57
67
  )
58
68
 
59
69
  onMounted(() => {
60
70
  if (props.fixed && props.placeholder) {
61
- nextTick(() => {
62
- setPlaceholderHeight()
63
- })
71
+ setPlaceholderHeight()
64
72
  }
65
73
  })
66
74
 
@@ -76,13 +84,34 @@ function setChange(child: TabbarItem) {
76
84
  })
77
85
  }
78
86
 
87
+ function handleWindowResize() {
88
+ if (props.fixed && props.placeholder) {
89
+ setPlaceholderHeight()
90
+ }
91
+ }
92
+
93
+ useWindowResize(handleWindowResize)
94
+
79
95
  function setPlaceholderHeight() {
80
96
  if (!props.fixed || !props.placeholder) {
97
+ placeholderHeight.value = ''
81
98
  return
82
99
  }
83
100
 
84
- getRect('.oxy-tabbar', false, proxy).then((res) => {
85
- height.value = Number(res.height)
101
+ nextTick(() => {
102
+ getRect('.oxy-tabbar', false, proxy)
103
+ .then((res) => {
104
+ const rectHeight = Number(res.height) || 0
105
+ const rectTop = Number(res.top)
106
+ const { windowHeight = 0, windowWidth = 0 } = uni.getSystemInfoSync()
107
+ const occupiedHeight = windowHeight && !Number.isNaN(rectTop) ? Math.max(windowHeight - rectTop, 0) : rectHeight
108
+ const occupiedHeightInRpx = windowWidth ? (occupiedHeight * 750) / windowWidth : occupiedHeight * 2
109
+
110
+ placeholderHeight.value = occupiedHeight ? occupiedHeightInRpx : ''
111
+ })
112
+ .catch(() => {
113
+ placeholderHeight.value = ''
114
+ })
86
115
  })
87
116
  }
88
117
  </script>
@@ -55,7 +55,7 @@
55
55
 
56
56
  @include e(header) {
57
57
  width: 100%;
58
- height: 50px;
58
+ height: 100rpx;
59
59
  position: sticky;
60
60
  top: 0;
61
61
  z-index: 2;
@@ -84,12 +84,12 @@
84
84
  align-items: center;
85
85
  box-sizing: border-box;
86
86
  background: $-table-bg;
87
- width: 100px;
88
- min-height: 50px;
89
- padding: 8px 10px;
87
+ width: 200rpx;
88
+ min-height: 100rpx;
89
+ padding: 16rpx 20rpx;
90
90
  font-size: $-table-font-size;
91
91
  color: $-table-color;
92
- --oxy-sort-button-height: 30px;
92
+ --oxy-sort-button-height: 60rpx;
93
93
 
94
94
  @include when(border) {
95
95
  border-right: 1px solid $-table-border-color;
@@ -122,7 +122,7 @@ export default {
122
122
  import OxyTableCol from '../oxy-table-col/oxy-table-col.vue'
123
123
  import OxySortButton from '../oxy-sort-button/oxy-sort-button.vue'
124
124
  import { type CSSProperties, computed, reactive, ref } from 'vue'
125
- import { addUnit, debounce, isDef, isObj, objToStyle, uuid } from '../common/util'
125
+ import { withDefaultUnit, debounce, isDef, isObj, objToStyle, uuid } from '../common/util'
126
126
  import type { SortDirection, TableColumn, TableColumnInstance, TableColumnProps } from '../oxy-table-col/types'
127
127
  import { TABLE_KEY, tableProps, type TableProvide } from './types'
128
128
  import { useTranslate } from '../composables/useTranslate'
@@ -160,7 +160,7 @@ const scroll = debounce(handleScroll, 100, { leading: false }) // 滚动事件
160
160
  const tableStyle = computed(() => {
161
161
  const style: CSSProperties = {}
162
162
  if (isDef(props.height)) {
163
- style['max-height'] = addUnit(props.height)
163
+ style['max-height'] = withDefaultUnit(props.height)
164
164
  }
165
165
  return `${objToStyle(style)}${props.customStyle}`
166
166
  })
@@ -171,7 +171,7 @@ const realWidthStyle = computed(() => {
171
171
  }
172
172
  let width: string | number = ''
173
173
  children.forEach((child) => {
174
- width = width ? `${width} + ${addUnit(child.width)}` : addUnit(child.width)
174
+ width = width ? `${width} + ${withDefaultUnit(child.width)}` : withDefaultUnit(child.width)
175
175
  })
176
176
  style['width'] = `calc(${width})`
177
177
  return objToStyle(style)
@@ -180,7 +180,9 @@ const realWidthStyle = computed(() => {
180
180
  const bodyStyle = computed(() => {
181
181
  const style: CSSProperties = {}
182
182
  if (isDef(props.height)) {
183
- style['height'] = isDef(props.rowHeight) ? `calc(${props.data.length} * ${addUnit(props.rowHeight)})` : `calc(${props.data.length} * 50px)`
183
+ style['height'] = isDef(props.rowHeight)
184
+ ? `calc(${props.data.length} * ${withDefaultUnit(props.rowHeight)})`
185
+ : `calc(${props.data.length} * 100rpx)`
184
186
  }
185
187
  return `${objToStyle(style)}`
186
188
  })
@@ -208,7 +210,7 @@ function getIsLastFixed(column: { fixed: boolean; prop: string }) {
208
210
  function getCellStyle(columnIndex: number) {
209
211
  let style: CSSProperties = {}
210
212
  if (isDef(children[columnIndex].width)) {
211
- style['width'] = addUnit(children[columnIndex].width)
213
+ style['width'] = withDefaultUnit(children[columnIndex].width)
212
214
  }
213
215
  if (children[columnIndex].fixed) {
214
216
  style = getFixedStyle(columnIndex, style)
@@ -225,7 +227,7 @@ function getFixedStyle(columnIndex: number, style: CSSProperties) {
225
227
  let left: string | number = ''
226
228
  children.forEach((column, index) => {
227
229
  if (index < columnIndex) {
228
- left = left ? `${left} + ${addUnit(column.width)}` : addUnit(column.width)
230
+ left = left ? `${left} + ${withDefaultUnit(column.width)}` : withDefaultUnit(column.width)
229
231
  }
230
232
  })
231
233
  style['left'] = `calc(${left})`
@@ -22,9 +22,9 @@ export const tableProps = {
22
22
  */
23
23
  height: numericProp,
24
24
  /**
25
- * 行高
25
+ * 行高,number 类型按 `rpx` 语义处理
26
26
  */
27
- rowHeight: makeNumericProp(50),
27
+ rowHeight: makeNumericProp(100),
28
28
  /**
29
29
  * 是否显示表头
30
30
  */
@@ -28,7 +28,7 @@ export default {
28
28
  </script>
29
29
  <script lang="ts" setup>
30
30
  import { type CSSProperties, computed, ref } from 'vue'
31
- import { addUnit, isDef, objToStyle, isOdd, isFunction } from '../common/util'
31
+ import { withDefaultUnit, isDef, objToStyle, isOdd, isFunction } from '../common/util'
32
32
  import { tableColumnProps, type SortDirection } from './types'
33
33
  import { useParent } from '../composables/useParent'
34
34
  import { TABLE_KEY } from '../oxy-table/types'
@@ -87,7 +87,7 @@ const isLastFixed = computed(() => {
87
87
  const columnStyle = computed(() => {
88
88
  let style: CSSProperties = {}
89
89
  if (isDef(props.width)) {
90
- style['width'] = addUnit(props.width)
90
+ style['width'] = withDefaultUnit(props.width)
91
91
  }
92
92
  if (props.fixed && isDef(table) && isFunction(table.getFixedStyle)) {
93
93
  style = table.getFixedStyle(columnIndex.value, style)
@@ -102,7 +102,7 @@ const cellStyle = computed(() => {
102
102
  let style: CSSProperties = {}
103
103
  const rowHeight: string | number = isDef(table) && isDef(table.props) ? table.props.rowHeight : 50 // 自定义行高
104
104
  if (isDef(rowHeight)) {
105
- style['height'] = addUnit(rowHeight)
105
+ style['height'] = withDefaultUnit(rowHeight)
106
106
  }
107
107
  if (props.fixed && isDef(table) && isFunction(table.getFixedStyle)) {
108
108
  style = table.getFixedStyle(columnIndex.value, style)
@@ -32,9 +32,9 @@ export const tableColumnProps = {
32
32
  */
33
33
  label: makeRequiredProp(String),
34
34
  /**
35
- * 列宽度,单位px
35
+ * 列宽度,number 类型按 `rpx` 语义处理,也支持 `px/rpx`
36
36
  */
37
- width: makeNumericProp(100),
37
+ width: makeNumericProp(200),
38
38
  /**
39
39
  * 是否开启列排序
40
40
  */
@@ -30,7 +30,7 @@
30
30
 
31
31
  @include when(active) {
32
32
  color: $-dark-color;
33
- border: 1px solid $-tabs-nav-active-color;
33
+ border: 2rpx solid $-tabs-nav-active-color;
34
34
  background-color: $-dark-background;
35
35
  }
36
36
 
@@ -125,7 +125,7 @@
125
125
 
126
126
  @include e(line) {
127
127
  position: absolute;
128
- bottom: 4px;
128
+ bottom: 8rpx;
129
129
  left: 0;
130
130
  z-index: 1;
131
131
  height: $-tabs-nav-line-height;
@@ -139,6 +139,25 @@
139
139
  }
140
140
  }
141
141
 
142
+ @include edeep(nav-item-pills){
143
+ .oxy-tabs__nav-item-text {
144
+ padding: $-tabs-nav-pills-padding-y $-tabs-nav-pills-padding-x;
145
+ }
146
+ .oxy-tabs__nav-item-badge {
147
+ .oxy-badge__content {
148
+ margin-top: $-tabs-nav-pills-padding-y;
149
+ margin-right: $-tabs-nav-pills-padding-x;
150
+ }
151
+ }
152
+ @include when(active) {
153
+ .oxy-tabs__nav-item-text {
154
+ background-color: $-tabs-nav-pills-bg-color;
155
+ border-radius: $-tabs-nav-pills-border-radius;
156
+ color: $-tabs-nav-pills-color;
157
+ }
158
+ }
159
+ }
160
+
142
161
  @include e(container) {
143
162
  overflow: hidden;
144
163
  }
@@ -179,8 +198,8 @@
179
198
  position: absolute;
180
199
  content: '';
181
200
  top: 0;
182
- left: -24px;
183
- width: 24px;
201
+ left: -48rpx;
202
+ width: 48rpx;
184
203
  height: $-tabs-nav-height - 1;
185
204
  background: $-tabs-nav-map-btn-before-bg;
186
205
  }
@@ -197,7 +216,7 @@
197
216
 
198
217
  @include e(map-header) {
199
218
  position: relative;
200
- padding-left: 17px;
219
+ padding-left: 34rpx;
201
220
  height: $-tabs-nav-height;
202
221
  line-height: $-tabs-nav-height;
203
222
  font-size: $-tabs-nav-map-fs;
@@ -216,7 +235,7 @@
216
235
  @include e(map-body) {
217
236
  display: flex;
218
237
  flex-wrap: wrap;
219
- padding: 20px 15px 10px;
238
+ padding: 40rpx 30rpx 20rpx;
220
239
  background: #fff;
221
240
  transition: transform .3s;
222
241
  transform: scaleY(0);
@@ -243,12 +262,12 @@
243
262
  @include buttonClear;
244
263
  @include lineEllipsis;
245
264
  display: inline-block;
246
- width: 107px;
247
- height: 32px;
248
- line-height: 32px;
265
+ width: 214rpx;
266
+ height: 64rpx;
267
+ line-height: 64rpx;
249
268
  background-color: $-tabs-nav-map-button-back-color;
250
269
  border-color: transparent;
251
- margin-bottom: 10px;
270
+ margin-bottom: 20rpx;
252
271
  border-radius: $-tabs-nav-map-button-radius;
253
272
  color: $-tabs-nav-map-color;
254
273
  font-size: $-tabs-nav-map-fs;
@@ -257,7 +276,7 @@
257
276
 
258
277
  @include when(active) {
259
278
  color: $-tabs-nav-active-color;
260
- border: 1px solid $-tabs-nav-active-color;
279
+ border: 2rpx solid $-tabs-nav-active-color;
261
280
  background-color: $-tabs-nav-bg
262
281
  }
263
282
 
@@ -281,19 +300,28 @@
281
300
  @include when(slide) {
282
301
  .oxy-tabs__nav-item {
283
302
  flex: 0 0 auto;
284
- padding: 0 17px;
303
+ padding: 0 34rpx;
285
304
  }
286
305
  }
287
306
 
288
307
  @include when(map) {
289
308
  .oxy-tabs__nav--wrap {
290
- padding-right: 40px;
309
+ padding-right: 80rpx;
310
+ }
311
+ }
312
+
313
+ @include when(fullscreen) {
314
+ height: 100%;
315
+ display: flex;
316
+ flex-direction: column;
317
+ .oxy-tabs__container {
318
+ flex: 1;
291
319
  }
292
320
  }
293
321
  }
294
322
 
295
323
  @media screen and (max-width: 330px) {
296
324
  .oxy-tabs__map-nav-btn {
297
- width: 90px;
325
+ width: 180rpx;
298
326
  }
299
- }
327
+ }
@@ -2,7 +2,9 @@
2
2
  <template v-if="sticky">
3
3
  <oxy-sticky-box>
4
4
  <view
5
- :class="`oxy-tabs ${customClass} ${innerSlidable ? 'is-slide' : ''} ${mapNum < children.length && mapNum !== 0 ? 'is-map' : ''}`"
5
+ :class="`oxy-tabs ${customClass} ${innerSlidable ? 'is-slide' : ''} ${mapNum < children.length && mapNum !== 0 ? 'is-map' : ''} ${
6
+ fullscreen ? 'is-fullscreen' : ''
7
+ }`"
6
8
  :style="customStyle"
7
9
  >
8
10
  <oxy-sticky :offset-top="offsetTop">
@@ -14,17 +16,32 @@
14
16
  @click="handleSelect(index)"
15
17
  v-for="(item, index) in children"
16
18
  :key="index"
17
- :class="`oxy-tabs__nav-item ${state.activeIndex === index ? 'is-active' : ''} ${item.disabled ? 'is-disabled' : ''}`"
19
+ :class="`oxy-tabs__nav-item ${props.pills ? 'oxy-tabs__nav-item-pills' : ''} ${state.activeIndex === index ? 'is-active' : ''} ${
20
+ item.disabled ? 'is-disabled' : ''
21
+ }`"
18
22
  :style="state.activeIndex === index ? (color ? 'color:' + color : '') : inactiveColor ? 'color:' + inactiveColor : ''"
19
23
  >
20
24
  <oxy-badge v-if="item.badgeProps" v-bind="item.badgeProps">
21
- <text class="oxy-tabs__nav-item-text">{{ item.title }}</text>
25
+ <text
26
+ class="oxy-tabs__nav-item-text"
27
+ :style="props.pills && props.pillsColor && state.activeIndex === index ? 'background-color:' + props.pillsColor : ''"
28
+ >
29
+ {{ item.title }}
30
+ </text>
22
31
  </oxy-badge>
23
- <text v-else class="oxy-tabs__nav-item-text">{{ item.title }}</text>
24
-
25
- <view class="oxy-tabs__line oxy-tabs__line--inner" v-if="state.activeIndex === index && state.useInnerLine"></view>
32
+ <text
33
+ v-else
34
+ class="oxy-tabs__nav-item-text"
35
+ :style="props.pills && props.pillsColor && state.activeIndex === index ? 'background-color:' + props.pillsColor : ''"
36
+ >
37
+ {{ item.title }}
38
+ </text>
39
+ <view
40
+ class="oxy-tabs__line oxy-tabs__line--inner"
41
+ v-if="!props.pills && state.activeIndex === index && state.useInnerLine"
42
+ ></view>
26
43
  </view>
27
- <view class="oxy-tabs__line" :style="state.lineStyle"></view>
44
+ <view v-if="!props.pills" class="oxy-tabs__line" :style="state.lineStyle"></view>
28
45
  </view>
29
46
  </scroll-view>
30
47
  </view>
@@ -75,7 +92,11 @@
75
92
  </template>
76
93
 
77
94
  <template v-else>
78
- <view :class="`oxy-tabs ${customClass} ${innerSlidable ? 'is-slide' : ''} ${mapNum < children.length && mapNum !== 0 ? 'is-map' : ''}`">
95
+ <view
96
+ :class="`oxy-tabs ${customClass} ${innerSlidable ? 'is-slide' : ''} ${mapNum < children.length && mapNum !== 0 ? 'is-map' : ''} ${
97
+ fullscreen ? 'is-fullscreen' : ''
98
+ }`"
99
+ >
79
100
  <view class="oxy-tabs__nav">
80
101
  <view class="oxy-tabs__nav--wrap">
81
102
  <scroll-view :scroll-x="innerSlidable" scroll-with-animation :scroll-left="state.scrollLeft">
@@ -84,16 +105,29 @@
84
105
  v-for="(item, index) in children"
85
106
  @click="handleSelect(index)"
86
107
  :key="index"
87
- :class="`oxy-tabs__nav-item ${state.activeIndex === index ? 'is-active' : ''} ${item.disabled ? 'is-disabled' : ''}`"
108
+ :class="`oxy-tabs__nav-item ${props.pills ? 'oxy-tabs__nav-item-pills' : ''} ${state.activeIndex === index ? 'is-active' : ''} ${
109
+ item.disabled ? 'is-disabled' : ''
110
+ }`"
88
111
  :style="state.activeIndex === index ? (color ? 'color:' + color : '') : inactiveColor ? 'color:' + inactiveColor : ''"
89
112
  >
90
113
  <oxy-badge custom-class="oxy-tabs__nav-item-badge" v-if="item.badgeProps" v-bind="item.badgeProps">
91
- <text class="oxy-tabs__nav-item-text">{{ item.title }}</text>
114
+ <text
115
+ class="oxy-tabs__nav-item-text"
116
+ :style="props.pills && props.pillsColor && state.activeIndex === index ? 'background-color:' + props.pillsColor : ''"
117
+ >
118
+ {{ item.title }}
119
+ </text>
92
120
  </oxy-badge>
93
- <text v-else class="oxy-tabs__nav-item-text">{{ item.title }}</text>
94
- <view class="oxy-tabs__line oxy-tabs__line--inner" v-if="state.activeIndex === index && state.useInnerLine"></view>
121
+ <text
122
+ v-else
123
+ class="oxy-tabs__nav-item-text"
124
+ :style="props.pills && props.pillsColor && state.activeIndex === index ? 'background-color:' + props.pillsColor : ''"
125
+ >
126
+ {{ item.title }}
127
+ </text>
128
+ <view class="oxy-tabs__line oxy-tabs__line--inner" v-if="!props.pills && state.activeIndex === index && state.useInnerLine"></view>
95
129
  </view>
96
- <view class="oxy-tabs__line" :style="state.lineStyle"></view>
130
+ <view v-if="!props.pills" class="oxy-tabs__line" :style="state.lineStyle"></view>
97
131
  </view>
98
132
  </scroll-view>
99
133
  </view>
@@ -145,7 +179,7 @@ import OxyIcon from '../oxy-icon/oxy-icon.vue'
145
179
  import OxySticky from '../oxy-sticky/oxy-sticky.vue'
146
180
  import OxyStickyBox from '../oxy-sticky-box/oxy-sticky-box.vue'
147
181
  import { computed, getCurrentInstance, onMounted, watch, nextTick, reactive, type CSSProperties, type ComponentInstance } from 'vue'
148
- import { addUnit, checkNumRange, debounce, getRect, isDef, isNumber, isString, objToStyle } from '../common/util'
182
+ import { withDefaultUnit, checkNumRange, debounce, getRect, isDef, isNumber, isString, objToStyle, unitConvert } from '../common/util'
149
183
  import { useTouch } from '../composables/useTouch'
150
184
  import { TABS_KEY, tabsProps, type TabsExpose } from './types'
151
185
  import { useChildren } from '../composables/useChildren'
@@ -316,23 +350,23 @@ async function updateLineStyle(animation: boolean = true) {
316
350
  try {
317
351
  const lineStyle: CSSProperties = {}
318
352
  if (isDef(lineWidth)) {
319
- lineStyle.width = addUnit(lineWidth)
353
+ lineStyle.width = withDefaultUnit(lineWidth)
320
354
  } else {
321
355
  if (autoLineWidth) {
322
356
  const textRects = await getRect($itemText, true, proxy)
323
357
  const textWidth = Number(textRects[state.activeIndex].width)
324
- lineStyle.width = addUnit(textWidth)
358
+ lineStyle.width = unitConvert(textWidth, 0, { output: 'px' })
325
359
  }
326
360
  }
327
361
  if (isDef(lineHeight)) {
328
- lineStyle.height = addUnit(lineHeight)
329
- lineStyle.borderRadius = `calc(${addUnit(lineHeight)} / 2)`
362
+ lineStyle.height = withDefaultUnit(lineHeight)
363
+ lineStyle.borderRadius = `calc(${withDefaultUnit(lineHeight)} / 2)`
330
364
  }
331
365
  const rects = await getRect($item, true, proxy)
332
366
  const rect = rects[state.activeIndex]
333
367
  let left = rects.slice(0, state.activeIndex).reduce((prev, curr) => prev + Number(curr.width), 0) + Number(rect.width) / 2
334
368
  if (left) {
335
- lineStyle.transform = `translateX(${left}px) translateX(-50%)`
369
+ lineStyle.transform = `translateX(${unitConvert(left, 0, { output: 'px' })}) translateX(-50%)`
336
370
  if (animation) {
337
371
  lineStyle.transition = 'width 0.3s cubic-bezier(0.4, 0, 0.2, 1), transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);'
338
372
  }