@uxda/appkit 4.0.3 → 4.0.14

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 (116) hide show
  1. package/.eslintrc.mjs +7 -7
  2. package/README.md +187 -187
  3. package/babel.config.js +12 -12
  4. package/package.json +75 -80
  5. package/project.config.json +15 -15
  6. package/project.tt.json +13 -13
  7. package/rollup.config.mjs +56 -56
  8. package/src/Appkit.ts +65 -65
  9. package/src/balance/api/endpoints.ts +126 -126
  10. package/src/balance/api/index.ts +82 -82
  11. package/src/balance/components/AccountView.vue +748 -748
  12. package/src/balance/components/BalanceCard.vue +205 -209
  13. package/src/balance/components/BalanceReminder.vue +85 -85
  14. package/src/balance/components/ConsumptionFilter.vue +218 -218
  15. package/src/balance/components/ConsumptionRules.vue +68 -68
  16. package/src/balance/components/DateFilter.vue +227 -226
  17. package/src/balance/components/DateRange.vue +78 -0
  18. package/src/balance/components/ListFilter.vue +64 -0
  19. package/src/balance/components/ListFilterPicker.vue +187 -0
  20. package/src/balance/components/SecondBalance.vue +71 -71
  21. package/src/balance/components/Tip.vue +45 -45
  22. package/src/balance/components/index.ts +13 -9
  23. package/src/balance/types.ts +91 -90
  24. package/src/components/bt-cropper/index.vue +774 -774
  25. package/src/components/bt-cropper/utils/calcCropper.js +42 -42
  26. package/src/components/bt-cropper/utils/calcImagePosition.js +23 -23
  27. package/src/components/bt-cropper/utils/calcImageSize.js +37 -37
  28. package/src/components/bt-cropper/utils/calcPointDistance.js +12 -12
  29. package/src/components/bt-cropper/utils/calcRightAndBottom.js +7 -7
  30. package/src/components/bt-cropper/utils/ratio.js +3 -3
  31. package/src/components/bt-cropper/utils/tools.js +25 -25
  32. package/src/components/dd-area/index.vue +225 -225
  33. package/src/components/dd-icon/doc.md +21 -21
  34. package/src/components/dd-icon/index.vue +23 -23
  35. package/src/components/dd-notice-bar/index.vue +78 -78
  36. package/src/components/dd-search/doc.md +34 -34
  37. package/src/components/dd-search/index.vue +168 -168
  38. package/src/components/dd-selector/index.vue +124 -124
  39. package/src/components/dd-skeleton/doc.md +19 -19
  40. package/src/components/dd-skeleton/index.vue +36 -36
  41. package/src/components/ocr-id/index.vue +114 -114
  42. package/src/components/ocr-id/types.d.ts +12 -12
  43. package/src/global.ts +6 -6
  44. package/src/index.ts +89 -89
  45. package/src/main.scss +1 -1
  46. package/src/notice/api/endpoints.ts +17 -17
  47. package/src/notice/api/index.ts +82 -82
  48. package/src/notice/components/NoticeBanner.vue +243 -243
  49. package/src/notice/components/NoticeEntry.vue +99 -99
  50. package/src/notice/components/NoticeList.vue +315 -315
  51. package/src/notice/components/NoticePopup.vue +161 -161
  52. package/src/notice/components/index.ts +5 -5
  53. package/src/notice/components/useCommonList.ts +86 -86
  54. package/src/notice/components/useNotice.ts +35 -35
  55. package/src/notice/index.ts +1 -1
  56. package/src/notice/types.ts +25 -25
  57. package/src/payment/api/config.ts +7 -7
  58. package/src/payment/api/endpoints.ts +103 -103
  59. package/src/payment/api/index.ts +71 -71
  60. package/src/payment/components/AmountPicker.vue +93 -93
  61. package/src/payment/components/RechargeResult.vue +69 -69
  62. package/src/payment/components/RechargeView.vue +154 -154
  63. package/src/payment/components/RightsPicker.vue +105 -105
  64. package/src/payment/components/TradeView.vue +298 -298
  65. package/src/payment/components/UserAgreement.vue +234 -234
  66. package/src/payment/components/index.ts +22 -22
  67. package/src/payment/index.ts +5 -5
  68. package/src/payment/services/index.ts +16 -16
  69. package/src/payment/services/invoke-recharge.ts +25 -25
  70. package/src/payment/services/request-payment.ts +58 -58
  71. package/src/payment/types.ts +28 -28
  72. package/src/register/components/SelfRegistration.vue +254 -254
  73. package/src/register/components/index.ts +2 -2
  74. package/src/shared/components/AppDrawer.vue +58 -58
  75. package/src/shared/components/AppVerify.vue +98 -0
  76. package/src/shared/components/DeviceVersion.vue +68 -68
  77. package/src/shared/components/EmptyView.vue +33 -33
  78. package/src/shared/components/OcrIcon.vue +119 -0
  79. package/src/shared/components/PageHeader.vue +79 -79
  80. package/src/shared/components/index.ts +7 -5
  81. package/src/shared/composables/index.ts +7 -5
  82. package/src/shared/composables/useCountdown.ts +46 -46
  83. package/src/shared/composables/useCrypto.ts +76 -0
  84. package/src/shared/composables/useDragBox.ts +97 -97
  85. package/src/shared/composables/useEncode.ts +43 -43
  86. package/src/shared/composables/useSafeArea.ts +46 -46
  87. package/src/shared/composables/useTabbar.ts +24 -24
  88. package/src/shared/composables/useUpload.ts +55 -0
  89. package/src/shared/composables/useValidator.ts +31 -31
  90. package/src/shared/http/Http.ts +136 -136
  91. package/src/shared/http/index.ts +1 -1
  92. package/src/shared/http/types.ts +157 -157
  93. package/src/shared/index.ts +3 -3
  94. package/src/shared/weixin/payment.ts +38 -38
  95. package/src/styles/fonts.scss +2 -2
  96. package/src/styles/vars.scss +3 -3
  97. package/src/user/api/endpoints.ts +17 -17
  98. package/src/user/api/index.ts +87 -87
  99. package/src/user/components/LoginSetting.vue +114 -114
  100. package/src/user/components/UserBinding.vue +307 -307
  101. package/src/user/components/UserBindingSuccess.vue +80 -80
  102. package/src/user/components/UserEntry.vue +137 -142
  103. package/src/user/components/UserFeedback.vue +440 -440
  104. package/src/user/components/UserFeedbackEntry.vue +192 -192
  105. package/src/user/components/UserHeadCrop.vue +65 -65
  106. package/src/user/components/UserInfo.vue +632 -632
  107. package/src/user/components/UserResourceEmpty.vue +75 -75
  108. package/src/user/components/index.ts +21 -21
  109. package/src/user/index.ts +1 -1
  110. package/tsconfig.json +30 -30
  111. package/types/global.d.ts +21 -21
  112. package/types/vue.d.ts +10 -10
  113. package/dist/appkit.css +0 -2331
  114. package/dist/assets/asset-3B_CoPto +0 -1
  115. package/dist/assets/asset-DcH8Kg-2 +0 -1
  116. package/dist/index.js +0 -7176
