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,73 +1,73 @@
1
- <script setup lang="ts">
2
- import { computed, defineEmits, defineOptions, defineProps, ref } from 'vue'
3
- import type { EnumItem, Enums, Split2TabCriterias } from '../../type'
4
-
5
- defineOptions({
6
- name: 'TabSearch',
7
- })
8
-
9
- const props = defineProps<{
10
- split2TabCriterias: Split2TabCriterias[]
11
- enums: Enums
12
- }>()
13
-
14
- const emit = defineEmits(['click'])
15
-
16
- interface TabData {
17
- name: string
18
- value: string
19
- sourceId: string
20
- }
21
- // 提取枚举值
22
- function enumColumn() {
23
- if (!props.split2TabCriterias)
24
- return []
25
- return props.split2TabCriterias.reduce<TabData[]>((acc, cur) => {
26
- const data = props.enums[cur.mstrucId]?.map((item: EnumItem) => {
27
- return { name: item.title, value: item.title, sourceId: cur.sourceId }
28
- }) || []
29
- acc = [...acc, ...data] // 更新累加器
30
- return acc // 显式返回累加器
31
- }, [])
32
- }
33
- // 提取特殊值
34
- function specialColumn() {
35
- if (!props.split2TabCriterias)
36
- return []
37
- const data = []
38
- for (let i = 0; i < props.split2TabCriterias.length; i++) {
39
- const element = props.split2TabCriterias[i]
40
- if (element.extControlType === 'single-checkbox') {
41
- data.push({ name: element.title, value: '1', sourceId: element.sourceId })
42
- }
43
- }
44
- return data
45
- }
46
- const tabs = computed(() => {
47
- const data1 = enumColumn()
48
- const data2 = specialColumn()
49
- return [{ name: '全部', value: '', sourceId: '' }, ...data1, ...data2]
50
- })
51
-
52
- const tab = ref<string>('')
53
-
54
- // click事件:点击标题
55
- function click(event: { index: number, name: string }) {
56
- const data = tabs.value.find(item => item.value === event.name)
57
- console.log(data, event)
58
- if (event.name) {
59
- emit('click', `c_${data?.sourceId}=${event.name}`)
60
- }
61
- else {
62
- emit('click', '')
63
- }
64
- }
65
- </script>
66
-
67
- <template>
68
- <wd-tabs v-model="tab" animated slidable="always" @click="click">
69
- <block v-for="item in tabs" :key="item.sourceId">
70
- <wd-tab :title="item.name" :name="item.value" />
71
- </block>
72
- </wd-tabs>
73
- </template>
1
+ <script setup lang="ts">
2
+ import { computed, defineEmits, defineOptions, defineProps, ref } from 'vue'
3
+ import type { EnumItem, Enums, Split2TabCriterias } from '../../type'
4
+
5
+ defineOptions({
6
+ name: 'TabSearch',
7
+ })
8
+
9
+ const props = defineProps<{
10
+ split2TabCriterias: Split2TabCriterias[]
11
+ enums: Enums
12
+ }>()
13
+
14
+ const emit = defineEmits(['click'])
15
+
16
+ interface TabData {
17
+ name: string
18
+ value: string
19
+ sourceId: string
20
+ }
21
+ // 提取枚举值
22
+ function enumColumn() {
23
+ if (!props.split2TabCriterias)
24
+ return []
25
+ return props.split2TabCriterias.reduce<TabData[]>((acc, cur) => {
26
+ const data = props.enums[cur.mstrucId]?.map((item: EnumItem) => {
27
+ return { name: item.title, value: item.title, sourceId: cur.sourceId }
28
+ }) || []
29
+ acc = [...acc, ...data] // 更新累加器
30
+ return acc // 显式返回累加器
31
+ }, [])
32
+ }
33
+ // 提取特殊值
34
+ function specialColumn() {
35
+ if (!props.split2TabCriterias)
36
+ return []
37
+ const data = []
38
+ for (let i = 0; i < props.split2TabCriterias.length; i++) {
39
+ const element = props.split2TabCriterias[i]
40
+ if (element.extControlType === 'single-checkbox') {
41
+ data.push({ name: element.title, value: '1', sourceId: element.sourceId })
42
+ }
43
+ }
44
+ return data
45
+ }
46
+ const tabs = computed(() => {
47
+ const data1 = enumColumn()
48
+ const data2 = specialColumn()
49
+ return [{ name: '全部', value: '', sourceId: '' }, ...data1, ...data2]
50
+ })
51
+
52
+ const tab = ref<string>('')
53
+
54
+ // click事件:点击标题
55
+ function click(event: { index: number, name: string }) {
56
+ const data = tabs.value.find(item => item.value === event.name)
57
+ console.log(data, event)
58
+ if (event.name) {
59
+ emit('click', `c_${data?.sourceId}=${event.name}`)
60
+ }
61
+ else {
62
+ emit('click', '')
63
+ }
64
+ }
65
+ </script>
66
+
67
+ <template>
68
+ <wd-tabs v-model="tab" animated slidable="always" @click="click">
69
+ <block v-for="item in tabs" :key="item.sourceId">
70
+ <wd-tab :title="item.name" :name="item.value" />
71
+ </block>
72
+ </wd-tabs>
73
+ </template>
@@ -1,200 +1,200 @@
1
- <script setup lang="ts">
2
- import { computed, defineEmits, defineProps, onMounted, ref } from 'vue'
3
- // 树形节点数据结构定义
4
- interface TreeNode {
5
- id: string
6
- name: string
7
- children?: TreeNode[]
8
- [key: string]: any // 允许其他自定义属性
9
- }
10
- // 选择模式类型
11
- type SelectMode = 'single' | 'multiple'
12
- const props = defineProps<{
13
- node: TreeNode
14
- selectMode: SelectMode
15
- selectedKeys: string[]
16
- setNodeRef: (id: string, el: HTMLElement | null) => void
17
- }>()
18
-
19
- const emit = defineEmits<{
20
- (e: 'update:selectedKeys', keys: string[], node: TreeNode): void
21
- (e: 'toggleExpand', node: TreeNode): void
22
- }>()
23
-
24
- // 节点DOM引用
25
- const nodeRef = ref<HTMLElement | null>(null)
26
-
27
- // 是否展开
28
- const isExpanded = ref(false)
29
-
30
- // 是否有子节点
31
- const hasChildren = computed(() => {
32
- return props.node.children && props.node.children.length > 0
33
- })
34
-
35
- // 是否选中
36
- const isSelected = computed(() => {
37
- return props.selectedKeys.includes(props.node.id)
38
- })
39
-
40
- // 注册节点引用
41
- onMounted(() => {
42
- props.setNodeRef(props.node.id, nodeRef.value)
43
- })
44
-
45
- // 切换展开/折叠
46
- function toggleExpand() {
47
- if (!isExpanded.value) {
48
- emit('toggleExpand', props.node)
49
- }
50
- isExpanded.value = !isExpanded.value
51
- }
52
-
53
- // 处理节点点击(仅用于展开/折叠)
54
- function handleNodeClick() {
55
- // if (hasChildren.value) {
56
- // toggleExpand()
57
- // }
58
- toggleExpand()
59
- }
60
-
61
- // 处理选择
62
- function handleSelectClick() {
63
- let newSelectedKeys: string[] = []
64
-
65
- if (props.selectMode === 'single') {
66
- // 单选模式
67
- newSelectedKeys = [props.node.id]
68
- }
69
- else {
70
- // 多选模式
71
- if (isSelected.value) {
72
- // 取消选择
73
- newSelectedKeys = props.selectedKeys.filter(key => key !== props.node.id)
74
- }
75
- else {
76
- // 选中
77
- newSelectedKeys = [...props.selectedKeys, props.node.id]
78
- }
79
- }
80
-
81
- emit('update:selectedKeys', newSelectedKeys, props.node)
82
- }
83
-
84
- // 处理子节点选择
85
- function handleChildSelect(keys: string[], node: TreeNode) {
86
- emit('update:selectedKeys', keys, node)
87
- }
88
- </script>
89
-
90
- <template>
91
- <view ref="nodeRef" class="tree-node" :class="{ 'has-children': hasChildren }">
92
- <view class="node-content" @click="handleNodeClick">
93
- <!-- 展开/折叠图标 -->
94
- <!-- <view v-if="hasChildren" class="expand-icon" @click.stop="toggleExpand">
95
- <wd-icon :name="isExpanded ? 'arrow-up' : 'arrow-down'" size="18" color="#999" />
96
- </view>
97
- <view v-else class="expand-icon" /> -->
98
- <view class="expand-icon" @click.stop="handleNodeClick">
99
- <wd-icon :name="isExpanded ? 'arrow-up' : 'arrow-down'" size="18" color="#999" />
100
- </view>
101
-
102
- <!-- 选择框 -->
103
- <view class="selector-container" @click.stop="handleSelectClick">
104
- <wd-checkbox custom-class="selector" :true-value="node.id" :model-value="selectedKeys.find((item) => item === node.id)">
105
- <!-- {{ node.name }} -->
106
- </wd-checkbox>
107
- </view>
108
-
109
- <!-- 节点名称 -->
110
- <view class="node-name">
111
- {{ node.name }}
112
- </view>
113
- </view>
114
-
115
- <!-- 子节点 -->
116
- <view
117
- v-if="hasChildren" class="children-nodes" :style="{
118
- paddingLeft: '24px',
119
- display: isExpanded ? 'block' : 'none',
120
- }"
121
- >
122
- <tree-node
123
- v-for="child in node.children" :key="child.id" :node="child" :select-mode="selectMode"
124
- :selected-keys="selectedKeys" :set-node-ref="setNodeRef" @update:selected-keys="handleChildSelect"
125
- />
126
- </view>
127
- </view>
128
- </template>
129
-
130
- <style scoped>
131
- .tree-node {
132
- transition: all 0.2s ease;
133
- }
134
-
135
- .selector{
136
- /* background-color: #333; */
137
- display: flex;
138
- align-items: center;
139
- justify-content: center;
140
- }
141
-
142
- .node-content {
143
- display: flex;
144
- align-items: center;
145
- height: 44px;
146
- border-radius: 8px;
147
- padding: 0 4px;
148
- transition: background-color 0.2s;
149
- }
150
-
151
- .node-content:hover {
152
- background-color: #f5f7fa;
153
- }
154
-
155
- .expand-icon {
156
- width: 40px;
157
- height: 24px;
158
- display: flex;
159
- align-items: center;
160
- justify-content: center;
161
- cursor: pointer;
162
- }
163
-
164
- .selector-container {
165
- width: 24px;
166
- height: 24px;
167
- display: flex;
168
- align-items: center;
169
- justify-content: center;
170
- }
171
-
172
- .node-name {
173
- flex: 1;
174
- text-align: left;
175
- font-size: 16px;
176
- color: #333;
177
- padding-left: 4px;
178
- }
179
-
180
- .children-nodes {
181
- transition: all 0.3s ease;
182
- }
183
-
184
- /* 动画效果 */
185
- .children-nodes {
186
- animation: fadeIn 0.2s ease;
187
- }
188
-
189
- @keyframes fadeIn {
190
- from {
191
- opacity: 0;
192
- transform: translateY(-5px);
193
- }
194
-
195
- to {
196
- opacity: 1;
197
- transform: translateY(0);
198
- }
199
- }
200
- </style>
1
+ <script setup lang="ts">
2
+ import { computed, defineEmits, defineProps, onMounted, ref } from 'vue'
3
+ // 树形节点数据结构定义
4
+ interface TreeNode {
5
+ id: string
6
+ name: string
7
+ children?: TreeNode[]
8
+ [key: string]: any // 允许其他自定义属性
9
+ }
10
+ // 选择模式类型
11
+ type SelectMode = 'single' | 'multiple'
12
+ const props = defineProps<{
13
+ node: TreeNode
14
+ selectMode: SelectMode
15
+ selectedKeys: string[]
16
+ setNodeRef: (id: string, el: HTMLElement | null) => void
17
+ }>()
18
+
19
+ const emit = defineEmits<{
20
+ (e: 'update:selectedKeys', keys: string[], node: TreeNode): void
21
+ (e: 'toggleExpand', node: TreeNode): void
22
+ }>()
23
+
24
+ // 节点DOM引用
25
+ const nodeRef = ref<HTMLElement | null>(null)
26
+
27
+ // 是否展开
28
+ const isExpanded = ref(false)
29
+
30
+ // 是否有子节点
31
+ const hasChildren = computed(() => {
32
+ return props.node.children && props.node.children.length > 0
33
+ })
34
+
35
+ // 是否选中
36
+ const isSelected = computed(() => {
37
+ return props.selectedKeys.includes(props.node.id)
38
+ })
39
+
40
+ // 注册节点引用
41
+ onMounted(() => {
42
+ props.setNodeRef(props.node.id, nodeRef.value)
43
+ })
44
+
45
+ // 切换展开/折叠
46
+ function toggleExpand() {
47
+ if (!isExpanded.value) {
48
+ emit('toggleExpand', props.node)
49
+ }
50
+ isExpanded.value = !isExpanded.value
51
+ }
52
+
53
+ // 处理节点点击(仅用于展开/折叠)
54
+ function handleNodeClick() {
55
+ // if (hasChildren.value) {
56
+ // toggleExpand()
57
+ // }
58
+ toggleExpand()
59
+ }
60
+
61
+ // 处理选择
62
+ function handleSelectClick() {
63
+ let newSelectedKeys: string[] = []
64
+
65
+ if (props.selectMode === 'single') {
66
+ // 单选模式
67
+ newSelectedKeys = [props.node.id]
68
+ }
69
+ else {
70
+ // 多选模式
71
+ if (isSelected.value) {
72
+ // 取消选择
73
+ newSelectedKeys = props.selectedKeys.filter(key => key !== props.node.id)
74
+ }
75
+ else {
76
+ // 选中
77
+ newSelectedKeys = [...props.selectedKeys, props.node.id]
78
+ }
79
+ }
80
+
81
+ emit('update:selectedKeys', newSelectedKeys, props.node)
82
+ }
83
+
84
+ // 处理子节点选择
85
+ function handleChildSelect(keys: string[], node: TreeNode) {
86
+ emit('update:selectedKeys', keys, node)
87
+ }
88
+ </script>
89
+
90
+ <template>
91
+ <view ref="nodeRef" class="tree-node" :class="{ 'has-children': hasChildren }">
92
+ <view class="node-content" @click="handleNodeClick">
93
+ <!-- 展开/折叠图标 -->
94
+ <!-- <view v-if="hasChildren" class="expand-icon" @click.stop="toggleExpand">
95
+ <wd-icon :name="isExpanded ? 'arrow-up' : 'arrow-down'" size="18" color="#999" />
96
+ </view>
97
+ <view v-else class="expand-icon" /> -->
98
+ <view class="expand-icon" @click.stop="handleNodeClick">
99
+ <wd-icon :name="isExpanded ? 'arrow-up' : 'arrow-down'" size="18" color="#999" />
100
+ </view>
101
+
102
+ <!-- 选择框 -->
103
+ <view class="selector-container" @click.stop="handleSelectClick">
104
+ <wd-checkbox custom-class="selector" :true-value="node.id" :model-value="selectedKeys.find((item) => item === node.id)">
105
+ <!-- {{ node.name }} -->
106
+ </wd-checkbox>
107
+ </view>
108
+
109
+ <!-- 节点名称 -->
110
+ <view class="node-name">
111
+ {{ node.name }}
112
+ </view>
113
+ </view>
114
+
115
+ <!-- 子节点 -->
116
+ <view
117
+ v-if="hasChildren" class="children-nodes" :style="{
118
+ paddingLeft: '24px',
119
+ display: isExpanded ? 'block' : 'none',
120
+ }"
121
+ >
122
+ <tree-node
123
+ v-for="child in node.children" :key="child.id" :node="child" :select-mode="selectMode"
124
+ :selected-keys="selectedKeys" :set-node-ref="setNodeRef" @update:selected-keys="handleChildSelect"
125
+ />
126
+ </view>
127
+ </view>
128
+ </template>
129
+
130
+ <style scoped>
131
+ .tree-node {
132
+ transition: all 0.2s ease;
133
+ }
134
+
135
+ .selector{
136
+ /* background-color: #333; */
137
+ display: flex;
138
+ align-items: center;
139
+ justify-content: center;
140
+ }
141
+
142
+ .node-content {
143
+ display: flex;
144
+ align-items: center;
145
+ height: 44px;
146
+ border-radius: 8px;
147
+ padding: 0 4px;
148
+ transition: background-color 0.2s;
149
+ }
150
+
151
+ .node-content:hover {
152
+ background-color: #f5f7fa;
153
+ }
154
+
155
+ .expand-icon {
156
+ width: 40px;
157
+ height: 24px;
158
+ display: flex;
159
+ align-items: center;
160
+ justify-content: center;
161
+ cursor: pointer;
162
+ }
163
+
164
+ .selector-container {
165
+ width: 24px;
166
+ height: 24px;
167
+ display: flex;
168
+ align-items: center;
169
+ justify-content: center;
170
+ }
171
+
172
+ .node-name {
173
+ flex: 1;
174
+ text-align: left;
175
+ font-size: 16px;
176
+ color: #333;
177
+ padding-left: 4px;
178
+ }
179
+
180
+ .children-nodes {
181
+ transition: all 0.3s ease;
182
+ }
183
+
184
+ /* 动画效果 */
185
+ .children-nodes {
186
+ animation: fadeIn 0.2s ease;
187
+ }
188
+
189
+ @keyframes fadeIn {
190
+ from {
191
+ opacity: 0;
192
+ transform: translateY(-5px);
193
+ }
194
+
195
+ to {
196
+ opacity: 1;
197
+ transform: translateY(0);
198
+ }
199
+ }
200
+ </style>