wui-components-v2 1.1.68 → 1.1.70

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 (47) hide show
  1. package/api/core/index.ts +74 -74
  2. package/api/menu.ts +45 -45
  3. package/api/page.ts +114 -114
  4. package/api/sys.ts +12 -12
  5. package/components/action-popup/action-popup.vue +46 -17
  6. package/components/add-address-page/add-address-page.vue +77 -77
  7. package/components/custom-date-picker/custom-date-picker.vue +106 -106
  8. package/components/custom-select-picker/custom-select-picker.vue +95 -95
  9. package/components/demo-block/demo-block.vue +63 -63
  10. package/components/detail-popup/detail-popup.vue +99 -99
  11. package/components/evaluation-page/evaluation-page.vue +196 -192
  12. package/components/fold-card/fold-card.vue +171 -171
  13. package/components/form-control/form-control.vue +661 -661
  14. package/components/global-message/global-message.vue +68 -68
  15. package/components/label-value/label-value.vue +144 -144
  16. package/components/list-top-buttons/list-top-buttons.vue +19 -19
  17. package/components/login-form/login-form.vue +126 -126
  18. package/components/mulselect-picker/mulselect-picker.vue +86 -86
  19. package/components/product-card/product-card.vue +201 -201
  20. package/components/search/search.vue +128 -128
  21. package/components/user-choose/user-choose.vue +1 -1
  22. package/components/wui-enume-select-control/wui-enume-select-control.vue +92 -92
  23. package/components/wui-list/wui-list.vue +235 -235
  24. package/components/wui-menus/wui-menus.vue +247 -247
  25. package/components/wui-menus1/components/navbar.vue +43 -43
  26. package/components/wui-menus1/wui-menus.vue +564 -564
  27. package/components/wui-notify-info/wui-notify-info.vue +280 -280
  28. package/components/wui-search-history-babbar/wui-search-history-babbar.vue +204 -204
  29. package/components/wui-select-list/wui-select-list.vue +310 -310
  30. package/components/wui-select-popup/wui-select-popup.vue +612 -612
  31. package/components/wui-system-settings/wui-system-settings.vue +144 -144
  32. package/components/wui-tabbar/wui-tabbar.vue +106 -106
  33. package/components/wui-tree-page/components/tree-item.vue +238 -238
  34. package/components/wui-user/wui-user.vue +202 -197
  35. package/composables/useCompanyFieldFilter.ts +91 -91
  36. package/composables/useEnumes.ts +2 -2
  37. package/composables/useMenus.ts +193 -193
  38. package/index.ts +83 -83
  39. package/package.json +1 -1
  40. package/static/iconfont/iconfont.css +63 -63
  41. package/store/language.ts +151 -151
  42. package/styles/dark-mode.css +523 -485
  43. package/styles/dark-mode.min.css +1 -1
  44. package/styles/dark-mode.scss +28 -0
  45. package/type.ts +2 -2
  46. package/utils/control-tree.ts +2 -2
  47. package/utils/control-type-supportor.ts +148 -148
