@lambo-design/pro-layout 1.0.0-beta.44 → 1.0.0-beta.441

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 (40) hide show
  1. package/package.json +11 -4
  2. package/src/components/pro-layout-header/index.vue +220 -0
  3. package/src/components/pro-layout-header/pro-layout-logo/index.vue +206 -0
  4. package/src/components/pro-layout-header/pro-layout-nav/components/pro-layout-nav-slide-menu.vue +398 -0
  5. package/src/components/pro-layout-header/pro-layout-nav/index-slide.vue +226 -0
  6. package/src/components/pro-layout-header/pro-layout-nav/index.vue +564 -0
  7. package/src/components/pro-layout-header/pro-layout-slogan/index.vue +40 -0
  8. package/src/components/pro-layout-header/pro-layout-tools/components/pro-layout-tools-quick-collect.vue +79 -0
  9. package/src/components/pro-layout-header/pro-layout-tools/components/pro-layout-tools-quick-document.vue +82 -0
  10. package/src/components/pro-layout-header/pro-layout-tools/components/pro-layout-tools-quick-fullscreen.vue +144 -0
  11. package/src/components/pro-layout-header/pro-layout-tools/components/pro-layout-tools-quick-icons.vue +99 -0
  12. package/src/components/pro-layout-header/pro-layout-tools/components/pro-layout-tools-quick-intl.vue +109 -0
  13. package/src/components/pro-layout-header/pro-layout-tools/components/pro-layout-tools-quick-notice.vue +133 -0
  14. package/src/components/pro-layout-header/pro-layout-tools/components/pro-layout-tools-quick-search.vue +305 -0
  15. package/src/components/pro-layout-header/pro-layout-tools/components/pro-layout-tools-quick-todo.vue +145 -0
  16. package/src/components/pro-layout-header/pro-layout-tools/components/pro-layout-tools-user.vue +64 -0
  17. package/src/components/pro-layout-header/pro-layout-tools/index.vue +38 -0
  18. package/src/components/pro-layout-header/pro-layout-trigger/index.vue +84 -0
  19. package/src/components/{pro-layout-sider-collapsed-menu.vue → pro-layout-sider/components/pro-layout-sider-collapsed-menu.vue} +30 -11
  20. package/src/components/{pro-layout-sider-icon.vue → pro-layout-sider/components/pro-layout-sider-icon.vue} +2 -2
  21. package/src/components/pro-layout-sider/components/pro-layout-sider-menu-item.vue +137 -0
  22. package/src/components/pro-layout-sider/components/pro-layout-sider-other-menu.vue +140 -0
  23. package/src/components/pro-layout-sider/components/pro-layout-sider-search.vue +345 -0
  24. package/src/components/pro-layout-sider/index.vue +477 -0
  25. package/src/components/{pro-layout-tabs.vue → pro-layout-tabs/index.vue} +115 -22
  26. package/src/index.vue +302 -38
  27. package/src/styles/color.less +267 -0
  28. package/src/styles/images/xiaoxitongzhi.png +0 -0
  29. package/src/styles/other-menu.less +63 -111
  30. package/src/utils/menuItem.js +10 -0
  31. package/src/utils/sider.js +16 -1
  32. package/src/components/pro-layout-header.vue +0 -52
  33. package/src/components/pro-layout-logo.vue +0 -79
  34. package/src/components/pro-layout-nav.vue +0 -150
  35. package/src/components/pro-layout-other-menu.vue +0 -138
  36. package/src/components/pro-layout-sider-menu-item.vue +0 -37
  37. package/src/components/pro-layout-sider.vue +0 -240
  38. package/src/components/pro-layout-tools-user.vue +0 -84
  39. package/src/components/pro-layout-tools.vue +0 -21
  40. package/src/components/pro-layout-trigger.vue +0 -48
