@lambo-design/pro-layout 1.0.0-beta.47 → 1.0.0-beta.470

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 (41) hide show
  1. package/package.json +11 -4
  2. package/src/components/pro-layout-header/index.vue +224 -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 +116 -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 +104 -0
  12. package/src/components/pro-layout-header/pro-layout-tools/components/pro-layout-tools-quick-intl.vue +110 -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-quick-todoCenter.vue +177 -0
  17. package/src/components/pro-layout-header/pro-layout-tools/components/pro-layout-tools-user.vue +86 -0
  18. package/src/components/pro-layout-header/pro-layout-tools/index.vue +32 -0
  19. package/src/components/pro-layout-header/pro-layout-trigger/index.vue +84 -0
  20. package/src/components/{pro-layout-sider-collapsed-menu.vue → pro-layout-sider/components/pro-layout-sider-collapsed-menu.vue} +30 -11
  21. package/src/components/{pro-layout-sider-icon.vue → pro-layout-sider/components/pro-layout-sider-icon.vue} +2 -2
  22. package/src/components/pro-layout-sider/components/pro-layout-sider-menu-item.vue +137 -0
  23. package/src/components/pro-layout-sider/components/pro-layout-sider-other-menu.vue +140 -0
  24. package/src/components/pro-layout-sider/components/pro-layout-sider-search.vue +345 -0
  25. package/src/components/pro-layout-sider/index.vue +484 -0
  26. package/src/components/{pro-layout-tabs.vue → pro-layout-tabs/index.vue} +118 -23
  27. package/src/index.vue +309 -42
  28. package/src/styles/color.less +267 -0
  29. package/src/styles/images/xiaoxitongzhi.png +0 -0
  30. package/src/styles/other-menu.less +63 -111
  31. package/src/utils/menuItem.js +10 -0
  32. package/src/utils/sider.js +16 -1
  33. package/src/components/pro-layout-header.vue +0 -52
  34. package/src/components/pro-layout-logo.vue +0 -79
  35. package/src/components/pro-layout-nav.vue +0 -150
  36. package/src/components/pro-layout-other-menu.vue +0 -137
  37. package/src/components/pro-layout-sider-menu-item.vue +0 -37
  38. package/src/components/pro-layout-sider.vue +0 -240
  39. package/src/components/pro-layout-tools-user.vue +0 -84
  40. package/src/components/pro-layout-tools.vue +0 -21
  41. package/src/components/pro-layout-trigger.vue +0 -48
