wui-components-v2 1.1.69 → 1.1.71

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 (117) hide show
  1. package/api/core/index.ts +74 -74
  2. package/api/feishu.ts +20 -20
  3. package/api/index.ts +4 -4
  4. package/api/login.ts +51 -51
  5. package/api/menu.ts +45 -45
  6. package/api/page.ts +114 -114
  7. package/api/sys.ts +12 -12
  8. package/api/tree.ts +28 -28
  9. package/components/action-popup/action-popup.vue +116 -116
  10. package/components/add-address-list/add-address-list.vue +187 -187
  11. package/components/add-address-page/add-address-page.vue +77 -77
  12. package/components/add-address-page/config.ts +297 -297
  13. package/components/audio-play/audio-play.vue +220 -220
  14. package/components/batch-upload-file/batch-upload-file.vue +75 -75
  15. package/components/card-botom-buttons/card-botom-buttons.vue +279 -279
  16. package/components/custom-date-picker/custom-date-picker.vue +106 -106
  17. package/components/custom-select-picker/custom-select-picker.vue +95 -95
  18. package/components/demo-block/demo-block.vue +63 -63
  19. package/components/demo-card/demo-card.vue +44 -44
  20. package/components/detail-popup/detail-popup.vue +99 -99
  21. package/components/evaluation-page/evaluation-page.vue +196 -196
  22. package/components/fold-card/fold-card.vue +171 -171
  23. package/components/form-control/form-control.vue +661 -661
  24. package/components/global-loading/GlobalLoading.md +366 -366
  25. package/components/global-loading/global-loading.vue +55 -55
  26. package/components/global-message/GlobalMessage.md +570 -570
  27. package/components/global-message/global-message.vue +68 -68
  28. package/components/global-toast/GlobalToast.md +261 -261
  29. package/components/global-toast/global-toast.vue +56 -56
  30. package/components/label-value/label-value.vue +144 -144
  31. package/components/label-value/open-value-more.vue +56 -56
  32. package/components/list-top-buttons/list-top-buttons.vue +19 -19
  33. package/components/loading/loading.vue +5 -5
  34. package/components/login-form/login-form.vue +126 -126
  35. package/components/login-form-box/login-form-box.vue +65 -65
  36. package/components/mulselect-picker/mulselect-picker.vue +86 -86
  37. package/components/phone-login-form/phone-login-form.vue +204 -204
  38. package/components/privacy-popup/privacy-popup.vue +191 -191
  39. package/components/product-card/product-card.vue +201 -201
  40. package/components/scan-input/scan-input.vue +406 -406
  41. package/components/search/search.vue +128 -128
  42. package/components/select-col-picker/select-col-picker.vue +168 -168
  43. package/components/tab-search/tab-search.vue +73 -73
  44. package/components/tree-select/components/TreeNode.vue +200 -200
  45. package/components/tree-select/components/index.vue +471 -471
  46. package/components/tree-select/components/tree-select.vue +56 -56
  47. package/components/tree-select/index.vue +93 -93
  48. package/components/user-choose/user-choose.vue +169 -151
  49. package/components/video-play/video-play.vue +56 -56
  50. package/components/wui-auto-update-component/wui-auto-update-component.vue +132 -132
  51. package/components/wui-default/wui-default.vue +49 -49
  52. package/components/wui-details-page/wui-details-page.vue +147 -147
  53. package/components/wui-edit-page/wui-edit-page-copy.vue +757 -757
  54. package/components/wui-edit-page/wui-edit-page.vue +793 -793
  55. package/components/wui-enume-select-control/wui-enume-select-control.vue +92 -92
  56. package/components/wui-list/wui-list.vue +235 -235
  57. package/components/wui-login/wui-login.vue +43 -43
  58. package/components/wui-login1/wui-login.vue +41 -41
  59. package/components/wui-menus/wui-menus-top.vue +137 -137
  60. package/components/wui-menus/wui-menus-top1.vue +8 -8
  61. package/components/wui-menus/wui-menus.vue +247 -247
  62. package/components/wui-menus1/components/banner-carousel.vue +320 -320
  63. package/components/wui-menus1/components/navbar.vue +43 -43
  64. package/components/wui-menus1/components/quick-panel.vue +55 -55
  65. package/components/wui-menus1/components/search-bar.vue +49 -49
  66. package/components/wui-menus1/components/section-menus.vue +208 -208
  67. package/components/wui-menus1/wui-menus-top.vue +718 -718
  68. package/components/wui-menus1/wui-menus-top1.vue +398 -398
  69. package/components/wui-menus1/wui-menus.vue +564 -564
  70. package/components/wui-notify-info/notify-handle.vue +53 -53
  71. package/components/wui-notify-info/wui-notify-info.vue +280 -280
  72. package/components/wui-scan-binding-sensor/wui-scan-binding-sensor.vue +75 -75
  73. package/components/wui-search-history-babbar/components/SearchBar.vue +70 -70
  74. package/components/wui-search-history-babbar/wui-search-history-babbar.vue +204 -204
  75. package/components/wui-select-list/wui-select-list.vue +310 -310
  76. package/components/wui-select-popup/wui-select-popup.vue +613 -612
  77. package/components/wui-system-settings/wui-system-settings.vue +144 -144
  78. package/components/wui-tabbar/wui-tabbar.vue +106 -106
  79. package/components/wui-tree-page/components/tree-item.vue +238 -238
  80. package/components/wui-tree-page/wui-tree-page.vue +297 -297
  81. package/components/wui-update-component/wui-update-component.vue +221 -221
  82. package/components/wui-user/wui-user.vue +202 -202
  83. package/composables/types/theme.ts +65 -65
  84. package/composables/types/user.ts +5 -5
  85. package/composables/useColorGenerator.ts +221 -221
  86. package/composables/useCompanyFieldFilter.ts +91 -91
  87. package/composables/useEnumes.ts +43 -43
  88. package/composables/useEventBus.ts +37 -37
  89. package/composables/useGlobalLoading.ts +47 -47
  90. package/composables/useGlobalMessage.ts +53 -53
  91. package/composables/useGlobalToast.ts +63 -63
  92. package/composables/useLocale.ts +54 -54
  93. package/composables/useManualTheme.ts +179 -179
  94. package/composables/useMenus.ts +193 -193
  95. package/composables/useSectionMenus.ts +120 -120
  96. package/composables/useTabbar.ts +50 -50
  97. package/composables/useTheme.ts +74 -74
  98. package/composables/useUser.ts +24 -24
  99. package/index.d.ts +90 -90
  100. package/index.ts +83 -83
  101. package/package.json +24 -24
  102. package/static/iconfont/iconfont.css +63 -63
  103. package/store/language.ts +151 -151
  104. package/store/manualThemeStore.ts +143 -143
  105. package/store/persist.ts +41 -41
  106. package/store/themeStore.ts +74 -74
  107. package/store/userStore.ts +22 -22
  108. package/styles/dark-mode.css +523 -523
  109. package/styles/dark-mode.min.css +1 -1
  110. package/styles/dark-mode.scss +498 -498
  111. package/type.ts +154 -154
  112. package/utils/control-tree.ts +353 -353
  113. package/utils/control-type-supportor.ts +148 -148
  114. package/utils/eventBus.ts +36 -36
  115. package/utils/idata-scan.ts +99 -99
  116. package/utils/index.ts +979 -979
  117. package/utils/rsaEncrypt.ts +10 -10
