hookehuyr

新增视频播放和样式调整

This diff is collapsed. Click to expand it.
...@@ -12,11 +12,13 @@ ...@@ -12,11 +12,13 @@
12 "cypress:open": "cypress open" 12 "cypress:open": "cypress open"
13 }, 13 },
14 "dependencies": { 14 "dependencies": {
15 + "@videojs-player/vue": "^1.0.0",
15 "@vitejs/plugin-legacy": "^1.8.2", 16 "@vitejs/plugin-legacy": "^1.8.2",
16 "@vueuse/core": "^8.5.0", 17 "@vueuse/core": "^8.5.0",
17 "animate.css": "^4.1.1", 18 "animate.css": "^4.1.1",
18 "dayjs": "^1.11.3", 19 "dayjs": "^1.11.3",
19 "default-passive-events": "^2.0.0", 20 "default-passive-events": "^2.0.0",
21 + "font-awesome": "^4.7.0",
20 "global": "^4.4.0", 22 "global": "^4.4.0",
21 "html2canvas": "^1.4.1", 23 "html2canvas": "^1.4.1",
22 "jquery": "^3.6.0", 24 "jquery": "^3.6.0",
...@@ -30,6 +32,7 @@ ...@@ -30,6 +32,7 @@
30 "uuid": "^8.3.2", 32 "uuid": "^8.3.2",
31 "vant": "^4.0.0-alpha.3", 33 "vant": "^4.0.0-alpha.3",
32 "vconsole": "^3.14.6", 34 "vconsole": "^3.14.6",
35 + "video.js": "^8.3.0",
33 "vite-plugin-dynamic-import": "^0.9.6", 36 "vite-plugin-dynamic-import": "^0.9.6",
34 "vite-plugin-mp": "^1.6.1", 37 "vite-plugin-mp": "^1.6.1",
35 "vue": "^3.2.36", 38 "vue": "^3.2.36",
......
...@@ -109,6 +109,41 @@ var spotInfo = [ ...@@ -109,6 +109,41 @@ var spotInfo = [
109 position: [120.585948, 31.315095], 109 position: [120.585948, 31.315095],
110 icon: '//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png', 110 icon: '//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png',
111 }, 111 },
112 + {
113 + name: '罗汉堂',
114 + position: [120.58764, 31.315011],
115 + icon: '//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png',
116 + note: `与观音殿遥相呼应的是罗汉堂,位于大雄宝殿西侧。西园寺罗汉堂为中国四大古罗汉堂之一。
117 +
118 + 西园罗汉堂创建于明末,咸丰时即倾颓于战火。现仅存第一进石拱门的圆框及左右门券石,雕刻精美,为明代遗物,历经岁月摩娑,光泽内敛。如今,我们只能从遗物的精美雕刻,遥想旧时沧桑及这一不复存在的胜迹。现有的罗汉堂,为同治、光绪年间陆续重葺。屋宇深广,共三进四十八间。整体建筑呈田字形布局,中心雕塑周围有小天井四座,给幽深曲折的殿堂提供了良好的通风和采光条件。
119 +
120 + 从空中俯瞰,罗汉堂黛瓦覆顶,组成一个汉字的“田”字。象征在佛教里僧宝,是一切世间供养、布施、修福的无上福田,五百罗汉则是贤圣僧的代表。
121 +
122 +
123 + 除了俯瞰的“田”字,在罗汉堂地下,还有一项隐秘而巧妙的设计——西边放生池的水源经过罗汉堂地下隐秘水道弯曲绕行,流经罗汉堂,最终汇聚到大雄宝殿露台前的香花桥下。这不仅让西园寺内基础水池串联成一片活水,更重要和巧妙地解决了罗汉堂内的湿度调节问题。因五百罗汉为泥胎雕塑,过于干燥的空气将会造成古老的泥塑造像干裂、风化、剥落等一系列问题,而地下隐暗水道的设计,则有效保证罗汉堂内的湿度能控制在一定范围内。于此,不得不叹服先人的智慧。
124 +
125 + 罗汉堂原有的建筑较为低矮,不仅光线昏暗、空气浑浊,而且年深日久,梁柱有不同程度的老旧腐化。一九九七年七月,寺院对罗汉堂进行了全面整修,历时半年。在落架大修过程中,既遵照文物修旧如旧的原则,又以创新的精神,适应形势发展的需要,大胆将罗汉堂屋顶升高六十厘米,并加了斗拱,既利于文物的保护,又极大改善了罗汉堂采光环境,使整个罗汉堂显得美观大方,吸引了众多的信众前来瞻礼,使古寺焕发出崭新的光彩,成为名副其实的吴中胜地。`
126 + },
127 + {
128 + name: '大雄宝殿',
129 + position: [120.587249, 31.314722],
130 + icon: '//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png',
131 + note: `大雄宝殿是寺院的中心建筑,兴建于清末民初时期。重檐歇山,面阔七楹,飞檐翘角,气势雄伟,风格挺秀。梁枋均施苏式彩绘,典雅富丽,绚丽夺目。
132 +
133 + 大殿二重檐下,悬“大雄宝殿”四个遒劲有力的金字,气势雄浑,据说这四个字是陆润庠所提。陆润庠是苏州历史上第五十五位,也是最后一位状元,官至一品、大学士(即宰相级别)。大雄宝殿是佛教寺院中供奉佛像的正殿,是整座寺院的核心建筑,也是僧众朝暮集中修持的地方。因释迦牟尼佛德号“大雄”,所以称大雄宝殿。为什么叫大雄?大者,是包含万有的意思;雄者,是摄伏群魔的意思。释迦牟尼佛具足圆觉智慧,能雄镇大千世界,降伏四魔(烦恼魔、阴魔、死魔、自在天魔),因此尊称佛陀为大雄。
134 +
135 + 檐枋悬有三块匾额,中门之上为“西乾应迹”匾额。西者西方,乾者天也,西乾即是指佛教的发源地古印度,因当时地处中国的西方而得名,相应地,中国则被称为东土。应迹谓应化垂迹,即佛、菩萨应众生之机缘而将其本体示现种种身以济度众生。
136 +
137 + 东门上为“焰网庄严”匾额,出处为《药师经》第二大愿:“身善能安住,焰网庄严,过于日月”,即所谓“药师如来琉璃光,焰网庄严无等伦”,形容的是东方药师佛世界;西门上为“光寿无量”匾额,是“无量寿、无量光”的意思,意指西方阿弥陀佛光寿无量。“三个匾额”与殿内供奉的“横世三佛”内外呼应。与“西乾应迹”相呼应的中间一尊佛像是释迦摩尼佛,大迦叶尊者与阿难尊者分立两侧;与“焰网庄严”相呼应的则是药师佛,位于东侧;与“光寿无量”相呼应的则是阿弥陀佛,位于西侧。几尊佛像均是香樟木雕刻,是现存不多的清时期极具代表性的大型木雕造像。三尊佛像下莲花座、金刚须弥座雕刻精美、令人叹为观止。
138 +
139 + 大殿内有三副抱柱楹联,外侧上联为“东震涌庄严,看桥通鹤市,山近虎丘,招提久占三吴胜”;下联为“西来参本意,任侠士流芳,生公说法,照澈都归五蕴空”。“鹤市”,阖闾女亡,出殡时,鹤舞于阊门,后以鹤市代指阊门。“生公说法”,是指南北朝的高僧竺道生在虎丘山上说法,最后顽石也点头赞同的典故。后有题记:“乙丑(1925)春仲,郡人许人俊谨题”。
140 +
141 + 内侧有两副,内外上联为“宝相瞻大雄,象法禅机垂正觉”;下联为“劳生来小息,鱼音梵呗涤尘烦”;“余姚黄雨斋撰立,江东浦泳谨书”。
142 +
143 + 内中上联为“海国启琳宫,宏法利生扬正教”;下联为“灵山闻妙谛,觉迷度苦感仁王”;“弟子夏士魁长发头陀敬献,江东浦泳谨书”。
144 +
145 + 两副对联均作于民国三十三年(1944),其中“感仁王”三字年久剥落,1985年浦泳老先生重游西园寺,见字残缺,说“趁我有生之年,把字补好”。不久果寄来字样,重修时已把字补上,亦可告慰于浦老矣!`
146 + },
112 ]; 147 ];
113 148
114 var toiletInfo = [ 149 var toiletInfo = [
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
2 * @Author: hookehuyr hookehuyr@gmail.com 2 * @Author: hookehuyr hookehuyr@gmail.com
3 * @Date: 2022-05-31 12:06:19 3 * @Date: 2022-05-31 12:06:19
4 * @LastEditors: hookehuyr hookehuyr@gmail.com 4 * @LastEditors: hookehuyr hookehuyr@gmail.com
5 - * @LastEditTime: 2022-06-29 22:00:37 5 + * @LastEditTime: 2023-05-30 13:12:21
6 - * @FilePath: /tswj/src/main.js 6 + * @FilePath: /map-demo/src/main.js
7 * @Description: 7 * @Description:
8 */ 8 */
9 import { createApp } from 'vue'; 9 import { createApp } from 'vue';
...@@ -14,6 +14,10 @@ import App from './App.vue'; ...@@ -14,6 +14,10 @@ import App from './App.vue';
14 import axios from '@/utils/axios'; 14 import axios from '@/utils/axios';
15 // import 'default-passive-events'; // 解决Chrome控制台non-passive event listener输出问题 15 // import 'default-passive-events'; // 解决Chrome控制台non-passive event listener输出问题
16 import { createPinia } from 'pinia'; 16 import { createPinia } from 'pinia';
17 +import 'font-awesome/css/font-awesome.min.css';
18 +
19 +import VueVideoPlayer from '@videojs-player/vue';
20 +import 'video.js/dist/video-js.css';
17 21
18 const pinia = createPinia(); 22 const pinia = createPinia();
19 const app = createApp(App); 23 const app = createApp(App);
...@@ -22,4 +26,6 @@ app.config.globalProperties.$http = axios; // 关键语句 ...@@ -22,4 +26,6 @@ app.config.globalProperties.$http = axios; // 关键语句
22 26
23 app.use(pinia).use(router).use(Button).use(VanImage).use(Col).use(Row).use(Icon).use(Form).use(Field).use(CellGroup).use(Toast).use(Uploader).use(Empty).use(Tab).use(Tabs).use(Overlay).use(NumberKeyboard).use(Lazyload).use(List).use(PullRefresh).use(Popup).use(Picker).use(Sticky).use(Stepper).use(Tag).use(Swipe).use(SwipeItem).use(Dialog).use(ActionSheet).use(Loading).use(Checkbox).use(Search).use(ConfigProvider); 27 app.use(pinia).use(router).use(Button).use(VanImage).use(Col).use(Row).use(Icon).use(Form).use(Field).use(CellGroup).use(Toast).use(Uploader).use(Empty).use(Tab).use(Tabs).use(Overlay).use(NumberKeyboard).use(Lazyload).use(List).use(PullRefresh).use(Popup).use(Picker).use(Sticky).use(Stepper).use(Tag).use(Swipe).use(SwipeItem).use(Dialog).use(ActionSheet).use(Loading).use(Checkbox).use(Search).use(ConfigProvider);
24 28
29 +app.use(VueVideoPlayer)
30 +
25 app.mount('#app'); 31 app.mount('#app');
......
1 <!-- 1 <!--
2 * @Date: 2023-05-19 14:54:27 2 * @Date: 2023-05-19 14:54:27
3 * @LastEditors: hookehuyr hookehuyr@gmail.com 3 * @LastEditors: hookehuyr hookehuyr@gmail.com
4 - * @LastEditTime: 2023-05-29 18:12:10 4 + * @LastEditTime: 2023-05-30 13:45:04
5 * @FilePath: /map-demo/src/views/index.vue 5 * @FilePath: /map-demo/src/views/index.vue
6 * @Description: 文件描述 6 * @Description: 文件描述
7 --> 7 -->
8 <template> 8 <template>
9 <div style="height: 100vh; position: relative;"> 9 <div style="height: 100vh; position: relative;">
10 <div id="container"></div> 10 <div id="container"></div>
11 - <div class="input-card">
12 - <!-- <div class="input-item">
13 - <span @click="showPublic" class="btn">显示公共设施</span>
14 - <span @click="hidePublic" class="btn">隐藏公共设施</span>
15 - </div> -->
16 - <!-- <div class="input-item">
17 - <button class="btn" @click="addLayer" style="margin-right:1rem;">添加图层</button>
18 - <button class="btn" @click="removeLayer">删除图层</button>
19 - </div> -->
20 - <div class="input-item">
21 - <!-- <button class="btn" @click="setLocation" style="margin-right:1rem;">定位服务</button>
22 - <button class="btn" @click="addLocation" style="margin-right:1rem;">添加定位路线</button>
23 - <button class="btn" @click="removeLocation" style="margin-right:1rem;">删除定位路线</button> -->
24 - <button class="btn" @click="setTitleLayer" style="margin-right:1rem;">添加贴片</button>
25 - </div>
26 - <div class="input-item">
27 - <button class="btn" @click="setWalkRoute" style="margin-right:1rem;">步行导航</button>
28 - <button class="btn" @click="removeWalkRoute" style="margin-right:1rem;">移除步行导航</button>
29 - </div>
30 - </div>
31 <div class="nav-bar-wrapper"> 11 <div class="nav-bar-wrapper">
32 <van-row> 12 <van-row>
33 <van-col span="8" :class="[isActive === 0 ? 'checked' : '', 'item']" @click="setNavLayer(0)"> 13 <van-col span="8" :class="[isActive === 0 ? 'checked' : '', 'item']" @click="setNavLayer(0)">
34 - <van-icon name="shop-o" size="1.25rem" /><br/> 14 + <van-icon name="shop-o" size="1.25rem" /><br />
35 <span style="font-size: 0.85rem;">景区信息</span> 15 <span style="font-size: 0.85rem;">景区信息</span>
36 </van-col> 16 </van-col>
37 <van-col span="8" :class="[isActive === 1 ? 'checked' : '', 'item']" @click="setNavLayer(1)"> 17 <van-col span="8" :class="[isActive === 1 ? 'checked' : '', 'item']" @click="setNavLayer(1)">
38 - <van-icon name="shop-o" size="1.25rem" /><br/> 18 + <van-icon name="shop-o" size="1.25rem" /><br />
39 <span style="font-size: 0.85rem;">卫生间</span> 19 <span style="font-size: 0.85rem;">卫生间</span>
40 </van-col> 20 </van-col>
41 <van-col span="8" :class="[isActive === 2 ? 'checked' : '', 'item']" @click="setNavLayer(2)"> 21 <van-col span="8" :class="[isActive === 2 ? 'checked' : '', 'item']" @click="setNavLayer(2)">
42 - <van-icon name="shop-o" size="1.25rem" /><br/> 22 + <van-icon name="shop-o" size="1.25rem" /><br />
43 <span style="font-size: 0.85rem;">活动中心</span> 23 <span style="font-size: 0.85rem;">活动中心</span>
44 </van-col> 24 </van-col>
45 </van-row> 25 </van-row>
...@@ -49,12 +29,42 @@ ...@@ -49,12 +29,42 @@
49 <span v-else @click="handleSafeRoute(false)">关闭安全路线</span> 29 <span v-else @click="handleSafeRoute(false)">关闭安全路线</span>
50 </div> 30 </div>
51 <div class="tool-bar-wrapper"> 31 <div class="tool-bar-wrapper">
32 + <div style="display: flex; flex-direction: column;align-items: center;justify-content: center;">
52 <van-icon name="plus" style="margin-bottom: 1rem;" @click="setZoom('plus')" /> 33 <van-icon name="plus" style="margin-bottom: 1rem;" @click="setZoom('plus')" />
53 <van-icon name="minus" style="margin-bottom: 1rem;" @click="setZoom('minus')" /> 34 <van-icon name="minus" style="margin-bottom: 1rem;" @click="setZoom('minus')" />
54 <van-icon name="aim" @click="setLocation" /> 35 <van-icon name="aim" @click="setLocation" />
55 </div> 36 </div>
56 - <van-popup v-model:show="show_popup" position="bottom" :overlay="false" closeable 37 + </div>
57 - :style="{ padding: '64px' }">内容</van-popup> 38 + <div class="operate-bar-wrapper">
39 + <div class="box-wrapper">
40 + <div class="item" @click="setTitleLayer">
41 + <i class="fa fa-cube"></i><br />
42 + 贴片
43 + </div>
44 + <div v-if="show_walk_route" class="item" @click="setWalkRoute">
45 + <i class="fa fa-eye"></i><br />
46 + 步行
47 + </div>
48 + <div v-else class="item" @click="removeWalkRoute">
49 + <i class="fa fa-eye-slash"></i><br />
50 + 步行
51 + </div>
52 + </div>
53 + </div>
54 + <van-popup v-model:show="show_popup" position="bottom" :overlay="true" :style="{ padding: '1rem' }">
55 + <van-icon name="cross" @click="show_popup = false" style="float: right; color: gray;" />
56 + <div class="popup-wrapper">
57 + <div class="title">
58 + {{ popup_title }}
59 + </div>
60 + <div class="content" v-html="popup_content">
61 + </div>
62 + <video-player ref="videoPlayer" style="width: 100%; height: 10rem;"
63 + poster="https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100"
64 + :src="video_src"
65 + class="video-player vjs-big-play-centered" controls :loop="true" :volume="0.6"></video-player>
66 + </div>
67 + </van-popup>
58 68
59 <van-dialog v-model:show="dialog_show" title="温馨提示"> 69 <van-dialog v-model:show="dialog_show" title="温馨提示">
60 <div style="padding: 1rem; text-align: center;">您不在景区范围内</div> 70 <div style="padding: 1rem; text-align: center;">您不在景区范围内</div>
...@@ -68,6 +78,7 @@ ...@@ -68,6 +78,7 @@
68 import coord from '@/common/tiantan_v2' 78 import coord from '@/common/tiantan_v2'
69 // import AMap from 'AMap' 79 // import AMap from 'AMap'
70 import _ from 'lodash'; 80 import _ from 'lodash';
81 +import $ from 'jquery';
71 82
72 const GPS = { 83 const GPS = {
73 PI: 3.14159265358979324, 84 PI: 3.14159265358979324,
...@@ -168,7 +179,11 @@ export default { ...@@ -168,7 +179,11 @@ export default {
168 toolBar: '', 179 toolBar: '',
169 isActive: 0, 180 isActive: 0,
170 safe_route: [], 181 safe_route: [],
171 - open_safe_route: true 182 + open_safe_route: true,
183 + show_walk_route: true,
184 + popup_title: '',
185 + popup_content: '',
186 + video_src: ''
172 } 187 }
173 }, 188 },
174 mounted() { 189 mounted() {
...@@ -183,6 +198,17 @@ export default { ...@@ -183,6 +198,17 @@ export default {
183 // 打开贴片地图 198 // 打开贴片地图
184 // this.setTitleLayer() 199 // this.setTitleLayer()
185 }, 200 },
201 + watch: {
202 + show_popup(val) {
203 + if (!val) {
204 + this.$nextTick(() => {
205 + // 弹框关闭时,暂停视频
206 + $('.vjs-tech')[0].pause();
207 + $('.vjs-tech')[0].currentTime = 0;
208 + })
209 + }
210 + }
211 + },
186 methods: { 212 methods: {
187 // addMarker () { 213 // addMarker () {
188 // // axios.get('http://api.map.baidu.com/location/ip?ak=CzpAXV4bhyqCKnWpQqLRkS1i&coor=bd09ll') 214 // // axios.get('http://api.map.baidu.com/location/ip?ak=CzpAXV4bhyqCKnWpQqLRkS1i&coor=bd09ll')
...@@ -480,7 +506,11 @@ export default { ...@@ -480,7 +506,11 @@ export default {
480 } 506 }
481 // 绑定景点的点击事件 - 文字出现才能触发 507 // 绑定景点的点击事件 - 文字出现才能触发
482 var clickListener = marker.on('click', (e) => { 508 var clickListener = marker.on('click', (e) => {
483 - infoWindow.open(this.map); 509 + // infoWindow.open(this.map);
510 + this.show_popup = true;
511 + this.popup_title = x.name;
512 + this.popup_content = x.note;
513 + this.video_src = 'https://video.pearvideo.com/mp4/short/20200209/cont-1650197-14888002-hd.mp4'
484 }) 514 })
485 // 515 //
486 this.spotInfo.push(marker); 516 this.spotInfo.push(marker);
...@@ -660,7 +690,7 @@ export default { ...@@ -660,7 +690,7 @@ export default {
660 }) 690 })
661 }); 691 });
662 }, 692 },
663 - setZoom (type) { // 设置放大缩小地图 693 + setZoom(type) { // 设置放大缩小地图
664 const zoom = this.map.getZoom(); 694 const zoom = this.map.getZoom();
665 if (type === 'plus') { 695 if (type === 'plus') {
666 this.map.setZoom(zoom + 1) 696 this.map.setZoom(zoom + 1)
...@@ -718,7 +748,7 @@ export default { ...@@ -718,7 +748,7 @@ export default {
718 var layer = new AMap.TileLayer.Flexible({ 748 var layer = new AMap.TileLayer.Flexible({
719 cacheSize: 30, 749 cacheSize: 30,
720 opacity: 1, 750 opacity: 1,
721 - zIndex: 2, 751 + zIndex: 100,
722 createTile: function (x, y, z, success, fail) { 752 createTile: function (x, y, z, success, fail) {
723 // if ((x + y) % 3) { 753 // if ((x + y) % 3) {
724 // fail(); 754 // fail();
...@@ -828,18 +858,20 @@ export default { ...@@ -828,18 +858,20 @@ export default {
828 } 858 }
829 } 859 }
830 AMap.plugin(["AMap.Walking"], () => { //加载步行导航插件 860 AMap.plugin(["AMap.Walking"], () => { //加载步行导航插件
831 - this.walk_route = new AMap.Walking ({ 861 + this.walk_route = new AMap.Walking({
832 map: this.map, 862 map: this.map,
833 }); //构造步行导航类 863 }); //构造步行导航类
834 AMap.Event.addListener(this.walk_route, "complete", walking_CallBack); //返回导航查询结果 864 AMap.Event.addListener(this.walk_route, "complete", walking_CallBack); //返回导航查询结果
835 //根据起、终点坐标规划步行路线 865 //根据起、终点坐标规划步行路线
836 this.walk_route.search(new AMap.LngLat(120.587799, 31.313276), new AMap.LngLat(120.587912, 31.315169)); 866 this.walk_route.search(new AMap.LngLat(120.587799, 31.313276), new AMap.LngLat(120.587912, 31.315169));
837 }); 867 });
868 + this.show_walk_route = false;
838 }, 869 },
839 - removeWalkRoute () { 870 + removeWalkRoute() {
840 - this.walk_route.clear() 871 + this.walk_route.clear();
872 + this.show_walk_route = true;
841 }, 873 },
842 - setNavLayer (index) { // 选择地图图层显示 874 + setNavLayer(index) { // 选择地图图层显示
843 this.isActive = index; 875 this.isActive = index;
844 if (index === 0) { 876 if (index === 0) {
845 this.setSpotLayer() 877 this.setSpotLayer()
...@@ -851,7 +883,7 @@ export default { ...@@ -851,7 +883,7 @@ export default {
851 this.setActivityLayer() 883 this.setActivityLayer()
852 } 884 }
853 }, 885 },
854 - handleSafeRoute (status) { // 打开/关闭逃生路线线 886 + handleSafeRoute(status) { // 打开/关闭逃生路线线
855 if (status) { 887 if (status) {
856 this.addSafeRoute() 888 this.addSafeRoute()
857 this.open_safe_route = false; 889 this.open_safe_route = false;
...@@ -913,9 +945,10 @@ export default { ...@@ -913,9 +945,10 @@ export default {
913 .tool-bar-wrapper { 945 .tool-bar-wrapper {
914 position: absolute; 946 position: absolute;
915 left: 20px; 947 left: 20px;
916 - bottom: 40px; 948 + bottom: 8rem;
917 width: 20px; 949 width: 20px;
918 } 950 }
951 +
919 .nav-bar-wrapper { 952 .nav-bar-wrapper {
920 position: absolute; 953 position: absolute;
921 top: 0; 954 top: 0;
...@@ -925,17 +958,57 @@ export default { ...@@ -925,17 +958,57 @@ export default {
925 background-color: white; 958 background-color: white;
926 text-align: center; 959 text-align: center;
927 box-shadow: 0 2px 2px rgba(0, 0, 0, .2); 960 box-shadow: 0 2px 2px rgba(0, 0, 0, .2);
961 +
928 .item { 962 .item {
929 padding-top: 0.5rem; 963 padding-top: 0.5rem;
930 } 964 }
965 +
931 .checked { 966 .checked {
932 color: red; 967 color: red;
933 } 968 }
934 } 969 }
970 +
935 .safe-route-wrapper { 971 .safe-route-wrapper {
936 position: absolute; 972 position: absolute;
937 bottom: 1rem; 973 bottom: 1rem;
938 right: 1rem; 974 right: 1rem;
939 background-color: white; 975 background-color: white;
940 } 976 }
977 +
978 +.operate-bar-wrapper {
979 + position: absolute;
980 + right: 20px;
981 + top: 10%;
982 + width: 20px;
983 + height: auto;
984 +
985 + .box-wrapper {
986 + display: flex;
987 + flex-direction: column;
988 + align-items: center;
989 + justify-content: center;
990 +
991 + .item {
992 + text-align: center;
993 + font-size: 0.85rem;
994 + width: 2rem;
995 + height: 2rem;
996 + background-color: white;
997 + margin-bottom: 1rem;
998 + border-radius: 1px;
999 + padding: 2.5px;
1000 + }
1001 + }
1002 +}
1003 +
1004 +.popup-wrapper {
1005 + margin-top: 1rem;
1006 +
1007 + .title {
1008 + font-size: 1.25rem;
1009 + margin-bottom: 0.85rem;
1010 + }
1011 +
1012 + .content {}
1013 +}
941 </style> 1014 </style>
......
This diff is collapsed. Click to expand it.