vue-openlayers-plugin 1.0.82 → 1.0.85

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 (233) hide show
  1. package/lib/BasemapPanel-3f78db9f.mjs +280 -0
  2. package/lib/CoordinateLocationDialog-d265fbae.mjs +263 -0
  3. package/lib/FilterPanel-136dc7d8.mjs +6 -0
  4. package/lib/LayerPanel-58997ef0.mjs +6 -0
  5. package/lib/MapPrintDialog-6ed0e095.mjs +6 -0
  6. package/lib/MeasurementDialog-b86c21c6.mjs +369 -0
  7. package/lib/MyMarkersDialog-fbbd0aeb.mjs +584 -0
  8. package/lib/RegionNavigationDialog-0808549f.mjs +1320 -0
  9. package/lib/ViewBookmarksDialog-94010687.mjs +723 -0
  10. package/lib/index-14efa785.mjs +756 -0
  11. package/lib/{index-61901e1f.mjs → index-5a13e877.mjs} +50503 -53903
  12. package/lib/index-5b1583d0.mjs +839 -0
  13. package/lib/{index.es-c17b5917.mjs → index.es-0c397170.mjs} +1 -1
  14. package/lib/index.esm.js +65 -56
  15. package/lib/index.umd.js +73180 -71503
  16. package/lib/style.css +1705 -1704
  17. package/package.json +11 -5
  18. package/types/src/assets/index.d.ts +9 -0
  19. package/types/src/assets/index.d.ts.map +1 -0
  20. package/types/src/components/CustomDialog/CustomDialog.vue.d.ts +16 -16
  21. package/types/src/components/CustomDialog/icons/index.d.ts +14 -0
  22. package/types/src/components/CustomDialog/icons/index.d.ts.map +1 -0
  23. package/types/src/components/OlBaseLayerSwitcher.vue.d.ts +19 -0
  24. package/types/src/components/OlBaseLayerSwitcher.vue.d.ts.map +1 -0
  25. package/types/src/components/OlControlPanel.vue.d.ts +63 -0
  26. package/types/src/components/OlControlPanel.vue.d.ts.map +1 -0
  27. package/types/src/components/OlDialogs/BasemapPanel.vue.d.ts +20 -0
  28. package/types/src/components/OlDialogs/BasemapPanel.vue.d.ts.map +1 -0
  29. package/types/src/components/OlDialogs/CoordinateLocationDialog.vue.d.ts +21 -0
  30. package/types/src/components/OlDialogs/CoordinateLocationDialog.vue.d.ts.map +1 -0
  31. package/types/src/components/OlDialogs/DialogManager.d.ts +58 -0
  32. package/types/src/components/OlDialogs/DialogManager.d.ts.map +1 -0
  33. package/types/src/components/OlDialogs/FilterPanel.vue.d.ts +33 -0
  34. package/types/src/components/OlDialogs/FilterPanel.vue.d.ts.map +1 -0
  35. package/types/src/components/OlDialogs/LayerPanel.vue.d.ts +1345 -0
  36. package/types/src/components/OlDialogs/LayerPanel.vue.d.ts.map +1 -0
  37. package/types/src/components/OlDialogs/LayerStyleConfig.vue.d.ts +23 -0
  38. package/types/src/components/OlDialogs/LayerStyleConfig.vue.d.ts.map +1 -0
  39. package/types/src/components/OlDialogs/LayerTreeNode.vue.d.ts +28 -0
  40. package/types/src/components/OlDialogs/LayerTreeNode.vue.d.ts.map +1 -0
  41. package/types/src/components/OlDialogs/MapDrawingDialog/components/ListTab.vue.d.ts +3 -0
  42. package/types/src/components/OlDialogs/MapDrawingDialog/components/ListTab.vue.d.ts.map +1 -0
  43. package/types/src/components/OlDialogs/MapDrawingDialog/components/MarkTab.vue.d.ts +3 -0
  44. package/types/src/components/OlDialogs/MapDrawingDialog/components/MarkTab.vue.d.ts.map +1 -0
  45. package/types/src/components/OlDialogs/MapDrawingDialog/index.vue.d.ts +3 -0
  46. package/types/src/components/OlDialogs/MapDrawingDialog/index.vue.d.ts.map +1 -0
  47. package/types/src/components/OlDialogs/MapPrintDialog.vue.d.ts +24 -0
  48. package/types/src/components/OlDialogs/MapPrintDialog.vue.d.ts.map +1 -0
  49. package/types/src/components/OlDialogs/MeasurementDialog.vue.d.ts +41 -0
  50. package/types/src/components/OlDialogs/MeasurementDialog.vue.d.ts.map +1 -0
  51. package/types/src/components/OlDialogs/MyMarkersDialog.vue.d.ts +21 -0
  52. package/types/src/components/OlDialogs/MyMarkersDialog.vue.d.ts.map +1 -0
  53. package/types/src/components/OlDialogs/RegionNavigationDialog.vue.d.ts +25 -0
  54. package/types/src/components/OlDialogs/RegionNavigationDialog.vue.d.ts.map +1 -0
  55. package/types/src/components/OlDialogs/ViewBookmarksDialog.vue.d.ts +21 -0
  56. package/types/src/components/OlDialogs/ViewBookmarksDialog.vue.d.ts.map +1 -0
  57. package/types/src/components/OlDialogs/registry.d.ts +39 -0
  58. package/types/src/components/OlDialogs/registry.d.ts.map +1 -0
  59. package/types/src/components/OlDrawToolbar.vue.d.ts +61 -0
  60. package/types/src/components/OlDrawToolbar.vue.d.ts.map +1 -0
  61. package/types/src/components/OlLegendPanel.vue.d.ts +69 -0
  62. package/types/src/components/OlLegendPanel.vue.d.ts.map +1 -0
  63. package/types/src/components/OlMapContainer.vue.d.ts +112 -0
  64. package/types/src/components/OlMapContainer.vue.d.ts.map +1 -0
  65. package/types/src/components/OlMapPopup/ArrayPopup.vue.d.ts +47 -0
  66. package/types/src/components/OlMapPopup/ArrayPopup.vue.d.ts.map +1 -0
  67. package/types/src/components/OlMapPopup/BasePopup.vue.d.ts +63 -0
  68. package/types/src/components/OlMapPopup/BasePopup.vue.d.ts.map +1 -0
  69. package/types/src/components/OlMapPopup/HtmlPopup.vue.d.ts +45 -0
  70. package/types/src/components/OlMapPopup/HtmlPopup.vue.d.ts.map +1 -0
  71. package/types/src/components/OlMapPopup/ImagePopup.vue.d.ts +45 -0
  72. package/types/src/components/OlMapPopup/ImagePopup.vue.d.ts.map +1 -0
  73. package/types/src/components/OlMapPopup/index.d.ts +9 -0
  74. package/types/src/components/OlMapPopup/index.d.ts.map +1 -0
  75. package/types/src/components/OlMapPopup/types.d.ts +118 -0
  76. package/types/src/components/OlMapPopup/types.d.ts.map +1 -0
  77. package/types/src/components/OlMapSearch.vue.d.ts +126 -0
  78. package/types/src/components/OlMapSearch.vue.d.ts.map +1 -0
  79. package/types/src/components/OlMapTooltip.vue.d.ts +70 -0
  80. package/types/src/components/OlMapTooltip.vue.d.ts.map +1 -0
  81. package/types/src/core/EventBus.d.ts +66 -0
  82. package/types/src/core/EventBus.d.ts.map +1 -0
  83. package/types/src/core/EventManager.d.ts +147 -0
  84. package/types/src/core/EventManager.d.ts.map +1 -0
  85. package/types/src/core/FeatureHighlightManager.d.ts +103 -0
  86. package/types/src/core/FeatureHighlightManager.d.ts.map +1 -0
  87. package/types/src/core/GlobalStyleManager.d.ts +76 -0
  88. package/types/src/core/GlobalStyleManager.d.ts.map +1 -0
  89. package/types/src/core/LayerConfigManager.d.ts +66 -0
  90. package/types/src/core/LayerConfigManager.d.ts.map +1 -0
  91. package/types/src/core/LayerManager.d.ts +198 -0
  92. package/types/src/core/LayerManager.d.ts.map +1 -0
  93. package/types/src/core/LayerTreeManager.d.ts +125 -0
  94. package/types/src/core/LayerTreeManager.d.ts.map +1 -0
  95. package/types/src/core/MapManager.d.ts +203 -0
  96. package/types/src/core/MapManager.d.ts.map +1 -0
  97. package/types/src/core/MarkerDrawingAdapter.d.ts +125 -0
  98. package/types/src/core/MarkerDrawingAdapter.d.ts.map +1 -0
  99. package/types/src/core/PluginManager.d.ts +158 -0
  100. package/types/src/core/PluginManager.d.ts.map +1 -0
  101. package/types/src/core/PopupManager.d.ts +110 -0
  102. package/types/src/core/PopupManager.d.ts.map +1 -0
  103. package/types/src/core/SearchMarkerManager.d.ts +96 -0
  104. package/types/src/core/SearchMarkerManager.d.ts.map +1 -0
  105. package/types/src/core/TooltipHelper.d.ts +134 -0
  106. package/types/src/core/TooltipHelper.d.ts.map +1 -0
  107. package/types/src/core/amapSearchApi.d.ts +57 -0
  108. package/types/src/core/amapSearchApi.d.ts.map +1 -0
  109. package/types/src/core/basemapManager.d.ts +63 -0
  110. package/types/src/core/basemapManager.d.ts.map +1 -0
  111. package/types/src/core/configLoader.d.ts +159 -0
  112. package/types/src/core/configLoader.d.ts.map +1 -0
  113. package/types/src/core/drawing/BaseDrawing.d.ts +255 -0
  114. package/types/src/core/drawing/BaseDrawing.d.ts.map +1 -0
  115. package/types/src/core/drawing/DrawingManager.d.ts +394 -0
  116. package/types/src/core/drawing/DrawingManager.d.ts.map +1 -0
  117. package/types/src/core/drawing/IconDrawing.d.ts +188 -0
  118. package/types/src/core/drawing/IconDrawing.d.ts.map +1 -0
  119. package/types/src/core/drawing/ImageDrawing.d.ts +193 -0
  120. package/types/src/core/drawing/ImageDrawing.d.ts.map +1 -0
  121. package/types/src/core/drawing/LineDrawing.d.ts +193 -0
  122. package/types/src/core/drawing/LineDrawing.d.ts.map +1 -0
  123. package/types/src/core/drawing/MilitaryDrawing.d.ts +175 -0
  124. package/types/src/core/drawing/MilitaryDrawing.d.ts.map +1 -0
  125. package/types/src/core/drawing/MultiLineStringDrawing.d.ts +294 -0
  126. package/types/src/core/drawing/MultiLineStringDrawing.d.ts.map +1 -0
  127. package/types/src/core/drawing/MultiPointDrawing.d.ts +244 -0
  128. package/types/src/core/drawing/MultiPointDrawing.d.ts.map +1 -0
  129. package/types/src/core/drawing/MultiPolygonDrawing.d.ts +206 -0
  130. package/types/src/core/drawing/MultiPolygonDrawing.d.ts.map +1 -0
  131. package/types/src/core/drawing/PointDrawing.d.ts +175 -0
  132. package/types/src/core/drawing/PointDrawing.d.ts.map +1 -0
  133. package/types/src/core/drawing/PointWithTextDrawing.d.ts +183 -0
  134. package/types/src/core/drawing/PointWithTextDrawing.d.ts.map +1 -0
  135. package/types/src/core/drawing/PolygonDrawing.d.ts +240 -0
  136. package/types/src/core/drawing/PolygonDrawing.d.ts.map +1 -0
  137. package/types/src/core/drawing/TextDrawing.d.ts +164 -0
  138. package/types/src/core/drawing/TextDrawing.d.ts.map +1 -0
  139. package/types/src/core/drawing/index.d.ts +525 -0
  140. package/types/src/core/drawing/index.d.ts.map +1 -0
  141. package/types/src/core/geoJsonLocationTool.d.ts +116 -0
  142. package/types/src/core/geoJsonLocationTool.d.ts.map +1 -0
  143. package/types/src/core/layers/BaseLayer.d.ts +162 -0
  144. package/types/src/core/layers/BaseLayer.d.ts.map +1 -0
  145. package/types/src/core/layers/CanvasLayerHandler.d.ts +65 -0
  146. package/types/src/core/layers/CanvasLayerHandler.d.ts.map +1 -0
  147. package/types/src/core/layers/ClusterLayerHandler.d.ts +122 -0
  148. package/types/src/core/layers/ClusterLayerHandler.d.ts.map +1 -0
  149. package/types/src/core/layers/GMLLayerHandler.d.ts +107 -0
  150. package/types/src/core/layers/GMLLayerHandler.d.ts.map +1 -0
  151. package/types/src/core/layers/GeoJSONLayerHandler.d.ts +125 -0
  152. package/types/src/core/layers/GeoJSONLayerHandler.d.ts.map +1 -0
  153. package/types/src/core/layers/HeatmapLayerHandler.d.ts +86 -0
  154. package/types/src/core/layers/HeatmapLayerHandler.d.ts.map +1 -0
  155. package/types/src/core/layers/ImageVectorLayerHandler.d.ts +77 -0
  156. package/types/src/core/layers/ImageVectorLayerHandler.d.ts.map +1 -0
  157. package/types/src/core/layers/KMLLayerHandler.d.ts +95 -0
  158. package/types/src/core/layers/KMLLayerHandler.d.ts.map +1 -0
  159. package/types/src/core/layers/LayerFactory.d.ts +63 -0
  160. package/types/src/core/layers/LayerFactory.d.ts.map +1 -0
  161. package/types/src/core/layers/SuperMapServiceTester.d.ts +54 -0
  162. package/types/src/core/layers/SuperMapServiceTester.d.ts.map +1 -0
  163. package/types/src/core/layers/SuperMapTiledMapServiceHandler.d.ts +35 -0
  164. package/types/src/core/layers/SuperMapTiledMapServiceHandler.d.ts.map +1 -0
  165. package/types/src/core/layers/TiandituConfigHelper.d.ts +120 -0
  166. package/types/src/core/layers/TiandituConfigHelper.d.ts.map +1 -0
  167. package/types/src/core/layers/TiandituLayerHandler.d.ts +75 -0
  168. package/types/src/core/layers/TiandituLayerHandler.d.ts.map +1 -0
  169. package/types/src/core/layers/TileLayerHandler.d.ts +42 -0
  170. package/types/src/core/layers/TileLayerHandler.d.ts.map +1 -0
  171. package/types/src/core/layers/TileSuperMapRestHandler.d.ts +161 -0
  172. package/types/src/core/layers/TileSuperMapRestHandler.d.ts.map +1 -0
  173. package/types/src/core/layers/VectorTileLayerHandler.d.ts +126 -0
  174. package/types/src/core/layers/VectorTileLayerHandler.d.ts.map +1 -0
  175. package/types/src/core/layers/WFSLayerHandler.d.ts +80 -0
  176. package/types/src/core/layers/WFSLayerHandler.d.ts.map +1 -0
  177. package/types/src/core/layers/WKTLayerHandler.d.ts +123 -0
  178. package/types/src/core/layers/WKTLayerHandler.d.ts.map +1 -0
  179. package/types/src/core/layers/WMSLayerHandler.d.ts +78 -0
  180. package/types/src/core/layers/WMSLayerHandler.d.ts.map +1 -0
  181. package/types/src/core/layers/WMTSLayerHandler.d.ts +44 -0
  182. package/types/src/core/layers/WMTSLayerHandler.d.ts.map +1 -0
  183. package/types/src/core/layers/index.d.ts +20 -0
  184. package/types/src/core/layers/index.d.ts.map +1 -0
  185. package/types/src/core/layers/interfaces.d.ts +95 -0
  186. package/types/src/core/layers/interfaces.d.ts.map +1 -0
  187. package/types/src/core/mapOperationTool.d.ts +145 -0
  188. package/types/src/core/mapOperationTool.d.ts.map +1 -0
  189. package/types/src/core/measurementTool.d.ts +136 -0
  190. package/types/src/core/measurementTool.d.ts.map +1 -0
  191. package/types/src/core/overviewMapUtil.d.ts +62 -0
  192. package/types/src/core/overviewMapUtil.d.ts.map +1 -0
  193. package/types/src/core/proxyHelper.d.ts +66 -0
  194. package/types/src/core/proxyHelper.d.ts.map +1 -0
  195. package/types/src/core/storage.d.ts +139 -0
  196. package/types/src/core/storage.d.ts.map +1 -0
  197. package/types/src/core/styles/StyleFactory.d.ts +74 -0
  198. package/types/src/core/styles/StyleFactory.d.ts.map +1 -0
  199. package/types/src/core/styles/StyleManager.d.ts +77 -0
  200. package/types/src/core/styles/StyleManager.d.ts.map +1 -0
  201. package/types/src/core/styles/index.d.ts +67 -0
  202. package/types/src/core/styles/index.d.ts.map +1 -0
  203. package/types/src/core/styles/interfaces.d.ts +221 -0
  204. package/types/src/core/styles/interfaces.d.ts.map +1 -0
  205. package/types/src/core/tiandituSearchApi.d.ts +51 -0
  206. package/types/src/core/tiandituSearchApi.d.ts.map +1 -0
  207. package/types/src/data-old/testLayers.d.ts +84 -0
  208. package/types/src/data-old/testLayers.d.ts.map +1 -0
  209. package/types/src/examples-old/FilterExamples.d.ts +104 -0
  210. package/types/src/examples-old/FilterExamples.d.ts.map +1 -0
  211. package/types/src/hooks/useMap.d.ts +5 -0
  212. package/types/src/hooks/useMap.d.ts.map +1 -0
  213. package/types/src/services/searchService.d.ts +106 -0
  214. package/types/src/services/searchService.d.ts.map +1 -0
  215. package/types/src/test-old/FilterSystemTest.d.ts +57 -0
  216. package/types/src/test-old/FilterSystemTest.d.ts.map +1 -0
  217. package/types/src/types/index.d.ts +2 -11
  218. package/types/src/types/index.d.ts.map +1 -1
  219. package/types/src/types/map.d.ts +819 -0
  220. package/types/src/types/map.d.ts.map +1 -0
  221. package/types/src/types/plugin.d.ts +202 -0
  222. package/types/src/types/plugin.d.ts.map +1 -0
  223. package/types/src/utils/DiffusionAnimationHelper.d.ts +60 -0
  224. package/types/src/utils/DiffusionAnimationHelper.d.ts.map +1 -0
  225. package/types/src/utils/GifAnimationHelper.d.ts +31 -0
  226. package/types/src/utils/GifAnimationHelper.d.ts.map +1 -0
  227. package/types/src/utils/coordinateTransform.d.ts +28 -0
  228. package/types/src/utils/coordinateTransform.d.ts.map +1 -0
  229. package/types/src/utils/index.d.ts +8 -8
  230. package/types/src/utils/index.d.ts.map +1 -1
  231. package/types/src/utils/unitConverter.d.ts +36 -0
  232. package/types/src/utils/unitConverter.d.ts.map +1 -0
  233. package/types/tsconfig.tsbuildinfo +1 -1
