view x/static/js/4753.834007ba.chunk.js.map @ 125:49f3d3878413 draft

planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/jbrowse2 commit 5ea1f9c1eef1de76232e69aa6d34cda77d90d566
author fubar
date Sat, 05 Oct 2024 23:58:05 +0000
parents
children
line wrap: on
line source

{"version":3,"file":"static/js/4753.834007ba.chunk.js","mappings":"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","sources":["../../../plugins/linear-comparative-view/src/LinearSyntenyDisplay/components/SyntenyContextMenu.tsx","../../../plugins/linear-comparative-view/src/LinearSyntenyDisplay/components/LinearSyntenyRendering.tsx","../../../plugins/linear-comparative-view/src/LinearSyntenyDisplay/components/Component.tsx","../../../plugins/linear-comparative-view/src/LinearSyntenyDisplay/components/util.ts","../../../plugins/linear-comparative-view/src/LinearSyntenyDisplay/drawSynteny.ts"],"sourcesContent":["import React from 'react'\nimport { getContainingView, getSession, Feature } from '@jbrowse/core/util'\nimport { Menu } from '@jbrowse/core/ui'\n\n// locals\nimport { LinearSyntenyDisplayModel } from '../model'\nimport { LinearSyntenyViewModel } from '../../LinearSyntenyView/model'\n\ninterface ClickCoord {\n  clientX: number\n  clientY: number\n  feature: { f: Feature }\n}\n\nexport default function SyntenyContextMenu({\n  model,\n  onClose,\n  anchorEl,\n}: {\n  onClose: () => void\n  model: LinearSyntenyDisplayModel\n  anchorEl: ClickCoord\n}) {\n  const view = getContainingView(model) as LinearSyntenyViewModel\n  const { clientX, clientY, feature } = anchorEl\n  return (\n    <Menu\n      onMenuItemClick={(event, callback) => {\n        callback(event)\n        onClose()\n      }}\n      anchorEl={{\n        nodeType: 1,\n        getBoundingClientRect: () => {\n          const x = clientX\n          const y = clientY\n          return {\n            top: y,\n            left: x,\n            bottom: y,\n            right: x,\n            width: 0,\n            height: 0,\n            x,\n            y,\n            toJSON() {},\n          }\n        },\n      }}\n      onClose={onClose}\n      open={Boolean(anchorEl)}\n      menuItems={[\n        {\n          label: 'Center on feature',\n          onClick: () => {\n            const { f } = feature\n            const start = f.get('start')\n            const end = f.get('end')\n            const refName = f.get('refName')\n            const mate = f.get('mate')\n            view.views[0]!.navToLocString(`${refName}:${start}-${end}`).catch(\n              (e: unknown) => {\n                console.error(e)\n                getSession(model).notifyError(`${e}`, e)\n              },\n            )\n            view.views[1]!.navToLocString(\n              `${mate.refName}:${mate.start}-${mate.end}`,\n            ).catch((e: unknown) => {\n              console.error(e)\n              getSession(model).notifyError(`${e}`, e)\n            })\n          },\n        },\n      ]}\n    />\n  )\n}\n","import React, { useState, useCallback, useRef, lazy } from 'react'\nimport { observer } from 'mobx-react'\nimport { getContainingView } from '@jbrowse/core/util'\nimport { transaction } from 'mobx'\nimport { makeStyles } from 'tss-react/mui'\n\n// locals\nimport { LinearSyntenyDisplayModel } from '../model'\nimport { getId, MAX_COLOR_RANGE } from '../drawSynteny'\nimport { LinearSyntenyViewModel } from '../../LinearSyntenyView/model'\nimport SyntenyContextMenu from './SyntenyContextMenu'\nimport { ClickCoord, getTooltip, onSynClick, onSynContextClick } from './util'\n\nconst SyntenyTooltip = lazy(() => import('./SyntenyTooltip'))\n\ntype Timer = ReturnType<typeof setTimeout>\n\nconst useStyles = makeStyles()({\n  pix: {\n    imageRendering: 'pixelated',\n    pointerEvents: 'none',\n    visibility: 'hidden',\n    position: 'absolute',\n  },\n  rel: {\n    position: 'relative',\n  },\n  abs: {\n    position: 'absolute',\n  },\n  none: {\n    pointEvents: 'none',\n  },\n})\n\nconst LinearSyntenyRendering = observer(function ({\n  model,\n}: {\n  model: LinearSyntenyDisplayModel\n}) {\n  const { classes, cx } = useStyles()\n  const xOffset = useRef<number>(0)\n  const currScrollFrame = useRef<number>()\n  const view = getContainingView(model) as LinearSyntenyViewModel\n  const height = view.middleComparativeHeight\n  const width = view.width\n  const delta = useRef(0)\n  const timeout = useRef<Timer>()\n  const [anchorEl, setAnchorEl] = useState<ClickCoord>()\n  const [tooltip, setTooltip] = useState('')\n  const [currX, setCurrX] = useState<number>()\n  const [mouseCurrDownX, setMouseCurrDownX] = useState<number>()\n  const [mouseInitialDownX, setMouseInitialDownX] = useState<number>()\n  const [currY, setCurrY] = useState<number>()\n  const { mouseoverId } = model\n\n  // these useCallbacks avoid new refs from being created on any mouseover,\n  // etc.\n  // biome-ignore lint/correctness/useExhaustiveDependencies:\n  const k1 = useCallback(\n    (ref: HTMLCanvasElement | null) => {\n      model.setMouseoverCanvasRef(ref)\n    },\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [model, height, width],\n  )\n  // biome-ignore lint/correctness/useExhaustiveDependencies:\n  const k2 = useCallback(\n    (ref: HTMLCanvasElement | null) => {\n      model.setMainCanvasRef(ref)\n      function onWheel(event: WheelEvent) {\n        event.preventDefault()\n        if (event.ctrlKey) {\n          delta.current += event.deltaY / 500\n          for (const v of view.views) {\n            v.setScaleFactor(\n              delta.current < 0 ? 1 - delta.current : 1 / (1 + delta.current),\n            )\n          }\n          if (timeout.current) {\n            clearTimeout(timeout.current)\n          }\n          timeout.current = setTimeout(() => {\n            for (const v of view.views) {\n              v.setScaleFactor(1)\n              v.zoomTo(\n                delta.current > 0\n                  ? v.bpPerPx * (1 + delta.current)\n                  : v.bpPerPx / (1 - delta.current),\n                event.clientX - (ref?.getBoundingClientRect().left || 0),\n              )\n            }\n            delta.current = 0\n          }, 300)\n        } else {\n          if (Math.abs(event.deltaY) < Math.abs(event.deltaX)) {\n            xOffset.current += event.deltaX / 2\n          }\n          if (currScrollFrame.current === undefined) {\n            currScrollFrame.current = requestAnimationFrame(() => {\n              transaction(() => {\n                for (const v of view.views) {\n                  v.horizontalScroll(xOffset.current)\n                }\n                xOffset.current = 0\n                currScrollFrame.current = undefined\n              })\n            })\n          }\n        }\n      }\n      ref?.addEventListener('wheel', onWheel)\n\n      // this is a react 19-ism to have a cleanup in the ref callback\n      // https://react.dev/blog/2024/04/25/react-19#cleanup-functions-for-refs\n      // note: it warns in earlier versions of react\n      return () => {\n        ref?.removeEventListener('wheel', onWheel)\n      }\n    },\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [model, height, width],\n  )\n  // biome-ignore lint/correctness/useExhaustiveDependencies:\n  const k3 = useCallback(\n    (ref: HTMLCanvasElement | null) => {\n      model.setClickMapCanvasRef(ref)\n    },\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [model, height, width],\n  )\n  // biome-ignore lint/correctness/useExhaustiveDependencies:\n  const k4 = useCallback(\n    (ref: HTMLCanvasElement | null) => {\n      model.setCigarClickMapCanvasRef(ref)\n    },\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [model, height, width],\n  )\n\n  return (\n    <div className={classes.rel}>\n      <canvas\n        ref={k1}\n        width={width}\n        height={height}\n        className={cx(classes.abs, classes.none)}\n      />\n      <canvas\n        ref={k2}\n        onMouseMove={event => {\n          if (mouseCurrDownX !== undefined) {\n            xOffset.current += mouseCurrDownX - event.clientX\n            setMouseCurrDownX(event.clientX)\n            if (currScrollFrame.current === undefined) {\n              currScrollFrame.current = requestAnimationFrame(() => {\n                transaction(() => {\n                  for (const v of view.views) {\n                    v.horizontalScroll(xOffset.current)\n                  }\n                  xOffset.current = 0\n                  currScrollFrame.current = undefined\n                })\n              })\n            }\n          } else {\n            const ref1 = model.clickMapCanvas\n            const ref2 = model.cigarClickMapCanvas\n            if (!ref1 || !ref2) {\n              return\n            }\n            const rect = ref1.getBoundingClientRect()\n            const ctx1 = ref1.getContext('2d')\n            const ctx2 = ref2.getContext('2d')\n            if (!ctx1 || !ctx2) {\n              return\n            }\n            const { clientX, clientY } = event\n            const x = clientX - rect.left\n            const y = clientY - rect.top\n            setCurrX(clientX)\n            setCurrY(clientY)\n            const [r1, g1, b1] = ctx1.getImageData(x, y, 1, 1).data\n            const [r2, g2, b2] = ctx2.getImageData(x, y, 1, 1).data\n            const unitMultiplier = Math.floor(MAX_COLOR_RANGE / model.numFeats)\n            const id = getId(r1!, g1!, b1!, unitMultiplier)\n            model.setMouseoverId(model.featPositions[id]?.f.id())\n            if (id === -1) {\n              setTooltip('')\n            } else if (model.featPositions[id]) {\n              const { f, cigar } = model.featPositions[id]\n              const unitMultiplier2 = Math.floor(MAX_COLOR_RANGE / cigar.length)\n              const cigarIdx = getId(r2!, g2!, b2!, unitMultiplier2)\n              setTooltip(getTooltip(f, cigar[cigarIdx], cigar[cigarIdx + 1]))\n            }\n          }\n        }}\n        onMouseLeave={() => {\n          model.setMouseoverId(undefined)\n          setMouseInitialDownX(undefined)\n          setMouseCurrDownX(undefined)\n        }}\n        onMouseDown={evt => {\n          setMouseCurrDownX(evt.clientX)\n          setMouseInitialDownX(evt.clientX)\n        }}\n        onMouseUp={evt => {\n          setMouseCurrDownX(undefined)\n          if (\n            mouseInitialDownX !== undefined &&\n            Math.abs(evt.clientX - mouseInitialDownX) < 5\n          ) {\n            onSynClick(evt, model)\n          }\n        }}\n        onContextMenu={evt => {\n          onSynContextClick(evt, model, setAnchorEl)\n        }}\n        data-testid=\"synteny_canvas\"\n        className={classes.abs}\n        width={width}\n        height={height}\n      />\n      <canvas ref={k3} className={classes.pix} width={width} height={height} />\n      <canvas ref={k4} className={classes.pix} width={width} height={height} />\n      {mouseoverId && tooltip && currX && currY ? (\n        <SyntenyTooltip title={tooltip} />\n      ) : null}\n      {anchorEl ? (\n        <SyntenyContextMenu\n          model={model}\n          anchorEl={anchorEl}\n          onClose={() => {\n            setAnchorEl(undefined)\n          }}\n        />\n      ) : null}\n    </div>\n  )\n})\n\nexport default LinearSyntenyRendering\n","import React, { useEffect, useState } from 'react'\nimport { makeStyles } from 'tss-react/mui'\nimport { observer } from 'mobx-react'\nimport { LoadingEllipses } from '@jbrowse/core/ui'\n\n// locals\nimport LinearSyntenyRendering from './LinearSyntenyRendering'\nimport { LinearSyntenyDisplayModel } from '../model'\n\nconst useStyles = makeStyles()(theme => {\n  const bg = theme.palette.action.disabledBackground\n  return {\n    loading: {\n      paddingLeft: '0.6em',\n      backgroundColor: theme.palette.background.default,\n      backgroundImage: `repeating-linear-gradient(45deg, transparent, transparent 5px, ${bg} 5px, ${bg} 10px)`,\n      textAlign: 'center',\n    },\n    blockMessage: {\n      background: '#f1f1f1',\n      padding: 10,\n    },\n    blockError: {\n      background: '#f1f1f1',\n      padding: 10,\n      color: 'red',\n    },\n  }\n})\n\nfunction LoadingMessage() {\n  // only show the loading message after 300ms to prevent excessive flickering\n  const [shown, setShown] = useState(false)\n  const { classes } = useStyles()\n  useEffect(() => {\n    const timeout = setTimeout(() => {\n      setShown(true)\n    }, 300)\n    return () => {\n      clearTimeout(timeout)\n    }\n  })\n\n  return shown ? (\n    <div className={classes.loading}>\n      <LoadingEllipses />\n    </div>\n  ) : null\n}\n\nfunction BlockMessage({ messageText }: { messageText: string }) {\n  const { classes } = useStyles()\n  return <div className={classes.blockMessage}>{messageText}</div>\n}\n\nfunction BlockError({ error }: { error: unknown }) {\n  const { classes } = useStyles()\n  return <div className={classes.blockError}>{`${error}`}</div>\n}\n\nconst ServerSideRenderedBlockContent = observer(function ({\n  model,\n}: {\n  model: LinearSyntenyDisplayModel\n}) {\n  if (model.error) {\n    return <BlockError error={model.error} />\n  }\n  if (model.message) {\n    return <BlockMessage messageText={model.message} />\n  }\n  if (!model.features) {\n    return <LoadingMessage />\n  }\n\n  return <LinearSyntenyRendering model={model} />\n})\n\nexport default ServerSideRenderedBlockContent\n","import React from 'react'\nimport {\n  assembleLocString,\n  doesIntersect2,\n  getSession,\n  isSessionModelWithWidgets,\n  Feature,\n  getContainingTrack,\n  getContainingView,\n} from '@jbrowse/core/util'\n\n// locals\nimport { getId, MAX_COLOR_RANGE } from '../drawSynteny'\nimport { LinearSyntenyDisplayModel } from '../model'\n\ninterface Pos {\n  offsetPx: number\n}\n\nexport interface ClickCoord {\n  clientX: number\n  clientY: number\n  feature: { f: Feature }\n}\n\ninterface FeatPos {\n  p11: Pos\n  p12: Pos\n  p21: Pos\n  p22: Pos\n  f: Feature\n  cigar: string[]\n}\n\nexport function drawMatchSimple({\n  feature,\n  ctx,\n  offsets,\n  cb,\n  height,\n  drawCurves,\n  oobLimit,\n  viewWidth,\n  hideTiny,\n}: {\n  feature: FeatPos\n  ctx: CanvasRenderingContext2D\n  offsets: number[]\n  oobLimit: number\n  viewWidth: number\n  cb: (ctx: CanvasRenderingContext2D) => void\n  height: number\n  drawCurves?: boolean\n  hideTiny?: boolean\n}) {\n  const { p11, p12, p21, p22 } = feature\n\n  const x11 = p11.offsetPx - offsets[0]!\n  const x12 = p12.offsetPx - offsets[0]!\n  const x21 = p21.offsetPx - offsets[1]!\n  const x22 = p22.offsetPx - offsets[1]!\n\n  const l1 = Math.abs(x12 - x11)\n  const l2 = Math.abs(x22 - x21)\n  const y1 = 0\n  const y2 = height\n  const mid = (y2 - y1) / 2\n  const minX = Math.min(x21, x22)\n  const maxX = Math.max(x21, x22)\n\n  if (!doesIntersect2(minX, maxX, -oobLimit, viewWidth + oobLimit)) {\n    return\n  }\n\n  // drawing a line if the results are thin: drawing a line results in much\n  // less pixellation than filling in a thin polygon\n  if (l1 <= 1 && l2 <= 1) {\n    // hideTiny can be used to avoid drawing mouseover for thin lines in this\n    // case\n    if (!hideTiny) {\n      ctx.beginPath()\n      ctx.moveTo(x11, y1)\n      if (drawCurves) {\n        ctx.bezierCurveTo(x11, mid, x21, mid, x21, y2)\n      } else {\n        ctx.lineTo(x21, y2)\n      }\n      ctx.stroke()\n    }\n  } else {\n    draw(ctx, x11, x12, y1, x22, x21, y2, mid, drawCurves)\n    cb(ctx)\n  }\n}\n\nexport function draw(\n  ctx: CanvasRenderingContext2D,\n  x1: number,\n  x2: number,\n  y1: number,\n  x3: number,\n  x4: number,\n  y2: number,\n  mid: number,\n  drawCurves?: boolean,\n) {\n  if (drawCurves) {\n    drawBezierBox(ctx, x1, x2, y1, x3, x4, y2, mid)\n  } else {\n    drawBox(ctx, x1, x2, y1, x3, x4, y2)\n  }\n}\n\nexport function drawBox(\n  ctx: CanvasRenderingContext2D,\n  x1: number,\n  x2: number,\n  y1: number,\n  x3: number,\n  x4: number,\n  y2: number,\n) {\n  ctx.beginPath()\n  ctx.moveTo(x1, y1)\n  ctx.lineTo(x2, y1)\n  ctx.lineTo(x3, y2)\n  ctx.lineTo(x4, y2)\n  ctx.closePath()\n  ctx.fill()\n}\n\nexport function drawBezierBox(\n  ctx: CanvasRenderingContext2D,\n  x1: number,\n  x2: number,\n  y1: number,\n  x3: number,\n  x4: number,\n  y2: number,\n  mid: number,\n) {\n  const len1 = Math.abs(x1 - x2)\n  const len2 = Math.abs(x1 - x2)\n\n  // heuristic to not draw hourglass inversions with bezier curves when they\n  // are thin and far apart because it results in areas that are not drawn well\n  // demo https://codesandbox.io/s/fast-glitter-q3b1or?file=/src/index.js\n  if (len1 < 5 && len2 < 5 && x2 < x1 && Math.abs(x1 - x3) > 100) {\n    const tmp = x1\n    x1 = x2\n    x2 = tmp\n  }\n  ctx.beginPath()\n  ctx.moveTo(x1, y1)\n  ctx.lineTo(x2, y1)\n  ctx.bezierCurveTo(x2, mid, x3, mid, x3, y2)\n  ctx.lineTo(x4, y2)\n  ctx.bezierCurveTo(x4, mid, x1, mid, x1, y1)\n  ctx.closePath()\n  ctx.fill()\n}\n\nexport function onSynClick(\n  event: React.MouseEvent,\n  model: LinearSyntenyDisplayModel,\n) {\n  const view = getContainingView(model)\n  const track = getContainingTrack(model)\n  const ref1 = model.clickMapCanvas\n  const ref2 = model.cigarClickMapCanvas\n  if (!ref1 || !ref2) {\n    return\n  }\n  const rect = ref1.getBoundingClientRect()\n  const ctx1 = ref1.getContext('2d')\n  const ctx2 = ref2.getContext('2d')\n  if (!ctx1 || !ctx2) {\n    return\n  }\n  const x = event.clientX - rect.left\n  const y = event.clientY - rect.top\n  const [r1, g1, b1] = ctx1.getImageData(x, y, 1, 1).data\n  const unitMultiplier = Math.floor(MAX_COLOR_RANGE / model.numFeats)\n  const id = getId(r1!, g1!, b1!, unitMultiplier)\n  const feat = model.featPositions[id]\n  if (feat) {\n    const { f } = feat\n    model.setClickId(f.id())\n    const session = getSession(model)\n    if (isSessionModelWithWidgets(session)) {\n      session.showWidget(\n        session.addWidget('BaseFeatureWidget', 'baseFeature', {\n          view,\n          track,\n          featureData: f.toJSON(),\n        }),\n      )\n    }\n  }\n  return feat\n}\n\nexport function onSynContextClick(\n  event: React.MouseEvent,\n  model: LinearSyntenyDisplayModel,\n  setAnchorEl: (arg: ClickCoord) => void,\n) {\n  event.preventDefault()\n  const ref1 = model.clickMapCanvas\n  const ref2 = model.cigarClickMapCanvas\n  if (!ref1 || !ref2) {\n    return\n  }\n  const rect = ref1.getBoundingClientRect()\n  const ctx1 = ref1.getContext('2d')\n  const ctx2 = ref2.getContext('2d')\n  if (!ctx1 || !ctx2) {\n    return\n  }\n  const { clientX, clientY } = event\n  const x = clientX - rect.left\n  const y = clientY - rect.top\n  const [r1, g1, b1] = ctx1.getImageData(x, y, 1, 1).data\n  const unitMultiplier = Math.floor(MAX_COLOR_RANGE / model.numFeats)\n  const id = getId(r1!, g1!, b1!, unitMultiplier)\n  const f = model.featPositions[id]\n  if (f) {\n    model.setClickId(f.f.id())\n    setAnchorEl({ clientX, clientY, feature: f })\n  }\n}\n\nexport function getTooltip(f: Feature, cigarOp?: string, cigarOpLen?: string) {\n  // @ts-expect-error\n  const f1 = f.toJSON() as {\n    refName: string\n    start: number\n    end: number\n    strand?: number\n    assemblyName: string\n    identity?: number\n    name?: string\n    mate: {\n      start: number\n      end: number\n      refName: string\n      name: string\n    }\n  }\n  const f2 = f1.mate\n  const l1 = f1.end - f1.start\n  const l2 = f2.end - f2.start\n  const identity = f1.identity\n  const n1 = f1.name\n  const n2 = f2.name\n  return [\n    `Loc1: ${assembleLocString(f1)}`,\n    `Loc2: ${assembleLocString(f2)}`,\n    `Inverted: ${f1.strand === -1}`,\n    `Query len: ${l1.toLocaleString('en-US')}`,\n    `Target len: ${l2.toLocaleString('en-US')}`,\n    identity ? `Identity: ${identity.toPrecision(2)}` : '',\n    cigarOp ? `CIGAR operator: ${cigarOp}${cigarOpLen}` : '',\n    n1 ? `Name 1: ${n1}` : '',\n    n2 ? `Name 1: ${n2}` : '',\n  ]\n    .filter(f => !!f)\n    .join('<br/>')\n}\n","import { doesIntersect2, getContainingView } from '@jbrowse/core/util'\n// locals\nimport { LinearSyntenyViewModel } from '../LinearSyntenyView/model'\nimport { LinearSyntenyDisplayModel } from './model'\nimport { draw, drawMatchSimple } from './components/util'\n\nexport const MAX_COLOR_RANGE = 255 * 255 * 255 // max color range\n\nfunction makeColor(idx: number) {\n  const r = Math.floor(idx / (255 * 255)) % 255\n  const g = Math.floor(idx / 255) % 255\n  const b = idx % 255\n  return `rgb(${r},${g},${b})`\n}\n\nconst colorMap = {\n  I: '#ff03',\n  N: '#0a03',\n  D: '#00f3',\n  X: 'brown',\n  M: '#f003',\n  '=': '#f003',\n}\n\nconst lineLimit = 3\n\nconst oobLimit = 1600\n\nexport function getId(r: number, g: number, b: number, unitMultiplier: number) {\n  return Math.floor((r * 255 * 255 + g * 255 + b - 1) / unitMultiplier)\n}\n\nexport function drawRef(\n  model: LinearSyntenyDisplayModel,\n  ctx1: CanvasRenderingContext2D,\n  ctx3?: CanvasRenderingContext2D,\n) {\n  const view = getContainingView(model) as LinearSyntenyViewModel\n  const drawCurves = view.drawCurves\n  const drawCIGAR = view.drawCIGAR\n  const height = view.middleComparativeHeight\n  const width = view.width\n  const bpPerPxs = view.views.map(v => v.bpPerPx)\n\n  if (ctx3) {\n    ctx3.imageSmoothingEnabled = false\n  }\n\n  ctx1.beginPath()\n  const featPos = model.featPositions\n  const offsets = view.views.map(v => v.offsetPx)\n\n  const unitMultiplier = Math.floor(MAX_COLOR_RANGE / featPos.length)\n\n  // this loop is optimized to draw many thin lines with a single ctx.stroke\n  // call, a separate loop below draws larger boxes\n  ctx1.fillStyle = colorMap.M\n  ctx1.strokeStyle = colorMap.M\n  for (const { p11, p12, p21, p22 } of featPos) {\n    const x11 = p11.offsetPx - offsets[0]!\n    const x12 = p12.offsetPx - offsets[0]!\n    const x21 = p21.offsetPx - offsets[1]!\n    const x22 = p22.offsetPx - offsets[1]!\n    const l1 = Math.abs(x12 - x11)\n    const l2 = Math.abs(x22 - x21)\n    const y1 = 0\n    const y2 = height\n    const mid = (y2 - y1) / 2\n\n    // drawing a line if the results are thin results in much less pixellation\n    // than filling in a thin polygon\n    if (\n      l1 <= lineLimit &&\n      l2 <= lineLimit &&\n      x21 < width + oobLimit &&\n      x21 > -oobLimit\n    ) {\n      ctx1.moveTo(x11, y1)\n      if (drawCurves) {\n        ctx1.bezierCurveTo(x11, mid, x21, mid, x21, y2)\n      } else {\n        ctx1.lineTo(x21, y2)\n      }\n    }\n  }\n  ctx1.stroke()\n\n  // this loop only draws small lines as a polyline, the polyline calls\n  // ctx.stroke once is much more efficient than calling stroke() many times\n  ctx1.fillStyle = colorMap.M\n  ctx1.strokeStyle = colorMap.M\n  for (const { p11, p12, p21, p22, f, cigar } of featPos) {\n    const x11 = p11.offsetPx - offsets[0]!\n    const x12 = p12.offsetPx - offsets[0]!\n    const x21 = p21.offsetPx - offsets[1]!\n    const x22 = p22.offsetPx - offsets[1]!\n    const l1 = Math.abs(x12 - x11)\n    const l2 = Math.abs(x22 - x21)\n    const minX = Math.min(x21, x22)\n    const maxX = Math.max(x21, x22)\n    const y1 = 0\n    const y2 = height\n    const mid = (y2 - y1) / 2\n\n    if (\n      !(l1 <= lineLimit && l2 <= lineLimit) &&\n      doesIntersect2(minX, maxX, -oobLimit, view.width + oobLimit)\n    ) {\n      const s1 = f.get('strand')\n      const k1 = s1 === -1 ? x12 : x11\n      const k2 = s1 === -1 ? x11 : x12\n\n      // rev1/rev2 flip the direction of the CIGAR drawing in horizontally flipped\n      // modes. somewhat heuristically determined, but tested for\n      const rev1 = k1 < k2 ? 1 : -1\n      const rev2 = (x21 < x22 ? 1 : -1) * s1\n\n      // cx1/cx2 are the current x positions on top and bottom rows\n      let cx1 = k1\n      let cx2 = s1 === -1 ? x22 : x21\n      if (cigar.length && drawCIGAR) {\n        // continuingFlag skips drawing commands on very small CIGAR features\n        let continuingFlag = false\n\n        // px1/px2 are the previous x positions on the top and bottom rows\n        let px1 = 0\n        let px2 = 0\n        const unitMultiplier2 = Math.floor(MAX_COLOR_RANGE / cigar.length)\n        for (let j = 0; j < cigar.length; j += 2) {\n          const idx = j * unitMultiplier2 + 1\n\n          const len = +cigar[j]!\n          const op = cigar[j + 1] as keyof typeof colorMap\n\n          if (!continuingFlag) {\n            px1 = cx1\n            px2 = cx2\n          }\n\n          const d1 = len / bpPerPxs[0]!\n          const d2 = len / bpPerPxs[1]!\n\n          if (op === 'M' || op === '=' || op === 'X') {\n            cx1 += d1 * rev1\n            cx2 += d2 * rev2\n          } else if (op === 'D' || op === 'N') {\n            cx1 += d1 * rev1\n          }\n          // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n          else if (op === 'I') {\n            cx2 += d2 * rev2\n          }\n\n          // check that we are even drawing in view here, e.g. that all\n          // points are not all less than 0 or greater than width\n          if (\n            !(\n              Math.max(px1, px2, cx1, cx2) < 0 ||\n              Math.min(px1, px2, cx1, cx2) > width\n            )\n          ) {\n            // if it is a small feature and not the last element of the\n            // CIGAR (which could skip rendering it entire if we did turn\n            // it on), then turn on continuing flag\n            const isNotLast = j < cigar.length - 2\n            if (\n              Math.abs(cx1 - px1) <= 1 &&\n              Math.abs(cx2 - px2) <= 1 &&\n              isNotLast\n            ) {\n              continuingFlag = true\n            } else {\n              // allow rendering the dominant color when using continuing flag\n              // if the last element of continuing was a large feature, else\n              // just use match\n              ctx1.fillStyle =\n                colorMap[(continuingFlag && d1 > 1) || d2 > 1 ? op : 'M']\n              continuingFlag = false\n\n              draw(ctx1, px1, cx1, y1, cx2, px2, y2, mid, drawCurves)\n              if (ctx3) {\n                ctx3.fillStyle = makeColor(idx)\n                draw(ctx3, px1, cx1, y1, cx2, px2, y2, mid, drawCurves)\n              }\n            }\n          }\n        }\n      } else {\n        draw(ctx1, x11, x12, y1, x22, x21, y2, mid, drawCurves)\n      }\n    }\n  }\n\n  // draw click map\n  const ctx2 = model.clickMapCanvas?.getContext('2d')\n  if (!ctx2) {\n    return\n  }\n  ctx2.imageSmoothingEnabled = false\n  ctx2.clearRect(0, 0, width, height)\n  for (let i = 0; i < featPos.length; i++) {\n    const feature = featPos[i]!\n    const idx = i * unitMultiplier + 1\n    ctx2.fillStyle = makeColor(idx)\n\n    // too many click map false positives with colored stroked lines\n    drawMatchSimple({\n      cb: ctx => {\n        ctx.fill()\n      },\n      feature,\n      ctx: ctx2,\n      drawCurves,\n      offsets,\n      oobLimit,\n      viewWidth: view.width,\n      hideTiny: true,\n      height,\n    })\n  }\n  return undefined\n}\n\nexport function drawMouseoverSynteny(model: LinearSyntenyDisplayModel) {\n  const { clickId, mouseoverId } = model\n  const highResolutionScaling = 1\n  const view = getContainingView(model) as LinearSyntenyViewModel\n  const drawCurves = view.drawCurves\n  const height = view.middleComparativeHeight\n  const width = view.width\n  const ctx = model.mouseoverCanvas?.getContext('2d')\n  const offsets = view.views.map(v => v.offsetPx)\n\n  if (!ctx) {\n    return\n  }\n  ctx.resetTransform()\n  ctx.scale(highResolutionScaling, highResolutionScaling)\n  ctx.clearRect(0, 0, width, height)\n  const feature1 = model.featMap[mouseoverId || '']\n  if (feature1) {\n    ctx.fillStyle = 'rgb(0,0,0,0.1)'\n    drawMatchSimple({\n      cb: ctx => {\n        ctx.fill()\n      },\n      feature: feature1,\n      ctx,\n      oobLimit,\n      viewWidth: view.width,\n      drawCurves,\n      offsets,\n      height,\n    })\n  }\n  const feature2 = model.featMap[clickId || '']\n  if (feature2) {\n    ctx.strokeStyle = 'rgb(0, 0, 0, 0.9)'\n\n    drawMatchSimple({\n      cb: ctx => {\n        ctx.stroke()\n      },\n      feature: feature2,\n      ctx,\n      oobLimit,\n      viewWidth: view.width,\n      drawCurves,\n      offsets,\n      height,\n    })\n  }\n}\n"],"names":["SyntenyContextMenu","model","onClose","anchorEl","view","getContainingView","clientX","clientY","feature","React","Menu","onMenuItemClick","event","callback","nodeType","getBoundingClientRect","top","left","bottom","right","width","height","x","y","toJSON","open","Boolean","menuItems","label","onClick","f","start","get","end","refName","mate","views","navToLocString","catch","e","console","error","getSession","notifyError","SyntenyTooltip","lazy","useStyles","makeStyles","pix","imageRendering","pointerEvents","visibility","position","rel","abs","none","pointEvents","observer","classes","cx","xOffset","useRef","currScrollFrame","middleComparativeHeight","delta","timeout","setAnchorEl","useState","tooltip","setTooltip","currX","setCurrX","mouseCurrDownX","setMouseCurrDownX","mouseInitialDownX","setMouseInitialDownX","currY","setCurrY","mouseoverId","k1","useCallback","ref","setMouseoverCanvasRef","k2","onWheel","preventDefault","ctrlKey","current","deltaY","v","setScaleFactor","clearTimeout","setTimeout","zoomTo","bpPerPx","Math","deltaX","undefined","requestAnimationFrame","transaction","horizontalScroll","setMainCanvasRef","addEventListener","removeEventListener","k3","setClickMapCanvasRef","k4","setCigarClickMapCanvasRef","className","onMouseMove","ref1","clickMapCanvas","ref2","cigarClickMapCanvas","rect","ctx1","getContext","ctx2","r1","g1","b1","getImageData","data","r2","g2","b2","unitMultiplier","floor","MAX_COLOR_RANGE","numFeats","id","getId","setMouseoverId","featPositions","cigar","unitMultiplier2","length","cigarIdx","getTooltip","onMouseLeave","onMouseDown","evt","onMouseUp","onSynClick","onContextMenu","onSynContextClick","title","theme","bg","palette","action","disabledBackground","loading","paddingLeft","backgroundColor","background","default","backgroundImage","textAlign","blockMessage","padding","blockError","color","LoadingMessage","shown","setShown","useEffect","LoadingEllipses","BlockMessage","messageText","BlockError","message","features","LinearSyntenyRendering","drawMatchSimple","ctx","offsets","cb","drawCurves","oobLimit","viewWidth","hideTiny","p11","p12","p21","p22","x11","offsetPx","x12","x21","x22","l1","l2","y2","mid","minX","min","maxX","max","doesIntersect2","beginPath","moveTo","bezierCurveTo","lineTo","stroke","draw","x1","x2","y1","x3","x4","len1","len2","tmp","closePath","fill","drawBezierBox","drawBox","track","getContainingTrack","feat","setClickId","session","isSessionModelWithWidgets","showWidget","addWidget","featureData","cigarOp","cigarOpLen","f1","f2","identity","n1","name","n2","assembleLocString","strand","toLocaleString","toPrecision","filter","join","makeColor","idx","colorMap","I","N","D","X","M","lineLimit","r","g","b","drawRef","ctx3","drawCIGAR","bpPerPxs","map","imageSmoothingEnabled","featPos","fillStyle","strokeStyle","s1","rev1","rev2","cx1","cx2","continuingFlag","px1","px2","j","len","op","d1","d2","isNotLast","clearRect","i","drawMouseoverSynteny","clickId","mouseoverCanvas","resetTransform","scale","feature1","featMap","feature2"],"sourceRoot":""}