@@ -0,0 +1,484 @@
1
+ <template>
2
+ <div ref="listenWidth" class="pro-layout-sider-wrapper"
3
+ :class="[(collapsed || systemInfo.showSearchMenu === '0') ? 'menu-has-collapsed' : '',tabsHeight != 46 ? 'custom-tabs' : '']">
4
+ <Menu v-show="!collapsed" ref="menu"
5
+ :accordion="isAccordionMode" :active-name="activeName"
6
+ :open-names="openedNames" theme="dark"
7
+ width="auto" @on-select="handleSelect"
8
+ @on-open-change="handleOpenChange">
9
+ <template v-for="(item,index) in menuList">
10
+ <template v-if="item.children && item.children.length === 1">
11
+ <ProLayoutSiderMenuItem v-if="showChildren(item)"
12
+ :key="`menu-${item.name}`"
13
+ :parent-item="item"
14
+ :collect-map="isCollected"
15
+ :system-info="systemInfo"
16
+ :nav-list="navList">
17
+ </ProLayoutSiderMenuItem>
18
+ <MenuItem v-else :key="`menu-${item.children[0].name}`"
19
+ :name="getNameOrHref(item, true)">
20
+ <Row type="flex" justify="center" align="top">
21
+ <Col :span="getSpanNum(systemInfo,'icon')">
22
+ <Icon v-if="systemInfo.menuLogo == '1' && item.type == 2" :type="isCollected.hasOwnProperty(item.name) ? 'ios-star' : 'ios-star-outline'"
23
+ @click.stop="toggleCollect(item)"></Icon>
24
+ <ProLayoutSiderIcon v-else-if="systemInfo.menuLogo == '1'" :icon-type="item.meta.icon"></ProLayoutSiderIcon>
25
+ </Col>
26
+ <Col :span="getSpanNum(systemInfo,'title')">
27
+ <div :class="['menu-title-' + item.children[0].permissionId,'draggable-text']" v-draggable="dragOptions(item.children[0])">
28
+ <Tooltip style="width: 100%" v-if="systemInfo.titleShow ==='ellipsis'" placement="right" transfer :content="showTitle(item.children[0])">
29
+ <div class="menu-title-nochildren-ellipsis">{{ showTitle(item.children[0]) }}</div>
30
+ </Tooltip>
31
+ <span v-else class="menu-title-nochildren-wrap">{{ showTitle(item.children[0]) }}</span>
32
+ </div>
33
+ </Col>
34
+ </Row>
35
+ </MenuItem>
36
+ </template>
37
+ <template v-else>
38
+ <ProLayoutSiderMenuItem v-if="showChildren(item)"
39
+ :key="`menu-${item.name}`"
40
+ :parent-item="item"
41
+ :collect-map="isCollected"
42
+ :system-info="systemInfo"
43
+ :nav-list="navList">
44
+ </ProLayoutSiderMenuItem>
45
+ <MenuItem v-else :key="`menu-${item.name}`"
46
+ :name="getNameOrHref(item)">
47
+ <Row type="flex" justify="center" align="top">
48
+ <Col :span="getSpanNum(systemInfo,'icon')">
49
+ <Icon v-if="systemInfo.menuLogo == '1' && item.type == 2" :type="isCollected.hasOwnProperty(item.name) ? 'ios-star' : 'ios-star-outline'"
50
+ @click.stop="toggleCollect(item)"></Icon>
51
+ <ProLayoutSiderIcon v-else-if="systemInfo.menuLogo == '1'" :icon-type="item.meta.icon"></ProLayoutSiderIcon>
52
+ </Col>
53
+ <Col :span="getSpanNum(systemInfo,'title')">
54
+ <div :class="['menu-title-' + item.permissionId,'draggable-text']" v-draggable="dragOptions(item)">
55
+ <Tooltip style="width: 100%" v-if="systemInfo.titleShow ==='ellipsis'" placement="right" transfer :content="showTitle(item)">
56
+ <div class="menu-title-nochildren-ellipsis">{{ showTitle(item) }}</div>
57
+ </Tooltip>
58
+ <span v-else class="menu-title-nochildren-wrap">{{ showTitle(item) }}</span>
59
+ </div>
60
+ </Col>
61
+ </Row>
62
+ </MenuItem>
63
+ </template>
64
+ </template>
65
+ </Menu>
66
+
67
+ <ProLayoutSiderOtherMenu v-show="systemInfo.showHistoryAndCollect !== '0'" :style="systemInfo.menuScaling === '0' ? { width: otherWidth } : {}" :collapsed="collapsed" @select-menu="selectMenu"></ProLayoutSiderOtherMenu>
68
+ <ProLayoutSiderSearch
69
+ :style="systemInfo.menuScaling === '0' ? { width: otherWidth } : {}"
70
+ v-show="!collapsed && (systemInfo.showSearchMenu !== '0')"
71
+ :searchType="0"
72
+ @select-menu="selectMenu"
73
+ ></ProLayoutSiderSearch>
74
+ <div v-show="collapsed" :list="menuList" class="menu-collapsed" >
75
+ <template v-for="item in menuList">
76
+ <ProLayoutSiderCollapsedMenu v-if="item.children && item.children.length > 0" :key="`drop-menu-${item.name}`"
77
+ :parent-item="item" theme="dark" hide-title transfer
78
+ @on-click="handleSelect" :active-item="openedNames">
79
+ </ProLayoutSiderCollapsedMenu>
80
+ <Tooltip v-else :key="`drop-menu-${item.name}`" :content="showTitle(item.children && item.children[0] ? item.children[0] : item)"
81
+ placement="right" transfer>
82
+ <template v-slot:default="{ active }">
83
+ <a :style="{textAlign: 'center'}"
84
+ :class="['drop-menu-a', item.name === selectedTopParent ? 'selected-parent' : '']"
85
+ @click="handleSelect(getNameOrHref(item, true))">
86
+ <!-- <i :class="[item.meta.icon, selectedIconType === item.meta.icon ? 'selected-icon' : '']"></i>-->
87
+ <ProLayoutSiderIcon :icon-type="item.meta.icon" icon-size="26" :class="{ 'selected-icon': item.name === selectedTopParent && collapsed }"
88
+ ></ProLayoutSiderIcon>
89
+ </a>
90
+ </template>
91
+ </Tooltip>
92
+ </template>
93
+ </div>
94
+
95
+ </div>
96
+ </template>
97
+
98
+ <script>
99
+ import Bus from "@lambo-design/shared/utils/bus";
100
+ import {deepCopy} from "@lambo-design/shared/utils/assist";
101
+ import generatorMenuList from "@lambo-design/shared/utils/menu/index";
102
+ import sider from '../../utils/sider'
103
+ import ProLayoutSiderOtherMenu from "./components/pro-layout-sider-other-menu";
104
+ import ProLayoutSiderSearch from "./components/pro-layout-sider-search";
105
+ import ProLayoutSiderMenuItem from './components/pro-layout-sider-menu-item'
106
+ import ProLayoutSiderCollapsedMenu from './components/pro-layout-sider-collapsed-menu'
107
+ import {
108
+ filterMenuName, filterMenuUri, tagExists,
109
+ isOpenBlank, buildSinglePermission,arraysEqual
110
+ } from "@lambo-design/shared/utils/platform";
111
+ import config from "@lambo-design/shared/config/config";
112
+ import {getThemeVarByKey} from "@lambo-design/shared/utils/theme";
113
+
114
+ export default {
115
+ name: "pro-layout-sider",
116
+ components: {
117
+ ProLayoutSiderMenuItem,
118
+ ProLayoutSiderCollapsedMenu,
119
+ ProLayoutSiderOtherMenu,
120
+ ProLayoutSiderSearch
121
+ },
122
+ props:{
123
+ serverContext: {
124
+ type: String,
125
+ default: () => config.upmsServerContext // 设置默认值
126
+ }
127
+ },
128
+ data(){
129
+ return {
130
+ show: false,
131
+ otherWidth:'',
132
+ originalAllMenuList: [],
133
+ navList: [],
134
+ originMenuList:[],
135
+ menuList: [],
136
+ appId: '',
137
+ collapsed: false,
138
+ activeName: '',
139
+ openedNames: [],
140
+ userExpandedMenus: [], // 记录用户手动展开的菜单(非手风琴模式下使用)
141
+ activeMenu: null,
142
+ selectedMenuParent: null,
143
+ activeMenuItem: null,
144
+ openedSubMenu: null,
145
+ currentMenuItem: null,
146
+ selectedTopParent: '',
147
+ activeIcon: null,
148
+ tagValue: '',
149
+ tagList: [],
150
+ collectMenuList: [],
151
+ isCollected: {},
152
+ systemInfo:{},
153
+ tabsHeight: 46
154
+ }
155
+ },
156
+ mixins:[sider],
157
+ computed: {
158
+ isAccordionMode() {
159
+ // 当 accordionMode 为 '0' 时关闭手风琴模式,否则开启
160
+ return this.systemInfo.accordionMode !== '0';
161
+ }
162
+ },
163
+ methods: {
164
+ initListener(){
165
+ Bus.$on('origin-all-menu-list', (data)=>{
166
+ this.initAllMenu(data);
167
+ });
168
+ Bus.$on('nav-list',(data)=>{
169
+ this.initNav(data)
170
+ });
171
+ Bus.$on('menu-list',(data)=>{
172
+ this.initMenu(data)
173
+ });
174
+ Bus.$on('trigger-change',(data)=>{
175
+ this.triggerChange(data)
176
+ });
177
+ Bus.$on('change-app', ({appId,appInfo})=> {
178
+ this.changeApp(appId,appInfo)
179
+ })
180
+ Bus.$on('tag-list',(data,current)=>{
181
+ this.initTags(data,current)
182
+ });
183
+ Bus.$on('menu-click',(current)=>{
184
+ this.menuClick(current)
185
+ });
186
+ Bus.$on('select-menu',(name,item)=>{
187
+ this.selectMenu(name,item)
188
+ });
189
+ Bus.$on('collect-menu-list',(data)=>{
190
+ this.initCollectMenu(data)
191
+ });
192
+ Bus.$on('system-info',(data)=>{
193
+ this.initSystemInfo(data)
194
+ })
195
+ },
196
+ destroyListener(){
197
+ Bus.$off('origin-all-menu-list')
198
+ Bus.$off('nav-list')
199
+ Bus.$off('menu-list')
200
+ Bus.$off('trigger-change')
201
+ Bus.$off('change-app')
202
+ Bus.$off('tag-list')
203
+ Bus.$off('menu-click')
204
+ Bus.$off('select-menu')
205
+ Bus.$off('collect-menu-list')
206
+ Bus.$off('system-info')
207
+ },
208
+ initSystemInfo(data){
209
+ this.systemInfo = deepCopy(data)
210
+ },
211
+ initAllMenu(data){
212
+ this.originalAllMenuList = data;
213
+ },
214
+ initNav(data){
215
+ if (this.navList && data && arraysEqual(this.navList,data)){
216
+ return;
217
+ }
218
+ this.navList = data;
219
+ },
220
+ initMenu(data){
221
+ if (this.originMenuList && data && arraysEqual(this.originMenuList,data)){
222
+ return;
223
+ }
224
+ if (data && data.length > 0) {
225
+ let item = data[0];
226
+ if (item.appId && item.appId !== this.appId) {
227
+ return;
228
+ }
229
+ }
230
+ this.originMenuList = deepCopy(data);
231
+ this.changeMenu()
232
+ },
233
+ initCollectMenu(data){
234
+ this.collectMenuList = data;
235
+ this.isCollected = {}
236
+ this.collectMenuList.forEach(menu => {
237
+ this.isCollected[menu.name] = true
238
+ })
239
+ },
240
+ changeApp(appId,appInfo){
241
+ this.appId = appId;
242
+ this.changeMenu()
243
+ },
244
+ changeMenu(){
245
+ let treeMenuList = generatorMenuList(this.originMenuList,this.appId,'menu');
246
+ if (treeMenuList && treeMenuList.length > 0) {
247
+ this.menuList = treeMenuList;
248
+ } else {
249
+ this.menuList = [];
250
+ }
251
+ Bus.$emit('tree-menu-list',this.menuList)
252
+ this.openedNames = this.getOpenedNamesByActiveName();
253
+ },
254
+ selectMenu(name,menu) {
255
+ if (!menu) {
256
+ let res = this.originMenuList.filter(item => item.name == name)
257
+ if (res && res.length > 0) {
258
+ menu = res[0];
259
+ }
260
+ }
261
+ if (config.mainType && config.mainType == 'singleApp') {
262
+ menu = buildSinglePermission(this.originalAllMenuList, menu);
263
+ }
264
+ if (menu.appId && menu.appId != this.appId) {
265
+ let appInfo = this.navList.filter(app => app.appId === menu.appId);
266
+ Bus.$emit('change-app', {appId:menu.appId,appInfo:appInfo[0]})
267
+ }
268
+ setTimeout(()=>{
269
+ this.handleSelect(name)
270
+ },100)
271
+ },
272
+ handleSelect(name,uri,pid){
273
+ /*if (this.activeName == name) {
274
+ return;
275
+ }*/
276
+ let menu = null;
277
+ if (name.indexOf("isTurnByHref_") > -1) {
278
+ name = name.replace("isTurnByHref_","");
279
+ menu = filterMenuUri(this.menuList,name);
280
+ } else {
281
+ menu = filterMenuName(this.menuList,name);
282
+ }
283
+ let tagList = this.tagList;
284
+ if (menu && menu.name) {
285
+ if (isOpenBlank(menu)) {
286
+ Bus.$emit('menu-click', menu.name , menu)
287
+ } else {
288
+ let tag = tagList.find(item => item.name == menu.name);
289
+ if (!tag) {
290
+ tag = {}
291
+ }
292
+ if ('home' != menu.name) {
293
+ let res = tagList.filter(item => item.name !== menu.name);
294
+ menu.cts = new Date().getTime();
295
+ tag = Object.assign(tag, menu);
296
+ res.push(tag);
297
+ tagList = deepCopy(res);
298
+ }
299
+ Bus.$emit('tag-list', tagList, menu.name)
300
+ }
301
+
302
+ /*if (!tagExists(tagList,menu.name)) {
303
+ if (!isOpenBlank(menu)) {
304
+ tagList.push(menu);
305
+ } else {
306
+ Bus.$emit('menu-click', menu.name , menu)
307
+ }
308
+ } else {
309
+ let tag = tagList.find(item => item.name == menu.name);
310
+ if ('home' != menu.name) {
311
+ let res = tagList.filter(item => item.name !== menu.name);
312
+ menu.cts = new Date().getTime();
313
+ tag = Object.assign(tag, menu);
314
+ res.push(tag);
315
+ tagList = deepCopy(res);
316
+ }
317
+ }
318
+ Bus.$emit('tag-list', tagList, menu.name)*/
319
+ }
320
+ /*if (menu.meta && Array.isArray(menu.meta.crumbs)) {
321
+ let parentMenu = menu.meta.crumbs[0]
322
+ this.$set(this, 'selectedTopParent', parentMenu.name);
323
+ } else {
324
+ // 处理没有父菜单的情况
325
+ this.$set(this, 'selectedTopParent', menu.name);
326
+ }
327
+ // 如果 uri 为空,则需要根据 pid 判断是展开父菜单还是同时展开父菜单和当前菜单
328
+ if (!uri) {
329
+ let parentName;
330
+ if (pid === 0) {
331
+ // 如果 pid 为 0,表示是最外层菜单
332
+ parentName = this.getNameOrHref(menu);
333
+ } else {
334
+ // 如果 pid 不等于 0,查找并打开对应的最外层父菜单
335
+ parentName = this.getTopParent(menu);
336
+ this.openedNames = [parentName]; // 设置最外层父菜单为展开状态
337
+ this.activeName = menu.name; // 设置当前菜单为激活状态
338
+ }
339
+ }*/
340
+ },
341
+ getTopParent(menu) {
342
+ return menu.parent ? this.getTopParent(menu.parent) : menu.name;
343
+ },
344
+ triggerChange(data){
345
+ this.collapsed = data;
346
+ },
347
+ initTags(data,name){
348
+ this.tagList = data;
349
+ this.value = name;
350
+ },
351
+ menuClick(current) {
352
+ let item = this.originMenuList.filter(menu => menu.name === current && menu.type && menu.type == '2');
353
+ if (item && item.length > 0){
354
+ if (isOpenBlank(item[0])) {
355
+ //window.location.href = window.location.href;
356
+ return;
357
+ }
358
+ let type = item[0].type;
359
+ if (type == 2) {
360
+ this.activeName = current;
361
+ } else {
362
+ let pItem = this.originMenuList.filter(menu => menu.permissionId === item[0].pid);
363
+ if (pItem && pItem.length > 0){
364
+ this.activeName = pItem[0].name;
365
+ }
366
+ }
367
+ } else {
368
+ this.activeName = current;
369
+ }
370
+ },
371
+ getOpenedNamesByActiveName(){
372
+ let res = filterMenuName(this.menuList,this.activeName);
373
+ let openNames = []
374
+ if (res) {
375
+ const crumbs = res.meta.crumbs;
376
+ if (crumbs) {
377
+ crumbs.forEach(item => {
378
+ if (item.type === 1) {
379
+ openNames.push(item.name)
380
+ }
381
+ })
382
+ }
383
+ }
384
+ return openNames
385
+ },
386
+ handleOpenChange(openNames) {
387
+ // openNames 是 Menu 组件当前的所有展开项
388
+ if (this.systemInfo.accordionMode === '0') {
389
+ // 非手风琴模式:保存用户手动展开的状态
390
+ this.userExpandedMenus = [...openNames];
391
+ }
392
+ // 注意:这里不直接修改 this.openedNames,避免循环触发
393
+ },
394
+ mergeOpenedNames(newNames) {
395
+ // 如果关闭手风琴模式,保留用户手动展开的菜单
396
+ if (this.systemInfo.accordionMode === '0') {
397
+ // 合并用户展开的菜单和新的必需展开项
398
+ const merged = [...new Set([...this.userExpandedMenus, ...newNames])];
399
+ return merged;
400
+ } else {
401
+ // 手风琴模式,只保留新的 names(路径必需的展开项)
402
+ return newNames;
403
+ }
404
+ },
405
+ handleResize() {
406
+ const targetElement = this.$refs.listenWidth; // 获取 DOM 元素的引用
407
+ this.otherWidth = targetElement.clientWidth+'px'; // 获取 div 元素的宽度
408
+ },
409
+ dragOptions(item){
410
+ if (!item) {
411
+ item = {}
412
+ }
413
+ item.navList = this.navList;
414
+ return {
415
+ trigger: '.menu-title-' + item.permissionId,
416
+ body: '.menu-title-' + item.permissionId,
417
+ recover: true,
418
+ item: item
419
+ }
420
+ },
421
+ toggleCollect(item) {
422
+ Bus.$emit('toggle-collect-menu', !this.isCollected[item.name], item)
423
+ },
424
+ loadingCustomStyle(){
425
+ let themeKey = localStorage.getItem("theme") ? localStorage.getItem("theme") : "default"
426
+ let tabsHeight = getThemeVarByKey(themeKey,'--layout-tabs-height');
427
+ if (tabsHeight) {
428
+ this.tabsHeight = tabsHeight;
429
+ }
430
+ }
431
+ },
432
+ watch:{
433
+ activeName(){
434
+ const newOpenNames = this.getOpenedNamesByActiveName();
435
+ this.openedNames = this.mergeOpenedNames(newOpenNames);
436
+ },
437
+ openedNames() {
438
+ this.$nextTick(() => {
439
+ this.$refs.menu.updateOpened()
440
+ this.$refs.menu.updateActiveName()
441
+ })
442
+ }
443
+ },
444
+ mounted() {
445
+ window.addEventListener('resize', this.handleResize); // 监听窗口大小变化事件
446
+ this.handleResize(); // 初始化时获取一次宽度
447
+ this.loadingCustomStyle();
448
+ },
449
+ created(){
450
+ this.initListener();
451
+ },
452
+ beforeDestroy(){
453
+ this.destroyListener();
454
+ window.removeEventListener('resize', this.handleResize); // 在组件销毁前移除事件监听器,以防止内存泄漏
455
+ }
456
+
457
+ }
458
+ </script>
459
+
460
+ <style scoped lang="less">
461
+ @import "@lambo-design/core/src/styles/default";
462
+ @import '../../styles/other-menu.less';
463
+ .pro-layout-sider-wrapper{
464
+ margin-bottom: 50px;
465
+ padding-top: 47px;
466
+ .menu-collapsed {
467
+ padding-top: 10px;
468
+ /deep/a.drop-menu-a{
469
+ display: inline-block;
470
+ padding: 6px 20px;
471
+ width: 100%;
472
+ text-align: center;
473
+ font-weight: normal;
474
+ }
475
+ overflow: hidden;
476
+ }
477
+ &.menu-has-collapsed{
478
+ padding-top: 0 !important;
479
+ }
480
+ &.custom-tabs{
481
+ padding-top: 36px;
482
+ }
483
+ }
484
+ </style>