From 9ef6ec82110ea5756f8844a8892632f4d0bf720f Mon Sep 17 00:00:00 2001 From: 陶杰 <1378534974@qq.com> Date: 星期五, 08 十一月 2024 15:18:41 +0800 Subject: [PATCH] 交换机机柜 --- src/views/screen1/itm.vue | 21 + src/api/area.js | 10 src/views/area/switch-board.vue | 849 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/views/global/index.vue | 2 src/assets/area-global3.jpg | 0 src/router/index.js | 5 6 files changed, 881 insertions(+), 6 deletions(-) diff --git a/src/api/area.js b/src/api/area.js index 6e005c1..798df58 100644 --- a/src/api/area.js +++ b/src/api/area.js @@ -149,4 +149,14 @@ 'areaCode': code } }) +} + +export function getSwitchCabinetInfo() { + return request({ + url: '/api/services/app/SwitchDevice/GetSwitchCabinetInfo', + method: 'get', + params: { + + } + }) } \ No newline at end of file diff --git a/src/assets/area-global3.jpg b/src/assets/area-global3.jpg new file mode 100644 index 0000000..0980c5d --- /dev/null +++ b/src/assets/area-global3.jpg Binary files differ diff --git a/src/router/index.js b/src/router/index.js index 59c4f2b..c36ddad 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -24,6 +24,11 @@ name: 'home', component: resolve => require(['@/views/main'], resolve), }, + { + path: '/switch-board', + name: 'switch-board', + component: resolve => require(['@/views/area/switch-board'], resolve), + }, ] }) diff --git a/src/views/area/switch-board.vue b/src/views/area/switch-board.vue new file mode 100644 index 0000000..eca53aa --- /dev/null +++ b/src/views/area/switch-board.vue @@ -0,0 +1,849 @@ +<template> + <div> + <dv-full-screen-container> + <self-header title="ITM Device Monitoring System"></self-header> + <div class="main-container" :style="{ + zoom: zoom_main, + width: screen_width + 'rem', + height: screen_height + 'rem', + // width:'100%', + // height:'calc(100vh - 10rem)' + }"> + <!-- @mousemove="handleMouseMove" + @mouseup="handleMouseUp" + @mousedown="handleMouseDown" + @mouseleave="handleMouseLeave" --> + <div id="content" class="equipments-container area-map" :class="['area-map-' + code]" v-show="hideServe" + @mousemove="handleMouseMove" @mouseup="handleMouseUp" @mousedown="handleMouseDown" + @mouseleave="handleMouseLeave" + :style="{ + transform: `scale(${scale_container})`, + width: screen_width + 'rem', + height: screen_height + 'rem', + // container_offset_x:'' + // container_offset_x:'' + + 'margin-left': `${container_offset_left}rem`, + 'margin-top': `${container_offset_top}rem`, + }"> + + + <div class="serve-item" @click="showCabinetName"> + <div class="serve-img" + v-for="(serverInfo, serverItemindex) in switchCabinets.switchCabinet" :key="serverItemindex" + > + <div class="cabinetNameDesc">{{ serverInfo.cabinetName }} </div> + <div class="each-item-container"> + <div v-for="(serve, itemindex) in serverInfo.cabinetInfoStatic" @click="showServeInfo(serve)" :key="itemindex" + class="each-item" + + > + <div class="desc"> + <div class="title">{{ serve.cabinetName }}</div> + <div class="value">设备数量: {{ serve.normal }}</div> + <div class="tip-msg"> + <div class="title">{{ serve.cabinetName }}</div> + <div class="desc">正常设备:<span class="f-n">{{ serve.normal || 0 }}</span></div> + <div class="desc">黄色预警:<span class="f-y">{{ serve.waring || 0 }}</span></div> + <div class="desc">红色预警:<span class="f-r">{{ serve.exception || 0 }}</span></div> + + + </div> + </div> + </div> + </div> + </div> + </div> + + </div> + + <!-- 显示图标的开关 --> + <div v-if="true && code && chartclose" class="chart-open" @click="chartclose = false"> + <div class="img-button"></div> + </div> + + <div class="back-button-left-bottom" @click="backToTop">返回</div> + + </div> + </dv-full-screen-container> + </div> +</template> +<script> +import selfHeader from "@/components/header"; + +import { + getSwitchCabinetInfo, +} from "@/api/area"; + +import {mapdata} from "./map-data.js"; + + +export default { + components: { selfHeader, }, + props: { + item_show: false, + code: "", + query_networkPort: '', + }, + //根据 + //后端存储的是世界坐标,初次时候也是世界坐标,最小单位为0.01吧,这个间距或者大小,不考虑实际像素 + //渲染时候,需要把 坐标,变为实际rem等像素坐标 + //每个厂房大小不一样,先用一定的数代表吧. + + data() { + return { + + //如果显示服务器的话 + hideServe: true, + + html_base: 10, + zoom_main: 0.8, + width: "160", + height: "60", + //默认的视点 + x: 0, + y: 0, + zoom: 1, //默认的缩放级别,应该保证可以容纳整个项目 + scale_container: 0.9, + + + //实际的像素比,单位rem + //屏幕和实际像素,默认比应该是,1:1?,反正有个比例吧,类似1米(其他单位)=多少px + //这个可以定死 + screen_width: "160", + screen_height: "80", + base_move_offset: 0.6, + screen_margin_left: 0, + screen_margin_top: 0, //放大后的实际坐标-原本坐标,就是实际可以做的偏移量了,不能小于0,不能大于比例的, + // 当scale变化时候,的时候,恢复一下?或者scale放大的时候会有个,变化 + + //至于网桥,实际无非也是一组设备,到时候按照渲染出来就好了,先考虑canvas的拖拽? + mouse_click: undefined, + mouse_offset_last: undefined, + tleft: 20, + cal_offset_x: 0, + cal_offset_y: 0, + startclientX: 0, // 元素拖拽前距离浏览器的X轴位置 + startclientY: 0, //元素拖拽前距离浏览器的Y轴位置 + + container_offset_x: 0, + container_offset_y: 0, + container_offset_left: 0, + container_offset_top: 0, + //服务器的 + serve_timer: null, + serve_scroll_num: 0, + + //图标的 + chartclose: false, + current_show_id: "", + //新增的 + switchCabinets:{ + cabinetCount:0, + cabinetNames:[], + switchCabinet:[], + }, + }; + }, + created() { + var zoom = this.$route.query.zoom; + console.log(this.$route, this.$router); + if (zoom) { + this.zoom_main = parseFloat(zoom); + } + this.x = parseFloat(this.width) / 2; + this.y = parseFloat(this.height) / 2; + this.screen_width = parseFloat(this.screen_width) * this.zoom; + this.screen_height = parseFloat(this.screen_height) * this.zoom; + }, + async mounted() { + + this.init_data() + this.chartclose = true; + + console.log("main-container1,mounted"); + const content = document.getElementById("content"); + content.addEventListener("wheel", this.handleWheel); + + + }, + destroyed() { + const content = document.getElementById("content"); + content.removeEventListener("wheel", this.handleWheel); + this.stopScrolling(); + }, + methods: { + showCabinetName(){ + alert(111) + }, + toSwitchInfo(info) { + this.showServe(info); + }, + backToTop() { + if (!this.hideServe) { + this.hideServe = !this.hideServe; + return; + } + this.$router.push({path: "/area-all"}); + }, + + click_item(id) { + this.current_show_id = id; + }, + click_item_add(locInfo) { + console.log("this.$refs.equAddForm", this.$refs.equAddForm); + this.$refs.equAddForm && this.$refs.equAddForm.openform(locInfo); + }, + + closeself() { + console.log("closeself parent"); + this.chartclose = true; + }, + refresh_canvas() { + //根据缩放比,视觉角度,来做渲染?,或者说,最简单的,直接都展示出来,缩放下面的?然后超出的不展示即可? + }, + handleMouseMove(event) { + if (this.mouse_click) { + // console.log("handleMouseMove", event); + //记录坐标,支持实时的? + if (this.mouse_offset_last) { + // this.tleft += 20 - this.mouse_offset_last.offsetX + var offsetx = event.clientX - this.mouse_offset_last.clientX; + var offsety = event.clientY - this.mouse_offset_last.clientY; + // console.log("offset0", offsetx, offsety); + var soffsetx = offsetx > 0 ? offsetx : -offsetx; + var soffsety = offsety > 0 ? offsety : -offsety; + if (soffsety >= soffsetx) { + offsetx = 0; + } else { + offsety = 0; + } + + if (event.target.id == "content") { + //让看板内部有偏移量 + if (offsetx != 0) { + if (offsetx > 0) { + this.container_offset_left += + this.base_move_offset * this.scale_container; + } else { + this.container_offset_left -= + this.base_move_offset * this.scale_container; + } + } + if (offsety != 0) { + if (offsety > 0) { + console.log("plus container_offset_top"); + this.container_offset_top += + this.base_move_offset * this.scale_container; + } else { + console.log("mul container_offset_top"); + + this.container_offset_top -= + this.base_move_offset * this.scale_container; + } + } + // if (this.container_offset_x < -90 / this.scale_container) { + // this.container_offset_x = -90 / this.scale_container; + // } else if (this.container_offset_x > 90 / this.scale_container) { + // this.container_offset_x = 90 / this.scale_container; + // } + // if (this.container_offset_y < -90 / this.scale_container) { + // this.container_offset_y = -90 / this.scale_container; + // } else if (this.container_offset_y > 90 / this.scale_container) { + // this.container_offset_y = 90 / this.scale_container; + // } + } + } + this.mouse_offset_last = event; + } + }, + handleMouseUp(event) { + // console.log("handleMouseUp", event); + if (this.mouse_click) { + if (this.mouse_click.className == "equipment-item") { + //说明是转移视角的 + //可能就是设备的 + //直接修改坐标就行了 + //计算鼠标偏移量,然后转换为屏幕坐标,再转换为显示单位坐标,同时弹出提示?是否要更改吧,更改就调用接口 + if ( + this.mouse_offset_last && + (this.cal_offset_x || this.cal_offset_y) + ) { + console.log("update?", this.tleft); + alert("是否要修改设备坐标"); + } + } else { + } + } + + this.mouse_click = undefined; + this.mouse_offset_last = undefined; + }, + + handleMouseDown(event) { + // console.log("handleMouseDown", event, event.target.className); + if (event.target.className.indexOf("equipment-item") >= 0) { + // console.log("handleMouseDown2", event, event.target.id); + // this.mouse_click = event.target; + } else if (event.target.id == "content") { + this.mouse_click = event.target; + } + }, + handleMouseLeave(event) { + this.mouse_click = undefined; + this.mouse_offset_last = undefined; + }, + + handleWheel(event) { + event.preventDefault(); + const delta = event.deltaY < 0 ? 0.2 : -0.2; + this.container_offset_left = + this.container_offset_left / + (this.scale_container / (delta + this.scale_container)); + this.container_offset_top = + this.container_offset_top / + (this.scale_container / (delta + this.scale_container)); + + this.scale_container += delta; + if (this.scale_container < 0.2) { + this.scale_container = 0.2; + } + if (this.scale_container <= 1) { + this.container_offset_left = 0; + this.container_offset_top = 0; + } + }, + + async init_data() { + this.$modal.loading(); + this.switchCabinets= await getSwitchCabinetInfo(); + console.log("机柜信息") + console.log(this.switchCabinets) + this.$modal.closeLoading(); + + }, + + startScrolling() { + this.stopScrolling(); + const myDiv = document.getElementById("my_serve_info_list"); + this.serve_timer = setInterval(() => { + if (myDiv) { + myDiv.scrollTo(0, this.serve_scroll_num); + this.serve_scroll_num++; + if (myDiv.scrollTop >= myDiv.scrollHeight - myDiv.clientHeight) { + this.serve_timer && clearInterval(this.serve_timer); + this.serve_timer = null; + setTimeout(() => { + this.serve_scroll_num = 0; + this.startScrolling(); + }, 1500); + } + } + }, 20); + }, + stopScrolling() { + this.serve_scroll_num = 0; + this.serve_timer && clearInterval(this.serve_timer); + }, + }, +}; +</script> +<style lang="scss" scoped> +@import "../../common/itm_svg.scss"; +@import "../../common/area-bg.scss"; + +$width-screen1: 174.17rem; + +.main-container { + /* position: fixed; + right: calc(5rem); + top: calc($height-header - 8rem); + left: calc((100% - $width-screen1 - 10rem - 18rem) / 2); + left: 0; + right: 0; */ + /* background-color: rgba(209, 227, 247, 1); */ + + // overflow: hidden; + margin: 0 auto; + margin-bottom: 5rem; + + .equipments-container { + background: #d3e3f3; + position: relative; + margin: 0 auto; + cursor: pointer; + max-width: 100%; + min-height: 100vh; + overflow: auto; + + .equipment-item { + cursor: pointer; + position: absolute; + width: 5rem; + height: 5rem; + background-size: 100% 100%; + filter: drop-shadow(2px 2px 2px rgba(0, 0, 0, 0.2)); + } + } + + .serve-item { + margin: 0 auto; + display: flex; + // width: fit-content; + + flex-wrap:wrap; + justify-content: flex-start; + + cursor: pointer; + + .serve-img { + margin: 2rem; + background-image: url("../../assets/equipment/serve.svg"); + background-image: url("../../assets/equipment/serve_v2.png"); + background-size: 100% 100%; + width: 15rem; + // height: 35.3rem; + + .cabinetNameDesc{ + margin-top: 1rem; + font-weight: 800; + // margin-bottom: 0.8rem; + } + + /* padding-left: 1rem; */ + .each-item-container { + margin-top: 10rem; + margin-left: 1rem; + + .each-item { + background-image: url("../../assets/equipment/serve_item.png"); + width: 10.3rem; + height: 3.7rem; + background-size: 100% 100%; + margin-bottom: 0.9rem; + color: #265696; + position: relative; + + .desc { + text-align: left; + padding-left: 1rem; + padding-top: 0.5rem; + + .title { + font-weight: 600; + margin-bottom: 0.8rem; + /* */ + } + + .value { + } + } + } + + .each-item:hover::before { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + + content: ""; + background-color: #059ce293; + } + + .each-item-default::before { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + + content: ""; + background-color: #4bb6e854; + } + + .tip-msg { + display: none; + position: absolute; + left: calc(50% + 5rem); //起始是在body中,横向距左50%的位置 + top: 55%; //起始是在body中,纵向距上50%的位置,这个点相当于body的中心点,div的左上角的定位 + min-width: 21rem; + height: 13.6rem; + background: #f1f9ff; + box-shadow: 0.6rem 0.4rem 2.4rem 0rem rgba(56, 92, 131, 0.77); + border-radius: 0.6rem; + z-index: 2; + padding: 1.3rem; + + .title { + font-size: 2.5rem; + font-family: PingFangSC-Semibold, PingFang SC; + font-weight: 600; + color: #012b5e; + line-height: 3.6rem; + text-align: left; + margin-bottom: 1rem; + text-overflow: ellipsis; + /* width: 10rem; */ + overflow: hidden; + word-break: break-all; + white-space: nowrap; + + .dot { + width: 1.6rem; + height: 1.6rem; + min-width: 1.6rem; + min-height: 1.6rem; + /* background: #e20505; */ + border-radius: 50%; + margin-top: 1rem; + margin-right: 0.5rem; + } + } + + .desc { + font-size: 1.8rem; + font-family: PingFangSC-Regular, PingFang SC; + font-weight: 400; + color: #666666; + line-height: 2rem; + text-align: left; + /* margin-left: 2.1rem; */ + margin-top: 0.5rem; + + .f-n { + color: #0dbe79; + font-weight: 600; + } + + .f-r { + color: #e10808; + font-weight: 600; + } + + .f-y { + color: #ffc310; + font-weight: 600; + } + } + } + + .each-item:hover .tip-msg { + display: unset; + } + } + } + + .tj-item { + margin-left: 2rem; + width: 33.5rem; + min-height: 47.5rem; + min-height: 17.5rem; + height: fit-content; + background: #f2f8fd; + box-shadow: 0.6rem 0.4rem 2.4rem 0rem rgba(198, 212, 228, 0.38), + inset 0rem 0.2rem 0.3rem 0rem rgba(255, 255, 255, 0.5); + border-radius: 1rem; + + .tj-nums { + padding: 1.8rem; + + .title { + font-size: 2.5rem; + font-family: PingFangSC-Semibold, PingFang SC; + font-weight: 600; + color: #265696; + line-height: 3.6rem; + text-align: left; + margin-bottom: 1.8rem; + } + + .equ-num-item { + margin: 0 auto; + text-align: center; + + .desc2 { + font-size: 1.6rem; + font-family: PingFangSC-Medium, PingFang SC; + font-weight: 500; + color: #235884; + line-height: 2.2rem; + } + + .num { + font-size: 2.4rem; + font-family: Impact; + line-height: 2.9rem; + } + + .num.g { + color: #0dbe79; + } + + .num.y { + color: #ffc310; + } + + .num.r { + color: #e10808; + } + } + + .equ-num-item.a { + margin-left: 0; + margin-right: auto; + } + + .equ-num-item.c { + margin-right: 0; + margin-left: auto; + } + } + + .tj-list { + padding: 2.2rem; + padding-top: 1.4rem; + + .service-list-arr { + background-color: #f2f8fd; + overflow: hidden; + height: 30.3rem; + + .service-list-arr-item { + width: 100%; + min-height: 3rem; + /* margin-top: 2.2rem; */ + display: flex; + flex-direction: row; + align-items: center; + height: fit-content; + + .time { + font-size: 1.2rem; + font-family: PingFangSC-Medium, PingFang SC; + font-weight: 500; + color: #a1b6c8; + line-height: 1.7rem; + margin-right: 1rem; + } + + .service-list-arr-item_content { + font-family: PingFangSC-Medium, PingFang SC; + color: #235884; + line-height: 1.17rem; + text-align: left; + margin-left: 0.4rem; + margin-right: 1.5rem; + padding-top: 1rem; + + font-size: 1.4rem; + font-weight: 500; + line-height: 1.4rem; + } + + .dot { + width: 0.58rem; + height: 0.58rem; + border-radius: 50%; + margin-top: 0.8rem; + margin-left: auto; + margin-right: 10px; + } + + .dot.red { + background: #c10b0b; + } + + .dot.yellow { + background: #fda928; + } + + .dot.green { + background: #17a537; + } + } + } + } + + .tj-line { + width: 30.1rem; + height: 0.1rem; + border: 0.1rem solid #ccdeec; + margin: 0 auto; + } + } + } + + .chart-open { + width: 6.1rem; + height: 7.5rem; + background: #e9f4fd; + box-shadow: 0.6rem 0.4rem 2.4rem 0rem rgba(198, 212, 228, 0.83), + inset 0rem 0.2rem 0.3rem 0rem rgba(255, 255, 255, 0.5); + border-radius: 1rem; + position: fixed; + right: 3rem; + top: 50%; + transform: translate(0%, 50%); + cursor: pointer; + + .img-button { + background-size: 100% 100%; + background-image: url("../../assets/area/chart-open.svg"); + width: 2.6rem; + height: 2.6rem; + transform: translate(-50%, -50%); + left: 50%; + top: 50%; + position: absolute; + } + } +} +</style> +<style scoped lang="scss"> +//7个设备 +.equ-0 { + background-image: url("../../assets/equipment/arm.svg"); + width: 9.6rem; + height: 9.6rem; +} + +.equ-1 { + background-image: url("../../assets/equipment/pda.svg"); + width: 4.1rem; + height: 6.1rem; +} + +.equ-2 { + background-image: url("../../assets/equipment/pc.svg"); + width: 15rem; + height: 12.6rem; +} + +.equ-3 { + background-image: url("../../assets/equipment/print.svg"); + width: 8.2rem; + height: 8.1rem; +} + +.equ-4 { + background-image: url("../../assets/equipment/screen.svg"); + width: 15.9rem; + height: 13.1rem; +} + +.equ-5 { + background-image: url("../../assets/equipment/setting.svg"); + width: 7.8rem; + height: 7.5rem; +} + +.equ-6 { + background-image: url("../../assets/equipment/video.svg"); + width: 12.7rem; + height: 9.4rem; +} +</style> +<style scoped lang="scss"> +.back-button-left-bottom { + width: 10.6rem; + height: 3.9rem; + background: #6eb3ff; + border-radius: 0.4rem; + border: 0.2rem solid #278afa; + font-size: 1.6rem; + font-family: PingFangSC-Semibold, PingFang SC; + font-weight: 600; + color: #ffffff; + line-height: 3.9rem; + position: fixed; + left: 3rem; + // bottom: 3.5rem; + cursor: pointer; + z-index: 99; +} +</style> + +<!-- 交换机的端口 --> +<style scoped lang="scss"> +.port-items { + display: flex; + margin-bottom: 8rem; + /* height: 2rem; */ + width: fit-content; + + .port-item { + background: #e9f4fd; + border-top: 5px solid #e9f4fd; + flex: 1; + margin: 0 auto; + min-width: 6rem; + max-width: 6rem; + /* max-width: 6rem; */ + height: 1.6rem; + // background: #fff; + // box-shadow: 0rem -2rem 2.1rem 0rem #fff; + background-image: url("../../assets/area/space.svg"); + background-size: 100% 100%; + position: relative; + + .port-tip { + position: absolute; + bottom: -2.5rem; + height: 2.5rem; + font-size: 1.8rem; + font-family: PingFangSC-Semibold, PingFang SC; + font-weight: 600; + color: #265696; + line-height: 2.5rem; + text-align: center; + /* margin-bottom: 0.5rem; */ + left: 0; + right: 0; + } + + .space-text { + background-image: url("../../assets/area/space-text.svg"); + background-size: 100% 100%; + min-width: 6rem; + min-height: 2.5rem; + transform: translate(-50%, 0%); + left: 50%; + padding-top: 0.5rem; + top: -2.5rem; + position: absolute; + /* line-height: 100%; */ + /* font-size: 12px; */ + /* span { */ + word-break: break-all; + word-wrap: break-word; + /*但在有些场景中,还需要加上下面这行代码*/ + white-space: normal; + overflow-wrap: anywhere; + /* } */ + + font-size: 1rem; + font-family: PingFangSC-Semibold, PingFang SC; + font-weight: 600; + color: #3299ff; + z-index: 20; + } + + .space-text-yellow { + color: #e8be19; + } + + .space-text-red { + color: #e20909; + } + } + + .port-item:nth-child(6n) { + margin-right: 3rem; + } +} + +.port-items:nth-child(2n) { + margin-bottom: 8rem; +} +</style> \ No newline at end of file diff --git a/src/views/global/index.vue b/src/views/global/index.vue index 96e32f1..ce5ce55 100644 --- a/src/views/global/index.vue +++ b/src/views/global/index.vue @@ -21,7 +21,7 @@ <style lang="scss" scoped> .area-global { - background-image: url("../../assets/area-global2.jpg"); + background-image: url("../../assets/area-global3.jpg"); background-size: 100% 100%; width: 140rem; /* max-width: 100vh; */ diff --git a/src/views/screen1/itm.vue b/src/views/screen1/itm.vue index 2da3906..cebe501 100644 --- a/src/views/screen1/itm.vue +++ b/src/views/screen1/itm.vue @@ -83,18 +83,25 @@ </div> </div> </div> - <div class="itm-container container-alert" style="cursor: pointer;margin-top: 3rem" @click="showSwitchInfoTable=true"> + <div class="itm-container container-alert" style="cursor: pointer;margin-top: 3rem" @click="showSwitchBoardInfoTable=true"> <div class="flex1"> <div class="reg-num flex"> <span class="div1">{{ switchInfo.switchInfo && switchInfo.switchInfo.length || 0 }}</span> <span class="div2">个</span> </div> <div class="reg-desc"> - 新增交换机 + 交换机清单 </div> </div> </div> - <el-dialog :visible.sync="showSwitchInfoTable" title="新增交换机" append-to-body> + <div class="itm-container container-alert" style="cursor: pointer;margin-top: 3rem" @click="showSwitchBoard"> + <div class="flex1"> + <div class="reg-desc"> + 交换机机柜 + </div> + </div> + </div> + <el-dialog :visible.sync="showSwitchBoardInfoTable" title="交换机清单" append-to-body> <el-table :data="switchInfo.lackSwitchInfo||[]" border @@ -167,13 +174,17 @@ }, data() { return { - showSwitchInfoTable: false, + showSwitchBoardInfoTable: false, } }, methods: { closeself() { this.$emit("show", false); }, + showSwitchBoard(){ + this.$router.push({path: "/switch-board"}); + // this.$router.push({path: "/area", query: {code: '01'}}); + } }, }; </script> @@ -227,7 +238,7 @@ border-radius: 0.83rem; padding: 2.5rem; margin-top: 2rem; - height: 53.5rem; + height: 58.5rem; padding-top: 1rem; } -- Gitblit v1.9.3