@@ -1,225 +1,225 @@
1
- <!--* NAME: index-->
2
- <!--* AUTHOR: yanglong-->
3
- <!--* UPDATE: 2022-02-21 17:43-->
4
- <!--* TIP: 微信原生实现多列选择器-->
5
- <script setup lang="ts">
6
- import { computed, ref, watch } from 'vue'
7
- import Taro from '@tarojs/taro'
8
- import DdIcon from '../dd-icon/index.vue'
9
-
10
- interface AreaItem {
11
- value: string
12
- shortId: string
13
- label: string
14
- children: AreaItem[]
15
- }
16
-
17
- export type AreaType = 'province' | 'city' | 'region'
18
-
19
- export interface PropsType {
20
- value?: string // 地址code
21
- rightIcon?: boolean
22
- placeholder?: string
23
- disabled?: boolean
24
- type?: AreaType
25
- formatter?: (values: AreaItem[]) => string
26
- }
27
-
28
- const props = withDefaults(defineProps<PropsType>(), {
29
- value: '',
30
- rightIcon: true,
31
- placeholder: '请选择',
32
- disabled: false,
33
- type: 'region',
34
- formatter: (values: AreaItem[]) => values.map((item: AreaItem) => item.label).join(''),
35
- })
36
- const emit = defineEmits(['update:value', 'change', 'cancel'])
37
-
38
- const areaFormatOptions = computed<AreaItem[]>(() => {
39
- const { province_list, city_list, county_list } = JSON.parse(Taro.getStorageSync('wechat_area'))
40
- const map = new Map()
41
- city_list.forEach((item: any) => {
42
- const provinceShortId = item.id.slice(0, 2)
43
- if (!map.has(provinceShortId)) {
44
- map.set(provinceShortId, [])
45
- }
46
- map.get(provinceShortId).push({
47
- ...item,
48
- shortId: item.id.slice(0, 4),
49
- })
50
- })
51
- county_list.forEach((item: any) => {
52
- const cityShortId = item.id.slice(0, 4)
53
- if (!map.has(cityShortId)) {
54
- map.set(cityShortId, [])
55
- }
56
- map.get(cityShortId).push({
57
- ...item,
58
- shortId: item.id,
59
- })
60
- })
61
- return province_list.map((province: any) => {
62
- const provinceShortId = province.id.slice(0, 2)
63
- return {
64
- value: province.id,
65
- shortId: provinceShortId,
66
- label: province.name,
67
- children:
68
- (map.get(provinceShortId) || []).map((city: any) => ({
69
- value: city.id,
70
- shortId: city.shortId,
71
- label: city.name,
72
- children:
73
- (map.get(city.shortId) || []).map((region: any) => ({
74
- value: region.id,
75
- shortId: region.shortId,
76
- label: region.name,
77
- children: [],
78
- })) || [],
79
- })) || [],
80
- }
81
- })
82
- })
83
-
84
- const tmpSelectedIndex = ref<number[]>([0, 0, 0])
85
- const selectedIndex = ref<number[]>([0, 0, 0])
86
- const selectedItem = ref<AreaItem[]>([])
87
-
88
- const options = computed<AreaItem[][]>(() => {
89
- const provinceOption = areaFormatOptions.value
90
- if (props.type === 'province') {
91
- return [provinceOption]
92
- }
93
- const cityOption = (provinceOption[tmpSelectedIndex.value[0]] || {}).children || []
94
- if (props.type === 'city') {
95
- return [provinceOption, cityOption]
96
- }
97
- const regionOption = (cityOption[tmpSelectedIndex.value[1]] || {}).children || []
98
- return [provinceOption, cityOption, regionOption]
99
- })
100
-
101
- function init() {
102
- selectedIndex.value = findIndexByValue()
103
- tmpSelectedIndex.value = [...selectedIndex.value]
104
- if (props.value) {
105
- const items: any = []
106
- for (let index = 0; index < options.value.length; index++) {
107
- const item = (options.value[index] || {})[selectedIndex.value[index]]
108
- if (item) {
109
- items.push(item)
110
- }
111
- }
112
- selectedItem.value = items
113
- }
114
- }
115
-
116
- function findIndexByValue() {
117
- if (props.value) {
118
- const provinceId = props.value.slice(0, 2).toString().padEnd(6, '0')
119
- const cityId = props.value.slice(0, 4).toString().padEnd(6, '0')
120
- const regionId = props.value.toString()
121
- for (let provinceIndex = 0; provinceIndex < areaFormatOptions.value.length; provinceIndex++) {
122
- const province = areaFormatOptions.value[provinceIndex]
123
- if (provinceId == province.value) {
124
- for (let cityIndex = 0; cityIndex < province.children.length; cityIndex++) {
125
- const city = province.children[cityIndex]
126
- if (cityId == city.value) {
127
- for (let regionIndex = 0; regionIndex < city.children.length; regionIndex++) {
128
- const region = city.children[regionIndex]
129
- if (regionId == region.value) {
130
- return [provinceIndex, cityIndex, regionIndex]
131
- }
132
- }
133
- return [provinceIndex, cityIndex, 0]
134
- }
135
- }
136
- return [provinceIndex, 0, 0]
137
- }
138
- }
139
- }
140
- return [0, 0, 0]
141
- }
142
-
143
- function onChange() {
144
- const lastSelectedIndex = options.value.length - 1
145
- const result: any = {
146
- values: [],
147
- labels: [],
148
- }
149
- for (let index = 0; index <= lastSelectedIndex; index++) {
150
- const item = (options.value[index] || {})[tmpSelectedIndex.value[index]]
151
- if (item) {
152
- result.values.push(item.value)
153
- result.labels.push(item.label)
154
- }
155
- }
156
- emit('update:value', result.values[result.values.length - 1])
157
- emit('change', result)
158
- console.log(result)
159
- }
160
-
161
- function onCancel(e: any) {
162
- init()
163
- emit('cancel', e)
164
- }
165
-
166
- function onColumnChange({ detail: { column, value } }) {
167
- const resetIndex = Array.from({ length: tmpSelectedIndex.value.length - column - 1 }).fill(0)
168
- tmpSelectedIndex.value = [...tmpSelectedIndex.value.slice(0, column), value, ...resetIndex]
169
- console.log(tmpSelectedIndex.value)
170
- }
171
-
172
- watch(
173
- () => props.value,
174
- () => {
175
- init()
176
- },
177
- { deep: true, immediate: true }
178
- )
179
- </script>
180
-
181
- <template>
182
- <picker
183
- :range="options"
184
- range-key="label"
185
- :value="tmpSelectedIndex"
186
- mode="multiSelector"
187
- @columnchange="onColumnChange"
188
- @change="onChange"
189
- @cancel="onCancel"
190
- style="flex: 1"
191
- :disabled="props.disabled"
192
- >
193
- <div class="dd-area">
194
- <div :class="props.value && !props.disabled ? 'dd-area-value' : 'dd-area-label'">
195
- {{ props.value ? props.formatter(selectedItem) : props.placeholder }}
196
- </div>
197
- <slot name="icon">
198
- <DdIcon
199
- v-if="props.rightIcon"
200
- name="icon-arrow"
201
- size="11px"
202
- :color="props.value !== '' && !props.disabled ? '#353535' : '#DFDFDF'"
203
- class="icon-arrow"
204
- />
205
- </slot>
206
- </div>
207
- </picker>
208
- </template>
209
-
210
- <style lang="scss">
211
- .dd-area {
212
- display: flex;
213
- justify-content: flex-end;
214
- align-items: center;
215
-
216
- &-value {
217
- text-align: right;
218
- color: black;
219
- }
220
-
221
- &-label {
222
- color: var(--placeholder-color);
223
- }
224
- }
225
- </style>
1
+ <!--* NAME: index-->
2
+ <!--* AUTHOR: yanglong-->
3
+ <!--* UPDATE: 2022-02-21 17:43-->
4
+ <!--* TIP: 微信原生实现多列选择器-->
5
+ <script setup lang="ts">
6
+ import { computed, ref, watch } from 'vue'
7
+ import Taro from '@tarojs/taro'
8
+ import DdIcon from '../dd-icon/index.vue'
9
+
10
+ interface AreaItem {
11
+ value: string
12
+ shortId: string
13
+ label: string
14
+ children: AreaItem[]
15
+ }
16
+
17
+ export type AreaType = 'province' | 'city' | 'region'
18
+
19
+ export interface PropsType {
20
+ value?: string // 地址code
21
+ rightIcon?: boolean
22
+ placeholder?: string
23
+ disabled?: boolean
24
+ type?: AreaType
25
+ formatter?: (values: AreaItem[]) => string
26
+ }
27
+
28
+ const props = withDefaults(defineProps<PropsType>(), {
29
+ value: '',
30
+ rightIcon: true,
31
+ placeholder: '请选择',
32
+ disabled: false,
33
+ type: 'region',
34
+ formatter: (values: AreaItem[]) => values.map((item: AreaItem) => item.label).join(''),
35
+ })
36
+ const emit = defineEmits(['update:value', 'change', 'cancel'])
37
+
38
+ const areaFormatOptions = computed<AreaItem[]>(() => {
39
+ const { province_list, city_list, county_list } = JSON.parse(Taro.getStorageSync('wechat_area'))
40
+ const map = new Map()
41
+ city_list.forEach((item: any) => {
42
+ const provinceShortId = item.id.slice(0, 2)
43
+ if (!map.has(provinceShortId)) {
44
+ map.set(provinceShortId, [])
45
+ }
46
+ map.get(provinceShortId).push({
47
+ ...item,
48
+ shortId: item.id.slice(0, 4),
49
+ })
50
+ })
51
+ county_list.forEach((item: any) => {
52
+ const cityShortId = item.id.slice(0, 4)
53
+ if (!map.has(cityShortId)) {
54
+ map.set(cityShortId, [])
55
+ }
56
+ map.get(cityShortId).push({
57
+ ...item,
58
+ shortId: item.id,
59
+ })
60
+ })
61
+ return province_list.map((province: any) => {
62
+ const provinceShortId = province.id.slice(0, 2)
63
+ return {
64
+ value: province.id,
65
+ shortId: provinceShortId,
66
+ label: province.name,
67
+ children:
68
+ (map.get(provinceShortId) || []).map((city: any) => ({
69
+ value: city.id,
70
+ shortId: city.shortId,
71
+ label: city.name,
72
+ children:
73
+ (map.get(city.shortId) || []).map((region: any) => ({
74
+ value: region.id,
75
+ shortId: region.shortId,
76
+ label: region.name,
77
+ children: [],
78
+ })) || [],
79
+ })) || [],
80
+ }
81
+ })
82
+ })
83
+
84
+ const tmpSelectedIndex = ref<number[]>([0, 0, 0])
85
+ const selectedIndex = ref<number[]>([0, 0, 0])
86
+ const selectedItem = ref<AreaItem[]>([])
87
+
88
+ const options = computed<AreaItem[][]>(() => {
89
+ const provinceOption = areaFormatOptions.value
90
+ if (props.type === 'province') {
91
+ return [provinceOption]
92
+ }
93
+ const cityOption = (provinceOption[tmpSelectedIndex.value[0]] || {}).children || []
94
+ if (props.type === 'city') {
95
+ return [provinceOption, cityOption]
96
+ }
97
+ const regionOption = (cityOption[tmpSelectedIndex.value[1]] || {}).children || []
98
+ return [provinceOption, cityOption, regionOption]
99
+ })
100
+
101
+ function init() {
102
+ selectedIndex.value = findIndexByValue()
103
+ tmpSelectedIndex.value = [...selectedIndex.value]
104
+ if (props.value) {
105
+ const items: any = []
106
+ for (let index = 0; index < options.value.length; index++) {
107
+ const item = (options.value[index] || {})[selectedIndex.value[index]]
108
+ if (item) {
109
+ items.push(item)
110
+ }
111
+ }
112
+ selectedItem.value = items
113
+ }
114
+ }
115
+
116
+ function findIndexByValue() {
117
+ if (props.value) {
118
+ const provinceId = props.value.slice(0, 2).toString().padEnd(6, '0')
119
+ const cityId = props.value.slice(0, 4).toString().padEnd(6, '0')
120
+ const regionId = props.value.toString()
121
+ for (let provinceIndex = 0; provinceIndex < areaFormatOptions.value.length; provinceIndex++) {
122
+ const province = areaFormatOptions.value[provinceIndex]
123
+ if (provinceId == province.value) {
124
+ for (let cityIndex = 0; cityIndex < province.children.length; cityIndex++) {
125
+ const city = province.children[cityIndex]
126
+ if (cityId == city.value) {
127
+ for (let regionIndex = 0; regionIndex < city.children.length; regionIndex++) {
128
+ const region = city.children[regionIndex]
129
+ if (regionId == region.value) {
130
+ return [provinceIndex, cityIndex, regionIndex]
131
+ }
132
+ }
133
+ return [provinceIndex, cityIndex, 0]
134
+ }
135
+ }
136
+ return [provinceIndex, 0, 0]
137
+ }
138
+ }
139
+ }
140
+ return [0, 0, 0]
141
+ }
142
+
143
+ function onChange() {
144
+ const lastSelectedIndex = options.value.length - 1
145
+ const result: any = {
146
+ values: [],
147
+ labels: [],
148
+ }
149
+ for (let index = 0; index <= lastSelectedIndex; index++) {
150
+ const item = (options.value[index] || {})[tmpSelectedIndex.value[index]]
151
+ if (item) {
152
+ result.values.push(item.value)
153
+ result.labels.push(item.label)
154
+ }
155
+ }
156
+ emit('update:value', result.values[result.values.length - 1])
157
+ emit('change', result)
158
+ console.log(result)
159
+ }
160
+
161
+ function onCancel(e: any) {
162
+ init()
163
+ emit('cancel', e)
164
+ }
165
+
166
+ function onColumnChange({ detail: { column, value } }) {
167
+ const resetIndex = Array.from({ length: tmpSelectedIndex.value.length - column - 1 }).fill(0)
168
+ tmpSelectedIndex.value = [...tmpSelectedIndex.value.slice(0, column), value, ...resetIndex]
169
+ console.log(tmpSelectedIndex.value)
170
+ }
171
+
172
+ watch(
173
+ () => props.value,
174
+ () => {
175
+ init()
176
+ },
177
+ { deep: true, immediate: true }
178
+ )
179
+ </script>
180
+
181
+ <template>
182
+ <picker
183
+ :range="options"
184
+ range-key="label"
185
+ :value="tmpSelectedIndex"
186
+ mode="multiSelector"
187
+ @columnchange="onColumnChange"
188
+ @change="onChange"
189
+ @cancel="onCancel"
190
+ style="flex: 1"
191
+ :disabled="props.disabled"
192
+ >
193
+ <div class="dd-area">
194
+ <div :class="props.value && !props.disabled ? 'dd-area-value' : 'dd-area-label'">
195
+ {{ props.value ? props.formatter(selectedItem) : props.placeholder }}
196
+ </div>
197
+ <slot name="icon">
198
+ <DdIcon
199
+ v-if="props.rightIcon"
200
+ name="icon-arrow"
201
+ size="11px"
202
+ :color="props.value !== '' && !props.disabled ? '#353535' : '#DFDFDF'"
203
+ class="icon-arrow"
204
+ />
205
+ </slot>
206
+ </div>
207
+ </picker>
208
+ </template>
209
+
210
+ <style lang="scss">
211
+ .dd-area {
212
+ display: flex;
213
+ justify-content: flex-end;
214
+ align-items: center;
215
+
216
+ &-value {
217
+ text-align: right;
218
+ color: black;
219
+ }
220
+
221
+ &-label {
222
+ color: var(--placeholder-color);
223
+ }
224
+ }
225
+ </style>
@@ -1,21 +1,21 @@
1
- # ddIcon 空内容展示
2
- ### 使用iconfont图标
3
-
4
- #
5
- ## 使用
6
-
7
- ``` javascript
8
- import ddIcon from '~/components/ddIcon/index.vue'
9
- ```
10
- ``` html
11
- <dd-icon name="icon-arrow" size="11px" color="#DFDFDF" />
12
- ```
13
-
14
- ## Prop
15
-
16
- | 字段 | 说明 | 类型 | 默认值 |
17
- |-----------|-------------|---------|----------|
18
- | name | icon名称 | string | '' |
19
- | color | icon颜色 | string | inherit |
20
- | size | icon字体大小 | string | 16px |
21
- | weight | icon字体字重 | string | normal |
1
+ # ddIcon 空内容展示
2
+ ### 使用iconfont图标
3
+
4
+ #
5
+ ## 使用
6
+
7
+ ``` javascript
8
+ import ddIcon from '~/components/ddIcon/index.vue'
9
+ ```
10
+ ``` html
11
+ <dd-icon name="icon-arrow" size="11px" color="#DFDFDF" />
12
+ ```
13
+
14
+ ## Prop
15
+
16
+ | 字段 | 说明 | 类型 | 默认值 |
17
+ |-----------|-------------|---------|----------|
18
+ | name | icon名称 | string | '' |
19
+ | color | icon颜色 | string | inherit |
20
+ | size | icon字体大小 | string | 16px |
21
+ | weight | icon字体字重 | string | normal |
@@ -1,23 +1,23 @@
1
- <script setup lang="ts">
2
- import { computed } from 'vue'
3
- const props = withDefaults(
4
- defineProps<{
5
- name: string
6
- color?: string
7
- size?: string
8
- weight?: string
9
- }>(),
10
- {
11
- color: 'inherit',
12
- size: '16px',
13
- weight: 'normal',
14
- }
15
- )
16
- const styles = computed(() => {
17
- return `color: ${props.color}; font-size: ${props.size}; font-weight: ${props.weight};`
18
- })
19
- </script>
20
-
21
- <template>
22
- <view class="iconfont" :class="name" :style="styles"></view>
23
- </template>
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue'
3
+ const props = withDefaults(
4
+ defineProps<{
5
+ name: string
6
+ color?: string
7
+ size?: string
8
+ weight?: string
9
+ }>(),
10
+ {
11
+ color: 'inherit',
12
+ size: '16px',
13
+ weight: 'normal',
14
+ }
15
+ )
16
+ const styles = computed(() => {
17
+ return `color: ${props.color}; font-size: ${props.size}; font-weight: ${props.weight};`
18
+ })
19
+ </script>
20
+
21
+ <template>
22
+ <view class="iconfont" :class="name" :style="styles"></view>
23
+ </template>