@visactor/vrender-components 0.20.14 → 0.20.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/cjs/axis/type.d.ts +2 -2
  2. package/cjs/axis/type.js.map +1 -1
  3. package/cjs/data-zoom/type.d.ts +1 -1
  4. package/cjs/data-zoom/type.js.map +1 -1
  5. package/cjs/index.d.ts +1 -1
  6. package/cjs/index.js +1 -1
  7. package/cjs/index.js.map +1 -1
  8. package/cjs/interface.js.map +1 -1
  9. package/cjs/label/base.js +12 -7
  10. package/cjs/label/base.js.map +1 -1
  11. package/cjs/label/overlap/place.d.ts +6 -1
  12. package/cjs/label/overlap/place.js +4 -4
  13. package/cjs/label/overlap/place.js.map +1 -1
  14. package/cjs/label/overlap/shiftY.d.ts +10 -4
  15. package/cjs/label/overlap/shiftY.js +103 -27
  16. package/cjs/label/overlap/shiftY.js.map +1 -1
  17. package/cjs/legend/color/type.d.ts +2 -2
  18. package/cjs/legend/color/type.js.map +1 -1
  19. package/cjs/legend/discrete/type.d.ts +1 -1
  20. package/cjs/legend/discrete/type.js.map +1 -1
  21. package/cjs/marker/type.d.ts +2 -2
  22. package/cjs/marker/type.js.map +1 -1
  23. package/cjs/player/type/discrete-player.d.ts +3 -3
  24. package/cjs/player/type/discrete-player.js.map +1 -1
  25. package/cjs/player/type/index.d.ts +2 -2
  26. package/cjs/player/type/index.js.map +1 -1
  27. package/cjs/timeline/type.js.map +1 -1
  28. package/dist/index.es.js +890 -740
  29. package/es/axis/type.d.ts +2 -2
  30. package/es/axis/type.js.map +1 -1
  31. package/es/data-zoom/type.d.ts +1 -1
  32. package/es/data-zoom/type.js.map +1 -1
  33. package/es/index.d.ts +1 -1
  34. package/es/index.js +1 -1
  35. package/es/index.js.map +1 -1
  36. package/es/interface.js.map +1 -1
  37. package/es/label/base.js +12 -7
  38. package/es/label/base.js.map +1 -1
  39. package/es/label/overlap/place.d.ts +6 -1
  40. package/es/label/overlap/place.js +4 -4
  41. package/es/label/overlap/place.js.map +1 -1
  42. package/es/label/overlap/shiftY.d.ts +10 -4
  43. package/es/label/overlap/shiftY.js +99 -24
  44. package/es/label/overlap/shiftY.js.map +1 -1
  45. package/es/legend/color/type.d.ts +2 -2
  46. package/es/legend/color/type.js.map +1 -1
  47. package/es/legend/discrete/type.d.ts +1 -1
  48. package/es/legend/discrete/type.js.map +1 -1
  49. package/es/marker/type.d.ts +2 -2
  50. package/es/marker/type.js.map +1 -1
  51. package/es/player/type/discrete-player.d.ts +3 -3
  52. package/es/player/type/discrete-player.js.map +1 -1
  53. package/es/player/type/index.d.ts +2 -2
  54. package/es/player/type/index.js.map +1 -1
  55. package/es/timeline/type.js.map +1 -1
  56. package/package.json +7 -6
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/label/overlap/place.ts"],"names":[],"mappings":"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","file":"place.js","sourcesContent":["import type { IText, Text } from '@visactor/vrender-core';\nimport type { IAABBBounds, IBoundsLike } from '@visactor/vutils';\nimport { isFunction, isValid } from '@visactor/vutils';\nimport type { PointLocationCfg } from '../../core/type';\nimport type { LabelBase } from '../base';\nimport type { BaseLabelAttrs, OverlapAttrs, Strategy } from '../type';\nimport type { Bitmap } from './bitmap';\nimport type { BitmapTool } from './scaler';\nimport { boundToRange, clampRangeByBitmap } from './scaler';\n\n/**\n * 防重叠逻辑参考 https://github.com/vega/vega/\n * Copyright (c) 2015-2023, University of Washington Interactive Data Lab\n All rights reserved.\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n\n 1. Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n 2. Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n 3. Neither the name of the copyright holder nor the names of its contributors\n may be used to endorse or promote products derived from this software\n without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\n FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nexport function canPlace($: BitmapTool, bitmap: Bitmap, bound: IBoundsLike, checkBound = true, pad = 0) {\n let range = bound;\n if (pad > 0) {\n range = {\n x1: bound.x1 - pad,\n x2: bound.x2 + pad,\n y1: bound.y1 - pad,\n y2: bound.y2 + pad\n };\n }\n range = boundToRange($, range);\n\n const outOfBounds = bitmap.outOfBounds(range);\n\n if (checkBound && outOfBounds) {\n return false;\n }\n\n // 超出边界,需要将判断区域调整到可视区域内\n if (outOfBounds) {\n range = clampRangeByBitmap($, range);\n }\n\n return !bitmap.getRange(range);\n}\n\n/**\n * 是否在图形内部\n * @param textBound\n * @param shapeBound\n * @returns\n */\nexport function canPlaceInside(textBound: IBoundsLike, shapeBound: IAABBBounds) {\n if (!textBound || !shapeBound) {\n return false;\n }\n return shapeBound.encloses(textBound);\n}\n\nexport function placeToCandidates(\n $: BitmapTool,\n bitmap: Bitmap,\n text: Text,\n candidates: PointLocationCfg[] = [],\n clampForce = true,\n pad = 0\n): PointLocationCfg | false {\n const validCandidates = candidates.filter(candidate => isValid(candidate));\n for (let i = 0; i < validCandidates.length; i++) {\n const tempText = text.clone();\n tempText.setAttributes(validCandidates[i]);\n tempText.update();\n\n if (canPlace($, bitmap, tempText.AABBBounds, clampForce, pad)) {\n bitmap.setRange(boundToRange($, tempText.AABBBounds, true));\n return validCandidates[i];\n }\n }\n return false;\n}\n\nexport function place<T extends BaseLabelAttrs>(\n $: BitmapTool,\n bitmap: Bitmap,\n s: Strategy,\n attrs: T,\n text: Text,\n bounds: IBoundsLike,\n labeling?: LabelBase<T>['labeling']\n): PointLocationCfg | false {\n const clampForce = (attrs.overlap as OverlapAttrs)?.clampForce;\n const overlapPadding = (attrs.overlap as OverlapAttrs)?.overlapPadding;\n if (s.type === 'bound' || s.type === 'position') {\n if (isFunction(labeling)) {\n // TODO:这里可以 filter 掉初始位置,提升一部分性能\n const userPosition = isFunction(s.position) ? s.position(text.attribute) : s.position;\n const positions = (userPosition || defaultLabelPosition(attrs.type)) as string[];\n const candidates = positions.map(p => labeling(text.AABBBounds, bounds, p, attrs.offset) as PointLocationCfg);\n return placeToCandidates($, bitmap, text, candidates, clampForce, overlapPadding);\n }\n return false;\n }\n\n if (s.type === 'moveY') {\n const offset = s.offset ? (isFunction(s.offset) ? s.offset(text.attribute) : s.offset) : [];\n const candidates = offset.map(dy => {\n return { x: text.attribute.x as number, y: (text.attribute.y as number) + dy };\n });\n return placeToCandidates($, bitmap, text, candidates, clampForce, overlapPadding);\n }\n\n if (s.type === 'moveX') {\n const offset = s.offset ? (isFunction(s.offset) ? s.offset(text.attribute) : s.offset) : [];\n const candidates = offset.map(dx => {\n return { x: (text.attribute.x as number) + dx, y: text.attribute.y as number };\n });\n return placeToCandidates($, bitmap, text, candidates, clampForce, overlapPadding);\n }\n return false;\n}\n\nexport const DefaultPositions = [\n 'top',\n 'bottom',\n 'right',\n 'left',\n 'top-right',\n 'bottom-right',\n 'top-left',\n 'bottom-left'\n];\nexport const DefaultRectPositions = ['top', 'inside-top', 'inside'];\n\nexport function defaultLabelPosition(type?: string) {\n switch (type) {\n case 'rect':\n return DefaultRectPositions;\n default:\n return DefaultPositions;\n }\n}\n\nexport function clampText(text: IText, width: number, height: number) {\n const { x1, x2, y1, y2 } = text.AABBBounds;\n const minX = Math.min(x1, x2);\n const maxX = Math.max(x1, x2);\n\n const minY = Math.min(y1, y2);\n const maxY = Math.max(y1, y2);\n\n let dx = 0;\n let dy = 0;\n\n // x 方向\n if (minX < 0 && maxX - minX <= width) {\n dx = -minX;\n } else if (maxX > width && minX - (maxX - width) >= 0) {\n dx = width - maxX;\n }\n\n // y 方向\n if (minY < 0 && maxY - minY <= height) {\n dy = -minY;\n } else if (maxY > height && minY - (maxY - height) >= 0) {\n dy = height - maxY;\n }\n\n return { dx, dy };\n}\n"]}
1
+ {"version":3,"sources":["../src/label/overlap/place.ts"],"names":[],"mappings":";;;AAEA,6CAAuD;AAMvD,qCAA4D;AAiC5D,SAAgB,QAAQ,CAAC,CAAa,EAAE,MAAc,EAAE,KAAkB,EAAE,UAAU,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC;IACpG,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,GAAG,GAAG,CAAC,EAAE;QACX,KAAK,GAAG;YACN,EAAE,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG;YAClB,EAAE,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG;YAClB,EAAE,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG;YAClB,EAAE,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG;SACnB,CAAC;KACH;IACD,KAAK,GAAG,IAAA,qBAAY,EAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAE/B,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAE9C,IAAI,UAAU,IAAI,WAAW,EAAE;QAC7B,OAAO,KAAK,CAAC;KACd;IAGD,IAAI,WAAW,EAAE;QACf,KAAK,GAAG,IAAA,2BAAkB,EAAC,CAAC,EAAE,KAAK,CAAC,CAAC;KACtC;IAED,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC;AAxBD,4BAwBC;AAQD,SAAgB,cAAc,CAAC,SAAsB,EAAE,UAAuB;IAC5E,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,EAAE;QAC7B,OAAO,KAAK,CAAC;KACd;IACD,OAAO,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AACxC,CAAC;AALD,wCAKC;AAED,SAAgB,iBAAiB,CAC/B,CAAa,EACb,MAAc,EACd,IAAU,EACV,aAAiC,EAAE,EACnC,UAAU,GAAG,IAAI,EACjB,GAAG,GAAG,CAAC;IAEP,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,IAAA,gBAAO,EAAC,SAAS,CAAC,CAAC,CAAC;IAC3E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,QAAQ,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,QAAQ,CAAC,MAAM,EAAE,CAAC;QAElB,IAAI,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE;YAC7D,MAAM,CAAC,QAAQ,CAAC,IAAA,qBAAY,EAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;YAC5D,OAAO,eAAe,CAAC,CAAC,CAAC,CAAC;SAC3B;KACF;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AApBD,8CAoBC;AAED,SAAgB,KAAK,CACnB,CAAa,EACb,MAAc,EACd,CAAW,EACX,KAAQ,EACR,IAAU,EACV,MAAmB,EACnB,QAAmC;;IAEnC,MAAM,UAAU,GAAG,MAAC,KAAK,CAAC,OAAwB,0CAAE,UAAU,CAAC;IAC/D,MAAM,cAAc,GAAG,MAAC,KAAK,CAAC,OAAwB,0CAAE,cAAc,CAAC;IACvE,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,EAAE;QAC/C,IAAI,IAAA,mBAAU,EAAC,QAAQ,CAAC,EAAE;YAExB,MAAM,YAAY,GAAG,IAAA,mBAAU,EAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YACtF,MAAM,SAAS,GAAG,CAAC,YAAY,IAAI,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAa,CAAC;YACjF,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,CAAqB,CAAC,CAAC;YAC9G,OAAO,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;SACnF;QACD,OAAO,KAAK,CAAC;KACd;IAED,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE;QACtB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAA,mBAAU,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5F,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YACjC,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAW,EAAE,CAAC,EAAG,IAAI,CAAC,SAAS,CAAC,CAAY,GAAG,EAAE,EAAE,CAAC;QACjF,CAAC,CAAC,CAAC;QACH,OAAO,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;KACnF;IAED,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE;QACtB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAA,mBAAU,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5F,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YACjC,OAAO,EAAE,CAAC,EAAG,IAAI,CAAC,SAAS,CAAC,CAAY,GAAG,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAW,EAAE,CAAC;QACjF,CAAC,CAAC,CAAC;QACH,OAAO,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;KACnF;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAtCD,sBAsCC;AAEY,QAAA,gBAAgB,GAAG;IAC9B,KAAK;IACL,QAAQ;IACR,OAAO;IACP,MAAM;IACN,WAAW;IACX,cAAc;IACd,UAAU;IACV,aAAa;CACd,CAAC;AACW,QAAA,oBAAoB,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;AAEpE,SAAgB,oBAAoB,CAAC,IAAa;IAChD,QAAQ,IAAI,EAAE;QACZ,KAAK,MAAM;YACT,OAAO,4BAAoB,CAAC;QAC9B;YACE,OAAO,wBAAgB,CAAC;KAC3B;AACH,CAAC;AAPD,oDAOC;AAED,SAAgB,SAAS,CACvB,IAAW,EACX,KAAa,EACb,MAAc,EACd,UAA4E,EAAE;IAE9E,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;IAC3C,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IAE7D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAE9B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAE9B,MAAM,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC;IACjC,MAAM,eAAe,GAAG,KAAK,GAAG,KAAK,CAAC;IAEtC,MAAM,eAAe,GAAG,CAAC,GAAG,GAAG,CAAC;IAChC,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,CAAC;IAExC,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,EAAE,GAAG,CAAC,CAAC;IAGX,IAAI,IAAI,GAAG,eAAe,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK,EAAE;QAClD,EAAE,GAAG,CAAC,IAAI,CAAC;KACZ;SAAM,IAAI,IAAI,GAAG,eAAe,IAAI,IAAI,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,eAAe,EAAE;QAC7E,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC;KACnB;IAGD,IAAI,IAAI,GAAG,eAAe,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,EAAE;QACnD,EAAE,GAAG,CAAC,IAAI,CAAC;KACZ;SAAM,IAAI,IAAI,GAAG,eAAe,IAAI,IAAI,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,eAAe,EAAE;QAC9E,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC;KACpB;IAED,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AACpB,CAAC;AAvCD,8BAuCC","file":"place.js","sourcesContent":["import type { IText, Text } from '@visactor/vrender-core';\nimport type { IAABBBounds, IBoundsLike } from '@visactor/vutils';\nimport { isFunction, isValid } from '@visactor/vutils';\nimport type { PointLocationCfg } from '../../core/type';\nimport type { LabelBase } from '../base';\nimport type { BaseLabelAttrs, OverlapAttrs, Strategy } from '../type';\nimport type { Bitmap } from './bitmap';\nimport type { BitmapTool } from './scaler';\nimport { boundToRange, clampRangeByBitmap } from './scaler';\n\n/**\n * 防重叠逻辑参考 https://github.com/vega/vega/\n * Copyright (c) 2015-2023, University of Washington Interactive Data Lab\n All rights reserved.\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n\n 1. Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n 2. Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n 3. Neither the name of the copyright holder nor the names of its contributors\n may be used to endorse or promote products derived from this software\n without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\n FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nexport function canPlace($: BitmapTool, bitmap: Bitmap, bound: IBoundsLike, checkBound = true, pad = 0) {\n let range = bound;\n if (pad > 0) {\n range = {\n x1: bound.x1 - pad,\n x2: bound.x2 + pad,\n y1: bound.y1 - pad,\n y2: bound.y2 + pad\n };\n }\n range = boundToRange($, range);\n\n const outOfBounds = bitmap.outOfBounds(range);\n\n if (checkBound && outOfBounds) {\n return false;\n }\n\n // 超出边界,需要将判断区域调整到可视区域内\n if (outOfBounds) {\n range = clampRangeByBitmap($, range);\n }\n\n return !bitmap.getRange(range);\n}\n\n/**\n * 是否在图形内部\n * @param textBound\n * @param shapeBound\n * @returns\n */\nexport function canPlaceInside(textBound: IBoundsLike, shapeBound: IAABBBounds) {\n if (!textBound || !shapeBound) {\n return false;\n }\n return shapeBound.encloses(textBound);\n}\n\nexport function placeToCandidates(\n $: BitmapTool,\n bitmap: Bitmap,\n text: Text,\n candidates: PointLocationCfg[] = [],\n clampForce = true,\n pad = 0\n): PointLocationCfg | false {\n const validCandidates = candidates.filter(candidate => isValid(candidate));\n for (let i = 0; i < validCandidates.length; i++) {\n const tempText = text.clone();\n tempText.setAttributes(validCandidates[i]);\n tempText.update();\n\n if (canPlace($, bitmap, tempText.AABBBounds, clampForce, pad)) {\n bitmap.setRange(boundToRange($, tempText.AABBBounds, true));\n return validCandidates[i];\n }\n }\n return false;\n}\n\nexport function place<T extends BaseLabelAttrs>(\n $: BitmapTool,\n bitmap: Bitmap,\n s: Strategy,\n attrs: T,\n text: Text,\n bounds: IBoundsLike,\n labeling?: LabelBase<T>['labeling']\n): PointLocationCfg | false {\n const clampForce = (attrs.overlap as OverlapAttrs)?.clampForce;\n const overlapPadding = (attrs.overlap as OverlapAttrs)?.overlapPadding;\n if (s.type === 'bound' || s.type === 'position') {\n if (isFunction(labeling)) {\n // TODO:这里可以 filter 掉初始位置,提升一部分性能\n const userPosition = isFunction(s.position) ? s.position(text.attribute) : s.position;\n const positions = (userPosition || defaultLabelPosition(attrs.type)) as string[];\n const candidates = positions.map(p => labeling(text.AABBBounds, bounds, p, attrs.offset) as PointLocationCfg);\n return placeToCandidates($, bitmap, text, candidates, clampForce, overlapPadding);\n }\n return false;\n }\n\n if (s.type === 'moveY') {\n const offset = s.offset ? (isFunction(s.offset) ? s.offset(text.attribute) : s.offset) : [];\n const candidates = offset.map(dy => {\n return { x: text.attribute.x as number, y: (text.attribute.y as number) + dy };\n });\n return placeToCandidates($, bitmap, text, candidates, clampForce, overlapPadding);\n }\n\n if (s.type === 'moveX') {\n const offset = s.offset ? (isFunction(s.offset) ? s.offset(text.attribute) : s.offset) : [];\n const candidates = offset.map(dx => {\n return { x: (text.attribute.x as number) + dx, y: text.attribute.y as number };\n });\n return placeToCandidates($, bitmap, text, candidates, clampForce, overlapPadding);\n }\n return false;\n}\n\nexport const DefaultPositions = [\n 'top',\n 'bottom',\n 'right',\n 'left',\n 'top-right',\n 'bottom-right',\n 'top-left',\n 'bottom-left'\n];\nexport const DefaultRectPositions = ['top', 'inside-top', 'inside'];\n\nexport function defaultLabelPosition(type?: string) {\n switch (type) {\n case 'rect':\n return DefaultRectPositions;\n default:\n return DefaultPositions;\n }\n}\n\nexport function clampText(\n text: IText,\n width: number,\n height: number,\n padding: { top?: number; left?: number; right?: number; bottom?: number } = {}\n) {\n const { x1, x2, y1, y2 } = text.AABBBounds;\n const { top = 0, left = 0, right = 0, bottom = 0 } = padding;\n\n const minX = Math.min(x1, x2);\n const maxX = Math.max(x1, x2);\n\n const minY = Math.min(y1, y2);\n const maxY = Math.max(y1, y2);\n\n const minXWithPadding = 0 - left;\n const maxXWithPadding = width + right;\n\n const minYWithPadding = 0 - top;\n const maxYWithPadding = height + bottom;\n\n let dx = 0;\n let dy = 0;\n\n // x 方向\n if (minX < minXWithPadding && maxX - minX <= width) {\n dx = -minX;\n } else if (maxX > maxXWithPadding && minX - (maxX - width) >= minXWithPadding) {\n dx = width - maxX;\n }\n\n // y 方向\n if (minY < minYWithPadding && maxY - minY <= height) {\n dy = -minY;\n } else if (maxY > maxYWithPadding && minY - (maxY - height) >= minYWithPadding) {\n dy = height - maxY;\n }\n\n return { dx, dy };\n}\n"]}
@@ -1,8 +1,14 @@
1
1
  import type { IText } from '@visactor/vrender-core';
2
2
  export interface IShiftYOption {
3
- maxIterations?: number;
4
- maxError?: number;
5
- padding?: number;
3
+ labelling: (...args: any[]) => any;
6
4
  maxY?: number;
5
+ globalShiftY?: {
6
+ enable?: boolean;
7
+ maxIterations?: number;
8
+ maxError?: number;
9
+ padding?: number;
10
+ maxAttempts?: number;
11
+ deltaYTolerance?: number;
12
+ };
7
13
  }
8
- export declare function shiftY(texts: IText[], option?: IShiftYOption): IText[];
14
+ export declare function shiftY(texts: IText[], option: IShiftYOption): IText[];
@@ -1,47 +1,123 @@
1
1
  "use strict";
2
2
 
3
- function shiftY(texts, option = {}) {
4
- const {maxIterations: maxIterations = 10, maxError: maxError = .1, padding: padding = 1, maxY: maxY = Number.MAX_VALUE} = option, n = texts.length;
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ }), exports.shiftY = void 0;
6
+
7
+ const vutils_1 = require("@visactor/vutils"), isIntersect = (top, bottom) => Math.ceil(top) > Math.floor(bottom), isXIntersect = ([a, b], [c, d]) => d > a && b > c;
8
+
9
+ function getIntersectionLength(range1, range2) {
10
+ const [start1, end1] = range1, [start2, end2] = range2, start = Math.max(start1, start2), end = Math.min(end1, end2);
11
+ return Math.max(0, end - start);
12
+ }
13
+
14
+ function shiftY(texts, option) {
15
+ const {maxY: maxY = Number.MAX_VALUE, labelling: labelling, globalShiftY: globalShiftY = {
16
+ enable: !0,
17
+ maxIterations: 10,
18
+ maxError: .1,
19
+ padding: 1
20
+ }} = option, n = texts.length;
5
21
  if (n <= 1) return texts;
6
- const isIntersect = ([a, b], [c, d]) => d > a && b > c, textInformation = new Map, getY0 = text => textInformation.get(text).y0, getY = text => textInformation.get(text).y, getHeight = text => textInformation.get(text).height, getX1 = text => textInformation.get(text).x1, getX2 = text => textInformation.get(text).x2, setY = (text, y) => {
7
- textInformation.get(text).y = y;
22
+ const xMap = new Map, textInformation = new Map, getY1Initial = text => textInformation.get(text).y1Initial, getHeight = text => textInformation.get(text).height, getY1 = text => textInformation.get(text).y1, getX = text => textInformation.get(text).x, getX1 = text => textInformation.get(text).x1, getX2 = text => textInformation.get(text).x2, getAdjustAttempts = text => textInformation.get(text).attempts, setY1 = (text, y) => {
23
+ textInformation.get(text).y1 = y;
24
+ }, setAdjustAttempts = (text, attempts) => {
25
+ textInformation.get(text).attempts = attempts;
8
26
  };
27
+ function adjustPositionInOneGroup(texts) {
28
+ var text;
29
+ if (1 !== texts.length) for (let i = texts.length - 1; i > 0; i--) {
30
+ const curText = texts[i], upperText = texts[i - 1], lowerText = texts[i + 1];
31
+ if (isIntersect(getY1(upperText) + getHeight(upperText), getY1(curText))) {
32
+ const {y: y} = labelling(curText);
33
+ lowerText && isIntersect(y + getHeight(curText) / 2, getY1(lowerText)) || y + getHeight(curText) / 2 <= maxY && setY1(curText, getY1(curText) + y - (text = curText,
34
+ textInformation.get(text).y));
35
+ }
36
+ }
37
+ }
38
+ texts.sort(((a, b) => a.attribute.x - b.attribute.x));
9
39
  for (const text of texts) {
10
- const {y1: y1, y2: y2, x1: x1, x2: x2} = text.AABBBounds;
40
+ const {y1: y1, y2: y2, x1: x1, x2: x2} = text.AABBBounds, {x: x, y: y} = text.attribute;
11
41
  textInformation.set(text, {
12
- y0: y1,
13
- y: y1,
42
+ y1Initial: y1,
43
+ y1: y1,
44
+ y2: y2,
45
+ y: y,
14
46
  height: y2 - y1,
15
47
  x1: x1,
16
- x2: x2
48
+ x2: x2,
49
+ x: x,
50
+ attempts: 0
17
51
  });
52
+ let hasRange = !1;
53
+ for (const [range, xGroupTexts] of xMap) {
54
+ const {start: start, end: end} = range;
55
+ if (x1 >= start && x2 <= end) xGroupTexts.push(text), hasRange = !0; else if ((0,
56
+ vutils_1.isNumberClose)(x, getX(xGroupTexts[0]), void 0, 5)) {
57
+ const newRange = {
58
+ start: Math.min(start, x1),
59
+ end: Math.max(end, x2)
60
+ };
61
+ xGroupTexts.push(text), xMap.set(newRange, xGroupTexts), xMap.delete(range), hasRange = !0;
62
+ } else if (getIntersectionLength([ start, end ], [ x1, x2 ]) / (end - start) > .5) {
63
+ const newRange = {
64
+ start: Math.min(start, x1),
65
+ end: Math.max(end, x2)
66
+ };
67
+ xGroupTexts.push(text), xMap.set(newRange, xGroupTexts), xMap.delete(range), hasRange = !0;
68
+ }
69
+ if (hasRange) break;
70
+ }
71
+ hasRange || xMap.set({
72
+ start: x1,
73
+ end: x2
74
+ }, [ text ]);
18
75
  }
19
- for (let iter = 0; iter < maxIterations; iter++) {
20
- texts.sort(((a, b) => getY(a) - getY(b)));
21
- let error = 0;
22
- for (let i = 0; i < n - 1; i++) {
23
- const curText = texts[i];
24
- let nextText, j = i + 1;
25
- for (;(nextText = texts[j]) && !isIntersect([ getX1(curText), getX2(curText) ], [ getX1(nextText), getX2(nextText) ]); ) j += 1;
26
- if (nextText) {
27
- const y0 = getY(curText), h0 = getHeight(curText), y1 = getY(nextText), delta = y1 - (y0 + h0);
28
- if (delta < padding) {
29
- const newDelta = (padding - delta) / 2;
30
- error = Math.max(error, newDelta), y1 + newDelta + getHeight(nextText) > maxY ? setY(curText, y0 - (padding - delta)) : y0 - newDelta < 0 ? setY(nextText, y1 + (padding - delta)) : (setY(curText, y0 - newDelta),
31
- setY(nextText, y1 + newDelta));
76
+ for (const xTexts of xMap.values()) xTexts.sort(((a, b) => getY1Initial(a) - getY1Initial(b))),
77
+ adjustPositionInOneGroup(xTexts);
78
+ if (!1 !== globalShiftY.enable) {
79
+ const {maxIterations: maxIterations = 10, maxError: maxError = .1, padding: padding = 1, maxAttempts: maxAttempts = 1e3, deltaYTolerance: deltaYTolerance = Number.MAX_VALUE} = globalShiftY;
80
+ for (let iter = 0; iter < maxIterations; iter++) {
81
+ texts.sort(((a, b) => getY1(a) - getY1(b)));
82
+ let error = 0;
83
+ for (let i = 0; i < n - 1; i++) {
84
+ const curText = texts[i];
85
+ if (getAdjustAttempts(curText) >= maxAttempts) continue;
86
+ let nextText, j = i + 1;
87
+ for (;(nextText = texts[j]) && !isXIntersect([ getX1(curText), getX2(curText) ], [ getX1(nextText), getX2(nextText) ]); ) j += 1;
88
+ if (nextText) {
89
+ const y1 = getY1(curText), h0 = getHeight(curText), nextY1 = getY1(nextText), delta = nextY1 - (y1 + h0);
90
+ if (delta < padding) {
91
+ const newDelta = (padding - delta) / 2;
92
+ if (error = Math.max(error, newDelta), y1 + newDelta + getHeight(nextText) > maxY) {
93
+ const newY1 = y1 - (padding - delta), curTextDelta = getY1Initial(curText) - newY1;
94
+ Math.abs(curTextDelta) <= deltaYTolerance && (setY1(curText, newY1), setAdjustAttempts(curText, getAdjustAttempts(curText) + 1));
95
+ } else if (y1 - newDelta < 0) {
96
+ const newY1 = nextY1 + (padding - delta), nextTextDelta = getY1Initial(nextText) - newY1;
97
+ Math.abs(nextTextDelta) <= deltaYTolerance && (setY1(nextText, newY1), setAdjustAttempts(nextText, getAdjustAttempts(nextText) + 1));
98
+ } else {
99
+ const newCurY1 = y1 - newDelta, curTextDelta = getY1Initial(curText) - newCurY1, newNextY1 = nextY1 + newDelta, nextTextDelta = getY1Initial(nextText) - newNextY1;
100
+ Math.abs(curTextDelta) <= deltaYTolerance && Math.abs(nextTextDelta) <= deltaYTolerance && (setY1(curText, newCurY1),
101
+ setY1(nextText, newNextY1), setAdjustAttempts(curText, getAdjustAttempts(curText) + 1),
102
+ setAdjustAttempts(nextText, getAdjustAttempts(nextText) + 1));
103
+ }
104
+ }
32
105
  }
33
106
  }
107
+ if (error < maxError) break;
34
108
  }
35
- if (error < maxError) break;
36
109
  }
37
110
  for (const text of texts) {
38
- const finalY = text.attribute.y + getY(text) - getY0(text);
111
+ const finalY = text.attribute.y + getY1(text) - getY1Initial(text);
39
112
  text.setAttribute("y", finalY);
40
113
  }
41
- return texts;
114
+ const result = [];
115
+ texts.sort(((a, b) => a.attribute.x - b.attribute.x));
116
+ let start = 0, end = texts.length - 1;
117
+ for (;start <= end; ) start === end ? result.push(texts[start]) : (result.push(texts[start]),
118
+ result.push(texts[end])), start++, end--;
119
+ return result;
42
120
  }
43
121
 
44
- Object.defineProperty(exports, "__esModule", {
45
- value: !0
46
- }), exports.shiftY = void 0, exports.shiftY = shiftY;
122
+ exports.shiftY = shiftY;
47
123
  //# sourceMappingURL=shiftY.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/label/overlap/shiftY.ts"],"names":[],"mappings":";;;AASA,SAAgB,MAAM,CAAC,KAAc,EAAE,SAAwB,EAAE;IAC/D,MAAM,EAAE,aAAa,GAAG,EAAE,EAAE,QAAQ,GAAG,GAAG,EAAE,OAAO,GAAG,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC,SAAS,EAAE,GAAG,MAAM,CAAC;IAE5F,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IACvB,IAAI,CAAC,IAAI,CAAC,EAAE;QACV,OAAO,KAAK,CAAC;KACd;IAED,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAmB,EAAE,CAAC,CAAC,EAAE,CAAC,CAAmB,EAAE,EAAE;QACzE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,IAAI,GAAG,EAA4E,CAAC;IAM5G,MAAM,KAAK,GAAG,CAAC,IAAW,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;IAC5D,MAAM,IAAI,GAAG,CAAC,IAAW,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,CAAC,IAAW,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IACpE,MAAM,KAAK,GAAG,CAAC,IAAW,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;IAC5D,MAAM,KAAK,GAAG,CAAC,IAAW,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;IAC5D,MAAM,IAAI,GAAG,CAAC,IAAW,EAAE,CAAS,EAAE,EAAE;QACtC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACxB,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;QAC3C,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;KACvE;IAED,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,aAAa,EAAE,IAAI,EAAE,EAAE;QAC/C,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,IAAI,QAAQ,CAAC;YACb,OACE,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACrB,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAClF;gBACA,CAAC,IAAI,CAAC,CAAC;aACR;YACD,IAAI,QAAQ,EAAE;gBACZ,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;gBACzB,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;gBAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC1B,MAAM,KAAK,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC7B,IAAI,KAAK,GAAG,OAAO,EAAE;oBACnB,MAAM,QAAQ,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;oBACvC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;oBAClC,IAAI,EAAE,GAAG,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,IAAI,EAAE;wBAC9C,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC;qBACvC;yBAAM,IAAI,EAAE,GAAG,QAAQ,GAAG,CAAC,EAAE;wBAC5B,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC;qBACxC;yBAAM;wBACL,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC;wBAC7B,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC;qBAC/B;iBACF;aACF;SACF;QACD,IAAI,KAAK,GAAG,QAAQ,EAAE;YACpB,MAAM;SACP;KACF;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;KAChC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AA3ED,wBA2EC","file":"shiftY.js","sourcesContent":["import type { IText } from '@visactor/vrender-core';\n\nexport interface IShiftYOption {\n maxIterations?: number;\n maxError?: number;\n padding?: number;\n maxY?: number;\n}\n\nexport function shiftY(texts: IText[], option: IShiftYOption = {}) {\n const { maxIterations = 10, maxError = 0.1, padding = 1, maxY = Number.MAX_VALUE } = option;\n\n const n = texts.length;\n if (n <= 1) {\n return texts;\n }\n\n const isIntersect = ([a, b]: [number, number], [c, d]: [number, number]) => {\n return d > a && b > c;\n };\n\n const textInformation = new Map<IText, { y0: number; y: number; height: number; x1: number; x2: number }>();\n\n // y0 : 初始位置\n // y : 最终位置\n // height : 高度\n // x1, x2 : 左右边界\n const getY0 = (text: IText) => textInformation.get(text).y0;\n const getY = (text: IText) => textInformation.get(text).y;\n const getHeight = (text: IText) => textInformation.get(text).height;\n const getX1 = (text: IText) => textInformation.get(text).x1;\n const getX2 = (text: IText) => textInformation.get(text).x2;\n const setY = (text: IText, y: number) => {\n textInformation.get(text).y = y;\n };\n\n for (const text of texts) {\n const { y1, y2, x1, x2 } = text.AABBBounds;\n textInformation.set(text, { y0: y1, y: y1, height: y2 - y1, x1, x2 });\n }\n\n for (let iter = 0; iter < maxIterations; iter++) {\n texts.sort((a, b) => getY(a) - getY(b));\n let error = 0;\n for (let i = 0; i < n - 1; i++) {\n const curText = texts[i];\n let j = i + 1;\n let nextText;\n while (\n (nextText = texts[j]) &&\n !isIntersect([getX1(curText), getX2(curText)], [getX1(nextText), getX2(nextText)])\n ) {\n j += 1;\n }\n if (nextText) {\n const y0 = getY(curText);\n const h0 = getHeight(curText);\n const y1 = getY(nextText);\n const delta = y1 - (y0 + h0);\n if (delta < padding) {\n const newDelta = (padding - delta) / 2;\n error = Math.max(error, newDelta);\n if (y1 + newDelta + getHeight(nextText) > maxY) {\n setY(curText, y0 - (padding - delta));\n } else if (y0 - newDelta < 0) {\n setY(nextText, y1 + (padding - delta));\n } else {\n setY(curText, y0 - newDelta);\n setY(nextText, y1 + newDelta);\n }\n }\n }\n }\n if (error < maxError) {\n break;\n }\n }\n\n for (const text of texts) {\n const finalY = text.attribute.y + getY(text) - getY0(text);\n text.setAttribute('y', finalY);\n }\n\n return texts;\n}\n"]}
1
+ {"version":3,"sources":["../src/label/overlap/shiftY.ts"],"names":[],"mappings":"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","file":"shiftY.js","sourcesContent":["import type { IText } from '@visactor/vrender-core';\nimport { isNumberClose } from '@visactor/vutils';\n\nexport interface IShiftYOption {\n labelling: (...args: any[]) => any;\n\n maxY?: number;\n globalShiftY?: {\n /**\n * 是否开启全局调整,开启后,所有文字会整体调整,否则只会按照 x 分组调整 top/bottom\n * @default true\n */\n enable?: boolean;\n /**\n * 最大迭代次数\n * @default 10\n */\n maxIterations?: number;\n /**\n * 最大误差\n * @default 0.1\n */\n maxError?: number;\n /**\n * 调整后 text 之间的 padding\n * @default 1\n */\n padding?: number;\n /**\n * 每个 text 最大被调整的次数\n * @default 1000\n */\n maxAttempts?: number;\n /**\n * 每个 text 调整的 y 坐标差值限制\n */\n deltaYTolerance?: number;\n };\n}\n\nconst isIntersect = (top: number, bottom: number) => {\n return Math.ceil(top) > Math.floor(bottom);\n};\n\nconst isXIntersect = ([a, b]: [number, number], [c, d]: [number, number]) => {\n return d > a && b > c;\n};\n\nfunction getIntersectionLength(range1: number[], range2: number[]) {\n const [start1, end1] = range1;\n const [start2, end2] = range2;\n\n const start = Math.max(start1, start2);\n const end = Math.min(end1, end2);\n\n return Math.max(0, end - start);\n}\n\nexport function shiftY(texts: IText[], option: IShiftYOption) {\n const {\n maxY = Number.MAX_VALUE,\n labelling,\n globalShiftY = { enable: true, maxIterations: 10, maxError: 0.1, padding: 1 }\n } = option;\n\n const n = texts.length;\n if (n <= 1) {\n return texts;\n }\n\n // 根据 x 坐标给 text 分组,存放信息到 map 中\n const xMap = new Map<{ start: number; end: number }, IText[]>();\n const textInformation = new Map<\n IText,\n {\n y1Initial: number;\n y1: number;\n y: number;\n y2: number;\n height: number;\n x1: number;\n x2: number;\n x: number;\n attempts: number;\n }\n >();\n\n const getY1Initial = (text: IText) => textInformation.get(text).y1Initial;\n const getHeight = (text: IText) => textInformation.get(text).height;\n const getY1 = (text: IText) => textInformation.get(text).y1;\n const getY = (text: IText) => textInformation.get(text).y;\n const getX = (text: IText) => textInformation.get(text).x;\n const getX1 = (text: IText) => textInformation.get(text).x1;\n const getX2 = (text: IText) => textInformation.get(text).x2;\n const getAdjustAttempts = (text: IText) => textInformation.get(text).attempts;\n\n const setY1 = (text: IText, y: number) => {\n textInformation.get(text).y1 = y;\n };\n\n const setAdjustAttempts = (text: IText, attempts: number) => {\n textInformation.get(text).attempts = attempts;\n };\n\n function adjustPositionInOneGroup(texts: IText[]) {\n if (texts.length === 1) {\n return;\n }\n // 从最后一个 text 向前遍历,如果与前一个 text 相交,则尝试放到下方(需要判断和前一个 text 是否相交,若相交则不能放到下方)\n for (let i = texts.length - 1; i > 0; i--) {\n const curText = texts[i];\n const upperText = texts[i - 1];\n const lowerText = texts[i + 1];\n\n // 当前 text 和上面一个 text 相交\n if (isIntersect(getY1(upperText) + getHeight(upperText), getY1(curText))) {\n const { y } = labelling(curText);\n // 挪动当前 text 后, 和下面一个 text 不相交\n if (!lowerText || !isIntersect(y + getHeight(curText) / 2, getY1(lowerText))) {\n if (y + getHeight(curText) / 2 <= maxY) {\n setY1(curText, getY1(curText) + y - getY(curText));\n }\n }\n }\n }\n }\n\n // 根据 x 坐标进行分组\n texts.sort((a, b) => a.attribute.x - b.attribute.x);\n for (const text of texts) {\n const { y1, y2, x1, x2 } = text.AABBBounds;\n const { x, y } = text.attribute;\n textInformation.set(text, { y1Initial: y1, y1, y2, y, height: y2 - y1, x1, x2, x, attempts: 0 });\n let hasRange = false;\n\n for (const [range, xGroupTexts] of xMap) {\n const { start, end } = range;\n // 1. x1,x2 在 start 和 end 范围内\n if (x1 >= start && x2 <= end) {\n xGroupTexts.push(text);\n hasRange = true;\n }\n // 2. x 坐标接近,相差在 5px 以内\n else if (isNumberClose(x, getX(xGroupTexts[0]), undefined, 5)) {\n // x 坐标相等,也纳入到一个分组中,并且要扩大分组 range\n const newRange = { start: Math.min(start, x1), end: Math.max(end, x2) };\n xGroupTexts.push(text);\n xMap.set(newRange, xGroupTexts);\n xMap.delete(range);\n hasRange = true;\n }\n // 3. 与区间相交范围 > 50%\n else if (getIntersectionLength([start, end], [x1, x2]) / (end - start) > 0.5) {\n const newRange = { start: Math.min(start, x1), end: Math.max(end, x2) };\n xGroupTexts.push(text);\n xMap.set(newRange, xGroupTexts);\n xMap.delete(range);\n hasRange = true;\n }\n\n if (hasRange) {\n break;\n }\n }\n\n if (!hasRange) {\n xMap.set({ start: x1, end: x2 }, [text]);\n }\n }\n\n // 对每个 x 坐标的 text 数组进行排序\n for (const xTexts of xMap.values()) {\n // 从上到下排序\n xTexts.sort((a, b) => getY1Initial(a) - getY1Initial(b));\n adjustPositionInOneGroup(xTexts);\n }\n\n // 整体调整一次 Y 坐标,进行散开\n if (globalShiftY.enable !== false) {\n const {\n maxIterations = 10,\n maxError = 0.1,\n padding = 1,\n maxAttempts = 1000,\n deltaYTolerance = Number.MAX_VALUE\n } = globalShiftY;\n for (let iter = 0; iter < maxIterations; iter++) {\n texts.sort((a, b) => getY1(a) - getY1(b));\n let error = 0;\n for (let i = 0; i < n - 1; i++) {\n const curText = texts[i];\n if (getAdjustAttempts(curText) >= maxAttempts) {\n continue;\n }\n let j = i + 1;\n let nextText;\n while (\n (nextText = texts[j]) &&\n !isXIntersect([getX1(curText), getX2(curText)], [getX1(nextText), getX2(nextText)])\n ) {\n j += 1;\n }\n if (nextText) {\n const y1 = getY1(curText);\n const h0 = getHeight(curText);\n const nextY1 = getY1(nextText);\n const delta = nextY1 - (y1 + h0);\n if (delta < padding) {\n const newDelta = (padding - delta) / 2;\n error = Math.max(error, newDelta);\n if (y1 + newDelta + getHeight(nextText) > maxY) {\n const newY1 = y1 - (padding - delta);\n const curTextDelta = getY1Initial(curText) - newY1;\n if (Math.abs(curTextDelta) <= deltaYTolerance) {\n setY1(curText, newY1);\n setAdjustAttempts(curText, getAdjustAttempts(curText) + 1);\n }\n } else if (y1 - newDelta < 0) {\n const newY1 = nextY1 + (padding - delta);\n const nextTextDelta = getY1Initial(nextText) - newY1;\n if (Math.abs(nextTextDelta) <= deltaYTolerance) {\n setY1(nextText, newY1);\n setAdjustAttempts(nextText, getAdjustAttempts(nextText) + 1);\n }\n } else {\n const newCurY1 = y1 - newDelta;\n const curTextDelta = getY1Initial(curText) - newCurY1;\n const newNextY1 = nextY1 + newDelta;\n const nextTextDelta = getY1Initial(nextText) - newNextY1;\n if (Math.abs(curTextDelta) <= deltaYTolerance && Math.abs(nextTextDelta) <= deltaYTolerance) {\n setY1(curText, newCurY1);\n setY1(nextText, newNextY1);\n setAdjustAttempts(curText, getAdjustAttempts(curText) + 1);\n setAdjustAttempts(nextText, getAdjustAttempts(nextText) + 1);\n }\n }\n }\n }\n }\n if (error < maxError) {\n break;\n }\n }\n }\n\n for (const text of texts) {\n const finalY = text.attribute.y + getY1(text) - getY1Initial(text);\n text.setAttribute('y', finalY);\n }\n\n const result = [];\n // 调整文字顺序,越靠前的越优先占据空间\n // texts 按照 x 进行排序,然后左右交替,保证首尾标签优先展示\n texts.sort((a, b) => a.attribute.x - b.attribute.x);\n let start = 0;\n let end = texts.length - 1;\n\n while (start <= end) {\n if (start === end) {\n result.push(texts[start]);\n } else {\n result.push(texts[start]);\n result.push(texts[end]);\n }\n start++;\n end--;\n }\n return result;\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { SliderAttributes } from '../../slider/type';
2
- import { LegendBaseAttributes } from '../type';
1
+ import type { SliderAttributes } from '../../slider/type';
2
+ import type { LegendBaseAttributes } from '../type';
3
3
  export type ColorLegendAttributes = {
4
4
  colors: string[];
5
5
  } & Omit<SliderAttributes, 'step' | 'range'> & LegendBaseAttributes;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/legend/color/type.ts"],"names":[],"mappings":"","file":"type.js","sourcesContent":["import { SliderAttributes } from '../../slider/type';\nimport { LegendBaseAttributes } from '../type';\nexport type ColorLegendAttributes = {\n /**\n * 图例的颜色\n */\n colors: string[];\n} & Omit<SliderAttributes, 'step' | 'range'> &\n LegendBaseAttributes;\n"]}
1
+ {"version":3,"sources":["../src/legend/color/type.ts"],"names":[],"mappings":"","file":"type.js","sourcesContent":["import type { SliderAttributes } from '../../slider/type';\nimport type { LegendBaseAttributes } from '../type';\nexport type ColorLegendAttributes = {\n /**\n * 图例的颜色\n */\n colors: string[];\n} & Omit<SliderAttributes, 'step' | 'range'> &\n LegendBaseAttributes;\n"]}
@@ -1,6 +1,6 @@
1
1
  import type { EasingType, IGroupGraphicAttribute, ILinearGradient, ISymbolGraphicAttribute, ITextGraphicAttribute } from '@visactor/vrender-core';
2
2
  import type { BaseGraphicAttributes, Padding } from '../../core/type';
3
- import type { PagerAttributes } from '../../pager';
3
+ import type { PagerAttributes } from '../../pager/type';
4
4
  import type { LegendBaseAttributes } from '../type';
5
5
  import type { ScrollBarAttributes } from '../../scrollbar/type';
6
6
  import type { GraphicEventType } from '@visactor/vrender-core';
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/legend/discrete/type.ts"],"names":[],"mappings":"","file":"type.js","sourcesContent":["import type {\n EasingType,\n IGroupGraphicAttribute,\n ILinearGradient,\n ISymbolGraphicAttribute,\n ITextGraphicAttribute\n} from '@visactor/vrender-core';\nimport type { BaseGraphicAttributes, Padding } from '../../core/type';\nimport type { PagerAttributes } from '../../pager';\nimport type { LegendBaseAttributes } from '../type';\nimport type { ScrollBarAttributes } from '../../scrollbar/type';\nimport type { GraphicEventType } from '@visactor/vrender-core';\n\nexport interface LegendSwitchComponentAttributes {\n /**\n * 翻页组件同图例内容项之间的间距\n */\n space?: number;\n /**\n * the default page\n */\n defaultCurrent?: number;\n /**\n * 翻页是否开启动画\n */\n animation?: boolean;\n /**\n * 动画执行时间\n */\n animationDuration?: number;\n /**\n * 动画执行效果\n */\n animationEasing?: EasingType;\n}\n\nexport type LegendPagerAttributes = Omit<PagerAttributes, 'total'> &\n LegendSwitchComponentAttributes & {\n /**\n * 分页器的显示位置,默认 'middle'\n * @default 'middle'\n */\n position?: 'start' | 'middle' | 'end';\n };\n\nexport type LegendScrollbarAttributes = Omit<ScrollBarAttributes, 'range' | 'limitRange'> &\n LegendSwitchComponentAttributes & {\n type: 'scrollbar';\n /**\n * @deprecated since 0.20.13\n * 滚动条的位置是否支持展示在分页的中间。\n * 0.20.13 版本改造了滚动条逻辑后,此配置废弃。改造内容:\n * 由分页拟合的滚动调整为滚动窗口的逻辑,不再与分页绑定\n */\n scrollByPosition?: boolean;\n /**\n * 是否支持鼠标/触控板滚动\n * @default false\n */\n roamScroll?: boolean;\n /**\n * @since 0.20.13\n * 是否隐藏滚动条\n */\n visible?: boolean;\n /**\n * @since 0.20.13\n * 滚动时,图例区域未到尽头时的前后遮罩\n */\n scrollMask?: {\n /** 是否显示 @default false */\n visible?: boolean;\n /** 渐变区域长度 @default 16 */\n gradientLength?: number;\n /** 渐变配置 */\n gradientStops: ILinearGradient['stops'];\n };\n };\n\nexport type LegendItemDatum = {\n /**\n * 该条数据的唯一标识,可用于动画或者查找\n */\n id?: string;\n /** 显示文本 */\n label: string;\n /** 显示数据 */\n value?: string | number;\n /** 图例项前的 shape 形状定义 */\n shape: {\n symbolType?: string;\n fill?: string;\n stroke?: string;\n };\n [key: string]: any;\n};\n\nexport type StyleCallback<T> = (\n item: LegendItemDatum,\n isSelected: boolean,\n index: number,\n allItems: LegendItemDatum[]\n) => T;\n\nexport type formatterCallback = (text: string | number, item: LegendItemDatum, index: number) => any;\n\nexport type LegendItem = {\n /**\n * 是否展示图例项\n * @default true\n */\n visible?: boolean;\n /**\n * 图例项的列间距 水平间距\n */\n spaceCol?: number;\n /**\n * 图例项的行间距 垂直间距\n */\n spaceRow?: number;\n /**\n * 图例项的最大宽度,默认为 null,由上层传入\n */\n maxWidth?: number;\n /**\n * 图例项的宽度, 默认自动计算\n */\n width?: number;\n /**\n * 图例的高度,默认自动计算\n */\n height?: number;\n /**\n * 图例项自身的内边距\n */\n padding?: Padding;\n /**\n * 图例项背景配置\n */\n background?: {\n visible?: boolean;\n } & BaseGraphicAttributes<Partial<IGroupGraphicAttribute> | StyleCallback<Partial<IGroupGraphicAttribute>>>;\n /**\n * 图例项的 shape 图标的配置\n */\n shape?: {\n visible?: boolean;\n /** shape 同后面 label 的间距 */\n space?: number;\n } & BaseGraphicAttributes<Partial<ISymbolGraphicAttribute> | StyleCallback<Partial<ISymbolGraphicAttribute>>>;\n\n /**\n * 当label+ value同时存在的时候,自动省略的策略\n * 'labelFirst' - 尽量保证完整展示`label`\n * 'valueFirst' - 尽量保证完整展示`value`\n * 'none' - 按照`widthRatio`展示label 和 value\n */\n autoEllipsisStrategy?: 'labelFirst' | 'valueFirst' | 'none';\n\n /**\n * 图例项的 label 文本配置\n */\n label?: {\n /**\n * 当 label + value 同时展示,切超长的时候,label的宽度占比\n */\n widthRatio?: number;\n /**\n * 图例项 label 同后面 value 的间距\n */\n space?: number;\n /**\n * 格式化文本函数\n */\n formatMethod?: formatterCallback;\n } & BaseGraphicAttributes<Partial<ITextGraphicAttribute> | StyleCallback<Partial<ITextGraphicAttribute>>>;\n /**\n * 图例项 value 配置\n */\n value?: {\n /**\n * 当 label + value 同时展示,切超长的时候,label的宽度占比\n */\n widthRatio?: number;\n /** value 同后面元素的间距 */\n space?: number;\n /**\n * 是否右对齐显示,仅当设置图例项宽度 itemWidth 时生效\n * 默认为 false,\n */\n alignRight?: boolean;\n /**\n * 格式化文本函数\n */\n formatMethod?: formatterCallback;\n } & BaseGraphicAttributes<Partial<ITextGraphicAttribute> | StyleCallback<Partial<ITextGraphicAttribute>>>;\n /**\n * 是否开启聚焦功能,默认关闭\n */\n focus?: boolean;\n /**\n * 聚焦按钮配置\n */\n focusIconStyle?: Partial<ISymbolGraphicAttribute>;\n /**\n * 指定图例项中图标和文字的摆放位置,可选值为:\n * 'left' 图标在左侧\n * 'right' 图标在右侧\n */\n align?: 'left' | 'right';\n};\n\nexport type DiscreteLegendAttrs = {\n /**\n * 是否开启选中交互\n */\n select?:\n | boolean\n | {\n /** @since 0.20.13 */\n trigger?: GraphicEventType;\n };\n\n /**\n * 是否开启 hover 交互\n */\n hover?:\n | boolean\n | {\n /** @since 0.20.13 */\n trigger?: GraphicEventType;\n /** @since 0.20.13 */\n triggerOff?: GraphicEventType;\n };\n /**\n * 图例数据\n */\n items: LegendItemDatum[];\n /**\n * 默认选中的图例项\n */\n defaultSelected?: (string | number)[];\n /**\n * 单选/多选模式配置,默认 'multiple'。\n * - `single` 表示单选\n * - `multiple` 表示多选\n * - `focus` 表示聚焦模式 (自 0.19.2版本开始支持)\n */\n selectMode?: 'single' | 'multiple' | 'focus';\n /**\n * 是否允许图例全部取消,多选模式下生效\n */\n allowAllCanceled?: boolean;\n /**\n * 图例项的顺序是否要逆序,默认为 false\n */\n reversed?: boolean;\n /**\n * 图例项相关的配置\n */\n item?: LegendItem;\n /**\n * 最大宽度,决定 layout : 'horizontal' 是否自动换行\n */\n maxWidth?: number;\n /**\n * 最大高度,决定是否分页\n */\n maxHeight?: number;\n /**\n * 最大行数,当且仅当 layout 为 'horizontal' 时生效\n */\n maxRow?: number;\n /**\n * 最大列数,当且仅当 layout 为 'vertical' 时生效\n */\n maxCol?: number;\n /**\n * 延迟渲染,按需渲染图例项目\n */\n lazyload?: boolean;\n /**\n * 是否进行自动分页,默认为 true\n */\n autoPage?: boolean;\n /**\n * 翻页器配置\n */\n pager?: LegendPagerAttributes | LegendScrollbarAttributes;\n} & LegendBaseAttributes;\n"]}
1
+ {"version":3,"sources":["../src/legend/discrete/type.ts"],"names":[],"mappings":"","file":"type.js","sourcesContent":["import type {\n EasingType,\n IGroupGraphicAttribute,\n ILinearGradient,\n ISymbolGraphicAttribute,\n ITextGraphicAttribute\n} from '@visactor/vrender-core';\nimport type { BaseGraphicAttributes, Padding } from '../../core/type';\nimport type { PagerAttributes } from '../../pager/type';\nimport type { LegendBaseAttributes } from '../type';\nimport type { ScrollBarAttributes } from '../../scrollbar/type';\nimport type { GraphicEventType } from '@visactor/vrender-core';\n\nexport interface LegendSwitchComponentAttributes {\n /**\n * 翻页组件同图例内容项之间的间距\n */\n space?: number;\n /**\n * the default page\n */\n defaultCurrent?: number;\n /**\n * 翻页是否开启动画\n */\n animation?: boolean;\n /**\n * 动画执行时间\n */\n animationDuration?: number;\n /**\n * 动画执行效果\n */\n animationEasing?: EasingType;\n}\n\nexport type LegendPagerAttributes = Omit<PagerAttributes, 'total'> &\n LegendSwitchComponentAttributes & {\n /**\n * 分页器的显示位置,默认 'middle'\n * @default 'middle'\n */\n position?: 'start' | 'middle' | 'end';\n };\n\nexport type LegendScrollbarAttributes = Omit<ScrollBarAttributes, 'range' | 'limitRange'> &\n LegendSwitchComponentAttributes & {\n type: 'scrollbar';\n /**\n * @deprecated since 0.20.13\n * 滚动条的位置是否支持展示在分页的中间。\n * 0.20.13 版本改造了滚动条逻辑后,此配置废弃。改造内容:\n * 由分页拟合的滚动调整为滚动窗口的逻辑,不再与分页绑定\n */\n scrollByPosition?: boolean;\n /**\n * 是否支持鼠标/触控板滚动\n * @default false\n */\n roamScroll?: boolean;\n /**\n * @since 0.20.13\n * 是否隐藏滚动条\n */\n visible?: boolean;\n /**\n * @since 0.20.13\n * 滚动时,图例区域未到尽头时的前后遮罩\n */\n scrollMask?: {\n /** 是否显示 @default false */\n visible?: boolean;\n /** 渐变区域长度 @default 16 */\n gradientLength?: number;\n /** 渐变配置 */\n gradientStops: ILinearGradient['stops'];\n };\n };\n\nexport type LegendItemDatum = {\n /**\n * 该条数据的唯一标识,可用于动画或者查找\n */\n id?: string;\n /** 显示文本 */\n label: string;\n /** 显示数据 */\n value?: string | number;\n /** 图例项前的 shape 形状定义 */\n shape: {\n symbolType?: string;\n fill?: string;\n stroke?: string;\n };\n [key: string]: any;\n};\n\nexport type StyleCallback<T> = (\n item: LegendItemDatum,\n isSelected: boolean,\n index: number,\n allItems: LegendItemDatum[]\n) => T;\n\nexport type formatterCallback = (text: string | number, item: LegendItemDatum, index: number) => any;\n\nexport type LegendItem = {\n /**\n * 是否展示图例项\n * @default true\n */\n visible?: boolean;\n /**\n * 图例项的列间距 水平间距\n */\n spaceCol?: number;\n /**\n * 图例项的行间距 垂直间距\n */\n spaceRow?: number;\n /**\n * 图例项的最大宽度,默认为 null,由上层传入\n */\n maxWidth?: number;\n /**\n * 图例项的宽度, 默认自动计算\n */\n width?: number;\n /**\n * 图例的高度,默认自动计算\n */\n height?: number;\n /**\n * 图例项自身的内边距\n */\n padding?: Padding;\n /**\n * 图例项背景配置\n */\n background?: {\n visible?: boolean;\n } & BaseGraphicAttributes<Partial<IGroupGraphicAttribute> | StyleCallback<Partial<IGroupGraphicAttribute>>>;\n /**\n * 图例项的 shape 图标的配置\n */\n shape?: {\n visible?: boolean;\n /** shape 同后面 label 的间距 */\n space?: number;\n } & BaseGraphicAttributes<Partial<ISymbolGraphicAttribute> | StyleCallback<Partial<ISymbolGraphicAttribute>>>;\n\n /**\n * 当label+ value同时存在的时候,自动省略的策略\n * 'labelFirst' - 尽量保证完整展示`label`\n * 'valueFirst' - 尽量保证完整展示`value`\n * 'none' - 按照`widthRatio`展示label 和 value\n */\n autoEllipsisStrategy?: 'labelFirst' | 'valueFirst' | 'none';\n\n /**\n * 图例项的 label 文本配置\n */\n label?: {\n /**\n * 当 label + value 同时展示,切超长的时候,label的宽度占比\n */\n widthRatio?: number;\n /**\n * 图例项 label 同后面 value 的间距\n */\n space?: number;\n /**\n * 格式化文本函数\n */\n formatMethod?: formatterCallback;\n } & BaseGraphicAttributes<Partial<ITextGraphicAttribute> | StyleCallback<Partial<ITextGraphicAttribute>>>;\n /**\n * 图例项 value 配置\n */\n value?: {\n /**\n * 当 label + value 同时展示,切超长的时候,label的宽度占比\n */\n widthRatio?: number;\n /** value 同后面元素的间距 */\n space?: number;\n /**\n * 是否右对齐显示,仅当设置图例项宽度 itemWidth 时生效\n * 默认为 false,\n */\n alignRight?: boolean;\n /**\n * 格式化文本函数\n */\n formatMethod?: formatterCallback;\n } & BaseGraphicAttributes<Partial<ITextGraphicAttribute> | StyleCallback<Partial<ITextGraphicAttribute>>>;\n /**\n * 是否开启聚焦功能,默认关闭\n */\n focus?: boolean;\n /**\n * 聚焦按钮配置\n */\n focusIconStyle?: Partial<ISymbolGraphicAttribute>;\n /**\n * 指定图例项中图标和文字的摆放位置,可选值为:\n * 'left' 图标在左侧\n * 'right' 图标在右侧\n */\n align?: 'left' | 'right';\n};\n\nexport type DiscreteLegendAttrs = {\n /**\n * 是否开启选中交互\n */\n select?:\n | boolean\n | {\n /** @since 0.20.13 */\n trigger?: GraphicEventType;\n };\n\n /**\n * 是否开启 hover 交互\n */\n hover?:\n | boolean\n | {\n /** @since 0.20.13 */\n trigger?: GraphicEventType;\n /** @since 0.20.13 */\n triggerOff?: GraphicEventType;\n };\n /**\n * 图例数据\n */\n items: LegendItemDatum[];\n /**\n * 默认选中的图例项\n */\n defaultSelected?: (string | number)[];\n /**\n * 单选/多选模式配置,默认 'multiple'。\n * - `single` 表示单选\n * - `multiple` 表示多选\n * - `focus` 表示聚焦模式 (自 0.19.2版本开始支持)\n */\n selectMode?: 'single' | 'multiple' | 'focus';\n /**\n * 是否允许图例全部取消,多选模式下生效\n */\n allowAllCanceled?: boolean;\n /**\n * 图例项的顺序是否要逆序,默认为 false\n */\n reversed?: boolean;\n /**\n * 图例项相关的配置\n */\n item?: LegendItem;\n /**\n * 最大宽度,决定 layout : 'horizontal' 是否自动换行\n */\n maxWidth?: number;\n /**\n * 最大高度,决定是否分页\n */\n maxHeight?: number;\n /**\n * 最大行数,当且仅当 layout 为 'horizontal' 时生效\n */\n maxRow?: number;\n /**\n * 最大列数,当且仅当 layout 为 'vertical' 时生效\n */\n maxCol?: number;\n /**\n * 延迟渲染,按需渲染图例项目\n */\n lazyload?: boolean;\n /**\n * 是否进行自动分页,默认为 true\n */\n autoPage?: boolean;\n /**\n * 翻页器配置\n */\n pager?: LegendPagerAttributes | LegendScrollbarAttributes;\n} & LegendBaseAttributes;\n"]}
@@ -1,6 +1,6 @@
1
1
  import type { EasingType, IArcGraphicAttribute, IGroup, IGroupGraphicAttribute, IImageGraphicAttribute, ILineGraphicAttribute, IPolygonAttribute, IPolygonGraphicAttribute, IRectGraphicAttribute, IRichTextGraphicAttribute, ISymbol, ISymbolGraphicAttribute, ITextGraphicAttribute } from '@visactor/vrender-core';
2
- import type { CommonSegmentAttributes, ILineGraphicWithCornerRadius, SegmentAttributes } from '../segment';
3
- import type { TagAttributes } from '../tag';
2
+ import type { CommonSegmentAttributes, ILineGraphicWithCornerRadius, SegmentAttributes } from '../segment/type';
3
+ import type { TagAttributes } from '../tag/type';
4
4
  import type { Point, State } from '../core/type';
5
5
  export declare enum IMarkLineLabelPosition {
6
6
  start = "start",
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/marker/type.ts"],"names":[],"mappings":";;;AAmBA,IAAY,sBAkBX;AAlBD,WAAY,sBAAsB;IAChC,yCAAe,CAAA;IACf,+CAAqB,CAAA;IACrB,qDAA2B,CAAA;IAC3B,qDAA2B,CAAA;IAC3B,2DAAiC,CAAA;IACjC,iEAAuC,CAAA;IAEvC,2CAAiB,CAAA;IACjB,6DAAmC,CAAA;IACnC,mEAAyC,CAAA;IAEzC,qCAAW,CAAA;IACX,2CAAiB,CAAA;IACjB,iDAAuB,CAAA;IACvB,iDAAuB,CAAA;IACvB,uDAA6B,CAAA;IAC7B,6DAAmC,CAAA;AACrC,CAAC,EAlBW,sBAAsB,GAAtB,8BAAsB,KAAtB,8BAAsB,QAkBjC;AAED,IAAY,sBAUX;AAVD,WAAY,sBAAsB;IAChC,uCAAa,CAAA;IACb,yCAAe,CAAA;IACf,qCAAW,CAAA;IACX,2CAAiB,CAAA;IACjB,2CAAiB,CAAA;IACjB,mDAAyB,CAAA;IACzB,qDAA2B,CAAA;IAC3B,iDAAuB,CAAA;IACvB,uDAA6B,CAAA;AAC/B,CAAC,EAVW,sBAAsB,GAAtB,8BAAsB,KAAtB,8BAAsB,QAUjC;AAED,IAAY,2BAQX;AARD,WAAY,2BAA2B;IACrC,8DAA+B,CAAA;IAC/B,0DAA2B,CAAA;IAC3B,gEAAiC,CAAA;IACjC,8DAA+B,CAAA;IAC/B,0DAA2B,CAAA;IAC3B,gEAAiC,CAAA;IACjC,gDAAiB,CAAA;AACnB,CAAC,EARW,2BAA2B,GAA3B,mCAA2B,KAA3B,mCAA2B,QAQtC;AAED,IAAY,sBAOX;AAPD,WAAY,sBAAsB;IAChC,qCAAW,CAAA;IACX,2CAAiB,CAAA;IACjB,2CAAiB,CAAA;IACjB,iDAAuB,CAAA;IACvB,uDAA6B,CAAA;IAC7B,uDAA6B,CAAA;AAC/B,CAAC,EAPW,sBAAsB,GAAtB,8BAAsB,KAAtB,8BAAsB,QAOjC","file":"type.js","sourcesContent":["import type {\n EasingType,\n IArcGraphicAttribute,\n IGroup,\n IGroupGraphicAttribute,\n IImageGraphicAttribute,\n ILineGraphicAttribute,\n IPolygonAttribute,\n IPolygonGraphicAttribute,\n IRectGraphicAttribute,\n IRichTextGraphicAttribute,\n ISymbol,\n ISymbolGraphicAttribute,\n ITextGraphicAttribute\n} from '@visactor/vrender-core';\nimport type { CommonSegmentAttributes, ILineGraphicWithCornerRadius, SegmentAttributes } from '../segment';\nimport type { TagAttributes } from '../tag';\nimport type { Point, State } from '../core/type';\n\nexport enum IMarkLineLabelPosition {\n start = 'start',\n startTop = 'startTop',\n startBottom = 'startBottom',\n insideStart = 'insideStart',\n insideStartTop = 'insideStartTop',\n insideStartBottom = 'insideStartBottom',\n\n middle = 'middle',\n insideMiddleTop = 'insideMiddleTop',\n insideMiddleBottom = 'insideMiddleBottom',\n\n end = 'end',\n endTop = 'endTop',\n endBottom = 'endBottom',\n insideEnd = 'insideEnd',\n insideEndTop = 'insideEndTop',\n insideEndBottom = 'insideEndBottom'\n}\n\nexport enum IMarkAreaLabelPosition {\n left = 'left',\n right = 'right',\n top = 'top',\n bottom = 'bottom',\n middle = 'middle',\n insideLeft = 'insideLeft',\n insideRight = 'insideRight',\n insideTop = 'insideTop',\n insideBottom = 'insideBottom'\n}\n\nexport enum IMarkCommonArcLabelPosition {\n arcInnerStart = 'arcInnerStart',\n arcInnerEnd = 'arcInnerEnd',\n arcInnerMiddle = 'arcInnerMiddle',\n arcOuterStart = 'arcOuterStart',\n arcOuterEnd = 'arcOuterEnd',\n arcOuterMiddle = 'arcOuterMiddle',\n center = 'center'\n}\n\nexport enum IMarkPointItemPosition {\n top = 'top',\n bottom = 'bottom',\n middle = 'middle',\n insideTop = 'insideTop',\n insideBottom = 'insideBottom',\n insideMiddle = 'insideMiddle'\n}\n\nexport type IMarkBackgroundAttributes = {\n /**\n * 是否绘制背景层\n */\n visible: boolean;\n /**\n * TODO: 根据文字宽度进行背景 panel size自适应\n */\n autoHeight?: boolean;\n /**\n * TODO: 根据文高度度进行背景 panel size自适应\n */\n autoWidth?: boolean;\n} & Partial<IRectGraphicAttribute>;\n\nexport type IMarkLabel = Omit<TagAttributes, 'x' | 'y' | 'panel'> & {\n /**\n * 标签的背景面板配置\n */\n panel?: IMarkBackgroundAttributes;\n};\n\nexport type IMarkRef = {\n /**\n * 自动旋转,沿着线的方向\n * @default\n * mark-line/mark-area/mark-point: false - 旧逻辑里autoRotate是false, 保持不变\n * mark-arc-line/mark-arc-area: true - 新增逻辑, 如果不开启的话, 效果不太好, 所以默认true\n * mark-point - 旧逻辑里autoRotate是true, 保持不变\n */\n autoRotate?: boolean;\n /**\n * label 相对line平行方向上的偏移\n */\n refX?: number;\n /**\n * label 相对line正交方向上的偏移\n */\n refY?: number;\n /**\n * label 相对默认角度的偏移 (label跟随line的角度做自动旋转时,默认按照line的平行向量作为初始角度)\n */\n refAngle?: number;\n};\n\nexport type MarkerAttrs<AnimationType> = IGroupGraphicAttribute & {\n type?: 'line' | 'arc-line' | 'area' | 'arc-area' | 'point';\n /**\n * 是否支持交互\n * @default true\n */\n interactive?: boolean;\n /**\n * 是否开启选中交互\n * @default false\n */\n select?: boolean;\n /**\n * 是否开启 hover 交互\n * @default false\n */\n hover?: boolean;\n /**\n * 是否显示marker组件\n * @default true\n */\n visible?: boolean;\n /**\n * 是否将组件在绘制区域内进行剪切\n * @default true\n */\n clipInRange?: boolean;\n /**\n * 组件绘制范围配置\n */\n limitRect?: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n} & BaseMarkerAnimation<AnimationType>;\n\n/** animation type */\nexport type BaseMarkerAnimation<T> = {\n animation?: MarkerAnimation<T> | boolean;\n animationEnter?: MarkerUpdateAnimation<T>;\n animationUpdate?: MarkerUpdateAnimation<T>;\n animationExit?: MarkerExitAnimation;\n};\nexport type MarkerAnimation<T> = MarkerUpdateAnimation<T> | MarkerUpdateAnimation<T>;\n\nexport type MarkerUpdateAnimation<T> = {\n type: T;\n} & MarkerExitAnimation;\n\nexport type MarkCommonLineAnimationType = 'clipIn' | 'fadeIn';\n\nexport type CommonMarkAreaAnimationType = 'fadeIn';\n\nexport type MarkPointAnimationType = 'callIn' | 'fadeIn';\n\nexport type MarkerExitAnimation = {\n type: 'fadeOut';\n duration?: number;\n delay?: number;\n easing?: EasingType;\n};\n\nexport type MarkerAnimationState = 'enter' | 'update' | 'exit';\n\n/** state type */\nexport type MarkCommonLineState<LineAttr> = {\n line?: State<LineAttr>;\n lineStartSymbol?: State<Partial<ISymbolGraphicAttribute>>;\n lineEndSymbol?: State<Partial<ISymbolGraphicAttribute>>;\n label?: State<Partial<ITextGraphicAttribute>>;\n labelBackground?: State<Partial<IRectGraphicAttribute>>;\n};\n\nexport type CommonMarkAreaState<AreaAttr> = {\n area?: State<Partial<AreaAttr>>;\n label?: State<Partial<ITextGraphicAttribute>>;\n labelBackground?: State<Partial<IRectGraphicAttribute>>;\n};\n\nexport type MarkPointState = {\n line?: State<ILineGraphicWithCornerRadius | Partial<ILineGraphicAttribute>[]>;\n lineStartSymbol?: State<Partial<ISymbolGraphicAttribute>>;\n lineEndSymbol?: State<Partial<ISymbolGraphicAttribute>>;\n symbol?: State<Partial<ISymbolGraphicAttribute>>;\n image?: State<Partial<IImageGraphicAttribute>>;\n text?: State<Partial<ITextGraphicAttribute>>;\n textBackground?: State<Partial<IRectGraphicAttribute>>;\n richText?: State<Partial<IRichTextGraphicAttribute>>;\n customMark?: State<Partial<IGroupGraphicAttribute>>;\n targetItem?: State<Partial<ISymbolGraphicAttribute>>;\n};\n\nexport type MarkCommonLineAttrs<LineAttr, LineLabelPosition, MarkCommonLineAnimationType> =\n MarkerAttrs<MarkCommonLineAnimationType> &\n Omit<CommonSegmentAttributes, 'state' | 'lineStyle'> & {\n /**\n * 标签\n */\n label?: {\n /**\n * label 相对line的位置\n */\n position?: LineLabelPosition;\n /**\n * 当 mark 配置了 limitRect 之后,label 是否自动调整位置\n * @default false\n */\n confine?: boolean;\n } & IMarkRef &\n IMarkLabel;\n state?: MarkCommonLineState<LineAttr>;\n };\n\nexport type MarkLineAttrs = MarkCommonLineAttrs<\n ILineGraphicWithCornerRadius | ILineGraphicAttribute[],\n keyof typeof IMarkLineLabelPosition,\n MarkCommonLineAnimationType\n> & {\n type?: 'line';\n /**\n * 是否对 points 进行多段处理,默认为 false,即直接将所有的点连接成线。\n * 如果需要进行多段处理,需要将 points 属性配置为 Point[][] 类型\n * @default false\n */\n multiSegment?: boolean;\n /**\n * 在 `multiSegment` 属性开启的前提下,用于声明那一段线段用来作为主线段,如果不声明,默认全段为主线段\n */\n mainSegmentIndex?: number;\n /**\n * 构成line的点: 如果是两个点,则为直线;多个点则为曲线\n */\n points: Point[] | Point[][];\n lineStyle?: ILineGraphicAttribute;\n};\n\nexport type MarkArcLineAttrs = MarkCommonLineAttrs<\n IArcGraphicAttribute,\n keyof typeof IMarkCommonArcLabelPosition,\n MarkCommonLineAnimationType\n> & {\n type?: 'arc-line';\n /**\n * 弧线中心位置\n */\n center: {\n x: number;\n y: number;\n };\n /**\n * 弧线半径\n */\n radius: number;\n /**\n * 弧线起始角度(弧度)\n */\n startAngle: number;\n /**\n * 弧线终点角度(弧度)\n */\n endAngle: number;\n lineStyle?: IArcGraphicAttribute;\n};\n\nexport type MarkAreaAttrs = MarkerAttrs<CommonMarkAreaAnimationType> & {\n type?: 'area';\n /**\n * 构成area的点\n */\n points: Point[];\n /**\n * 标签\n */\n label?: {\n position?: keyof typeof IMarkAreaLabelPosition;\n /**\n * 当 mark 配置了 limitRect 之后,label 是否自动调整位置\n * @default false\n */\n confine?: boolean;\n } & IMarkLabel;\n /**\n * area的样式\n */\n areaStyle?: IPolygonAttribute;\n\n state?: CommonMarkAreaState<IPolygonGraphicAttribute>;\n};\n\nexport type MarkArcAreaAttrs = MarkerAttrs<CommonMarkAreaAnimationType> & {\n type?: 'arc-area';\n /**\n * 扇区中心位置\n */\n center: {\n x: number;\n y: number;\n };\n /**\n * 扇区内半径\n */\n innerRadius: number;\n /**\n * 扇区外半径\n */\n outerRadius: number;\n /**\n * 扇区起始角度(弧度)\n */\n startAngle: number;\n /**\n * 扇区终点角度(弧度)\n */\n endAngle: number;\n /**\n * 标签\n */\n label?: {\n position?: keyof typeof IMarkCommonArcLabelPosition;\n /**\n * 当 mark 配置了 limitRect 之后,label 是否自动调整位置\n * @default false\n */\n confine?: boolean;\n } & IMarkRef &\n IMarkLabel;\n /**\n * area的样式\n */\n areaStyle?: IArcGraphicAttribute;\n\n state?: CommonMarkAreaState<IArcGraphicAttribute>;\n};\n\nexport type IItemContent = IMarkRef & {\n /**\n * 标注类型\n * Tips: 保留'richText'与之前的定义做兼容\n */\n type?: 'symbol' | 'text' | 'image' | 'richText' | 'custom';\n position?: keyof typeof IMarkPointItemPosition;\n /**\n * x 方向偏移量\n */\n offsetX?: number;\n /**\n * y 方向偏移量\n */\n offsetY?: number;\n /**\n * type为symbol时, symbol的样式\n */\n symbolStyle?: ISymbolGraphicAttribute;\n /**\n * type为image时, image的样式\n */\n imageStyle?: IImageGraphicAttribute;\n /**\n * type为text时, text的配置\n * 'text'类型的ItemContent新增三种子类型:'text','rich','html'。配置在textStyle.type上,继承自TagAttributes。\n */\n textStyle?: IMarkLabel;\n /**\n * type为rich text时, rich text的样式\n */\n richTextStyle?: IRichTextGraphicAttribute;\n /**\n * type为custom时,允许以callback的方式传入需要render的item\n */\n renderCustomCallback?: () => IGroup;\n /**\n * 当 mark 配置了 limitRect 之后,label 是否自动调整位置\n * @default false\n */\n confine?: boolean;\n};\n\nexport type IItemLine = {\n /** TODO:'type-opo' */\n type?: 'type-s' | 'type-do' | 'type-po' | 'type-op' | 'type-arc';\n visible?: boolean;\n /**\n * 当type为type-arc时生效, 数值决定曲率, 符号决定法向, 不能等于0\n * @default 0.8\n */\n arcRatio?: number;\n /**\n * 垂直于引导线的装饰线,参考案例: https://observablehq.com/@mikelotis/edmonton-population-history-line-chart\n */\n decorativeLine?: {\n visible?: boolean;\n length?: number;\n };\n} & Omit<SegmentAttributes, 'points'>;\n\nexport type MarkPointAttrs = Omit<MarkerAttrs<MarkPointAnimationType>, 'labelStyle'> & {\n /**\n * markPoint的位置(也是path的起点)\n */\n position: Point;\n /**\n * 标注引导线\n */\n itemLine?: IItemLine;\n\n /**\n * 标注内容\n */\n itemContent?: IItemContent;\n\n /**\n * 被标注的内容\n */\n targetSymbol?: {\n /**\n * 被标注内容与标记线间的间隙\n * @default 0\n */\n offset?: number;\n /**\n * 是否显示\n * @default false\n */\n visible?: boolean;\n /**\n * 大小\n * @default 20\n */\n size?: number;\n style?: ISymbol;\n };\n\n state?: MarkPointState;\n} & BaseMarkerAnimation<MarkPointAnimationType>;\n"]}
1
+ {"version":3,"sources":["../src/marker/type.ts"],"names":[],"mappings":";;;AAmBA,IAAY,sBAkBX;AAlBD,WAAY,sBAAsB;IAChC,yCAAe,CAAA;IACf,+CAAqB,CAAA;IACrB,qDAA2B,CAAA;IAC3B,qDAA2B,CAAA;IAC3B,2DAAiC,CAAA;IACjC,iEAAuC,CAAA;IAEvC,2CAAiB,CAAA;IACjB,6DAAmC,CAAA;IACnC,mEAAyC,CAAA;IAEzC,qCAAW,CAAA;IACX,2CAAiB,CAAA;IACjB,iDAAuB,CAAA;IACvB,iDAAuB,CAAA;IACvB,uDAA6B,CAAA;IAC7B,6DAAmC,CAAA;AACrC,CAAC,EAlBW,sBAAsB,GAAtB,8BAAsB,KAAtB,8BAAsB,QAkBjC;AAED,IAAY,sBAUX;AAVD,WAAY,sBAAsB;IAChC,uCAAa,CAAA;IACb,yCAAe,CAAA;IACf,qCAAW,CAAA;IACX,2CAAiB,CAAA;IACjB,2CAAiB,CAAA;IACjB,mDAAyB,CAAA;IACzB,qDAA2B,CAAA;IAC3B,iDAAuB,CAAA;IACvB,uDAA6B,CAAA;AAC/B,CAAC,EAVW,sBAAsB,GAAtB,8BAAsB,KAAtB,8BAAsB,QAUjC;AAED,IAAY,2BAQX;AARD,WAAY,2BAA2B;IACrC,8DAA+B,CAAA;IAC/B,0DAA2B,CAAA;IAC3B,gEAAiC,CAAA;IACjC,8DAA+B,CAAA;IAC/B,0DAA2B,CAAA;IAC3B,gEAAiC,CAAA;IACjC,gDAAiB,CAAA;AACnB,CAAC,EARW,2BAA2B,GAA3B,mCAA2B,KAA3B,mCAA2B,QAQtC;AAED,IAAY,sBAOX;AAPD,WAAY,sBAAsB;IAChC,qCAAW,CAAA;IACX,2CAAiB,CAAA;IACjB,2CAAiB,CAAA;IACjB,iDAAuB,CAAA;IACvB,uDAA6B,CAAA;IAC7B,uDAA6B,CAAA;AAC/B,CAAC,EAPW,sBAAsB,GAAtB,8BAAsB,KAAtB,8BAAsB,QAOjC","file":"type.js","sourcesContent":["import type {\n EasingType,\n IArcGraphicAttribute,\n IGroup,\n IGroupGraphicAttribute,\n IImageGraphicAttribute,\n ILineGraphicAttribute,\n IPolygonAttribute,\n IPolygonGraphicAttribute,\n IRectGraphicAttribute,\n IRichTextGraphicAttribute,\n ISymbol,\n ISymbolGraphicAttribute,\n ITextGraphicAttribute\n} from '@visactor/vrender-core';\nimport type { CommonSegmentAttributes, ILineGraphicWithCornerRadius, SegmentAttributes } from '../segment/type';\nimport type { TagAttributes } from '../tag/type';\nimport type { Point, State } from '../core/type';\n\nexport enum IMarkLineLabelPosition {\n start = 'start',\n startTop = 'startTop',\n startBottom = 'startBottom',\n insideStart = 'insideStart',\n insideStartTop = 'insideStartTop',\n insideStartBottom = 'insideStartBottom',\n\n middle = 'middle',\n insideMiddleTop = 'insideMiddleTop',\n insideMiddleBottom = 'insideMiddleBottom',\n\n end = 'end',\n endTop = 'endTop',\n endBottom = 'endBottom',\n insideEnd = 'insideEnd',\n insideEndTop = 'insideEndTop',\n insideEndBottom = 'insideEndBottom'\n}\n\nexport enum IMarkAreaLabelPosition {\n left = 'left',\n right = 'right',\n top = 'top',\n bottom = 'bottom',\n middle = 'middle',\n insideLeft = 'insideLeft',\n insideRight = 'insideRight',\n insideTop = 'insideTop',\n insideBottom = 'insideBottom'\n}\n\nexport enum IMarkCommonArcLabelPosition {\n arcInnerStart = 'arcInnerStart',\n arcInnerEnd = 'arcInnerEnd',\n arcInnerMiddle = 'arcInnerMiddle',\n arcOuterStart = 'arcOuterStart',\n arcOuterEnd = 'arcOuterEnd',\n arcOuterMiddle = 'arcOuterMiddle',\n center = 'center'\n}\n\nexport enum IMarkPointItemPosition {\n top = 'top',\n bottom = 'bottom',\n middle = 'middle',\n insideTop = 'insideTop',\n insideBottom = 'insideBottom',\n insideMiddle = 'insideMiddle'\n}\n\nexport type IMarkBackgroundAttributes = {\n /**\n * 是否绘制背景层\n */\n visible: boolean;\n /**\n * TODO: 根据文字宽度进行背景 panel size自适应\n */\n autoHeight?: boolean;\n /**\n * TODO: 根据文高度度进行背景 panel size自适应\n */\n autoWidth?: boolean;\n} & Partial<IRectGraphicAttribute>;\n\nexport type IMarkLabel = Omit<TagAttributes, 'x' | 'y' | 'panel'> & {\n /**\n * 标签的背景面板配置\n */\n panel?: IMarkBackgroundAttributes;\n};\n\nexport type IMarkRef = {\n /**\n * 自动旋转,沿着线的方向\n * @default\n * mark-line/mark-area/mark-point: false - 旧逻辑里autoRotate是false, 保持不变\n * mark-arc-line/mark-arc-area: true - 新增逻辑, 如果不开启的话, 效果不太好, 所以默认true\n * mark-point - 旧逻辑里autoRotate是true, 保持不变\n */\n autoRotate?: boolean;\n /**\n * label 相对line平行方向上的偏移\n */\n refX?: number;\n /**\n * label 相对line正交方向上的偏移\n */\n refY?: number;\n /**\n * label 相对默认角度的偏移 (label跟随line的角度做自动旋转时,默认按照line的平行向量作为初始角度)\n */\n refAngle?: number;\n};\n\nexport type MarkerAttrs<AnimationType> = IGroupGraphicAttribute & {\n type?: 'line' | 'arc-line' | 'area' | 'arc-area' | 'point';\n /**\n * 是否支持交互\n * @default true\n */\n interactive?: boolean;\n /**\n * 是否开启选中交互\n * @default false\n */\n select?: boolean;\n /**\n * 是否开启 hover 交互\n * @default false\n */\n hover?: boolean;\n /**\n * 是否显示marker组件\n * @default true\n */\n visible?: boolean;\n /**\n * 是否将组件在绘制区域内进行剪切\n * @default true\n */\n clipInRange?: boolean;\n /**\n * 组件绘制范围配置\n */\n limitRect?: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n} & BaseMarkerAnimation<AnimationType>;\n\n/** animation type */\nexport type BaseMarkerAnimation<T> = {\n animation?: MarkerAnimation<T> | boolean;\n animationEnter?: MarkerUpdateAnimation<T>;\n animationUpdate?: MarkerUpdateAnimation<T>;\n animationExit?: MarkerExitAnimation;\n};\nexport type MarkerAnimation<T> = MarkerUpdateAnimation<T> | MarkerUpdateAnimation<T>;\n\nexport type MarkerUpdateAnimation<T> = {\n type: T;\n} & MarkerExitAnimation;\n\nexport type MarkCommonLineAnimationType = 'clipIn' | 'fadeIn';\n\nexport type CommonMarkAreaAnimationType = 'fadeIn';\n\nexport type MarkPointAnimationType = 'callIn' | 'fadeIn';\n\nexport type MarkerExitAnimation = {\n type: 'fadeOut';\n duration?: number;\n delay?: number;\n easing?: EasingType;\n};\n\nexport type MarkerAnimationState = 'enter' | 'update' | 'exit';\n\n/** state type */\nexport type MarkCommonLineState<LineAttr> = {\n line?: State<LineAttr>;\n lineStartSymbol?: State<Partial<ISymbolGraphicAttribute>>;\n lineEndSymbol?: State<Partial<ISymbolGraphicAttribute>>;\n label?: State<Partial<ITextGraphicAttribute>>;\n labelBackground?: State<Partial<IRectGraphicAttribute>>;\n};\n\nexport type CommonMarkAreaState<AreaAttr> = {\n area?: State<Partial<AreaAttr>>;\n label?: State<Partial<ITextGraphicAttribute>>;\n labelBackground?: State<Partial<IRectGraphicAttribute>>;\n};\n\nexport type MarkPointState = {\n line?: State<ILineGraphicWithCornerRadius | Partial<ILineGraphicAttribute>[]>;\n lineStartSymbol?: State<Partial<ISymbolGraphicAttribute>>;\n lineEndSymbol?: State<Partial<ISymbolGraphicAttribute>>;\n symbol?: State<Partial<ISymbolGraphicAttribute>>;\n image?: State<Partial<IImageGraphicAttribute>>;\n text?: State<Partial<ITextGraphicAttribute>>;\n textBackground?: State<Partial<IRectGraphicAttribute>>;\n richText?: State<Partial<IRichTextGraphicAttribute>>;\n customMark?: State<Partial<IGroupGraphicAttribute>>;\n targetItem?: State<Partial<ISymbolGraphicAttribute>>;\n};\n\nexport type MarkCommonLineAttrs<LineAttr, LineLabelPosition, MarkCommonLineAnimationType> =\n MarkerAttrs<MarkCommonLineAnimationType> &\n Omit<CommonSegmentAttributes, 'state' | 'lineStyle'> & {\n /**\n * 标签\n */\n label?: {\n /**\n * label 相对line的位置\n */\n position?: LineLabelPosition;\n /**\n * 当 mark 配置了 limitRect 之后,label 是否自动调整位置\n * @default false\n */\n confine?: boolean;\n } & IMarkRef &\n IMarkLabel;\n state?: MarkCommonLineState<LineAttr>;\n };\n\nexport type MarkLineAttrs = MarkCommonLineAttrs<\n ILineGraphicWithCornerRadius | ILineGraphicAttribute[],\n keyof typeof IMarkLineLabelPosition,\n MarkCommonLineAnimationType\n> & {\n type?: 'line';\n /**\n * 是否对 points 进行多段处理,默认为 false,即直接将所有的点连接成线。\n * 如果需要进行多段处理,需要将 points 属性配置为 Point[][] 类型\n * @default false\n */\n multiSegment?: boolean;\n /**\n * 在 `multiSegment` 属性开启的前提下,用于声明那一段线段用来作为主线段,如果不声明,默认全段为主线段\n */\n mainSegmentIndex?: number;\n /**\n * 构成line的点: 如果是两个点,则为直线;多个点则为曲线\n */\n points: Point[] | Point[][];\n lineStyle?: ILineGraphicAttribute;\n};\n\nexport type MarkArcLineAttrs = MarkCommonLineAttrs<\n IArcGraphicAttribute,\n keyof typeof IMarkCommonArcLabelPosition,\n MarkCommonLineAnimationType\n> & {\n type?: 'arc-line';\n /**\n * 弧线中心位置\n */\n center: {\n x: number;\n y: number;\n };\n /**\n * 弧线半径\n */\n radius: number;\n /**\n * 弧线起始角度(弧度)\n */\n startAngle: number;\n /**\n * 弧线终点角度(弧度)\n */\n endAngle: number;\n lineStyle?: IArcGraphicAttribute;\n};\n\nexport type MarkAreaAttrs = MarkerAttrs<CommonMarkAreaAnimationType> & {\n type?: 'area';\n /**\n * 构成area的点\n */\n points: Point[];\n /**\n * 标签\n */\n label?: {\n position?: keyof typeof IMarkAreaLabelPosition;\n /**\n * 当 mark 配置了 limitRect 之后,label 是否自动调整位置\n * @default false\n */\n confine?: boolean;\n } & IMarkLabel;\n /**\n * area的样式\n */\n areaStyle?: IPolygonAttribute;\n\n state?: CommonMarkAreaState<IPolygonGraphicAttribute>;\n};\n\nexport type MarkArcAreaAttrs = MarkerAttrs<CommonMarkAreaAnimationType> & {\n type?: 'arc-area';\n /**\n * 扇区中心位置\n */\n center: {\n x: number;\n y: number;\n };\n /**\n * 扇区内半径\n */\n innerRadius: number;\n /**\n * 扇区外半径\n */\n outerRadius: number;\n /**\n * 扇区起始角度(弧度)\n */\n startAngle: number;\n /**\n * 扇区终点角度(弧度)\n */\n endAngle: number;\n /**\n * 标签\n */\n label?: {\n position?: keyof typeof IMarkCommonArcLabelPosition;\n /**\n * 当 mark 配置了 limitRect 之后,label 是否自动调整位置\n * @default false\n */\n confine?: boolean;\n } & IMarkRef &\n IMarkLabel;\n /**\n * area的样式\n */\n areaStyle?: IArcGraphicAttribute;\n\n state?: CommonMarkAreaState<IArcGraphicAttribute>;\n};\n\nexport type IItemContent = IMarkRef & {\n /**\n * 标注类型\n * Tips: 保留'richText'与之前的定义做兼容\n */\n type?: 'symbol' | 'text' | 'image' | 'richText' | 'custom';\n position?: keyof typeof IMarkPointItemPosition;\n /**\n * x 方向偏移量\n */\n offsetX?: number;\n /**\n * y 方向偏移量\n */\n offsetY?: number;\n /**\n * type为symbol时, symbol的样式\n */\n symbolStyle?: ISymbolGraphicAttribute;\n /**\n * type为image时, image的样式\n */\n imageStyle?: IImageGraphicAttribute;\n /**\n * type为text时, text的配置\n * 'text'类型的ItemContent新增三种子类型:'text','rich','html'。配置在textStyle.type上,继承自TagAttributes。\n */\n textStyle?: IMarkLabel;\n /**\n * type为rich text时, rich text的样式\n */\n richTextStyle?: IRichTextGraphicAttribute;\n /**\n * type为custom时,允许以callback的方式传入需要render的item\n */\n renderCustomCallback?: () => IGroup;\n /**\n * 当 mark 配置了 limitRect 之后,label 是否自动调整位置\n * @default false\n */\n confine?: boolean;\n};\n\nexport type IItemLine = {\n /** TODO:'type-opo' */\n type?: 'type-s' | 'type-do' | 'type-po' | 'type-op' | 'type-arc';\n visible?: boolean;\n /**\n * 当type为type-arc时生效, 数值决定曲率, 符号决定法向, 不能等于0\n * @default 0.8\n */\n arcRatio?: number;\n /**\n * 垂直于引导线的装饰线,参考案例: https://observablehq.com/@mikelotis/edmonton-population-history-line-chart\n */\n decorativeLine?: {\n visible?: boolean;\n length?: number;\n };\n} & Omit<SegmentAttributes, 'points'>;\n\nexport type MarkPointAttrs = Omit<MarkerAttrs<MarkPointAnimationType>, 'labelStyle'> & {\n /**\n * markPoint的位置(也是path的起点)\n */\n position: Point;\n /**\n * 标注引导线\n */\n itemLine?: IItemLine;\n\n /**\n * 标注内容\n */\n itemContent?: IItemContent;\n\n /**\n * 被标注的内容\n */\n targetSymbol?: {\n /**\n * 被标注内容与标记线间的间隙\n * @default 0\n */\n offset?: number;\n /**\n * 是否显示\n * @default false\n */\n visible?: boolean;\n /**\n * 大小\n * @default 20\n */\n size?: number;\n style?: ISymbol;\n };\n\n state?: MarkPointState;\n} & BaseMarkerAnimation<MarkPointAnimationType>;\n"]}
@@ -1,6 +1,6 @@
1
- import { BasePlayerAttributes } from './base';
2
- import { DirectionType } from './direction';
3
- import { BasePlayerLayoutAttributes } from './layout';
1
+ import type { BasePlayerAttributes } from './base';
2
+ import type { DirectionType } from './direction';
3
+ import type { BasePlayerLayoutAttributes } from './layout';
4
4
  export type DiscretePlayerAttributes = {
5
5
  type: 'discrete';
6
6
  direction?: DirectionType;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/player/type/discrete-player.ts"],"names":[],"mappings":"","file":"discrete-player.js","sourcesContent":["import { BasePlayerAttributes } from './base';\nimport { DirectionType } from './direction';\nimport { BasePlayerLayoutAttributes } from './layout';\n\nexport type DiscretePlayerAttributes = {\n /**\n * 播放器类型, 离散型\n */\n type: 'discrete';\n\n /**\n * 播放方向\n * @default 'default'\n */\n direction?: DirectionType;\n\n /**\n * 交替方向\n * @default false\n */\n alternate?: boolean;\n\n /**\n * 播放间隔\n * @default 1000\n */\n interval?: number;\n} & BasePlayerAttributes &\n BasePlayerLayoutAttributes;\n"]}
1
+ {"version":3,"sources":["../src/player/type/discrete-player.ts"],"names":[],"mappings":"","file":"discrete-player.js","sourcesContent":["import type { BasePlayerAttributes } from './base';\nimport type { DirectionType } from './direction';\nimport type { BasePlayerLayoutAttributes } from './layout';\n\nexport type DiscretePlayerAttributes = {\n /**\n * 播放器类型, 离散型\n */\n type: 'discrete';\n\n /**\n * 播放方向\n * @default 'default'\n */\n direction?: DirectionType;\n\n /**\n * 交替方向\n * @default false\n */\n alternate?: boolean;\n\n /**\n * 播放间隔\n * @default 1000\n */\n interval?: number;\n} & BasePlayerAttributes &\n BasePlayerLayoutAttributes;\n"]}
@@ -1,5 +1,5 @@
1
- import { ContinuousPlayerAttributes } from './continuous-player';
2
- import { DiscretePlayerAttributes } from './discrete-player';
1
+ import type { ContinuousPlayerAttributes } from './continuous-player';
2
+ import type { DiscretePlayerAttributes } from './discrete-player';
3
3
  export * from './base';
4
4
  export * from './direction';
5
5
  export * from './discrete-player';
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/player/type/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAGA,yCAAuB;AACvB,8CAA4B;AAC5B,oDAAkC;AAClC,sDAAoC;AACpC,0CAAwB;AACxB,2CAAyB","file":"index.js","sourcesContent":["import { ContinuousPlayerAttributes } from './continuous-player';\nimport { DiscretePlayerAttributes } from './discrete-player';\n\nexport * from './base';\nexport * from './direction';\nexport * from './discrete-player';\nexport * from './continuous-player';\nexport * from './event';\nexport * from './layout';\n\nexport type PlayerAttributes = ContinuousPlayerAttributes | DiscretePlayerAttributes;\n"]}
1
+ {"version":3,"sources":["../src/player/type/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAGA,yCAAuB;AACvB,8CAA4B;AAC5B,oDAAkC;AAClC,sDAAoC;AACpC,0CAAwB;AACxB,2CAAyB","file":"index.js","sourcesContent":["import type { ContinuousPlayerAttributes } from './continuous-player';\nimport type { DiscretePlayerAttributes } from './discrete-player';\n\nexport * from './base';\nexport * from './direction';\nexport * from './discrete-player';\nexport * from './continuous-player';\nexport * from './event';\nexport * from './layout';\n\nexport type PlayerAttributes = ContinuousPlayerAttributes | DiscretePlayerAttributes;\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/timeline/type.ts"],"names":[],"mappings":"","file":"type.js","sourcesContent":["import type {\n IGroupGraphicAttribute,\n ILineGraphicAttribute,\n ISymbolGraphicAttribute,\n ITextGraphicAttribute\n} from '@visactor/vrender-core';\nimport { ILineAttribute, ISymbolAttribute } from '@visactor/vrender-core';\n\nexport interface TimelineAttrs extends IGroupGraphicAttribute {\n width: number;\n // height?: number;\n times: { label: string; desc?: string }[];\n labelSpace?: number;\n symbolStyle?: Partial<ISymbolGraphicAttribute>;\n activeSymbolStyle?: Partial<ISymbolGraphicAttribute>;\n lineStyle?: Partial<ILineGraphicAttribute>;\n activeLineStyle?: Partial<ILineGraphicAttribute>;\n labelStyle?: Partial<ITextGraphicAttribute>;\n activeLabelStyle?: Partial<ITextGraphicAttribute>;\n pointLayoutMode?: 'space-around' | 'space-between';\n // 当前进度\n clipRange?: number;\n animation?: boolean;\n}\n"]}
1
+ {"version":3,"sources":["../src/timeline/type.ts"],"names":[],"mappings":"","file":"type.js","sourcesContent":["import type {\n IGroupGraphicAttribute,\n ILineGraphicAttribute,\n ISymbolGraphicAttribute,\n ITextGraphicAttribute\n} from '@visactor/vrender-core';\n\nexport interface TimelineAttrs extends IGroupGraphicAttribute {\n width: number;\n // height?: number;\n times: { label: string; desc?: string }[];\n labelSpace?: number;\n symbolStyle?: Partial<ISymbolGraphicAttribute>;\n activeSymbolStyle?: Partial<ISymbolGraphicAttribute>;\n lineStyle?: Partial<ILineGraphicAttribute>;\n activeLineStyle?: Partial<ILineGraphicAttribute>;\n labelStyle?: Partial<ITextGraphicAttribute>;\n activeLabelStyle?: Partial<ITextGraphicAttribute>;\n pointLayoutMode?: 'space-around' | 'space-between';\n // 当前进度\n clipRange?: number;\n animation?: boolean;\n}\n"]}