@@ -0,0 +1,398 @@
1
+ <template>
2
+ <div class="menu-list" ref="menuList">
3
+ <ul class="top-menu" :style="layoutSize === 'default' ? {height: '64px'} : {height: '50px'}" ref="topNav">
4
+ <template v-for="(item,index) in topMenList" >
5
+ <li class="top-menu-item"
6
+ :class="{ 'active': getIsActive(item) }"
7
+ :key="item.appId"
8
+ @click="selectApp(item.appId)">
9
+ <div class="menu-item" :style="layoutSize === 'default' ? {paddingTop: '10px'} : {paddingTop: '2px'}">
10
+ <p class="menu-icon" v-show="systemInfo.navLogo==='1'"><Icon :type="item.icon" :size="20"></Icon></p>
11
+ <p class="menu-txt" :title="item.name">{{ item.name }}</p>
12
+ </div>
13
+ </li>
14
+ </template>
15
+ </ul>
16
+ </div>
17
+ </template>
18
+
19
+ <script>
20
+ import Bus from '@lambo-design/shared/utils/bus'
21
+ import { deepCopy } from '@lambo-design/shared/utils/assist'
22
+ import _ from "lodash";
23
+ import {getSessionStorage} from "@lambo-design/shared/utils/n";
24
+
25
+ export default {
26
+ props: {
27
+ acceptInt: {
28
+ type: Number,
29
+ default: 0
30
+ },
31
+ topMenListNum: {
32
+ type: Number,
33
+ default: 0
34
+ },
35
+ availableWidth: {
36
+ type: Number,
37
+ default: 800
38
+ },
39
+ notHomeIndex: {
40
+ type: Boolean,
41
+ default: true
42
+ }
43
+ },
44
+ data() {
45
+ return {
46
+ systemInfo:{},
47
+ pointer:0,
48
+ arrowFlag: true,
49
+ acceptAppId: '',
50
+ navList: [],
51
+ topMenList: [],
52
+ topTqmMenList:[],
53
+ otherList: [],
54
+ activeName: '',
55
+ topMenuNum: 7,
56
+ displayMenuNum: 7, // 实际显示的菜单数量
57
+ lastTopMenuNum:-1,
58
+ originMenuList: [],
59
+ layoutSize:"default",
60
+ // menuItemWidths: [], // 存储每个菜单项的宽度
61
+ resizeObserver: null,
62
+ }
63
+ },
64
+ methods: {
65
+ initListener() {
66
+ Bus.$on('system-info',(data) => {
67
+ this.initSystemInfo(data);
68
+ })
69
+ Bus.$on('nav-list', (data) => {
70
+ this.initNav(data)
71
+ })
72
+ Bus.$on('change-app', ({ appId, appInfo }) => {
73
+ this.changeApp(appId, appInfo)
74
+ })
75
+ },
76
+ destroyListener() {
77
+ Bus.$off('system-info')
78
+ Bus.$off('nav-list')
79
+ Bus.$off('change-app')
80
+ },
81
+ initSystemInfo(data) {
82
+ if (data) {
83
+ this.systemInfo = data
84
+ this.layoutSize = data.layoutSize ? data.layoutSize : 'default';
85
+ this.topMenuNum = Number.isInteger(data.topMenu) ? data.topMenu : 4;
86
+ this.acceptAppId = data.acceptAppId ? data.acceptAppId : '';
87
+ if (!this.activeName && this.notHomeIndex) {
88
+ this.activeName = this.acceptAppId
89
+ }
90
+ this.initNav(this.navList)
91
+ }
92
+ },
93
+ initNav(data) {
94
+ // 过滤掉首页项,获取真实的业务数据
95
+ const realData = data.filter(item => item.appId !== 'backHome');
96
+ if (realData.toString() === this.navList.toString() && this.topMenuNum === this.lastTopMenuNum) {
97
+ return
98
+ }
99
+ this.navList = realData
100
+ this.lastTopMenuNum = this.topMenuNum
101
+
102
+ let dataClone = _.cloneDeep(realData);
103
+ // 如果配置了显示首页且显示样式是应用式,在列表最前面添加首页项
104
+ if (dataClone && dataClone.length > 0 && this.systemInfo.backToHome && this.systemInfo.backToHomeStyle === "app") {
105
+ const homeItem = {
106
+ appId: 'backHome',
107
+ name: this.systemInfo.backToHomeText || '首页',
108
+ icon: 'ios-home',
109
+ selected: false
110
+ };
111
+ dataClone.unshift(homeItem);
112
+ }
113
+
114
+ this.topMenList = dataClone
115
+ this.$emit('topMen-list', this.topMenList);
116
+
117
+ // 计算可以显示的菜单数量
118
+ this.calculateDisplayMenuNum();
119
+
120
+ if (this.topMenList.length > 0) {
121
+ let appId = this.topMenList[0].appId
122
+ if (this.systemInfo.backToHome && this.systemInfo.backToHomeStyle === "app") {
123
+ appId = this.topMenList[1].appId;
124
+ }
125
+ for (let i = 0; i < this.topMenList.length; i++) {
126
+ if (this.topMenList[i].selected == true) {
127
+ appId = this.topMenList[i].appId
128
+ }
129
+ }
130
+ if (this.activeName) {
131
+ appId = this.activeName
132
+ }
133
+ if (this.notHomeIndex) {
134
+ this.selectApp(appId)
135
+ } else if (this.systemInfo.backToHome === "1" && this.systemInfo.backToHomeStyle === "app") {
136
+ this.activeName = 'backHome'
137
+ }
138
+ }
139
+ },
140
+ // 计算可以显示的菜单数量
141
+ calculateDisplayMenuNum() {
142
+ this.$nextTick(() => {
143
+ if (!this.$refs.menuList) return;
144
+
145
+ // 获取单个菜单项的平均宽度
146
+ // const menuItems = this.$refs.menuList.querySelectorAll('.top-menu-item');
147
+ // if (menuItems.length === 0) return;
148
+
149
+ let totalWidth = 0;
150
+ let itemWidths = [];
151
+
152
+ // 临时显示所有菜单项以测量宽度
153
+ // menuItems.forEach((item, index) => {
154
+ // item.style.display = 'block';
155
+ // const width = item.offsetWidth;
156
+ // itemWidths.push(width);
157
+ // totalWidth += width;
158
+ // });
159
+
160
+ // this.menuItemWidths = itemWidths;
161
+
162
+ // 计算可以显示的菜单数量
163
+ let displayCount = 0;
164
+ let accumulatedWidth = 0;
165
+ const reservedWidth = 40; // 预留一些边距
166
+
167
+ this.topMenList.forEach((item, index) => {
168
+ const estimatedWidth = this.estimateMenuItemWidth(item);
169
+ if (accumulatedWidth + estimatedWidth <= this.availableWidth - reservedWidth) {
170
+ accumulatedWidth += estimatedWidth;
171
+ displayCount++;
172
+ }
173
+ })
174
+ //
175
+ // for (let i = 0; i < itemWidths.length; i++) {
176
+ // if (accumulatedWidth + itemWidths[i] <= this.availableWidth - reservedWidth) {
177
+ // accumulatedWidth += itemWidths[i];
178
+ // displayCount++;
179
+ // } else {
180
+ // break;
181
+ // }
182
+ // }
183
+
184
+ // 确保至少显示一个菜单项
185
+ let displayMenuNum = Math.max(1, displayCount);
186
+
187
+ // 如果配置的数量更小则依赖配置
188
+ if(this.topMenuNum < displayMenuNum){
189
+ this.displayMenuNum = this.topMenuNum
190
+ }else{
191
+ this.displayMenuNum = displayMenuNum
192
+ }
193
+
194
+ // this.displayMenuNum = Math.max(1, displayCount);
195
+ // 判断是否需要显示箭头
196
+ const needArrows = this.topMenList.length > this.displayMenuNum && this.displayMenuNum > 0;
197
+ this.$emit('topMen-num', this.displayMenuNum);
198
+ this.$emit('topMen-true', needArrows);
199
+
200
+ // 向父组件报告实际宽度
201
+ this.$emit('menu-width-change', totalWidth);
202
+
203
+ //重新调整样式
204
+ // menuItems.forEach((item, index) => {
205
+ // if(!(this.pointer <= index && index < (this.pointer + this.displayMenuNum))){
206
+ // item.style.display = 'none';
207
+ // }else{
208
+ // item.style.display = 'block'
209
+ // }
210
+ // });
211
+ });
212
+ },
213
+ estimateMenuItemWidth(item) {
214
+ // 基础宽度:内边距 + 边框
215
+ let baseWidth = 30;
216
+
217
+ // 图标宽度
218
+ if (item.icon && this.systemInfo.navLogo === '1') {
219
+ baseWidth += 30;
220
+ }
221
+
222
+ // 文字宽度估算(每个字符约14px)
223
+
224
+ const textWidth = (item.name || '').length * 14;
225
+ return baseWidth + textWidth;
226
+ },
227
+
228
+ selectApp(appId) {
229
+ if (appId) {
230
+ if (appId === 'backHome') {
231
+ Bus.$emit("change-app", {
232
+ appId,
233
+ appInfo: {}
234
+ });
235
+ return;
236
+ }
237
+ this.activeName = appId
238
+ let res = this.navList.filter(app => app.appId == appId)
239
+ Bus.$emit('change-app', { appId, appInfo: res[0] })
240
+ }
241
+ },
242
+ changeApp(appId, appInfo){
243
+ if (appId) {
244
+ this.activeName = appId
245
+ }
246
+ },
247
+ // 监听菜单容器大小变化
248
+ observeResize() {
249
+ if (window.ResizeObserver) {
250
+ this.resizeObserver = new ResizeObserver(() => {
251
+ this.calculateDisplayMenuNum();
252
+ this.controlVisable()
253
+ });
254
+
255
+ if (this.$refs.menuList) {
256
+ this.resizeObserver.observe(this.$refs.menuList);
257
+ }
258
+ }
259
+ },
260
+ controlVisable(){
261
+ //重新调整样式
262
+ const menuItems = this.$refs.menuList.querySelectorAll('.top-menu-item');
263
+ menuItems.forEach((item, index) => {
264
+ if(!(this.pointer <= index && index < (this.pointer + this.displayMenuNum))){
265
+ item.style.display = 'none';
266
+ }else{
267
+ item.style.display = 'block';
268
+ }
269
+ });
270
+ },
271
+ getIsActive(item) {
272
+ // 如果不是首页模式,直接比较 appId
273
+ if (this.notHomeIndex) {
274
+ return this.activeName === item.appId;
275
+ }
276
+
277
+ // 如果是首页模式,检查当前 activeName 对应的应用是否隐藏了左侧菜单
278
+ const appList = getSessionStorage('appList');
279
+ if (appList && Array.isArray(appList) && appList.length > 0) {
280
+ // 查找当前 activeName 对应的应用
281
+ const currentApp = appList.find(app => app.appId === this.activeName);
282
+ // 如果找到应用且隐藏了左侧菜单,该应用应该保持激活状态
283
+ if (currentApp) {
284
+ let isHideLeftMenu;
285
+ if (currentApp.extendProps) {
286
+ if (typeof currentApp.extendProps === 'string') {
287
+ isHideLeftMenu = JSON.parse(currentApp.extendProps)?.is_hide_left_menu;
288
+ } else {
289
+ isHideLeftMenu = currentApp.extendProps.is_hide_left_menu;
290
+ }
291
+ }
292
+ if (!isHideLeftMenu && currentApp.setting) {
293
+ if (typeof currentApp.setting === 'string') {
294
+ isHideLeftMenu = JSON.parse(currentApp.setting)?.is_hide_left_menu;
295
+ } else {
296
+ isHideLeftMenu = currentApp.setting.is_hide_left_menu;
297
+ }
298
+ }
299
+ if ((isHideLeftMenu === '1' || isHideLeftMenu === 1) && this.activeName === item.appId) {
300
+ return true;
301
+ }
302
+ }
303
+ }
304
+
305
+ // 否则只有 backHome 项应该是激活的
306
+ return 'backHome' === item.appId;
307
+ }
308
+ },
309
+ watch: {
310
+ acceptInt(val){
311
+ this.pointer = val;
312
+ this.controlVisable()
313
+ },
314
+ availableWidth(newVal, oldVal) {
315
+ if (newVal !== oldVal) {
316
+ this.calculateDisplayMenuNum();
317
+ }
318
+ },
319
+ topMenList() {
320
+ this.calculateDisplayMenuNum();
321
+ }
322
+ },
323
+ mounted() {
324
+ this.calculateDisplayMenuNum();
325
+ this.$nextTick(() => {
326
+ this.observeResize();
327
+ });
328
+ },
329
+ created() {
330
+ this.initListener()
331
+ },
332
+ beforeDestroy() {
333
+ this.destroyListener();
334
+ if (this.resizeObserver) {
335
+ this.resizeObserver.disconnect();
336
+ }
337
+ }
338
+ }
339
+ </script>
340
+
341
+ <style scoped lang="less">
342
+ @import '@lambo-design/core/src/styles/default.less';
343
+ .menu-list {
344
+ height: 100%;
345
+ line-height: 24px;
346
+ cursor: pointer;
347
+ font-size: 16px;
348
+ margin-left: 15px;
349
+ overflow: hidden;
350
+
351
+ .top-menu {
352
+ overflow: hidden;
353
+ white-space: nowrap;
354
+
355
+ .top-menu-item {
356
+ padding-left: 15px;
357
+ padding-right: 15px;
358
+ position: relative;
359
+ height: 100%;
360
+ list-style: none;
361
+ float: left;
362
+ transition: all 0.3s ease;
363
+
364
+ &:hover {
365
+ .menu-item {
366
+ // hover styles
367
+ }
368
+ }
369
+ &.active {
370
+ .menu-item {
371
+ // active styles
372
+ }
373
+ }
374
+ .menu-item {
375
+ display: flex;
376
+ margin-top: 10px;
377
+ text-align: center;
378
+ }
379
+ .menu-icon {
380
+ height: 20px;
381
+ line-height: 20px;
382
+ text-align: center;
383
+ margin-right: 10px;
384
+ margin-top: 3px;
385
+ }
386
+ .menu-txt {
387
+ text-align: center;
388
+ font-size: 14px;
389
+ line-height: 2;
390
+ white-space: nowrap;
391
+ overflow: hidden;
392
+ text-overflow: ellipsis;
393
+ max-width: 120px; // 限制最大宽度
394
+ }
395
+ }
396
+ }
397
+ }
398
+ </style>
@@ -0,0 +1,226 @@
1
+ <template>
2
+ <div class="pro-layout-nav-slide-wrapper" ref="slideWrapper">
3
+ <div class="nav-box-slide" ref="navBox" :style="{ width: availableWidth + 'px' }">
4
+ <LamboProNavSlideMenu
5
+ :not-home-index="notHomeIndex"
6
+ :accept-int="pointer"
7
+ :available-width="availableWidth"
8
+ @topMen-list="handleCustomEvent"
9
+ @topMen-num="topMen"
10
+ @topMen-true="topMenTrue"
11
+ @menu-width-change="handleMenuWidthChange"
12
+ ref="menu"
13
+ ></LamboProNavSlideMenu>
14
+ </div>
15
+ <!--slide按钮-->
16
+ <div class="tools-box-slide" v-if="shouldShowArrows">
17
+ <div style="margin-right: 50px;">
18
+ <Icon
19
+ class="more-menu"
20
+ style="margin-right: 10px"
21
+ type="md-arrow-dropleft-circle"
22
+ v-if="arrowFlag"
23
+ @click="moveMenu('left')"
24
+ :style="{ opacity: canMoveLeft ? 1 : 0.3 }"
25
+ />
26
+ <Icon
27
+ type="md-arrow-dropright-circle"
28
+ class="more-menu"
29
+ v-if="arrowFlag"
30
+ @click="moveMenu('right')"
31
+ :style="{ opacity: canMoveRight ? 1 : 0.3 }"
32
+ />
33
+ </div>
34
+ </div>
35
+ </div>
36
+ </template>
37
+
38
+ <script>
39
+ import LamboProNavSlideMenu from './components/pro-layout-nav-slide-menu'
40
+
41
+ export default {
42
+ props: {
43
+ availableWidth: {
44
+ type: Number,
45
+ default: 800
46
+ },
47
+ autoCalculateWidth: {
48
+ type: Boolean,
49
+ default: true
50
+ },
51
+ notHomeIndex: {
52
+ type: Boolean,
53
+ default: true
54
+ }
55
+ },
56
+ data(){
57
+ return {
58
+ pointer: 0,
59
+ topList: [],
60
+ topNum: 0,
61
+ arrowFlag: false,
62
+ menuActualWidth: 0,
63
+ shouldShowArrows: false,
64
+ canMoveLeft: false,
65
+ canMoveRight: false,
66
+ resizeObserver: null,
67
+ }
68
+ },
69
+ components: {
70
+ LamboProNavSlideMenu
71
+ },
72
+ methods:{
73
+ handleCustomEvent(data) {
74
+ // 接收子组件传递的数据
75
+ this.topList = data;
76
+ this.checkWidthAndArrows();
77
+ },
78
+ topMen(data){
79
+ this.topNum = data;
80
+ this.checkWidthAndArrows();
81
+ },
82
+ topMenTrue(data){
83
+ this.arrowFlag = data;
84
+ this.checkWidthAndArrows();
85
+ },
86
+ // 处理菜单宽度变化
87
+ handleMenuWidthChange(width) {
88
+ this.menuActualWidth = width;
89
+ this.checkWidthAndArrows();
90
+ },
91
+ // 检查宽度并决定是否显示箭头
92
+ checkWidthAndArrows() {
93
+ this.$nextTick(() => {
94
+ if (!this.autoCalculateWidth) {
95
+ this.shouldShowArrows = this.arrowFlag;
96
+ return;
97
+ }
98
+
99
+ // 计算实际菜单宽度
100
+ const navBox = this.$refs.navBox;
101
+ if (navBox) {
102
+ const menuContainer = navBox.querySelector('.menu-list');
103
+ if (menuContainer) {
104
+ this.menuActualWidth = menuContainer.scrollWidth;
105
+ }
106
+ }
107
+
108
+ // 预留箭头按钮空间
109
+ const arrowSpace = 80;
110
+ const effectiveWidth = this.availableWidth - arrowSpace;
111
+
112
+ // 判断是否需要显示箭头
113
+ this.shouldShowArrows = this.menuActualWidth > effectiveWidth;
114
+
115
+ if (this.shouldShowArrows) {
116
+ this.updateArrowStates();
117
+ }
118
+
119
+ // 触发宽度变化事件
120
+ this.$emit('width-change', {
121
+ available: this.availableWidth,
122
+ actual: this.menuActualWidth,
123
+ needArrows: this.shouldShowArrows
124
+ });
125
+
126
+ });
127
+ },
128
+ // 更新箭头状态
129
+ updateArrowStates() {
130
+ if (!this.shouldShowArrows) {
131
+ this.canMoveLeft = false;
132
+ this.canMoveRight = false;
133
+ return;
134
+ }
135
+
136
+ // 计算最大可移动位置
137
+ const maxPointer = Math.max(0, this.topList.length - this.topNum);
138
+
139
+ this.canMoveLeft = this.pointer > 0;
140
+ this.canMoveRight = this.pointer < maxPointer;
141
+ },
142
+ moveMenu: function (direction) {
143
+ if (!this.shouldShowArrows) return;
144
+
145
+ const maxPointer = Math.max(0, this.topList.length - this.topNum);
146
+
147
+ if (direction === "right") {
148
+ if (this.pointer < maxPointer) {
149
+ this.pointer++;
150
+ }
151
+ } else {
152
+ if (this.pointer > 0) {
153
+ this.pointer--;
154
+ }
155
+ }
156
+
157
+ this.updateArrowStates();
158
+
159
+ this.flag = false;
160
+ let self = this;
161
+ setTimeout(() => {
162
+ self.flag = true;
163
+ }, 0);
164
+ },
165
+ // 监听容器大小变化
166
+ observeResize() {
167
+ if (window.ResizeObserver) {
168
+ this.resizeObserver = new ResizeObserver(() => {
169
+ this.checkWidthAndArrows();
170
+ });
171
+
172
+ if (this.$refs.slideWrapper) {
173
+ this.resizeObserver.observe(this.$refs.slideWrapper);
174
+ }
175
+ }
176
+ },
177
+ },
178
+ watch: {
179
+ availableWidth(newVal) {
180
+ this.checkWidthAndArrows();
181
+ },
182
+ pointer() {
183
+ this.updateArrowStates();
184
+ }
185
+ },
186
+ mounted() {
187
+ this.$nextTick(() => {
188
+ this.checkWidthAndArrows();
189
+ this.observeResize();
190
+ });
191
+ },
192
+ beforeDestroy() {
193
+ if (this.resizeObserver) {
194
+ this.resizeObserver.disconnect();
195
+ }
196
+ }
197
+ }
198
+ </script>
199
+
200
+ <style scoped lang="less">
201
+ .pro-layout-nav-slide-wrapper {
202
+ display: flex;
203
+ align-items: center;
204
+ height: 100%;
205
+ width: 100%;
206
+
207
+ .nav-box-slide{
208
+ overflow: hidden;
209
+ flex: 1;
210
+ }
211
+
212
+ .tools-box-slide{
213
+ flex-shrink: 0;
214
+ }
215
+ }
216
+
217
+ .more-menu {
218
+ font-size: 22px;
219
+ cursor: pointer;
220
+ transition: opacity 0.3s ease;
221
+
222
+ &:hover {
223
+ opacity: 0.8 !important;
224
+ }
225
+ }
226
+ </style>