poptip.js 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. var __rest = (this && this.__rest) || function (s, e) {
  2. var t = {};
  3. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
  4. t[p] = s[p];
  5. if (s != null && typeof Object.getOwnPropertySymbols === "function")
  6. for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
  7. if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
  8. t[p[i]] = s[p[i]];
  9. }
  10. return t;
  11. };
  12. import { HTML } from '@antv/g';
  13. import { kebabCase } from '../utils/string';
  14. import { subObject } from '../utils/helper';
  15. function dom(tag, children, style) {
  16. return `<${tag} style="${Object.entries(style)
  17. .map(([key, value]) => `${kebabCase(key)}:${value}`)
  18. .join(';')}">${children}</${tag}>`;
  19. }
  20. const defaultTipStyle = {
  21. backgroundColor: 'rgba(0,0,0,0.75)',
  22. color: '#fff',
  23. width: 'max-content',
  24. padding: '1px 4px',
  25. fontSize: '12px',
  26. borderRadius: '2.5px',
  27. boxShadow: '0 3px 6px -4px rgba(0,0,0,0.12), 0 6px 16px 0 rgba(0,0,0,0.08), 0 9px 28px 8px rgba(0,0,0,0.05)',
  28. };
  29. function isTipText(element) {
  30. if (element.nodeName !== 'text')
  31. return false;
  32. if (element.isOverflowing())
  33. return true;
  34. return false;
  35. }
  36. export function Poptip(_a) {
  37. var { offsetX = 8, offsetY = 8 } = _a, style = __rest(_a, ["offsetX", "offsetY"]);
  38. return (context) => {
  39. const { container } = context;
  40. const [x0, y0] = container.getBounds().min;
  41. const tipStyle = subObject(style, 'tip');
  42. const tips = new Set();
  43. const pointerover = (e) => {
  44. const { target } = e;
  45. if (!isTipText(target)) {
  46. e.stopPropagation();
  47. return;
  48. }
  49. const { offsetX: mouseX, offsetY: mouseY } = e;
  50. const x = mouseX + offsetX - x0;
  51. const y = mouseY + offsetY - y0;
  52. if (target.tip) {
  53. target.tip.style.x = x;
  54. target.tip.style.y = y;
  55. return;
  56. }
  57. const { text } = target.style;
  58. const tipELement = new HTML({
  59. className: 'poptip',
  60. style: {
  61. innerHTML: dom('div', text, Object.assign(Object.assign({}, defaultTipStyle), tipStyle)),
  62. x,
  63. y,
  64. },
  65. });
  66. container.appendChild(tipELement);
  67. target.tip = tipELement;
  68. tips.add(tipELement);
  69. };
  70. const pointerout = (e) => {
  71. const { target } = e;
  72. if (!isTipText(target)) {
  73. e.stopPropagation();
  74. return;
  75. }
  76. if (!target.tip)
  77. return;
  78. target.tip.remove();
  79. target.tip = null;
  80. tips.delete(target.tip);
  81. };
  82. container.addEventListener('pointerover', pointerover);
  83. container.addEventListener('pointerout', pointerout);
  84. return () => {
  85. container.removeEventListener('pointerover', pointerover);
  86. container.removeEventListener('pointerout', pointerout);
  87. tips.forEach((tip) => tip.remove());
  88. };
  89. };
  90. }
  91. //# sourceMappingURL=poptip.js.map