@next-bricks/data-view 1.10.13 → 1.11.0

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.
@@ -1,2 +0,0 @@
1
- "use strict";(globalThis.webpackChunk_next_bricks_data_view=globalThis.webpackChunk_next_bricks_data_view||[]).push([[5509],{7851:(e,t,a)=>{a.r(t),a.d(t,{ChinaMap:()=>R,ChinaMapComponent:()=>z});var r=a(70918),s=a(86121),n=a(70829),i=a(62740),l=a(18769),o=a.n(l),c=a(20563),d=a(6192),h=a(99859),f=(a(37),a(20840)),p=a(86168),u=a(47906),m=a(84890),g=a(10177),v=a(13910);let w,x,b,y,S,k,E;var A,C;const{defineElement:P,property:N}=(0,d.createDecorators)(),_=(0,h.wrapBrick)("eo-icon"),F=960,W=750,B=null!==(A=window.devicePixelRatio)&&void 0!==A?A:1,M=[{fill:"rgba(84, 239, 241, 0.2)",shadowColor:"rgba(84, 239, 241, 0.2)",shadowBlur:2,shadowOffsetY:1,offset:28},{fill:"#bee1e2",shadowColor:"rgba(93,250,255,0.2)",shadowBlur:4,shadowOffsetY:10,offset:23},{fill:"#000",offset:19.5},{lineWidth:1,strokeStyle:"#2B64FF",offset:15},{lineWidth:1.5,strokeStyle:"#2B64FF",offset:10}];let R;var D=new WeakMap,O=new WeakMap,Y=new WeakMap;class $ extends h.ReactNextElement{constructor(){super(...arguments),(0,r.A)(this,D,x(this)),(0,r.A)(this,O,(b(this),y(this))),(0,r.A)(this,Y,(S(this),k(this))),E(this)}get province(){return(0,n.A)(D,this)}set province(e){(0,s.A)(D,this,e)}get dataSource(){return(0,n.A)(O,this)}set dataSource(e){(0,s.A)(O,this,e)}get maxScale(){return(0,n.A)(Y,this)}set maxScale(e){(0,s.A)(Y,this,e)}render(){return o().createElement(z,{root:this,province:this.province,dataSource:this.dataSource,maxScale:this.maxScale})}}function z(e){let{root:t,province:r,dataSource:s,maxScale:n}=e;const i=(0,u.D)({width:F,height:W,root:t,maxScale:n}),d=(0,l.useRef)(null),[h,v]=(0,l.useState)([]),[w,x]=(0,l.useState)(!1);return(0,l.useEffect)((()=>{const e=d.current.getContext("2d");let t=!1;return(async()=>{let n,i,l,o,d;try{[d]=await Promise.all([new Promise(((e,t)=>{const a=new Image;a.onload=()=>{e(a)},a.onerror=e=>{t(e)},a.src=m})),(async()=>{if(r){const[e,t]=await Promise.all([a.e(8763).then(a.t.bind(a,1144,19)),a.e(6873).then(a.t.bind(a,76873,19))]),s=e.default;if(o=t.default,l=o.find((e=>"province"===e.level&&e.name.includes(r))),!l)throw new Error(`没有找到省份:"${r}"`);n={type:"FeatureCollection",features:s.features.filter((e=>e.properties.province_adcode===l.adcode))}}else{const e=(await a.e(2785).then(a.t.bind(a,52785,19))).default,t=(0,c.groupBy)(e.features,(e=>e.properties.name?"main-land":"south-sea"));n={type:"FeatureCollection",features:t["main-land"]},i={type:"FeatureCollection",features:t["south-sea"]}}})()])}catch(a){return void(t||(x(String(a)),e.clearRect(0,0,F*B,W*B),v([])))}if(t)return;x(!0),e.clearRect(0,0,F*B,W*B),e.strokeStyle="#fff",e.lineWidth=2.5*B,e.lineJoin="round";const h=(0,f.Ay)().fitExtent([[10*B,10*B],[(F-10)*B,(W-25)*B]],n),u=(0,p.A)(h,e);M.forEach((t=>{const a=e;var r,s;e.save(),e.translate(0,t.offset*B),t.shadowColor&&(a.shadowColor=t.shadowColor,a.shadowBlur=(null!==(r=t.shadowBlur)&&void 0!==r?r:0)*B,a.shadowOffsetY=(null!==(s=t.shadowOffsetY)&&void 0!==s?s:0)*B),a.beginPath(),(0,p.A)(h,a)(n),a.closePath(),t.fill&&(a.fillStyle=t.fill,a.fill()),t.lineWidth&&(a.strokeStyle=t.strokeStyle,a.lineWidth=t.lineWidth*B,a.stroke()),e.restore()})),e.save();{const t=e.createPattern(d,"repeat");e.fillStyle=t}e.beginPath(),u(n),e.closePath(),e.fill(),e.restore(),e.save(),e.strokeStyle="#3DC6FF",e.beginPath(),u(n),e.closePath(),e.stroke(),e.restore(),r||(e.save(),e.strokeStyle="rgb(30, 144, 255)",e.beginPath(),u(i),e.closePath(),e.stroke(),e.restore()),v(null==s?void 0:s.flatMap((e=>{let t,a;if(l){const r=o.find((t=>"city"===t.level&&t.parent===l.adcode&&t.name.includes(e.city)));if(!r)return[];({lng:t,lat:a}=r)}else{var r;const s=n.features.find((t=>"province"===t.properties.level&&t.properties.name.includes(e.province)));if(!s)return[];[t,a]=null!==(r=s.properties.cp)&&void 0!==r?r:s.properties.center}const s=h([t,a]),i=s[0]/B;return{left:i,top:s[1]/B,text:e.text,align:i>F-150?"left":"right"}})))})(),()=>{t=!0}}),[r,s]),o().createElement("div",{className:"container",style:{width:F,height:W,visibility:null===i?"hidden":"visible","--scale":i}},!0!==w&&o().createElement("div",{className:"message",style:{width:F,height:W}},!1===w&&o().createElement(_,{lib:"antd",icon:"loading",spinning:!0,className:"loading"}),"string"==typeof w&&o().createElement("div",{className:"error"},w)),o().createElement("canvas",{ref:d,width:F*B,height:W*B,style:{width:F,height:W}}),o().createElement("div",{className:"labels",style:{width:F,height:W}},null==h?void 0:h.map(((e,t)=>o().createElement("div",{key:t,className:`label ${e.align}`,style:{left:e.left,top:e.top}},o().createElement("img",{width:28,height:32,className:"marker",src:g}),o().createElement("div",{className:"text"},e.text))))))}C=$,({e:[x,b,y,S,k,E],c:[R,w]}=(0,i.A)(C,[P("data-view.china-map",{styleTexts:[v.A]})],[[N(),1,"province"],[N({attribute:!1}),1,"dataSource"],[N({type:Number}),1,"maxScale"]],0,void 0,h.ReactNextElement)),w()},10177:(e,t,a)=>{e.exports=a.p+"images/d20b2c27.svg"},13910:(e,t,a)=>{a.d(t,{A:()=>f});var r=a(36758),s=a.n(r),n=a(40935),i=a.n(n),l=a(20062),o=a.n(l),c=new URL(a(99158),a.b),d=i()(s()),h=o()(c);d.push([e.id,`:host,\n.message{display:flex;align-items:center;justify-content:center}:host{position:relative;color:#fff;height:100%}:host([hidden]){display:none}*{box-sizing:border-box}.container{position:relative;transform:scale(var(--scale));--scale:1}canvas,\n.message,\n.labels{position:absolute;left:50%;transform:translate(-50%,0);top:0}.loading{font-size:48px}.error{color:var(--color-error)}.label{position:absolute;display:flex;align-items:center;transform:translate(-14px,-28px)}.text{height:22px;line-height:22px;font-size:12px;background:url(${h}) no-repeat center left;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);text-indent:10px;transform:translate(0,-18px);white-space:nowrap;color:#fffcef}.left > .text{transform:translate(calc(-100% - 32px),-18px)}`,""]);const f=d.toString()},20062:e=>{e.exports=function(e,t){return t||(t={}),e?(e=String(e.__esModule?e.default:e),/^['"].*['"]$/.test(e)&&(e=e.slice(1,-1)),t.hash&&(e+=t.hash),/["'() \t\n]|(%20)/.test(e)||t.needQuotes?'"'.concat(e.replace(/"/g,'\\"').replace(/\n/g,"\\n"),'"'):e):e}},47906:(e,t,a)=>{a.d(t,{D:()=>n});var r=a(18769),s=a(99126);function n(e){let{width:t,height:a,root:n,maxScale:i,disabled:l}=e;const[o,c]=(0,r.useState)(null);return(0,r.useEffect)((()=>{if(l)return void c(null);const e=new s.A((e=>{for(const r of e)if(r.target===n){const{width:e,height:s}=r.contentRect;c(Math.min(null!=i?i:1,e/t,s/a))}}));return e.observe(n),()=>e.disconnect()}),[a,t,l,i,n]),o}},84890:(e,t,a)=>{e.exports=a.p+"images/7e4100fd.png"},99158:(e,t,a)=>{e.exports=a.p+"images/4f7762f3.svg"}}]);
2
- //# sourceMappingURL=china-map.a31fb444.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"chunks/china-map.a31fb444.js","mappings":"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","sources":["webpack:///./src/china-map/index.tsx","webpack:///./src/china-map/styles.shadow.css","webpack:///../../node_modules/css-loader/dist/runtime/getUrl.js","webpack:///./src/shared/useContainerScale.ts"],"sourcesContent":["import React, { useEffect, useRef, useState } from \"react\";\nimport { groupBy } from \"lodash\";\nimport { createDecorators } from \"@next-core/element\";\nimport { ReactNextElement, wrapBrick } from \"@next-core/react-element\";\nimport \"@next-core/theme\";\nimport { geoPath, geoMercator, type ExtendedFeatureCollection } from \"d3-geo\";\nimport type {\n GeneralIcon,\n GeneralIconProps,\n} from \"@next-bricks/icons/general-icon\";\nimport { useContainerScale } from \"../shared/useContainerScale\";\nimport texturePng from \"../china-map-chart/assets/texture.png\";\nimport markerSvg from \"../china-map-chart/assets/default.svg?url\";\nimport styleText from \"./styles.shadow.css\";\n\nconst { defineElement, property } = createDecorators();\n\nconst WrappedIcon = wrapBrick<GeneralIcon, GeneralIconProps>(\"eo-icon\");\n\nconst BASE_WIDTH = 960;\nconst BASE_HEIGHT = 750;\nconst pixelRatio = window.devicePixelRatio ?? 1;\nconst layers = [\n {\n fill: \"rgba(84, 239, 241, 0.2)\",\n shadowColor: \"rgba(84, 239, 241, 0.2)\",\n shadowBlur: 2,\n shadowOffsetY: 1,\n offset: 28,\n },\n {\n fill: \"#bee1e2\",\n shadowColor: \"rgba(93,250,255,0.2)\",\n shadowBlur: 4,\n shadowOffsetY: 10,\n offset: 23,\n },\n {\n fill: \"#000\",\n offset: 19.5,\n },\n {\n lineWidth: 1,\n strokeStyle: \"#2B64FF\",\n offset: 15,\n },\n {\n lineWidth: 1.5,\n strokeStyle: \"#2B64FF\",\n offset: 10,\n },\n];\n\nexport interface ChinaMapProps {\n province?: string;\n dataSource?: DataItem[];\n maxScale?: number;\n}\n\nexport interface DataItem {\n province?: string;\n city?: string;\n text: string;\n}\n\n/**\n * 构件 `data-view.china-map`\n */\nexport\n@defineElement(\"data-view.china-map\", {\n styleTexts: [styleText],\n})\nclass ChinaMap extends ReactNextElement implements ChinaMapProps {\n /**\n * 省份名称,例如“广东”。如果设置,则只显示该省份的地图,否则显示全国地图\n */\n @property()\n accessor province: string | undefined;\n\n /**\n * 数据源\n */\n @property({ attribute: false })\n accessor dataSource: DataItem[] | undefined;\n\n /**\n * 最大缩放比例\n *\n * @default 1\n */\n @property({ type: Number })\n accessor maxScale: number | undefined;\n\n render() {\n return (\n <ChinaMapComponent\n root={this}\n province={this.province}\n dataSource={this.dataSource}\n maxScale={this.maxScale}\n />\n );\n }\n}\n\nexport interface ChinaMapComponentProps extends ChinaMapProps {\n root: ChinaMap;\n}\n\ninterface Area {\n name: string;\n level: \"country\" | \"province\" | \"city\" | \"district\";\n adcode: number;\n lng: number;\n lat: number;\n parent: number;\n}\n\ninterface Label {\n left: number;\n top: number;\n text: string;\n align: \"left\" | \"right\";\n}\n\nexport function ChinaMapComponent({\n root,\n province,\n dataSource,\n maxScale,\n}: ChinaMapComponentProps) {\n const scale = useContainerScale({\n width: BASE_WIDTH,\n height: BASE_HEIGHT,\n root,\n maxScale,\n });\n\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [labels, setLabels] = useState<Label[]>([]);\n\n // true: loaded\n // false: loading\n // string: error\n const [state, setState] = useState<boolean | string>(false);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n const context = canvas.getContext(\"2d\");\n let ignore = false;\n\n (async () => {\n let geo: ExtendedFeatureCollection;\n let SouthSea: ExtendedFeatureCollection;\n let matchedProvince: Area | undefined;\n let AreaList: Area[] | undefined;\n\n let image: HTMLImageElement;\n try {\n [image] = await Promise.all([\n new Promise<HTMLImageElement>((resolve, reject) => {\n const img = new Image();\n // istanbul ignore next: can't mock image\n img.onload = () => {\n resolve(img);\n };\n // istanbul ignore next: can't mock image\n img.onerror = (reason) => {\n reject(reason);\n };\n img.src = texturePng;\n // istanbul ignore next: can't mock image\n if (process.env.NODE_ENV === \"test\") {\n resolve(null);\n }\n }),\n (async () => {\n if (province) {\n const [CitiesImport, AreaListImport] = await Promise.all([\n import(\"./cities.json\"),\n import(\"../china-map-chart/area-list.json\"),\n ]);\n\n const Cities =\n CitiesImport.default as unknown as ExtendedFeatureCollection;\n AreaList = AreaListImport.default as unknown as Area[];\n matchedProvince = AreaList.find(\n (a) => a.level === \"province\" && a.name.includes(province)\n );\n if (!matchedProvince) {\n throw new Error(`没有找到省份:\"${province}\"`);\n }\n geo = {\n type: \"FeatureCollection\",\n features: Cities.features.filter(\n (f) => f.properties.province_adcode === matchedProvince.adcode\n ),\n };\n } else {\n const ChinaImport = await import(\"./provinces.json\");\n const ChinaGeoJson =\n ChinaImport.default as unknown as ExtendedFeatureCollection;\n const geoGroup = groupBy(ChinaGeoJson.features, (f) =>\n f.properties.name ? \"main-land\" : \"south-sea\"\n );\n geo = {\n type: \"FeatureCollection\",\n features: geoGroup[\"main-land\"],\n };\n SouthSea = {\n type: \"FeatureCollection\",\n features: geoGroup[\"south-sea\"],\n };\n }\n })(),\n ]);\n } catch (e) {\n if (!ignore) {\n setState(String(e));\n context.clearRect(\n 0,\n 0,\n BASE_WIDTH * pixelRatio,\n BASE_HEIGHT * pixelRatio\n );\n setLabels([]);\n }\n return;\n }\n\n if (ignore) {\n return;\n }\n\n setState(true);\n\n context.clearRect(\n 0,\n 0,\n BASE_WIDTH * pixelRatio,\n BASE_HEIGHT * pixelRatio\n );\n\n context.strokeStyle = \"#fff\";\n context.lineWidth = 2.5 * pixelRatio;\n context.lineJoin = \"round\";\n\n const projection = geoMercator().fitExtent(\n [\n [10 * pixelRatio, 10 * pixelRatio],\n [(BASE_WIDTH - 10) * pixelRatio, (BASE_HEIGHT - 25) * pixelRatio],\n ],\n geo\n );\n const path = geoPath(projection, context);\n\n // 3D 效果层\n layers.forEach((layer) => {\n const ctx = context;\n context.save();\n context.translate(0, layer.offset * pixelRatio);\n\n if (layer.shadowColor) {\n ctx.shadowColor = layer.shadowColor;\n ctx.shadowBlur = (layer.shadowBlur ?? 0) * pixelRatio;\n ctx.shadowOffsetY = (layer.shadowOffsetY ?? 0) * pixelRatio;\n }\n\n ctx.beginPath();\n const p = geoPath(projection, ctx);\n p(geo);\n ctx.closePath();\n\n if (layer.fill) {\n ctx.fillStyle = layer.fill;\n ctx.fill();\n }\n\n if (layer.lineWidth) {\n ctx.strokeStyle = layer.strokeStyle;\n ctx.lineWidth = layer.lineWidth * pixelRatio;\n ctx.stroke();\n }\n context.restore();\n });\n\n // 纹理填充\n context.save();\n // istanbul ignore next: can't mock image\n if (process.env.NODE_ENV !== \"test\") {\n const pattern = context.createPattern(image, \"repeat\");\n context.fillStyle = pattern;\n }\n context.beginPath();\n path(geo);\n context.closePath();\n context.fill();\n context.restore();\n\n // 边界线\n context.save();\n context.strokeStyle = \"#3DC6FF\";\n context.beginPath();\n path(geo);\n context.closePath();\n context.stroke();\n context.restore();\n\n // 南海\n if (!province) {\n context.save();\n context.strokeStyle = \"rgb(30, 144, 255)\";\n context.beginPath();\n path(SouthSea);\n context.closePath();\n context.stroke();\n context.restore();\n }\n\n // 标签\n setLabels(\n dataSource?.flatMap<Label>((label) => {\n let lng: number;\n let lat: number;\n if (matchedProvince) {\n const area = AreaList.find(\n (a) =>\n a.level === \"city\" &&\n a.parent === matchedProvince.adcode &&\n a.name.includes(label.city)\n );\n if (!area) {\n return [];\n }\n ({ lng, lat } = area);\n } else {\n const feature = geo.features.find(\n (f) =>\n f.properties.level === \"province\" &&\n f.properties.name.includes(label.province)\n );\n if (!feature) {\n return [];\n }\n [lng, lat] = feature.properties.cp ?? feature.properties.center;\n }\n\n const point = projection([lng, lat]);\n const left = point[0] / pixelRatio;\n const top = point[1] / pixelRatio;\n\n return {\n left,\n top,\n text: label.text,\n // 防止标签超出边界,将最右侧的标签左对齐\n align: left > BASE_WIDTH - 150 ? \"left\" : \"right\",\n };\n })\n );\n })();\n\n return () => {\n ignore = true;\n };\n }, [province, dataSource]);\n\n return (\n <div\n className=\"container\"\n style={\n {\n width: BASE_WIDTH,\n height: BASE_HEIGHT,\n visibility: scale === null ? \"hidden\" : \"visible\",\n \"--scale\": scale,\n } as React.CSSProperties & {\n \"--scale\": number;\n }\n }\n >\n {state !== true && (\n <div\n className=\"message\"\n style={{ width: BASE_WIDTH, height: BASE_HEIGHT }}\n >\n {state === false && (\n <WrappedIcon\n lib=\"antd\"\n icon=\"loading\"\n spinning\n className=\"loading\"\n />\n )}\n {typeof state === \"string\" && <div className=\"error\">{state}</div>}\n </div>\n )}\n <canvas\n ref={canvasRef}\n width={BASE_WIDTH * pixelRatio}\n height={BASE_HEIGHT * pixelRatio}\n style={{ width: BASE_WIDTH, height: BASE_HEIGHT }}\n />\n <div\n className=\"labels\"\n style={{\n width: BASE_WIDTH,\n height: BASE_HEIGHT,\n }}\n >\n {labels?.map((label, index) => (\n <div\n key={index}\n className={`label ${label.align}`}\n style={{ left: label.left, top: label.top }}\n >\n <img width={28} height={32} className=\"marker\" src={markerSvg} />\n <div className=\"text\">{label.text}</div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nimport ___CSS_LOADER_GET_URL_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/getUrl.js\";\nvar ___CSS_LOADER_URL_IMPORT_0___ = new URL(\"../china-map-chart/assets/label.svg\", import.meta.url);\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:host,\n.message{display:flex;align-items:center;justify-content:center}:host{position:relative;color:#fff;height:100%}:host([hidden]){display:none}*{box-sizing:border-box}.container{position:relative;transform:scale(var(--scale));--scale:1}canvas,\n.message,\n.labels{position:absolute;left:50%;transform:translate(-50%,0);top:0}.loading{font-size:48px}.error{color:var(--color-error)}.label{position:absolute;display:flex;align-items:center;transform:translate(-14px,-28px)}.text{height:22px;line-height:22px;font-size:12px;background:url(${___CSS_LOADER_URL_REPLACEMENT_0___}) no-repeat center left;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);text-indent:10px;transform:translate(0,-18px);white-space:nowrap;color:#fffcef}.left > .text{transform:translate(calc(-100% - 32px),-18px)}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___.toString();\n","\"use strict\";\n\nmodule.exports = function (url, options) {\n if (!options) {\n options = {};\n }\n if (!url) {\n return url;\n }\n url = String(url.__esModule ? url.default : url);\n\n // If url is already wrapped in quotes, remove them\n if (/^['\"].*['\"]$/.test(url)) {\n url = url.slice(1, -1);\n }\n if (options.hash) {\n url += options.hash;\n }\n\n // Should url be wrapped?\n // See https://drafts.csswg.org/css-values-3/#urls\n if (/[\"'() \\t\\n]|(%20)/.test(url) || options.needQuotes) {\n return \"\\\"\".concat(url.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\"), \"\\\"\");\n }\n return url;\n};","import { useEffect, useState } from \"react\";\nimport ResizeObserver from \"resize-observer-polyfill\";\n\n/**\n * 根据容器尺寸进行缩放\n */\nexport function useContainerScale({\n width: baseWidth,\n height: baseHeight,\n root,\n maxScale,\n disabled,\n}: {\n width: number;\n height: number;\n root: HTMLElement;\n /** 最大缩放比例,默认为 1 */\n maxScale?: number;\n disabled?: boolean;\n}): number | null {\n const [scale, setScale] = useState<number | null>(null);\n\n useEffect(() => {\n if (disabled) {\n setScale(null);\n return;\n }\n // 当容器宽高低于预设值时,图形会自动缩小\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.target === root) {\n const { width, height } = entry.contentRect;\n setScale(\n Math.min(maxScale ?? 1, width / baseWidth, height / baseHeight)\n );\n }\n }\n });\n observer.observe(root);\n return () => observer.disconnect();\n }, [baseHeight, baseWidth, disabled, maxScale, root]);\n\n return scale;\n}\n"],"names":["defineElement","property","createDecorators","WrappedIcon","wrapBrick","BASE_WIDTH","BASE_HEIGHT","pixelRatio","_window$devicePixelRa","window","devicePixelRatio","layers","fill","shadowColor","shadowBlur","shadowOffsetY","offset","lineWidth","strokeStyle","_ChinaMap","_A","WeakMap","_B","_C","ChinaMap","ReactNextElement","constructor","arguments","_classPrivateFieldInitSpec","_init_province","_init_extra_province","_init_dataSource","_init_extra_dataSource","_init_maxScale","_init_extra_maxScale","province","_classPrivateFieldGet","v","_classPrivateFieldSet","dataSource","maxScale","render","React","ChinaMapComponent","root","this","_ref","scale","useContainerScale","width","height","canvasRef","useRef","labels","setLabels","useState","state","setState","useEffect","context","current","getContext","ignore","geo","SouthSea","matchedProvince","AreaList","image","Promise","all","resolve","reject","img","Image","onload","onerror","reason","src","texturePng","CitiesImport","AreaListImport","Cities","default","find","a","level","name","includes","Error","type","features","filter","f","properties","province_adcode","adcode","ChinaGeoJson","geoGroup","groupBy","e","String","clearRect","lineJoin","projection","geoMercator","fitExtent","path","geoPath","forEach","layer","ctx","_layer$shadowBlur","_layer$shadowOffsetY","save","translate","beginPath","p","closePath","fillStyle","stroke","restore","pattern","createPattern","flatMap","label","lng","lat","area","parent","city","_feature$properties$c","feature","cp","center","point","left","top","text","align","className","style","visibility","lib","icon","spinning","ref","map","index","key","markerSvg","_ChinaMap2","c","_initClass","_applyDecs","styleTexts","styleText","attribute","Number","___CSS_LOADER_URL_IMPORT_0___","URL","___CSS_LOADER_EXPORT___","___CSS_LOADER_URL_REPLACEMENT_0___","push","module","id","toString","exports","url","options","__esModule","test","slice","hash","needQuotes","concat","replace","baseWidth","baseHeight","disabled","setScale","observer","ResizeObserver","entries","entry","target","contentRect","Math","min","observe","disconnect"],"sourceRoot":""}