diff --git a/src/App.js b/src/App.js index a9ed6e5..4fd10ca 100644 --- a/src/App.js +++ b/src/App.js @@ -1,6 +1,8 @@ import { Routes, Route, Navigate } from "react-router-dom"; import HomeLayout from "@/components/home/Layout"; -import DomainOne from "./components/domain/One"; +import DomainOne from "@/components/domain/One"; +import DomainTwo from "@/components/domain/Two"; +import DomainThree from "@/components/domain/Three"; import "./App.less"; function App() { @@ -8,6 +10,8 @@ function App() { } /> }> + }> + }> } /> ); diff --git a/src/components/domain/One/CustomClock.jsx b/src/components/common/CustomClock/index.jsx similarity index 100% rename from src/components/domain/One/CustomClock.jsx rename to src/components/common/CustomClock/index.jsx diff --git a/src/components/domain/One/CustomToolbar.jsx b/src/components/common/CustomToolbar/index.jsx similarity index 100% rename from src/components/domain/One/CustomToolbar.jsx rename to src/components/common/CustomToolbar/index.jsx diff --git a/src/components/domain/One/TextInfoPanel.jsx b/src/components/common/TextInfoPanel/index.jsx similarity index 100% rename from src/components/domain/One/TextInfoPanel.jsx rename to src/components/common/TextInfoPanel/index.jsx diff --git a/src/components/domain/One/index.jsx b/src/components/domain/One/index.jsx index fd11eb3..25a9b3c 100644 --- a/src/components/domain/One/index.jsx +++ b/src/components/domain/One/index.jsx @@ -1,10 +1,10 @@ import MapLayout from "@/components/map/Layout"; -import CustomClock from "./CustomClock"; +import CustomToolbar from "@/components/common/CustomToolbar"; +import CustomClock from "@/components/common/CustomClock"; +import TextInfoPanel from "@/components/common/TextInfoPanel"; import CustomFlyTo from "./CustomFlyTo"; -import CustomToolbar from "./CustomToolbar"; import Point from "./Point"; import PlateauPolygon from "./PlateauPolygon"; -import TextInfoPanel from "./TextInfoPanel"; import Cyclone from "./Cyclone"; import Barotropic from "./Barotorpic"; import WavePoints from "./WavePoints"; @@ -25,17 +25,11 @@ export default function DomainOne() { -
-
-
- -
+
+
-
-
-
- -
+
+
diff --git a/src/components/domain/Three/ChartPanel.jsx b/src/components/domain/Three/ChartPanel.jsx new file mode 100644 index 0000000..f3fb75c --- /dev/null +++ b/src/components/domain/Three/ChartPanel.jsx @@ -0,0 +1,184 @@ +import ReactECharts from "echarts-for-react"; + +const years = []; + +for (let year = 1900; year <= 2000; year++) { + years.push(year); +} + +const AntarcticaData = [ + 0.101942611, 0.121527548, 0.139042908, 0.153372484, 0.163348844, 0.16781324, + 0.165740405, 0.156668394, 0.140792524, 0.118786901, 0.091903343, 0.062313072, + 0.032977812, 0.00716395, -0.012074836, -0.022308346, -0.021755523, + -0.00911355, 0.016196573, 0.053416993, 0.100564819, 0.155328769, 0.215351821, + 0.278252395, 0.341745714, 0.40383823, 0.463006888, 0.518309403, 0.569408932, + 0.616333481, 0.65915749, 0.697835067, 0.732192543, 0.761939745, 0.78659761, + 0.805314271, 0.81708585, 0.820876623, 0.815679973, 0.800851314, 0.776409401, + 0.742721875, 0.700509783, 0.651004076, 0.595858743, 0.536937172, 0.476075479, + 0.414725656, 0.353864772, 0.294239451, 0.236327526, 0.18015056, 0.125260938, + 0.070978964, 0.016363941, -0.039809019, -0.09861786, -0.160770418, + -0.226238681, -0.294159838, -0.363174145, -0.431703208, -0.497831469, + -0.559188985, -0.613384987, -0.658281488, -0.692634725, -0.716904761, + -0.73222222, -0.739942379, -0.741611283, -0.73898482, -0.733815531, + -0.727389051, -0.720449369, -0.713466528, -0.706847385, -0.700922099, + -0.695911133, -0.691920829, -0.688978939, -0.687022002, -0.685739611, + -0.684476492, -0.682376879, -0.678508387, -0.672015068, -0.662330127, + -0.649157058, -0.632405431, -0.612100964, -0.588400678, -0.56151658, + -0.531629308, -0.498751783, -0.462720586, -0.423305188, -0.380187818, + -0.332990445, -0.281392986, -0.225240753, +]; +const ArcticData = [ + 0.280477536, 0.259957371, 0.238217659, 0.215366218, 0.191558571, 0.167050728, + 0.142221385, 0.117514405, 0.093353739, 0.070136018, 0.048165337, 0.027449274, + 0.007551689, -0.012191879, -0.032557296, -0.054358257, -0.078483167, + -0.105781444, -0.137208672, -0.174049223, -0.217858518, -0.26986764, + -0.329886107, -0.395653113, -0.463819615, -0.530529991, -0.591308473, + -0.641252419, -0.675396192, -0.689099366, -0.679883827, -0.649742172, + -0.602149752, -0.540699996, -0.469155442, -0.39235518, -0.317187358, + -0.251641431, -0.203124483, -0.175400473, -0.167133512, -0.174805821, + -0.194600911, -0.222664488, -0.254875954, -0.286753396, -0.31384639, + -0.331733387, -0.335992097, -0.322259345, -0.28761534, -0.234372353, + -0.167389335, -0.091870697, -0.013026713, 0.063931601, 0.133955753, + 0.193415777, 0.241940543, 0.280019233, 0.308168154, 0.326938643, 0.337234614, + 0.34096367, 0.340608802, 0.338547054, 0.336593745, 0.335321866, 0.334127457, + 0.331817533, 0.327341923, 0.320216724, 0.310432332, 0.298228465, 0.284102612, + 0.268784935, 0.253114795, 0.237954629, 0.224151962, 0.212536008, 0.203736355, + 0.198010458, 0.195233614, 0.194960735, 0.196490857, 0.19901247, 0.201666439, + 0.203617401, 0.204129573, 0.202630823, 0.19873752, 0.192336315, 0.183625216, + 0.173000981, 0.16106866, 0.148653001, 0.136669759, 0.12600632, 0.117368896, + 0.111065474, 0.107060448, +]; +const TibetanData = [ + -0.054774324, -0.072074468, -0.088166217, -0.102150868, -0.113128752, + -0.12021764, -0.122708696, -0.12041877, -0.113696453, -0.103130771, + -0.089455408, -0.073531475, -0.056259257, -0.03854918, -0.021352917, + -0.005665395, 0.007550856, 0.01747264, 0.023473197, 0.025172256, 0.022567986, + 0.01612004, 0.006575074, -0.005110343, -0.017780686, -0.030203073, + -0.041154273, -0.04937311, -0.053563998, -0.052516092, -0.045257867, + -0.031279225, -0.010592879, 0.016344502, 0.048680379, 0.085233754, + 0.124518788, 0.164767706, 0.204092074, 0.240587798, 0.272353213, 0.297512938, + 0.314395917, 0.321976324, 0.320031404, 0.309041322, 0.289958303, 0.26397781, + 0.232447596, 0.196815201, 0.15858192, 0.119195224, 0.079906512, 0.041729979, + 0.005377081, -0.028807517, -0.060676589, -0.09016857, -0.11718843, + -0.141549386, -0.163019079, -0.181382947, -0.196521195, -0.208451503, + -0.21726015, -0.223065102, -0.226003897, -0.226234158, -0.223991288, + -0.219766729, -0.214261928, -0.208224121, -0.202386774, -0.197405298, + -0.193729514, -0.191661726, -0.191394367, -0.192960556, -0.196177765, + -0.20070803, -0.206145455, -0.212083352, -0.218149914, -0.223985256, + -0.229195822, -0.233329665, -0.235927137, -0.236550243, -0.234784989, + -0.230241493, -0.222529731, -0.211284994, -0.196192431, -0.177010405, + -0.153629275, -0.126243447, -0.095383816, -0.061763417, -0.026131148, + 0.010750252, 0.048064799, +]; + +function ChartPanel() { + const option = { + title: { + // text: "Stacked Line", + }, + tooltip: { + trigger: "axis", + }, + legend: { + data: ["南极", "北极", "青藏高原"], + textStyle: { color: "#04fbfd", cursor: "point" }, + }, + animationDuration: years.length * 500, + animationEasing: "cubicInOut", + grid: { + left: "3%", + right: "4%", + bottom: "3%", + containLabel: true, + }, + // toolbox: { + // feature: { + // // 下载 + // saveAsImage: {}, + // }, + // }, + xAxis: { + type: "category", + boundaryGap: false, + data: years, + axisLine: { + onZero: false, + symbol: ["none", "arrow"], + symbolOffser: [0, 10], + }, + }, + yAxis: { + type: "value", + min: -1, + max: 1, + interval: 0.5, + splitNumber: 5, + splitLine: { show: false }, + axisLine: { + onZero: false, + show: true, + symbol: ["none", "arrow"], + symbolOffset: [0, 10], + }, + axisLabel: { + show: true, + }, + axisTick: { show: true }, + scale: true, + }, + dataZoom: { type: "inside", start: 0, end: 100 }, + series: [ + { + name: "北极", + type: "line", + stack: "Total", + data: AntarcticaData, + smooth: true, + color: "red", + symbol: "none", + itemStyle: { + color: "red", + }, + }, + { + name: "南极", + type: "line", + // stack: "Total", + data: ArcticData, + smooth: true, + color: "blue", + symbol: "none", + itemStyle: { + color: "blue", + }, + }, + { + name: "青藏高原", + type: "line", + // stack: "Total", + data: TibetanData, + smooth: true, + color: "green", + symbol: "none", + itemStyle: { + color: "green", + }, + }, + ], + }; + + return ( +
+ +
+ ); +} + +export default ChartPanel; diff --git a/src/components/domain/Three/CustomFlyTo.jsx b/src/components/domain/Three/CustomFlyTo.jsx new file mode 100644 index 0000000..c217d79 --- /dev/null +++ b/src/components/domain/Three/CustomFlyTo.jsx @@ -0,0 +1,11 @@ +import { Cartesian3 } from "cesium"; +import { CameraFlyTo } from "resium"; + +export default function CustomFlyTo() { + return ( + + ); +} diff --git a/src/components/domain/Three/LandImageLayer.jsx b/src/components/domain/Three/LandImageLayer.jsx new file mode 100644 index 0000000..40fb66a --- /dev/null +++ b/src/components/domain/Three/LandImageLayer.jsx @@ -0,0 +1,33 @@ +import { useEffect, useMemo, useState } from "react"; +import { ImageryLayer, useCesium } from "resium"; +import { WebMapServiceImageryProvider } from "cesium"; + +const url = "http://analysis.tpdc.ac.cn/gs/geoserver/phitrellis/wms"; +const name = "phitrellis:4_3_t2m_era_1024"; + +function LandImageLayer() { + const { viewer } = useCesium(); + + const tempProvider = useMemo( + () => + new WebMapServiceImageryProvider({ + url: url, + layers: name, + parameters: { + service: "WMS", + format: "image/png", + transparent: true, + }, + }), + [name, url] + ); + return ( + + ); +} + +export default LandImageLayer; diff --git a/src/components/domain/Three/OceanImageLayer.jsx b/src/components/domain/Three/OceanImageLayer.jsx new file mode 100644 index 0000000..3d8eaa4 --- /dev/null +++ b/src/components/domain/Three/OceanImageLayer.jsx @@ -0,0 +1,34 @@ +import { useEffect, useMemo, useState } from "react"; +import { ImageryLayer, useCesium } from "resium"; +import { WebMapServiceImageryProvider } from "cesium"; +import { useInterval } from "ahooks"; +import { useSelector } from "react-redux"; + +const url = "http://analysis.tpdc.ac.cn/gs/geoserver/phitrellis/wms"; +const name = "phitrellis:4_3_hadisst_1822"; + +function OceanImageLayer() { + const tempProvider = useMemo( + () => + new WebMapServiceImageryProvider({ + url: url, + layers: name, + parameters: { + service: "WMS", + format: "image/png", + transparent: true, + }, + }), + [name, url] + ); + return ( + + ); +} + +export default OceanImageLayer; diff --git a/src/components/domain/Three/WavePoints.jsx b/src/components/domain/Three/WavePoints.jsx new file mode 100644 index 0000000..4678205 --- /dev/null +++ b/src/components/domain/Three/WavePoints.jsx @@ -0,0 +1,11 @@ +import { Fragment } from "react"; +import WavePoint from "@/components/common/WavePoint"; + +export default function WavePoints() { + return ( + + + + + ); +} diff --git a/src/components/domain/Three/index.jsx b/src/components/domain/Three/index.jsx new file mode 100644 index 0000000..ce3633f --- /dev/null +++ b/src/components/domain/Three/index.jsx @@ -0,0 +1,31 @@ +import MapLayout from "@/components/map/Layout"; +import CustomToolbar from "@/components/common/CustomToolbar"; +import CustomClock from "@/components/common/CustomClock"; +import TextInfoPanel from "@/components/common/TextInfoPanel"; +import CustomFlyTo from "./CustomFlyTo"; +import WavePoints from "./WavePoints"; +import ChartPanel from "./ChartPanel"; +import LandImageLayer from "./LandImageLayer"; +import OceanImageLayer from "./OceanImageLayer"; + +export default function DomainOne() { + return ( + +
+ 两极协同—连接南极和北极的热带大西洋经向模的媒介作用 +
+ + + +
+ +
+
+ +
+ + + +
+ ); +} diff --git a/src/components/domain/Two/CustomFlyTo.jsx b/src/components/domain/Two/CustomFlyTo.jsx new file mode 100644 index 0000000..349e87e --- /dev/null +++ b/src/components/domain/Two/CustomFlyTo.jsx @@ -0,0 +1,115 @@ +import { useDispatch } from "react-redux"; +import { useCesium } from "resium"; + +function CustomFlyTo() { + const dispatch = useDispatch(); + const { viewer } = useCesium(); + const { camera } = viewer; + + function cameraFlyToLine(adjustPitch) { + // 南极 + const antarcticalOptions = { + destination: Cesium.Cartesian3.fromDegrees(88, -89, 1600000), + orientation: { + heading: Cesium.Math.toRadians(15.0), + pitch: Cesium.Math.toRadians(-60), + roll: 0.0, + }, + duration: 10, + complete: function () { + setTimeout(() => { + camera.flyTo(plateauOptions); + }, 1000); + }, + }; + + const area1Options = { + destination: Cesium.Cartesian3.fromDegrees(-110, -60, 6000000), + duration: 5, + complete: function () { + setTimeout(function () { + camera.flyTo(area2Options); + }, 1000); + }, + }; + + const area2Options = { + destination: Cesium.Cartesian3.fromDegrees(-30, -55, 6000000), + duration: 5, + complete: function () { + setTimeout(function () { + camera.flyTo(area3Options); + }, 1000); + }, + }; + + const area3Options = { + destination: Cesium.Cartesian3.fromDegrees(30, -40, 6000000), + duration: 5, + complete: function () { + setTimeout(function () { + camera.flyTo(area4Options); + }, 1000); + }, + }; + + const area4Options = { + destination: Cesium.Cartesian3.fromDegrees(65, -35, 6000000), + duration: 5, + complete: function () { + setTimeout(function () { + camera.flyTo(sideViewOptions); + }, 1000); + }, + }; + + // 青藏高原 + const plateauOptions = { + destination: Cesium.Cartesian3.fromDegrees(90, 20, 1600000), + duration: 5, + orientation: { + heading: Cesium.Math.toRadians(-15.0), + pitch: -Cesium.Math.PI_OVER_FOUR, + roll: 0.0, + }, + complete: function () { + setTimeout(function () { + camera.flyTo(sideViewOptions); + }, 1000); + }, + }; + + // 侧边 + const sideViewOptions = { + destination: Cesium.Cartesian3.fromDegrees(80, -60, 16000000), + // destination: Cesium.Cartesian3.fromDegrees(130, -10.5, 20000000), + duration: 5, + orientation: { + heading: Cesium.Math.toRadians(-10.0), + pitch: Cesium.Math.toRadians(-92), + roll: 6.0, + }, + complete: () => { + viewer.clock.shouldAnimate = true; + dispatch.data.updateToolbar({ showPanel: true }); + setTimeout(() => { + camera.flyTo({ + duration: 5, + destination: Cesium.Cartesian3.fromDegrees(90, -12, 14000000), + }); + }, 40 * 1000); + }, + }; + + if (adjustPitch) { + antarcticalOptions.pitchAdjustHeight = 1000; + plateauOptions.pitchAdjustHeight = 1000; + sideViewOptions.pitchAdjustHeight = 1000; + } + camera.flyTo(antarcticalOptions); + } + cameraFlyToLine(); + return <>; +} + +export default CustomFlyTo; diff --git a/src/components/domain/Two/IndiaOceanSST.jsx b/src/components/domain/Two/IndiaOceanSST.jsx new file mode 100644 index 0000000..5be8261 --- /dev/null +++ b/src/components/domain/Two/IndiaOceanSST.jsx @@ -0,0 +1,34 @@ +import { useEffect, useMemo, useState } from "react"; +import { ImageryLayer, useCesium } from "resium"; +import { WebMapServiceImageryProvider } from "cesium"; +import { useInterval } from "ahooks"; +import { useSelector } from "react-redux"; + +const url = "http://analysis.tpdc.ac.cn/gs/geoserver/phitrellis/wms"; + +function IndianOceanSST() { + const { imageLayer } = useSelector((state) => state.data); + + const tempProvider = useMemo( + () => + new WebMapServiceImageryProvider({ + url: url, + layers: "phitrellis:india_ocean_sst", + parameters: { + service: "WMS", + format: "image/png", + transparent: true, + }, + }), + [url] + ); + + return ( + + ); +} + +export default IndianOceanSST; diff --git a/src/components/domain/Two/Legend.jsx b/src/components/domain/Two/Legend.jsx new file mode 100644 index 0000000..6661238 --- /dev/null +++ b/src/components/domain/Two/Legend.jsx @@ -0,0 +1,104 @@ +import { Fragment } from "react"; + +const colorBar = [ + "#ffc53d", + "#ffd666", + "#ffe58f", + "#fff1b8", + "#fffbe6", + "#e6f7ff", + "#bae7ff", + "#91d5ff", + "#69c0ff", + "#40a9ff", +]; + +const colorBar2 = [ + "#73d13d", + "#95de64", + "#b7eb8f", + "#d9f7be", + "#f6ffed", + "#fff1f0", + "#ffccc7", + "#ffa39e", + "#ff7875", + "#ff4d4f", +]; + +function Legend() { + return ( + +
+
青藏高原感热通量
+
+
+ {[-0.5, -0.4, -0.3, -0.2, -0.1, 0, 0.1, 0.2, 0.3, 0.4, 0.5].map( + (item, index) => { + return ( +
+ {item} +
+ ); + } + )} +
+
+ {colorBar2.map((color, index) => { + return ( +
+ ); + })} +
+
+
+
+
青藏高原降水量
+
+
+ {[-0.5, -0.4, -0.3, -0.2, -0.1, 0, 0.1, 0.2, 0.3, 0.4, 0.5].map( + (item, index) => { + return ( +
+ {item} +
+ ); + } + )} +
+
+ {colorBar.map((color, index) => { + return ( +
+ ); + })} +
+
+
+ + ); +} + +export default Legend; diff --git a/src/components/domain/Two/PlateauPolygon.jsx b/src/components/domain/Two/PlateauPolygon.jsx new file mode 100644 index 0000000..47af5a3 --- /dev/null +++ b/src/components/domain/Two/PlateauPolygon.jsx @@ -0,0 +1,37 @@ +import { useCallback, useState } from "react"; +import { useParams } from "react-router-dom"; +import { Entity, PolygonGraphics, useCesium } from "resium"; +import { useInterval } from "ahooks"; + +function PlateauPolygon() { + const { type } = useParams(); + const { viewer } = useCesium(); + const [show, setShow] = useState(false); + + const showAnimate = useCallback(() => { + const { currentTime, stopTime } = viewer.clock; + const leftTime = Math.floor( + stopTime.secondsOfDay - currentTime.secondsOfDay + ); + + if (leftTime < 20) { + setShow(true); + } else if (show) setShow(false); + }, [show, type]); + + useInterval(showAnimate, 100); + + return ( + + + + ); +} + +export default PlateauPolygon; diff --git a/src/components/domain/Two/Point.jsx b/src/components/domain/Two/Point.jsx new file mode 100644 index 0000000..7623c56 --- /dev/null +++ b/src/components/domain/Two/Point.jsx @@ -0,0 +1,93 @@ +import { useState } from "react"; +import { Entity, PointGraphics, useCesium } from "resium"; +import { useInterval } from "ahooks"; + +// 从南极到青藏高原 +const dataAntarcticaToQTP = [ + { longitude: -110, latitude: -60, height: 0, time: 0 }, + { longitude: -110, latitude: -60, height: 1000000, time: 10 }, + { longitude: -30, latitude: -55, height: 1000000, time: 20 }, + { longitude: 30, latitude: -40, height: 1000000, time: 30 }, + { longitude: 65, latitude: -35, height: 1000000, time: 40 }, + { longitude: 95, latitude: -30, height: 1000000, time: 50 }, + { longitude: 95, latitude: -30, height: 0, time: 60 }, +]; + +function Point() { + const { viewer } = useCesium(); + + const [delay, setDelay] = useState(1000); + + const start = viewer.clock.startTime; + const stop = viewer.clock.stopTime; + + const pathMaterial = new Cesium.Color(4 / 255, 251 / 255, 253 / 255); + + useInterval(() => { + if (viewer.clock?.shouldAnimate) setDelay(undefined); + }, delay); + + /** + * 计算飞行路径 + * 数据坐标 + * {SampledPositionProperty|*} + */ + function createProperty(source) { + let property = new Cesium.SampledPositionProperty(); + for (let i = 0; i < source.length; i++) { + let time = Cesium.JulianDate.addSeconds( + start, + source[i].time, + new Cesium.JulianDate() + ); + let position = Cesium.Cartesian3.fromDegrees( + source[i].longitude, + source[i].latitude, + source[i].height + ); + // 添加位置,和时间对应 + property.addSample(time, position); + } + property.setInterpolationOptions({ + interpolationDegree: 1, + interpolationAlgorithm: Cesium.LinearApproximation, + }); + return property; + } + + const property = createProperty(dataAntarcticaToQTP); + + return ( + + + + ); +} + +export default Point; diff --git a/src/components/domain/Two/WavePoints.jsx b/src/components/domain/Two/WavePoints.jsx new file mode 100644 index 0000000..4678205 --- /dev/null +++ b/src/components/domain/Two/WavePoints.jsx @@ -0,0 +1,11 @@ +import { Fragment } from "react"; +import WavePoint from "@/components/common/WavePoint"; + +export default function WavePoints() { + return ( + + + + + ); +} diff --git a/src/components/domain/Two/index.jsx b/src/components/domain/Two/index.jsx new file mode 100644 index 0000000..28c12ad --- /dev/null +++ b/src/components/domain/Two/index.jsx @@ -0,0 +1,29 @@ +import MapLayout from "@/components/map/Layout"; +import CustomToolbar from "@/components/common/CustomToolbar"; +import CustomClock from "@/components/common/CustomClock"; +import TextInfoPanel from "@/components/common/TextInfoPanel"; +import CustomFlyTo from "./CustomFlyTo"; +import Point from "./Point"; +import PlateauPolygon from "./PlateauPolygon"; +import WavePoints from "./WavePoints"; +import Legend from "./Legend"; +import IndianOceanSST from "./IndiaOceanSST"; + +export default function DomainTwo() { + return ( + +
两极协同—南极涛动有效调节青藏高原降水和加热
+ + + + + +
+ +
+ + + +
+ ); +} diff --git a/src/components/map/Layout/index.module.less b/src/components/map/Layout/index.module.less index 3ae5749..c6622f7 100644 --- a/src/components/map/Layout/index.module.less +++ b/src/components/map/Layout/index.module.less @@ -152,6 +152,10 @@ } } + .one { + top: 50%; + } + .legend { position: absolute; bottom: 40px; @@ -206,4 +210,59 @@ } } } + + .vertical-legend { + position: absolute; + bottom: 12px; + right: 474px; + height: 300px; + width: 130px; + display: flex; + flex-direction: column; + align-items: center; + background-color: #1f485690; + border: 1px solid #04fbfd; + border-radius: 8px; + padding: 8px; + + .legend-title { + color: #04fbfd; + } + + .colorbar { + width: 100px; + display: flex; + flex-direction: column; + justify-content: space-between; + height: 100%; + + .colorbar-item { + flex: 1; + border: 2px black solid; + border-left: none; + border-right: none; + height: 25px; + width: 25px; + + &:not(:nth-child(1)) { + border-top: none; + } + } + } + + .legend-text { + display: flex; + flex-direction: column; + justify-content: space-between; + width: 100%; + + .legend-text-item { + flex: 1; + text-align: right; + font-weight: 600; + color: white; + -webkit-text-stroke: #04fbfd 1px; + } + } + } }