hy-app 0.4.13 → 0.5.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 (211) hide show
  1. package/components/hy-action-sheet/hy-action-sheet.vue +155 -238
  2. package/components/hy-action-sheet/props.ts +68 -15
  3. package/components/hy-action-sheet/typing.d.ts +115 -115
  4. package/components/hy-address-picker/hy-address-picker.vue +185 -289
  5. package/components/hy-address-picker/props.ts +97 -21
  6. package/components/hy-address-picker/typing.d.ts +90 -89
  7. package/components/hy-avatar/hy-avatar.vue +121 -204
  8. package/components/hy-avatar/props.ts +76 -18
  9. package/components/hy-avatar/typing.d.ts +63 -62
  10. package/components/hy-back-top/hy-back-top.vue +65 -120
  11. package/components/hy-back-top/props.ts +57 -16
  12. package/components/hy-back-top/typing.d.ts +43 -42
  13. package/components/hy-badge/hy-badge.vue +66 -138
  14. package/components/hy-badge/props.ts +73 -17
  15. package/components/hy-badge/typing.d.ts +59 -58
  16. package/components/hy-button/hy-button.vue +226 -375
  17. package/components/hy-button/props.ts +129 -158
  18. package/components/hy-calendar/header.vue +48 -64
  19. package/components/hy-calendar/hy-calendar.vue +274 -438
  20. package/components/hy-calendar/month.vue +508 -516
  21. package/components/hy-calendar/props.ts +157 -35
  22. package/components/hy-calendar/typing.d.ts +129 -128
  23. package/components/hy-card/hy-card.vue +118 -240
  24. package/components/hy-card/index.scss +1 -2
  25. package/components/hy-card/props.ts +122 -27
  26. package/components/hy-card/typing.d.ts +119 -118
  27. package/components/hy-cell/hy-cell.vue +176 -258
  28. package/components/hy-cell/props.ts +71 -17
  29. package/components/hy-cell/typing.d.ts +87 -86
  30. package/components/hy-check-button/hy-check-button.vue +69 -139
  31. package/components/hy-check-button/props.ts +72 -18
  32. package/components/hy-check-button/typing.d.ts +74 -73
  33. package/components/hy-checkbox/hy-checkbox.vue +170 -263
  34. package/components/hy-checkbox/props.ts +94 -24
  35. package/components/hy-checkbox/typing.d.ts +72 -72
  36. package/components/hy-checkbox-group/hy-checkbox-group.vue +25 -100
  37. package/components/hy-checkbox-group/props.ts +80 -0
  38. package/components/hy-checkbox-group/typing.d.ts +65 -65
  39. package/components/hy-checkbox-item/hy-checkbox-item.vue +140 -177
  40. package/components/hy-checkbox-item/props.ts +24 -0
  41. package/components/hy-checkbox-item/typing.d.ts +4 -3
  42. package/components/hy-code-input/hy-code-input.vue +179 -262
  43. package/components/hy-code-input/props.ts +84 -18
  44. package/components/hy-code-input/typing.d.ts +71 -71
  45. package/components/hy-config-provider/hy-config-provider.vue +28 -50
  46. package/components/hy-config-provider/props.ts +26 -11
  47. package/components/hy-config-provider/typing.d.ts +20 -20
  48. package/components/hy-count-down/hy-count-down.vue +103 -131
  49. package/components/hy-count-down/props.ts +30 -8
  50. package/components/hy-count-down/typing.d.ts +25 -25
  51. package/components/hy-count-to/hy-count-to.vue +148 -213
  52. package/components/hy-count-to/props.ts +60 -15
  53. package/components/hy-count-to/typing.d.ts +46 -46
  54. package/components/hy-coupon/README.md +133 -0
  55. package/components/hy-coupon/hy-coupon.vue +180 -0
  56. package/components/hy-coupon/index.scss +553 -0
  57. package/components/hy-coupon/props.ts +129 -0
  58. package/components/hy-coupon/typing.d.ts +146 -0
  59. package/components/hy-datetime-picker/hy-datetime-picker.vue +415 -580
  60. package/components/hy-datetime-picker/props.ts +142 -32
  61. package/components/hy-datetime-picker/typing.d.ts +132 -132
  62. package/components/hy-divider/hy-divider.vue +90 -169
  63. package/components/hy-divider/props.ts +78 -19
  64. package/components/hy-divider/typing.d.ts +60 -60
  65. package/components/hy-dropdown/hy-dropdown.vue +37 -71
  66. package/components/hy-dropdown/props.ts +38 -15
  67. package/components/hy-dropdown/typing.d.ts +44 -44
  68. package/components/hy-dropdown-item/hy-dropdown-item.vue +141 -173
  69. package/components/hy-dropdown-item/props.ts +19 -8
  70. package/components/hy-empty/hy-empty.vue +75 -129
  71. package/components/hy-empty/props.ts +57 -15
  72. package/components/hy-empty/typing.d.ts +84 -84
  73. package/components/hy-flex/hy-flex.vue +33 -88
  74. package/components/hy-flex/props.ts +58 -0
  75. package/components/hy-flex/typing.d.ts +14 -16
  76. package/components/hy-float-button/hy-float-button.vue +289 -406
  77. package/components/hy-float-button/props.ts +109 -25
  78. package/components/hy-folding-panel/hy-folding-panel.vue +86 -374
  79. package/components/hy-folding-panel/props.ts +40 -15
  80. package/components/hy-folding-panel/typing.d.ts +52 -63
  81. package/components/hy-folding-panel-item/hy-folding-panel-item.vue +186 -228
  82. package/components/hy-folding-panel-item/index.scss +87 -0
  83. package/components/hy-folding-panel-item/props.ts +81 -0
  84. package/components/hy-folding-panel-item/typing.d.ts +23 -0
  85. package/components/hy-form/hy-form.vue +172 -212
  86. package/components/hy-form/props.ts +37 -0
  87. package/components/hy-form/typing.d.ts +68 -61
  88. package/components/hy-form-group/typing.d.ts +74 -74
  89. package/components/hy-form-item/hy-form-item.vue +100 -129
  90. package/components/hy-form-item/props.ts +25 -0
  91. package/components/hy-form-item/typing.d.ts +40 -37
  92. package/components/hy-grid/hy-grid.vue +76 -132
  93. package/components/hy-grid/props.ts +58 -16
  94. package/components/hy-grid/typing.d.ts +66 -66
  95. package/components/hy-icon/hy-icon.vue +84 -161
  96. package/components/hy-icon/props.ts +76 -22
  97. package/components/hy-icon/typing.d.ts +83 -82
  98. package/components/hy-image/hy-image.vue +142 -272
  99. package/components/hy-image/props.ts +105 -23
  100. package/components/hy-image/typing.d.ts +84 -87
  101. package/components/hy-input/hy-input.vue +230 -421
  102. package/components/hy-input/props.ts +183 -35
  103. package/components/hy-input/typing.d.ts +169 -169
  104. package/components/hy-line/hy-line.vue +34 -72
  105. package/components/hy-line/props.ts +41 -10
  106. package/components/hy-line/typing.d.ts +29 -29
  107. package/components/hy-line-progress/hy-line-progress.vue +66 -101
  108. package/components/hy-line-progress/props.ts +31 -10
  109. package/components/hy-line-progress/typing.d.ts +29 -29
  110. package/components/hy-list/hy-list.vue +151 -220
  111. package/components/hy-list/props.ts +67 -16
  112. package/components/hy-list/typing.d.ts +52 -52
  113. package/components/hy-loading/hy-loading.vue +63 -119
  114. package/components/hy-loading/props.ts +63 -15
  115. package/components/hy-loading/typing.d.ts +49 -49
  116. package/components/hy-menu/hy-menu.vue +124 -166
  117. package/components/hy-menu/props.ts +42 -10
  118. package/components/hy-menu/typing.d.ts +60 -60
  119. package/components/hy-modal/hy-modal.vue +127 -218
  120. package/components/hy-modal/props.ts +89 -24
  121. package/components/hy-navbar/hy-navbar.vue +104 -177
  122. package/components/hy-navbar/props.ts +76 -22
  123. package/components/hy-navbar/typing.d.ts +81 -81
  124. package/components/hy-notice-bar/hy-notice-bar.vue +67 -144
  125. package/components/hy-notice-bar/props.ts +80 -19
  126. package/components/hy-notice-bar/typing.d.ts +62 -62
  127. package/components/hy-notify/hy-notify.vue +128 -177
  128. package/components/hy-notify/props.ts +49 -12
  129. package/components/hy-notify/typing.d.ts +45 -41
  130. package/components/hy-number-step/hy-number-step.vue +281 -394
  131. package/components/hy-number-step/props.ts +110 -27
  132. package/components/hy-number-step/typing.d.ts +120 -120
  133. package/components/hy-overlay/hy-overlay.vue +39 -66
  134. package/components/hy-overlay/props.ts +31 -8
  135. package/components/hy-pagination/hy-pagination.vue +100 -155
  136. package/components/hy-pagination/props.ts +53 -13
  137. package/components/hy-picker/hy-picker.vue +309 -430
  138. package/components/hy-picker/index.scss +8 -12
  139. package/components/hy-picker/props.ts +110 -26
  140. package/components/hy-popover/hy-popover.vue +190 -252
  141. package/components/hy-popover/props.ts +48 -10
  142. package/components/hy-popup/hy-popup.vue +162 -248
  143. package/components/hy-popup/props.ts +82 -18
  144. package/components/hy-price/hy-price.vue +45 -104
  145. package/components/hy-price/props.ts +52 -12
  146. package/components/hy-price/typing.d.ts +41 -36
  147. package/components/hy-qrcode/hy-qrcode.vue +115 -185
  148. package/components/hy-qrcode/props.ts +68 -18
  149. package/components/hy-qrcode/typing.d.ts +67 -66
  150. package/components/hy-radio/hy-radio.vue +161 -259
  151. package/components/hy-radio/props.ts +95 -25
  152. package/components/hy-radio/typing.d.ts +85 -84
  153. package/components/hy-rate/hy-rate.vue +185 -270
  154. package/components/hy-rate/props.ts +76 -18
  155. package/components/hy-rate/typing.d.ts +61 -60
  156. package/components/hy-read-more/hy-read-more.vue +93 -136
  157. package/components/hy-read-more/props.ts +43 -13
  158. package/components/hy-scroll-list/hy-scroll-list.vue +81 -102
  159. package/components/hy-scroll-list/props.ts +22 -11
  160. package/components/hy-search/hy-search.vue +155 -284
  161. package/components/hy-search/props.ts +130 -25
  162. package/components/hy-signature/hy-signature.vue +491 -635
  163. package/components/hy-signature/props.ts +115 -26
  164. package/components/hy-signature/typing.d.ts +138 -138
  165. package/components/hy-slider/hy-slider.vue +388 -477
  166. package/components/hy-slider/props.ts +75 -19
  167. package/components/hy-steps/hy-steps.vue +212 -279
  168. package/components/hy-steps/props.ts +47 -13
  169. package/components/hy-submit-bar/hy-submit-bar.vue +137 -222
  170. package/components/hy-submit-bar/props.ts +89 -20
  171. package/components/hy-submit-bar/typing.d.ts +86 -85
  172. package/components/hy-subsection/hy-subsection.vue +132 -185
  173. package/components/hy-subsection/props.ts +50 -17
  174. package/components/hy-subsection/typing.d.ts +52 -52
  175. package/components/hy-swipe-action/hy-swipe-action.vue +228 -283
  176. package/components/hy-swipe-action/props.ts +43 -18
  177. package/components/hy-swipe-action/typing.d.ts +46 -46
  178. package/components/hy-swiper/hy-swiper.vue +159 -286
  179. package/components/hy-swiper/props.ts +126 -28
  180. package/components/hy-swiper/typing.d.ts +115 -115
  181. package/components/hy-switch/hy-switch.vue +112 -176
  182. package/components/hy-switch/props.ts +60 -15
  183. package/components/hy-switch/typing.d.ts +63 -63
  184. package/components/hy-tabBar/hy-tabBar.vue +64 -60
  185. package/components/hy-tabs/hy-tabs.vue +277 -380
  186. package/components/hy-tabs/props.ts +75 -18
  187. package/components/hy-tag/hy-tag.vue +111 -204
  188. package/components/hy-tag/props.ts +81 -19
  189. package/components/hy-text/hy-text.vue +200 -322
  190. package/components/hy-text/props.ts +107 -28
  191. package/components/hy-textarea/hy-textarea.vue +147 -256
  192. package/components/hy-textarea/props.ts +112 -25
  193. package/components/hy-textarea/typing.d.ts +42 -42
  194. package/components/hy-toast/hy-toast.vue +135 -143
  195. package/components/hy-tooltip/hy-tooltip.vue +220 -306
  196. package/components/hy-tooltip/props.ts +79 -15
  197. package/components/hy-transition/hy-transition.vue +111 -138
  198. package/components/hy-transition/props.ts +30 -8
  199. package/components/hy-upload/hy-upload.vue +320 -469
  200. package/components/hy-upload/props.ts +130 -27
  201. package/components/hy-warn/hy-warn.vue +80 -129
  202. package/components/hy-warn/props.ts +47 -12
  203. package/components/hy-waterfall/hy-waterfall.vue +139 -163
  204. package/components/hy-waterfall/props.ts +19 -7
  205. package/components/hy-watermark/hy-watermark.vue +762 -870
  206. package/components/hy-watermark/props.ts +103 -22
  207. package/global.d.ts +2 -0
  208. package/libs/css/theme.scss +3 -3
  209. package/package.json +2 -2
  210. package/web-types.json +1 -1
  211. package/components/hy-folding-panel/index.scss +0 -9
