@robot-admin/naive-ui-components 0.4.3 → 0.4.5
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.
- package/dist/C_ActionBar.cjs +1 -5
- package/dist/C_ActionBar.js +1 -4
- package/dist/C_ActionBar.js.map +1 -0
- package/dist/C_ActionBar2.js +1 -195
- package/dist/C_ActionBar2.js.map +1 -1
- package/dist/{C_AntV-DGjscTWa.css.map → C_AntV-A3NXx_sF.css.map} +1 -1
- package/dist/C_AntV.cjs +1 -8
- package/dist/C_AntV.js +1 -4
- package/dist/C_AntV.js.map +1 -0
- package/dist/C_AntV2.js +4 -3149
- package/dist/C_AntV2.js.map +1 -1
- package/dist/C_Barcode.cjs +1 -4
- package/dist/C_Barcode.js +1 -3
- package/dist/C_Barcode.js.map +1 -0
- package/dist/C_Barcode2.js +1 -67
- package/dist/C_Barcode2.js.map +1 -1
- package/dist/C_Captcha.cjs +1 -4
- package/dist/C_Captcha.js +1 -3
- package/dist/C_Captcha.js.map +1 -0
- package/dist/C_Captcha2.js +1 -154
- package/dist/C_Captcha2.js.map +1 -1
- package/dist/C_Cascade.cjs +1 -4
- package/dist/C_Cascade.js +1 -3
- package/dist/C_Cascade.js.map +1 -0
- package/dist/C_Cascade2.js +1 -102
- package/dist/C_Cascade2.js.map +1 -1
- package/dist/C_City.cjs +1 -4
- package/dist/C_City.js +1 -3
- package/dist/C_City.js.map +1 -0
- package/dist/C_City2.js +1 -840
- package/dist/C_City2.js.map +1 -1
- package/dist/C_Code.cjs +1 -5
- package/dist/C_Code.js +1 -4
- package/dist/C_Code.js.map +1 -0
- package/dist/C_Code2.js +1 -346
- package/dist/C_Code2.js.map +1 -1
- package/dist/C_CollapsePanel.cjs +1 -6
- package/dist/C_CollapsePanel.js +1 -4
- package/dist/C_CollapsePanel.js.map +1 -0
- package/dist/C_CollapsePanel2.js +1 -318
- package/dist/C_CollapsePanel2.js.map +1 -1
- package/dist/C_Cron.cjs +1 -15
- package/dist/C_Cron.js +1 -4
- package/dist/C_Cron.js.map +1 -0
- package/dist/C_Cron2.js +1 -1209
- package/dist/C_Cron2.js.map +1 -1
- package/dist/C_Date.cjs +1 -4
- package/dist/C_Date.js +1 -3
- package/dist/C_Date.js.map +1 -0
- package/dist/C_Date2.js +1 -218
- package/dist/C_Date2.js.map +1 -1
- package/dist/C_Draggable.cjs +1 -5
- package/dist/C_Draggable.js +1 -3
- package/dist/C_Draggable.js.map +1 -0
- package/dist/C_Draggable2.js +1 -294
- package/dist/C_Draggable2.js.map +1 -1
- package/dist/C_Editor.cjs +1 -4
- package/dist/C_Editor.js +1 -3
- package/dist/C_Editor.js.map +1 -0
- package/dist/C_Editor2.js +1 -159
- package/dist/C_Editor2.js.map +1 -1
- package/dist/{C_FilePreview-B4XgTv-h.css.map → C_FilePreview-DHGlV4OR.css.map} +1 -1
- package/dist/C_FilePreview.cjs +1 -7
- package/dist/C_FilePreview.js +1 -4
- package/dist/C_FilePreview.js.map +1 -0
- package/dist/C_FilePreview2.js +1 -1031
- package/dist/C_FilePreview2.js.map +1 -1
- package/dist/{C_Form-DLb9FtAb.css.map → C_Form-CKHvXL3O.css.map} +1 -1
- package/dist/C_Form.cjs +1 -16
- package/dist/C_Form.js +1 -5
- package/dist/C_Form.js.map +1 -0
- package/dist/C_Form2.js +1 -2569
- package/dist/C_Form2.js.map +1 -1
- package/dist/{C_FormSearch-DlIEoh7X.css.map → C_FormSearch-DBNtnjaL.css.map} +1 -1
- package/dist/C_FormSearch.cjs +1 -6
- package/dist/C_FormSearch.js +1 -3
- package/dist/C_FormSearch.js.map +1 -0
- package/dist/C_FormSearch2.js +1 -355
- package/dist/C_FormSearch2.js.map +1 -1
- package/dist/C_FormulaEditor.cjs +1 -13
- package/dist/C_FormulaEditor.js +1 -4
- package/dist/C_FormulaEditor.js.map +1 -0
- package/dist/C_FormulaEditor2.js +1 -1432
- package/dist/C_FormulaEditor2.js.map +1 -1
- package/dist/C_FullCalendar-DLUdCtqf.css.map +1 -0
- package/dist/C_FullCalendar.cjs +1 -9
- package/dist/C_FullCalendar.js +1 -3
- package/dist/C_FullCalendar.js.map +1 -0
- package/dist/C_FullCalendar2.js +1 -376
- package/dist/C_FullCalendar2.js.map +1 -1
- package/dist/C_GlobalSearch.cjs +1 -5
- package/dist/C_GlobalSearch.js +1 -3
- package/dist/C_GlobalSearch.js.map +1 -0
- package/dist/C_GlobalSearch2.js +1 -335
- package/dist/C_GlobalSearch2.js.map +1 -1
- package/dist/C_Guide.cjs +1 -5
- package/dist/C_Guide.js +1 -4
- package/dist/C_Guide.js.map +1 -0
- package/dist/C_Guide2.js +1 -60
- package/dist/C_Guide2.js.map +1 -1
- package/dist/C_Icon.cjs +1 -4
- package/dist/C_Icon.js +1 -3
- package/dist/C_Icon.js.map +1 -0
- package/dist/C_Icon2.js +1 -285
- package/dist/C_Icon2.js.map +1 -1
- package/dist/C_ImageCropper.cjs +1 -6
- package/dist/C_ImageCropper.js +1 -4
- package/dist/C_ImageCropper.js.map +1 -0
- package/dist/C_ImageCropper2.js +1 -722
- package/dist/C_ImageCropper2.js.map +1 -1
- package/dist/C_Language.cjs +1 -5
- package/dist/C_Language.js +1 -4
- package/dist/C_Language.js.map +1 -0
- package/dist/C_Language2.js +1 -78
- package/dist/C_Language2.js.map +1 -1
- package/dist/C_Map.cjs +1 -7
- package/dist/C_Map.js +1 -3
- package/dist/C_Map.js.map +1 -0
- package/dist/C_Map2.js +1 -198
- package/dist/C_Map2.js.map +1 -1
- package/dist/{C_Markdown-C2uiBVSW.css.map → C_Markdown-BbTvdFCl.css.map} +1 -1
- package/dist/C_Markdown.cjs +1 -4
- package/dist/C_Markdown.js +1 -3
- package/dist/C_Markdown.js.map +1 -0
- package/dist/C_Markdown2.js +1 -185
- package/dist/C_Markdown2.js.map +1 -1
- package/dist/C_NotificationCenter.cjs +1 -20
- package/dist/C_NotificationCenter.js +1 -4
- package/dist/C_NotificationCenter.js.map +1 -0
- package/dist/C_NotificationCenter2.js +1 -1383
- package/dist/C_NotificationCenter2.js.map +1 -1
- package/dist/C_Progress.cjs +1 -4
- package/dist/C_Progress.js +1 -3
- package/dist/C_Progress.js.map +1 -0
- package/dist/C_Progress2.js +1 -102
- package/dist/C_Progress2.js.map +1 -1
- package/dist/C_QRCode.cjs +1 -5
- package/dist/C_QRCode.js +1 -3
- package/dist/C_QRCode.js.map +1 -0
- package/dist/C_QRCode2.js +1 -217
- package/dist/C_QRCode2.js.map +1 -1
- package/dist/C_Signature.cjs +1 -8
- package/dist/C_Signature.js +1 -4
- package/dist/C_Signature.js.map +1 -0
- package/dist/C_Signature2.js +1 -617
- package/dist/C_Signature2.js.map +1 -1
- package/dist/C_SplitPane.cjs +1 -6
- package/dist/C_SplitPane.js +1 -4
- package/dist/C_SplitPane.js.map +1 -0
- package/dist/C_SplitPane2.js +1 -355
- package/dist/C_SplitPane2.js.map +1 -1
- package/dist/C_Steps.cjs +1 -4
- package/dist/C_Steps.js +1 -3
- package/dist/C_Steps.js.map +1 -0
- package/dist/C_Steps2.js +1 -81
- package/dist/C_Steps2.js.map +1 -1
- package/dist/{C_Table-C55H4kPr.css.map → C_Table-tbUx-R4H.css.map} +1 -1
- package/dist/C_Table.cjs +1 -20
- package/dist/C_Table.js +1 -6
- package/dist/C_Table.js.map +1 -0
- package/dist/C_Table2.js +1 -3023
- package/dist/C_Table2.js.map +1 -1
- package/dist/C_Theme.cjs +1 -5
- package/dist/C_Theme.js +1 -4
- package/dist/C_Theme.js.map +1 -0
- package/dist/C_Theme2.js +1 -63
- package/dist/C_Theme2.js.map +1 -1
- package/dist/C_Time.cjs +1 -5
- package/dist/C_Time.js +1 -3
- package/dist/C_Time.js.map +1 -0
- package/dist/C_Time2.js +1 -198
- package/dist/C_Time2.js.map +1 -1
- package/dist/C_Tree.cjs +1 -7
- package/dist/C_Tree.js +1 -4
- package/dist/C_Tree.js.map +1 -0
- package/dist/C_Tree2.js +1 -440
- package/dist/C_Tree2.js.map +1 -1
- package/dist/C_Upload.cjs +1 -12
- package/dist/C_Upload.js +1 -4
- package/dist/C_Upload.js.map +1 -0
- package/dist/C_Upload2.js +2 -1365
- package/dist/C_Upload2.js.map +1 -1
- package/dist/C_VideoPlayer.cjs +1 -23
- package/dist/C_VideoPlayer.js +1 -3
- package/dist/C_VideoPlayer.js.map +1 -0
- package/dist/C_VideoPlayer2.js +3 -1932
- package/dist/C_VideoPlayer2.js.map +1 -1
- package/dist/C_VtableGantt.cjs +1 -6
- package/dist/C_VtableGantt.js +1 -4
- package/dist/C_VtableGantt.js.map +1 -0
- package/dist/C_VtableGantt2.js +1 -872
- package/dist/C_VtableGantt2.js.map +1 -1
- package/dist/C_WaterFall.cjs +1 -13
- package/dist/C_WaterFall.js +1 -3
- package/dist/C_WaterFall.js.map +1 -0
- package/dist/C_WaterFall2.js +1 -364
- package/dist/C_WaterFall2.js.map +1 -1
- package/dist/{C_WorkFlow-CSO86Cuc.css.map → C_WorkFlow-7F6op6qN.css.map} +1 -1
- package/dist/C_WorkFlow.cjs +1 -8
- package/dist/C_WorkFlow.js +1 -4
- package/dist/C_WorkFlow.js.map +1 -0
- package/dist/C_WorkFlow2.js +1 -1983
- package/dist/C_WorkFlow2.js.map +1 -1
- package/dist/chunk.js +1 -18
- package/dist/city.js +1 -4816
- package/dist/constants.d.ts +1 -1
- package/dist/constants2.d.ts +2 -2
- package/dist/constants4.d.ts +8 -8
- package/dist/constants5.d.ts +2 -2
- package/dist/data.d.ts +2 -2
- package/dist/export-helper.js +1 -9
- package/dist/index.cjs +2 -413
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1 -2
- package/dist/index.d.ts +1 -2
- package/dist/index.js +1 -231
- package/dist/index.js.map +1 -1
- package/dist/index.vue.d.ts +2 -2
- package/dist/index10.vue.d.ts +6 -6
- package/dist/index12.vue.d.ts +4 -4
- package/dist/index13.vue.d.ts +1 -1
- package/dist/index14.vue.d.ts +1 -1
- package/dist/index15.vue.d.ts +1 -1
- package/dist/index16.vue.d.ts +2 -2
- package/dist/index2.vue.d.ts +2 -2
- package/dist/index3.vue.d.ts +4 -4
- package/dist/index5.vue.d.ts +1 -1
- package/dist/index7.vue.d.ts +4 -4
- package/dist/index8.vue.d.ts +3 -3
- package/dist/index9.vue.d.ts +1 -1
- package/dist/resolver.cjs +2 -89
- package/dist/resolver.cjs.map +1 -0
- package/dist/resolver.js +1 -86
- package/dist/resolver.js.map +1 -1
- package/dist/storage.js +1 -30
- package/dist/storage.js.map +1 -1
- package/dist/style.css +447 -447
- package/dist/useCalendarEvents.d.ts +1 -1
- package/dist/useCollapsePanel.d.ts +2 -2
- package/dist/useCropperCore.d.ts +3 -3
- package/dist/useDraggableLayout.d.ts +9 -9
- package/dist/useDynamicFormState.d.ts +5 -5
- package/dist/useEdgeInteraction.d.ts +4 -12
- package/dist/useInfiniteScroll.d.ts +2 -2
- package/dist/useModalEdit.d.ts +45 -21
- package/dist/useQRCode.d.ts +3 -3
- package/dist/useSearchState.d.ts +2 -2
- package/dist/useSignatureHistory.d.ts +2 -2
- package/dist/useSplitResize.d.ts +6 -6
- package/dist/useTimeSelection.d.ts +2 -2
- package/dist/useTreeOperations.d.ts +6 -6
- package/dist/useWorkflowValidation.d.ts +3 -3
- package/package.json +1 -2
- package/dist/C_FullCalendar-BULCIlVK.css.map +0 -1
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants2.d.ts.map +0 -1
- package/dist/constants3.d.ts.map +0 -1
- package/dist/constants4.d.ts.map +0 -1
- package/dist/constants5.d.ts.map +0 -1
- package/dist/data.d.ts.map +0 -1
- package/dist/index.d.cts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.vue.d.ts.map +0 -1
- package/dist/index10.vue.d.ts.map +0 -1
- package/dist/index11.vue.d.ts.map +0 -1
- package/dist/index12.vue.d.ts.map +0 -1
- package/dist/index13.vue.d.ts.map +0 -1
- package/dist/index14.vue.d.ts.map +0 -1
- package/dist/index15.vue.d.ts.map +0 -1
- package/dist/index16.vue.d.ts.map +0 -1
- package/dist/index2.vue.d.ts.map +0 -1
- package/dist/index3.vue.d.ts.map +0 -1
- package/dist/index4.vue.d.ts.map +0 -1
- package/dist/index5.vue.d.ts.map +0 -1
- package/dist/index6.vue.d.ts.map +0 -1
- package/dist/index7.vue.d.ts.map +0 -1
- package/dist/index8.vue.d.ts.map +0 -1
- package/dist/index9.vue.d.ts.map +0 -1
- package/dist/resolver.d.cts.map +0 -1
- package/dist/resolver.d.ts.map +0 -1
- package/dist/useCalendarEvents.d.ts.map +0 -1
- package/dist/useCollapsePanel.d.ts.map +0 -1
- package/dist/useCropperCore.d.ts.map +0 -1
- package/dist/useDraggableLayout.d.ts.map +0 -1
- package/dist/useDynamicFormState.d.ts.map +0 -1
- package/dist/useEdgeInteraction.d.ts.map +0 -1
- package/dist/useFullscreen.d.ts.map +0 -1
- package/dist/useGlobalSearch.d.ts.map +0 -1
- package/dist/useInfiniteScroll.d.ts.map +0 -1
- package/dist/useModalEdit.d.ts.map +0 -1
- package/dist/useQRCode.d.ts.map +0 -1
- package/dist/useSearchState.d.ts.map +0 -1
- package/dist/useSignatureHistory.d.ts.map +0 -1
- package/dist/useSplitResize.d.ts.map +0 -1
- package/dist/useTimeSelection.d.ts.map +0 -1
- package/dist/useTreeOperations.d.ts.map +0 -1
- package/dist/useWorkflowValidation.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"C_Map.js","names":["height"],"sources":["../src/components/C_Map/data.ts","../src/components/C_Map/index.vue","../src/components/C_Map/index.vue","../src/components/C_Map/index.vue"],"sourcesContent":["export const MAP_TYPES = [\r\n { label: \"OpenStreetMap\", value: \"osm\" },\r\n { label: \"高德地图\", value: \"amap\" },\r\n] as const;\r\n\r\nexport type MapType = (typeof MAP_TYPES)[number][\"value\"];\r\n\r\nexport interface MapMarker {\r\n lat: number;\r\n lng: number;\r\n popup?: string;\r\n}\r\n\r\nexport interface MapConfig {\r\n height?: string;\r\n center?: [number, number];\r\n zoom?: number;\r\n markers?: MapMarker[];\r\n mapType?: MapType;\r\n amapKey?: string;\r\n}\r\n\r\nexport const DEFAULT_MAP_CONFIG: Required<\r\n Omit<MapConfig, \"markers\" | \"amapKey\">\r\n> = {\r\n height: \"400px\",\r\n center: [39.9042, 116.4074],\r\n zoom: 10,\r\n mapType: \"osm\",\r\n};\r\n\r\nexport const OSM_TILE_CONFIG = {\r\n url: \"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\",\r\n attribution: \"© OpenStreetMap contributors\",\r\n maxZoom: 19,\r\n minZoom: 1,\r\n tileSize: 256,\r\n detectRetina: true,\r\n} as const;\r\n\r\nexport const AMAP_CONFIG = {\r\n apiUrl: \"https://webapi.amap.com/maps?v=2.0&key=\",\r\n note: \"高德地图需要API Key,如需使用请申请:https://lbs.amap.com/api/javascript-api/guide/create/\",\r\n} as const;\r\n\r\nexport const MAP_ICONS = {\r\n iconRetinaUrl:\r\n \"https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-icon-2x.png\",\r\n iconUrl:\r\n \"https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-icon.png\",\r\n shadowUrl:\r\n \"https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-shadow.png\",\r\n} as const;\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-12-02\r\n * @Description: 地图组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-map\">\r\n <div\r\n ref=\"mapContainer\"\r\n class=\"map-container\"\r\n :style=\"{ height: height }\"\r\n ></div>\r\n <div v-if=\"loading\" class=\"map-loading\">\r\n <NSpin size=\"large\" />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, watch, nextTick, onMounted, onUnmounted } from \"vue\";\r\nimport { NSpin } from \"naive-ui\";\r\nimport L from \"leaflet\";\r\nimport \"leaflet/dist/leaflet.css\";\r\nimport { OSM_TILE_CONFIG, AMAP_CONFIG, MAP_ICONS } from \"./data\";\r\n\r\ndefineOptions({ name: \"C_Map\" });\r\n\r\ndelete (L.Icon.Default.prototype as any)._getIconUrl;\r\nL.Icon.Default.mergeOptions(MAP_ICONS);\r\n\r\ninterface MapMarker {\r\n lat: number;\r\n lng: number;\r\n popup?: string;\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n height?: string;\r\n center?: [number, number];\r\n zoom?: number;\r\n markers?: MapMarker[];\r\n mapType?: \"osm\" | \"amap\";\r\n amapKey?: string;\r\n }>(),\r\n {\r\n height: \"400px\",\r\n center: () => [39.9042, 116.4074],\r\n zoom: 10,\r\n markers: () => [],\r\n mapType: \"osm\",\r\n amapKey: \"\",\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n ready: [map: any];\r\n markerClick: [marker: MapMarker, event: any];\r\n}>();\r\n\r\nconst mapContainer = ref<HTMLElement>();\r\nconst loading = ref(true);\r\nlet map: any = null;\r\n\r\nconst initOSMMap = async () => {\r\n if (!mapContainer.value) return;\r\n try {\r\n mapContainer.value.innerHTML = \"\";\r\n map = L.map(mapContainer.value, {\r\n center: props.center,\r\n zoom: props.zoom,\r\n zoomControl: true,\r\n preferCanvas: true,\r\n });\r\n const tileLayer = L.tileLayer(OSM_TILE_CONFIG.url, OSM_TILE_CONFIG);\r\n tileLayer.addTo(map);\r\n addMarkers();\r\n await nextTick();\r\n requestAnimationFrame(() => {\r\n map?.invalidateSize({ reset: true, pan: false });\r\n });\r\n loading.value = false;\r\n emit(\"ready\", map);\r\n } catch (error) {\r\n console.error(\"OpenStreetMap初始化失败:\", error);\r\n loading.value = false;\r\n }\r\n};\r\n\r\nconst initAMap = async () => {\r\n if (!mapContainer.value || !props.amapKey) return;\r\n try {\r\n mapContainer.value.innerHTML = \"\";\r\n const script = document.createElement(\"script\");\r\n script.type = \"text/javascript\";\r\n script.src = `${AMAP_CONFIG.apiUrl}${props.amapKey}`;\r\n script.onload = () => {\r\n if ((window as any).AMap) {\r\n const amap = new (window as any).AMap.Map(mapContainer.value, {\r\n zoom: props.zoom,\r\n center: props.center,\r\n });\r\n addAMapMarkers(amap);\r\n loading.value = false;\r\n emit(\"ready\", amap);\r\n }\r\n };\r\n script.onerror = () => {\r\n loading.value = false;\r\n };\r\n document.head.appendChild(script);\r\n } catch {\r\n loading.value = false;\r\n }\r\n};\r\n\r\nconst addMarkers = () => {\r\n if (!map || props.mapType !== \"osm\" || !props.markers) return;\r\n map.eachLayer((layer: any) => {\r\n if (layer instanceof L.Marker) {\r\n map.removeLayer(layer);\r\n }\r\n });\r\n props.markers.forEach((marker) => {\r\n const leafletMarker = L.marker([marker.lat, marker.lng]);\r\n if (marker.popup) {\r\n leafletMarker.bindPopup(marker.popup);\r\n leafletMarker.on(\"click\", (event: any) => {\r\n emit(\"markerClick\", marker, event);\r\n });\r\n }\r\n leafletMarker.addTo(map);\r\n });\r\n};\r\n\r\nconst addAMapMarkers = (amap: any) => {\r\n if (!amap || props.mapType !== \"amap\" || !props.markers) return;\r\n props.markers.forEach((marker) => {\r\n const amapMarker = new (window as any).AMap.Marker({\r\n position: [marker.lat, marker.lng],\r\n title: marker.popup || \"\",\r\n });\r\n if (marker.popup) {\r\n const infoWindow = new (window as any).AMap.InfoWindow({\r\n content: marker.popup,\r\n offset: new (window as any).AMap.Pixel(0, -30),\r\n });\r\n amapMarker.on(\"click\", () => {\r\n infoWindow.open(amap, amapMarker.getPosition());\r\n emit(\"markerClick\", marker, null);\r\n });\r\n }\r\n amapMarker.setMap(amap);\r\n });\r\n};\r\n\r\nwatch(\r\n () => props.markers,\r\n () => {\r\n if (map && props.mapType === \"osm\") addMarkers();\r\n },\r\n { deep: true },\r\n);\r\n\r\nwatch(\r\n () => props.mapType,\r\n async (newType, oldType) => {\r\n if (newType === oldType) return;\r\n if (map) {\r\n map.remove();\r\n map = null;\r\n loading.value = true;\r\n await nextTick();\r\n if (newType === \"amap\" && props.amapKey) await initAMap();\r\n else await initOSMMap();\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n [() => props.center, () => props.zoom],\r\n () => {\r\n if (map) map.setView(props.center, props.zoom);\r\n },\r\n { deep: true },\r\n);\r\n\r\nonMounted(async () => {\r\n await nextTick();\r\n if (props.mapType === \"amap\" && props.amapKey) await initAMap();\r\n else await initOSMMap();\r\n});\r\n\r\nonUnmounted(() => {\r\n if (map) {\r\n map.remove();\r\n map = null;\r\n }\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-12-02\r\n * @Description: 地图组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-map\">\r\n <div\r\n ref=\"mapContainer\"\r\n class=\"map-container\"\r\n :style=\"{ height: height }\"\r\n ></div>\r\n <div v-if=\"loading\" class=\"map-loading\">\r\n <NSpin size=\"large\" />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, watch, nextTick, onMounted, onUnmounted } from \"vue\";\r\nimport { NSpin } from \"naive-ui\";\r\nimport L from \"leaflet\";\r\nimport \"leaflet/dist/leaflet.css\";\r\nimport { OSM_TILE_CONFIG, AMAP_CONFIG, MAP_ICONS } from \"./data\";\r\n\r\ndefineOptions({ name: \"C_Map\" });\r\n\r\ndelete (L.Icon.Default.prototype as any)._getIconUrl;\r\nL.Icon.Default.mergeOptions(MAP_ICONS);\r\n\r\ninterface MapMarker {\r\n lat: number;\r\n lng: number;\r\n popup?: string;\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n height?: string;\r\n center?: [number, number];\r\n zoom?: number;\r\n markers?: MapMarker[];\r\n mapType?: \"osm\" | \"amap\";\r\n amapKey?: string;\r\n }>(),\r\n {\r\n height: \"400px\",\r\n center: () => [39.9042, 116.4074],\r\n zoom: 10,\r\n markers: () => [],\r\n mapType: \"osm\",\r\n amapKey: \"\",\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n ready: [map: any];\r\n markerClick: [marker: MapMarker, event: any];\r\n}>();\r\n\r\nconst mapContainer = ref<HTMLElement>();\r\nconst loading = ref(true);\r\nlet map: any = null;\r\n\r\nconst initOSMMap = async () => {\r\n if (!mapContainer.value) return;\r\n try {\r\n mapContainer.value.innerHTML = \"\";\r\n map = L.map(mapContainer.value, {\r\n center: props.center,\r\n zoom: props.zoom,\r\n zoomControl: true,\r\n preferCanvas: true,\r\n });\r\n const tileLayer = L.tileLayer(OSM_TILE_CONFIG.url, OSM_TILE_CONFIG);\r\n tileLayer.addTo(map);\r\n addMarkers();\r\n await nextTick();\r\n requestAnimationFrame(() => {\r\n map?.invalidateSize({ reset: true, pan: false });\r\n });\r\n loading.value = false;\r\n emit(\"ready\", map);\r\n } catch (error) {\r\n console.error(\"OpenStreetMap初始化失败:\", error);\r\n loading.value = false;\r\n }\r\n};\r\n\r\nconst initAMap = async () => {\r\n if (!mapContainer.value || !props.amapKey) return;\r\n try {\r\n mapContainer.value.innerHTML = \"\";\r\n const script = document.createElement(\"script\");\r\n script.type = \"text/javascript\";\r\n script.src = `${AMAP_CONFIG.apiUrl}${props.amapKey}`;\r\n script.onload = () => {\r\n if ((window as any).AMap) {\r\n const amap = new (window as any).AMap.Map(mapContainer.value, {\r\n zoom: props.zoom,\r\n center: props.center,\r\n });\r\n addAMapMarkers(amap);\r\n loading.value = false;\r\n emit(\"ready\", amap);\r\n }\r\n };\r\n script.onerror = () => {\r\n loading.value = false;\r\n };\r\n document.head.appendChild(script);\r\n } catch {\r\n loading.value = false;\r\n }\r\n};\r\n\r\nconst addMarkers = () => {\r\n if (!map || props.mapType !== \"osm\" || !props.markers) return;\r\n map.eachLayer((layer: any) => {\r\n if (layer instanceof L.Marker) {\r\n map.removeLayer(layer);\r\n }\r\n });\r\n props.markers.forEach((marker) => {\r\n const leafletMarker = L.marker([marker.lat, marker.lng]);\r\n if (marker.popup) {\r\n leafletMarker.bindPopup(marker.popup);\r\n leafletMarker.on(\"click\", (event: any) => {\r\n emit(\"markerClick\", marker, event);\r\n });\r\n }\r\n leafletMarker.addTo(map);\r\n });\r\n};\r\n\r\nconst addAMapMarkers = (amap: any) => {\r\n if (!amap || props.mapType !== \"amap\" || !props.markers) return;\r\n props.markers.forEach((marker) => {\r\n const amapMarker = new (window as any).AMap.Marker({\r\n position: [marker.lat, marker.lng],\r\n title: marker.popup || \"\",\r\n });\r\n if (marker.popup) {\r\n const infoWindow = new (window as any).AMap.InfoWindow({\r\n content: marker.popup,\r\n offset: new (window as any).AMap.Pixel(0, -30),\r\n });\r\n amapMarker.on(\"click\", () => {\r\n infoWindow.open(amap, amapMarker.getPosition());\r\n emit(\"markerClick\", marker, null);\r\n });\r\n }\r\n amapMarker.setMap(amap);\r\n });\r\n};\r\n\r\nwatch(\r\n () => props.markers,\r\n () => {\r\n if (map && props.mapType === \"osm\") addMarkers();\r\n },\r\n { deep: true },\r\n);\r\n\r\nwatch(\r\n () => props.mapType,\r\n async (newType, oldType) => {\r\n if (newType === oldType) return;\r\n if (map) {\r\n map.remove();\r\n map = null;\r\n loading.value = true;\r\n await nextTick();\r\n if (newType === \"amap\" && props.amapKey) await initAMap();\r\n else await initOSMMap();\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n [() => props.center, () => props.zoom],\r\n () => {\r\n if (map) map.setView(props.center, props.zoom);\r\n },\r\n { deep: true },\r\n);\r\n\r\nonMounted(async () => {\r\n await nextTick();\r\n if (props.mapType === \"amap\" && props.amapKey) await initAMap();\r\n else await initOSMMap();\r\n});\r\n\r\nonUnmounted(() => {\r\n if (map) {\r\n map.remove();\r\n map = null;\r\n }\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-12-02\r\n * @Description: 地图组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-map\">\r\n <div\r\n ref=\"mapContainer\"\r\n class=\"map-container\"\r\n :style=\"{ height: height }\"\r\n ></div>\r\n <div v-if=\"loading\" class=\"map-loading\">\r\n <NSpin size=\"large\" />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, watch, nextTick, onMounted, onUnmounted } from \"vue\";\r\nimport { NSpin } from \"naive-ui\";\r\nimport L from \"leaflet\";\r\nimport \"leaflet/dist/leaflet.css\";\r\nimport { OSM_TILE_CONFIG, AMAP_CONFIG, MAP_ICONS } from \"./data\";\r\n\r\ndefineOptions({ name: \"C_Map\" });\r\n\r\ndelete (L.Icon.Default.prototype as any)._getIconUrl;\r\nL.Icon.Default.mergeOptions(MAP_ICONS);\r\n\r\ninterface MapMarker {\r\n lat: number;\r\n lng: number;\r\n popup?: string;\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n height?: string;\r\n center?: [number, number];\r\n zoom?: number;\r\n markers?: MapMarker[];\r\n mapType?: \"osm\" | \"amap\";\r\n amapKey?: string;\r\n }>(),\r\n {\r\n height: \"400px\",\r\n center: () => [39.9042, 116.4074],\r\n zoom: 10,\r\n markers: () => [],\r\n mapType: \"osm\",\r\n amapKey: \"\",\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n ready: [map: any];\r\n markerClick: [marker: MapMarker, event: any];\r\n}>();\r\n\r\nconst mapContainer = ref<HTMLElement>();\r\nconst loading = ref(true);\r\nlet map: any = null;\r\n\r\nconst initOSMMap = async () => {\r\n if (!mapContainer.value) return;\r\n try {\r\n mapContainer.value.innerHTML = \"\";\r\n map = L.map(mapContainer.value, {\r\n center: props.center,\r\n zoom: props.zoom,\r\n zoomControl: true,\r\n preferCanvas: true,\r\n });\r\n const tileLayer = L.tileLayer(OSM_TILE_CONFIG.url, OSM_TILE_CONFIG);\r\n tileLayer.addTo(map);\r\n addMarkers();\r\n await nextTick();\r\n requestAnimationFrame(() => {\r\n map?.invalidateSize({ reset: true, pan: false });\r\n });\r\n loading.value = false;\r\n emit(\"ready\", map);\r\n } catch (error) {\r\n console.error(\"OpenStreetMap初始化失败:\", error);\r\n loading.value = false;\r\n }\r\n};\r\n\r\nconst initAMap = async () => {\r\n if (!mapContainer.value || !props.amapKey) return;\r\n try {\r\n mapContainer.value.innerHTML = \"\";\r\n const script = document.createElement(\"script\");\r\n script.type = \"text/javascript\";\r\n script.src = `${AMAP_CONFIG.apiUrl}${props.amapKey}`;\r\n script.onload = () => {\r\n if ((window as any).AMap) {\r\n const amap = new (window as any).AMap.Map(mapContainer.value, {\r\n zoom: props.zoom,\r\n center: props.center,\r\n });\r\n addAMapMarkers(amap);\r\n loading.value = false;\r\n emit(\"ready\", amap);\r\n }\r\n };\r\n script.onerror = () => {\r\n loading.value = false;\r\n };\r\n document.head.appendChild(script);\r\n } catch {\r\n loading.value = false;\r\n }\r\n};\r\n\r\nconst addMarkers = () => {\r\n if (!map || props.mapType !== \"osm\" || !props.markers) return;\r\n map.eachLayer((layer: any) => {\r\n if (layer instanceof L.Marker) {\r\n map.removeLayer(layer);\r\n }\r\n });\r\n props.markers.forEach((marker) => {\r\n const leafletMarker = L.marker([marker.lat, marker.lng]);\r\n if (marker.popup) {\r\n leafletMarker.bindPopup(marker.popup);\r\n leafletMarker.on(\"click\", (event: any) => {\r\n emit(\"markerClick\", marker, event);\r\n });\r\n }\r\n leafletMarker.addTo(map);\r\n });\r\n};\r\n\r\nconst addAMapMarkers = (amap: any) => {\r\n if (!amap || props.mapType !== \"amap\" || !props.markers) return;\r\n props.markers.forEach((marker) => {\r\n const amapMarker = new (window as any).AMap.Marker({\r\n position: [marker.lat, marker.lng],\r\n title: marker.popup || \"\",\r\n });\r\n if (marker.popup) {\r\n const infoWindow = new (window as any).AMap.InfoWindow({\r\n content: marker.popup,\r\n offset: new (window as any).AMap.Pixel(0, -30),\r\n });\r\n amapMarker.on(\"click\", () => {\r\n infoWindow.open(amap, amapMarker.getPosition());\r\n emit(\"markerClick\", marker, null);\r\n });\r\n }\r\n amapMarker.setMap(amap);\r\n });\r\n};\r\n\r\nwatch(\r\n () => props.markers,\r\n () => {\r\n if (map && props.mapType === \"osm\") addMarkers();\r\n },\r\n { deep: true },\r\n);\r\n\r\nwatch(\r\n () => props.mapType,\r\n async (newType, oldType) => {\r\n if (newType === oldType) return;\r\n if (map) {\r\n map.remove();\r\n map = null;\r\n loading.value = true;\r\n await nextTick();\r\n if (newType === \"amap\" && props.amapKey) await initAMap();\r\n else await initOSMMap();\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n [() => props.center, () => props.zoom],\r\n () => {\r\n if (map) map.setView(props.center, props.zoom);\r\n },\r\n { deep: true },\r\n);\r\n\r\nonMounted(async () => {\r\n await nextTick();\r\n if (props.mapType === \"amap\" && props.amapKey) await initAMap();\r\n else await initOSMMap();\r\n});\r\n\r\nonUnmounted(() => {\r\n if (map) {\r\n map.remove();\r\n map = null;\r\n }\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n"],"mappings":"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"}
|
package/dist/C_Map2.js
CHANGED
|
@@ -1,199 +1,2 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { NSpin } from "naive-ui";
|
|
3
|
-
import { createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, nextTick, normalizeStyle, onMounted, onUnmounted, openBlock, ref, unref, watch } from "vue";
|
|
4
|
-
import L from "leaflet";
|
|
5
|
-
import "leaflet/dist/leaflet.css";
|
|
6
|
-
|
|
7
|
-
//#region src/components/C_Map/data.ts
|
|
8
|
-
const MAP_TYPES = [{
|
|
9
|
-
label: "OpenStreetMap",
|
|
10
|
-
value: "osm"
|
|
11
|
-
}, {
|
|
12
|
-
label: "高德地图",
|
|
13
|
-
value: "amap"
|
|
14
|
-
}];
|
|
15
|
-
const DEFAULT_MAP_CONFIG = {
|
|
16
|
-
height: "400px",
|
|
17
|
-
center: [39.9042, 116.4074],
|
|
18
|
-
zoom: 10,
|
|
19
|
-
mapType: "osm"
|
|
20
|
-
};
|
|
21
|
-
const OSM_TILE_CONFIG = {
|
|
22
|
-
url: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
|
|
23
|
-
attribution: "© OpenStreetMap contributors",
|
|
24
|
-
maxZoom: 19,
|
|
25
|
-
minZoom: 1,
|
|
26
|
-
tileSize: 256,
|
|
27
|
-
detectRetina: true
|
|
28
|
-
};
|
|
29
|
-
const AMAP_CONFIG = {
|
|
30
|
-
apiUrl: "https://webapi.amap.com/maps?v=2.0&key=",
|
|
31
|
-
note: "高德地图需要API Key,如需使用请申请:https://lbs.amap.com/api/javascript-api/guide/create/"
|
|
32
|
-
};
|
|
33
|
-
const MAP_ICONS = {
|
|
34
|
-
iconRetinaUrl: "https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-icon-2x.png",
|
|
35
|
-
iconUrl: "https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-icon.png",
|
|
36
|
-
shadowUrl: "https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-shadow.png"
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
//#endregion
|
|
40
|
-
//#region src/components/C_Map/index.vue?vue&type=script&setup=true&lang.ts
|
|
41
|
-
const _hoisted_1 = { class: "c-map" };
|
|
42
|
-
const _hoisted_2 = {
|
|
43
|
-
key: 0,
|
|
44
|
-
class: "map-loading"
|
|
45
|
-
};
|
|
46
|
-
var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
|
|
47
|
-
name: "C_Map",
|
|
48
|
-
__name: "index",
|
|
49
|
-
props: {
|
|
50
|
-
height: { default: "400px" },
|
|
51
|
-
center: { default: () => [39.9042, 116.4074] },
|
|
52
|
-
zoom: { default: 10 },
|
|
53
|
-
markers: { default: () => [] },
|
|
54
|
-
mapType: { default: "osm" },
|
|
55
|
-
amapKey: { default: "" }
|
|
56
|
-
},
|
|
57
|
-
emits: ["ready", "markerClick"],
|
|
58
|
-
setup(__props, { emit: __emit }) {
|
|
59
|
-
delete L.Icon.Default.prototype._getIconUrl;
|
|
60
|
-
L.Icon.Default.mergeOptions(MAP_ICONS);
|
|
61
|
-
const props = __props;
|
|
62
|
-
const emit = __emit;
|
|
63
|
-
const mapContainer = ref();
|
|
64
|
-
const loading = ref(true);
|
|
65
|
-
let map = null;
|
|
66
|
-
const initOSMMap = async () => {
|
|
67
|
-
if (!mapContainer.value) return;
|
|
68
|
-
try {
|
|
69
|
-
mapContainer.value.innerHTML = "";
|
|
70
|
-
map = L.map(mapContainer.value, {
|
|
71
|
-
center: props.center,
|
|
72
|
-
zoom: props.zoom,
|
|
73
|
-
zoomControl: true,
|
|
74
|
-
preferCanvas: true
|
|
75
|
-
});
|
|
76
|
-
L.tileLayer(OSM_TILE_CONFIG.url, OSM_TILE_CONFIG).addTo(map);
|
|
77
|
-
addMarkers();
|
|
78
|
-
await nextTick();
|
|
79
|
-
requestAnimationFrame(() => {
|
|
80
|
-
map?.invalidateSize({
|
|
81
|
-
reset: true,
|
|
82
|
-
pan: false
|
|
83
|
-
});
|
|
84
|
-
});
|
|
85
|
-
loading.value = false;
|
|
86
|
-
emit("ready", map);
|
|
87
|
-
} catch (error) {
|
|
88
|
-
console.error("OpenStreetMap初始化失败:", error);
|
|
89
|
-
loading.value = false;
|
|
90
|
-
}
|
|
91
|
-
};
|
|
92
|
-
const initAMap = async () => {
|
|
93
|
-
if (!mapContainer.value || !props.amapKey) return;
|
|
94
|
-
try {
|
|
95
|
-
mapContainer.value.innerHTML = "";
|
|
96
|
-
const script = document.createElement("script");
|
|
97
|
-
script.type = "text/javascript";
|
|
98
|
-
script.src = `${AMAP_CONFIG.apiUrl}${props.amapKey}`;
|
|
99
|
-
script.onload = () => {
|
|
100
|
-
if (window.AMap) {
|
|
101
|
-
const amap = new window.AMap.Map(mapContainer.value, {
|
|
102
|
-
zoom: props.zoom,
|
|
103
|
-
center: props.center
|
|
104
|
-
});
|
|
105
|
-
addAMapMarkers(amap);
|
|
106
|
-
loading.value = false;
|
|
107
|
-
emit("ready", amap);
|
|
108
|
-
}
|
|
109
|
-
};
|
|
110
|
-
script.onerror = () => {
|
|
111
|
-
loading.value = false;
|
|
112
|
-
};
|
|
113
|
-
document.head.appendChild(script);
|
|
114
|
-
} catch {
|
|
115
|
-
loading.value = false;
|
|
116
|
-
}
|
|
117
|
-
};
|
|
118
|
-
const addMarkers = () => {
|
|
119
|
-
if (!map || props.mapType !== "osm" || !props.markers) return;
|
|
120
|
-
map.eachLayer((layer) => {
|
|
121
|
-
if (layer instanceof L.Marker) map.removeLayer(layer);
|
|
122
|
-
});
|
|
123
|
-
props.markers.forEach((marker) => {
|
|
124
|
-
const leafletMarker = L.marker([marker.lat, marker.lng]);
|
|
125
|
-
if (marker.popup) {
|
|
126
|
-
leafletMarker.bindPopup(marker.popup);
|
|
127
|
-
leafletMarker.on("click", (event) => {
|
|
128
|
-
emit("markerClick", marker, event);
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
leafletMarker.addTo(map);
|
|
132
|
-
});
|
|
133
|
-
};
|
|
134
|
-
const addAMapMarkers = (amap) => {
|
|
135
|
-
if (!amap || props.mapType !== "amap" || !props.markers) return;
|
|
136
|
-
props.markers.forEach((marker) => {
|
|
137
|
-
const amapMarker = new window.AMap.Marker({
|
|
138
|
-
position: [marker.lat, marker.lng],
|
|
139
|
-
title: marker.popup || ""
|
|
140
|
-
});
|
|
141
|
-
if (marker.popup) {
|
|
142
|
-
const infoWindow = new window.AMap.InfoWindow({
|
|
143
|
-
content: marker.popup,
|
|
144
|
-
offset: new window.AMap.Pixel(0, -30)
|
|
145
|
-
});
|
|
146
|
-
amapMarker.on("click", () => {
|
|
147
|
-
infoWindow.open(amap, amapMarker.getPosition());
|
|
148
|
-
emit("markerClick", marker, null);
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
amapMarker.setMap(amap);
|
|
152
|
-
});
|
|
153
|
-
};
|
|
154
|
-
watch(() => props.markers, () => {
|
|
155
|
-
if (map && props.mapType === "osm") addMarkers();
|
|
156
|
-
}, { deep: true });
|
|
157
|
-
watch(() => props.mapType, async (newType, oldType) => {
|
|
158
|
-
if (newType === oldType) return;
|
|
159
|
-
if (map) {
|
|
160
|
-
map.remove();
|
|
161
|
-
map = null;
|
|
162
|
-
loading.value = true;
|
|
163
|
-
await nextTick();
|
|
164
|
-
if (newType === "amap" && props.amapKey) await initAMap();
|
|
165
|
-
else await initOSMMap();
|
|
166
|
-
}
|
|
167
|
-
});
|
|
168
|
-
watch([() => props.center, () => props.zoom], () => {
|
|
169
|
-
if (map) map.setView(props.center, props.zoom);
|
|
170
|
-
}, { deep: true });
|
|
171
|
-
onMounted(async () => {
|
|
172
|
-
await nextTick();
|
|
173
|
-
if (props.mapType === "amap" && props.amapKey) await initAMap();
|
|
174
|
-
else await initOSMMap();
|
|
175
|
-
});
|
|
176
|
-
onUnmounted(() => {
|
|
177
|
-
if (map) {
|
|
178
|
-
map.remove();
|
|
179
|
-
map = null;
|
|
180
|
-
}
|
|
181
|
-
});
|
|
182
|
-
return (_ctx, _cache) => {
|
|
183
|
-
return openBlock(), createElementBlock("div", _hoisted_1, [createElementVNode("div", {
|
|
184
|
-
ref_key: "mapContainer",
|
|
185
|
-
ref: mapContainer,
|
|
186
|
-
class: "map-container",
|
|
187
|
-
style: normalizeStyle({ height: _ctx.height })
|
|
188
|
-
}, null, 4), loading.value ? (openBlock(), createElementBlock("div", _hoisted_2, [createVNode(unref(NSpin), { size: "large" })])) : createCommentVNode("v-if", true)]);
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
//#endregion
|
|
194
|
-
//#region src/components/C_Map/index.vue
|
|
195
|
-
var C_Map_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-a3602506"]]);
|
|
196
|
-
|
|
197
|
-
//#endregion
|
|
198
|
-
export { OSM_TILE_CONFIG as i, DEFAULT_MAP_CONFIG as n, MAP_TYPES as r, C_Map_default as t };
|
|
1
|
+
import{t as e}from"./export-helper.js";import{NSpin as t}from"naive-ui";import{createCommentVNode as n,createElementBlock as r,createElementVNode as i,createVNode as a,defineComponent as o,nextTick as s,normalizeStyle as c,onMounted as l,onUnmounted as u,openBlock as d,ref as f,unref as p,watch as m}from"vue";import h from"leaflet";import"leaflet/dist/leaflet.css";const g=[{label:`OpenStreetMap`,value:`osm`},{label:`高德地图`,value:`amap`}],_={height:`400px`,center:[39.9042,116.4074],zoom:10,mapType:`osm`},v={url:`https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png`,attribution:`© OpenStreetMap contributors`,maxZoom:19,minZoom:1,tileSize:256,detectRetina:!0},y={apiUrl:`https://webapi.amap.com/maps?v=2.0&key=`,note:`高德地图需要API Key,如需使用请申请:https://lbs.amap.com/api/javascript-api/guide/create/`},b={iconRetinaUrl:`https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-icon-2x.png`,iconUrl:`https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-icon.png`,shadowUrl:`https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-shadow.png`},x={class:`c-map`},S={key:0,class:`map-loading`};var C=e(o({name:`C_Map`,__name:`index`,props:{height:{default:`400px`},center:{default:()=>[39.9042,116.4074]},zoom:{default:10},markers:{default:()=>[]},mapType:{default:`osm`},amapKey:{default:``}},emits:[`ready`,`markerClick`],setup(e,{emit:o}){delete h.Icon.Default.prototype._getIconUrl,h.Icon.Default.mergeOptions(b);let g=e,_=o,C=f(),w=f(!0),T=null,E=async()=>{if(C.value)try{C.value.innerHTML=``,T=h.map(C.value,{center:g.center,zoom:g.zoom,zoomControl:!0,preferCanvas:!0}),h.tileLayer(v.url,v).addTo(T),O(),await s(),requestAnimationFrame(()=>{T?.invalidateSize({reset:!0,pan:!1})}),w.value=!1,_(`ready`,T)}catch(e){console.error(`OpenStreetMap初始化失败:`,e),w.value=!1}},D=async()=>{if(!(!C.value||!g.amapKey))try{C.value.innerHTML=``;let e=document.createElement(`script`);e.type=`text/javascript`,e.src=`${y.apiUrl}${g.amapKey}`,e.onload=()=>{if(window.AMap){let e=new window.AMap.Map(C.value,{zoom:g.zoom,center:g.center});k(e),w.value=!1,_(`ready`,e)}},e.onerror=()=>{w.value=!1},document.head.appendChild(e)}catch{w.value=!1}},O=()=>{!T||g.mapType!==`osm`||!g.markers||(T.eachLayer(e=>{e instanceof h.Marker&&T.removeLayer(e)}),g.markers.forEach(e=>{let t=h.marker([e.lat,e.lng]);e.popup&&(t.bindPopup(e.popup),t.on(`click`,t=>{_(`markerClick`,e,t)})),t.addTo(T)}))},k=e=>{!e||g.mapType!==`amap`||!g.markers||g.markers.forEach(t=>{let n=new window.AMap.Marker({position:[t.lat,t.lng],title:t.popup||``});if(t.popup){let r=new window.AMap.InfoWindow({content:t.popup,offset:new window.AMap.Pixel(0,-30)});n.on(`click`,()=>{r.open(e,n.getPosition()),_(`markerClick`,t,null)})}n.setMap(e)})};return m(()=>g.markers,()=>{T&&g.mapType===`osm`&&O()},{deep:!0}),m(()=>g.mapType,async(e,t)=>{e!==t&&T&&(T.remove(),T=null,w.value=!0,await s(),e===`amap`&&g.amapKey?await D():await E())}),m([()=>g.center,()=>g.zoom],()=>{T&&T.setView(g.center,g.zoom)},{deep:!0}),l(async()=>{await s(),g.mapType===`amap`&&g.amapKey?await D():await E()}),u(()=>{T&&=(T.remove(),null)}),(e,o)=>(d(),r(`div`,x,[i(`div`,{ref_key:`mapContainer`,ref:C,class:`map-container`,style:c({height:e.height})},null,4),w.value?(d(),r(`div`,S,[a(p(t),{size:`large`})])):n(`v-if`,!0)]))}}),[[`__scopeId`,`data-v-a3602506`]]);export{v as i,_ as n,g as r,C as t};
|
|
199
2
|
//# sourceMappingURL=C_Map2.js.map
|
package/dist/C_Map2.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"C_Map2.js","names":["height"],"sources":["../src/components/C_Map/data.ts","../src/components/C_Map/index.vue","../src/components/C_Map/index.vue","../src/components/C_Map/index.vue"],"sourcesContent":["export const MAP_TYPES = [\r\n { label: \"OpenStreetMap\", value: \"osm\" },\r\n { label: \"高德地图\", value: \"amap\" },\r\n] as const;\r\n\r\nexport type MapType = (typeof MAP_TYPES)[number][\"value\"];\r\n\r\nexport interface MapMarker {\r\n lat: number;\r\n lng: number;\r\n popup?: string;\r\n}\r\n\r\nexport interface MapConfig {\r\n height?: string;\r\n center?: [number, number];\r\n zoom?: number;\r\n markers?: MapMarker[];\r\n mapType?: MapType;\r\n amapKey?: string;\r\n}\r\n\r\nexport const DEFAULT_MAP_CONFIG: Required<\r\n Omit<MapConfig, \"markers\" | \"amapKey\">\r\n> = {\r\n height: \"400px\",\r\n center: [39.9042, 116.4074],\r\n zoom: 10,\r\n mapType: \"osm\",\r\n};\r\n\r\nexport const OSM_TILE_CONFIG = {\r\n url: \"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\",\r\n attribution: \"© OpenStreetMap contributors\",\r\n maxZoom: 19,\r\n minZoom: 1,\r\n tileSize: 256,\r\n detectRetina: true,\r\n} as const;\r\n\r\nexport const AMAP_CONFIG = {\r\n apiUrl: \"https://webapi.amap.com/maps?v=2.0&key=\",\r\n note: \"高德地图需要API Key,如需使用请申请:https://lbs.amap.com/api/javascript-api/guide/create/\",\r\n} as const;\r\n\r\nexport const MAP_ICONS = {\r\n iconRetinaUrl:\r\n \"https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-icon-2x.png\",\r\n iconUrl:\r\n \"https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-icon.png\",\r\n shadowUrl:\r\n \"https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-shadow.png\",\r\n} as const;\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-12-02\r\n * @Description: 地图组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-map\">\r\n <div\r\n ref=\"mapContainer\"\r\n class=\"map-container\"\r\n :style=\"{ height: height }\"\r\n ></div>\r\n <div v-if=\"loading\" class=\"map-loading\">\r\n <NSpin size=\"large\" />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, watch, nextTick, onMounted, onUnmounted } from \"vue\";\r\nimport { NSpin } from \"naive-ui\";\r\nimport L from \"leaflet\";\r\nimport \"leaflet/dist/leaflet.css\";\r\nimport { OSM_TILE_CONFIG, AMAP_CONFIG, MAP_ICONS } from \"./data\";\r\n\r\ndefineOptions({ name: \"C_Map\" });\r\n\r\ndelete (L.Icon.Default.prototype as any)._getIconUrl;\r\nL.Icon.Default.mergeOptions(MAP_ICONS);\r\n\r\ninterface MapMarker {\r\n lat: number;\r\n lng: number;\r\n popup?: string;\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n height?: string;\r\n center?: [number, number];\r\n zoom?: number;\r\n markers?: MapMarker[];\r\n mapType?: \"osm\" | \"amap\";\r\n amapKey?: string;\r\n }>(),\r\n {\r\n height: \"400px\",\r\n center: () => [39.9042, 116.4074],\r\n zoom: 10,\r\n markers: () => [],\r\n mapType: \"osm\",\r\n amapKey: \"\",\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n ready: [map: any];\r\n markerClick: [marker: MapMarker, event: any];\r\n}>();\r\n\r\nconst mapContainer = ref<HTMLElement>();\r\nconst loading = ref(true);\r\nlet map: any = null;\r\n\r\nconst initOSMMap = async () => {\r\n if (!mapContainer.value) return;\r\n try {\r\n mapContainer.value.innerHTML = \"\";\r\n map = L.map(mapContainer.value, {\r\n center: props.center,\r\n zoom: props.zoom,\r\n zoomControl: true,\r\n preferCanvas: true,\r\n });\r\n const tileLayer = L.tileLayer(OSM_TILE_CONFIG.url, OSM_TILE_CONFIG);\r\n tileLayer.addTo(map);\r\n addMarkers();\r\n await nextTick();\r\n requestAnimationFrame(() => {\r\n map?.invalidateSize({ reset: true, pan: false });\r\n });\r\n loading.value = false;\r\n emit(\"ready\", map);\r\n } catch (error) {\r\n console.error(\"OpenStreetMap初始化失败:\", error);\r\n loading.value = false;\r\n }\r\n};\r\n\r\nconst initAMap = async () => {\r\n if (!mapContainer.value || !props.amapKey) return;\r\n try {\r\n mapContainer.value.innerHTML = \"\";\r\n const script = document.createElement(\"script\");\r\n script.type = \"text/javascript\";\r\n script.src = `${AMAP_CONFIG.apiUrl}${props.amapKey}`;\r\n script.onload = () => {\r\n if ((window as any).AMap) {\r\n const amap = new (window as any).AMap.Map(mapContainer.value, {\r\n zoom: props.zoom,\r\n center: props.center,\r\n });\r\n addAMapMarkers(amap);\r\n loading.value = false;\r\n emit(\"ready\", amap);\r\n }\r\n };\r\n script.onerror = () => {\r\n loading.value = false;\r\n };\r\n document.head.appendChild(script);\r\n } catch {\r\n loading.value = false;\r\n }\r\n};\r\n\r\nconst addMarkers = () => {\r\n if (!map || props.mapType !== \"osm\" || !props.markers) return;\r\n map.eachLayer((layer: any) => {\r\n if (layer instanceof L.Marker) {\r\n map.removeLayer(layer);\r\n }\r\n });\r\n props.markers.forEach((marker) => {\r\n const leafletMarker = L.marker([marker.lat, marker.lng]);\r\n if (marker.popup) {\r\n leafletMarker.bindPopup(marker.popup);\r\n leafletMarker.on(\"click\", (event: any) => {\r\n emit(\"markerClick\", marker, event);\r\n });\r\n }\r\n leafletMarker.addTo(map);\r\n });\r\n};\r\n\r\nconst addAMapMarkers = (amap: any) => {\r\n if (!amap || props.mapType !== \"amap\" || !props.markers) return;\r\n props.markers.forEach((marker) => {\r\n const amapMarker = new (window as any).AMap.Marker({\r\n position: [marker.lat, marker.lng],\r\n title: marker.popup || \"\",\r\n });\r\n if (marker.popup) {\r\n const infoWindow = new (window as any).AMap.InfoWindow({\r\n content: marker.popup,\r\n offset: new (window as any).AMap.Pixel(0, -30),\r\n });\r\n amapMarker.on(\"click\", () => {\r\n infoWindow.open(amap, amapMarker.getPosition());\r\n emit(\"markerClick\", marker, null);\r\n });\r\n }\r\n amapMarker.setMap(amap);\r\n });\r\n};\r\n\r\nwatch(\r\n () => props.markers,\r\n () => {\r\n if (map && props.mapType === \"osm\") addMarkers();\r\n },\r\n { deep: true },\r\n);\r\n\r\nwatch(\r\n () => props.mapType,\r\n async (newType, oldType) => {\r\n if (newType === oldType) return;\r\n if (map) {\r\n map.remove();\r\n map = null;\r\n loading.value = true;\r\n await nextTick();\r\n if (newType === \"amap\" && props.amapKey) await initAMap();\r\n else await initOSMMap();\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n [() => props.center, () => props.zoom],\r\n () => {\r\n if (map) map.setView(props.center, props.zoom);\r\n },\r\n { deep: true },\r\n);\r\n\r\nonMounted(async () => {\r\n await nextTick();\r\n if (props.mapType === \"amap\" && props.amapKey) await initAMap();\r\n else await initOSMMap();\r\n});\r\n\r\nonUnmounted(() => {\r\n if (map) {\r\n map.remove();\r\n map = null;\r\n }\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-12-02\r\n * @Description: 地图组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-map\">\r\n <div\r\n ref=\"mapContainer\"\r\n class=\"map-container\"\r\n :style=\"{ height: height }\"\r\n ></div>\r\n <div v-if=\"loading\" class=\"map-loading\">\r\n <NSpin size=\"large\" />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, watch, nextTick, onMounted, onUnmounted } from \"vue\";\r\nimport { NSpin } from \"naive-ui\";\r\nimport L from \"leaflet\";\r\nimport \"leaflet/dist/leaflet.css\";\r\nimport { OSM_TILE_CONFIG, AMAP_CONFIG, MAP_ICONS } from \"./data\";\r\n\r\ndefineOptions({ name: \"C_Map\" });\r\n\r\ndelete (L.Icon.Default.prototype as any)._getIconUrl;\r\nL.Icon.Default.mergeOptions(MAP_ICONS);\r\n\r\ninterface MapMarker {\r\n lat: number;\r\n lng: number;\r\n popup?: string;\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n height?: string;\r\n center?: [number, number];\r\n zoom?: number;\r\n markers?: MapMarker[];\r\n mapType?: \"osm\" | \"amap\";\r\n amapKey?: string;\r\n }>(),\r\n {\r\n height: \"400px\",\r\n center: () => [39.9042, 116.4074],\r\n zoom: 10,\r\n markers: () => [],\r\n mapType: \"osm\",\r\n amapKey: \"\",\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n ready: [map: any];\r\n markerClick: [marker: MapMarker, event: any];\r\n}>();\r\n\r\nconst mapContainer = ref<HTMLElement>();\r\nconst loading = ref(true);\r\nlet map: any = null;\r\n\r\nconst initOSMMap = async () => {\r\n if (!mapContainer.value) return;\r\n try {\r\n mapContainer.value.innerHTML = \"\";\r\n map = L.map(mapContainer.value, {\r\n center: props.center,\r\n zoom: props.zoom,\r\n zoomControl: true,\r\n preferCanvas: true,\r\n });\r\n const tileLayer = L.tileLayer(OSM_TILE_CONFIG.url, OSM_TILE_CONFIG);\r\n tileLayer.addTo(map);\r\n addMarkers();\r\n await nextTick();\r\n requestAnimationFrame(() => {\r\n map?.invalidateSize({ reset: true, pan: false });\r\n });\r\n loading.value = false;\r\n emit(\"ready\", map);\r\n } catch (error) {\r\n console.error(\"OpenStreetMap初始化失败:\", error);\r\n loading.value = false;\r\n }\r\n};\r\n\r\nconst initAMap = async () => {\r\n if (!mapContainer.value || !props.amapKey) return;\r\n try {\r\n mapContainer.value.innerHTML = \"\";\r\n const script = document.createElement(\"script\");\r\n script.type = \"text/javascript\";\r\n script.src = `${AMAP_CONFIG.apiUrl}${props.amapKey}`;\r\n script.onload = () => {\r\n if ((window as any).AMap) {\r\n const amap = new (window as any).AMap.Map(mapContainer.value, {\r\n zoom: props.zoom,\r\n center: props.center,\r\n });\r\n addAMapMarkers(amap);\r\n loading.value = false;\r\n emit(\"ready\", amap);\r\n }\r\n };\r\n script.onerror = () => {\r\n loading.value = false;\r\n };\r\n document.head.appendChild(script);\r\n } catch {\r\n loading.value = false;\r\n }\r\n};\r\n\r\nconst addMarkers = () => {\r\n if (!map || props.mapType !== \"osm\" || !props.markers) return;\r\n map.eachLayer((layer: any) => {\r\n if (layer instanceof L.Marker) {\r\n map.removeLayer(layer);\r\n }\r\n });\r\n props.markers.forEach((marker) => {\r\n const leafletMarker = L.marker([marker.lat, marker.lng]);\r\n if (marker.popup) {\r\n leafletMarker.bindPopup(marker.popup);\r\n leafletMarker.on(\"click\", (event: any) => {\r\n emit(\"markerClick\", marker, event);\r\n });\r\n }\r\n leafletMarker.addTo(map);\r\n });\r\n};\r\n\r\nconst addAMapMarkers = (amap: any) => {\r\n if (!amap || props.mapType !== \"amap\" || !props.markers) return;\r\n props.markers.forEach((marker) => {\r\n const amapMarker = new (window as any).AMap.Marker({\r\n position: [marker.lat, marker.lng],\r\n title: marker.popup || \"\",\r\n });\r\n if (marker.popup) {\r\n const infoWindow = new (window as any).AMap.InfoWindow({\r\n content: marker.popup,\r\n offset: new (window as any).AMap.Pixel(0, -30),\r\n });\r\n amapMarker.on(\"click\", () => {\r\n infoWindow.open(amap, amapMarker.getPosition());\r\n emit(\"markerClick\", marker, null);\r\n });\r\n }\r\n amapMarker.setMap(amap);\r\n });\r\n};\r\n\r\nwatch(\r\n () => props.markers,\r\n () => {\r\n if (map && props.mapType === \"osm\") addMarkers();\r\n },\r\n { deep: true },\r\n);\r\n\r\nwatch(\r\n () => props.mapType,\r\n async (newType, oldType) => {\r\n if (newType === oldType) return;\r\n if (map) {\r\n map.remove();\r\n map = null;\r\n loading.value = true;\r\n await nextTick();\r\n if (newType === \"amap\" && props.amapKey) await initAMap();\r\n else await initOSMMap();\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n [() => props.center, () => props.zoom],\r\n () => {\r\n if (map) map.setView(props.center, props.zoom);\r\n },\r\n { deep: true },\r\n);\r\n\r\nonMounted(async () => {\r\n await nextTick();\r\n if (props.mapType === \"amap\" && props.amapKey) await initAMap();\r\n else await initOSMMap();\r\n});\r\n\r\nonUnmounted(() => {\r\n if (map) {\r\n map.remove();\r\n map = null;\r\n }\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-12-02\r\n * @Description: 地图组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-map\">\r\n <div\r\n ref=\"mapContainer\"\r\n class=\"map-container\"\r\n :style=\"{ height: height }\"\r\n ></div>\r\n <div v-if=\"loading\" class=\"map-loading\">\r\n <NSpin size=\"large\" />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, watch, nextTick, onMounted, onUnmounted } from \"vue\";\r\nimport { NSpin } from \"naive-ui\";\r\nimport L from \"leaflet\";\r\nimport \"leaflet/dist/leaflet.css\";\r\nimport { OSM_TILE_CONFIG, AMAP_CONFIG, MAP_ICONS } from \"./data\";\r\n\r\ndefineOptions({ name: \"C_Map\" });\r\n\r\ndelete (L.Icon.Default.prototype as any)._getIconUrl;\r\nL.Icon.Default.mergeOptions(MAP_ICONS);\r\n\r\ninterface MapMarker {\r\n lat: number;\r\n lng: number;\r\n popup?: string;\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n height?: string;\r\n center?: [number, number];\r\n zoom?: number;\r\n markers?: MapMarker[];\r\n mapType?: \"osm\" | \"amap\";\r\n amapKey?: string;\r\n }>(),\r\n {\r\n height: \"400px\",\r\n center: () => [39.9042, 116.4074],\r\n zoom: 10,\r\n markers: () => [],\r\n mapType: \"osm\",\r\n amapKey: \"\",\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n ready: [map: any];\r\n markerClick: [marker: MapMarker, event: any];\r\n}>();\r\n\r\nconst mapContainer = ref<HTMLElement>();\r\nconst loading = ref(true);\r\nlet map: any = null;\r\n\r\nconst initOSMMap = async () => {\r\n if (!mapContainer.value) return;\r\n try {\r\n mapContainer.value.innerHTML = \"\";\r\n map = L.map(mapContainer.value, {\r\n center: props.center,\r\n zoom: props.zoom,\r\n zoomControl: true,\r\n preferCanvas: true,\r\n });\r\n const tileLayer = L.tileLayer(OSM_TILE_CONFIG.url, OSM_TILE_CONFIG);\r\n tileLayer.addTo(map);\r\n addMarkers();\r\n await nextTick();\r\n requestAnimationFrame(() => {\r\n map?.invalidateSize({ reset: true, pan: false });\r\n });\r\n loading.value = false;\r\n emit(\"ready\", map);\r\n } catch (error) {\r\n console.error(\"OpenStreetMap初始化失败:\", error);\r\n loading.value = false;\r\n }\r\n};\r\n\r\nconst initAMap = async () => {\r\n if (!mapContainer.value || !props.amapKey) return;\r\n try {\r\n mapContainer.value.innerHTML = \"\";\r\n const script = document.createElement(\"script\");\r\n script.type = \"text/javascript\";\r\n script.src = `${AMAP_CONFIG.apiUrl}${props.amapKey}`;\r\n script.onload = () => {\r\n if ((window as any).AMap) {\r\n const amap = new (window as any).AMap.Map(mapContainer.value, {\r\n zoom: props.zoom,\r\n center: props.center,\r\n });\r\n addAMapMarkers(amap);\r\n loading.value = false;\r\n emit(\"ready\", amap);\r\n }\r\n };\r\n script.onerror = () => {\r\n loading.value = false;\r\n };\r\n document.head.appendChild(script);\r\n } catch {\r\n loading.value = false;\r\n }\r\n};\r\n\r\nconst addMarkers = () => {\r\n if (!map || props.mapType !== \"osm\" || !props.markers) return;\r\n map.eachLayer((layer: any) => {\r\n if (layer instanceof L.Marker) {\r\n map.removeLayer(layer);\r\n }\r\n });\r\n props.markers.forEach((marker) => {\r\n const leafletMarker = L.marker([marker.lat, marker.lng]);\r\n if (marker.popup) {\r\n leafletMarker.bindPopup(marker.popup);\r\n leafletMarker.on(\"click\", (event: any) => {\r\n emit(\"markerClick\", marker, event);\r\n });\r\n }\r\n leafletMarker.addTo(map);\r\n });\r\n};\r\n\r\nconst addAMapMarkers = (amap: any) => {\r\n if (!amap || props.mapType !== \"amap\" || !props.markers) return;\r\n props.markers.forEach((marker) => {\r\n const amapMarker = new (window as any).AMap.Marker({\r\n position: [marker.lat, marker.lng],\r\n title: marker.popup || \"\",\r\n });\r\n if (marker.popup) {\r\n const infoWindow = new (window as any).AMap.InfoWindow({\r\n content: marker.popup,\r\n offset: new (window as any).AMap.Pixel(0, -30),\r\n });\r\n amapMarker.on(\"click\", () => {\r\n infoWindow.open(amap, amapMarker.getPosition());\r\n emit(\"markerClick\", marker, null);\r\n });\r\n }\r\n amapMarker.setMap(amap);\r\n });\r\n};\r\n\r\nwatch(\r\n () => props.markers,\r\n () => {\r\n if (map && props.mapType === \"osm\") addMarkers();\r\n },\r\n { deep: true },\r\n);\r\n\r\nwatch(\r\n () => props.mapType,\r\n async (newType, oldType) => {\r\n if (newType === oldType) return;\r\n if (map) {\r\n map.remove();\r\n map = null;\r\n loading.value = true;\r\n await nextTick();\r\n if (newType === \"amap\" && props.amapKey) await initAMap();\r\n else await initOSMMap();\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n [() => props.center, () => props.zoom],\r\n () => {\r\n if (map) map.setView(props.center, props.zoom);\r\n },\r\n { deep: true },\r\n);\r\n\r\nonMounted(async () => {\r\n await nextTick();\r\n if (props.mapType === \"amap\" && props.amapKey) await initAMap();\r\n else await initOSMMap();\r\n});\r\n\r\nonUnmounted(() => {\r\n if (map) {\r\n map.remove();\r\n map = null;\r\n }\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"C_Map2.js","names":["height"],"sources":["../src/components/C_Map/data.ts","../src/components/C_Map/index.vue","../src/components/C_Map/index.vue","../src/components/C_Map/index.vue"],"sourcesContent":["export const MAP_TYPES = [\r\n { label: \"OpenStreetMap\", value: \"osm\" },\r\n { label: \"高德地图\", value: \"amap\" },\r\n] as const;\r\n\r\nexport type MapType = (typeof MAP_TYPES)[number][\"value\"];\r\n\r\nexport interface MapMarker {\r\n lat: number;\r\n lng: number;\r\n popup?: string;\r\n}\r\n\r\nexport interface MapConfig {\r\n height?: string;\r\n center?: [number, number];\r\n zoom?: number;\r\n markers?: MapMarker[];\r\n mapType?: MapType;\r\n amapKey?: string;\r\n}\r\n\r\nexport const DEFAULT_MAP_CONFIG: Required<\r\n Omit<MapConfig, \"markers\" | \"amapKey\">\r\n> = {\r\n height: \"400px\",\r\n center: [39.9042, 116.4074],\r\n zoom: 10,\r\n mapType: \"osm\",\r\n};\r\n\r\nexport const OSM_TILE_CONFIG = {\r\n url: \"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\",\r\n attribution: \"© OpenStreetMap contributors\",\r\n maxZoom: 19,\r\n minZoom: 1,\r\n tileSize: 256,\r\n detectRetina: true,\r\n} as const;\r\n\r\nexport const AMAP_CONFIG = {\r\n apiUrl: \"https://webapi.amap.com/maps?v=2.0&key=\",\r\n note: \"高德地图需要API Key,如需使用请申请:https://lbs.amap.com/api/javascript-api/guide/create/\",\r\n} as const;\r\n\r\nexport const MAP_ICONS = {\r\n iconRetinaUrl:\r\n \"https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-icon-2x.png\",\r\n iconUrl:\r\n \"https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-icon.png\",\r\n shadowUrl:\r\n \"https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-shadow.png\",\r\n} as const;\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-12-02\r\n * @Description: 地图组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-map\">\r\n <div\r\n ref=\"mapContainer\"\r\n class=\"map-container\"\r\n :style=\"{ height: height }\"\r\n ></div>\r\n <div v-if=\"loading\" class=\"map-loading\">\r\n <NSpin size=\"large\" />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, watch, nextTick, onMounted, onUnmounted } from \"vue\";\r\nimport { NSpin } from \"naive-ui\";\r\nimport L from \"leaflet\";\r\nimport \"leaflet/dist/leaflet.css\";\r\nimport { OSM_TILE_CONFIG, AMAP_CONFIG, MAP_ICONS } from \"./data\";\r\n\r\ndefineOptions({ name: \"C_Map\" });\r\n\r\ndelete (L.Icon.Default.prototype as any)._getIconUrl;\r\nL.Icon.Default.mergeOptions(MAP_ICONS);\r\n\r\ninterface MapMarker {\r\n lat: number;\r\n lng: number;\r\n popup?: string;\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n height?: string;\r\n center?: [number, number];\r\n zoom?: number;\r\n markers?: MapMarker[];\r\n mapType?: \"osm\" | \"amap\";\r\n amapKey?: string;\r\n }>(),\r\n {\r\n height: \"400px\",\r\n center: () => [39.9042, 116.4074],\r\n zoom: 10,\r\n markers: () => [],\r\n mapType: \"osm\",\r\n amapKey: \"\",\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n ready: [map: any];\r\n markerClick: [marker: MapMarker, event: any];\r\n}>();\r\n\r\nconst mapContainer = ref<HTMLElement>();\r\nconst loading = ref(true);\r\nlet map: any = null;\r\n\r\nconst initOSMMap = async () => {\r\n if (!mapContainer.value) return;\r\n try {\r\n mapContainer.value.innerHTML = \"\";\r\n map = L.map(mapContainer.value, {\r\n center: props.center,\r\n zoom: props.zoom,\r\n zoomControl: true,\r\n preferCanvas: true,\r\n });\r\n const tileLayer = L.tileLayer(OSM_TILE_CONFIG.url, OSM_TILE_CONFIG);\r\n tileLayer.addTo(map);\r\n addMarkers();\r\n await nextTick();\r\n requestAnimationFrame(() => {\r\n map?.invalidateSize({ reset: true, pan: false });\r\n });\r\n loading.value = false;\r\n emit(\"ready\", map);\r\n } catch (error) {\r\n console.error(\"OpenStreetMap初始化失败:\", error);\r\n loading.value = false;\r\n }\r\n};\r\n\r\nconst initAMap = async () => {\r\n if (!mapContainer.value || !props.amapKey) return;\r\n try {\r\n mapContainer.value.innerHTML = \"\";\r\n const script = document.createElement(\"script\");\r\n script.type = \"text/javascript\";\r\n script.src = `${AMAP_CONFIG.apiUrl}${props.amapKey}`;\r\n script.onload = () => {\r\n if ((window as any).AMap) {\r\n const amap = new (window as any).AMap.Map(mapContainer.value, {\r\n zoom: props.zoom,\r\n center: props.center,\r\n });\r\n addAMapMarkers(amap);\r\n loading.value = false;\r\n emit(\"ready\", amap);\r\n }\r\n };\r\n script.onerror = () => {\r\n loading.value = false;\r\n };\r\n document.head.appendChild(script);\r\n } catch {\r\n loading.value = false;\r\n }\r\n};\r\n\r\nconst addMarkers = () => {\r\n if (!map || props.mapType !== \"osm\" || !props.markers) return;\r\n map.eachLayer((layer: any) => {\r\n if (layer instanceof L.Marker) {\r\n map.removeLayer(layer);\r\n }\r\n });\r\n props.markers.forEach((marker) => {\r\n const leafletMarker = L.marker([marker.lat, marker.lng]);\r\n if (marker.popup) {\r\n leafletMarker.bindPopup(marker.popup);\r\n leafletMarker.on(\"click\", (event: any) => {\r\n emit(\"markerClick\", marker, event);\r\n });\r\n }\r\n leafletMarker.addTo(map);\r\n });\r\n};\r\n\r\nconst addAMapMarkers = (amap: any) => {\r\n if (!amap || props.mapType !== \"amap\" || !props.markers) return;\r\n props.markers.forEach((marker) => {\r\n const amapMarker = new (window as any).AMap.Marker({\r\n position: [marker.lat, marker.lng],\r\n title: marker.popup || \"\",\r\n });\r\n if (marker.popup) {\r\n const infoWindow = new (window as any).AMap.InfoWindow({\r\n content: marker.popup,\r\n offset: new (window as any).AMap.Pixel(0, -30),\r\n });\r\n amapMarker.on(\"click\", () => {\r\n infoWindow.open(amap, amapMarker.getPosition());\r\n emit(\"markerClick\", marker, null);\r\n });\r\n }\r\n amapMarker.setMap(amap);\r\n });\r\n};\r\n\r\nwatch(\r\n () => props.markers,\r\n () => {\r\n if (map && props.mapType === \"osm\") addMarkers();\r\n },\r\n { deep: true },\r\n);\r\n\r\nwatch(\r\n () => props.mapType,\r\n async (newType, oldType) => {\r\n if (newType === oldType) return;\r\n if (map) {\r\n map.remove();\r\n map = null;\r\n loading.value = true;\r\n await nextTick();\r\n if (newType === \"amap\" && props.amapKey) await initAMap();\r\n else await initOSMMap();\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n [() => props.center, () => props.zoom],\r\n () => {\r\n if (map) map.setView(props.center, props.zoom);\r\n },\r\n { deep: true },\r\n);\r\n\r\nonMounted(async () => {\r\n await nextTick();\r\n if (props.mapType === \"amap\" && props.amapKey) await initAMap();\r\n else await initOSMMap();\r\n});\r\n\r\nonUnmounted(() => {\r\n if (map) {\r\n map.remove();\r\n map = null;\r\n }\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-12-02\r\n * @Description: 地图组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-map\">\r\n <div\r\n ref=\"mapContainer\"\r\n class=\"map-container\"\r\n :style=\"{ height: height }\"\r\n ></div>\r\n <div v-if=\"loading\" class=\"map-loading\">\r\n <NSpin size=\"large\" />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, watch, nextTick, onMounted, onUnmounted } from \"vue\";\r\nimport { NSpin } from \"naive-ui\";\r\nimport L from \"leaflet\";\r\nimport \"leaflet/dist/leaflet.css\";\r\nimport { OSM_TILE_CONFIG, AMAP_CONFIG, MAP_ICONS } from \"./data\";\r\n\r\ndefineOptions({ name: \"C_Map\" });\r\n\r\ndelete (L.Icon.Default.prototype as any)._getIconUrl;\r\nL.Icon.Default.mergeOptions(MAP_ICONS);\r\n\r\ninterface MapMarker {\r\n lat: number;\r\n lng: number;\r\n popup?: string;\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n height?: string;\r\n center?: [number, number];\r\n zoom?: number;\r\n markers?: MapMarker[];\r\n mapType?: \"osm\" | \"amap\";\r\n amapKey?: string;\r\n }>(),\r\n {\r\n height: \"400px\",\r\n center: () => [39.9042, 116.4074],\r\n zoom: 10,\r\n markers: () => [],\r\n mapType: \"osm\",\r\n amapKey: \"\",\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n ready: [map: any];\r\n markerClick: [marker: MapMarker, event: any];\r\n}>();\r\n\r\nconst mapContainer = ref<HTMLElement>();\r\nconst loading = ref(true);\r\nlet map: any = null;\r\n\r\nconst initOSMMap = async () => {\r\n if (!mapContainer.value) return;\r\n try {\r\n mapContainer.value.innerHTML = \"\";\r\n map = L.map(mapContainer.value, {\r\n center: props.center,\r\n zoom: props.zoom,\r\n zoomControl: true,\r\n preferCanvas: true,\r\n });\r\n const tileLayer = L.tileLayer(OSM_TILE_CONFIG.url, OSM_TILE_CONFIG);\r\n tileLayer.addTo(map);\r\n addMarkers();\r\n await nextTick();\r\n requestAnimationFrame(() => {\r\n map?.invalidateSize({ reset: true, pan: false });\r\n });\r\n loading.value = false;\r\n emit(\"ready\", map);\r\n } catch (error) {\r\n console.error(\"OpenStreetMap初始化失败:\", error);\r\n loading.value = false;\r\n }\r\n};\r\n\r\nconst initAMap = async () => {\r\n if (!mapContainer.value || !props.amapKey) return;\r\n try {\r\n mapContainer.value.innerHTML = \"\";\r\n const script = document.createElement(\"script\");\r\n script.type = \"text/javascript\";\r\n script.src = `${AMAP_CONFIG.apiUrl}${props.amapKey}`;\r\n script.onload = () => {\r\n if ((window as any).AMap) {\r\n const amap = new (window as any).AMap.Map(mapContainer.value, {\r\n zoom: props.zoom,\r\n center: props.center,\r\n });\r\n addAMapMarkers(amap);\r\n loading.value = false;\r\n emit(\"ready\", amap);\r\n }\r\n };\r\n script.onerror = () => {\r\n loading.value = false;\r\n };\r\n document.head.appendChild(script);\r\n } catch {\r\n loading.value = false;\r\n }\r\n};\r\n\r\nconst addMarkers = () => {\r\n if (!map || props.mapType !== \"osm\" || !props.markers) return;\r\n map.eachLayer((layer: any) => {\r\n if (layer instanceof L.Marker) {\r\n map.removeLayer(layer);\r\n }\r\n });\r\n props.markers.forEach((marker) => {\r\n const leafletMarker = L.marker([marker.lat, marker.lng]);\r\n if (marker.popup) {\r\n leafletMarker.bindPopup(marker.popup);\r\n leafletMarker.on(\"click\", (event: any) => {\r\n emit(\"markerClick\", marker, event);\r\n });\r\n }\r\n leafletMarker.addTo(map);\r\n });\r\n};\r\n\r\nconst addAMapMarkers = (amap: any) => {\r\n if (!amap || props.mapType !== \"amap\" || !props.markers) return;\r\n props.markers.forEach((marker) => {\r\n const amapMarker = new (window as any).AMap.Marker({\r\n position: [marker.lat, marker.lng],\r\n title: marker.popup || \"\",\r\n });\r\n if (marker.popup) {\r\n const infoWindow = new (window as any).AMap.InfoWindow({\r\n content: marker.popup,\r\n offset: new (window as any).AMap.Pixel(0, -30),\r\n });\r\n amapMarker.on(\"click\", () => {\r\n infoWindow.open(amap, amapMarker.getPosition());\r\n emit(\"markerClick\", marker, null);\r\n });\r\n }\r\n amapMarker.setMap(amap);\r\n });\r\n};\r\n\r\nwatch(\r\n () => props.markers,\r\n () => {\r\n if (map && props.mapType === \"osm\") addMarkers();\r\n },\r\n { deep: true },\r\n);\r\n\r\nwatch(\r\n () => props.mapType,\r\n async (newType, oldType) => {\r\n if (newType === oldType) return;\r\n if (map) {\r\n map.remove();\r\n map = null;\r\n loading.value = true;\r\n await nextTick();\r\n if (newType === \"amap\" && props.amapKey) await initAMap();\r\n else await initOSMMap();\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n [() => props.center, () => props.zoom],\r\n () => {\r\n if (map) map.setView(props.center, props.zoom);\r\n },\r\n { deep: true },\r\n);\r\n\r\nonMounted(async () => {\r\n await nextTick();\r\n if (props.mapType === \"amap\" && props.amapKey) await initAMap();\r\n else await initOSMMap();\r\n});\r\n\r\nonUnmounted(() => {\r\n if (map) {\r\n map.remove();\r\n map = null;\r\n }\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-12-02\r\n * @Description: 地图组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-map\">\r\n <div\r\n ref=\"mapContainer\"\r\n class=\"map-container\"\r\n :style=\"{ height: height }\"\r\n ></div>\r\n <div v-if=\"loading\" class=\"map-loading\">\r\n <NSpin size=\"large\" />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, watch, nextTick, onMounted, onUnmounted } from \"vue\";\r\nimport { NSpin } from \"naive-ui\";\r\nimport L from \"leaflet\";\r\nimport \"leaflet/dist/leaflet.css\";\r\nimport { OSM_TILE_CONFIG, AMAP_CONFIG, MAP_ICONS } from \"./data\";\r\n\r\ndefineOptions({ name: \"C_Map\" });\r\n\r\ndelete (L.Icon.Default.prototype as any)._getIconUrl;\r\nL.Icon.Default.mergeOptions(MAP_ICONS);\r\n\r\ninterface MapMarker {\r\n lat: number;\r\n lng: number;\r\n popup?: string;\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n height?: string;\r\n center?: [number, number];\r\n zoom?: number;\r\n markers?: MapMarker[];\r\n mapType?: \"osm\" | \"amap\";\r\n amapKey?: string;\r\n }>(),\r\n {\r\n height: \"400px\",\r\n center: () => [39.9042, 116.4074],\r\n zoom: 10,\r\n markers: () => [],\r\n mapType: \"osm\",\r\n amapKey: \"\",\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n ready: [map: any];\r\n markerClick: [marker: MapMarker, event: any];\r\n}>();\r\n\r\nconst mapContainer = ref<HTMLElement>();\r\nconst loading = ref(true);\r\nlet map: any = null;\r\n\r\nconst initOSMMap = async () => {\r\n if (!mapContainer.value) return;\r\n try {\r\n mapContainer.value.innerHTML = \"\";\r\n map = L.map(mapContainer.value, {\r\n center: props.center,\r\n zoom: props.zoom,\r\n zoomControl: true,\r\n preferCanvas: true,\r\n });\r\n const tileLayer = L.tileLayer(OSM_TILE_CONFIG.url, OSM_TILE_CONFIG);\r\n tileLayer.addTo(map);\r\n addMarkers();\r\n await nextTick();\r\n requestAnimationFrame(() => {\r\n map?.invalidateSize({ reset: true, pan: false });\r\n });\r\n loading.value = false;\r\n emit(\"ready\", map);\r\n } catch (error) {\r\n console.error(\"OpenStreetMap初始化失败:\", error);\r\n loading.value = false;\r\n }\r\n};\r\n\r\nconst initAMap = async () => {\r\n if (!mapContainer.value || !props.amapKey) return;\r\n try {\r\n mapContainer.value.innerHTML = \"\";\r\n const script = document.createElement(\"script\");\r\n script.type = \"text/javascript\";\r\n script.src = `${AMAP_CONFIG.apiUrl}${props.amapKey}`;\r\n script.onload = () => {\r\n if ((window as any).AMap) {\r\n const amap = new (window as any).AMap.Map(mapContainer.value, {\r\n zoom: props.zoom,\r\n center: props.center,\r\n });\r\n addAMapMarkers(amap);\r\n loading.value = false;\r\n emit(\"ready\", amap);\r\n }\r\n };\r\n script.onerror = () => {\r\n loading.value = false;\r\n };\r\n document.head.appendChild(script);\r\n } catch {\r\n loading.value = false;\r\n }\r\n};\r\n\r\nconst addMarkers = () => {\r\n if (!map || props.mapType !== \"osm\" || !props.markers) return;\r\n map.eachLayer((layer: any) => {\r\n if (layer instanceof L.Marker) {\r\n map.removeLayer(layer);\r\n }\r\n });\r\n props.markers.forEach((marker) => {\r\n const leafletMarker = L.marker([marker.lat, marker.lng]);\r\n if (marker.popup) {\r\n leafletMarker.bindPopup(marker.popup);\r\n leafletMarker.on(\"click\", (event: any) => {\r\n emit(\"markerClick\", marker, event);\r\n });\r\n }\r\n leafletMarker.addTo(map);\r\n });\r\n};\r\n\r\nconst addAMapMarkers = (amap: any) => {\r\n if (!amap || props.mapType !== \"amap\" || !props.markers) return;\r\n props.markers.forEach((marker) => {\r\n const amapMarker = new (window as any).AMap.Marker({\r\n position: [marker.lat, marker.lng],\r\n title: marker.popup || \"\",\r\n });\r\n if (marker.popup) {\r\n const infoWindow = new (window as any).AMap.InfoWindow({\r\n content: marker.popup,\r\n offset: new (window as any).AMap.Pixel(0, -30),\r\n });\r\n amapMarker.on(\"click\", () => {\r\n infoWindow.open(amap, amapMarker.getPosition());\r\n emit(\"markerClick\", marker, null);\r\n });\r\n }\r\n amapMarker.setMap(amap);\r\n });\r\n};\r\n\r\nwatch(\r\n () => props.markers,\r\n () => {\r\n if (map && props.mapType === \"osm\") addMarkers();\r\n },\r\n { deep: true },\r\n);\r\n\r\nwatch(\r\n () => props.mapType,\r\n async (newType, oldType) => {\r\n if (newType === oldType) return;\r\n if (map) {\r\n map.remove();\r\n map = null;\r\n loading.value = true;\r\n await nextTick();\r\n if (newType === \"amap\" && props.amapKey) await initAMap();\r\n else await initOSMMap();\r\n }\r\n },\r\n);\r\n\r\nwatch(\r\n [() => props.center, () => props.zoom],\r\n () => {\r\n if (map) map.setView(props.center, props.zoom);\r\n },\r\n { deep: true },\r\n);\r\n\r\nonMounted(async () => {\r\n await nextTick();\r\n if (props.mapType === \"amap\" && props.amapKey) await initAMap();\r\n else await initOSMMap();\r\n});\r\n\r\nonUnmounted(() => {\r\n if (map) {\r\n map.remove();\r\n map = null;\r\n }\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"C_Markdown-
|
|
1
|
+
{"version":3,"file":"C_Markdown-BbTvdFCl.css","names":[],"sources":["../src/components/C_Markdown/index.vue?vue&type=style&index=0&scoped=67f4346d&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//* C_Markdown 组件样式文件 */\n.c-markdown-wrapper[data-v-67f4346d] {\n position: relative;\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor {\n border-radius: 6px;\n border: 1px solid var(--c-border);\n background-color: var(--c-bg-card);\n /* 禁用状态样式 */\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor:hover {\n border-color: var(--c-primary);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor:focus-within {\n border-color: var(--c-primary);\n box-shadow: 0 0 0 2px var(--c-primary-opacity, rgba(24, 160, 88, 0.2));\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor.disabled {\n background-color: var(--c-bg-disabled, #fafafc);\n cursor: not-allowed;\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor.disabled .v-md-editor__editor {\n cursor: not-allowed;\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar {\n background-color: var(--c-bg-card);\n border-bottom: 1px solid var(--c-border);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__editor-wrapper {\n background-color: var(--c-bg-card);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__editor {\n background-color: var(--c-bg-card);\n color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__editor textarea {\n color: var(--c-text-1);\n caret-color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__preview-wrapper {\n background-color: var(--c-bg-card);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__preview {\n background-color: var(--c-bg-card);\n color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-67f4346d] .v-md-editor .v-md-editor__toc-nav-wrapper {\n background-color: var(--c-bg-card);\n border-left: 1px solid var(--c-border);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item {\n color: #ffffff;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item:hover {\n background-color: rgba(255, 255, 255, 0.08);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item.is-active {\n background-color: rgba(255, 255, 255, 0.12);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item svg {\n fill: #ffffff;\n opacity: 0.9;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-item:hover svg {\n opacity: 1;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item {\n background-color: transparent;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item svg {\n fill: #ffffff;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item:hover {\n background-color: rgba(255, 255, 255, 0.08);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__toolbar-divider {\n background-color: var(--c-border);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar,\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-track,\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-track {\n background-color: rgba(255, 255, 255, 0.05);\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-thumb,\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-thumb {\n background-color: rgba(255, 255, 255, 0.2);\n border-radius: 4px;\n}\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-thumb:hover,\n.c-markdown-wrapper.is-dark[data-v-67f4346d] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-thumb:hover {\n background-color: rgba(255, 255, 255, 0.3);\n}\n.c-markdown-wrapper .word-count[data-v-67f4346d] {\n position: absolute;\n bottom: 8px;\n right: 12px;\n font-size: 12px;\n color: var(--c-text-4);\n background: var(--c-bg-card);\n padding: 2px 6px;\n border-radius: 4px;\n z-index: 10;\n}\n.c-markdown-wrapper .word-count.exceed[data-v-67f4346d] {\n color: var(--c-error);\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
|
package/dist/C_Markdown.cjs
CHANGED
|
@@ -1,4 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,
|
|
2
|
-
const require_C_Markdown = require('./C_Markdown.js');
|
|
3
|
-
|
|
4
|
-
exports.C_Markdown = require_C_Markdown.C_Markdown_default;
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./C_Markdown.js`);exports.C_Markdown=e.t;
|
package/dist/C_Markdown.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"C_Markdown.js","names":["isDark","modelValue","height","placeholder","toolbar","mode","tocNavPosition","defaultFullscreen","autofocus","includeLevel","leftToolbar","rightToolbar"],"sources":["../src/components/C_Markdown/index.vue","../src/components/C_Markdown/index.vue","../src/components/C_Markdown/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-20\r\n * @Description: Markdown 编辑器封装组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n class=\"c-markdown-wrapper\"\r\n :class=\"{ 'is-dark': isDark }\"\r\n >\r\n <VMdEditor\r\n ref=\"editorRef\"\r\n :model-value=\"modelValue\"\r\n :height=\"height\"\r\n :placeholder=\"placeholder\"\r\n :toolbar=\"toolbar\"\r\n :mode=\"mode\"\r\n :upload-image-config=\"computedUploadImageConfig\"\r\n :toc-nav-position=\"tocNavPosition\"\r\n :default-fullscreen=\"defaultFullscreen\"\r\n :autofocus=\"autofocus\"\r\n :include-level=\"includeLevel\"\r\n :left-toolbar=\"leftToolbar\"\r\n :right-toolbar=\"rightToolbar\"\r\n :default-show-toc=\"true\"\r\n @update:model-value=\"handleInput\"\r\n @change=\"handleChange\"\r\n @save=\"handleSave\"\r\n @upload-image=\"handleUploadImage\"\r\n @fullscreen-change=\"handleFullscreenChange\"\r\n @copy-code-success=\"handleCopyCodeSuccess\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { ref, computed, watch, onMounted } from 'vue'\r\n import VMdEditor from '@kangc/v-md-editor'\r\n\r\n defineOptions({ name: 'C_Markdown' })\r\n\r\n export type InsertImageFunction = (config: {\r\n url: string\r\n desc?: string\r\n width?: string | number\r\n height?: string | number\r\n }) => void\r\n\r\n interface Props {\r\n modelValue?: string\r\n height?: string | number\r\n disabled?: boolean\r\n placeholder?: string\r\n mode?: 'edit' | 'editable' | 'preview'\r\n toolbar?: object\r\n uploadImageConfig?: {\r\n accept?: string\r\n multiple?: boolean\r\n [key: string]: any\r\n }\r\n tocNavPosition?: 'left' | 'right'\r\n defaultFullscreen?: boolean\r\n autofocus?: boolean\r\n includeLevel?: number[]\r\n leftToolbar?: string\r\n rightToolbar?: string\r\n maxLength?: number\r\n showWordCount?: boolean\r\n autoSave?: boolean\r\n autoSaveInterval?: number\r\n /** 是否为暗色主题(外部传入) */\r\n isDark?: boolean\r\n }\r\n\r\n const props = withDefaults(defineProps<Props>(), {\r\n modelValue: '',\r\n height: '400px',\r\n disabled: false,\r\n placeholder: '请输入 Markdown 内容...',\r\n mode: 'editable',\r\n tocNavPosition: 'right',\r\n defaultFullscreen: false,\r\n autofocus: false,\r\n includeLevel: () => [1, 2, 3, 4, 5, 6],\r\n leftToolbar:\r\n 'undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save',\r\n rightToolbar: 'preview toc sync-scroll fullscreen',\r\n maxLength: 50000,\r\n showWordCount: true,\r\n autoSave: false,\r\n autoSaveInterval: 30000,\r\n isDark: false,\r\n })\r\n\r\n interface Emits {\r\n 'update:modelValue': [value: string]\r\n change: [text: string, html: string]\r\n save: [text: string, html: string]\r\n 'upload-image': [\r\n event: Event,\r\n insertImage: InsertImageFunction,\r\n files: FileList,\r\n ]\r\n 'fullscreen-change': [isFullscreen: boolean]\r\n 'copy-code-success': [text: string]\r\n 'word-count-change': [count: number]\r\n 'auto-save': [text: string]\r\n 'max-length-exceeded': [currentLength: number, maxLength: number]\r\n }\r\n\r\n const emit = defineEmits<Emits>()\r\n\r\n const editorRef = ref<any>(null)\r\n const cachedHtml = ref('')\r\n\r\n const wordCount = computed(() => {\r\n return props.modelValue?.length || 0\r\n })\r\n\r\n const computedUploadImageConfig = computed(() => {\r\n const defaultConfig = {\r\n accept: 'image/*',\r\n multiple: false,\r\n }\r\n return props.uploadImageConfig\r\n ? { ...defaultConfig, ...props.uploadImageConfig }\r\n : defaultConfig\r\n })\r\n\r\n onMounted(() => {\r\n if (props.showWordCount && props.modelValue) {\r\n emit('word-count-change', props.modelValue.length)\r\n }\r\n })\r\n\r\n watch(\r\n () => props.modelValue,\r\n newValue => {\r\n if (props.showWordCount) {\r\n emit('word-count-change', newValue?.length || 0)\r\n }\r\n },\r\n { immediate: true }\r\n )\r\n\r\n const handleInput = (value: string) => {\r\n if (value.length > props.maxLength) {\r\n emit('max-length-exceeded', value.length, props.maxLength)\r\n return\r\n }\r\n emit('update:modelValue', value)\r\n if (props.showWordCount) {\r\n emit('word-count-change', value.length)\r\n }\r\n }\r\n\r\n const handleChange = (text: string, html: string) => {\r\n cachedHtml.value = html\r\n emit('change', text, html)\r\n if (props.autoSave) {\r\n autoSave(text)\r\n }\r\n }\r\n\r\n const handleSave = (text: string, html: string) => {\r\n emit('save', text, html)\r\n }\r\n\r\n const handleUploadImage = (\r\n event: Event,\r\n insertImage: InsertImageFunction,\r\n files: FileList\r\n ) => {\r\n emit('upload-image', event, insertImage, files)\r\n }\r\n\r\n const handleFullscreenChange = (isFullscreen: boolean) => {\r\n emit('fullscreen-change', isFullscreen)\r\n }\r\n\r\n const handleCopyCodeSuccess = (text: string) => {\r\n emit('copy-code-success', text)\r\n }\r\n\r\n let autoSaveTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\n const autoSave = (text: string) => {\r\n if (autoSaveTimer) clearTimeout(autoSaveTimer)\r\n autoSaveTimer = setTimeout(() => {\r\n emit('auto-save', text)\r\n }, props.autoSaveInterval)\r\n }\r\n\r\n const focus = () => {\r\n editorRef.value?.focus()\r\n }\r\n\r\n const getHtml = (): string => {\r\n return cachedHtml.value\r\n }\r\n\r\n const insertText = (text: string) => {\r\n editorRef.value?.insert((selected: string) => ({\r\n text: `${selected}${text}`,\r\n selected: text,\r\n }))\r\n }\r\n\r\n defineExpose({\r\n focus,\r\n getHtml,\r\n insertText,\r\n wordCount,\r\n })\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n @use './index.scss';\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-20\r\n * @Description: Markdown 编辑器封装组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n class=\"c-markdown-wrapper\"\r\n :class=\"{ 'is-dark': isDark }\"\r\n >\r\n <VMdEditor\r\n ref=\"editorRef\"\r\n :model-value=\"modelValue\"\r\n :height=\"height\"\r\n :placeholder=\"placeholder\"\r\n :toolbar=\"toolbar\"\r\n :mode=\"mode\"\r\n :upload-image-config=\"computedUploadImageConfig\"\r\n :toc-nav-position=\"tocNavPosition\"\r\n :default-fullscreen=\"defaultFullscreen\"\r\n :autofocus=\"autofocus\"\r\n :include-level=\"includeLevel\"\r\n :left-toolbar=\"leftToolbar\"\r\n :right-toolbar=\"rightToolbar\"\r\n :default-show-toc=\"true\"\r\n @update:model-value=\"handleInput\"\r\n @change=\"handleChange\"\r\n @save=\"handleSave\"\r\n @upload-image=\"handleUploadImage\"\r\n @fullscreen-change=\"handleFullscreenChange\"\r\n @copy-code-success=\"handleCopyCodeSuccess\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { ref, computed, watch, onMounted } from 'vue'\r\n import VMdEditor from '@kangc/v-md-editor'\r\n\r\n defineOptions({ name: 'C_Markdown' })\r\n\r\n export type InsertImageFunction = (config: {\r\n url: string\r\n desc?: string\r\n width?: string | number\r\n height?: string | number\r\n }) => void\r\n\r\n interface Props {\r\n modelValue?: string\r\n height?: string | number\r\n disabled?: boolean\r\n placeholder?: string\r\n mode?: 'edit' | 'editable' | 'preview'\r\n toolbar?: object\r\n uploadImageConfig?: {\r\n accept?: string\r\n multiple?: boolean\r\n [key: string]: any\r\n }\r\n tocNavPosition?: 'left' | 'right'\r\n defaultFullscreen?: boolean\r\n autofocus?: boolean\r\n includeLevel?: number[]\r\n leftToolbar?: string\r\n rightToolbar?: string\r\n maxLength?: number\r\n showWordCount?: boolean\r\n autoSave?: boolean\r\n autoSaveInterval?: number\r\n /** 是否为暗色主题(外部传入) */\r\n isDark?: boolean\r\n }\r\n\r\n const props = withDefaults(defineProps<Props>(), {\r\n modelValue: '',\r\n height: '400px',\r\n disabled: false,\r\n placeholder: '请输入 Markdown 内容...',\r\n mode: 'editable',\r\n tocNavPosition: 'right',\r\n defaultFullscreen: false,\r\n autofocus: false,\r\n includeLevel: () => [1, 2, 3, 4, 5, 6],\r\n leftToolbar:\r\n 'undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save',\r\n rightToolbar: 'preview toc sync-scroll fullscreen',\r\n maxLength: 50000,\r\n showWordCount: true,\r\n autoSave: false,\r\n autoSaveInterval: 30000,\r\n isDark: false,\r\n })\r\n\r\n interface Emits {\r\n 'update:modelValue': [value: string]\r\n change: [text: string, html: string]\r\n save: [text: string, html: string]\r\n 'upload-image': [\r\n event: Event,\r\n insertImage: InsertImageFunction,\r\n files: FileList,\r\n ]\r\n 'fullscreen-change': [isFullscreen: boolean]\r\n 'copy-code-success': [text: string]\r\n 'word-count-change': [count: number]\r\n 'auto-save': [text: string]\r\n 'max-length-exceeded': [currentLength: number, maxLength: number]\r\n }\r\n\r\n const emit = defineEmits<Emits>()\r\n\r\n const editorRef = ref<any>(null)\r\n const cachedHtml = ref('')\r\n\r\n const wordCount = computed(() => {\r\n return props.modelValue?.length || 0\r\n })\r\n\r\n const computedUploadImageConfig = computed(() => {\r\n const defaultConfig = {\r\n accept: 'image/*',\r\n multiple: false,\r\n }\r\n return props.uploadImageConfig\r\n ? { ...defaultConfig, ...props.uploadImageConfig }\r\n : defaultConfig\r\n })\r\n\r\n onMounted(() => {\r\n if (props.showWordCount && props.modelValue) {\r\n emit('word-count-change', props.modelValue.length)\r\n }\r\n })\r\n\r\n watch(\r\n () => props.modelValue,\r\n newValue => {\r\n if (props.showWordCount) {\r\n emit('word-count-change', newValue?.length || 0)\r\n }\r\n },\r\n { immediate: true }\r\n )\r\n\r\n const handleInput = (value: string) => {\r\n if (value.length > props.maxLength) {\r\n emit('max-length-exceeded', value.length, props.maxLength)\r\n return\r\n }\r\n emit('update:modelValue', value)\r\n if (props.showWordCount) {\r\n emit('word-count-change', value.length)\r\n }\r\n }\r\n\r\n const handleChange = (text: string, html: string) => {\r\n cachedHtml.value = html\r\n emit('change', text, html)\r\n if (props.autoSave) {\r\n autoSave(text)\r\n }\r\n }\r\n\r\n const handleSave = (text: string, html: string) => {\r\n emit('save', text, html)\r\n }\r\n\r\n const handleUploadImage = (\r\n event: Event,\r\n insertImage: InsertImageFunction,\r\n files: FileList\r\n ) => {\r\n emit('upload-image', event, insertImage, files)\r\n }\r\n\r\n const handleFullscreenChange = (isFullscreen: boolean) => {\r\n emit('fullscreen-change', isFullscreen)\r\n }\r\n\r\n const handleCopyCodeSuccess = (text: string) => {\r\n emit('copy-code-success', text)\r\n }\r\n\r\n let autoSaveTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\n const autoSave = (text: string) => {\r\n if (autoSaveTimer) clearTimeout(autoSaveTimer)\r\n autoSaveTimer = setTimeout(() => {\r\n emit('auto-save', text)\r\n }, props.autoSaveInterval)\r\n }\r\n\r\n const focus = () => {\r\n editorRef.value?.focus()\r\n }\r\n\r\n const getHtml = (): string => {\r\n return cachedHtml.value\r\n }\r\n\r\n const insertText = (text: string) => {\r\n editorRef.value?.insert((selected: string) => ({\r\n text: `${selected}${text}`,\r\n selected: text,\r\n }))\r\n }\r\n\r\n defineExpose({\r\n focus,\r\n getHtml,\r\n insertText,\r\n wordCount,\r\n })\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n @use './index.scss';\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-20\r\n * @Description: Markdown 编辑器封装组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n class=\"c-markdown-wrapper\"\r\n :class=\"{ 'is-dark': isDark }\"\r\n >\r\n <VMdEditor\r\n ref=\"editorRef\"\r\n :model-value=\"modelValue\"\r\n :height=\"height\"\r\n :placeholder=\"placeholder\"\r\n :toolbar=\"toolbar\"\r\n :mode=\"mode\"\r\n :upload-image-config=\"computedUploadImageConfig\"\r\n :toc-nav-position=\"tocNavPosition\"\r\n :default-fullscreen=\"defaultFullscreen\"\r\n :autofocus=\"autofocus\"\r\n :include-level=\"includeLevel\"\r\n :left-toolbar=\"leftToolbar\"\r\n :right-toolbar=\"rightToolbar\"\r\n :default-show-toc=\"true\"\r\n @update:model-value=\"handleInput\"\r\n @change=\"handleChange\"\r\n @save=\"handleSave\"\r\n @upload-image=\"handleUploadImage\"\r\n @fullscreen-change=\"handleFullscreenChange\"\r\n @copy-code-success=\"handleCopyCodeSuccess\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { ref, computed, watch, onMounted } from 'vue'\r\n import VMdEditor from '@kangc/v-md-editor'\r\n\r\n defineOptions({ name: 'C_Markdown' })\r\n\r\n export type InsertImageFunction = (config: {\r\n url: string\r\n desc?: string\r\n width?: string | number\r\n height?: string | number\r\n }) => void\r\n\r\n interface Props {\r\n modelValue?: string\r\n height?: string | number\r\n disabled?: boolean\r\n placeholder?: string\r\n mode?: 'edit' | 'editable' | 'preview'\r\n toolbar?: object\r\n uploadImageConfig?: {\r\n accept?: string\r\n multiple?: boolean\r\n [key: string]: any\r\n }\r\n tocNavPosition?: 'left' | 'right'\r\n defaultFullscreen?: boolean\r\n autofocus?: boolean\r\n includeLevel?: number[]\r\n leftToolbar?: string\r\n rightToolbar?: string\r\n maxLength?: number\r\n showWordCount?: boolean\r\n autoSave?: boolean\r\n autoSaveInterval?: number\r\n /** 是否为暗色主题(外部传入) */\r\n isDark?: boolean\r\n }\r\n\r\n const props = withDefaults(defineProps<Props>(), {\r\n modelValue: '',\r\n height: '400px',\r\n disabled: false,\r\n placeholder: '请输入 Markdown 内容...',\r\n mode: 'editable',\r\n tocNavPosition: 'right',\r\n defaultFullscreen: false,\r\n autofocus: false,\r\n includeLevel: () => [1, 2, 3, 4, 5, 6],\r\n leftToolbar:\r\n 'undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save',\r\n rightToolbar: 'preview toc sync-scroll fullscreen',\r\n maxLength: 50000,\r\n showWordCount: true,\r\n autoSave: false,\r\n autoSaveInterval: 30000,\r\n isDark: false,\r\n })\r\n\r\n interface Emits {\r\n 'update:modelValue': [value: string]\r\n change: [text: string, html: string]\r\n save: [text: string, html: string]\r\n 'upload-image': [\r\n event: Event,\r\n insertImage: InsertImageFunction,\r\n files: FileList,\r\n ]\r\n 'fullscreen-change': [isFullscreen: boolean]\r\n 'copy-code-success': [text: string]\r\n 'word-count-change': [count: number]\r\n 'auto-save': [text: string]\r\n 'max-length-exceeded': [currentLength: number, maxLength: number]\r\n }\r\n\r\n const emit = defineEmits<Emits>()\r\n\r\n const editorRef = ref<any>(null)\r\n const cachedHtml = ref('')\r\n\r\n const wordCount = computed(() => {\r\n return props.modelValue?.length || 0\r\n })\r\n\r\n const computedUploadImageConfig = computed(() => {\r\n const defaultConfig = {\r\n accept: 'image/*',\r\n multiple: false,\r\n }\r\n return props.uploadImageConfig\r\n ? { ...defaultConfig, ...props.uploadImageConfig }\r\n : defaultConfig\r\n })\r\n\r\n onMounted(() => {\r\n if (props.showWordCount && props.modelValue) {\r\n emit('word-count-change', props.modelValue.length)\r\n }\r\n })\r\n\r\n watch(\r\n () => props.modelValue,\r\n newValue => {\r\n if (props.showWordCount) {\r\n emit('word-count-change', newValue?.length || 0)\r\n }\r\n },\r\n { immediate: true }\r\n )\r\n\r\n const handleInput = (value: string) => {\r\n if (value.length > props.maxLength) {\r\n emit('max-length-exceeded', value.length, props.maxLength)\r\n return\r\n }\r\n emit('update:modelValue', value)\r\n if (props.showWordCount) {\r\n emit('word-count-change', value.length)\r\n }\r\n }\r\n\r\n const handleChange = (text: string, html: string) => {\r\n cachedHtml.value = html\r\n emit('change', text, html)\r\n if (props.autoSave) {\r\n autoSave(text)\r\n }\r\n }\r\n\r\n const handleSave = (text: string, html: string) => {\r\n emit('save', text, html)\r\n }\r\n\r\n const handleUploadImage = (\r\n event: Event,\r\n insertImage: InsertImageFunction,\r\n files: FileList\r\n ) => {\r\n emit('upload-image', event, insertImage, files)\r\n }\r\n\r\n const handleFullscreenChange = (isFullscreen: boolean) => {\r\n emit('fullscreen-change', isFullscreen)\r\n }\r\n\r\n const handleCopyCodeSuccess = (text: string) => {\r\n emit('copy-code-success', text)\r\n }\r\n\r\n let autoSaveTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\n const autoSave = (text: string) => {\r\n if (autoSaveTimer) clearTimeout(autoSaveTimer)\r\n autoSaveTimer = setTimeout(() => {\r\n emit('auto-save', text)\r\n }, props.autoSaveInterval)\r\n }\r\n\r\n const focus = () => {\r\n editorRef.value?.focus()\r\n }\r\n\r\n const getHtml = (): string => {\r\n return cachedHtml.value\r\n }\r\n\r\n const insertText = (text: string) => {\r\n editorRef.value?.insert((selected: string) => ({\r\n text: `${selected}${text}`,\r\n selected: text,\r\n }))\r\n }\r\n\r\n defineExpose({\r\n focus,\r\n getHtml,\r\n insertText,\r\n wordCount,\r\n })\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n @use './index.scss';\r\n</style>\r\n"],"mappings":"8hCE4EE,IAAM,EAAQ,EAoCR,EAAO,EAEP,GAAA,EAAA,EAAA,KAAqB,KAAK,CAC1B,GAAA,EAAA,EAAA,KAAiB,GAAG,CAEpB,GAAA,EAAA,EAAA,cACG,EAAM,YAAY,QAAU,EACnC,CAEI,GAAA,EAAA,EAAA,cAA2C,CAC/C,IAAM,EAAgB,CACpB,OAAQ,UACR,SAAU,GACX,CACD,OAAO,EAAM,kBACT,CAAE,GAAG,EAAe,GAAG,EAAM,kBAAmB,CAChD,GACJ,EAEF,EAAA,EAAA,eAAgB,CACV,EAAM,eAAiB,EAAM,YAC/B,EAAK,oBAAqB,EAAM,WAAW,OAAO,EAEpD,EAEF,EAAA,EAAA,WACQ,EAAM,WACZ,GAAY,CACN,EAAM,eACR,EAAK,oBAAqB,GAAU,QAAU,EAAE,EAGpD,CAAE,UAAW,GAAM,CACpB,CAED,IAAM,EAAe,GAAkB,CACrC,GAAI,EAAM,OAAS,EAAM,UAAW,CAClC,EAAK,sBAAuB,EAAM,OAAQ,EAAM,UAAU,CAC1D,OAEF,EAAK,oBAAqB,EAAM,CAC5B,EAAM,eACR,EAAK,oBAAqB,EAAM,OAAO,EAIrC,GAAgB,EAAc,IAAiB,CACnD,EAAW,MAAQ,EACnB,EAAK,SAAU,EAAM,EAAK,CACtB,EAAM,UACR,EAAS,EAAK,EAIZ,GAAc,EAAc,IAAiB,CACjD,EAAK,OAAQ,EAAM,EAAK,EAGpB,GACJ,EACA,EACA,IACG,CACH,EAAK,eAAgB,EAAO,EAAa,EAAM,EAG3C,EAA0B,GAA0B,CACxD,EAAK,oBAAqB,EAAa,EAGnC,EAAyB,GAAiB,CAC9C,EAAK,oBAAqB,EAAK,EAG7B,EAAsD,KAEpD,EAAY,GAAiB,CAC7B,GAAe,aAAa,EAAc,CAC9C,EAAgB,eAAiB,CAC/B,EAAK,YAAa,EAAK,EACtB,EAAM,iBAAiB,SAkB5B,EAAa,CACX,UAhBkB,CAClB,EAAU,OAAO,OAAO,EAgBxB,YAZO,EAAW,MAalB,WAVkB,GAAiB,CACnC,EAAU,OAAO,OAAQ,IAAsB,CAC7C,KAAM,GAAG,IAAW,IACpB,SAAU,EACX,EAAE,EAOH,YACD,CAAC,oDArLI,MAAA,CAzBJ,OAAA,EAAA,EAAA,gBAAK,CAAC,qBAAoB,CAAA,UACLA,EAAAA,OAAM,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,EAAA,cAAA,EAAA,EAAA,OAuBzB,EAAA,QAAA,CAAA,SApBI,YAAJ,IAAI,EACH,cAAaC,EAAAA,WACb,OAAQC,EAAAA,OACR,YAAaC,EAAAA,YACb,QAASC,EAAAA,QACT,KAAMC,EAAAA,KACN,sBAAqB,EAAA,MACrB,mBAAkBC,EAAAA,eAClB,qBAAoBC,EAAAA,kBACpB,UAAWC,EAAAA,UACX,gBAAeC,EAAAA,aACf,eAAcC,EAAAA,YACd,gBAAeC,EAAAA,aACf,mBAAkB,GAClB,sBAAoB,EACpB,SAAQ,EACR,OAAM,EACN,cAAc,EACd,mBAAmB,EACnB,kBAAmB"}
|