@nivo/annotations
Version:
1 lines • 35.4 kB
Source Map (JSON)
{"version":3,"file":"nivo-annotations.mjs","sources":["../src/props.ts","../src/utils.ts","../src/compute.ts","../src/hooks.ts","../src/AnnotationNote.tsx","../src/AnnotationLink.tsx","../src/CircleAnnotationOutline.tsx","../src/DotAnnotationOutline.tsx","../src/RectAnnotationOutline.tsx","../src/Annotation.tsx","../src/canvas.ts"],"sourcesContent":["export const defaultProps = {\n dotSize: 4,\n noteWidth: 120,\n noteTextOffset: 8,\n animate: true,\n}\n","import {\n AnnotationSpec,\n CircleAnnotationSpec,\n DotAnnotationSpec,\n Note,\n NoteCanvas,\n NoteSvg,\n RectAnnotationSpec,\n} from './types'\nimport { isValidElement } from 'react'\n\nexport const isSvgNote = <Datum>(note: Note<Datum>): note is NoteSvg<Datum> => {\n const noteType = typeof note\n\n return (\n isValidElement(note) ||\n noteType === 'string' ||\n noteType === 'function' ||\n noteType === 'object'\n )\n}\n\nexport const isCanvasNote = <Datum>(note: Note<Datum>): note is NoteCanvas<Datum> => {\n const noteType = typeof note\n\n return noteType === 'string' || noteType === 'function'\n}\n\nexport const isCircleAnnotation = <Datum>(\n annotationSpec: AnnotationSpec<Datum>\n): annotationSpec is CircleAnnotationSpec<Datum> => annotationSpec.type === 'circle'\n\nexport const isDotAnnotation = <Datum>(\n annotationSpec: AnnotationSpec<Datum>\n): annotationSpec is DotAnnotationSpec<Datum> => annotationSpec.type === 'dot'\n\nexport const isRectAnnotation = <Datum>(\n annotationSpec: AnnotationSpec<Datum>\n): annotationSpec is RectAnnotationSpec<Datum> => annotationSpec.type === 'rect'\n","import filter from 'lodash/filter.js'\nimport isNumber from 'lodash/isNumber.js'\nimport omit from 'lodash/omit.js'\nimport {\n radiansToDegrees,\n normalizeAngleDegrees,\n degreesToRadians,\n positionFromAngle,\n} from '@nivo/core'\nimport { defaultProps } from './props'\nimport {\n AnnotationPositionGetter,\n AnnotationDimensionsGetter,\n BoundAnnotation,\n AnnotationMatcher,\n AnnotationInstructions,\n} from './types'\nimport { isCircleAnnotation, isRectAnnotation } from './utils'\n\nexport const bindAnnotations = <\n Datum = {\n x: number\n y: number\n },\n>({\n data,\n annotations,\n getPosition,\n getDimensions,\n}: {\n data: readonly Datum[]\n annotations: readonly AnnotationMatcher<Datum>[]\n getPosition: AnnotationPositionGetter<Datum>\n getDimensions: AnnotationDimensionsGetter<Datum>\n}): BoundAnnotation<Datum>[] =>\n annotations.reduce((acc: BoundAnnotation<Datum>[], annotation) => {\n const offset = annotation.offset || 0\n\n return [\n ...acc,\n ...filter<Datum>(data, annotation.match).map(datum => {\n const position = getPosition(datum)\n const dimensions = getDimensions(datum)\n\n if (isCircleAnnotation(annotation) || isRectAnnotation(annotation)) {\n dimensions.size = dimensions.size + offset * 2\n dimensions.width = dimensions.width + offset * 2\n dimensions.height = dimensions.height + offset * 2\n }\n\n // acc.push({\n // ...omit(annotation, ['match', 'offset']),\n // ...position,\n // ...dimensions,\n // size: annotation.size || dimensions.size,\n // datum,\n // } as any)\n // return [\n // ...acc,\n // {\n // ...omit(annotation, ['match', 'offset']),\n // ...position,\n // ...dimensions,\n // size: annotation.size || dimensions.size,\n // datum,\n // },\n // ]\n return {\n ...omit(annotation, ['match', 'offset']),\n ...position,\n ...dimensions,\n size: annotation.size || dimensions.size,\n datum,\n } as Required<BoundAnnotation<Datum>>\n }),\n ]\n\n // return acc\n }, [])\n\nexport const getLinkAngle = (\n sourceX: number,\n sourceY: number,\n targetX: number,\n targetY: number\n) => {\n const angle = Math.atan2(targetY - sourceY, targetX - sourceX)\n\n return normalizeAngleDegrees(radiansToDegrees(angle))\n}\n\nexport const computeAnnotation = <Datum>(\n annotation: BoundAnnotation<Datum>\n): AnnotationInstructions => {\n const {\n x,\n y,\n noteX,\n noteY,\n noteWidth = defaultProps.noteWidth,\n noteTextOffset = defaultProps.noteTextOffset,\n } = annotation\n\n let computedNoteX: number\n let computedNoteY: number\n\n if (isNumber(noteX)) {\n computedNoteX = x + noteX\n } else if (noteX.abs !== undefined) {\n computedNoteX = noteX.abs\n } else {\n throw new Error(`noteX should be either a number or an object containing an 'abs' property`)\n }\n\n if (isNumber(noteY)) {\n computedNoteY = y + noteY\n } else if (noteY.abs !== undefined) {\n computedNoteY = noteY.abs\n } else {\n throw new Error(`noteY should be either a number or an object containing an 'abs' property`)\n }\n\n let computedX = x\n let computedY = y\n\n const angle = getLinkAngle(x, y, computedNoteX, computedNoteY)\n\n if (isCircleAnnotation<Datum>(annotation)) {\n const position = positionFromAngle(degreesToRadians(angle), annotation.size / 2)\n computedX += position.x\n computedY += position.y\n }\n\n if (isRectAnnotation<Datum>(annotation)) {\n const eighth = Math.round((angle + 90) / 45) % 8\n if (eighth === 0) {\n computedY -= annotation.height / 2\n }\n if (eighth === 1) {\n computedX += annotation.width / 2\n computedY -= annotation.height / 2\n }\n if (eighth === 2) {\n computedX += annotation.width / 2\n }\n if (eighth === 3) {\n computedX += annotation.width / 2\n computedY += annotation.height / 2\n }\n if (eighth === 4) {\n computedY += annotation.height / 2\n }\n if (eighth === 5) {\n computedX -= annotation.width / 2\n computedY += annotation.height / 2\n }\n if (eighth === 6) {\n computedX -= annotation.width / 2\n }\n if (eighth === 7) {\n computedX -= annotation.width / 2\n computedY -= annotation.height / 2\n }\n }\n\n let textX = computedNoteX\n const textY = computedNoteY - noteTextOffset\n\n let noteLineX = computedNoteX\n const noteLineY = computedNoteY\n\n if ((angle + 90) % 360 > 180) {\n textX -= noteWidth\n noteLineX -= noteWidth\n } else {\n noteLineX += noteWidth\n }\n\n return {\n points: [\n [computedX, computedY],\n [computedNoteX, computedNoteY],\n [noteLineX, noteLineY],\n ] as [number, number][],\n text: [textX, textY],\n angle: angle + 90,\n }\n}\n","import { useMemo } from 'react'\nimport { bindAnnotations, computeAnnotation } from './compute'\nimport {\n AnnotationDimensionsGetter,\n AnnotationMatcher,\n AnnotationPositionGetter,\n BoundAnnotation,\n} from './types'\n\n/**\n * Bind annotations to a dataset.\n */\nexport const useAnnotations = <Datum>({\n data,\n annotations,\n getPosition,\n getDimensions,\n}: {\n data: readonly Datum[]\n annotations: readonly AnnotationMatcher<Datum>[]\n getPosition: AnnotationPositionGetter<Datum>\n getDimensions: AnnotationDimensionsGetter<Datum>\n}) =>\n useMemo(\n () =>\n bindAnnotations<Datum>({\n data,\n annotations,\n getPosition,\n getDimensions,\n }),\n [data, annotations, getPosition, getDimensions]\n )\n\nexport const useComputedAnnotations = <Datum>({\n annotations,\n}: {\n annotations: readonly BoundAnnotation<Datum>[]\n}) =>\n useMemo(\n () =>\n annotations.map(annotation => ({\n ...annotation,\n computed: computeAnnotation<Datum>({\n ...annotation,\n }),\n })),\n [annotations]\n )\n\nexport const useComputedAnnotation = <Datum>(annotation: BoundAnnotation<Datum>) =>\n useMemo(() => computeAnnotation<Datum>(annotation), [annotation])\n","import { createElement } from 'react'\nimport omit from 'lodash/omit.js'\nimport { useSpring, animated } from '@react-spring/web'\nimport { useMotionConfig } from '@nivo/core'\nimport { useTheme } from '@nivo/theming'\nimport { NoteSvg } from './types'\n\nexport const AnnotationNote = <Datum,>({\n datum,\n x,\n y,\n note,\n}: {\n datum: Datum\n x: number\n y: number\n note: NoteSvg<Datum>\n}) => {\n const theme = useTheme()\n const { animate, config: springConfig } = useMotionConfig()\n\n const animatedProps = useSpring({\n x,\n y,\n config: springConfig,\n immediate: !animate,\n })\n\n if (typeof note === 'function') {\n return createElement(note, { x, y, datum })\n }\n\n return (\n <>\n {theme.annotations.text.outlineWidth > 0 && (\n <animated.text\n x={animatedProps.x}\n y={animatedProps.y}\n style={{\n ...theme.annotations.text,\n strokeLinejoin: 'round',\n strokeWidth: theme.annotations.text.outlineWidth * 2,\n stroke: theme.annotations.text.outlineColor,\n }}\n >\n {note}\n </animated.text>\n )}\n <animated.text\n x={animatedProps.x}\n y={animatedProps.y}\n style={omit(theme.annotations.text, ['outlineWidth', 'outlineColor'])}\n >\n {note}\n </animated.text>\n </>\n )\n}\n","import { useMemo } from 'react'\nimport { animated } from '@react-spring/web'\nimport { useAnimatedPath } from '@nivo/core'\nimport { useTheme } from '@nivo/theming'\n\nexport const AnnotationLink = ({\n points,\n isOutline = false,\n}: {\n points: [number, number][]\n isOutline?: boolean\n}) => {\n const theme = useTheme()\n\n const path = useMemo(() => {\n const [firstPoint, ...otherPoints] = points\n\n return otherPoints.reduce(\n (acc, [x, y]) => `${acc} L${x},${y}`,\n `M${firstPoint[0]},${firstPoint[1]}`\n )\n }, [points])\n\n const animatedPath = useAnimatedPath(path)\n\n if (isOutline && theme.annotations.link.outlineWidth <= 0) {\n return null\n }\n\n const style = { ...theme.annotations.link }\n if (isOutline) {\n style.strokeLinecap = 'square'\n style.strokeWidth =\n theme.annotations.link.strokeWidth + theme.annotations.link.outlineWidth * 2\n style.stroke = theme.annotations.link.outlineColor\n style.opacity = theme.annotations.link.outlineOpacity\n }\n\n return <animated.path fill=\"none\" d={animatedPath} style={style} />\n}\n","import { useSpring, animated } from '@react-spring/web'\nimport { useMotionConfig } from '@nivo/core'\nimport { useTheme } from '@nivo/theming'\n\nexport const CircleAnnotationOutline = ({ x, y, size }: { x: number; y: number; size: number }) => {\n const theme = useTheme()\n const { animate, config: springConfig } = useMotionConfig()\n\n const animatedProps = useSpring({\n x,\n y,\n radius: size / 2,\n config: springConfig,\n immediate: !animate,\n })\n\n return (\n <>\n {theme.annotations.outline.outlineWidth > 0 && (\n <animated.circle\n cx={animatedProps.x}\n cy={animatedProps.y}\n r={animatedProps.radius}\n style={{\n ...theme.annotations.outline,\n fill: 'none',\n strokeWidth:\n theme.annotations.outline.strokeWidth +\n theme.annotations.outline.outlineWidth * 2,\n stroke: theme.annotations.outline.outlineColor,\n opacity: theme.annotations.outline.outlineOpacity,\n }}\n />\n )}\n <animated.circle\n cx={animatedProps.x}\n cy={animatedProps.y}\n r={animatedProps.radius}\n style={theme.annotations.outline}\n />\n </>\n )\n}\n","import { useSpring, animated } from '@react-spring/web'\nimport { useMotionConfig } from '@nivo/core'\nimport { useTheme } from '@nivo/theming'\nimport { defaultProps } from './props'\n\nexport const DotAnnotationOutline = ({\n x,\n y,\n size = defaultProps.dotSize,\n}: {\n x: number\n y: number\n size?: number\n}) => {\n const theme = useTheme()\n const { animate, config: springConfig } = useMotionConfig()\n\n const animatedProps = useSpring({\n x,\n y,\n radius: size / 2,\n config: springConfig,\n immediate: !animate,\n })\n\n return (\n <>\n {theme.annotations.outline.outlineWidth > 0 && (\n <animated.circle\n cx={animatedProps.x}\n cy={animatedProps.y}\n r={animatedProps.radius}\n style={{\n ...theme.annotations.outline,\n fill: 'none',\n strokeWidth: theme.annotations.outline.outlineWidth * 2,\n stroke: theme.annotations.outline.outlineColor,\n opacity: theme.annotations.outline.outlineOpacity,\n }}\n />\n )}\n <animated.circle\n cx={animatedProps.x}\n cy={animatedProps.y}\n r={animatedProps.radius}\n style={theme.annotations.symbol}\n />\n </>\n )\n}\n","import { useSpring, animated } from '@react-spring/web'\nimport { useMotionConfig } from '@nivo/core'\nimport { useTheme } from '@nivo/theming'\n\nexport const RectAnnotationOutline = ({\n x,\n y,\n width,\n height,\n borderRadius = 6,\n}: {\n x: number\n y: number\n width: number\n height: number\n borderRadius?: number\n}) => {\n const theme = useTheme()\n const { animate, config: springConfig } = useMotionConfig()\n\n const animatedProps = useSpring({\n x: x - width / 2,\n y: y - height / 2,\n width,\n height,\n config: springConfig,\n immediate: !animate,\n })\n\n return (\n <>\n {theme.annotations.outline.outlineWidth > 0 && (\n <animated.rect\n x={animatedProps.x}\n y={animatedProps.y}\n rx={borderRadius}\n ry={borderRadius}\n width={animatedProps.width}\n height={animatedProps.height}\n style={{\n ...theme.annotations.outline,\n fill: 'none',\n strokeWidth:\n theme.annotations.outline.strokeWidth +\n theme.annotations.outline.outlineWidth * 2,\n stroke: theme.annotations.outline.outlineColor,\n opacity: theme.annotations.outline.outlineOpacity,\n }}\n />\n )}\n <animated.rect\n x={animatedProps.x}\n y={animatedProps.y}\n rx={borderRadius}\n ry={borderRadius}\n width={animatedProps.width}\n height={animatedProps.height}\n style={theme.annotations.outline}\n />\n </>\n )\n}\n","import { useComputedAnnotation } from './hooks'\nimport { AnnotationNote } from './AnnotationNote'\nimport { AnnotationLink } from './AnnotationLink'\nimport { CircleAnnotationOutline } from './CircleAnnotationOutline'\nimport { DotAnnotationOutline } from './DotAnnotationOutline'\nimport { RectAnnotationOutline } from './RectAnnotationOutline'\nimport { BoundAnnotation } from './types'\nimport { isCircleAnnotation, isDotAnnotation, isRectAnnotation, isSvgNote } from './utils'\n\nexport const Annotation = <Datum,>(annotation: BoundAnnotation<Datum>) => {\n const { datum, x, y, note } = annotation\n const computed = useComputedAnnotation(annotation)\n\n if (!isSvgNote(note)) {\n throw new Error('note should be a valid react element')\n }\n\n return (\n <>\n <AnnotationLink points={computed.points} isOutline={true} />\n {isCircleAnnotation(annotation) && (\n <CircleAnnotationOutline x={x} y={y} size={annotation.size} />\n )}\n {isDotAnnotation(annotation) && (\n <DotAnnotationOutline x={x} y={y} size={annotation.size} />\n )}\n {isRectAnnotation(annotation) && (\n <RectAnnotationOutline\n x={x}\n y={y}\n width={annotation.width}\n height={annotation.height}\n borderRadius={annotation.borderRadius}\n />\n )}\n <AnnotationLink points={computed.points} />\n <AnnotationNote datum={datum} x={computed.text[0]} y={computed.text[1]} note={note} />\n </>\n )\n}\n","import { Theme } from '@nivo/theming'\nimport { ComputedAnnotation } from './types'\nimport { isCanvasNote, isCircleAnnotation, isDotAnnotation, isRectAnnotation } from './utils'\n\nconst drawPoints = (ctx: CanvasRenderingContext2D, points: [number, number][]) => {\n points.forEach(([x, y], index) => {\n if (index === 0) {\n ctx.moveTo(x, y)\n } else {\n ctx.lineTo(x, y)\n }\n })\n}\n\nexport const renderAnnotationsToCanvas = <Datum>(\n ctx: CanvasRenderingContext2D,\n {\n annotations,\n theme,\n }: {\n annotations: ComputedAnnotation<Datum>[]\n theme: Theme\n }\n) => {\n if (annotations.length === 0) return\n\n ctx.save()\n annotations.forEach(annotation => {\n if (!isCanvasNote(annotation.note)) {\n throw new Error('note is invalid for canvas implementation')\n }\n\n if (theme.annotations.link.outlineWidth > 0) {\n ctx.lineCap = 'square'\n ctx.strokeStyle = theme.annotations.link.outlineColor\n ctx.lineWidth =\n theme.annotations.link.strokeWidth + theme.annotations.link.outlineWidth * 2\n ctx.beginPath()\n drawPoints(ctx, annotation.computed.points)\n ctx.stroke()\n ctx.lineCap = 'butt'\n }\n\n if (isCircleAnnotation(annotation) && theme.annotations.outline.outlineWidth > 0) {\n ctx.strokeStyle = theme.annotations.outline.outlineColor\n ctx.lineWidth =\n theme.annotations.outline.strokeWidth + theme.annotations.outline.outlineWidth * 2\n ctx.beginPath()\n ctx.arc(annotation.x, annotation.y, annotation.size / 2, 0, 2 * Math.PI)\n ctx.stroke()\n }\n\n if (isDotAnnotation(annotation) && theme.annotations.symbol.outlineWidth > 0) {\n ctx.strokeStyle = theme.annotations.symbol.outlineColor\n ctx.lineWidth = theme.annotations.symbol.outlineWidth * 2\n ctx.beginPath()\n ctx.arc(annotation.x, annotation.y, annotation.size / 2, 0, 2 * Math.PI)\n ctx.stroke()\n }\n\n if (isRectAnnotation(annotation) && theme.annotations.outline.outlineWidth > 0) {\n ctx.strokeStyle = theme.annotations.outline.outlineColor\n ctx.lineWidth =\n theme.annotations.outline.strokeWidth + theme.annotations.outline.outlineWidth * 2\n ctx.beginPath()\n ctx.rect(\n annotation.x - annotation.width / 2,\n annotation.y - annotation.height / 2,\n annotation.width,\n annotation.height\n )\n ctx.stroke()\n }\n\n ctx.strokeStyle = theme.annotations.link.stroke\n ctx.lineWidth = theme.annotations.link.strokeWidth\n ctx.beginPath()\n drawPoints(ctx, annotation.computed.points)\n ctx.stroke()\n\n if (isCircleAnnotation(annotation)) {\n ctx.strokeStyle = theme.annotations.outline.stroke\n ctx.lineWidth = theme.annotations.outline.strokeWidth\n ctx.beginPath()\n ctx.arc(annotation.x, annotation.y, annotation.size / 2, 0, 2 * Math.PI)\n ctx.stroke()\n }\n\n if (isDotAnnotation(annotation)) {\n ctx.fillStyle = theme.annotations.symbol.fill\n ctx.beginPath()\n ctx.arc(annotation.x, annotation.y, annotation.size / 2, 0, 2 * Math.PI)\n ctx.fill()\n }\n\n if (isRectAnnotation(annotation)) {\n ctx.strokeStyle = theme.annotations.outline.stroke\n ctx.lineWidth = theme.annotations.outline.strokeWidth\n ctx.beginPath()\n ctx.rect(\n annotation.x - annotation.width / 2,\n annotation.y - annotation.height / 2,\n annotation.width,\n annotation.height\n )\n ctx.stroke()\n }\n\n if (typeof annotation.note === 'function') {\n annotation.note(ctx, {\n datum: annotation.datum,\n x: annotation.computed.text[0],\n y: annotation.computed.text[1],\n theme,\n })\n } else {\n ctx.font = `${theme.annotations.text.fontSize}px ${theme.annotations.text.fontFamily}`\n ctx.textAlign = 'left'\n ctx.textBaseline = 'alphabetic'\n\n ctx.fillStyle = theme.annotations.text.fill\n ctx.strokeStyle = theme.annotations.text.outlineColor\n ctx.lineWidth = theme.annotations.text.outlineWidth * 2\n\n if (theme.annotations.text.outlineWidth > 0) {\n ctx.lineJoin = 'round'\n ctx.strokeText(\n annotation.note,\n annotation.computed.text[0],\n annotation.computed.text[1]\n )\n ctx.lineJoin = 'miter'\n }\n ctx.fillText(annotation.note, annotation.computed.text[0], annotation.computed.text[1])\n }\n })\n ctx.restore()\n}\n"],"names":["defaultProps","dotSize","noteWidth","noteTextOffset","animate","isSvgNote","note","noteType","isValidElement","isCanvasNote","isCircleAnnotation","annotationSpec","type","isDotAnnotation","isRectAnnotation","bindAnnotations","_ref","data","annotations","getPosition","getDimensions","reduce","acc","annotation","offset","concat","filter","match","map","datum","position","dimensions","size","width","height","_extends","omit","getLinkAngle","sourceX","sourceY","targetX","targetY","angle","Math","atan2","normalizeAngleDegrees","radiansToDegrees","computeAnnotation","computedNoteX","computedNoteY","x","y","noteX","noteY","_annotation$noteWidth","_annotation$noteTextO","isNumber","undefined","abs","Error","computedX","computedY","positionFromAngle","degreesToRadians","eighth","round","textX","noteLineX","points","text","useAnnotations","useMemo","useComputedAnnotations","_ref2","computed","useComputedAnnotation","AnnotationNote","theme","useTheme","_useMotionConfig","useMotionConfig","springConfig","config","animatedProps","useSpring","immediate","createElement","_jsxs","_Fragment","children","outlineWidth","_jsx","animated","style","strokeLinejoin","strokeWidth","stroke","outlineColor","AnnotationLink","_ref$isOutline","isOutline","path","firstPoint","slice","animatedPath","useAnimatedPath","link","strokeLinecap","opacity","outlineOpacity","fill","d","CircleAnnotationOutline","radius","outline","circle","cx","cy","r","DotAnnotationOutline","_ref$size","symbol","RectAnnotationOutline","_ref$borderRadius","borderRadius","rect","rx","ry","Annotation","drawPoints","ctx","forEach","index","moveTo","lineTo","renderAnnotationsToCanvas","length","save","lineCap","strokeStyle","lineWidth","beginPath","arc","PI","fillStyle","font","fontSize","fontFamily","textAlign","textBaseline","lineJoin","strokeText","fillText","restore"],"mappings":"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"}