package/lib/style.css CHANGED
@@ -683,1870 +683,1025 @@
683
683
  }
684
684
 
685
685
 
686
-
687
- /* 右侧滑入动画 */
688
- .fixed.items-stretch.justify-end .bg-white {
689
- animation: slideInRight 0.3s ease-out;
690
- }
691
- .fixed.items-stretch.justify-start .bg-white {
692
- animation: slideInLeft 0.3s ease-out;
686
+ .map-toolbar[data-v-65f64ab9] {
687
+ position: absolute;
688
+ top: 10px;
689
+ right: 20px;
690
+ height: 32px;
693
691
  }
694
- .fixed.items-start.justify-center .bg-white {
695
- animation: slideInTop 0.3s ease-out;
692
+ [data-v-65f64ab9].el-menu--horizontal {
693
+ height: 100% !important;
694
+ }.map-search-container {
695
+ position: absolute;
696
+ z-index: 99;
697
+ min-width: 300px;
698
+ max-width: 400px;
696
699
  }
697
- .fixed.items-end.justify-center .bg-white {
698
- animation: slideInBottom 0.3s ease-out;
700
+
701
+ /* 位置样式 */
702
+ .position-top-left {
703
+ top: 10px;
704
+ left: 10px;
699
705
  }
700
- @keyframes slideInRight {
701
- from {
702
- transform: translateX(100%);
706
+ .position-top-right {
707
+ top: 10px;
708
+ right: 10px;
703
709
  }
704
- to {
705
- transform: translateX(0);
710
+ .position-bottom-left {
711
+ bottom: 10px;
712
+ left: 10px;
706
713
  }
714
+ .position-bottom-right {
715
+ bottom: 10px;
716
+ right: 10px;
707
717
  }
708
- @keyframes slideInLeft {
709
- from {
710
- transform: translateX(-100%);
718
+ .search-input-wrapper {
719
+ position: relative;
711
720
  }
712
- to {
713
- transform: translateX(0);
721
+ .search-input {
722
+ width: 100%;
714
723
  }
724
+ .search-input :deep(.el-input__inner) {
725
+ transition: all 0.3s ease;
715
726
  }
716
- @keyframes slideInTop {
717
- from {
718
- transform: translateY(-100%);
727
+ .search-active .search-input :deep(.el-input__inner) {
728
+ border-color: #409eff;
729
+ box-shadow: 0 2px 12px rgba(64, 158, 255, 0.2);
719
730
  }
720
- to {
721
- transform: translateY(0);
731
+ .search-icon {
732
+ color: #909399;
722
733
  }
734
+ .loading-icon {
735
+ color: #409eff;
736
+ animation: rotate 1s linear infinite;
723
737
  }
724
- @keyframes slideInBottom {
738
+ @keyframes rotate {
725
739
  from {
726
- transform: translateY(100%);
740
+ transform: rotate(0deg);
727
741
  }
728
742
  to {
729
- transform: translateY(0);
730
- }
731
- }
732
-
733
- /* 调整右侧对话框的样式 */
734
- .fixed.items-stretch.justify-end .bg-white,
735
- .fixed.items-stretch.justify-start .bg-white {
736
- max-width: none;
737
- max-height: none;
738
- border-radius: 0;
739
- height: 100vh;
743
+ transform: rotate(360deg);
740
744
  }
741
-
742
- /* 调整上下对话框的样式 */
743
- .fixed.items-start.justify-center .bg-white,
744
- .fixed.items-end.justify-center .bg-white {
745
- max-height: none;
746
- width: 100vw;
747
- border-radius: 0;
748
745
  }
749
-
750
- /* 调整大小控制点样式 */
751
- .resize-n {
752
- top: -3px;
746
+ .search-results {
747
+ position: absolute;
748
+ top: 100%;
753
749
  left: 0;
754
750
  right: 0;
755
- height: 6px;
756
- cursor: n-resize;
757
- }
758
- .resize-ne {
759
- top: -3px;
760
- right: -3px;
761
- width: 6px;
762
- height: 6px;
763
- cursor: ne-resize;
751
+ background: white;
752
+ border: 1px solid #e4e7ed;
753
+ border-radius: 6px;
754
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
755
+ max-height: 400px;
756
+ overflow-y: auto;
757
+ z-index: 10000;
758
+ margin-top: 4px;
764
759
  }
765
- .resize-e {
766
- top: 0;
767
- right: -3px;
768
- bottom: 0;
769
- width: 6px;
770
- cursor: e-resize;
760
+ .search-section {
761
+ padding: 8px 0;
771
762
  }
772
- .resize-se {
773
- bottom: -3px;
774
- right: -3px;
775
- width: 6px;
776
- height: 6px;
777
- cursor: se-resize;
763
+ .search-section:not(:last-child) {
764
+ border-bottom: 1px solid #f0f0f0;
778
765
  }
779
- .resize-s {
780
- bottom: -3px;
781
- left: 0;
782
- right: 0;
783
- height: 6px;
784
- cursor: s-resize;
766
+ .section-title {
767
+ display: flex;
768
+ justify-content: space-between;
769
+ align-items: center;
770
+ padding: 8px 16px;
771
+ font-size: 12px;
772
+ color: #909399;
773
+ font-weight: 500;
785
774
  }
786
- .resize-sw {
787
- bottom: -3px;
788
- left: -3px;
789
- width: 6px;
790
- height: 6px;
791
- cursor: sw-resize;
775
+ .result-count {
776
+ color: #c0c4cc;
792
777
  }
793
- .resize-w {
794
- top: 0;
795
- left: -3px;
796
- bottom: 0;
797
- width: 6px;
798
- cursor: w-resize;
778
+ .search-item {
779
+ display: flex;
780
+ align-items: center;
781
+ padding: 12px 16px;
782
+ cursor: pointer;
783
+ transition: background-color 0.2s ease;
799
784
  }
800
- .resize-nw {
801
- top: -3px;
802
- left: -3px;
803
- width: 6px;
804
- height: 6px;
805
- cursor: nw-resize;
785
+ .search-item:hover,
786
+ .search-item.active {
787
+ background-color: #f5f7fa;
806
788
  }
807
-
808
- /* 底图对话框样式 */
809
- .basemap-dialog {
810
- /* CustomDialog 会处理右侧滑入动画 */
789
+ .item-icon {
790
+ margin-right: 12px;
791
+ color: #909399;
792
+ font-size: 16px;
793
+ flex-shrink: 0;
811
794
  }
812
-
813
- /* 底图内容容器 */
814
- .basemap-content {
815
- padding: 16px;
816
- height: 100%;
817
- overflow: visible;
795
+ .history-item .item-icon {
796
+ color: #c0c4cc;
818
797
  }
819
-
820
- /* 底图网格布局 */
821
- .basemap-grid {
822
- display: grid;
823
- grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
824
- gap: 16px;
825
- padding: 8px 0;
798
+ .result-item .item-icon {
799
+ color: #409eff;
826
800
  }
827
-
828
- /* 底图项目 */
829
- .basemap-item {
830
- display: flex;
831
- flex-direction: column;
832
- align-items: center;
833
- padding: 12px;
834
- border: 2px solid transparent;
835
- border-radius: 12px;
836
- cursor: pointer;
837
- transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);
838
- background: linear-gradient(135deg, rgba(255, 255, 255, 0.8) 0%, rgba(248, 250, 252, 0.9) 100%);
839
- backdrop-filter: blur(10px);
840
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
801
+ .item-content {
802
+ flex: 1;
803
+ min-width: 0;
841
804
  }
842
- .basemap-item:hover {
843
- transform: translateY(-2px) scale(1.02);
844
- border-color: rgba(59, 130, 246, 0.3);
845
- box-shadow: 0 8px 25px rgba(59, 130, 246, 0.15), 0 4px 12px rgba(0, 0, 0, 0.1);
846
- background: linear-gradient(135deg, rgba(255, 255, 255, 0.95) 0%, rgba(248, 250, 252, 1) 100%);
805
+ .item-name {
806
+ font-size: 14px;
807
+ color: #303133;
808
+ margin-bottom: 4px;
809
+ white-space: nowrap;
810
+ overflow: hidden;
811
+ text-overflow: ellipsis;
847
812
  }
848
- .basemap-item.active {
849
- border-color: #3b82f6;
850
- background: linear-gradient(135deg, rgba(59, 130, 246, 0.1) 0%, rgba(147, 197, 253, 0.15) 100%);
851
- box-shadow: 0 8px 25px rgba(59, 130, 246, 0.2), 0 4px 12px rgba(0, 0, 0, 0.1);
813
+ .item-name :deep(mark) {
814
+ background-color: #fff2cc;
815
+ color: #e6a23c;
816
+ padding: 0 2px;
817
+ border-radius: 2px;
852
818
  }
853
-
854
- /* 底图预览图片 */
855
- .basemap-preview {
856
- width: 100px;
857
- height: 75px;
858
- border-radius: 8px;
819
+ .item-address {
820
+ font-size: 12px;
821
+ color: #909399;
822
+ white-space: nowrap;
859
823
  overflow: hidden;
860
- margin-bottom: 8px;
861
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
862
- transition: all 0.3s ease;
824
+ text-overflow: ellipsis;
863
825
  }
864
- .basemap-item:hover .basemap-preview {
865
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
866
- transform: scale(1.05);
826
+ .item-address :deep(mark) {
827
+ background-color: #fff2cc;
828
+ color: #e6a23c;
829
+ padding: 0 2px;
830
+ border-radius: 2px;
867
831
  }
868
- .basemap-preview img {
869
- width: 100%;
870
- height: 100%;
871
- object-fit: cover;
872
- transition: all 0.3s ease;
873
- image-rendering: -webkit-optimize-contrast;
874
- image-rendering: crisp-edges;
832
+ .item-type {
833
+ font-size: 11px;
834
+ color: #c0c4cc;
835
+ margin-top: 2px;
875
836
  }
876
-
877
- /* 底图名称 */
878
- .basemap-name {
837
+ .item-confidence {
879
838
  font-size: 12px;
880
- font-weight: 500;
881
- color: #374151;
882
- text-align: center;
883
- line-height: 1.4;
884
- transition: all 0.3s ease;
885
- }
886
- .basemap-item:hover .basemap-name {
887
- color: #1f2937;
888
- font-weight: 600;
839
+ color: #67c23a;
840
+ margin-left: 8px;
841
+ flex-shrink: 0;
889
842
  }
890
- .basemap-item.active .basemap-name {
891
- color: #3b82f6;
892
- font-weight: 600;
843
+ .no-results {
844
+ display: flex;
845
+ align-items: center;
846
+ justify-content: center;
847
+ padding: 24px 16px;
848
+ color: #909399;
849
+ font-size: 14px;
893
850
  }
894
-
895
- /* 底图网格 */
896
- .basemap-grid {
897
- display: grid;
898
- grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
899
- gap: 16px;
851
+ .no-results .el-icon {
852
+ margin-right: 8px;
853
+ font-size: 16px;
900
854
  }
901
855
 
902
- /* 底图项 */
903
- .basemap-item {
904
- cursor: pointer;
905
- border-radius: 12px;
906
- overflow: hidden;
907
- transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);
908
- border: 2px solid rgba(0, 0, 0, 0.08);
909
- background: rgba(255, 255, 255, 0.8);
910
- backdrop-filter: blur(10px);
911
- position: relative;
912
- }
913
- .basemap-item::before {
914
- content: '';
915
- position: absolute;
916
- top: 0;
917
- left: 0;
918
- right: 0;
919
- bottom: 0;
920
- background: linear-gradient(135deg, rgba(59, 130, 246, 0.1) 0%, rgba(147, 51, 234, 0.1) 100%);
921
- opacity: 0;
922
- transition: opacity 0.3s ease;
923
- z-index: 1;
856
+ /* 响应式设计 */
857
+ @media (max-width: 768px) {
858
+ .map-search-container {
859
+ min-width: 280px;
860
+ max-width: calc(100vw - 20px);
924
861
  }
925
- .basemap-item:hover {
926
- transform: translateY(-4px) scale(1.02);
927
- border-color: rgba(59, 130, 246, 0.3);
928
- box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15);
862
+ .position-top-left,
863
+ .position-top-right {
864
+ top: 5px;
929
865
  }
930
- .basemap-item:hover::before {
931
- opacity: 1;
866
+ .position-top-left,
867
+ .position-bottom-left {
868
+ left: 5px;
932
869
  }
933
- .basemap-item.active {
934
- border-color: #3b82f6;
935
- box-shadow: 0 8px 25px rgba(59, 130, 246, 0.25);
936
- transform: translateY(-2px);
870
+ .position-top-right,
871
+ .position-bottom-right {
872
+ right: 5px;
937
873
  }
938
- .basemap-item.active::before {
939
- opacity: 0.7;
874
+ .position-bottom-left,
875
+ .position-bottom-right {
876
+ bottom: 5px;
940
877
  }
941
-
942
- /* 底图预览 */
943
- .basemap-preview {
944
- width: 100%;
945
- height: 80px;
946
- background: linear-gradient(135deg, #f3f4f6 0%, #e5e7eb 100%);
878
+ }.control-group[data-v-e2bbe659] {
947
879
  display: flex;
948
880
  align-items: center;
949
- justify-content: center;
950
- overflow: hidden;
951
- position: relative;
952
- z-index: 2;
953
- }
954
- .basemap-preview img {
955
- width: 100%;
956
- height: 100%;
957
- object-fit: cover;
958
- transition: transform 0.3s ease;
881
+ gap: 6px;
882
+ /* re-enable interactions inside the controls container */
883
+ pointer-events: auto;
959
884
  }
960
- .basemap-item:hover .basemap-preview img {
961
- transform: scale(1.1);
885
+
886
+ /* when direction becomes column, keep spacing vertical */
887
+ .control-group.flex-col[data-v-e2bbe659] {
888
+ flex-direction: column;
889
+ align-items: stretch;
890
+ gap: 6px;
962
891
  }
963
892
 
964
- /* 底图名称 */
965
- .basemap-name {
966
- padding: 12px 16px;
967
- text-align: center;
968
- font-size: 13px;
969
- font-weight: 500;
970
- color: #374151;
971
- background: rgba(255, 255, 255, 0.9);
972
- backdrop-filter: blur(5px);
973
- position: relative;
974
- z-index: 2;
975
- letter-spacing: 0.3px;
893
+ /* ensure buttons themselves are interactive */
894
+ .control-btn[data-v-e2bbe659] {
895
+ pointer-events: auto;
976
896
  }
977
- .basemap-item.active .basemap-name {
978
- color: #1f2937;
979
- font-weight: 600;
897
+
898
+ /* reset Element Plus button default adjacent margin and use our gap instead */
899
+ [data-v-e2bbe659] .el-button + .el-button {
900
+ margin-left: 0 !important;
980
901
  }
981
902
 
982
- /* 响应式设计 */
983
- @media (max-width: 480px) {
984
- .basemap-panel {
985
- width: 100%;
903
+ /* make sure all EP interactive widgets are clickable */
904
+ [data-v-e2bbe659] .el-button,[data-v-e2bbe659] .el-slider,[data-v-e2bbe659] .el-icon {
905
+ pointer-events: auto;
986
906
  }
987
- .basemap-grid {
988
- grid-template-columns: 1fr;
907
+ .absolute {
908
+ position: absolute;
989
909
  }
990
- .panel-content {
991
- padding: 16px;
910
+ .bottom-40px {
911
+ bottom: 40px;
912
+ }
913
+
914
+ /* 图例面板样式 */
915
+ .legend-collapsed {
916
+ transform: translateX(calc(100% - 40px));
992
917
  }
918
+ .legend-collapsed:hover {
919
+ transform: translateX(0);
920
+ }
921
+
922
+ /* 图例项样式 */
923
+ .legend-item {
924
+ @apply mb-2 last:mb-0;
993
925
  }
994
-
995
- /* 动画关键帧 */
996
- @keyframes slideInRight {
997
- from {
998
- transform: translateX(100%);
999
- opacity: 0;
926
+ .legend-title {
927
+ @apply text-sm font-medium text-gray-700 mb-2;
1000
928
  }
1001
- to {
1002
- transform: translateX(0);
1003
- opacity: 1;
929
+ .legend-content {
930
+ @apply space-y-1;
1004
931
  }
932
+ .legend-symbol {
933
+ @apply inline-block mr-2 align-middle;
1005
934
  }
1006
- @keyframes slideOutRight {
1007
- from {
1008
- transform: translateX(0);
1009
- opacity: 1;
935
+ .legend-label {
936
+ @apply text-xs text-gray-600 align-middle;
937
+ }
938
+
939
+ /* 渐变图例样式 */
940
+ .gradient-legend {
941
+ @apply h-4 rounded mb-1;
1010
942
  }
1011
- to {
1012
- transform: translateX(100%);
1013
- opacity: 0;
943
+ .gradient-labels {
944
+ @apply flex justify-between text-xs text-gray-500;
945
+ }
946
+
947
+ /* 分类图例样式 */
948
+ .category-legend {
949
+ @apply flex items-center mb-1;
1014
950
  }
951
+ .category-symbol {
952
+ @apply w-4 h-4 mr-2 rounded-sm;
953
+ }
954
+
955
+ /* 符号图例样式 */
956
+ .symbol-legend {
957
+ @apply flex items-center mb-1;
1015
958
  }
1016
- /* 让样式穿透到 CustomDialog 内部容器(其上有我们传入的 class="measurement-dialog") */
1017
- [data-v-d868b567] .measurement-dialog {
1018
- background-color: transparent !important; /* 覆盖 CustomDialog 根容器的 bg-white */
1019
- box-shadow: none !important;
959
+ .symbol-item {
960
+ @apply w-4 h-4 mr-2;
961
+ }
962
+
963
+ /* 面板头部样式 */
964
+ .legend-header {
965
+ @apply flex items-center justify-between p-3 border-b border-gray-200;
1020
966
  }
1021
-
1022
- /* CustomDialog 自带的标题栏不再是灰底 */
1023
- [data-v-d868b567] .measurement-dialog .bg-gray-50 {
1024
- background-color: transparent !important;
1025
- border-bottom-color: transparent !important;
967
+ .legend-body {
968
+ @apply p-3 max-h-96 overflow-y-auto;
969
+ }
970
+
971
+ /* 折叠按钮样式 */
972
+ .collapse-btn {
973
+ @apply p-1 rounded hover:bg-gray-100 transition-colors;
1026
974
  }
975
+ .close-btn {
976
+ @apply p-1 rounded hover:bg-gray-100 transition-colors text-gray-500 hover:text-gray-700;
977
+ }
1027
978
 
1028
- /* 保留以下原有样式 */
1029
- .measurement-dialog[data-v-d868b567] {
1030
- --el-dialog-bg-color: transparent;
1031
- --el-dialog-title-font-size: 16px;
1032
- --el-dialog-box-shadow: none;
979
+ .filter-panel {
980
+ .config-section {
981
+ margin-bottom: 16px;
982
+ h5 {
983
+ margin: 0 0 12px 0;
984
+ font-size: 13px;
985
+ font-weight: 500;
986
+ color: #666;
1033
987
  }
1034
- .measurement-content[data-v-d868b567] {
1035
- background: transparent;
1036
- border-radius: 12px;
1037
- overflow: hidden;
988
+ .config-item {
989
+ display: flex;
990
+ align-items: center;
991
+ margin-bottom: 12px;
992
+ gap: 8px;
993
+ label {
994
+ flex: 0 0 60px;
995
+ font-size: 12px;
996
+ color: #666;
1038
997
  }
1039
- .measurement-header[data-v-d868b567] {
1040
- background: transparent;
1041
- backdrop-filter: blur(10px);
1042
- border-bottom: 1px solid rgba(226, 232, 240, 0);
998
+ .el-slider {
999
+ flex: 1;
1000
+ margin: 0 8px;
1043
1001
  }
1044
- .measurement-result[data-v-d868b567] {
1045
- background: rgba(255, 255, 255, 0.9);
1046
- backdrop-filter: blur(10px);
1047
- border-bottom: 1px solid rgba(226, 232, 240, 0.8);
1048
- display: flex;
1049
- align-items: center;
1050
- justify-content: center;
1002
+ .value-text {
1003
+ flex: 0 0 45px;
1004
+ font-size: 12px;
1005
+ color: #999;
1006
+ text-align: right;
1051
1007
  }
1052
- .result-value[data-v-d868b567] {
1053
- font-size: 42px;
1054
- font-weight: 600;
1055
- color: #3b82f6;
1056
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
1057
- line-height: 1;
1058
- text-shadow: 0 2px 4px rgba(59, 130, 246, 0.1);
1059
1008
  }
1060
- .tool-grid[data-v-d868b567] {
1061
- display: grid;
1062
- grid-template-columns: repeat(4, 1fr);
1063
- column-gap: 18px;
1064
- row-gap: 12px;
1065
- justify-items: center;
1066
- align-items: start;
1009
+ .preset-buttons {
1010
+ display: flex;
1011
+ gap: 8px;
1012
+ flex-wrap: wrap;
1013
+ .el-button {
1014
+ flex: 1;
1015
+ min-width: 60px;
1067
1016
  }
1068
- .tool-item[data-v-d868b567] {
1069
- position: relative;
1070
- display: flex;
1071
- flex-direction: column;
1072
- align-items: center;
1073
- cursor: pointer;
1074
- user-select: none;
1075
- transition: transform 0.2s ease;
1076
1017
  }
1077
- .tool-icon[data-v-d868b567] {
1078
- width: 28px;
1079
- height: 28px;
1080
- padding: 14px; /* 28 + 14*2 = 56px 的方块 */
1081
- border-radius: 10px;
1082
- background: linear-gradient(180deg, #f2f4f8 0%, #e9eef5 100%);
1083
- border: 1px solid #e6ebf2;
1084
- box-shadow: 0 2px 6px rgba(0, 0, 0, 0.06);
1085
- transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
1086
- margin-bottom: 10px;
1087
1018
  }
1088
- .tool-item:hover .tool-icon[data-v-d868b567],
1089
- .tool-item.active .tool-icon[data-v-d868b567] {
1090
- transform: translateY(-2px);
1091
- box-shadow: 0 6px 16px rgba(0, 0, 0, 0.12);
1092
- border-color: #c8d4e6;
1093
1019
  }
1094
- .tool-label[data-v-d868b567] {
1095
- font-size: 14px;
1096
- line-height: 1.2;
1097
- color: #334155; /* 不改变整体背景,仅优化文字可读性 */
1098
- font-weight: 500;
1099
- white-space: nowrap;
1020
+
1021
+ .style-config-panel {
1022
+ padding: 0;
1023
+ .panel-title {
1024
+ margin: 0 0 16px 0;
1025
+ font-size: 14px;
1026
+ font-weight: 600;
1027
+ color: #333;
1028
+ border-bottom: 1px solid #eee;
1029
+ padding-bottom: 8px;
1100
1030
  }
1101
- .dialog-footer[data-v-d868b567] {
1102
- @apply hidden;
1031
+ .config-section {
1032
+ margin-bottom: 16px;
1033
+ h5 {
1034
+ margin: 0 0 12px 0;
1035
+ font-size: 13px;
1036
+ font-weight: 500;
1037
+ color: #666;
1103
1038
  }
1104
- .coordinate-dialog {
1105
- --el-dialog-bg-color: #1a1a1a;
1039
+ .config-item {
1040
+ display: flex;
1041
+ align-items: center;
1042
+ margin-bottom: 12px;
1043
+ gap: 8px;
1044
+ label {
1045
+ flex: 0 0 60px;
1046
+ font-size: 12px;
1047
+ color: #666;
1106
1048
  }
1107
- .coordinate-content {
1108
- padding: 10px 0;
1049
+ .el-slider {
1050
+ flex: 1;
1051
+ margin: 0 8px;
1109
1052
  }
1110
- .format-selection {
1111
- margin-bottom: 20px;
1112
- padding: 15px;
1113
- background: #f8f9fa;
1114
- border-radius: 6px;
1115
- border: 1px solid #e9ecef;
1053
+ .el-select {
1054
+ flex: 1;
1116
1055
  }
1117
- .format-title {
1118
- font-weight: 500;
1119
- margin-bottom: 10px;
1120
- color: #495057;
1056
+ .value-text {
1057
+ flex: 0 0 45px;
1058
+ font-size: 12px;
1059
+ color: #999;
1060
+ text-align: right;
1121
1061
  }
1122
- .format-options {
1123
- display: flex;
1124
- gap: 20px;
1125
1062
  }
1126
- .format-options :deep(.el-radio) {
1127
- margin-right: 0;
1128
1063
  }
1129
- .coordinate-input {
1130
- margin-bottom: 20px;
1064
+ .panel-actions {
1065
+ padding-top: 12px;
1066
+ border-top: 1px solid #eee;
1067
+ text-align: center;
1131
1068
  }
1132
- .dialog-footer {
1133
- text-align: right;
1134
1069
  }
1135
- .dialog-footer .el-button {
1136
- margin-left: 10px;
1137
- }
1138
1070
 
1139
- .region-dialog {
1140
- .region-content {
1141
- max-height: 500px;
1142
- overflow-y: auto;
1071
+ .tree-node-content {
1072
+ display: flex;
1073
+ align-items: center;
1074
+ width: 100%;
1075
+ padding: 4px 0;
1143
1076
  }
1144
- :deep(.el-tabs__header) {
1145
- margin: 0 0 20px 0;
1077
+ .group-node {
1078
+ display: flex;
1079
+ align-items: center;
1080
+ font-weight: 500;
1081
+ color: #333;
1146
1082
  }
1147
- :deep(.el-tabs__nav-wrap) {
1148
- padding: 0 20px;
1083
+ .layer-item {
1084
+ display: flex;
1085
+ align-items: center;
1086
+ justify-content: space-between;
1087
+ width: 100%;
1088
+ padding: 2px 0;
1089
+ .layer-info {
1090
+ display: flex;
1091
+ align-items: center;
1092
+ flex: 1;
1093
+ min-width: 0;
1094
+ .layer-icon {
1095
+ margin-right: 8px;
1096
+ font-size: 14px;
1149
1097
  }
1150
- :deep(.el-tabs__item) {
1151
- font-size: 16px;
1152
- font-weight: 500;
1153
- color: #606266;
1154
- &.is-active {
1155
- color: #409eff;
1156
- font-weight: 600;
1098
+ .layer-name {
1099
+ font-size: 13px;
1100
+ color: #333;
1101
+ white-space: nowrap;
1102
+ overflow: hidden;
1103
+ text-overflow: ellipsis;
1157
1104
  }
1158
1105
  }
1159
- :deep(.el-tabs__active-bar) {
1160
- background-color: #409eff;
1106
+ .layer-controls {
1107
+ display: flex;
1108
+ align-items: center;
1109
+ gap: 8px;
1110
+ flex-shrink: 0;
1111
+ .opacity-control {
1112
+ display: flex;
1113
+ align-items: center;
1114
+ gap: 4px;
1115
+ .opacity-slider {
1116
+ width: 60px;
1161
1117
  }
1162
- .region-categories {
1163
- .region-group {
1164
- margin-bottom: 20px;
1165
- .group-title {
1166
- font-size: 14px;
1167
- font-weight: 600;
1168
- color: #606266;
1169
- margin-bottom: 10px;
1170
- padding-left: 8px;
1171
- border-left: 3px solid #409eff;
1118
+ .opacity-value {
1119
+ font-size: 11px;
1120
+ color: #999;
1121
+ min-width: 30px;
1122
+ text-align: right;
1172
1123
  }
1173
- .region-items {
1174
- display: flex;
1175
- flex-wrap: wrap;
1176
- gap: 8px;
1177
- .region-btn {
1178
- margin: 0;
1179
- padding: 8px 16px;
1180
- border: 1px solid #dcdfe6;
1181
- border-radius: 4px;
1182
- background: #fff;
1183
- color: #606266;
1184
- transition: all 0.3s;
1185
- &:hover {
1186
- color: #409eff;
1187
- border-color: #409eff;
1188
- background: #ecf5ff;
1189
1124
  }
1125
+ .style-config-btn {
1126
+ width: 24px;
1127
+ height: 24px;
1128
+ padding: 0;
1129
+ margin-left: 4px;
1190
1130
  }
1191
1131
  }
1192
1132
  }
1133
+ .resize-handle{-webkit-user-select:none;user-select:none}.custom-dialog-actions{display:flex;align-items:center}.custom-dialog-header{display:flex;justify-content:space-between;align-items:center;width:100%}.custom-dialog-actions .custom-header-btn{position:static;margin-left:10px;font-size:16px;width:20px;height:20px;line-height:1;border:none;background:transparent;cursor:pointer;padding:0;color:var(--el-color-info)}.custom-dialog-actions .custom-header-btn:hover{color:var(--el-color-primary)}.custom-dialog-actions .custom-header-btn svg{width:100%;height:100%;vertical-align:middle}.e-plus-resize-dialog{display:flex;flex-direction:column;max-height:85vh;overflow:hidden;margin-bottom:0}.e-plus-resize-dialog.is-fullscreen{max-height:100vh;height:100vh!important;margin:0!important}.e-plus-resize-dialog .el-dialog__header,.e-plus-resize-dialog .el-dialog__footer{flex-shrink:0}.e-plus-resize-dialog .el-dialog__body{flex:1;overflow:auto;min-height:0}
1134
+
1135
+ .layer-dialog {
1136
+ /* 全局样式面板样式 */
1137
+ .global-style-panel {
1138
+ padding: 16px;
1139
+ border-bottom: 1px solid #eee;
1140
+ background-color: #f8f9fa;
1141
+ .panel-title {
1142
+ margin: 0 0 16px 0;
1143
+ font-size: 14px;
1144
+ font-weight: 600;
1145
+ color: #333;
1146
+ border-bottom: 1px solid #ddd;
1147
+ padding-bottom: 8px;
1193
1148
  }
1194
- .beijing-districts {
1195
- .district-grid {
1196
- display: grid;
1197
- grid-template-columns: repeat(5, 1fr);
1198
- gap: 12px;
1199
- padding: 10px;
1200
- .district-btn {
1201
- padding: 12px 8px;
1202
- border: 1px solid #dcdfe6;
1203
- border-radius: 6px;
1204
- background: #fff;
1205
- color: #606266;
1206
- font-size: 14px;
1207
- text-align: center;
1208
- transition: all 0.3s;
1209
- cursor: pointer;
1210
- min-height: 44px;
1149
+ .config-section {
1150
+ margin-bottom: 16px;
1151
+ h5 {
1152
+ margin: 0 0 12px 0;
1153
+ font-size: 13px;
1154
+ font-weight: 500;
1155
+ color: #666;
1156
+ }
1157
+ .config-item {
1211
1158
  display: flex;
1212
1159
  align-items: center;
1213
- justify-content: center;
1214
- &:hover {
1215
- color: #409eff;
1216
- border-color: #409eff;
1217
- background: #ecf5ff;
1218
- transform: translateY(-2px);
1219
- box-shadow: 0 4px 8px rgba(64, 158, 255, 0.2);
1220
- }
1221
- &.active {
1222
- color: #fff;
1223
- background: #409eff;
1224
- border-color: #409eff;
1225
- box-shadow: 0 4px 8px rgba(64, 158, 255, 0.3);
1160
+ margin-bottom: 12px;
1161
+ gap: 8px;
1162
+ label {
1163
+ flex: 0 0 60px;
1164
+ font-size: 12px;
1165
+ color: #666;
1226
1166
  }
1167
+ .el-slider {
1168
+ flex: 1;
1169
+ margin: 0 8px;
1227
1170
  }
1171
+ .value-text {
1172
+ flex: 0 0 45px;
1173
+ font-size: 12px;
1174
+ color: #999;
1175
+ text-align: right;
1228
1176
  }
1229
1177
  }
1178
+ .preset-buttons {
1179
+ display: flex;
1180
+ gap: 6px;
1181
+ flex-wrap: wrap;
1182
+ .el-button {
1183
+ flex: 1;
1184
+ min-width: 60px;
1230
1185
  }
1231
- @media (max-width: 768px) {
1232
- .region-dialog {
1233
- .beijing-districts {
1234
- .district-grid {
1235
- grid-template-columns: repeat(3, 1fr);
1236
- gap: 8px;
1237
1186
  }
1238
1187
  }
1188
+ .panel-actions {
1189
+ margin-top: 16px;
1190
+ padding-top: 12px;
1191
+ border-top: 1px solid #ddd;
1192
+ text-align: center;
1239
1193
  }
1194
+ .custom-css-input {
1195
+ font-family: "Courier New", monospace;
1196
+ font-size: 12px;
1197
+ line-height: 1.4;
1240
1198
  }
1241
- @media (max-width: 480px) {
1242
- .region-dialog {
1243
- .beijing-districts {
1244
- .district-grid {
1245
- grid-template-columns: repeat(2, 1fr);
1199
+ .custom-css-input :deep(.el-textarea__inner) {
1200
+ font-family: "Courier New", monospace;
1201
+ font-size: 12px;
1202
+ line-height: 1.4;
1203
+ background-color: #fff;
1204
+ border: 1px solid #e9ecef;
1246
1205
  }
1206
+ .style-tabs {
1207
+ :deep(.el-tabs__header) {
1208
+ margin: 0 0 16px 0;
1247
1209
  }
1210
+ :deep(.el-tabs__nav-wrap) {
1211
+ padding: 0;
1248
1212
  }
1249
- }
1250
-
1251
- .markers-dialog {
1252
- --el-dialog-bg-color: #1a1a1a;
1213
+ :deep(.el-tabs__item) {
1214
+ font-size: 12px;
1215
+ padding: 0 16px;
1216
+ height: 32px;
1217
+ line-height: 32px;
1253
1218
  }
1254
- .markers-content {
1255
- padding: 10px 0;
1219
+ :deep(.el-tabs__content) {
1220
+ padding: 0;
1256
1221
  }
1257
- .toolbar {
1258
- margin-bottom: 15px;
1259
- display: flex;
1260
- gap: 10px;
1261
1222
  }
1262
- .toolbar .adding-marker {
1263
- background-color: #f56c6c !important;
1264
- border-color: #f56c6c !important;
1265
- animation: pulse 1.5s infinite;
1223
+ .current-style-display {
1224
+ margin-top: 16px;
1225
+ padding: 12px;
1226
+ background-color: #f5f5f5;
1227
+ border-radius: 4px;
1228
+ border: 1px solid #e9ecef;
1229
+ h6 {
1230
+ margin: 0 0 8px 0;
1231
+ font-size: 12px;
1232
+ font-weight: 500;
1233
+ color: #666;
1266
1234
  }
1267
- @keyframes pulse {
1268
- 0% {
1269
- box-shadow: 0 0 0 0 rgba(245, 108, 108, 0.7);
1235
+ .style-preview {
1236
+ font-family: "Courier New", monospace;
1237
+ font-size: 11px;
1238
+ line-height: 1.4;
1239
+ color: #333;
1240
+ background-color: #fff;
1241
+ padding: 8px;
1242
+ border-radius: 3px;
1243
+ border: 1px solid #ddd;
1244
+ word-break: break-all;
1245
+ white-space: pre-wrap;
1246
+ max-height: 120px;
1247
+ overflow-y: auto;
1270
1248
  }
1271
- 70% {
1272
- box-shadow: 0 0 0 10px rgba(245, 108, 108, 0);
1273
1249
  }
1274
- 100% {
1275
- box-shadow: 0 0 0 0 rgba(245, 108, 108, 0);
1276
- }
1277
- }
1278
- .search-filter {
1279
- margin-bottom: 15px;
1280
- display: flex;
1281
- align-items: center;
1282
- }
1283
- .markers-list {
1284
- margin-bottom: 20px;
1285
- }
1286
- .markers-table {
1287
- --el-table-bg-color: transparent;
1288
- --el-table-tr-bg-color: transparent;
1289
- --el-table-header-bg-color: rgba(255, 255, 255, 0.05);
1290
- }
1291
- .marker-name {
1292
- display: flex;
1293
- align-items: center;
1294
- gap: 5px;
1295
- }
1296
- .delete-btn {
1297
- color: #f56c6c;
1298
- }
1299
- .delete-btn:hover {
1300
- color: #f78989;
1250
+ }
1251
+
1252
+ /* 主标签页样式 */
1253
+ .main-tabs {
1254
+ height: 100%;
1255
+ display: flex;
1256
+ flex-direction: column;
1301
1257
  }
1302
- .statistics {
1303
- padding: 15px;
1304
- background: rgba(64, 158, 255, 0.05);
1305
- border-radius: 6px;
1306
- border: 1px solid rgba(64, 158, 255, 0.2);
1258
+ .main-tabs .el-tabs__content {
1259
+ flex: 1;
1260
+ overflow: hidden;
1261
+ padding: 0;
1307
1262
  }
1308
- .dialog-footer {
1309
- text-align: right;
1310
- }
1311
-
1312
- .bookmarks-dialog {
1313
- --el-dialog-bg-color: #1a1a1a;
1263
+ .main-tabs .el-tab-pane {
1264
+ height: 100%;
1265
+ overflow: auto;
1266
+ display: flex;
1267
+ flex-direction: column;
1314
1268
  }
1315
- .bookmarks-content {
1316
- padding: 10px 0;
1269
+ .layer-tree {
1270
+ .tree-node-content {
1271
+ width: 100%;
1272
+ .group-node {
1273
+ display: flex;
1274
+ align-items: center;
1275
+ padding: 8px 0;
1317
1276
  }
1318
- .toolbar {
1319
- margin-bottom: 15px;
1320
- display: flex;
1321
- gap: 10px;
1277
+ .layer-item {
1278
+ display: flex;
1279
+ align-items: center;
1280
+ justify-content: space-between;
1281
+ width: 100%;
1282
+ padding: 6px 0;
1283
+ .layer-info {
1284
+ display: flex;
1285
+ align-items: center;
1286
+ flex: 1;
1287
+ min-width: 0;
1288
+ .layer-icon {
1289
+ margin-right: 8px;
1290
+ flex-shrink: 0;
1322
1291
  }
1323
- .search-filter {
1324
- margin-bottom: 15px;
1325
- display: flex;
1326
- align-items: center;
1292
+ .layer-name {
1293
+ font-size: 14px;
1294
+ color: #333;
1295
+ white-space: nowrap;
1296
+ overflow: hidden;
1297
+ text-overflow: ellipsis;
1327
1298
  }
1328
- .bookmarks-grid {
1329
- display: grid;
1330
- grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
1331
- gap: 15px;
1332
- margin-bottom: 20px;
1333
- max-height: 400px;
1334
- overflow-y: auto;
1335
1299
  }
1336
- .bookmark-card {
1337
- border: 1px solid #303133;
1338
- border-radius: 8px;
1339
- overflow: hidden;
1340
- background: rgba(255, 255, 255, 0.02);
1341
- transition: all 0.3s ease;
1342
- cursor: pointer;
1300
+ .layer-controls {
1301
+ display: flex;
1302
+ align-items: center;
1303
+ gap: 8px;
1304
+ .opacity-control {
1305
+ display: flex;
1306
+ align-items: center;
1307
+ gap: 8px;
1308
+ min-width: 120px;
1309
+ .opacity-slider {
1310
+ flex: 1;
1311
+ min-width: 80px;
1343
1312
  }
1344
- .bookmark-card:hover {
1345
- border-color: #409eff;
1346
- box-shadow: 0 4px 12px rgba(64, 158, 255, 0.2);
1347
- transform: translateY(-2px);
1313
+ .opacity-value {
1314
+ font-size: 12px;
1315
+ color: #666;
1316
+ min-width: 35px;
1317
+ text-align: right;
1318
+ white-space: nowrap;
1348
1319
  }
1349
- .bookmark-thumbnail {
1350
- position: relative;
1351
- height: 120px;
1352
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
1353
- display: flex;
1354
- align-items: center;
1355
- justify-content: center;
1356
1320
  }
1357
- .thumbnail-placeholder {
1358
- opacity: 0.6;
1321
+ .style-config-btn {
1322
+ width: 24px;
1323
+ height: 24px;
1324
+ padding: 0;
1325
+ margin-left: 4px;
1359
1326
  }
1360
- .bookmark-overlay {
1361
- position: absolute;
1362
- top: 0;
1363
- left: 0;
1364
- right: 0;
1365
- bottom: 0;
1366
- background: rgba(0, 0, 0, 0.7);
1367
- display: flex;
1368
- align-items: center;
1369
- justify-content: center;
1370
- opacity: 0;
1371
- transition: opacity 0.3s ease;
1372
1327
  }
1373
- .bookmark-card:hover .bookmark-overlay {
1374
- opacity: 1;
1375
1328
  }
1376
- .bookmark-info {
1377
- padding: 12px;
1378
1329
  }
1379
- .bookmark-title {
1380
- font-size: 16px;
1381
- font-weight: bold;
1382
- color: #e4e7ed;
1383
- margin-bottom: 8px;
1384
- white-space: nowrap;
1385
- overflow: hidden;
1386
- text-overflow: ellipsis;
1387
1330
  }
1388
- .bookmark-meta {
1389
- display: flex;
1390
- justify-content: space-between;
1391
- align-items: center;
1392
- margin-bottom: 8px;
1331
+ }
1332
+
1333
+ /* 样式配置面板样式 */
1334
+ :deep(.layer-style-popover) {
1335
+ .style-config-panel {
1336
+ padding: 0;
1337
+ .panel-title {
1338
+ margin: 0 0 16px 0;
1339
+ font-size: 14px;
1340
+ font-weight: 600;
1341
+ color: #333;
1342
+ border-bottom: 1px solid #eee;
1343
+ padding-bottom: 8px;
1393
1344
  }
1394
- .use-count {
1395
- font-size: 12px;
1396
- color: #909399;
1345
+ .config-section {
1346
+ margin-bottom: 16px;
1347
+ h5 {
1348
+ margin: 0 0 12px 0;
1349
+ font-size: 13px;
1350
+ font-weight: 500;
1351
+ color: #666;
1397
1352
  }
1398
- .bookmark-description {
1399
- font-size: 12px;
1400
- color: #c0c4cc;
1401
- margin-bottom: 8px;
1402
- line-height: 1.4;
1403
- display: -webkit-box;
1404
- -webkit-line-clamp: 2;
1405
- -webkit-box-orient: vertical;
1406
- overflow: hidden;
1353
+ .config-item {
1354
+ display: flex;
1355
+ align-items: center;
1356
+ margin-bottom: 12px;
1357
+ gap: 8px;
1358
+ label {
1359
+ flex: 0 0 60px;
1360
+ font-size: 12px;
1361
+ color: #666;
1407
1362
  }
1408
- .bookmark-details {
1409
- display: flex;
1410
- flex-direction: column;
1411
- gap: 4px;
1412
- margin-bottom: 8px;
1363
+ .el-slider {
1364
+ flex: 1;
1365
+ margin: 0 8px;
1413
1366
  }
1414
- .detail-item {
1415
- display: flex;
1416
- align-items: center;
1417
- gap: 4px;
1418
- font-size: 11px;
1419
- color: #909399;
1367
+ .value-text {
1368
+ flex: 0 0 45px;
1369
+ font-size: 12px;
1370
+ color: #999;
1371
+ text-align: right;
1420
1372
  }
1421
- .bookmark-time {
1422
- font-size: 11px;
1423
- color: #606266;
1424
- text-align: right;
1425
1373
  }
1426
- .delete-btn {
1427
- color: #f56c6c;
1374
+ .preset-buttons {
1375
+ display: flex;
1376
+ gap: 6px;
1377
+ flex-wrap: wrap;
1378
+ .el-button {
1379
+ flex: 1;
1380
+ min-width: 60px;
1428
1381
  }
1429
- .delete-btn:hover {
1430
- color: #f78989;
1431
1382
  }
1432
- .empty-state {
1433
- text-align: center;
1434
- padding: 40px 0;
1435
1383
  }
1436
- .statistics {
1437
- padding: 15px;
1438
- background: rgba(64, 158, 255, 0.05);
1439
- border-radius: 6px;
1440
- border: 1px solid rgba(64, 158, 255, 0.2);
1384
+ .panel-actions {
1385
+ margin-top: 16px;
1386
+ padding-top: 12px;
1387
+ border-top: 1px solid #eee;
1388
+ text-align: center;
1441
1389
  }
1442
- .dialog-footer {
1443
- text-align: right;
1444
- }
1445
-
1446
- /* 自定义滚动条 */
1447
- .bookmarks-grid::-webkit-scrollbar {
1448
- width: 6px;
1390
+ .custom-css-input {
1391
+ font-family: "Courier New", monospace;
1392
+ font-size: 12px;
1393
+ line-height: 1.4;
1449
1394
  }
1450
- .bookmarks-grid::-webkit-scrollbar-track {
1451
- background: #2c2c2c;
1452
- border-radius: 3px;
1395
+ .custom-css-input :deep(.el-textarea__inner) {
1396
+ font-family: "Courier New", monospace;
1397
+ font-size: 12px;
1398
+ line-height: 1.4;
1399
+ background-color: #f8f9fa;
1400
+ border: 1px solid #e9ecef;
1453
1401
  }
1454
- .bookmarks-grid::-webkit-scrollbar-thumb {
1455
- background: #409eff;
1456
- border-radius: 3px;
1457
1402
  }
1458
- .bookmarks-grid::-webkit-scrollbar-thumb:hover {
1459
- background: #66b1ff;
1460
1403
  }
1461
1404
 
1462
- /* 地图预览容器样式 */
1463
- .map-preview-container > div {
1464
- width: 100% !important;
1465
- height: 100% !important;
1405
+ .ol-base-layer-switcher[data-v-6a7660a8] {
1406
+ position: absolute;
1407
+ bottom: 20px;
1408
+ right: 20px;
1409
+ z-index: 100;
1410
+ height: 70px; /* 60px + 5px padding * 2 */
1411
+ background: #fff;
1412
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
1413
+ border-radius: 4px;
1414
+ padding: 5px;
1415
+ box-sizing: border-box;
1416
+ transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1);
1417
+ overflow: hidden;
1418
+ /* 即使内容还没出来,也要从右边开始长出来 */
1419
+ display: flex;
1420
+ justify-content: flex-end;
1466
1421
  }
1467
1422
 
1468
- /* 预览页面缩放变换 */
1469
- .preview-page {
1470
- transform-origin: top center;
1423
+ /* 列表面板 */
1424
+ .layer-panel[data-v-6a7660a8] {
1425
+ display: flex;
1426
+ gap: 10px;
1427
+ height: 100%;
1428
+ /* 绝对定位以防止宽度变化时的挤压,或者使用flex布局 */
1429
+ min-width: max-content;
1471
1430
  }
1472
1431
 
1473
- /* 确保地图容器有明确的尺寸 */
1474
- #map-preview-container {
1475
- width: 100% !important;
1476
- height: 400px !important;
1477
- min-height: 400px !important;
1478
- position: relative !important;
1432
+ /* 收起状态的触发器 */
1433
+ .layer-trigger[data-v-6a7660a8] {
1434
+ position: absolute;
1435
+ right: 5px;
1436
+ top: 5px;
1437
+ width: 86px;
1438
+ height: 60px;
1439
+ pointer-events: none; /* 让鼠标事件穿透到底下的 panel */
1440
+ transition: opacity 0.2s;
1441
+ z-index: 10;
1442
+ background: #fff; /* 遮挡下面的列表 */
1479
1443
  }
1480
-
1481
- /* OpenLayers地图容器样式 */
1482
- #map-preview-container .ol-viewport {
1483
- width: 100% !important;
1484
- height: 100% !important;
1444
+ .layer-trigger.is-hidden[data-v-6a7660a8] {
1445
+ opacity: 0;
1446
+ pointer-events: none;
1485
1447
  }
1486
1448
 
1487
- /* 确保Canvas元素正确显示 */
1488
- #map-preview-container canvas {
1489
- width: 100% !important;
1490
- height: 100% !important;
1449
+ /* 通用图层项样式 */
1450
+ .layer-item[data-v-6a7660a8], .current-layer-box[data-v-6a7660a8] {
1451
+ width: 86px;
1452
+ height: 60px;
1453
+ border-radius: 2px;
1454
+ background-size: cover;
1455
+ background-position: center;
1456
+ position: relative;
1457
+ box-sizing: border-box;
1458
+ border: 1px solid #e4e7ed;
1459
+ cursor: pointer;
1460
+ transition: all 0.2s;
1461
+ overflow: hidden;
1491
1462
  }
1492
- .mark-tab-container[data-v-fdf095a0] {
1493
- display: flex;
1494
- flex-direction: column;
1495
- height: 100%;
1496
- padding: 12px;
1497
- }
1498
- .type-select[data-v-fdf095a0] {
1499
- width: 100%;
1500
- margin-bottom: 12px;
1501
- }
1502
- .continuous-switch[data-v-fdf095a0] {
1503
- display: flex;
1504
- align-items: center;
1505
- justify-content: space-between;
1506
- margin-bottom: 12px;
1507
- padding: 8px;
1508
- background-color: #f9fafb;
1509
- border-radius: 6px;
1510
- }
1511
- .switch-label[data-v-fdf095a0] {
1512
- font-size: 14px;
1513
- color: #374151;
1514
- }
1515
- .tools-grid[data-v-fdf095a0] {
1516
- display: grid;
1517
- grid-template-columns: repeat(3, 1fr);
1518
- gap: 16px;
1519
- flex: 1;
1520
- overflow: auto;
1463
+ .layer-item[data-v-6a7660a8]:hover {
1464
+ border-color: #409eff;
1465
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12);
1521
1466
  }
1522
- .tool-item[data-v-fdf095a0] {
1523
- display: flex;
1524
- flex-direction: column;
1525
- align-items: center;
1526
- justify-content: center;
1527
- padding: 8px;
1528
- border: 1px solid #e5e7eb;
1529
- border-radius: 8px;
1530
- cursor: pointer;
1531
- transition: all 0.3s ease;
1467
+ .layer-item.active[data-v-6a7660a8] {
1468
+ border: 2px solid #409eff;
1532
1469
  }
1533
- .tool-item[data-v-fdf095a0]:hover {
1534
- background-color: #f3f4f6;
1535
- border-color: #60a5fa;
1470
+
1471
+ /* 选中状态的蓝色边框和对勾 */
1472
+ .active-border[data-v-6a7660a8] {
1473
+ position: absolute;
1474
+ top: 0;
1475
+ left: 0;
1476
+ width: 100%;
1477
+ height: 100%;
1478
+ border: 2px solid #409eff;
1479
+ box-sizing: border-box;
1480
+ border-radius: 2px;
1481
+ pointer-events: none;
1536
1482
  }
1537
- .tool-image[data-v-fdf095a0] {
1538
- width: 24px;
1539
- height: 24px;
1540
- margin-bottom: 4px;
1483
+ .check-icon[data-v-6a7660a8] {
1484
+ position: absolute;
1485
+ bottom: 0;
1486
+ right: 0;
1487
+ width: 0;
1488
+ height: 0;
1489
+ border-bottom: 24px solid #409eff;
1490
+ border-left: 24px solid transparent;
1541
1491
  }
1542
- .tool-icon-large[data-v-fdf095a0] {
1543
- font-size: 24px;
1544
- margin-bottom: 4px;
1492
+ .check-icon svg[data-v-6a7660a8] {
1493
+ position: absolute;
1494
+ right: -1px;
1495
+ bottom: -13px;
1496
+ transform: scale(0.7);
1545
1497
  }
1546
- .tool-label[data-v-fdf095a0] {
1498
+
1499
+ /* 图层名称标签 */
1500
+ .layer-name[data-v-6a7660a8] {
1501
+ position: absolute;
1502
+ bottom: 0;
1503
+ left: 0;
1504
+ width: 100%;
1505
+ background: rgba(0, 0, 0, 0.6);
1506
+ color: #fff;
1547
1507
  font-size: 12px;
1548
- color: #6b7280;
1508
+ padding: 2px 4px;
1549
1509
  text-align: center;
1510
+ white-space: nowrap;
1511
+ overflow: hidden;
1512
+ text-overflow: ellipsis;
1513
+ box-sizing: border-box;
1550
1514
  }
1551
- .tool-item:hover .tool-label[data-v-fdf095a0] {
1552
- color: #3b82f6;
1515
+ .layer-item:hover .layer-name[data-v-6a7660a8] {
1516
+ background: rgba(0, 0, 0, 0.7);
1553
1517
  }
1554
- .stop-drawing-section[data-v-fdf095a0] {
1555
- margin-top: 12px;
1556
- padding-top: 12px;
1557
- border-top: 1px solid #e5e7eb;
1518
+
1519
+ /* 地图预览容器样式 */
1520
+ .map-preview-container > div {
1521
+ width: 100% !important;
1522
+ height: 100% !important;
1523
+ }
1524
+
1525
+ /* 预览页面缩放变换 */
1526
+ .preview-page {
1527
+ transform-origin: top center;
1528
+ }
1529
+
1530
+ /* 确保地图容器有明确的尺寸 */
1531
+ #map-preview-container {
1532
+ width: 100% !important;
1533
+ height: 400px !important;
1534
+ min-height: 400px !important;
1535
+ position: relative !important;
1536
+ }
1537
+
1538
+ /* OpenLayers地图容器样式 */
1539
+ #map-preview-container .ol-viewport {
1540
+ width: 100% !important;
1541
+ height: 100% !important;
1542
+ }
1543
+
1544
+ /* 确保Canvas元素正确显示 */
1545
+ #map-preview-container canvas {
1546
+ width: 100% !important;
1547
+ height: 100% !important;
1548
+ }
1549
+
1550
+ .context-menu {
1551
+ background: white;
1552
+ border: 1px solid #dcdfe6;
1553
+ border-radius: 4px;
1554
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
1555
+ padding: 4px 0;
1556
+ min-width: 120px;
1558
1557
  }
1559
- .stop-drawing-section {
1560
- margin-top: 20px;
1561
- padding-top: 16px;
1562
- border-top: 1px solid #e4e7ed;
1563
- text-align: center;
1558
+ .context-menu-item {
1559
+ display: flex;
1560
+ align-items: center;
1561
+ padding: 8px 12px;
1562
+ cursor: pointer;
1563
+ font-size: 14px;
1564
+ color: #606266;
1565
+ transition: background-color 0.3s;
1564
1566
  }
1565
- .stop-drawing-section .el-button {
1566
- width: 100%;
1567
- font-weight: 500;
1567
+ .context-menu-item:hover {
1568
+ background-color: #f5f7fa;
1568
1569
  }
1569
- .list-tab-container[data-v-1cc008ea] {
1570
- display: flex;
1571
- flex-direction: column;
1572
- height: 100%;
1573
- font-size: 14px;
1570
+ .context-menu-item .el-icon {
1571
+ margin-right: 8px;
1572
+ font-size: 16px;
1573
+ }
1574
+
1575
+ /* 右侧滑入动画 */
1576
+ .fixed.items-stretch.justify-end .bg-white {
1577
+ animation: slideInRight 0.3s ease-out;
1574
1578
  }
1575
- .toolbar[data-v-1cc008ea] {
1576
- display: flex;
1577
- align-items: center;
1578
- justify-content: space-between;
1579
- padding: 4px 8px;
1580
- border-bottom: 1px solid #d1d5db;
1579
+ .fixed.items-stretch.justify-start .bg-white {
1580
+ animation: slideInLeft 0.3s ease-out;
1581
1581
  }
1582
- .toolbar-left[data-v-1cc008ea] {
1583
- display: flex;
1584
- align-items: center;
1585
- gap: 8px;
1582
+ .fixed.items-start.justify-center .bg-white {
1583
+ animation: slideInTop 0.3s ease-out;
1586
1584
  }
1587
- .toolbar-title[data-v-1cc008ea] {
1588
- font-weight: 500;
1585
+ .fixed.items-end.justify-center .bg-white {
1586
+ animation: slideInBottom 0.3s ease-out;
1589
1587
  }
1590
- .toolbar-icon[data-v-1cc008ea] {
1591
- font-size: 16px;
1588
+ @keyframes slideInRight {
1589
+ from {
1590
+ transform: translateX(100%);
1592
1591
  }
1593
- .data-count[data-v-1cc008ea] {
1594
- color: #6b7280;
1592
+ to {
1593
+ transform: translateX(0);
1595
1594
  }
1596
- .list-content[data-v-1cc008ea] {
1597
- flex: 1;
1598
- overflow: auto;
1599
- padding: 4px;
1600
1595
  }
1601
- .tree-component[data-v-1cc008ea] {
1602
- font-size: 14px;
1596
+ @keyframes slideInLeft {
1597
+ from {
1598
+ transform: translateX(-100%);
1603
1599
  }
1604
- .tree-node[data-v-1cc008ea] {
1605
- display: flex;
1606
- align-items: center;
1607
- gap: 8px;
1600
+ to {
1601
+ transform: translateX(0);
1608
1602
  }
1609
- .node-icon[data-v-1cc008ea] {
1610
- font-size: 16px;
1611
1603
  }
1612
- .empty-state[data-v-1cc008ea] {
1613
- height: 100%;
1614
- display: flex;
1615
- align-items: center;
1616
- justify-content: center;
1617
- color: #9ca3af;
1618
- }.dialog-content[data-v-d7434b96] {
1619
- display: flex;
1620
- flex-direction: column;
1621
- height: 100%;
1604
+ @keyframes slideInTop {
1605
+ from {
1606
+ transform: translateY(-100%);
1622
1607
  }
1623
- .toolbar[data-v-d7434b96] {
1624
- display: flex;
1625
- align-items: center;
1626
- justify-content: space-between;
1627
- padding: 12px;
1628
- border-bottom: 1px solid #e5e7eb;
1629
- background-color: #f9fafb;
1608
+ to {
1609
+ transform: translateY(0);
1630
1610
  }
1631
- .toolbar-left[data-v-d7434b96] {
1632
- display: flex;
1633
- align-items: center;
1634
- gap: 20px;
1635
1611
  }
1636
- .toolbar-right[data-v-d7434b96] {
1637
- display: flex;
1638
- align-items: center;
1639
- gap: 20px;
1612
+ @keyframes slideInBottom {
1613
+ from {
1614
+ transform: translateY(100%);
1640
1615
  }
1641
- .tool-icon[data-v-d7434b96] {
1642
- font-size: 20px;
1643
- cursor: pointer;
1644
- color: #6b7280;
1645
- transition: color 0.3s ease;
1616
+ to {
1617
+ transform: translateY(0);
1646
1618
  }
1647
- .tool-icon[data-v-d7434b96]:hover {
1648
- color: var(--el-color-primary, #409eff);
1649
1619
  }
1650
- .content-area[data-v-d7434b96] {
1651
- flex: 1;
1652
- overflow: hidden;
1620
+
1621
+ /* 调整右侧对话框的样式 */
1622
+ .fixed.items-stretch.justify-end .bg-white,
1623
+ .fixed.items-stretch.justify-start .bg-white {
1624
+ max-width: none;
1625
+ max-height: none;
1626
+ border-radius: 0;
1627
+ height: 100vh;
1653
1628
  }
1654
- .tabs-container[data-v-d7434b96] {
1655
- height: 100%;
1629
+
1630
+ /* 调整上下对话框的样式 */
1631
+ .fixed.items-start.justify-center .bg-white,
1632
+ .fixed.items-end.justify-center .bg-white {
1633
+ max-height: none;
1634
+ width: 100vw;
1635
+ border-radius: 0;
1656
1636
  }
1657
- .map-drawing-dialog[data-v-d7434b96] .el-tabs {
1658
- height: 100%;
1659
- display: flex;
1660
- flex-direction: column;
1637
+
1638
+ /* 调整大小控制点样式 */
1639
+ .resize-n {
1640
+ top: -3px;
1641
+ left: 0;
1642
+ right: 0;
1643
+ height: 6px;
1644
+ cursor: n-resize;
1661
1645
  }
1662
- .map-drawing-dialog[data-v-d7434b96] .el-tabs__content {
1663
- flex: 1;
1664
- overflow: auto;
1665
- padding: 12px;
1646
+ .resize-ne {
1647
+ top: -3px;
1648
+ right: -3px;
1649
+ width: 6px;
1650
+ height: 6px;
1651
+ cursor: ne-resize;
1666
1652
  }
1667
- .map-drawing-dialog[data-v-d7434b96] .el-tabs__nav-wrap {
1668
- padding: 0 10px;
1669
- }
1670
- .map-drawing-dialog[data-v-d7434b96] .el-tabs__item {
1671
- font-size: 14px;
1672
- font-weight: 500;
1673
- padding: 0 20px;
1674
- height: 40px;
1675
- line-height: 40px;
1676
- transition: all 0.3s;
1677
- }
1678
- .map-drawing-dialog[data-v-d7434b96] .el-tabs__item.is-active {
1679
- color: var(--el-color-primary);
1680
- font-weight: 600;
1681
- }
1682
- .map-drawing-dialog[data-v-d7434b96] .el-tabs__item:hover {
1683
- color: var(--el-color-primary);
1684
- }.map-toolbar[data-v-f8ee8458] {
1685
- position: absolute;
1686
- top: 10px;
1687
- right: 20px;
1688
- height: 32px;
1689
- }
1690
- [data-v-f8ee8458].el-menu--horizontal {
1691
- height: 100% !important;
1692
- }.map-search-container {
1693
- position: absolute;
1694
- z-index: 99;
1695
- min-width: 300px;
1696
- max-width: 400px;
1697
- }
1698
-
1699
- /* 位置样式 */
1700
- .position-top-left {
1701
- top: 10px;
1702
- left: 10px;
1703
- }
1704
- .position-top-right {
1705
- top: 10px;
1706
- right: 10px;
1707
- }
1708
- .position-bottom-left {
1709
- bottom: 10px;
1710
- left: 10px;
1711
- }
1712
- .position-bottom-right {
1713
- bottom: 10px;
1714
- right: 10px;
1715
- }
1716
- .search-input-wrapper {
1717
- position: relative;
1718
- }
1719
- .search-input {
1720
- width: 100%;
1721
- }
1722
- .search-input :deep(.el-input__inner) {
1723
- transition: all 0.3s ease;
1724
- }
1725
- .search-active .search-input :deep(.el-input__inner) {
1726
- border-color: #409eff;
1727
- box-shadow: 0 2px 12px rgba(64, 158, 255, 0.2);
1728
- }
1729
- .search-icon {
1730
- color: #909399;
1731
- }
1732
- .loading-icon {
1733
- color: #409eff;
1734
- animation: rotate 1s linear infinite;
1735
- }
1736
- @keyframes rotate {
1737
- from {
1738
- transform: rotate(0deg);
1739
- }
1740
- to {
1741
- transform: rotate(360deg);
1653
+ .resize-e {
1654
+ top: 0;
1655
+ right: -3px;
1656
+ bottom: 0;
1657
+ width: 6px;
1658
+ cursor: e-resize;
1742
1659
  }
1660
+ .resize-se {
1661
+ bottom: -3px;
1662
+ right: -3px;
1663
+ width: 6px;
1664
+ height: 6px;
1665
+ cursor: se-resize;
1743
1666
  }
1744
- .search-results {
1745
- position: absolute;
1746
- top: 100%;
1667
+ .resize-s {
1668
+ bottom: -3px;
1747
1669
  left: 0;
1748
1670
  right: 0;
1749
- background: white;
1750
- border: 1px solid #e4e7ed;
1751
- border-radius: 6px;
1752
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
1753
- max-height: 400px;
1754
- overflow-y: auto;
1755
- z-index: 10000;
1756
- margin-top: 4px;
1757
- }
1758
- .search-section {
1759
- padding: 8px 0;
1760
- }
1761
- .search-section:not(:last-child) {
1762
- border-bottom: 1px solid #f0f0f0;
1763
- }
1764
- .section-title {
1765
- display: flex;
1766
- justify-content: space-between;
1767
- align-items: center;
1768
- padding: 8px 16px;
1769
- font-size: 12px;
1770
- color: #909399;
1771
- font-weight: 500;
1772
- }
1773
- .result-count {
1774
- color: #c0c4cc;
1775
- }
1776
- .search-item {
1777
- display: flex;
1778
- align-items: center;
1779
- padding: 12px 16px;
1780
- cursor: pointer;
1781
- transition: background-color 0.2s ease;
1782
- }
1783
- .search-item:hover,
1784
- .search-item.active {
1785
- background-color: #f5f7fa;
1786
- }
1787
- .item-icon {
1788
- margin-right: 12px;
1789
- color: #909399;
1790
- font-size: 16px;
1791
- flex-shrink: 0;
1792
- }
1793
- .history-item .item-icon {
1794
- color: #c0c4cc;
1795
- }
1796
- .result-item .item-icon {
1797
- color: #409eff;
1798
- }
1799
- .item-content {
1800
- flex: 1;
1801
- min-width: 0;
1802
- }
1803
- .item-name {
1804
- font-size: 14px;
1805
- color: #303133;
1806
- margin-bottom: 4px;
1807
- white-space: nowrap;
1808
- overflow: hidden;
1809
- text-overflow: ellipsis;
1810
- }
1811
- .item-name :deep(mark) {
1812
- background-color: #fff2cc;
1813
- color: #e6a23c;
1814
- padding: 0 2px;
1815
- border-radius: 2px;
1816
- }
1817
- .item-address {
1818
- font-size: 12px;
1819
- color: #909399;
1820
- white-space: nowrap;
1821
- overflow: hidden;
1822
- text-overflow: ellipsis;
1823
- }
1824
- .item-address :deep(mark) {
1825
- background-color: #fff2cc;
1826
- color: #e6a23c;
1827
- padding: 0 2px;
1828
- border-radius: 2px;
1829
- }
1830
- .item-type {
1831
- font-size: 11px;
1832
- color: #c0c4cc;
1833
- margin-top: 2px;
1834
- }
1835
- .item-confidence {
1836
- font-size: 12px;
1837
- color: #67c23a;
1838
- margin-left: 8px;
1839
- flex-shrink: 0;
1840
- }
1841
- .no-results {
1842
- display: flex;
1843
- align-items: center;
1844
- justify-content: center;
1845
- padding: 24px 16px;
1846
- color: #909399;
1847
- font-size: 14px;
1848
- }
1849
- .no-results .el-icon {
1850
- margin-right: 8px;
1851
- font-size: 16px;
1852
- }
1853
-
1854
- /* 响应式设计 */
1855
- @media (max-width: 768px) {
1856
- .map-search-container {
1857
- min-width: 280px;
1858
- max-width: calc(100vw - 20px);
1859
- }
1860
- .position-top-left,
1861
- .position-top-right {
1862
- top: 5px;
1863
- }
1864
- .position-top-left,
1865
- .position-bottom-left {
1866
- left: 5px;
1867
- }
1868
- .position-top-right,
1869
- .position-bottom-right {
1870
- right: 5px;
1871
- }
1872
- .position-bottom-left,
1873
- .position-bottom-right {
1874
- bottom: 5px;
1671
+ height: 6px;
1672
+ cursor: s-resize;
1875
1673
  }
1876
- }.control-group[data-v-d2ffe2db] {
1877
- display: flex;
1878
- align-items: center;
1879
- gap: 6px;
1880
- /* re-enable interactions inside the controls container */
1881
- pointer-events: auto;
1674
+ .resize-sw {
1675
+ bottom: -3px;
1676
+ left: -3px;
1677
+ width: 6px;
1678
+ height: 6px;
1679
+ cursor: sw-resize;
1882
1680
  }
1883
-
1884
- /* when direction becomes column, keep spacing vertical */
1885
- .control-group.flex-col[data-v-d2ffe2db] {
1886
- flex-direction: column;
1887
- align-items: stretch;
1888
- gap: 6px;
1681
+ .resize-w {
1682
+ top: 0;
1683
+ left: -3px;
1684
+ bottom: 0;
1685
+ width: 6px;
1686
+ cursor: w-resize;
1889
1687
  }
1890
-
1891
- /* ensure buttons themselves are interactive */
1892
- .control-btn[data-v-d2ffe2db] {
1893
- pointer-events: auto;
1688
+ .resize-nw {
1689
+ top: -3px;
1690
+ left: -3px;
1691
+ width: 6px;
1692
+ height: 6px;
1693
+ cursor: nw-resize;
1894
1694
  }
1695
+ /*
1696
+ * 基础样式文件
1697
+ * 替换UnoCSS的基础样式类
1698
+ */
1895
1699
 
1896
- /* reset Element Plus button default adjacent margin and use our gap instead */
1897
- [data-v-d2ffe2db] .el-button + .el-button {
1898
- margin-left: 0 !important;
1899
- }
1900
-
1901
- /* make sure all EP interactive widgets are clickable */
1902
- [data-v-d2ffe2db] .el-button,[data-v-d2ffe2db] .el-slider,[data-v-d2ffe2db] .el-icon {
1903
- pointer-events: auto;
1904
- }
1905
- .absolute {
1906
- position: absolute;
1907
- }
1908
- .bottom-40px {
1909
- bottom: 40px;
1910
- }
1911
-
1912
- /* 图例面板样式 */
1913
- .legend-collapsed {
1914
- transform: translateX(calc(100% - 40px));
1915
- }
1916
- .legend-collapsed:hover {
1917
- transform: translateX(0);
1918
- }
1919
-
1920
- /* 图例项样式 */
1921
- .legend-item {
1922
- @apply mb-2 last:mb-0;
1923
- }
1924
- .legend-title {
1925
- @apply text-sm font-medium text-gray-700 mb-2;
1926
- }
1927
- .legend-content {
1928
- @apply space-y-1;
1929
- }
1930
- .legend-symbol {
1931
- @apply inline-block mr-2 align-middle;
1932
- }
1933
- .legend-label {
1934
- @apply text-xs text-gray-600 align-middle;
1935
- }
1936
-
1937
- /* 渐变图例样式 */
1938
- .gradient-legend {
1939
- @apply h-4 rounded mb-1;
1940
- }
1941
- .gradient-labels {
1942
- @apply flex justify-between text-xs text-gray-500;
1943
- }
1944
-
1945
- /* 分类图例样式 */
1946
- .category-legend {
1947
- @apply flex items-center mb-1;
1948
- }
1949
- .category-symbol {
1950
- @apply w-4 h-4 mr-2 rounded-sm;
1951
- }
1952
-
1953
- /* 符号图例样式 */
1954
- .symbol-legend {
1955
- @apply flex items-center mb-1;
1956
- }
1957
- .symbol-item {
1958
- @apply w-4 h-4 mr-2;
1959
- }
1960
-
1961
- /* 面板头部样式 */
1962
- .legend-header {
1963
- @apply flex items-center justify-between p-3 border-b border-gray-200;
1964
- }
1965
- .legend-body {
1966
- @apply p-3 max-h-96 overflow-y-auto;
1967
- }
1968
-
1969
- /* 折叠按钮样式 */
1970
- .collapse-btn {
1971
- @apply p-1 rounded hover:bg-gray-100 transition-colors;
1972
- }
1973
- .close-btn {
1974
- @apply p-1 rounded hover:bg-gray-100 transition-colors text-gray-500 hover:text-gray-700;
1975
- }
1976
-
1977
- .filter-panel {
1978
- .config-section {
1979
- margin-bottom: 16px;
1980
- h5 {
1981
- margin: 0 0 12px 0;
1982
- font-size: 13px;
1983
- font-weight: 500;
1984
- color: #666;
1985
- }
1986
- .config-item {
1987
- display: flex;
1988
- align-items: center;
1989
- margin-bottom: 12px;
1990
- gap: 8px;
1991
- label {
1992
- flex: 0 0 60px;
1993
- font-size: 12px;
1994
- color: #666;
1995
- }
1996
- .el-slider {
1997
- flex: 1;
1998
- margin: 0 8px;
1999
- }
2000
- .value-text {
2001
- flex: 0 0 45px;
2002
- font-size: 12px;
2003
- color: #999;
2004
- text-align: right;
2005
- }
2006
- }
2007
- .preset-buttons {
2008
- display: flex;
2009
- gap: 8px;
2010
- flex-wrap: wrap;
2011
- .el-button {
2012
- flex: 1;
2013
- min-width: 60px;
2014
- }
2015
- }
2016
- }
2017
- }
2018
-
2019
- .style-config-panel {
2020
- padding: 0;
2021
- .panel-title {
2022
- margin: 0 0 16px 0;
2023
- font-size: 14px;
2024
- font-weight: 600;
2025
- color: #333;
2026
- border-bottom: 1px solid #eee;
2027
- padding-bottom: 8px;
2028
- }
2029
- .config-section {
2030
- margin-bottom: 16px;
2031
- h5 {
2032
- margin: 0 0 12px 0;
2033
- font-size: 13px;
2034
- font-weight: 500;
2035
- color: #666;
2036
- }
2037
- .config-item {
2038
- display: flex;
2039
- align-items: center;
2040
- margin-bottom: 12px;
2041
- gap: 8px;
2042
- label {
2043
- flex: 0 0 60px;
2044
- font-size: 12px;
2045
- color: #666;
2046
- }
2047
- .el-slider {
2048
- flex: 1;
2049
- margin: 0 8px;
2050
- }
2051
- .el-select {
2052
- flex: 1;
2053
- }
2054
- .value-text {
2055
- flex: 0 0 45px;
2056
- font-size: 12px;
2057
- color: #999;
2058
- text-align: right;
2059
- }
2060
- }
2061
- }
2062
- .panel-actions {
2063
- padding-top: 12px;
2064
- border-top: 1px solid #eee;
2065
- text-align: center;
2066
- }
2067
- }
2068
-
2069
- .tree-node-content {
2070
- display: flex;
2071
- align-items: center;
2072
- width: 100%;
2073
- padding: 4px 0;
2074
- }
2075
- .group-node {
2076
- display: flex;
2077
- align-items: center;
2078
- font-weight: 500;
2079
- color: #333;
2080
- }
2081
- .layer-item {
2082
- display: flex;
2083
- align-items: center;
2084
- justify-content: space-between;
2085
- width: 100%;
2086
- padding: 2px 0;
2087
- .layer-info {
2088
- display: flex;
2089
- align-items: center;
2090
- flex: 1;
2091
- min-width: 0;
2092
- .layer-icon {
2093
- margin-right: 8px;
2094
- font-size: 14px;
2095
- }
2096
- .layer-name {
2097
- font-size: 13px;
2098
- color: #333;
2099
- white-space: nowrap;
2100
- overflow: hidden;
2101
- text-overflow: ellipsis;
2102
- }
2103
- }
2104
- .layer-controls {
2105
- display: flex;
2106
- align-items: center;
2107
- gap: 8px;
2108
- flex-shrink: 0;
2109
- .opacity-control {
2110
- display: flex;
2111
- align-items: center;
2112
- gap: 4px;
2113
- .opacity-slider {
2114
- width: 60px;
2115
- }
2116
- .opacity-value {
2117
- font-size: 11px;
2118
- color: #999;
2119
- min-width: 30px;
2120
- text-align: right;
2121
- }
2122
- }
2123
- .style-config-btn {
2124
- width: 24px;
2125
- height: 24px;
2126
- padding: 0;
2127
- margin-left: 4px;
2128
- }
2129
- }
2130
- }
2131
-
2132
- .layer-dialog {
2133
- /* 全局样式面板样式 */
2134
- .global-style-panel {
2135
- padding: 16px;
2136
- border-bottom: 1px solid #eee;
2137
- background-color: #f8f9fa;
2138
- .panel-title {
2139
- margin: 0 0 16px 0;
2140
- font-size: 14px;
2141
- font-weight: 600;
2142
- color: #333;
2143
- border-bottom: 1px solid #ddd;
2144
- padding-bottom: 8px;
2145
- }
2146
- .config-section {
2147
- margin-bottom: 16px;
2148
- h5 {
2149
- margin: 0 0 12px 0;
2150
- font-size: 13px;
2151
- font-weight: 500;
2152
- color: #666;
2153
- }
2154
- .config-item {
2155
- display: flex;
2156
- align-items: center;
2157
- margin-bottom: 12px;
2158
- gap: 8px;
2159
- label {
2160
- flex: 0 0 60px;
2161
- font-size: 12px;
2162
- color: #666;
2163
- }
2164
- .el-slider {
2165
- flex: 1;
2166
- margin: 0 8px;
2167
- }
2168
- .value-text {
2169
- flex: 0 0 45px;
2170
- font-size: 12px;
2171
- color: #999;
2172
- text-align: right;
2173
- }
2174
- }
2175
- .preset-buttons {
2176
- display: flex;
2177
- gap: 6px;
2178
- flex-wrap: wrap;
2179
- .el-button {
2180
- flex: 1;
2181
- min-width: 60px;
2182
- }
2183
- }
2184
- }
2185
- .panel-actions {
2186
- margin-top: 16px;
2187
- padding-top: 12px;
2188
- border-top: 1px solid #ddd;
2189
- text-align: center;
2190
- }
2191
- .custom-css-input {
2192
- font-family: "Courier New", monospace;
2193
- font-size: 12px;
2194
- line-height: 1.4;
2195
- }
2196
- .custom-css-input :deep(.el-textarea__inner) {
2197
- font-family: "Courier New", monospace;
2198
- font-size: 12px;
2199
- line-height: 1.4;
2200
- background-color: #fff;
2201
- border: 1px solid #e9ecef;
2202
- }
2203
- .style-tabs {
2204
- :deep(.el-tabs__header) {
2205
- margin: 0 0 16px 0;
2206
- }
2207
- :deep(.el-tabs__nav-wrap) {
2208
- padding: 0;
2209
- }
2210
- :deep(.el-tabs__item) {
2211
- font-size: 12px;
2212
- padding: 0 16px;
2213
- height: 32px;
2214
- line-height: 32px;
2215
- }
2216
- :deep(.el-tabs__content) {
2217
- padding: 0;
2218
- }
2219
- }
2220
- .current-style-display {
2221
- margin-top: 16px;
2222
- padding: 12px;
2223
- background-color: #f5f5f5;
2224
- border-radius: 4px;
2225
- border: 1px solid #e9ecef;
2226
- h6 {
2227
- margin: 0 0 8px 0;
2228
- font-size: 12px;
2229
- font-weight: 500;
2230
- color: #666;
2231
- }
2232
- .style-preview {
2233
- font-family: "Courier New", monospace;
2234
- font-size: 11px;
2235
- line-height: 1.4;
2236
- color: #333;
2237
- background-color: #fff;
2238
- padding: 8px;
2239
- border-radius: 3px;
2240
- border: 1px solid #ddd;
2241
- word-break: break-all;
2242
- white-space: pre-wrap;
2243
- max-height: 120px;
2244
- overflow-y: auto;
2245
- }
2246
- }
2247
- }
2248
-
2249
- /* 主标签页样式 */
2250
- .main-tabs {
2251
- height: 100%;
2252
- display: flex;
2253
- flex-direction: column;
2254
- }
2255
- .main-tabs .el-tabs__content {
2256
- flex: 1;
2257
- overflow: hidden;
2258
- padding: 0;
2259
- }
2260
- .main-tabs .el-tab-pane {
2261
- height: 100%;
2262
- overflow: auto;
2263
- display: flex;
2264
- flex-direction: column;
2265
- }
2266
- .layer-tree {
2267
- .tree-node-content {
2268
- width: 100%;
2269
- .group-node {
2270
- display: flex;
2271
- align-items: center;
2272
- padding: 8px 0;
2273
- }
2274
- .layer-item {
2275
- display: flex;
2276
- align-items: center;
2277
- justify-content: space-between;
2278
- width: 100%;
2279
- padding: 6px 0;
2280
- .layer-info {
2281
- display: flex;
2282
- align-items: center;
2283
- flex: 1;
2284
- min-width: 0;
2285
- .layer-icon {
2286
- margin-right: 8px;
2287
- flex-shrink: 0;
2288
- }
2289
- .layer-name {
2290
- font-size: 14px;
2291
- color: #333;
2292
- white-space: nowrap;
2293
- overflow: hidden;
2294
- text-overflow: ellipsis;
2295
- }
2296
- }
2297
- .layer-controls {
2298
- display: flex;
2299
- align-items: center;
2300
- gap: 8px;
2301
- .opacity-control {
2302
- display: flex;
2303
- align-items: center;
2304
- gap: 8px;
2305
- min-width: 120px;
2306
- .opacity-slider {
2307
- flex: 1;
2308
- min-width: 80px;
2309
- }
2310
- .opacity-value {
2311
- font-size: 12px;
2312
- color: #666;
2313
- min-width: 35px;
2314
- text-align: right;
2315
- white-space: nowrap;
2316
- }
2317
- }
2318
- .style-config-btn {
2319
- width: 24px;
2320
- height: 24px;
2321
- padding: 0;
2322
- margin-left: 4px;
2323
- }
2324
- }
2325
- }
2326
- }
2327
- }
2328
- }
2329
-
2330
- /* 样式配置面板样式 */
2331
- :deep(.layer-style-popover) {
2332
- .style-config-panel {
2333
- padding: 0;
2334
- .panel-title {
2335
- margin: 0 0 16px 0;
2336
- font-size: 14px;
2337
- font-weight: 600;
2338
- color: #333;
2339
- border-bottom: 1px solid #eee;
2340
- padding-bottom: 8px;
2341
- }
2342
- .config-section {
2343
- margin-bottom: 16px;
2344
- h5 {
2345
- margin: 0 0 12px 0;
2346
- font-size: 13px;
2347
- font-weight: 500;
2348
- color: #666;
2349
- }
2350
- .config-item {
2351
- display: flex;
2352
- align-items: center;
2353
- margin-bottom: 12px;
2354
- gap: 8px;
2355
- label {
2356
- flex: 0 0 60px;
2357
- font-size: 12px;
2358
- color: #666;
2359
- }
2360
- .el-slider {
2361
- flex: 1;
2362
- margin: 0 8px;
2363
- }
2364
- .value-text {
2365
- flex: 0 0 45px;
2366
- font-size: 12px;
2367
- color: #999;
2368
- text-align: right;
2369
- }
2370
- }
2371
- .preset-buttons {
2372
- display: flex;
2373
- gap: 6px;
2374
- flex-wrap: wrap;
2375
- .el-button {
2376
- flex: 1;
2377
- min-width: 60px;
2378
- }
2379
- }
2380
- }
2381
- .panel-actions {
2382
- margin-top: 16px;
2383
- padding-top: 12px;
2384
- border-top: 1px solid #eee;
2385
- text-align: center;
2386
- }
2387
- .custom-css-input {
2388
- font-family: "Courier New", monospace;
2389
- font-size: 12px;
2390
- line-height: 1.4;
2391
- }
2392
- .custom-css-input :deep(.el-textarea__inner) {
2393
- font-family: "Courier New", monospace;
2394
- font-size: 12px;
2395
- line-height: 1.4;
2396
- background-color: #f8f9fa;
2397
- border: 1px solid #e9ecef;
2398
- }
2399
- }
2400
- }
2401
-
2402
- .ol-base-layer-switcher[data-v-396e5ed1] {
2403
- position: absolute;
2404
- bottom: 20px;
2405
- right: 20px;
2406
- z-index: 100;
2407
- height: 70px; /* 60px + 5px padding * 2 */
2408
- background: #fff;
2409
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
2410
- border-radius: 4px;
2411
- padding: 5px;
2412
- box-sizing: border-box;
2413
- transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1);
2414
- overflow: hidden;
2415
- /* 即使内容还没出来,也要从右边开始长出来 */
2416
- display: flex;
2417
- justify-content: flex-end;
2418
- }
2419
-
2420
- /* 列表面板 */
2421
- .layer-panel[data-v-396e5ed1] {
2422
- display: flex;
2423
- gap: 10px;
2424
- height: 100%;
2425
- /* 绝对定位以防止宽度变化时的挤压,或者使用flex布局 */
2426
- min-width: max-content;
2427
- }
2428
-
2429
- /* 收起状态的触发器 */
2430
- .layer-trigger[data-v-396e5ed1] {
2431
- position: absolute;
2432
- right: 5px;
2433
- top: 5px;
2434
- width: 86px;
2435
- height: 60px;
2436
- pointer-events: none; /* 让鼠标事件穿透到底下的 panel */
2437
- transition: opacity 0.2s;
2438
- z-index: 10;
2439
- background: #fff; /* 遮挡下面的列表 */
2440
- }
2441
- .layer-trigger.is-hidden[data-v-396e5ed1] {
2442
- opacity: 0;
2443
- pointer-events: none;
2444
- }
2445
-
2446
- /* 通用图层项样式 */
2447
- .layer-item[data-v-396e5ed1], .current-layer-box[data-v-396e5ed1] {
2448
- width: 86px;
2449
- height: 60px;
2450
- border-radius: 2px;
2451
- background-size: cover;
2452
- background-position: center;
2453
- position: relative;
2454
- box-sizing: border-box;
2455
- border: 1px solid #e4e7ed;
2456
- cursor: pointer;
2457
- transition: all 0.2s;
2458
- overflow: hidden;
2459
- }
2460
- .layer-item[data-v-396e5ed1]:hover {
2461
- border-color: #409eff;
2462
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12);
2463
- }
2464
- .layer-item.active[data-v-396e5ed1] {
2465
- border: 2px solid #409eff;
2466
- }
2467
-
2468
- /* 选中状态的蓝色边框和对勾 */
2469
- .active-border[data-v-396e5ed1] {
2470
- position: absolute;
2471
- top: 0;
2472
- left: 0;
2473
- width: 100%;
2474
- height: 100%;
2475
- border: 2px solid #409eff;
2476
- box-sizing: border-box;
2477
- border-radius: 2px;
2478
- pointer-events: none;
2479
- }
2480
- .check-icon[data-v-396e5ed1] {
2481
- position: absolute;
2482
- bottom: 0;
2483
- right: 0;
2484
- width: 0;
2485
- height: 0;
2486
- border-bottom: 24px solid #409eff;
2487
- border-left: 24px solid transparent;
2488
- }
2489
- .check-icon svg[data-v-396e5ed1] {
2490
- position: absolute;
2491
- right: -1px;
2492
- bottom: -13px;
2493
- transform: scale(0.7);
2494
- }
2495
-
2496
- /* 图层名称标签 */
2497
- .layer-name[data-v-396e5ed1] {
2498
- position: absolute;
2499
- bottom: 0;
2500
- left: 0;
2501
- width: 100%;
2502
- background: rgba(0, 0, 0, 0.6);
2503
- color: #fff;
2504
- font-size: 12px;
2505
- padding: 2px 4px;
2506
- text-align: center;
2507
- white-space: nowrap;
2508
- overflow: hidden;
2509
- text-overflow: ellipsis;
2510
- box-sizing: border-box;
2511
- }
2512
- .layer-item:hover .layer-name[data-v-396e5ed1] {
2513
- background: rgba(0, 0, 0, 0.7);
2514
- }
2515
-
2516
- .context-menu {
2517
- background: white;
2518
- border: 1px solid #dcdfe6;
2519
- border-radius: 4px;
2520
- box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
2521
- padding: 4px 0;
2522
- min-width: 120px;
2523
- }
2524
- .context-menu-item {
2525
- display: flex;
2526
- align-items: center;
2527
- padding: 8px 12px;
2528
- cursor: pointer;
2529
- font-size: 14px;
2530
- color: #606266;
2531
- transition: background-color 0.3s;
2532
- }
2533
- .context-menu-item:hover {
2534
- background-color: #f5f7fa;
2535
- }
2536
- .context-menu-item .el-icon {
2537
- margin-right: 8px;
2538
- font-size: 16px;
2539
- }
2540
- /*
2541
- * 基础样式文件
2542
- * 替换UnoCSS的基础样式类
2543
- */
2544
-
2545
- /* 布局相关 */
2546
- .w-full { width: 100%; }
2547
- .h-full { height: 100%; }
2548
- .w-screen { width: 100vw; }
2549
- .h-screen { height: 100vh; }
1700
+ /* 布局相关 */
1701
+ .w-full { width: 100%; }
1702
+ .h-full { height: 100%; }
1703
+ .w-screen { width: 100vw; }
1704
+ .h-screen { height: 100vh; }
2550
1705
 
2551
1706
  /* 尺寸 */
2552
1707
  .w-0 { width: 0px; }
@@ -3238,48 +2393,894 @@ label {
3238
2393
  .cursor-zoom-in { cursor: zoom-in; }
3239
2394
  .cursor-zoom-out { cursor: zoom-out; }
3240
2395
 
3241
- /* 用户选择 */
3242
- .select-none { user-select: none; }
3243
- .select-text { user-select: text; }
3244
- .select-all { user-select: all; }
3245
- .select-auto { user-select: auto; }
2396
+ /* 用户选择 */
2397
+ .select-none { user-select: none; }
2398
+ .select-text { user-select: text; }
2399
+ .select-all { user-select: all; }
2400
+ .select-auto { user-select: auto; }
2401
+
2402
+ /* 指针事件 */
2403
+ .pointer-events-none { pointer-events: none; }
2404
+ .pointer-events-auto { pointer-events: auto; }
2405
+
2406
+ /* 过渡 */
2407
+ .transition-none { transition-property: none; }
2408
+ .transition-all { transition-property: all; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
2409
+ .transition { transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
2410
+ .transition-colors { transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
2411
+ .transition-opacity { transition-property: opacity; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
2412
+ .transition-shadow { transition-property: box-shadow; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
2413
+ .transition-transform { transition-property: transform; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
2414
+ .duration-75 { transition-duration: 75ms; }
2415
+ .duration-100 { transition-duration: 100ms; }
2416
+ .duration-150 { transition-duration: 150ms; }
2417
+ .duration-200 { transition-duration: 200ms; }
2418
+ .duration-300 { transition-duration: 300ms; }
2419
+ .duration-500 { transition-duration: 500ms; }
2420
+ .duration-700 { transition-duration: 700ms; }
2421
+ .duration-1000 { transition-duration: 1000ms; }
2422
+ .ease-linear { transition-timing-function: linear; }
2423
+ .ease-in { transition-timing-function: cubic-bezier(0.4, 0, 1, 1); }
2424
+ .ease-out { transition-timing-function: cubic-bezier(0, 0, 0.2, 1); }
2425
+ .ease-in-out { transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
2426
+
2427
+ /* 变换 */
2428
+ .transform { transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); }
2429
+ .transform-gpu { transform: translate3d(var(--tw-translate-x), var(--tw-translate-y), 0) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); }
2430
+ .transform-none { transform: none; }
3246
2431
 
3247
- /* 指针事件 */
3248
- .pointer-events-none { pointer-events: none; }
3249
- .pointer-events-auto { pointer-events: auto; }
2432
+ /* hover伪类样式 */
2433
+ .hover-bg-gray-100:hover {
2434
+ background-color: #f3f4f6;
2435
+ }
2436
+
2437
+ /* 图例面板相关样式 */
2438
+ .legend-collapsed .panel-content {
2439
+ display: none;
2440
+ }/* 让样式穿透到 CustomDialog 内部容器(其上有我们传入的 class="measurement-dialog") */
2441
+ [data-v-ac238457] .measurement-dialog {
2442
+ background-color: transparent !important; /* 覆盖 CustomDialog 根容器的 bg-white */
2443
+ box-shadow: none !important;
2444
+ }
2445
+
2446
+ /* 让 CustomDialog 自带的标题栏不再是灰底 */
2447
+ [data-v-ac238457] .measurement-dialog .bg-gray-50 {
2448
+ background-color: transparent !important;
2449
+ border-bottom-color: transparent !important;
2450
+ }
2451
+
2452
+ /* 保留以下原有样式 */
2453
+ .measurement-dialog[data-v-ac238457] {
2454
+ --el-dialog-bg-color: transparent;
2455
+ --el-dialog-title-font-size: 16px;
2456
+ --el-dialog-box-shadow: none;
2457
+ }
2458
+ .measurement-content[data-v-ac238457] {
2459
+ background: transparent;
2460
+ border-radius: 12px;
2461
+ overflow: hidden;
2462
+ }
2463
+ .measurement-header[data-v-ac238457] {
2464
+ background: transparent;
2465
+ backdrop-filter: blur(10px);
2466
+ border-bottom: 1px solid rgba(226, 232, 240, 0);
2467
+ }
2468
+ .measurement-result[data-v-ac238457] {
2469
+ background: rgba(255, 255, 255, 0.9);
2470
+ backdrop-filter: blur(10px);
2471
+ border-bottom: 1px solid rgba(226, 232, 240, 0.8);
2472
+ display: flex;
2473
+ align-items: center;
2474
+ justify-content: center;
2475
+ }
2476
+ .result-value[data-v-ac238457] {
2477
+ font-size: 42px;
2478
+ font-weight: 600;
2479
+ color: #3b82f6;
2480
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
2481
+ line-height: 1;
2482
+ text-shadow: 0 2px 4px rgba(59, 130, 246, 0.1);
2483
+ }
2484
+ .tool-grid[data-v-ac238457] {
2485
+ display: grid;
2486
+ grid-template-columns: repeat(4, 1fr);
2487
+ column-gap: 18px;
2488
+ row-gap: 12px;
2489
+ justify-items: center;
2490
+ align-items: start;
2491
+ }
2492
+ .tool-item[data-v-ac238457] {
2493
+ position: relative;
2494
+ display: flex;
2495
+ flex-direction: column;
2496
+ align-items: center;
2497
+ cursor: pointer;
2498
+ user-select: none;
2499
+ transition: transform 0.2s ease;
2500
+ }
2501
+ .tool-icon[data-v-ac238457] {
2502
+ width: 28px;
2503
+ height: 28px;
2504
+ padding: 14px; /* 28 + 14*2 = 56px 的方块 */
2505
+ border-radius: 10px;
2506
+ background: linear-gradient(180deg, #f2f4f8 0%, #e9eef5 100%);
2507
+ border: 1px solid #e6ebf2;
2508
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.06);
2509
+ transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
2510
+ margin-bottom: 10px;
2511
+ }
2512
+ .tool-item:hover .tool-icon[data-v-ac238457],
2513
+ .tool-item.active .tool-icon[data-v-ac238457] {
2514
+ transform: translateY(-2px);
2515
+ box-shadow: 0 6px 16px rgba(0, 0, 0, 0.12);
2516
+ border-color: #c8d4e6;
2517
+ }
2518
+ .tool-label[data-v-ac238457] {
2519
+ font-size: 14px;
2520
+ line-height: 1.2;
2521
+ color: #334155; /* 不改变整体背景,仅优化文字可读性 */
2522
+ font-weight: 500;
2523
+ white-space: nowrap;
2524
+ }
2525
+ .dialog-footer[data-v-ac238457] {
2526
+ @apply hidden;
2527
+ }
2528
+ /* 底图对话框样式 */
2529
+ .basemap-dialog {
2530
+ /* CustomDialog 会处理右侧滑入动画 */
2531
+ }
2532
+
2533
+ /* 底图内容容器 */
2534
+ .basemap-content {
2535
+ padding: 16px;
2536
+ height: 100%;
2537
+ overflow: visible;
2538
+ }
2539
+
2540
+ /* 底图网格布局 */
2541
+ .basemap-grid {
2542
+ display: grid;
2543
+ grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
2544
+ gap: 16px;
2545
+ padding: 8px 0;
2546
+ }
2547
+
2548
+ /* 底图项目 */
2549
+ .basemap-item {
2550
+ display: flex;
2551
+ flex-direction: column;
2552
+ align-items: center;
2553
+ padding: 12px;
2554
+ border: 2px solid transparent;
2555
+ border-radius: 12px;
2556
+ cursor: pointer;
2557
+ transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);
2558
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.8) 0%, rgba(248, 250, 252, 0.9) 100%);
2559
+ backdrop-filter: blur(10px);
2560
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
2561
+ }
2562
+ .basemap-item:hover {
2563
+ transform: translateY(-2px) scale(1.02);
2564
+ border-color: rgba(59, 130, 246, 0.3);
2565
+ box-shadow: 0 8px 25px rgba(59, 130, 246, 0.15), 0 4px 12px rgba(0, 0, 0, 0.1);
2566
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.95) 0%, rgba(248, 250, 252, 1) 100%);
2567
+ }
2568
+ .basemap-item.active {
2569
+ border-color: #3b82f6;
2570
+ background: linear-gradient(135deg, rgba(59, 130, 246, 0.1) 0%, rgba(147, 197, 253, 0.15) 100%);
2571
+ box-shadow: 0 8px 25px rgba(59, 130, 246, 0.2), 0 4px 12px rgba(0, 0, 0, 0.1);
2572
+ }
2573
+
2574
+ /* 底图预览图片 */
2575
+ .basemap-preview {
2576
+ width: 100px;
2577
+ height: 75px;
2578
+ border-radius: 8px;
2579
+ overflow: hidden;
2580
+ margin-bottom: 8px;
2581
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
2582
+ transition: all 0.3s ease;
2583
+ }
2584
+ .basemap-item:hover .basemap-preview {
2585
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
2586
+ transform: scale(1.05);
2587
+ }
2588
+ .basemap-preview img {
2589
+ width: 100%;
2590
+ height: 100%;
2591
+ object-fit: cover;
2592
+ transition: all 0.3s ease;
2593
+ image-rendering: -webkit-optimize-contrast;
2594
+ image-rendering: crisp-edges;
2595
+ }
2596
+
2597
+ /* 底图名称 */
2598
+ .basemap-name {
2599
+ font-size: 12px;
2600
+ font-weight: 500;
2601
+ color: #374151;
2602
+ text-align: center;
2603
+ line-height: 1.4;
2604
+ transition: all 0.3s ease;
2605
+ }
2606
+ .basemap-item:hover .basemap-name {
2607
+ color: #1f2937;
2608
+ font-weight: 600;
2609
+ }
2610
+ .basemap-item.active .basemap-name {
2611
+ color: #3b82f6;
2612
+ font-weight: 600;
2613
+ }
2614
+
2615
+ /* 底图网格 */
2616
+ .basemap-grid {
2617
+ display: grid;
2618
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
2619
+ gap: 16px;
2620
+ }
2621
+
2622
+ /* 底图项 */
2623
+ .basemap-item {
2624
+ cursor: pointer;
2625
+ border-radius: 12px;
2626
+ overflow: hidden;
2627
+ transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);
2628
+ border: 2px solid rgba(0, 0, 0, 0.08);
2629
+ background: rgba(255, 255, 255, 0.8);
2630
+ backdrop-filter: blur(10px);
2631
+ position: relative;
2632
+ }
2633
+ .basemap-item::before {
2634
+ content: '';
2635
+ position: absolute;
2636
+ top: 0;
2637
+ left: 0;
2638
+ right: 0;
2639
+ bottom: 0;
2640
+ background: linear-gradient(135deg, rgba(59, 130, 246, 0.1) 0%, rgba(147, 51, 234, 0.1) 100%);
2641
+ opacity: 0;
2642
+ transition: opacity 0.3s ease;
2643
+ z-index: 1;
2644
+ }
2645
+ .basemap-item:hover {
2646
+ transform: translateY(-4px) scale(1.02);
2647
+ border-color: rgba(59, 130, 246, 0.3);
2648
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15);
2649
+ }
2650
+ .basemap-item:hover::before {
2651
+ opacity: 1;
2652
+ }
2653
+ .basemap-item.active {
2654
+ border-color: #3b82f6;
2655
+ box-shadow: 0 8px 25px rgba(59, 130, 246, 0.25);
2656
+ transform: translateY(-2px);
2657
+ }
2658
+ .basemap-item.active::before {
2659
+ opacity: 0.7;
2660
+ }
2661
+
2662
+ /* 底图预览 */
2663
+ .basemap-preview {
2664
+ width: 100%;
2665
+ height: 80px;
2666
+ background: linear-gradient(135deg, #f3f4f6 0%, #e5e7eb 100%);
2667
+ display: flex;
2668
+ align-items: center;
2669
+ justify-content: center;
2670
+ overflow: hidden;
2671
+ position: relative;
2672
+ z-index: 2;
2673
+ }
2674
+ .basemap-preview img {
2675
+ width: 100%;
2676
+ height: 100%;
2677
+ object-fit: cover;
2678
+ transition: transform 0.3s ease;
2679
+ }
2680
+ .basemap-item:hover .basemap-preview img {
2681
+ transform: scale(1.1);
2682
+ }
2683
+
2684
+ /* 底图名称 */
2685
+ .basemap-name {
2686
+ padding: 12px 16px;
2687
+ text-align: center;
2688
+ font-size: 13px;
2689
+ font-weight: 500;
2690
+ color: #374151;
2691
+ background: rgba(255, 255, 255, 0.9);
2692
+ backdrop-filter: blur(5px);
2693
+ position: relative;
2694
+ z-index: 2;
2695
+ letter-spacing: 0.3px;
2696
+ }
2697
+ .basemap-item.active .basemap-name {
2698
+ color: #1f2937;
2699
+ font-weight: 600;
2700
+ }
2701
+
2702
+ /* 响应式设计 */
2703
+ @media (max-width: 480px) {
2704
+ .basemap-panel {
2705
+ width: 100%;
2706
+ }
2707
+ .basemap-grid {
2708
+ grid-template-columns: 1fr;
2709
+ }
2710
+ .panel-content {
2711
+ padding: 16px;
2712
+ }
2713
+ }
2714
+
2715
+ /* 动画关键帧 */
2716
+ @keyframes slideInRight {
2717
+ from {
2718
+ transform: translateX(100%);
2719
+ opacity: 0;
2720
+ }
2721
+ to {
2722
+ transform: translateX(0);
2723
+ opacity: 1;
2724
+ }
2725
+ }
2726
+ @keyframes slideOutRight {
2727
+ from {
2728
+ transform: translateX(0);
2729
+ opacity: 1;
2730
+ }
2731
+ to {
2732
+ transform: translateX(100%);
2733
+ opacity: 0;
2734
+ }
2735
+ }
2736
+
2737
+ .coordinate-dialog {
2738
+ --el-dialog-bg-color: #1a1a1a;
2739
+ }
2740
+ .coordinate-content {
2741
+ padding: 10px 0;
2742
+ }
2743
+ .format-selection {
2744
+ margin-bottom: 20px;
2745
+ padding: 15px;
2746
+ background: #f8f9fa;
2747
+ border-radius: 6px;
2748
+ border: 1px solid #e9ecef;
2749
+ }
2750
+ .format-title {
2751
+ font-weight: 500;
2752
+ margin-bottom: 10px;
2753
+ color: #495057;
2754
+ }
2755
+ .format-options {
2756
+ display: flex;
2757
+ gap: 20px;
2758
+ }
2759
+ .format-options :deep(.el-radio) {
2760
+ margin-right: 0;
2761
+ }
2762
+ .coordinate-input {
2763
+ margin-bottom: 20px;
2764
+ }
2765
+ .dialog-footer {
2766
+ text-align: right;
2767
+ }
2768
+ .dialog-footer .el-button {
2769
+ margin-left: 10px;
2770
+ }
3250
2771
 
3251
- /* 过渡 */
3252
- .transition-none { transition-property: none; }
3253
- .transition-all { transition-property: all; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
3254
- .transition { transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
3255
- .transition-colors { transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
3256
- .transition-opacity { transition-property: opacity; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
3257
- .transition-shadow { transition-property: box-shadow; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
3258
- .transition-transform { transition-property: transform; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }
3259
- .duration-75 { transition-duration: 75ms; }
3260
- .duration-100 { transition-duration: 100ms; }
3261
- .duration-150 { transition-duration: 150ms; }
3262
- .duration-200 { transition-duration: 200ms; }
3263
- .duration-300 { transition-duration: 300ms; }
3264
- .duration-500 { transition-duration: 500ms; }
3265
- .duration-700 { transition-duration: 700ms; }
3266
- .duration-1000 { transition-duration: 1000ms; }
3267
- .ease-linear { transition-timing-function: linear; }
3268
- .ease-in { transition-timing-function: cubic-bezier(0.4, 0, 1, 1); }
3269
- .ease-out { transition-timing-function: cubic-bezier(0, 0, 0.2, 1); }
3270
- .ease-in-out { transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
2772
+ .region-dialog {
2773
+ .region-content {
2774
+ max-height: 500px;
2775
+ overflow-y: auto;
2776
+ }
2777
+ :deep(.el-tabs__header) {
2778
+ margin: 0 0 20px 0;
2779
+ }
2780
+ :deep(.el-tabs__nav-wrap) {
2781
+ padding: 0 20px;
2782
+ }
2783
+ :deep(.el-tabs__item) {
2784
+ font-size: 16px;
2785
+ font-weight: 500;
2786
+ color: #606266;
2787
+ &.is-active {
2788
+ color: #409eff;
2789
+ font-weight: 600;
2790
+ }
2791
+ }
2792
+ :deep(.el-tabs__active-bar) {
2793
+ background-color: #409eff;
2794
+ }
2795
+ .region-categories {
2796
+ .region-group {
2797
+ margin-bottom: 20px;
2798
+ .group-title {
2799
+ font-size: 14px;
2800
+ font-weight: 600;
2801
+ color: #606266;
2802
+ margin-bottom: 10px;
2803
+ padding-left: 8px;
2804
+ border-left: 3px solid #409eff;
2805
+ }
2806
+ .region-items {
2807
+ display: flex;
2808
+ flex-wrap: wrap;
2809
+ gap: 8px;
2810
+ .region-btn {
2811
+ margin: 0;
2812
+ padding: 8px 16px;
2813
+ border: 1px solid #dcdfe6;
2814
+ border-radius: 4px;
2815
+ background: #fff;
2816
+ color: #606266;
2817
+ transition: all 0.3s;
2818
+ &:hover {
2819
+ color: #409eff;
2820
+ border-color: #409eff;
2821
+ background: #ecf5ff;
2822
+ }
2823
+ }
2824
+ }
2825
+ }
2826
+ }
2827
+ .beijing-districts {
2828
+ .district-grid {
2829
+ display: grid;
2830
+ grid-template-columns: repeat(5, 1fr);
2831
+ gap: 12px;
2832
+ padding: 10px;
2833
+ .district-btn {
2834
+ padding: 12px 8px;
2835
+ border: 1px solid #dcdfe6;
2836
+ border-radius: 6px;
2837
+ background: #fff;
2838
+ color: #606266;
2839
+ font-size: 14px;
2840
+ text-align: center;
2841
+ transition: all 0.3s;
2842
+ cursor: pointer;
2843
+ min-height: 44px;
2844
+ display: flex;
2845
+ align-items: center;
2846
+ justify-content: center;
2847
+ &:hover {
2848
+ color: #409eff;
2849
+ border-color: #409eff;
2850
+ background: #ecf5ff;
2851
+ transform: translateY(-2px);
2852
+ box-shadow: 0 4px 8px rgba(64, 158, 255, 0.2);
2853
+ }
2854
+ &.active {
2855
+ color: #fff;
2856
+ background: #409eff;
2857
+ border-color: #409eff;
2858
+ box-shadow: 0 4px 8px rgba(64, 158, 255, 0.3);
2859
+ }
2860
+ }
2861
+ }
2862
+ }
2863
+ }
2864
+ @media (max-width: 768px) {
2865
+ .region-dialog {
2866
+ .beijing-districts {
2867
+ .district-grid {
2868
+ grid-template-columns: repeat(3, 1fr);
2869
+ gap: 8px;
2870
+ }
2871
+ }
2872
+ }
2873
+ }
2874
+ @media (max-width: 480px) {
2875
+ .region-dialog {
2876
+ .beijing-districts {
2877
+ .district-grid {
2878
+ grid-template-columns: repeat(2, 1fr);
2879
+ }
2880
+ }
2881
+ }
2882
+ }
3271
2883
 
3272
- /* 变换 */
3273
- .transform { transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); }
3274
- .transform-gpu { transform: translate3d(var(--tw-translate-x), var(--tw-translate-y), 0) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); }
3275
- .transform-none { transform: none; }
2884
+ .markers-dialog {
2885
+ --el-dialog-bg-color: #1a1a1a;
2886
+ }
2887
+ .markers-content {
2888
+ padding: 10px 0;
2889
+ }
2890
+ .toolbar {
2891
+ margin-bottom: 15px;
2892
+ display: flex;
2893
+ gap: 10px;
2894
+ }
2895
+ .toolbar .adding-marker {
2896
+ background-color: #f56c6c !important;
2897
+ border-color: #f56c6c !important;
2898
+ animation: pulse 1.5s infinite;
2899
+ }
2900
+ @keyframes pulse {
2901
+ 0% {
2902
+ box-shadow: 0 0 0 0 rgba(245, 108, 108, 0.7);
2903
+ }
2904
+ 70% {
2905
+ box-shadow: 0 0 0 10px rgba(245, 108, 108, 0);
2906
+ }
2907
+ 100% {
2908
+ box-shadow: 0 0 0 0 rgba(245, 108, 108, 0);
2909
+ }
2910
+ }
2911
+ .search-filter {
2912
+ margin-bottom: 15px;
2913
+ display: flex;
2914
+ align-items: center;
2915
+ }
2916
+ .markers-list {
2917
+ margin-bottom: 20px;
2918
+ }
2919
+ .markers-table {
2920
+ --el-table-bg-color: transparent;
2921
+ --el-table-tr-bg-color: transparent;
2922
+ --el-table-header-bg-color: rgba(255, 255, 255, 0.05);
2923
+ }
2924
+ .marker-name {
2925
+ display: flex;
2926
+ align-items: center;
2927
+ gap: 5px;
2928
+ }
2929
+ .delete-btn {
2930
+ color: #f56c6c;
2931
+ }
2932
+ .delete-btn:hover {
2933
+ color: #f78989;
2934
+ }
2935
+ .statistics {
2936
+ padding: 15px;
2937
+ background: rgba(64, 158, 255, 0.05);
2938
+ border-radius: 6px;
2939
+ border: 1px solid rgba(64, 158, 255, 0.2);
2940
+ }
2941
+ .dialog-footer {
2942
+ text-align: right;
2943
+ }
3276
2944
 
3277
- /* hover伪类样式 */
3278
- .hover-bg-gray-100:hover {
2945
+ .bookmarks-dialog {
2946
+ --el-dialog-bg-color: #1a1a1a;
2947
+ }
2948
+ .bookmarks-content {
2949
+ padding: 10px 0;
2950
+ }
2951
+ .toolbar {
2952
+ margin-bottom: 15px;
2953
+ display: flex;
2954
+ gap: 10px;
2955
+ }
2956
+ .search-filter {
2957
+ margin-bottom: 15px;
2958
+ display: flex;
2959
+ align-items: center;
2960
+ }
2961
+ .bookmarks-grid {
2962
+ display: grid;
2963
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
2964
+ gap: 15px;
2965
+ margin-bottom: 20px;
2966
+ max-height: 400px;
2967
+ overflow-y: auto;
2968
+ }
2969
+ .bookmark-card {
2970
+ border: 1px solid #303133;
2971
+ border-radius: 8px;
2972
+ overflow: hidden;
2973
+ background: rgba(255, 255, 255, 0.02);
2974
+ transition: all 0.3s ease;
2975
+ cursor: pointer;
2976
+ }
2977
+ .bookmark-card:hover {
2978
+ border-color: #409eff;
2979
+ box-shadow: 0 4px 12px rgba(64, 158, 255, 0.2);
2980
+ transform: translateY(-2px);
2981
+ }
2982
+ .bookmark-thumbnail {
2983
+ position: relative;
2984
+ height: 120px;
2985
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
2986
+ display: flex;
2987
+ align-items: center;
2988
+ justify-content: center;
2989
+ }
2990
+ .thumbnail-placeholder {
2991
+ opacity: 0.6;
2992
+ }
2993
+ .bookmark-overlay {
2994
+ position: absolute;
2995
+ top: 0;
2996
+ left: 0;
2997
+ right: 0;
2998
+ bottom: 0;
2999
+ background: rgba(0, 0, 0, 0.7);
3000
+ display: flex;
3001
+ align-items: center;
3002
+ justify-content: center;
3003
+ opacity: 0;
3004
+ transition: opacity 0.3s ease;
3005
+ }
3006
+ .bookmark-card:hover .bookmark-overlay {
3007
+ opacity: 1;
3008
+ }
3009
+ .bookmark-info {
3010
+ padding: 12px;
3011
+ }
3012
+ .bookmark-title {
3013
+ font-size: 16px;
3014
+ font-weight: bold;
3015
+ color: #e4e7ed;
3016
+ margin-bottom: 8px;
3017
+ white-space: nowrap;
3018
+ overflow: hidden;
3019
+ text-overflow: ellipsis;
3020
+ }
3021
+ .bookmark-meta {
3022
+ display: flex;
3023
+ justify-content: space-between;
3024
+ align-items: center;
3025
+ margin-bottom: 8px;
3026
+ }
3027
+ .use-count {
3028
+ font-size: 12px;
3029
+ color: #909399;
3030
+ }
3031
+ .bookmark-description {
3032
+ font-size: 12px;
3033
+ color: #c0c4cc;
3034
+ margin-bottom: 8px;
3035
+ line-height: 1.4;
3036
+ display: -webkit-box;
3037
+ -webkit-line-clamp: 2;
3038
+ -webkit-box-orient: vertical;
3039
+ overflow: hidden;
3040
+ }
3041
+ .bookmark-details {
3042
+ display: flex;
3043
+ flex-direction: column;
3044
+ gap: 4px;
3045
+ margin-bottom: 8px;
3046
+ }
3047
+ .detail-item {
3048
+ display: flex;
3049
+ align-items: center;
3050
+ gap: 4px;
3051
+ font-size: 11px;
3052
+ color: #909399;
3053
+ }
3054
+ .bookmark-time {
3055
+ font-size: 11px;
3056
+ color: #606266;
3057
+ text-align: right;
3058
+ }
3059
+ .delete-btn {
3060
+ color: #f56c6c;
3061
+ }
3062
+ .delete-btn:hover {
3063
+ color: #f78989;
3064
+ }
3065
+ .empty-state {
3066
+ text-align: center;
3067
+ padding: 40px 0;
3068
+ }
3069
+ .statistics {
3070
+ padding: 15px;
3071
+ background: rgba(64, 158, 255, 0.05);
3072
+ border-radius: 6px;
3073
+ border: 1px solid rgba(64, 158, 255, 0.2);
3074
+ }
3075
+ .dialog-footer {
3076
+ text-align: right;
3077
+ }
3078
+
3079
+ /* 自定义滚动条 */
3080
+ .bookmarks-grid::-webkit-scrollbar {
3081
+ width: 6px;
3082
+ }
3083
+ .bookmarks-grid::-webkit-scrollbar-track {
3084
+ background: #2c2c2c;
3085
+ border-radius: 3px;
3086
+ }
3087
+ .bookmarks-grid::-webkit-scrollbar-thumb {
3088
+ background: #409eff;
3089
+ border-radius: 3px;
3090
+ }
3091
+ .bookmarks-grid::-webkit-scrollbar-thumb:hover {
3092
+ background: #66b1ff;
3093
+ }
3094
+ .mark-tab-container[data-v-b5ca6d89] {
3095
+ display: flex;
3096
+ flex-direction: column;
3097
+ height: 100%;
3098
+ padding: 12px;
3099
+ }
3100
+ .type-select[data-v-b5ca6d89] {
3101
+ width: 100%;
3102
+ margin-bottom: 12px;
3103
+ }
3104
+ .continuous-switch[data-v-b5ca6d89] {
3105
+ display: flex;
3106
+ align-items: center;
3107
+ justify-content: space-between;
3108
+ margin-bottom: 12px;
3109
+ padding: 8px;
3110
+ background-color: #f9fafb;
3111
+ border-radius: 6px;
3112
+ }
3113
+ .switch-label[data-v-b5ca6d89] {
3114
+ font-size: 14px;
3115
+ color: #374151;
3116
+ }
3117
+ .tools-grid[data-v-b5ca6d89] {
3118
+ display: grid;
3119
+ grid-template-columns: repeat(3, 1fr);
3120
+ gap: 16px;
3121
+ flex: 1;
3122
+ overflow: auto;
3123
+ }
3124
+ .tool-item[data-v-b5ca6d89] {
3125
+ display: flex;
3126
+ flex-direction: column;
3127
+ align-items: center;
3128
+ justify-content: center;
3129
+ padding: 8px;
3130
+ border: 1px solid #e5e7eb;
3131
+ border-radius: 8px;
3132
+ cursor: pointer;
3133
+ transition: all 0.3s ease;
3134
+ }
3135
+ .tool-item[data-v-b5ca6d89]:hover {
3279
3136
  background-color: #f3f4f6;
3137
+ border-color: #60a5fa;
3280
3138
  }
3281
-
3282
- /* 图例面板相关样式 */
3283
- .legend-collapsed .panel-content {
3284
- display: none;
3139
+ .tool-image[data-v-b5ca6d89] {
3140
+ width: 24px;
3141
+ height: 24px;
3142
+ margin-bottom: 4px;
3143
+ }
3144
+ .tool-icon-large[data-v-b5ca6d89] {
3145
+ font-size: 24px;
3146
+ margin-bottom: 4px;
3147
+ }
3148
+ .tool-label[data-v-b5ca6d89] {
3149
+ font-size: 12px;
3150
+ color: #6b7280;
3151
+ text-align: center;
3152
+ }
3153
+ .tool-item:hover .tool-label[data-v-b5ca6d89] {
3154
+ color: #3b82f6;
3155
+ }
3156
+ .stop-drawing-section[data-v-b5ca6d89] {
3157
+ margin-top: 12px;
3158
+ padding-top: 12px;
3159
+ border-top: 1px solid #e5e7eb;
3160
+ }
3161
+ .stop-drawing-section {
3162
+ margin-top: 20px;
3163
+ padding-top: 16px;
3164
+ border-top: 1px solid #e4e7ed;
3165
+ text-align: center;
3166
+ }
3167
+ .stop-drawing-section .el-button {
3168
+ width: 100%;
3169
+ font-weight: 500;
3170
+ }
3171
+ .list-tab-container[data-v-148877f2] {
3172
+ display: flex;
3173
+ flex-direction: column;
3174
+ height: 100%;
3175
+ font-size: 14px;
3176
+ }
3177
+ .toolbar[data-v-148877f2] {
3178
+ display: flex;
3179
+ align-items: center;
3180
+ justify-content: space-between;
3181
+ padding: 4px 8px;
3182
+ border-bottom: 1px solid #d1d5db;
3183
+ }
3184
+ .toolbar-left[data-v-148877f2] {
3185
+ display: flex;
3186
+ align-items: center;
3187
+ gap: 8px;
3188
+ }
3189
+ .toolbar-title[data-v-148877f2] {
3190
+ font-weight: 500;
3191
+ }
3192
+ .toolbar-icon[data-v-148877f2] {
3193
+ font-size: 16px;
3194
+ }
3195
+ .data-count[data-v-148877f2] {
3196
+ color: #6b7280;
3197
+ }
3198
+ .list-content[data-v-148877f2] {
3199
+ flex: 1;
3200
+ overflow: auto;
3201
+ padding: 4px;
3202
+ }
3203
+ .tree-component[data-v-148877f2] {
3204
+ font-size: 14px;
3205
+ }
3206
+ .tree-node[data-v-148877f2] {
3207
+ display: flex;
3208
+ align-items: center;
3209
+ gap: 8px;
3210
+ }
3211
+ .node-icon[data-v-148877f2] {
3212
+ font-size: 16px;
3213
+ }
3214
+ .empty-state[data-v-148877f2] {
3215
+ height: 100%;
3216
+ display: flex;
3217
+ align-items: center;
3218
+ justify-content: center;
3219
+ color: #9ca3af;
3220
+ }.dialog-content[data-v-c695eece] {
3221
+ display: flex;
3222
+ flex-direction: column;
3223
+ height: 100%;
3224
+ }
3225
+ .toolbar[data-v-c695eece] {
3226
+ display: flex;
3227
+ align-items: center;
3228
+ justify-content: space-between;
3229
+ padding: 12px;
3230
+ border-bottom: 1px solid #e5e7eb;
3231
+ background-color: #f9fafb;
3232
+ }
3233
+ .toolbar-left[data-v-c695eece] {
3234
+ display: flex;
3235
+ align-items: center;
3236
+ gap: 20px;
3237
+ }
3238
+ .toolbar-right[data-v-c695eece] {
3239
+ display: flex;
3240
+ align-items: center;
3241
+ gap: 20px;
3242
+ }
3243
+ .tool-icon[data-v-c695eece] {
3244
+ font-size: 20px;
3245
+ cursor: pointer;
3246
+ color: #6b7280;
3247
+ transition: color 0.3s ease;
3248
+ }
3249
+ .tool-icon[data-v-c695eece]:hover {
3250
+ color: var(--el-color-primary, #409eff);
3251
+ }
3252
+ .content-area[data-v-c695eece] {
3253
+ flex: 1;
3254
+ overflow: hidden;
3255
+ }
3256
+ .tabs-container[data-v-c695eece] {
3257
+ height: 100%;
3258
+ }
3259
+ .map-drawing-dialog[data-v-c695eece] .el-tabs {
3260
+ height: 100%;
3261
+ display: flex;
3262
+ flex-direction: column;
3263
+ }
3264
+ .map-drawing-dialog[data-v-c695eece] .el-tabs__content {
3265
+ flex: 1;
3266
+ overflow: auto;
3267
+ padding: 12px;
3268
+ }
3269
+ .map-drawing-dialog[data-v-c695eece] .el-tabs__nav-wrap {
3270
+ padding: 0 10px;
3271
+ }
3272
+ .map-drawing-dialog[data-v-c695eece] .el-tabs__item {
3273
+ font-size: 14px;
3274
+ font-weight: 500;
3275
+ padding: 0 20px;
3276
+ height: 40px;
3277
+ line-height: 40px;
3278
+ transition: all 0.3s;
3279
+ }
3280
+ .map-drawing-dialog[data-v-c695eece] .el-tabs__item.is-active {
3281
+ color: var(--el-color-primary);
3282
+ font-weight: 600;
3283
+ }
3284
+ .map-drawing-dialog[data-v-c695eece] .el-tabs__item:hover {
3285
+ color: var(--el-color-primary);
3285
3286
  }