@@ -1,106 +1,106 @@
1
- <script setup lang="ts">
2
- import { computed, ref, watch } from 'vue'
3
- import dayjs from 'dayjs/esm/index'
4
-
5
- defineOptions({
6
- name: 'CustomDatePicker',
7
- })
8
- const props = defineProps({
9
- modelValue: String,
10
- placeholder: String,
11
- columns: {
12
- type: Array as PropType<SelectOption[]>,
13
- default: () => [],
14
- },
15
- labelKey: { type: String, default: 'label' },
16
- valueKey: { type: String, default: 'value' },
17
- type: { type: String, default: 'date' },
18
- })
19
-
20
- const emit = defineEmits<{
21
- 'update:modelValue': [value: string | number]
22
- }>()
23
-
24
- interface SelectOption {
25
- label: string
26
- value: string | number
27
- [key: string]: any
28
- }
29
- const open = ref(false)
30
- const currentValue = ref<any>(props.modelValue)
31
- function clear() {
32
- currentValue.value = ''
33
- }
34
-
35
- watch(
36
- () => props.modelValue,
37
- val => {
38
- currentValue.value = val
39
- }
40
- )
41
-
42
- watch(currentValue, val => {
43
- const newVal = props.type === 'year' ? dayjs(val).format('YYYY') : val
44
- emit('update:modelValue', newVal)
45
- })
46
-
47
- const labelText = computed(() => {
48
- const formatMap: {
49
- date: string
50
- datetime: string
51
- [key: string]: string // 索引签名:允许任意字符串作为键
52
- } = {
53
- date: 'YYYY-MM-DD',
54
- datetime: 'YYYY-MM-DD HH:mm',
55
- year: 'YYYY',
56
- }
57
-
58
- if (['date', 'datetime', 'year'].includes(props.type)) {
59
- return currentValue.value ? dayjs(currentValue.value).format(formatMap[props.type] as string) : ''
60
- } else {
61
- return currentValue.value || ''
62
- }
63
- })
64
- </script>
65
-
66
- <template>
67
- <div class="flex items-center justify-between">
68
- <wd-input v-model="labelText" readonly :placeholder="placeholder" class="flex-1" @click="open = true" />
69
- <wd-icon v-if="labelText" name="close-circle" size="16px" @click="clear" />
70
- <wd-icon v-else name="right" size="16px" @click="clear" />
71
- </div>
72
-
73
- <wd-calendar
74
- v-if="['date', 'datetime'].includes(type)"
75
- v-model="currentValue"
76
- v-model:visible="open"
77
- label-key="label"
78
- value-key="value"
79
- class="custom-date-picker"
80
- :type="type as any"
81
- />
82
- <wd-datetime-picker
83
- v-else
84
- v-model="currentValue"
85
- v-model:visible="open"
86
- label-key="label"
87
- value-key="value"
88
- class="custom-date-picker"
89
- :type="type as any"
90
- />
91
- </template>
92
-
93
- <style scoped lang="scss">
94
- .custom-date-picker {
95
- width: 100%;
96
- :deep(.wd-calendar__wrapper) {
97
- padding: 0 20px;
98
- overflow: auto;
99
- scrollbar-width: none;
100
- -ms-overflow-style: none;
101
- }
102
- :deep(.uni-scroll-view) {
103
- scrollbar-width: none;
104
- }
105
- }
106
- </style>
1
+ <script setup lang="ts">
2
+ import { computed, ref, watch } from 'vue'
3
+ import dayjs from 'dayjs/esm/index'
4
+
5
+ defineOptions({
6
+ name: 'CustomDatePicker',
7
+ })
8
+ const props = defineProps({
9
+ modelValue: String,
10
+ placeholder: String,
11
+ columns: {
12
+ type: Array as PropType<SelectOption[]>,
13
+ default: () => [],
14
+ },
15
+ labelKey: { type: String, default: 'label' },
16
+ valueKey: { type: String, default: 'value' },
17
+ type: { type: String, default: 'date' },
18
+ })
19
+
20
+ const emit = defineEmits<{
21
+ 'update:modelValue': [value: string | number]
22
+ }>()
23
+
24
+ interface SelectOption {
25
+ label: string
26
+ value: string | number
27
+ [key: string]: any
28
+ }
29
+ const open = ref(false)
30
+ const currentValue = ref<any>(props.modelValue)
31
+ function clear() {
32
+ currentValue.value = ''
33
+ }
34
+
35
+ watch(
36
+ () => props.modelValue,
37
+ val => {
38
+ currentValue.value = val
39
+ }
40
+ )
41
+
42
+ watch(currentValue, val => {
43
+ const newVal = props.type === 'year' ? dayjs(val).format('YYYY') : val
44
+ emit('update:modelValue', newVal)
45
+ })
46
+
47
+ const labelText = computed(() => {
48
+ const formatMap: {
49
+ date: string
50
+ datetime: string
51
+ [key: string]: string // 索引签名:允许任意字符串作为键
52
+ } = {
53
+ date: 'YYYY-MM-DD',
54
+ datetime: 'YYYY-MM-DD HH:mm',
55
+ year: 'YYYY',
56
+ }
57
+
58
+ if (['date', 'datetime', 'year'].includes(props.type)) {
59
+ return currentValue.value ? dayjs(currentValue.value).format(formatMap[props.type] as string) : ''
60
+ } else {
61
+ return currentValue.value || ''
62
+ }
63
+ })
64
+ </script>
65
+
66
+ <template>
67
+ <div class="flex items-center justify-between">
68
+ <wd-input v-model="labelText" readonly :placeholder="placeholder" class="flex-1" @click="open = true" />
69
+ <wd-icon v-if="labelText" name="close-circle" size="16px" @click="clear" />
70
+ <wd-icon v-else name="right" size="16px" @click="clear" />
71
+ </div>
72
+
73
+ <wd-calendar
74
+ v-if="['date', 'datetime'].includes(type)"
75
+ v-model="currentValue"
76
+ v-model:visible="open"
77
+ label-key="label"
78
+ value-key="value"
79
+ class="custom-date-picker"
80
+ :type="type as any"
81
+ />
82
+ <wd-datetime-picker
83
+ v-else
84
+ v-model="currentValue"
85
+ v-model:visible="open"
86
+ label-key="label"
87
+ value-key="value"
88
+ class="custom-date-picker"
89
+ :type="type as any"
90
+ />
91
+ </template>
92
+
93
+ <style scoped lang="scss">
94
+ .custom-date-picker {
95
+ width: 100%;
96
+ :deep(.wd-calendar__wrapper) {
97
+ padding: 0 20px;
98
+ overflow: auto;
99
+ scrollbar-width: none;
100
+ -ms-overflow-style: none;
101
+ }
102
+ :deep(.uni-scroll-view) {
103
+ scrollbar-width: none;
104
+ }
105
+ }
106
+ </style>
@@ -1,95 +1,95 @@
1
- <script setup lang="ts">
2
- import { computed, ref, watch } from 'vue'
3
-
4
- defineOptions({
5
- name: 'CustomSelectPicker',
6
- })
7
- const props = defineProps({
8
- modelValue: [String, Array],
9
- placeholder: String,
10
- columns: {
11
- type: Array as PropType<SelectOption[]>,
12
- default: () => [],
13
- },
14
- labelKey: { type: String, default: 'label' },
15
- valueKey: { type: String, default: 'value' },
16
- type: { type: String, default: 'radio' },
17
- })
18
-
19
- const emit = defineEmits<{
20
- 'update:modelValue': [value: string | number]
21
- }>()
22
-
23
- interface SelectOption {
24
- label: string
25
- value: string | number
26
- [key: string]: any
27
- }
28
-
29
- const open = ref(false)
30
- const currentValue = ref<any>(props.modelValue)
31
- function clear() {
32
- currentValue.value = ''
33
- }
34
-
35
- watch(
36
- () => props.modelValue,
37
- val => {
38
- console.log('val', val, Array.isArray(val))
39
- currentValue.value = val
40
- }
41
- )
42
-
43
- watch(currentValue, val => {
44
- emit('update:modelValue', val)
45
- })
46
-
47
- const labelText = computed(() => {
48
- // 多选情况:currentValue 是数组
49
- if (Array.isArray(currentValue.value)) {
50
- const labels = currentValue.value
51
- .map(val => {
52
- const item = props.columns.find(item => item[props.valueKey] === val)
53
- return item ? item[props.labelKey] : ''
54
- })
55
- .filter(Boolean)
56
- return labels.join(', ')
57
- }
58
- // 单选情况:currentValue 是单个值
59
- const item = props.columns.find(item => item[props.valueKey] === currentValue.value)
60
- return item ? item[props.labelKey] : ''
61
- })
62
- </script>
63
-
64
- <template>
65
- <div class="flex items-center justify-between">
66
- <wd-input v-model="labelText" readonly :placeholder="placeholder" class="flex-1" @click="open = true" />
67
- <wd-icon v-if="labelText" name="close-circle" size="16px" @click="clear" />
68
- <wd-icon v-else name="right" size="16px" @click="clear" />
69
- </div>
70
-
71
- <wd-select-picker
72
- v-model="currentValue"
73
- v-model:visible="open"
74
- :columns="columns"
75
- label-key="label"
76
- value-key="value"
77
- class="custom-select-picker"
78
- :type="type as any"
79
- />
80
- </template>
81
-
82
- <style scoped lang="scss">
83
- .custom-select-picker {
84
- width: 100%;
85
- :deep(.wd-select-picker__wrapper) {
86
- padding: 0 20px;
87
- overflow: auto;
88
- scrollbar-width: none;
89
- -ms-overflow-style: none;
90
- }
91
- :deep(.uni-scroll-view) {
92
- scrollbar-width: none;
93
- }
94
- }
95
- </style>
1
+ <script setup lang="ts">
2
+ import { computed, ref, watch } from 'vue'
3
+
4
+ defineOptions({
5
+ name: 'CustomSelectPicker',
6
+ })
7
+ const props = defineProps({
8
+ modelValue: [String, Array],
9
+ placeholder: String,
10
+ columns: {
11
+ type: Array as PropType<SelectOption[]>,
12
+ default: () => [],
13
+ },
14
+ labelKey: { type: String, default: 'label' },
15
+ valueKey: { type: String, default: 'value' },
16
+ type: { type: String, default: 'radio' },
17
+ })
18
+
19
+ const emit = defineEmits<{
20
+ 'update:modelValue': [value: string | number]
21
+ }>()
22
+
23
+ interface SelectOption {
24
+ label: string
25
+ value: string | number
26
+ [key: string]: any
27
+ }
28
+
29
+ const open = ref(false)
30
+ const currentValue = ref<any>(props.modelValue)
31
+ function clear() {
32
+ currentValue.value = ''
33
+ }
34
+
35
+ watch(
36
+ () => props.modelValue,
37
+ val => {
38
+ console.log('val', val, Array.isArray(val))
39
+ currentValue.value = val
40
+ }
41
+ )
42
+
43
+ watch(currentValue, val => {
44
+ emit('update:modelValue', val)
45
+ })
46
+
47
+ const labelText = computed(() => {
48
+ // 多选情况:currentValue 是数组
49
+ if (Array.isArray(currentValue.value)) {
50
+ const labels = currentValue.value
51
+ .map(val => {
52
+ const item = props.columns.find(item => item[props.valueKey] === val)
53
+ return item ? item[props.labelKey] : ''
54
+ })
55
+ .filter(Boolean)
56
+ return labels.join(', ')
57
+ }
58
+ // 单选情况:currentValue 是单个值
59
+ const item = props.columns.find(item => item[props.valueKey] === currentValue.value)
60
+ return item ? item[props.labelKey] : ''
61
+ })
62
+ </script>
63
+
64
+ <template>
65
+ <div class="flex items-center justify-between">
66
+ <wd-input v-model="labelText" readonly :placeholder="placeholder" class="flex-1" @click="open = true" />
67
+ <wd-icon v-if="labelText" name="close-circle" size="16px" @click="clear" />
68
+ <wd-icon v-else name="right" size="16px" @click="clear" />
69
+ </div>
70
+
71
+ <wd-select-picker
72
+ v-model="currentValue"
73
+ v-model:visible="open"
74
+ :columns="columns"
75
+ label-key="label"
76
+ value-key="value"
77
+ class="custom-select-picker"
78
+ :type="type as any"
79
+ />
80
+ </template>
81
+
82
+ <style scoped lang="scss">
83
+ .custom-select-picker {
84
+ width: 100%;
85
+ :deep(.wd-select-picker__wrapper) {
86
+ padding: 0 20px;
87
+ overflow: auto;
88
+ scrollbar-width: none;
89
+ -ms-overflow-style: none;
90
+ }
91
+ :deep(.uni-scroll-view) {
92
+ scrollbar-width: none;
93
+ }
94
+ }
95
+ </style>
@@ -1,63 +1,63 @@
1
- <script lang="ts" setup>
2
- import { computed, defineOptions, defineProps } from 'vue'
3
-
4
- defineOptions({
5
- name: 'DemoBlock',
6
- })
7
-
8
- const props = defineProps({
9
- // 标题
10
- title: {
11
- type: String,
12
- default: '',
13
- },
14
- // 自定义类名
15
- customClass: {
16
- type: String,
17
- default: '',
18
- },
19
- // 垂直间距
20
- ver: {
21
- type: [Number, String],
22
- default: 10,
23
- },
24
- // 水平间距
25
- hor: {
26
- type: [Number, String],
27
- default: 15,
28
- },
29
- // 是否透明
30
- transparent: {
31
- type: Boolean,
32
- default: false,
33
- },
34
- })
35
-
36
- const style = computed(() => {
37
- return `margin: 0 ${props.hor}px;padding:${props.ver}px 0;`
38
- })
39
- </script>
40
-
41
- <script lang="ts">
42
- export default {
43
- options: {
44
- addGlobalClass: true,
45
- virtualHost: true,
46
- styleIsolation: 'shared',
47
- },
48
- }
49
- </script>
50
-
51
- <template>
52
- <view
53
- class="mb-3 box-border w-full px-3 text-gray-500 last:mb-0 dark:text-gray-300"
54
- :class="[transparent ? '' : 'bg-white dark:bg-[var(--wot-dark-background2)]', customClass]"
55
- >
56
- <view v-if="title" class="px-4 py-3 text-26rpx dark:text-gray-200">
57
- {{ title }}
58
- </view>
59
- <view :style="transparent ? '' : style">
60
- <slot />
61
- </view>
62
- </view>
63
- </template>
1
+ <script lang="ts" setup>
2
+ import { computed, defineOptions, defineProps } from 'vue'
3
+
4
+ defineOptions({
5
+ name: 'DemoBlock',
6
+ })
7
+
8
+ const props = defineProps({
9
+ // 标题
10
+ title: {
11
+ type: String,
12
+ default: '',
13
+ },
14
+ // 自定义类名
15
+ customClass: {
16
+ type: String,
17
+ default: '',
18
+ },
19
+ // 垂直间距
20
+ ver: {
21
+ type: [Number, String],
22
+ default: 10,
23
+ },
24
+ // 水平间距
25
+ hor: {
26
+ type: [Number, String],
27
+ default: 15,
28
+ },
29
+ // 是否透明
30
+ transparent: {
31
+ type: Boolean,
32
+ default: false,
33
+ },
34
+ })
35
+
36
+ const style = computed(() => {
37
+ return `margin: 0 ${props.hor}px;padding:${props.ver}px 0;`
38
+ })
39
+ </script>
40
+
41
+ <script lang="ts">
42
+ export default {
43
+ options: {
44
+ addGlobalClass: true,
45
+ virtualHost: true,
46
+ styleIsolation: 'shared',
47
+ },
48
+ }
49
+ </script>
50
+
51
+ <template>
52
+ <view
53
+ class="mb-3 box-border w-full px-3 text-gray-500 last:mb-0 dark:text-gray-300"
54
+ :class="[transparent ? '' : 'bg-white dark:bg-[var(--wot-dark-background2)]', customClass]"
55
+ >
56
+ <view v-if="title" class="px-4 py-3 text-26rpx dark:text-gray-200">
57
+ {{ title }}
58
+ </view>
59
+ <view :style="transparent ? '' : style">
60
+ <slot />
61
+ </view>
62
+ </view>
63
+ </template>
@@ -1,44 +1,44 @@
1
- <script lang="ts" setup>
2
- import { defineOptions, defineProps } from 'vue'
3
- import { useManualTheme } from '../../composables/useManualTheme'
4
-
5
- defineOptions({
6
- name: 'DemoCard',
7
- })
8
-
9
- const props = defineProps({
10
- // 标题
11
- title: {
12
- type: String,
13
- default: '',
14
- },
15
-
16
- })
17
-
18
- const {
19
- primary,
20
- } = useManualTheme()
21
- </script>
22
-
23
- <template>
24
- <wd-card>
25
- <template #title>
26
- <view class="flex items-center gap-2">
27
- <view class="h-3.5 w-1 rounded-2xl" :style="{ backgroundColor: primary }" />
28
- <text class="font-bold">
29
- {{ props.title }}
30
- </text>
31
- </view>
32
- </template>
33
- <slot name="content" />
34
- <template #footer>
35
- <slot name="footer" />
36
- </template>
37
- </wd-card>
38
- </template>
39
-
40
- <style lang="scss" scoped>
41
- :deep(.wd-card__footer){
42
- padding-top: 0 !important;
43
- }
44
- </style>
1
+ <script lang="ts" setup>
2
+ import { defineOptions, defineProps } from 'vue'
3
+ import { useManualTheme } from '../../composables/useManualTheme'
4
+
5
+ defineOptions({
6
+ name: 'DemoCard',
7
+ })
8
+
9
+ const props = defineProps({
10
+ // 标题
11
+ title: {
12
+ type: String,
13
+ default: '',
14
+ },
15
+
16
+ })
17
+
18
+ const {
19
+ primary,
20
+ } = useManualTheme()
21
+ </script>
22
+
23
+ <template>
24
+ <wd-card>
25
+ <template #title>
26
+ <view class="flex items-center gap-2">
27
+ <view class="h-3.5 w-1 rounded-2xl" :style="{ backgroundColor: primary }" />
28
+ <text class="font-bold">
29
+ {{ props.title }}
30
+ </text>
31
+ </view>
32
+ </template>
33
+ <slot name="content" />
34
+ <template #footer>
35
+ <slot name="footer" />
36
+ </template>
37
+ </wd-card>
38
+ </template>
39
+
40
+ <style lang="scss" scoped>
41
+ :deep(.wd-card__footer){
42
+ padding-top: 0 !important;
43
+ }
44
+ </style>