@@ -1,247 +1,247 @@
1
- <script setup lang="ts">
2
- import type { PropType } from 'vue'
3
- import { computed, defineOptions, defineProps, ref } from 'vue'
4
- import { useRouter } from 'uni-mini-router'
5
- import { onShow } from '@dcloudio/uni-app'
6
- import { menu } from '../../api/menu'
7
- import DemoCard from '../demo-card/demo-card.vue'
8
- import { useManualTheme } from '../../composables/useManualTheme'
9
- import { useGlobalToast } from '../../composables/useGlobalToast'
10
- import { useColorGenerator } from '../../composables/useColorGenerator'
11
- import { desaturateColor } from '../../utils'
12
- import wuiMenusTop from './wui-menus-top.vue'
13
-
14
- defineOptions({
15
- name: 'WuiMenus',
16
- })
17
- const props = defineProps({
18
- icons: {
19
- type: Array as PropType<Icon[]>,
20
- default: () => [],
21
- },
22
- load: {
23
- type: Function as PropType<() => void>,
24
- default: () => {},
25
- },
26
- menuTopType: {
27
- type: String,
28
- default: '',
29
- },
30
- })
31
- // const user = useUser().getUserInfo()
32
- const router = useRouter()
33
- const toast = useGlobalToast()
34
- interface Icon {
35
- id: string
36
- path: string
37
- }
38
- const { currentThemeColor } = useManualTheme()
39
- const { generateRandomColor } = useColorGenerator(currentThemeColor.value.primary)
40
- const menuList = ref([])
41
- const title = ref('')
42
- const filtermenu = computed(() => {
43
- let arr = []
44
- if (currentThemeColor.value.primary) {
45
- arr = filterHiddenTree(menuList.value, 'items', true)
46
- }
47
- return arr
48
- })
49
- const sheetShow = ref(false)
50
- const actions = ref([])
51
- const paging = ref()
52
- // 点击菜单跳转页面
53
- function gotoPage(item: any) {
54
- // 跳转页面
55
- if (goto(item)) return
56
- // 打开动作面板
57
- openSheet(item)
58
- }
59
-
60
- // 点击动作面板跳转页面
61
- function sheetGotoPage(item: any) {
62
- // 跳转页面
63
- if (goto(item)) return
64
- // 打开动作面板
65
- openSheet(item, 300)
66
- }
67
-
68
- // 跳转页面
69
- function goto(item: any) {
70
- console.log(item.pageType)
71
- switch (item.pageType) {
72
- case '列表':
73
- router.push(`/pages/list/index?sourceId=${item.id}&title=${item.title}`)
74
- return true
75
- case '树':
76
- router.push(`/pages/tree-page/index?sourceId=${item.id}&title=${item.title}`)
77
- return true
78
- case '报表':
79
- // uni.navigateTo({
80
- // url: `/pages/report-table/report-table?sourceId=${item.id}&title=${item.title}`,
81
- // })
82
- return true
83
-
84
- default:
85
- return false
86
- }
87
- }
88
-
89
- // 打开wd-action-sheet动作面板
90
- function openSheet(item: any, s = 0) {
91
- if (item.items) {
92
- title.value = item.title
93
- actions.value = item.items
94
- ? item.items.map((item: any) => {
95
- return {
96
- name: item.title,
97
- // color: '#00000073',
98
- ...item,
99
- }
100
- })
101
- : []
102
-
103
- // 设置二次打开的过渡时间
104
- const id = setTimeout(() => {
105
- sheetShow.value = true
106
- clearTimeout(id)
107
- }, s)
108
- }
109
- }
110
-
111
- /**
112
- * 根据 `disabled: true` 过滤树形数组(支持自定义子节点字段)
113
- * @param {Array} tree 原始树形数据
114
- * @param {string} [childKey] 子节点字段名
115
- * @param {boolean} [deepClone] 是否深拷贝原数据
116
- * @returns {Array} 过滤后的新树形数据
117
- */
118
- function filterHiddenTree(tree: any, childKey = 'children', deepClone = false) {
119
- // 深拷贝处理(可选)
120
- const clone = (data: any) => {
121
- if (!deepClone) return data
122
- return JSON.parse(JSON.stringify(data))
123
- }
124
-
125
- return clone(tree)
126
- .filter((node: any) => !node.disabled) // 过滤当前层隐藏节点
127
- .map((node: any) => {
128
- // 递归处理子节点
129
- if (Array.isArray(node[childKey])) {
130
- node[childKey] = filterHiddenTree(node[childKey], childKey, deepClone)
131
- }
132
- const icon = props.icons.find((item: any) => {
133
- return item.id === node.id
134
- })
135
- return {
136
- ...node,
137
- iconPath: (icon as any)?.path,
138
- color: generateRandomColor().hex,
139
- }
140
- })
141
- }
142
- onShow(() => {
143
- // if (paging.value) {
144
- // paging.value.reload()
145
- // }
146
- })
147
- // @query所绑定的方法不要自己调用!!需要刷新列表数据时,只需要调用this.$refs.paging.reload()即可
148
- function queryList() {
149
- // 此处请求仅为演示,请替换为自己项目中的请求
150
- menu()
151
- .then((res: any) => {
152
- // 将请求结果通过complete传给z-paging处理,同时也代表请求结束,这一行必须调用
153
- if (!res?.blocks.length) {
154
- toast.warning('暂无权限,请重新登录或联系管理员')
155
- }
156
- uni.setNavigationBarTitle({ title: res?.programName || '' }) // 设置标题
157
- paging.value.complete(res?.blocks || [])
158
- })
159
- .catch((res: any) => {
160
- // 如果请求失败写this.$refs.paging.complete(false),会自动展示错误页面
161
- // 注意,每次都需要在catch中写这句话很麻烦,z-paging提供了方案可以全局统一处理
162
- // 在底层的网络请求抛出异常时,写uni.$emit('z-paging-error-emit');即可
163
- console.log(res, 'menu error')
164
- paging.value.complete(false)
165
- })
166
- }
167
- </script>
168
-
169
- <template>
170
- <z-paging ref="paging" v-model="menuList" :loading-more-enabled="false" @query="queryList" @on-refresh="props.load">
171
- <template #top>
172
- <slot name="top" :style="{ background: currentThemeColor.primary }" />
173
- </template>
174
- <view>
175
- <wuiMenusTop v-if="props.menuTopType !== '自定义'" />
176
- <view v-if="props.menuTopType === '自定义'" class="p-1" />
177
- <DemoCard v-for="(item, index) in filtermenu" :key="index" :title="item.title">
178
- <template #content>
179
- <view class="border-rd-2 bg-white pa-1 dark:bg-[var(--wot-dark-background2)]">
180
- <wd-grid :column="4" clickable>
181
- <wd-grid-item
182
- v-for="(subItem, subIndex) in item.items"
183
- :key="subIndex"
184
- use-text-slot
185
- use-icon-slot
186
- @itemclick="gotoPage(subItem)"
187
- >
188
- <template #icon>
189
- <view
190
- class="flex items-center justify-center rounded-2"
191
- :style="{ backgroundColor: desaturateColor(subItem.color, 0.25), height: '80rpx', width: '80rpx' }"
192
- >
193
- <!-- <text class="i-carbon:chart-combo-stacked text-center text-5"
194
- :class="[props.icons.find(item => item.id === subItem.id)?.path]"
195
- :style="{ color:desaturateColor(subItem.color,0.5) }" /> -->
196
- <svg xmlns="http://www.w3.org/2000/svg" class="h-8 w-8" width="80" height="80" viewBox="0 0 80 80">
197
- <g fill="none" stroke-linecap="round" stroke-width="4">
198
- <rect width="24" height="24" x="12" y="12" fill="#9b51e0" stroke="#9b51e0" rx="4" />
199
- <rect width="24" height="24" x="44" y="12" fill="#56ccf2" stroke="#56ccf2" rx="4" />
200
- <rect width="24" height="24" x="12" y="44" fill="#56ccf2" stroke="#56ccf2" rx="4" />
201
- <rect width="24" height="24" x="44" y="44" fill="#9b51e0" stroke="#9b51e0" rx="4" />
202
- </g>
203
- </svg>
204
- </view>
205
- </template>
206
- <template #text>
207
- <view class="pa-1 text-center text-10rpx text-gray-800 dark:text-white">
208
- <view class="line-clamp-1 font-medium">
209
- {{ subItem.title }}
210
- </view>
211
- </view>
212
- </template>
213
- </wd-grid-item>
214
- </wd-grid>
215
- </view>
216
- </template>
217
- </DemoCard>
218
- <slot name="listBottom" />
219
- </view>
220
-
221
- <template #bottom>
222
- <slot name="bottom" />
223
- </template>
224
- </z-paging>
225
- <wd-action-sheet
226
- v-model="sheetShow"
227
- :z-index="9999"
228
- :actions="actions"
229
- :title="title"
230
- @select="
231
- ({ item }) => {
232
- sheetGotoPage(item)
233
- }
234
- "
235
- />
236
- </template>
237
-
238
- <style scoped lang="scss">
239
- //深度样式覆盖
240
- :deep(.wd-grid-item__wrapper) {
241
- width: 50px !important;
242
- height: 40px !important;
243
- display: flex;
244
- align-items: center;
245
- justify-content: center;
246
- }
247
- </style>
1
+ <script setup lang="ts">
2
+ import type { PropType } from 'vue'
3
+ import { computed, defineOptions, defineProps, ref } from 'vue'
4
+ import { useRouter } from 'uni-mini-router'
5
+ import { onShow } from '@dcloudio/uni-app'
6
+ import { menu } from '../../api/menu'
7
+ import DemoCard from '../demo-card/demo-card.vue'
8
+ import { useManualTheme } from '../../composables/useManualTheme'
9
+ import { useGlobalToast } from '../../composables/useGlobalToast'
10
+ import { useColorGenerator } from '../../composables/useColorGenerator'
11
+ import { desaturateColor } from '../../utils'
12
+ import wuiMenusTop from './wui-menus-top.vue'
13
+
14
+ defineOptions({
15
+ name: 'WuiMenus',
16
+ })
17
+ const props = defineProps({
18
+ icons: {
19
+ type: Array as PropType<Icon[]>,
20
+ default: () => [],
21
+ },
22
+ load: {
23
+ type: Function as PropType<() => void>,
24
+ default: () => {},
25
+ },
26
+ menuTopType: {
27
+ type: String,
28
+ default: '',
29
+ },
30
+ })
31
+ // const user = useUser().getUserInfo()
32
+ const router = useRouter()
33
+ const toast = useGlobalToast()
34
+ interface Icon {
35
+ id: string
36
+ path: string
37
+ }
38
+ const { currentThemeColor } = useManualTheme()
39
+ const { generateRandomColor } = useColorGenerator(currentThemeColor.value.primary)
40
+ const menuList = ref([])
41
+ const title = ref('')
42
+ const filtermenu = computed(() => {
43
+ let arr = []
44
+ if (currentThemeColor.value.primary) {
45
+ arr = filterHiddenTree(menuList.value, 'items', true)
46
+ }
47
+ return arr
48
+ })
49
+ const sheetShow = ref(false)
50
+ const actions = ref([])
51
+ const paging = ref()
52
+ // 点击菜单跳转页面
53
+ function gotoPage(item: any) {
54
+ // 跳转页面
55
+ if (goto(item)) return
56
+ // 打开动作面板
57
+ openSheet(item)
58
+ }
59
+
60
+ // 点击动作面板跳转页面
61
+ function sheetGotoPage(item: any) {
62
+ // 跳转页面
63
+ if (goto(item)) return
64
+ // 打开动作面板
65
+ openSheet(item, 300)
66
+ }
67
+
68
+ // 跳转页面
69
+ function goto(item: any) {
70
+ console.log(item.pageType)
71
+ switch (item.pageType) {
72
+ case '列表':
73
+ router.push(`/pages/list/index?sourceId=${item.id}&title=${item.title}`)
74
+ return true
75
+ case '树':
76
+ router.push(`/pages/tree-page/index?sourceId=${item.id}&title=${item.title}`)
77
+ return true
78
+ case '报表':
79
+ // uni.navigateTo({
80
+ // url: `/pages/report-table/report-table?sourceId=${item.id}&title=${item.title}`,
81
+ // })
82
+ return true
83
+
84
+ default:
85
+ return false
86
+ }
87
+ }
88
+
89
+ // 打开wd-action-sheet动作面板
90
+ function openSheet(item: any, s = 0) {
91
+ if (item.items) {
92
+ title.value = item.title
93
+ actions.value = item.items
94
+ ? item.items.map((item: any) => {
95
+ return {
96
+ name: item.title,
97
+ // color: '#00000073',
98
+ ...item,
99
+ }
100
+ })
101
+ : []
102
+
103
+ // 设置二次打开的过渡时间
104
+ const id = setTimeout(() => {
105
+ sheetShow.value = true
106
+ clearTimeout(id)
107
+ }, s)
108
+ }
109
+ }
110
+
111
+ /**
112
+ * 根据 `disabled: true` 过滤树形数组(支持自定义子节点字段)
113
+ * @param {Array} tree 原始树形数据
114
+ * @param {string} [childKey] 子节点字段名
115
+ * @param {boolean} [deepClone] 是否深拷贝原数据
116
+ * @returns {Array} 过滤后的新树形数据
117
+ */
118
+ function filterHiddenTree(tree: any, childKey = 'children', deepClone = false) {
119
+ // 深拷贝处理(可选)
120
+ const clone = (data: any) => {
121
+ if (!deepClone) return data
122
+ return JSON.parse(JSON.stringify(data))
123
+ }
124
+
125
+ return clone(tree)
126
+ .filter((node: any) => !node.disabled) // 过滤当前层隐藏节点
127
+ .map((node: any) => {
128
+ // 递归处理子节点
129
+ if (Array.isArray(node[childKey])) {
130
+ node[childKey] = filterHiddenTree(node[childKey], childKey, deepClone)
131
+ }
132
+ const icon = props.icons.find((item: any) => {
133
+ return item.id === node.id
134
+ })
135
+ return {
136
+ ...node,
137
+ iconPath: (icon as any)?.path,
138
+ color: generateRandomColor().hex,
139
+ }
140
+ })
141
+ }
142
+ onShow(() => {
143
+ // if (paging.value) {
144
+ // paging.value.reload()
145
+ // }
146
+ })
147
+ // @query所绑定的方法不要自己调用!!需要刷新列表数据时,只需要调用this.$refs.paging.reload()即可
148
+ function queryList() {
149
+ // 此处请求仅为演示,请替换为自己项目中的请求
150
+ menu()
151
+ .then((res: any) => {
152
+ // 将请求结果通过complete传给z-paging处理,同时也代表请求结束,这一行必须调用
153
+ if (!res?.blocks.length) {
154
+ toast.warning('暂无权限,请重新登录或联系管理员')
155
+ }
156
+ uni.setNavigationBarTitle({ title: res?.programName || '' }) // 设置标题
157
+ paging.value.complete(res?.blocks || [])
158
+ })
159
+ .catch((res: any) => {
160
+ // 如果请求失败写this.$refs.paging.complete(false),会自动展示错误页面
161
+ // 注意,每次都需要在catch中写这句话很麻烦,z-paging提供了方案可以全局统一处理
162
+ // 在底层的网络请求抛出异常时,写uni.$emit('z-paging-error-emit');即可
163
+ console.log(res, 'menu error')
164
+ paging.value.complete(false)
165
+ })
166
+ }
167
+ </script>
168
+
169
+ <template>
170
+ <z-paging ref="paging" v-model="menuList" :loading-more-enabled="false" @query="queryList" @on-refresh="props.load">
171
+ <template #top>
172
+ <slot name="top" :style="{ background: currentThemeColor.primary }" />
173
+ </template>
174
+ <view>
175
+ <wuiMenusTop v-if="props.menuTopType !== '自定义'" />
176
+ <view v-if="props.menuTopType === '自定义'" class="p-1" />
177
+ <DemoCard v-for="(item, index) in filtermenu" :key="index" :title="item.title">
178
+ <template #content>
179
+ <view class="border-rd-2 bg-white pa-1 dark:bg-[var(--wot-dark-background2)]">
180
+ <wd-grid :column="4" clickable>
181
+ <wd-grid-item
182
+ v-for="(subItem, subIndex) in item.items"
183
+ :key="subIndex"
184
+ use-text-slot
185
+ use-icon-slot
186
+ @itemclick="gotoPage(subItem)"
187
+ >
188
+ <template #icon>
189
+ <view
190
+ class="flex items-center justify-center rounded-2"
191
+ :style="{ backgroundColor: desaturateColor(subItem.color, 0.25), height: '80rpx', width: '80rpx' }"
192
+ >
193
+ <!-- <text class="i-carbon:chart-combo-stacked text-center text-5"
194
+ :class="[props.icons.find(item => item.id === subItem.id)?.path]"
195
+ :style="{ color:desaturateColor(subItem.color,0.5) }" /> -->
196
+ <svg xmlns="http://www.w3.org/2000/svg" class="h-8 w-8" width="80" height="80" viewBox="0 0 80 80">
197
+ <g fill="none" stroke-linecap="round" stroke-width="4">
198
+ <rect width="24" height="24" x="12" y="12" fill="#9b51e0" stroke="#9b51e0" rx="4" />
199
+ <rect width="24" height="24" x="44" y="12" fill="#56ccf2" stroke="#56ccf2" rx="4" />
200
+ <rect width="24" height="24" x="12" y="44" fill="#56ccf2" stroke="#56ccf2" rx="4" />
201
+ <rect width="24" height="24" x="44" y="44" fill="#9b51e0" stroke="#9b51e0" rx="4" />
202
+ </g>
203
+ </svg>
204
+ </view>
205
+ </template>
206
+ <template #text>
207
+ <view class="pa-1 text-center text-10rpx text-gray-800 dark:text-white">
208
+ <view class="line-clamp-1 font-medium">
209
+ {{ subItem.title }}
210
+ </view>
211
+ </view>
212
+ </template>
213
+ </wd-grid-item>
214
+ </wd-grid>
215
+ </view>
216
+ </template>
217
+ </DemoCard>
218
+ <slot name="listBottom" />
219
+ </view>
220
+
221
+ <template #bottom>
222
+ <slot name="bottom" />
223
+ </template>
224
+ </z-paging>
225
+ <wd-action-sheet
226
+ v-model="sheetShow"
227
+ :z-index="9999"
228
+ :actions="actions"
229
+ :title="title"
230
+ @select="
231
+ ({ item }) => {
232
+ sheetGotoPage(item)
233
+ }
234
+ "
235
+ />
236
+ </template>
237
+
238
+ <style scoped lang="scss">
239
+ //深度样式覆盖
240
+ :deep(.wd-grid-item__wrapper) {
241
+ width: 50px !important;
242
+ height: 40px !important;
243
+ display: flex;
244
+ align-items: center;
245
+ justify-content: center;
246
+ }
247
+ </style>
@@ -1,43 +1,43 @@
1
- <script lang="ts" setup>
2
- import { defineOptions, defineProps } from 'vue'
3
- import { useManualTheme } from '../../../composables/useManualTheme'
4
- import { desaturateColor, getFirstChar } from '../../../utils'
5
-
6
- import { useUser } from '../../../composables/useUser'
7
- import { useMenus } from '../../../composables/useMenus'
8
- import { useSectionMenus } from '../../../composables/useSectionMenus'
9
-
10
- defineOptions({
11
- name: 'Navbar',
12
- })
13
- defineProps<{
14
- navTitle: string
15
- }>()
16
- const { currentThemeColor } = useManualTheme()
17
- const { messageBar } = useSectionMenus(true)
18
- const { gotoPage } = useMenus()
19
- const { nickName } = useUser()
20
-
21
- function messageAction() {
22
- if (messageBar.value) {
23
- gotoPage(messageBar.value)
24
- }
25
- }
26
- </script>
27
-
28
- <template>
29
- <view class="bg-white pa-3 backdrop-filter dark:bg-black">
30
- <view class="mx-auto max-w-7xl p-x-1">
31
- <view class="flex items-center justify-center">
32
- <view
33
- class="bg-clip-text font-size-5 text-transparent font-600 font-sans"
34
- :style="{ color: currentThemeColor.primary }"
35
- >
36
- {{ navTitle }}
37
- </view>
38
- </view>
39
- </view>
40
- </view>
41
- </template>
42
-
43
- <style scoped></style>
1
+ <script lang="ts" setup>
2
+ import { defineOptions, defineProps } from 'vue'
3
+ import { useManualTheme } from '../../../composables/useManualTheme'
4
+ import { desaturateColor, getFirstChar } from '../../../utils'
5
+
6
+ import { useUser } from '../../../composables/useUser'
7
+ import { useMenus } from '../../../composables/useMenus'
8
+ import { useSectionMenus } from '../../../composables/useSectionMenus'
9
+
10
+ defineOptions({
11
+ name: 'Navbar',
12
+ })
13
+ defineProps<{
14
+ navTitle: string
15
+ }>()
16
+ const { currentThemeColor } = useManualTheme()
17
+ const { messageBar } = useSectionMenus(true)
18
+ const { gotoPage } = useMenus()
19
+ const { nickName } = useUser()
20
+
21
+ function messageAction() {
22
+ if (messageBar.value) {
23
+ gotoPage(messageBar.value)
24
+ }
25
+ }
26
+ </script>
27
+
28
+ <template>
29
+ <view class="bg-white pa-3 backdrop-filter dark:bg-black">
30
+ <view class="mx-auto max-w-7xl p-x-1">
31
+ <view class="flex items-center justify-center">
32
+ <view
33
+ class="bg-clip-text font-size-5 text-transparent font-600 font-sans"
34
+ :style="{ color: currentThemeColor.primary }"
35
+ >
36
+ {{ navTitle }}
37
+ </view>
38
+ </view>
39
+ </view>
40
+ </view>
41
+ </template>
42
+
43
+ <style scoped></style>