@@ -1,68 +1,57 @@
1
- import type { CSSProperties } from 'vue'
2
- import type { CellContentVo } from '../hy-cell/typing'
1
+ import type { Ref, ToRefs } from 'vue'
3
2
 
4
- export interface PanelVo extends CellContentVo {
5
- /**
6
- * @description 是否展示
7
- * */
8
- spread?: boolean
9
- /**
10
- * @description 展示面板里自定义值
11
- * */
12
- content?: string
3
+ // 折叠面板组组件的Props接口
4
+ export interface HyFoldingPanelGroupProps {
5
+ /**
6
+ * 当前激活的面板索引,支持v-model
7
+ */
8
+ modelValue?: number
9
+ /**
10
+ * 是否手风琴模式,默认false
11
+ */
12
+ accordion?: boolean
13
+ /**
14
+ * 是否禁用整个折叠面板组
15
+ */
16
+ disabled?: boolean
17
+ /**
18
+ * 是否显示边框,默认true
19
+ */
20
+ border?: boolean
21
+ /**
22
+ * 面板大小 large, medium, small
23
+ */
24
+ size?: HyApp.SizeType
13
25
  }
14
- export default interface HyFoldingPanelProps {
15
- /**
16
- * @description 数据集
17
- * */
18
- list: PanelVo[]
19
- /**
20
- * @description 是否手风琴模式( 默认 false )
21
- * */
22
- accordion?: boolean
23
- /**
24
- * @description 头部标题
25
- * */
26
- title?: string
27
- /**
28
- * @description 是否显示头部底部边框
29
- * */
30
- titleBorder?: boolean
31
- /**
32
- * @description 是否显示cell下边框 (默认 true )
33
- * */
34
- border?: boolean
35
- /**
36
- * @description 标题前缀竖线颜色
37
- * */
38
- verticalColor?: string
39
- /**
40
- * @description 是否显示标题前缀竖线
41
- * */
42
- showVertical?: boolean
43
- /**
44
- * @description 是否禁用(默认false)
45
- * */
46
- disabled?: boolean
47
- /**
48
- * @description 单元的大小,可选值为 large,medium,small
49
- * */
50
- size?: HyApp.SizeType
51
- /**
52
- * @description 内容面板高度
53
- * */
54
- contentHeight?: string | number
55
- /**
56
- * @description 定义需要用到的外部样式
57
- * */
58
- customStyle?: CSSProperties
26
+
27
+ // 父组件提供给子组件的配置接口
28
+ export interface HyFoldingPanelGroupConfig extends ToRefs<HyFoldingPanelGroupProps> {
29
+ /**
30
+ * 当前激活的索引
31
+ */
32
+ activeIndex: Ref<number | string>
33
+ /**
34
+ * 更新激活索引的方法
35
+ */
36
+ updateActiveIndex: (index: number | string) => void
59
37
  }
60
38
 
61
- export interface IFoldingPanel {
62
- /** 打开面板触发 */
63
- (e: 'open', temp: PanelVo, index: number): void
64
- /** 关闭面板触发 */
65
- (e: 'close', temp: PanelVo, index: number): void
66
- /** 改成面板开关状态触发 */
67
- (e: 'change', temp: PanelVo, index: number): void
39
+ // 折叠面板组组件的事件接口
40
+ export interface IFoldingPanelGroupEmits {
41
+ /**
42
+ * v-model 同步事件
43
+ */
44
+ (e: 'update:modelValue', value: number | string): void
45
+ /**
46
+ * 面板状态改变时触发
47
+ */
48
+ (e: 'change', index: number | string): void
49
+ /**
50
+ * 面板打开时触发
51
+ */
52
+ (e: 'open', index: number | string): void
53
+ /**
54
+ * 面板关闭时触发
55
+ */
56
+ (e: 'close', index: number | string): void
68
57
  }
@@ -1,228 +1,186 @@
1
- <template>
2
- <view class="hy-folding-panel-item">
3
- <HyCell
4
- :title="title"
5
- :value="value"
6
- :icon="icon"
7
- :border="border"
8
- :size="size"
9
- :disabled="disabled"
10
- :clickable="!disabled"
11
- @click="handleClick"
12
- >
13
- <template #icon="{ icon }">
14
- <slot name="icon" :icon="icon"></slot>
15
- </template>
16
- <template #title="{ title }">
17
- <slot name="title" :title="title">{{ title }}</slot>
18
- </template>
19
- <template #value="{ value }">
20
- <slot name="value" :value="value">
21
- <text v-if="value">{{ value }}</text>
22
- <text v-else class="hy-folding-panel-item__arrow" :class="{ 'hy-folding-panel-item__arrow--up': spread }">
23
- {{ spread ? '↑' : '↓' }}
24
- </text>
25
- </slot>
26
- </template>
27
- <template #bottom>
28
- <transition name="hy-folding-panel-item__transition">
29
- <view
30
- v-show="spread"
31
- class="hy-folding-panel-item__content"
32
- :style="[
33
- customStyle,
34
- { height: contentHeight }
35
- ]"
36
- >
37
- <slot />
38
- </view>
39
- </transition>
40
- <HyLine v-if="spread && showBottomLine" />
41
- </template>
42
- </HyCell>
43
- </view>
44
- </template>
45
-
46
- <script lang="ts">
47
- export default {
48
- name: "hy-folding-panel-item",
49
- options: {
50
- addGlobalClass: true,
51
- virtualHost: true,
52
- styleIsolation: "shared",
53
- },
54
- };
55
- </script>
56
-
57
- <script setup lang="ts">
58
- import { ref, computed, watch, onMounted, inject } from "vue";
59
- import type { CSSProperties } from "vue";
60
- import { addUnit } from "../../libs";
61
- import HyCell from "../hy-cell/hy-cell.vue";
62
- import HyLine from "../hy-line/hy-line.vue";
63
-
64
- interface IProps {
65
- /** 标题 */
66
- title?: string;
67
- /** 标题左侧的图标 */
68
- icon?: string;
69
- /** 右侧的值 */
70
- value?: string;
71
- /** 是否显示下边框 */
72
- border?: boolean;
73
- /** 单元的大小 */
74
- size?: "large" | "medium" | "small";
75
- /** 是否禁用 */
76
- disabled?: boolean;
77
- /** 内容面板高度 */
78
- contentHeight?: string | number;
79
- /** 是否默认展开 */
80
- defaultOpen?: boolean;
81
- /** 是否显示底部线条 */
82
- showBottomLine?: boolean;
83
- /** 定义需要用到的外部样式 */
84
- customStyle?: CSSProperties;
85
- /** 面板索引(由父组件提供) */
86
- index?: number;
87
- }
88
-
89
- const props = withDefaults(defineProps<IProps>(), {
90
- title: "",
91
- icon: "",
92
- value: "",
93
- border: true,
94
- size: "medium",
95
- disabled: false,
96
- contentHeight: 120,
97
- defaultOpen: false,
98
- showBottomLine: true,
99
- customStyle: () => ({}),
100
- index: -1,
101
- });
102
-
103
- const emit = defineEmits<{
104
- (e: "click", value: boolean): void;
105
- (e: "open"): void;
106
- (e: "close"): void;
107
- // 用于手风琴模式的特殊事件
108
- (e: "child-click", index: number, isOpen: boolean): void;
109
- }>();
110
-
111
- // 尝试从父组件注入手风琴模式配置
112
- const accordion = inject<boolean>('hy-folding-panel-accordion', false);
113
-
114
- const spread = ref(props.defaultOpen);
115
- const contentHeight = computed(() => {
116
- return typeof props.contentHeight === 'number'
117
- ? `${props.contentHeight}px`
118
- : props.contentHeight;
119
- });
120
-
121
- // 监听默认展开状态
122
- watch(
123
- () => props.defaultOpen,
124
- (newValue) => {
125
- spread.value = newValue;
126
- },
127
- { immediate: true }
128
- );
129
-
130
- // 处理点击事件
131
- const handleClick = () => {
132
- if (props.disabled) return;
133
-
134
- spread.value = !spread.value;
135
- emit("click", spread.value);
136
-
137
- // 向父组件通知子组件点击事件(用于手风琴模式)
138
- if (props.index >= 0) {
139
- emit('child-click', props.index, spread.value);
140
- }
141
-
142
- if (spread.value) {
143
- emit("open");
144
- } else {
145
- emit("close");
146
- }
147
- };
148
-
149
- // 提供给父组件控制展开/收起的方法
150
- defineExpose({
151
- open: () => {
152
- if (!props.disabled && !spread.value) {
153
- spread.value = true;
154
- emit("click", true);
155
- emit("open");
156
-
157
- // 通知父组件
158
- if (props.index >= 0) {
159
- emit('child-click', props.index, true);
160
- }
161
- }
162
- },
163
- close: () => {
164
- if (!props.disabled && spread.value) {
165
- spread.value = false;
166
- emit("click", false);
167
- emit("close");
168
-
169
- // 通知父组件
170
- if (props.index >= 0) {
171
- emit('child-click', props.index, false);
172
- }
173
- }
174
- },
175
- toggle: () => {
176
- handleClick();
177
- },
178
- getSpread: () => spread.value,
179
- });
180
-
181
- // 组件挂载时,如果是手风琴模式且默认打开,通知父组件
182
- onMounted(() => {
183
- if (spread.value && accordion && props.index >= 0) {
184
- emit('child-click', props.index, true);
185
- }
186
- });
187
- </script>
188
-
189
- <style lang="scss" scoped>
190
- @import "./index.scss";
191
-
192
- .hy-folding-panel-item {
193
- &__arrow {
194
- font-size: 16px;
195
- color: #999;
196
- transition: transform 0.3s;
197
-
198
- &--up {
199
- transform: rotate(0deg);
200
- }
201
- }
202
-
203
- &__content {
204
- padding: 12px 16px;
205
- box-sizing: border-box;
206
- overflow: hidden;
207
- background-color: #f8f8f8;
208
- }
209
-
210
- &__transition-enter-active,
211
- &__transition-leave-active {
212
- transition: all 0.3s ease;
213
- overflow: hidden;
214
- }
215
-
216
- &__transition-enter-from,
217
- &__transition-leave-to {
218
- opacity: 0;
219
- max-height: 0;
220
- }
221
-
222
- &__transition-enter-to,
223
- &__transition-leave-from {
224
- opacity: 1;
225
- max-height: 1000px; /* 足够大的值,确保内容能完全展开 */
226
- }
227
- }
228
- </style>
1
+ <template>
2
+ <view
3
+ class="hy-folding-panel-item"
4
+ :class="{
5
+ 'hy-folding-panel-item--disabled': groupConfig?.disabled?.value || disabled,
6
+ 'is-active': isExpanded,
7
+ 'hy-folding-panel-item--border': groupConfig?.border?.value
8
+ }"
9
+ >
10
+ <!-- 面板头部 -->
11
+ <view
12
+ :class="[
13
+ 'hy-folding-panel-item__header',
14
+ `hy-folding-panel-item--${groupConfig?.size?.value}`
15
+ ]"
16
+ @click="handleClick"
17
+ >
18
+ <slot v-if="$slots.header" name="header"></slot>
19
+ <template v-else>
20
+ <view class="hy-folding-panel-item__left">
21
+ <slot v-if="$slots.title" name="title"></slot>
22
+ <template v-else>
23
+ <!-- 图标 -->
24
+ <view v-if="icon" class="hy-folding-panel-item__icon">
25
+ <hy-icon v-if="icon" :src="icon" :color="iconColor" :size="iconSize" />
26
+ </view>
27
+ <!-- 标题 -->
28
+ <text class="hy-folding-panel-item__title">{{ title }}</text>
29
+ </template>
30
+ </view>
31
+ <view class="hy-folding-panel-item__right">
32
+ <!-- 右侧值 -->
33
+ <text v-if="value" class="hy-folding-panel-item__value">{{ value }}</text>
34
+ <!-- 箭头 -->
35
+ <view
36
+ class="hy-folding-panel-item__arrow"
37
+ :class="{ 'hy-folding-panel-item__arrow--up': isExpanded }"
38
+ >
39
+ <hy-icon :name="IconConfig.DOWN"></hy-icon>
40
+ </view>
41
+ </view>
42
+ </template>
43
+ </view>
44
+
45
+ <!-- 面板内容 -->
46
+ <view
47
+ class="hy-folding-panel-item__content"
48
+ :style="[
49
+ customStyle,
50
+ {
51
+ height: isExpanded ? (contentHeight ? addUnit(contentHeight) : 'auto') : '0px',
52
+ overflow: 'hidden'
53
+ }
54
+ ]"
55
+ >
56
+ <slot v-if="$slots.default"></slot>
57
+ <text v-else>{{ content || '' }}</text>
58
+ </view>
59
+ </view>
60
+ </template>
61
+
62
+ <script lang="ts">
63
+ export default {
64
+ name: 'hy-folding-panel-item'
65
+ }
66
+ </script>
67
+
68
+ <script setup lang="ts">
69
+ import { ref, computed, inject, onMounted } from 'vue'
70
+ import type { HyFoldingPanelItemEmits } from './typing'
71
+ import type { HyFoldingPanelGroupConfig } from '../hy-folding-panel/typing'
72
+ import { addUnit, IconConfig } from '../../libs'
73
+ import foldingPanelItemProps from './props'
74
+ // 组件
75
+ import HyIcon from '../hy-icon/hy-icon.vue'
76
+
77
+ /**
78
+ * 折叠面板项组件
79
+ * 用于展示可展开/折叠的单个面板项
80
+ * @displayName hy-folding-panel-item
81
+ */
82
+
83
+ const props = defineProps(foldingPanelItemProps)
84
+
85
+ // 事件定义
86
+ const emit = defineEmits<IFoldingPanelItemEmits>()
87
+
88
+ // 尝试从父组件注入配置
89
+ const groupConfig = inject<HyFoldingPanelGroupConfig>('hy-folding-panel')
90
+
91
+ // 内部展开状态
92
+ const expanded = ref(props.defaultOpen)
93
+
94
+ // 计算当前是否展开
95
+ const isExpanded = computed(() => {
96
+ if (groupConfig?.accordion?.value) {
97
+ console.log(groupConfig.activeIndex.value, props.index)
98
+ // 如果在group中,根据group的activeIndex判断
99
+ return groupConfig.activeIndex.value === props.index
100
+ }
101
+ // 独立使用时,使用内部状态
102
+ return expanded.value
103
+ })
104
+
105
+ // 处理点击事件
106
+ const handleClick = () => {
107
+ if (props.disabled) return
108
+ console.log(groupConfig?.accordion?.value)
109
+
110
+ if (groupConfig?.accordion?.value) {
111
+ // 在group中时,通知group更新激活索引
112
+ groupConfig.updateActiveIndex(props.index)
113
+ emit('child-click', props.index)
114
+ } else {
115
+ // 独立使用时,切换内部状态
116
+ expanded.value = !expanded.value
117
+ }
118
+
119
+ // 触发事件
120
+ emit('click', props.index)
121
+ if (isExpanded.value) {
122
+ emit('close', props.index)
123
+ } else {
124
+ emit('open', props.index)
125
+ }
126
+ emit('change', !isExpanded.value, props.index)
127
+ }
128
+
129
+ // 对外暴露的方法
130
+ defineExpose({
131
+ /**
132
+ * 打开面板
133
+ */
134
+ open: () => {
135
+ if (props.disabled) return
136
+
137
+ if (groupConfig) {
138
+ groupConfig.activeIndex.value = props.index
139
+ } else {
140
+ expanded.value = true
141
+ }
142
+ emit('open', props.index)
143
+ emit('change', true, props.index)
144
+ },
145
+
146
+ /**
147
+ * 关闭面板
148
+ */
149
+ close: () => {
150
+ if (groupConfig) {
151
+ if (groupConfig?.accordion?.value) {
152
+ groupConfig.activeIndex.value = -1
153
+ }
154
+ } else {
155
+ expanded.value = false
156
+ }
157
+ emit('close', props.index)
158
+ emit('change', false, props.index)
159
+ },
160
+
161
+ /**
162
+ * 切换面板状态
163
+ */
164
+ toggle: () => {
165
+ handleClick()
166
+ },
167
+
168
+ /**
169
+ * 获取当前展开状态
170
+ */
171
+ getExpanded: () => {
172
+ return isExpanded.value
173
+ }
174
+ })
175
+
176
+ // 初始化时如果默认打开且在group中,通知group
177
+ onMounted(() => {
178
+ if (props.defaultOpen && groupConfig && props.index !== -1) {
179
+ groupConfig.updateActiveIndex(props.index)
180
+ }
181
+ })
182
+ </script>
183
+
184
+ <style lang="scss" scoped>
185
+ @import './index.scss';
186
+ </style>
@@ -0,0 +1,87 @@
1
+ @use "../../libs/css/theme.scss" as *;
2
+ @use "../../libs/css/mixin.scss" as *;
3
+
4
+ @include b(folding-panel-item) {
5
+ position: relative;
6
+ width: 100%;
7
+
8
+ @include m(disabled) {
9
+ opacity: 0.6;
10
+ pointer-events: none;
11
+ }
12
+
13
+ @include is(active) {
14
+ background-color: $hy-background--active;
15
+ }
16
+
17
+ @include m(border) {
18
+ border-bottom: $hy-border-line;
19
+
20
+ &:last-child {
21
+ border-bottom: none;
22
+ }
23
+ }
24
+
25
+ @include m(large) {
26
+ padding: $hy-border-margin-padding-lg;
27
+ font-size: $hy-font-size-lg;
28
+ }
29
+
30
+ @include m(medium) {
31
+ padding: $hy-border-margin-padding-base;
32
+ font-size: $hy-font-size-base;
33
+ }
34
+
35
+ @include m(small) {
36
+ padding: $hy-border-margin-padding-sm;
37
+ font-size: $hy-font-size-sm;
38
+ }
39
+
40
+ @include e(header) {
41
+ display: flex;
42
+ justify-content: space-between;
43
+ align-items: center;
44
+ transition: background-color 0.2s;
45
+ background: $hy-background--container;
46
+
47
+ @include pseudo(active) {
48
+ background-color: $hy-background--hover;
49
+ }
50
+ }
51
+
52
+ @include e(left) {
53
+ display: flex;
54
+ align-items: center;
55
+ flex: 1;
56
+ }
57
+
58
+ @include e(title) {
59
+ font-weight: 500;
60
+ flex: 1;
61
+ }
62
+
63
+ @include e(right) {
64
+ display: flex;
65
+ align-items: center;
66
+ }
67
+
68
+ @include e(value) {
69
+ font-size: 13px;
70
+ color: $hy-text-color--grey;
71
+ margin-right: 8px;
72
+ }
73
+
74
+ @include e(arrow) {
75
+ transition: transform 0.3s;
76
+
77
+ @include m(up) {
78
+ transform: rotate(180deg);
79
+ }
80
+ }
81
+
82
+ @include e(content) {
83
+ background-color: transparent;
84
+ transition: height 0.3s ease;
85
+ box-sizing: border-box;
86
+ }
87
+ }