jbrowse-plugin-graphgenomeviewer 8.7.2 → 8.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/chunks/{GraphGenomeView-HCN57HV4.js → GraphGenomeView-YRHBZFKL.js} +2 -2
  2. package/dist/chunks/{GraphTrackSettingsDialog-ZNZWUEN3.js → GraphTrackSettingsDialog-HBLIHBB5.js} +2 -2
  3. package/dist/chunks/{LinearGraphDisplay-W5IT3HYI.js → LinearGraphDisplay-KD7PNZMQ.js} +2 -2
  4. package/dist/chunks/{chunk-DQC5K7EW.js → chunk-5WIUEMTH.js} +2 -2
  5. package/dist/chunks/chunk-LPUQPLW7.js +2 -0
  6. package/dist/chunks/chunk-LPUQPLW7.js.map +7 -0
  7. package/dist/chunks/chunk-PXYYKSGK.js +2 -0
  8. package/dist/chunks/chunk-PXYYKSGK.js.map +7 -0
  9. package/dist/chunks/chunk-TFV57AXQ.js +3 -0
  10. package/dist/chunks/chunk-TFV57AXQ.js.map +7 -0
  11. package/dist/chunks/{chunk-OS52UJIX.js → chunk-TUYN7C3O.js} +2 -2
  12. package/dist/chunks/{chunk-7BKSSU2R.js → chunk-WWF7N6AP.js} +3 -3
  13. package/dist/chunks/{chunk-7BKSSU2R.js.map → chunk-WWF7N6AP.js.map} +2 -2
  14. package/dist/chunks/{chunk-HC2YPYTO.js → chunk-Y5Q3XQOP.js} +2 -2
  15. package/dist/chunks/{chunk-HC2YPYTO.js.map → chunk-Y5Q3XQOP.js.map} +2 -2
  16. package/dist/chunks/{renderSvg-PEQY7XLR.js → renderSvg-UFS2CN6Z.js} +2 -2
  17. package/dist/jbrowse-plugin-graphgenomeviewer.esm.js +5 -5
  18. package/dist/jbrowse-plugin-graphgenomeviewer.esm.js.map +3 -3
  19. package/package.json +1 -1
  20. package/src/GraphGenomeView/components/GraphSettingsDialog.test.tsx +1 -1
  21. package/src/GraphGenomeView/components/GraphSettingsDialog.tsx +2 -2
  22. package/src/GraphGenomeView/pane/graphViews.ts +5 -0
  23. package/src/GraphGenomeView/pane/launchActions.ts +4 -2
  24. package/src/GraphGenomeView/pane/loadActions.ts +1 -1
  25. package/src/GraphGenomeView/pane/paneBase.ts +0 -4
  26. package/src/GraphGenomeView/pane/settingActions.ts +1 -1
  27. package/src/GraphGenomeView/viewModel.ts +6 -1
  28. package/src/LinearGraphDisplay/LinearGraphDisplay.test.ts +55 -3
  29. package/src/LinearGraphDisplay/configSchema.ts +15 -2
  30. package/src/LinearGraphDisplay/model.ts +1 -5
  31. package/src/version.ts +1 -1
  32. package/dist/chunks/chunk-64OSFJLE.js +0 -2
  33. package/dist/chunks/chunk-64OSFJLE.js.map +0 -7
  34. package/dist/chunks/chunk-S7DQGZX2.js +0 -2
  35. package/dist/chunks/chunk-S7DQGZX2.js.map +0 -7
  36. package/dist/chunks/chunk-W4Y2JUP7.js +0 -3
  37. package/dist/chunks/chunk-W4Y2JUP7.js.map +0 -7
  38. /package/dist/chunks/{GraphGenomeView-HCN57HV4.js.map → GraphGenomeView-YRHBZFKL.js.map} +0 -0
  39. /package/dist/chunks/{GraphTrackSettingsDialog-ZNZWUEN3.js.map → GraphTrackSettingsDialog-HBLIHBB5.js.map} +0 -0
  40. /package/dist/chunks/{LinearGraphDisplay-W5IT3HYI.js.map → LinearGraphDisplay-KD7PNZMQ.js.map} +0 -0
  41. /package/dist/chunks/{chunk-DQC5K7EW.js.map → chunk-5WIUEMTH.js.map} +0 -0
  42. /package/dist/chunks/{chunk-OS52UJIX.js.map → chunk-TUYN7C3O.js.map} +0 -0
  43. /package/dist/chunks/{renderSvg-PEQY7XLR.js.map → renderSvg-UFS2CN6Z.js.map} +0 -0
@@ -1,2 +1,2 @@
1
- import{i as M,l as W,p as F}from"./chunk-64OSFJLE.js";import{b as O,h as B}from"./chunk-S7DQGZX2.js";import{K as f,Q as A,X as _}from"./chunk-46O3IEW3.js";import{f as R}from"./chunk-J2PN6CG3.js";import{D as x,E,H as S,d as C,o as T,q as I,r as w,s as L,t as N,w as D,y as G,z as P}from"./chunk-WE7DQVXF.js";import{b as t,c as r,d as s}from"./chunk-DUU6T2I5.js";var k=[{value:0,label:"Fastest"},{value:1,label:"Fast"},{value:2,label:"Default"},{value:3,label:"Fine"},{value:4,label:"Best"}];var U=s(function({label:n,value:e,options:o,testId:p,size:h,sx:a,disabled:m,title:u,shown:b,onChange:H}){let y=R();return r(L,{size:h,sx:a,disabled:m,title:u,children:[t(D,{id:y,shrink:!0,children:n}),t(x,{labelId:y,value:e,label:n,notched:!0,displayEmpty:!0,"data-testid":p,renderValue:i=>b??o.find(Y=>Y.value===i)?.label??i,onChange:i=>{H(i.target.value)},children:o.map(i=>t(P,{value:i.value,disabled:i.disabled,title:i.disabled?void 0:i.description,children:t(G,{primary:i.label,secondary:i.disabled?i.description:void 0})},i.value))})]})});var g=F()({section:{marginBottom:24},group:{marginBottom:16},heading:{marginBottom:8}}),l=s(function({warn:n=!1,children:e}){return t(S,{variant:"caption",component:"div",color:n?"warning.main":"text.secondary",children:e})}),v=s(function({title:n,children:e}){let{classes:o}=g();return r("section",{className:o.group,children:[t(S,{variant:"subtitle1",className:o.heading,children:n}),e]})}),Q=s(function({label:n,checked:e,onChange:o,children:p}){let{classes:h}=g();return r("div",{className:h.section,children:[t(N,{control:t(E,{checked:e,onChange:a=>{o(a.target.checked)}}),label:n}),p]})}),d=s(function({children:n,...e}){let{classes:o}=g();return r("div",{className:o.section,children:[t(U,{sx:{minWidth:200},...e}),n]})}),$=[5e3,2e4,5e4,1e5];function q(c){return[...new Set([...$,c])].sort((n,e)=>n-e).map(n=>({value:String(n),label:n.toLocaleString()}))}var z=s(function({label:n,choices:e,stored:o,auto:p,testId:h,onChange:a,children:m}){return e.length>0?t(d,{label:n,value:e.some(u=>u.trackId===o)?o:"",options:[{value:"",label:`Automatic (${p?.name??"none"})`},...e.map(({trackId:u,name:b})=>({value:u,label:b}))],testId:h,onChange:a,children:m}):null}),K=s(function(n){let{model:e,onClose:o,children:p}=n,{classes:h}=g();return r(C,{open:!0,onClose:o,title:"Graph settings",children:[r(w,{children:[r(v,{title:"Subgraph",children:[p,t(d,{label:"Node limit",value:String(e.maxGraphNodes),options:q(e.maxGraphNodes),testId:"graph-node-limit-select",onChange:a=>{e.setMaxGraphNodes(Number(a))},children:t(l,{children:"The most nodes a layout draws; past it the graph is declined. Walk rows take no limit."})})]}),r(v,{title:"Drawing",children:[e.anchorPaths.length>1?t(d,{label:"Reference path",value:e.activeReferencePath??"",options:e.anchorPaths.map(({name:a})=>({value:a,label:a})),testId:"graph-reference-path-select",onChange:a=>{e.setReferencePath(a),e.recomputeLayout()},children:t(l,{children:"The path the anchored layouts place x along"})}):null,t(d,{label:"Node width",value:e.nodeWidth,options:A,testId:"graph-node-width-select",onChange:a=>{e.setNodeWidth(a)},children:t(l,{children:"Depth as width. In a cut with walks, depth is how many haplotypes carry the node."})}),t(d,{label:"Link width",value:e.linkWidth,options:_,testId:"graph-link-width-select",onChange:a=>{e.setLinkWidth(a)},children:t(l,{children:"Walks as width, so a common route reads heavy and a private one thin."})}),r(Q,{label:"Draw paths",checked:e.drawPaths,onChange:a=>{e.setLayer("paths",a)},children:[t(l,{children:"Color each node by the paths through it, one lane per path"}),e.drawPaths&&!e.effectiveDrawPaths?t(l,{warn:!0,children:e.pathCount>f?`Off: ${e.pathCount.toLocaleString()} paths is past the ${f} this can tell apart`:"Off: this graph states no paths"}):null]}),t(z,{label:"Gene track",choices:e.geneTrackChoices,stored:e.geneTrackId,auto:W(e.geneTrackChoices,""),testId:"graph-gene-track-select",onChange:a=>{e.setGeneTrackId(a)},children:t(l,{children:"Where genes on the backbone come from"})}),t(z,{label:"Repeat track",choices:e.repeatTrackChoices,stored:e.repeatTrackId,auto:M(e.repeatTrackChoices,""),testId:"graph-repeat-track-select",onChange:a=>{e.setRepeatTrackId(a)},children:t(l,{children:"The tandem repeat annotation walk rows measure and tile by"})})]}),r(v,{title:"Force-directed layout",children:[e.hasGraph&&!e.usesLayoutEngine?t("div",{className:h.section,children:t(l,{warn:!0,children:"No effect on the current layout until Layout is Force-directed"})}):null,t(d,{label:"Engine",value:e.layoutEngine,options:O,testId:"graph-layout-engine-select",onChange:a=>{e.setLayoutEngine(a)},children:t(l,{children:"Stress keeps the reference straight, so a zoom keeps the picture; FMMM lets the whole graph settle."})}),t(d,{label:"Layout quality",value:String(e.layoutQuality),options:k.map(a=>({value:String(a.value),label:a.label})),testId:"graph-layout-quality-select",onChange:a=>{e.setLayoutQuality(Number(a))},children:t(l,{children:"The engine's iteration budget; higher is slower"})}),t(d,{label:"Bubble spread",value:e.bubbleSpread,options:B,testId:"graph-bubble-spread-select",onChange:a=>{e.setBubbleSpread(a)},children:t(l,{children:"How far the layout opens a bubble"})}),e.layoutEngine==="stress"?null:t(Q,{label:"Linear layout",checked:e.linearLayout,onChange:a=>{e.setLinearLayout(a)},children:t(l,{children:"Keeps a chain of nodes on one line where it can"})})]})]}),t(I,{children:t(T,{variant:"contained",color:"primary",onClick:o,children:"Close"})})]})}),be=K;export{U as a,be as b};
2
- //# sourceMappingURL=chunk-HC2YPYTO.js.map
1
+ import{a as O,l as M,o as W,s as F}from"./chunk-LPUQPLW7.js";import{f as B}from"./chunk-PXYYKSGK.js";import{K as f,Q as A,X as _}from"./chunk-46O3IEW3.js";import{f as R}from"./chunk-J2PN6CG3.js";import{D as x,E,H as S,d as C,o as T,q as I,r as L,s as w,t as N,w as D,y as G,z as P}from"./chunk-WE7DQVXF.js";import{b as t,c as r,d as s}from"./chunk-DUU6T2I5.js";var k=[{value:0,label:"Fastest"},{value:1,label:"Fast"},{value:2,label:"Default"},{value:3,label:"Fine"},{value:4,label:"Best"}];var U=s(function({label:n,value:e,options:o,testId:p,size:h,sx:a,disabled:m,title:u,shown:b,onChange:H}){let y=R();return r(w,{size:h,sx:a,disabled:m,title:u,children:[t(D,{id:y,shrink:!0,children:n}),t(x,{labelId:y,value:e,label:n,notched:!0,displayEmpty:!0,"data-testid":p,renderValue:i=>b??o.find(Y=>Y.value===i)?.label??i,onChange:i=>{H(i.target.value)},children:o.map(i=>t(P,{value:i.value,disabled:i.disabled,title:i.disabled?void 0:i.description,children:t(G,{primary:i.label,secondary:i.disabled?i.description:void 0})},i.value))})]})});var g=F()({section:{marginBottom:24},group:{marginBottom:16},heading:{marginBottom:8}}),l=s(function({warn:n=!1,children:e}){return t(S,{variant:"caption",component:"div",color:n?"warning.main":"text.secondary",children:e})}),v=s(function({title:n,children:e}){let{classes:o}=g();return r("section",{className:o.group,children:[t(S,{variant:"subtitle1",className:o.heading,children:n}),e]})}),Q=s(function({label:n,checked:e,onChange:o,children:p}){let{classes:h}=g();return r("div",{className:h.section,children:[t(N,{control:t(E,{checked:e,onChange:a=>{o(a.target.checked)}}),label:n}),p]})}),d=s(function({children:n,...e}){let{classes:o}=g();return r("div",{className:o.section,children:[t(U,{sx:{minWidth:200},...e}),n]})}),$=[5e3,2e4,5e4,1e5];function q(c){return[...new Set([...$,c])].sort((n,e)=>n-e).map(n=>({value:String(n),label:n.toLocaleString()}))}var z=s(function({label:n,choices:e,stored:o,auto:p,testId:h,onChange:a,children:m}){return e.length>0?t(d,{label:n,value:e.some(u=>u.trackId===o)?o:"",options:[{value:"",label:`Automatic (${p?.name??"none"})`},...e.map(({trackId:u,name:b})=>({value:u,label:b}))],testId:h,onChange:a,children:m}):null}),K=s(function(n){let{model:e,onClose:o,children:p}=n,{classes:h}=g();return r(C,{open:!0,onClose:o,title:"Graph settings",children:[r(L,{children:[r(v,{title:"Subgraph",children:[p,t(d,{label:"Node limit",value:String(e.maxGraphNodes),options:q(e.maxGraphNodes),testId:"graph-node-limit-select",onChange:a=>{e.setMaxGraphNodes(Number(a))},children:t(l,{children:"The most nodes a layout draws; past it the graph is declined. Walk rows take no limit."})})]}),r(v,{title:"Drawing",children:[e.anchorPaths.length>1?t(d,{label:"Reference path",value:e.activeReferencePath??"",options:e.anchorPaths.map(({name:a})=>({value:a,label:a})),testId:"graph-reference-path-select",onChange:a=>{e.setReferencePath(a),e.recomputeLayout()},children:t(l,{children:"The path the anchored layouts place x along"})}):null,t(d,{label:"Node width",value:e.nodeWidth,options:A,testId:"graph-node-width-select",onChange:a=>{e.setNodeWidth(a)},children:t(l,{children:"Depth as width. In a cut with walks, depth is how many haplotypes carry the node."})}),t(d,{label:"Link width",value:e.linkWidth,options:_,testId:"graph-link-width-select",onChange:a=>{e.setLinkWidth(a)},children:t(l,{children:"Walks as width, so a common route reads heavy and a private one thin."})}),r(Q,{label:"Draw paths",checked:e.drawPaths,onChange:a=>{e.setLayer("paths",a)},children:[t(l,{children:"Color each node by the paths through it, one lane per path"}),e.drawPaths&&!e.effectiveDrawPaths?t(l,{warn:!0,children:e.pathCount>f?`Off: ${e.pathCount.toLocaleString()} paths is past the ${f} this can tell apart`:"Off: this graph states no paths"}):null]}),t(z,{label:"Gene track",choices:e.geneTrackChoices,stored:e.geneTrackId,auto:W(e.geneTrackChoices,""),testId:"graph-gene-track-select",onChange:a=>{e.setGeneTrackId(a)},children:t(l,{children:"Where genes on the backbone come from"})}),t(z,{label:"Repeat track",choices:e.repeatTrackChoices,stored:e.repeatTrackId,auto:M(e.repeatTrackChoices,""),testId:"graph-repeat-track-select",onChange:a=>{e.setRepeatTrackId(a)},children:t(l,{children:"The tandem repeat annotation walk rows measure and tile by"})})]}),r(v,{title:"Force-directed layout",children:[e.hasGraph&&!e.usesLayoutEngine?t("div",{className:h.section,children:t(l,{warn:!0,children:"No effect on the current layout until Layout is Force-directed"})}):null,t(d,{label:"Engine",value:e.chosenLayoutEngine,options:O,testId:"graph-layout-engine-select",onChange:a=>{e.setLayoutEngine(a)},children:t(l,{children:"Stress keeps the reference straight, so a zoom keeps the picture; FMMM lets the whole graph settle."})}),t(d,{label:"Layout quality",value:String(e.layoutQuality),options:k.map(a=>({value:String(a.value),label:a.label})),testId:"graph-layout-quality-select",onChange:a=>{e.setLayoutQuality(Number(a))},children:t(l,{children:"The engine's iteration budget; higher is slower"})}),t(d,{label:"Bubble spread",value:e.bubbleSpread,options:B,testId:"graph-bubble-spread-select",onChange:a=>{e.setBubbleSpread(a)},children:t(l,{children:"How far the layout opens a bubble"})}),e.chosenLayoutEngine==="stress"?null:t(Q,{label:"Linear layout",checked:e.linearLayout,onChange:a=>{e.setLinearLayout(a)},children:t(l,{children:"Keeps a chain of nodes on one line where it can"})})]})]}),t(I,{children:t(T,{variant:"contained",color:"primary",onClick:o,children:"Close"})})]})}),be=K;export{U as a,be as b};
2
+ //# sourceMappingURL=chunk-Y5Q3XQOP.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../node_modules/.pnpm/@jbrowse+bandage-core@12.6.2/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-K5SIJGAE.js", "../../src/GraphGenomeView/components/LabelledSelect.tsx", "../../src/GraphGenomeView/components/GraphSettingsDialog.tsx"],
4
- "sourcesContent": ["// src/layoutQualities.ts\nvar LAYOUT_QUALITIES = [\n { value: 0, label: \"Fastest\" },\n { value: 1, label: \"Fast\" },\n { value: 2, label: \"Default\" },\n { value: 3, label: \"Fine\" },\n { value: 4, label: \"Best\" }\n];\n\nexport {\n LAYOUT_QUALITIES\n};\n", "import { useId } from 'react'\n\nimport {\n FormControl,\n InputLabel,\n ListItemText,\n MenuItem,\n Select,\n} from '@mui/material'\nimport { observer } from 'mobx-react'\n\nimport type { SxProps } from '@mui/material'\n\ninterface SelectOption<T extends string> {\n value: T\n label: string\n // an option's tooltip, and the reason under a disabled one, whose tooltip\n // cannot open\n description?: string\n disabled?: boolean\n}\n\n// One dropdown with its label tied to it, so a screen reader names the combobox\nexport default observer(function LabelledSelect<T extends string>({\n label,\n value,\n options,\n testId,\n size,\n sx,\n disabled,\n title,\n shown,\n onChange,\n}: {\n label: string\n value: T\n options: readonly SelectOption<T>[]\n testId?: string\n size?: 'small' | 'medium'\n sx?: SxProps\n disabled?: boolean\n title?: string\n // what the closed select reads, when not the picked option's label\n shown?: string\n onChange: (value: T) => void\n}) {\n const labelId = useId()\n return (\n <FormControl size={size} sx={sx} disabled={disabled} title={title}>\n <InputLabel id={labelId} shrink>\n {label}\n </InputLabel>\n <Select\n labelId={labelId}\n value={value}\n label={label}\n notched\n displayEmpty\n data-testid={testId}\n renderValue={picked =>\n shown ?? options.find(o => o.value === picked)?.label ?? picked\n }\n onChange={e => {\n onChange(e.target.value as T)\n }}\n >\n {options.map(o => (\n <MenuItem\n key={o.value}\n value={o.value}\n disabled={o.disabled}\n title={o.disabled ? undefined : o.description}\n >\n <ListItemText\n primary={o.label}\n secondary={o.disabled ? o.description : undefined}\n />\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n )\n})\n", "import type { ReactNode } from 'react'\n\nimport { BUBBLE_SPREADS } from '@jbrowse/bandage-core/bubbleSpreads'\nimport { EDGE_WIDTHS } from '@jbrowse/bandage-core/edgeWidths'\nimport { LAYOUT_ENGINES } from '@jbrowse/bandage-core/layoutEngines'\nimport { LAYOUT_QUALITIES } from '@jbrowse/bandage-core/layoutQualities'\nimport { NODE_WIDTHS } from '@jbrowse/bandage-core/nodeWidths'\nimport { MAX_PATH_COLORS } from '@jbrowse/bandage-core/pathColors'\nimport { Dialog } from '@jbrowse/core/ui'\nimport {\n Button,\n DialogActions,\n DialogContent,\n FormControlLabel,\n Switch,\n Typography,\n} from '@mui/material'\nimport { observer } from 'mobx-react'\nimport { makeStyles } from 'tss-react/mui'\n\nimport LabelledSelect from './LabelledSelect'\nimport { pickGeneTrack } from '../genes/geneFeatures'\nimport { pickRepeatTrack } from '../repeats/repeatFeatures'\n\nimport type { GraphPaneModel } from '../model'\n\nconst useStyles = makeStyles()({\n section: {\n marginBottom: 24,\n },\n group: {\n marginBottom: 16,\n },\n heading: {\n marginBottom: 8,\n },\n})\n\nconst Caption = observer(function Caption({\n warn = false,\n children,\n}: {\n warn?: boolean\n children: ReactNode\n}) {\n return (\n <Typography\n variant=\"caption\"\n component=\"div\"\n color={warn ? 'warning.main' : 'text.secondary'}\n >\n {children}\n </Typography>\n )\n})\n\nconst Group = observer(function Group({\n title,\n children,\n}: {\n title: string\n children: ReactNode\n}) {\n const { classes } = useStyles()\n return (\n <section className={classes.group}>\n <Typography variant=\"subtitle1\" className={classes.heading}>\n {title}\n </Typography>\n {children}\n </section>\n )\n})\n\nconst SettingSwitch = observer(function SettingSwitch({\n label,\n checked,\n onChange,\n children,\n}: {\n label: string\n checked: boolean\n onChange: (checked: boolean) => void\n children?: ReactNode\n}) {\n const { classes } = useStyles()\n return (\n <div className={classes.section}>\n <FormControlLabel\n control={\n <Switch\n checked={checked}\n onChange={e => {\n onChange(e.target.checked)\n }}\n />\n }\n label={label}\n />\n {children}\n </div>\n )\n})\n\n// one dropdown setting, at the dialog's width, and its caption\nconst SettingSelect = observer(function SettingSelect<T extends string>({\n children,\n ...props\n}: Omit<Parameters<typeof LabelledSelect<T>>[0], 'size' | 'sx'> & {\n children?: ReactNode\n}) {\n const { classes } = useStyles()\n return (\n <div className={classes.section}>\n <LabelledSelect sx={{ minWidth: 200 }} {...props} />\n {children}\n </div>\n )\n})\n\nconst NODE_LIMITS = [5000, 20_000, 50_000, 100_000]\n\n// the presets, with a limit a session states among them\nfunction nodeLimitOptions(current: number) {\n return [...new Set([...NODE_LIMITS, current])]\n .sort((a, b) => a - b)\n .map(limit => ({ value: String(limit), label: limit.toLocaleString() }))\n}\n\ninterface NamedTrack {\n trackId: string\n name: string\n}\n\n// '' leaves the pick to the heuristic, so a session can go back to it\nconst TrackPickSetting = observer(function TrackPickSetting({\n label,\n choices,\n stored,\n auto,\n testId,\n onChange,\n children,\n}: {\n label: string\n choices: NamedTrack[]\n stored: string\n auto: NamedTrack | undefined\n testId: string\n onChange: (trackId: string) => void\n children: ReactNode\n}) {\n return choices.length > 0 ? (\n <SettingSelect\n label={label}\n value={choices.some(t => t.trackId === stored) ? stored : ''}\n options={[\n { value: '', label: `Automatic (${auto?.name ?? 'none'})` },\n ...choices.map(({ trackId, name }) => ({\n value: trackId,\n label: name,\n })),\n ]}\n testId={testId}\n onChange={onChange}\n >\n {children}\n </SettingSelect>\n ) : null\n})\n\n// Toggles the menus already offer (halos, genes, color) stay out of here.\n// `children` is the host's own part of the subgraph group.\nconst GraphSettingsDialog = observer(function GraphSettingsDialog(props: {\n model: GraphPaneModel\n onClose: () => void\n children?: ReactNode\n}) {\n const { model, onClose, children } = props\n const { classes } = useStyles()\n\n return (\n <Dialog open onClose={onClose} title=\"Graph settings\">\n <DialogContent>\n <Group title=\"Subgraph\">\n {children}\n <SettingSelect\n label=\"Node limit\"\n value={String(model.maxGraphNodes)}\n options={nodeLimitOptions(model.maxGraphNodes)}\n testId=\"graph-node-limit-select\"\n onChange={limit => {\n model.setMaxGraphNodes(Number(limit))\n }}\n >\n <Caption>\n The most nodes a layout draws; past it the graph is declined. Walk\n rows take no limit.\n </Caption>\n </SettingSelect>\n </Group>\n\n <Group title=\"Drawing\">\n {model.anchorPaths.length > 1 ? (\n <SettingSelect\n label=\"Reference path\"\n value={model.activeReferencePath ?? ''}\n options={model.anchorPaths.map(({ name }) => ({\n value: name,\n label: name,\n }))}\n testId=\"graph-reference-path-select\"\n onChange={name => {\n model.setReferencePath(name)\n void model.recomputeLayout()\n }}\n >\n <Caption>The path the anchored layouts place x along</Caption>\n </SettingSelect>\n ) : null}\n\n <SettingSelect\n label=\"Node width\"\n value={model.nodeWidth}\n options={NODE_WIDTHS}\n testId=\"graph-node-width-select\"\n onChange={width => {\n model.setNodeWidth(width)\n }}\n >\n <Caption>\n Depth as width. In a cut with walks, depth is how many haplotypes\n carry the node.\n </Caption>\n </SettingSelect>\n\n <SettingSelect\n label=\"Link width\"\n value={model.linkWidth}\n options={EDGE_WIDTHS}\n testId=\"graph-link-width-select\"\n onChange={links => {\n model.setLinkWidth(links)\n }}\n >\n <Caption>\n Walks as width, so a common route reads heavy and a private one\n thin.\n </Caption>\n </SettingSelect>\n\n <SettingSwitch\n label=\"Draw paths\"\n checked={model.drawPaths}\n onChange={draw => {\n model.setLayer('paths', draw)\n }}\n >\n <Caption>\n Color each node by the paths through it, one lane per path\n </Caption>\n {model.drawPaths && !model.effectiveDrawPaths ? (\n <Caption warn>\n {model.pathCount > MAX_PATH_COLORS\n ? `Off: ${model.pathCount.toLocaleString()} paths is past the ${MAX_PATH_COLORS} this can tell apart`\n : 'Off: this graph states no paths'}\n </Caption>\n ) : null}\n </SettingSwitch>\n\n <TrackPickSetting\n label=\"Gene track\"\n choices={model.geneTrackChoices}\n stored={model.geneTrackId}\n auto={pickGeneTrack(model.geneTrackChoices, '')}\n testId=\"graph-gene-track-select\"\n onChange={trackId => {\n model.setGeneTrackId(trackId)\n }}\n >\n <Caption>Where genes on the backbone come from</Caption>\n </TrackPickSetting>\n\n <TrackPickSetting\n label=\"Repeat track\"\n choices={model.repeatTrackChoices}\n stored={model.repeatTrackId}\n auto={pickRepeatTrack(model.repeatTrackChoices, '')}\n testId=\"graph-repeat-track-select\"\n onChange={trackId => {\n model.setRepeatTrackId(trackId)\n }}\n >\n <Caption>\n The tandem repeat annotation walk rows measure and tile by\n </Caption>\n </TrackPickSetting>\n </Group>\n\n <Group title=\"Force-directed layout\">\n {model.hasGraph && !model.usesLayoutEngine ? (\n <div className={classes.section}>\n <Caption warn>\n No effect on the current layout until Layout is Force-directed\n </Caption>\n </div>\n ) : null}\n\n <SettingSelect\n label=\"Engine\"\n value={model.layoutEngine}\n options={LAYOUT_ENGINES}\n testId=\"graph-layout-engine-select\"\n onChange={engine => {\n model.setLayoutEngine(engine)\n }}\n >\n <Caption>\n Stress keeps the reference straight, so a zoom keeps the picture;\n FMMM lets the whole graph settle.\n </Caption>\n </SettingSelect>\n\n <SettingSelect\n label=\"Layout quality\"\n value={String(model.layoutQuality)}\n options={LAYOUT_QUALITIES.map(q => ({\n value: String(q.value),\n label: q.label,\n }))}\n testId=\"graph-layout-quality-select\"\n onChange={quality => {\n model.setLayoutQuality(Number(quality))\n }}\n >\n <Caption>\n The engine&apos;s iteration budget; higher is slower\n </Caption>\n </SettingSelect>\n\n <SettingSelect\n label=\"Bubble spread\"\n value={model.bubbleSpread}\n options={BUBBLE_SPREADS}\n testId=\"graph-bubble-spread-select\"\n onChange={spread => {\n model.setBubbleSpread(spread)\n }}\n >\n <Caption>How far the layout opens a bubble</Caption>\n </SettingSelect>\n\n {model.layoutEngine === 'stress' ? null : (\n <SettingSwitch\n label=\"Linear layout\"\n checked={model.linearLayout}\n onChange={linear => {\n model.setLinearLayout(linear)\n }}\n >\n <Caption>Keeps a chain of nodes on one line where it can</Caption>\n </SettingSwitch>\n )}\n </Group>\n </DialogContent>\n\n <DialogActions>\n <Button variant=\"contained\" color=\"primary\" onClick={onClose}>\n Close\n </Button>\n </DialogActions>\n </Dialog>\n )\n})\n\nexport default GraphSettingsDialog\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// src/layoutQualities.ts\nvar LAYOUT_QUALITIES = [\n { value: 0, label: \"Fastest\" },\n { value: 1, label: \"Fast\" },\n { value: 2, label: \"Default\" },\n { value: 3, label: \"Fine\" },\n { value: 4, label: \"Best\" }\n];\n\nexport {\n LAYOUT_QUALITIES\n};\n", "import { useId } from 'react'\n\nimport {\n FormControl,\n InputLabel,\n ListItemText,\n MenuItem,\n Select,\n} from '@mui/material'\nimport { observer } from 'mobx-react'\n\nimport type { SxProps } from '@mui/material'\n\ninterface SelectOption<T extends string> {\n value: T\n label: string\n // an option's tooltip, and the reason under a disabled one, whose tooltip\n // cannot open\n description?: string\n disabled?: boolean\n}\n\n// One dropdown with its label tied to it, so a screen reader names the combobox\nexport default observer(function LabelledSelect<T extends string>({\n label,\n value,\n options,\n testId,\n size,\n sx,\n disabled,\n title,\n shown,\n onChange,\n}: {\n label: string\n value: T\n options: readonly SelectOption<T>[]\n testId?: string\n size?: 'small' | 'medium'\n sx?: SxProps\n disabled?: boolean\n title?: string\n // what the closed select reads, when not the picked option's label\n shown?: string\n onChange: (value: T) => void\n}) {\n const labelId = useId()\n return (\n <FormControl size={size} sx={sx} disabled={disabled} title={title}>\n <InputLabel id={labelId} shrink>\n {label}\n </InputLabel>\n <Select\n labelId={labelId}\n value={value}\n label={label}\n notched\n displayEmpty\n data-testid={testId}\n renderValue={picked =>\n shown ?? options.find(o => o.value === picked)?.label ?? picked\n }\n onChange={e => {\n onChange(e.target.value as T)\n }}\n >\n {options.map(o => (\n <MenuItem\n key={o.value}\n value={o.value}\n disabled={o.disabled}\n title={o.disabled ? undefined : o.description}\n >\n <ListItemText\n primary={o.label}\n secondary={o.disabled ? o.description : undefined}\n />\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n )\n})\n", "import type { ReactNode } from 'react'\n\nimport { BUBBLE_SPREADS } from '@jbrowse/bandage-core/bubbleSpreads'\nimport { EDGE_WIDTHS } from '@jbrowse/bandage-core/edgeWidths'\nimport { LAYOUT_ENGINES } from '@jbrowse/bandage-core/layoutEngines'\nimport { LAYOUT_QUALITIES } from '@jbrowse/bandage-core/layoutQualities'\nimport { NODE_WIDTHS } from '@jbrowse/bandage-core/nodeWidths'\nimport { MAX_PATH_COLORS } from '@jbrowse/bandage-core/pathColors'\nimport { Dialog } from '@jbrowse/core/ui'\nimport {\n Button,\n DialogActions,\n DialogContent,\n FormControlLabel,\n Switch,\n Typography,\n} from '@mui/material'\nimport { observer } from 'mobx-react'\nimport { makeStyles } from 'tss-react/mui'\n\nimport LabelledSelect from './LabelledSelect'\nimport { pickGeneTrack } from '../genes/geneFeatures'\nimport { pickRepeatTrack } from '../repeats/repeatFeatures'\n\nimport type { GraphPaneModel } from '../model'\n\nconst useStyles = makeStyles()({\n section: {\n marginBottom: 24,\n },\n group: {\n marginBottom: 16,\n },\n heading: {\n marginBottom: 8,\n },\n})\n\nconst Caption = observer(function Caption({\n warn = false,\n children,\n}: {\n warn?: boolean\n children: ReactNode\n}) {\n return (\n <Typography\n variant=\"caption\"\n component=\"div\"\n color={warn ? 'warning.main' : 'text.secondary'}\n >\n {children}\n </Typography>\n )\n})\n\nconst Group = observer(function Group({\n title,\n children,\n}: {\n title: string\n children: ReactNode\n}) {\n const { classes } = useStyles()\n return (\n <section className={classes.group}>\n <Typography variant=\"subtitle1\" className={classes.heading}>\n {title}\n </Typography>\n {children}\n </section>\n )\n})\n\nconst SettingSwitch = observer(function SettingSwitch({\n label,\n checked,\n onChange,\n children,\n}: {\n label: string\n checked: boolean\n onChange: (checked: boolean) => void\n children?: ReactNode\n}) {\n const { classes } = useStyles()\n return (\n <div className={classes.section}>\n <FormControlLabel\n control={\n <Switch\n checked={checked}\n onChange={e => {\n onChange(e.target.checked)\n }}\n />\n }\n label={label}\n />\n {children}\n </div>\n )\n})\n\n// one dropdown setting, at the dialog's width, and its caption\nconst SettingSelect = observer(function SettingSelect<T extends string>({\n children,\n ...props\n}: Omit<Parameters<typeof LabelledSelect<T>>[0], 'size' | 'sx'> & {\n children?: ReactNode\n}) {\n const { classes } = useStyles()\n return (\n <div className={classes.section}>\n <LabelledSelect sx={{ minWidth: 200 }} {...props} />\n {children}\n </div>\n )\n})\n\nconst NODE_LIMITS = [5000, 20_000, 50_000, 100_000]\n\n// the presets, with a limit a session states among them\nfunction nodeLimitOptions(current: number) {\n return [...new Set([...NODE_LIMITS, current])]\n .sort((a, b) => a - b)\n .map(limit => ({ value: String(limit), label: limit.toLocaleString() }))\n}\n\ninterface NamedTrack {\n trackId: string\n name: string\n}\n\n// '' leaves the pick to the heuristic, so a session can go back to it\nconst TrackPickSetting = observer(function TrackPickSetting({\n label,\n choices,\n stored,\n auto,\n testId,\n onChange,\n children,\n}: {\n label: string\n choices: NamedTrack[]\n stored: string\n auto: NamedTrack | undefined\n testId: string\n onChange: (trackId: string) => void\n children: ReactNode\n}) {\n return choices.length > 0 ? (\n <SettingSelect\n label={label}\n value={choices.some(t => t.trackId === stored) ? stored : ''}\n options={[\n { value: '', label: `Automatic (${auto?.name ?? 'none'})` },\n ...choices.map(({ trackId, name }) => ({\n value: trackId,\n label: name,\n })),\n ]}\n testId={testId}\n onChange={onChange}\n >\n {children}\n </SettingSelect>\n ) : null\n})\n\n// Toggles the menus already offer (halos, genes, color) stay out of here.\n// `children` is the host's own part of the subgraph group.\nconst GraphSettingsDialog = observer(function GraphSettingsDialog(props: {\n model: GraphPaneModel\n onClose: () => void\n children?: ReactNode\n}) {\n const { model, onClose, children } = props\n const { classes } = useStyles()\n\n return (\n <Dialog open onClose={onClose} title=\"Graph settings\">\n <DialogContent>\n <Group title=\"Subgraph\">\n {children}\n <SettingSelect\n label=\"Node limit\"\n value={String(model.maxGraphNodes)}\n options={nodeLimitOptions(model.maxGraphNodes)}\n testId=\"graph-node-limit-select\"\n onChange={limit => {\n model.setMaxGraphNodes(Number(limit))\n }}\n >\n <Caption>\n The most nodes a layout draws; past it the graph is declined. Walk\n rows take no limit.\n </Caption>\n </SettingSelect>\n </Group>\n\n <Group title=\"Drawing\">\n {model.anchorPaths.length > 1 ? (\n <SettingSelect\n label=\"Reference path\"\n value={model.activeReferencePath ?? ''}\n options={model.anchorPaths.map(({ name }) => ({\n value: name,\n label: name,\n }))}\n testId=\"graph-reference-path-select\"\n onChange={name => {\n model.setReferencePath(name)\n void model.recomputeLayout()\n }}\n >\n <Caption>The path the anchored layouts place x along</Caption>\n </SettingSelect>\n ) : null}\n\n <SettingSelect\n label=\"Node width\"\n value={model.nodeWidth}\n options={NODE_WIDTHS}\n testId=\"graph-node-width-select\"\n onChange={width => {\n model.setNodeWidth(width)\n }}\n >\n <Caption>\n Depth as width. In a cut with walks, depth is how many haplotypes\n carry the node.\n </Caption>\n </SettingSelect>\n\n <SettingSelect\n label=\"Link width\"\n value={model.linkWidth}\n options={EDGE_WIDTHS}\n testId=\"graph-link-width-select\"\n onChange={links => {\n model.setLinkWidth(links)\n }}\n >\n <Caption>\n Walks as width, so a common route reads heavy and a private one\n thin.\n </Caption>\n </SettingSelect>\n\n <SettingSwitch\n label=\"Draw paths\"\n checked={model.drawPaths}\n onChange={draw => {\n model.setLayer('paths', draw)\n }}\n >\n <Caption>\n Color each node by the paths through it, one lane per path\n </Caption>\n {model.drawPaths && !model.effectiveDrawPaths ? (\n <Caption warn>\n {model.pathCount > MAX_PATH_COLORS\n ? `Off: ${model.pathCount.toLocaleString()} paths is past the ${MAX_PATH_COLORS} this can tell apart`\n : 'Off: this graph states no paths'}\n </Caption>\n ) : null}\n </SettingSwitch>\n\n <TrackPickSetting\n label=\"Gene track\"\n choices={model.geneTrackChoices}\n stored={model.geneTrackId}\n auto={pickGeneTrack(model.geneTrackChoices, '')}\n testId=\"graph-gene-track-select\"\n onChange={trackId => {\n model.setGeneTrackId(trackId)\n }}\n >\n <Caption>Where genes on the backbone come from</Caption>\n </TrackPickSetting>\n\n <TrackPickSetting\n label=\"Repeat track\"\n choices={model.repeatTrackChoices}\n stored={model.repeatTrackId}\n auto={pickRepeatTrack(model.repeatTrackChoices, '')}\n testId=\"graph-repeat-track-select\"\n onChange={trackId => {\n model.setRepeatTrackId(trackId)\n }}\n >\n <Caption>\n The tandem repeat annotation walk rows measure and tile by\n </Caption>\n </TrackPickSetting>\n </Group>\n\n <Group title=\"Force-directed layout\">\n {model.hasGraph && !model.usesLayoutEngine ? (\n <div className={classes.section}>\n <Caption warn>\n No effect on the current layout until Layout is Force-directed\n </Caption>\n </div>\n ) : null}\n\n <SettingSelect\n label=\"Engine\"\n value={model.chosenLayoutEngine}\n options={LAYOUT_ENGINES}\n testId=\"graph-layout-engine-select\"\n onChange={engine => {\n model.setLayoutEngine(engine)\n }}\n >\n <Caption>\n Stress keeps the reference straight, so a zoom keeps the picture;\n FMMM lets the whole graph settle.\n </Caption>\n </SettingSelect>\n\n <SettingSelect\n label=\"Layout quality\"\n value={String(model.layoutQuality)}\n options={LAYOUT_QUALITIES.map(q => ({\n value: String(q.value),\n label: q.label,\n }))}\n testId=\"graph-layout-quality-select\"\n onChange={quality => {\n model.setLayoutQuality(Number(quality))\n }}\n >\n <Caption>\n The engine&apos;s iteration budget; higher is slower\n </Caption>\n </SettingSelect>\n\n <SettingSelect\n label=\"Bubble spread\"\n value={model.bubbleSpread}\n options={BUBBLE_SPREADS}\n testId=\"graph-bubble-spread-select\"\n onChange={spread => {\n model.setBubbleSpread(spread)\n }}\n >\n <Caption>How far the layout opens a bubble</Caption>\n </SettingSelect>\n\n {model.chosenLayoutEngine === 'stress' ? null : (\n <SettingSwitch\n label=\"Linear layout\"\n checked={model.linearLayout}\n onChange={linear => {\n model.setLinearLayout(linear)\n }}\n >\n <Caption>Keeps a chain of nodes on one line where it can</Caption>\n </SettingSwitch>\n )}\n </Group>\n </DialogContent>\n\n <DialogActions>\n <Button variant=\"contained\" color=\"primary\" onClick={onClose}>\n Close\n </Button>\n </DialogActions>\n </Dialog>\n )\n})\n\nexport default GraphSettingsDialog\n"],
5
+ "mappings": "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",
6
6
  "names": ["LAYOUT_QUALITIES", "LabelledSelect_default", "observer", "label", "value", "options", "testId", "size", "sx", "disabled", "title", "shown", "onChange", "labelId", "useId", "jsxs", "FormControl", "jsx", "InputLabel", "Select", "picked", "o", "e", "MenuItem", "ListItemText", "useStyles", "makeStyles", "Caption", "observer", "warn", "children", "jsx", "Typography", "Group", "title", "classes", "jsxs", "SettingSwitch", "label", "checked", "onChange", "FormControlLabel", "Switch", "e", "SettingSelect", "props", "LabelledSelect_default", "NODE_LIMITS", "nodeLimitOptions", "current", "a", "b", "limit", "TrackPickSetting", "choices", "stored", "auto", "testId", "t", "trackId", "name", "GraphSettingsDialog", "model", "onClose", "Dialog", "DialogContent", "NODE_WIDTHS", "width", "EDGE_WIDTHS", "links", "draw", "MAX_PATH_COLORS", "pickGeneTrack", "pickRepeatTrack", "LAYOUT_ENGINES", "engine", "LAYOUT_QUALITIES", "q", "quality", "BUBBLE_SPREADS", "spread", "linear", "DialogActions", "Button", "GraphSettingsDialog_default"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{A as N,C as I,d as H,g as _,h as A,i as W,k as X,l as j,m as z,n as F,s as O,t as E,v as Y,x as J,y as K}from"./chunk-DQC5K7EW.js";import{Hb as R,Jb as B,O as S,P as M,Rb as D}from"./chunk-W4Y2JUP7.js";import"./chunk-T3FHGWNW.js";import"./chunk-S7DQGZX2.js";import{n as P}from"./chunk-46O3IEW3.js";import"./chunk-G6NFDDMN.js";import"./chunk-VPZZ6XMM.js";import"./chunk-5TT5TG4Q.js";import"./chunk-WJHTNDTQ.js";import"./chunk-2FG67WIZ.js";import"./chunk-6VNDP3UB.js";import"./chunk-FLKXKTS2.js";import"./chunk-J2PN6CG3.js";import{a as k,b as e,c as f}from"./chunk-DUU6T2I5.js";var m=JBrowseExports["@jbrowse/display-kit/renderDisplaySvg"],rt=t=>m!=null&&t in Object(m)?m[t]:Object.assign(function(){throw new Error("This JBrowse does not provide '"+t+"' from '@jbrowse/display-kit/renderDisplaySvg' to plugins: GraphGenomeView was built for a different JBrowse version, so update the plugin or JBrowse")},{jbrowseHostMissing:t});var U=rt("renderDisplaySvg");var dt=m&&m.__esModule?m.default:m;var w=JBrowseExports["@jbrowse/core/util/paintLayer"],ot=t=>w!=null&&t in Object(w)?w[t]:Object.assign(function(){throw new Error("This JBrowse does not provide '"+t+"' from '@jbrowse/core/util/paintLayer' to plugins: GraphGenomeView was built for a different JBrowse version, so update the plugin or JBrowse")},{jbrowseHostMissing:t}),C=ot("PaintLayer"),yt=w&&w.__esModule?w.default:w;var L={fontFamily:"sans-serif",fontSize:11},Z=16,at=2,V=t=>t;function q({model:t,lift:a,drawPaths:i,width:n,height:r,rasterize:l}){let o=t.buildDrawing(a,i);if(!o)return null;let s=l?at:1,c=l?void 0:R(n,r),y=c?.canvas??document.createElement("canvas");c||(y.width=Math.round(n*s),y.height=Math.round(r*s));let{scaleX:b,scaleY:x,translateX:d,translateY:g}=t.screenTransform,h=new B(y);return h.uploadGeometry(o.batch),h.updateTransform({scaleX:b*s,scaleY:x*s,translateX:d*s,translateY:g*s,dpr:s}),h.render([0,0,0,0]),c?e("svg",{width:n,height:r,overflow:"hidden",children:e("g",{dangerouslySetInnerHTML:{__html:c.markup()}})}):e("image",{width:n,height:r,href:y.toDataURL("image/png")})}function it(t,a,i,n){let r=n?0:E,l=t.toUpperCase();return{key:a,width:l.length*P,height:i+r,draw:o=>e("text",{fontFamily:"sans-serif",fontSize:9.5,fontWeight:600,letterSpacing:"0.06em",x:o,y:r,fill:O,children:l},a)}}function $(t,a,i=Z,n){if(!t.swatch)return{key:t.key,width:t.label.length*P,height:i,draw:c=>e("text",{...L,x:c,y:0,fill:"#666",children:t.label},t.key)};let r=t.swatch,l=n??_(r),o=n===void 0?0:n+5,s=(t.strong??"")+t.label;return{key:t.key,width:Math.max(l+5+s.length*P,o+(t.under?.length??0)*P),height:t.under?i*2:i,draw:c=>f("g",{...L,children:[e(F,{swatch:r,x:c+(l-_(r))/2,id:a}),f("text",{x:c+l+5,y:0,children:[t.strong?e("tspan",{fontWeight:"bold",children:t.strong}):null,t.label]}),t.under?e("text",{x:c+o,y:i,children:t.under}):null]},t.key)}}function st({model:t,idPrefix:a}){let i=z(t);if(i.length===0)return null;let n=i.flatMap(p=>p.rows),r=W(n),l=A(n),o=i.flatMap(({testid:p,rows:u,heading:v,spaced:G},tt)=>[...v?[it(v,`${p}-heading`,r,tt===0)]:[],...G?[{key:`${p}-gap`,width:0,height:E,draw:()=>null}]:[],...u.map((et,nt)=>$(et,`${a}-${p}-${nt}`,r,l))]),s=6,c=o.reduce((p,u)=>Math.max(p,u.width),-1/0)+s*2,y=o.reduce((p,u)=>p+u.height,0)+s,x=t.paneWidth-D-c+s,d=D+t.referenceStripZonePx,g=[],h=d+s/2+r/2+4;for(let p of o)g.push({row:p,y:h}),h+=p.height;return f("g",{"data-testid":"graph-svg-keys",children:[e("rect",{x:x-s,y:d,width:c,height:y,rx:3,fill:"#fff"}),g.map(({row:p,y:u})=>e("g",{transform:`translate(0 ${u})`,children:p.draw(x)},p.key))]})}function Q({x:t,y:a,text:i,fontSize:n,anchor:r,bold:l}){let o=i.length*n*.56+6,s=r==="middle"?t-o/2:t-3;return f(k,{children:[e("rect",{x:s,y:a-n*.65,width:o,height:n*1.3,rx:3,fill:"#fff",fillOpacity:.8}),e("text",{x:t,y:a+n*.35,textAnchor:r,fontSize:n,fontWeight:l?600:void 0,fill:"#18181c",children:i})]})}function lt({model:t}){return e("g",{fontFamily:L.fontFamily,children:t.overlayLabels.sizes.map(({key:a,text:i,x:n,y:r,kind:l,leader:o})=>f("g",{children:[o?e("line",{x1:o.arcX,y1:o.arcY,x2:o.labelX,y2:o.labelY,stroke:"#18181c"}):null,e(Q,{x:n,y:r,text:i,fontSize:10,anchor:"middle",bold:l==="deletion"})]},a))})}function pt({model:t}){return e("g",{fontFamily:L.fontFamily,children:t.visibleRowLabels.map(({label:a,y:i,top:n})=>e(Q,{x:10,y:n,text:a,fontSize:11,anchor:"start"},i))})}function ct({model:t,rasterize:a,idPrefix:i}){let n=t.facetPanels,r=t.facetGrid,l=t.facetPlacement;if(!n||!r||!l)return null;let{columns:o,width:s,height:c}=r,y=r.total+S+14,b=j(t).map((d,g)=>$(d,`${i}-facet-key-${g}`)),x=b.map((d,g)=>b.slice(0,g).reduce((h,p)=>h+p.width+14,6));return f(k,{children:[e("g",{transform:`translate(0 ${y})`,children:b.map((d,g)=>d.draw(x[g]))}),n.map((d,g)=>{let h=l.cells[g],p=h%o*(s+S),u=Math.floor(h/o)*(M+c+S),v=d.walks[0],G=$(X(t,v),`${i}-facet-${g}`);return f("g",{transform:`translate(${p} ${u})`,children:[e("g",{transform:`translate(0 ${Z-2})`,children:G.draw(6)}),e("g",{transform:`translate(0 ${M})`,children:e(q,{model:t,lift:d,drawPaths:!1,width:s,height:c,rasterize:a})})]},v.name)})]})}function T({model:t,rasterize:a=!1,idPrefix:i}){let n=t.paneWidth,r=t.canvasHeight,l=!!t.layoutResult?.tubeMap,o={rasterizeLayers:a};return f("g",{"data-testid":"graph-pane-svg",children:[t.facetPanels?e(ct,{model:t,rasterize:a,idPrefix:i}):l?e(C,{width:n,height:r,opts:o,paint:s=>{N(V(s),t,{highlightNode:null})}}):e(q,{model:t,lift:t.drawnHighlight,drawPaths:t.effectiveDrawPaths,width:n,height:r,rasterize:a}),t.facetPanels?null:f(k,{children:[e(H,{model:t}),e(Y,{model:t}),e(lt,{model:t}),e(J,{model:t}),e(I,{model:t,vector:!0}),e(pt,{model:t})]}),t.referenceStripShown?e(C,{width:n,height:r,opts:o,paint:s=>{K(V(s),t,{lit:void 0,dpr:1})}}):null,t.facetPanels?null:e(st,{model:t,idPrefix:i})]})}function gt({model:t,opts:a}){return e(T,{model:t,rasterize:!!a?.rasterizeLayers,idPrefix:`graph-${t.id}`})}function At(t,a){return U(t,a,gt)}export{At as renderGraphTrackSvg};
2
- //# sourceMappingURL=renderSvg-PEQY7XLR.js.map
1
+ import{A as N,C as I,d as H,g as _,h as A,i as W,k as X,l as j,m as z,n as F,s as O,t as E,v as Y,x as J,y as K}from"./chunk-5WIUEMTH.js";import{Hb as R,Jb as B,O as S,P as M,Rb as D}from"./chunk-TFV57AXQ.js";import"./chunk-T3FHGWNW.js";import"./chunk-PXYYKSGK.js";import{n as P}from"./chunk-46O3IEW3.js";import"./chunk-G6NFDDMN.js";import"./chunk-VPZZ6XMM.js";import"./chunk-5TT5TG4Q.js";import"./chunk-WJHTNDTQ.js";import"./chunk-2FG67WIZ.js";import"./chunk-6VNDP3UB.js";import"./chunk-FLKXKTS2.js";import"./chunk-J2PN6CG3.js";import{a as k,b as e,c as f}from"./chunk-DUU6T2I5.js";var m=JBrowseExports["@jbrowse/display-kit/renderDisplaySvg"],rt=t=>m!=null&&t in Object(m)?m[t]:Object.assign(function(){throw new Error("This JBrowse does not provide '"+t+"' from '@jbrowse/display-kit/renderDisplaySvg' to plugins: GraphGenomeView was built for a different JBrowse version, so update the plugin or JBrowse")},{jbrowseHostMissing:t});var U=rt("renderDisplaySvg");var dt=m&&m.__esModule?m.default:m;var w=JBrowseExports["@jbrowse/core/util/paintLayer"],ot=t=>w!=null&&t in Object(w)?w[t]:Object.assign(function(){throw new Error("This JBrowse does not provide '"+t+"' from '@jbrowse/core/util/paintLayer' to plugins: GraphGenomeView was built for a different JBrowse version, so update the plugin or JBrowse")},{jbrowseHostMissing:t}),C=ot("PaintLayer"),yt=w&&w.__esModule?w.default:w;var L={fontFamily:"sans-serif",fontSize:11},Z=16,at=2,V=t=>t;function q({model:t,lift:a,drawPaths:i,width:n,height:r,rasterize:l}){let o=t.buildDrawing(a,i);if(!o)return null;let s=l?at:1,c=l?void 0:R(n,r),y=c?.canvas??document.createElement("canvas");c||(y.width=Math.round(n*s),y.height=Math.round(r*s));let{scaleX:b,scaleY:x,translateX:d,translateY:g}=t.screenTransform,h=new B(y);return h.uploadGeometry(o.batch),h.updateTransform({scaleX:b*s,scaleY:x*s,translateX:d*s,translateY:g*s,dpr:s}),h.render([0,0,0,0]),c?e("svg",{width:n,height:r,overflow:"hidden",children:e("g",{dangerouslySetInnerHTML:{__html:c.markup()}})}):e("image",{width:n,height:r,href:y.toDataURL("image/png")})}function it(t,a,i,n){let r=n?0:E,l=t.toUpperCase();return{key:a,width:l.length*P,height:i+r,draw:o=>e("text",{fontFamily:"sans-serif",fontSize:9.5,fontWeight:600,letterSpacing:"0.06em",x:o,y:r,fill:O,children:l},a)}}function $(t,a,i=Z,n){if(!t.swatch)return{key:t.key,width:t.label.length*P,height:i,draw:c=>e("text",{...L,x:c,y:0,fill:"#666",children:t.label},t.key)};let r=t.swatch,l=n??_(r),o=n===void 0?0:n+5,s=(t.strong??"")+t.label;return{key:t.key,width:Math.max(l+5+s.length*P,o+(t.under?.length??0)*P),height:t.under?i*2:i,draw:c=>f("g",{...L,children:[e(F,{swatch:r,x:c+(l-_(r))/2,id:a}),f("text",{x:c+l+5,y:0,children:[t.strong?e("tspan",{fontWeight:"bold",children:t.strong}):null,t.label]}),t.under?e("text",{x:c+o,y:i,children:t.under}):null]},t.key)}}function st({model:t,idPrefix:a}){let i=z(t);if(i.length===0)return null;let n=i.flatMap(p=>p.rows),r=W(n),l=A(n),o=i.flatMap(({testid:p,rows:u,heading:v,spaced:G},tt)=>[...v?[it(v,`${p}-heading`,r,tt===0)]:[],...G?[{key:`${p}-gap`,width:0,height:E,draw:()=>null}]:[],...u.map((et,nt)=>$(et,`${a}-${p}-${nt}`,r,l))]),s=6,c=o.reduce((p,u)=>Math.max(p,u.width),-1/0)+s*2,y=o.reduce((p,u)=>p+u.height,0)+s,x=t.paneWidth-D-c+s,d=D+t.referenceStripZonePx,g=[],h=d+s/2+r/2+4;for(let p of o)g.push({row:p,y:h}),h+=p.height;return f("g",{"data-testid":"graph-svg-keys",children:[e("rect",{x:x-s,y:d,width:c,height:y,rx:3,fill:"#fff"}),g.map(({row:p,y:u})=>e("g",{transform:`translate(0 ${u})`,children:p.draw(x)},p.key))]})}function Q({x:t,y:a,text:i,fontSize:n,anchor:r,bold:l}){let o=i.length*n*.56+6,s=r==="middle"?t-o/2:t-3;return f(k,{children:[e("rect",{x:s,y:a-n*.65,width:o,height:n*1.3,rx:3,fill:"#fff",fillOpacity:.8}),e("text",{x:t,y:a+n*.35,textAnchor:r,fontSize:n,fontWeight:l?600:void 0,fill:"#18181c",children:i})]})}function lt({model:t}){return e("g",{fontFamily:L.fontFamily,children:t.overlayLabels.sizes.map(({key:a,text:i,x:n,y:r,kind:l,leader:o})=>f("g",{children:[o?e("line",{x1:o.arcX,y1:o.arcY,x2:o.labelX,y2:o.labelY,stroke:"#18181c"}):null,e(Q,{x:n,y:r,text:i,fontSize:10,anchor:"middle",bold:l==="deletion"})]},a))})}function pt({model:t}){return e("g",{fontFamily:L.fontFamily,children:t.visibleRowLabels.map(({label:a,y:i,top:n})=>e(Q,{x:10,y:n,text:a,fontSize:11,anchor:"start"},i))})}function ct({model:t,rasterize:a,idPrefix:i}){let n=t.facetPanels,r=t.facetGrid,l=t.facetPlacement;if(!n||!r||!l)return null;let{columns:o,width:s,height:c}=r,y=r.total+S+14,b=j(t).map((d,g)=>$(d,`${i}-facet-key-${g}`)),x=b.map((d,g)=>b.slice(0,g).reduce((h,p)=>h+p.width+14,6));return f(k,{children:[e("g",{transform:`translate(0 ${y})`,children:b.map((d,g)=>d.draw(x[g]))}),n.map((d,g)=>{let h=l.cells[g],p=h%o*(s+S),u=Math.floor(h/o)*(M+c+S),v=d.walks[0],G=$(X(t,v),`${i}-facet-${g}`);return f("g",{transform:`translate(${p} ${u})`,children:[e("g",{transform:`translate(0 ${Z-2})`,children:G.draw(6)}),e("g",{transform:`translate(0 ${M})`,children:e(q,{model:t,lift:d,drawPaths:!1,width:s,height:c,rasterize:a})})]},v.name)})]})}function T({model:t,rasterize:a=!1,idPrefix:i}){let n=t.paneWidth,r=t.canvasHeight,l=!!t.layoutResult?.tubeMap,o={rasterizeLayers:a};return f("g",{"data-testid":"graph-pane-svg",children:[t.facetPanels?e(ct,{model:t,rasterize:a,idPrefix:i}):l?e(C,{width:n,height:r,opts:o,paint:s=>{N(V(s),t,{highlightNode:null})}}):e(q,{model:t,lift:t.drawnHighlight,drawPaths:t.effectiveDrawPaths,width:n,height:r,rasterize:a}),t.facetPanels?null:f(k,{children:[e(H,{model:t}),e(Y,{model:t}),e(lt,{model:t}),e(J,{model:t}),e(I,{model:t,vector:!0}),e(pt,{model:t})]}),t.referenceStripShown?e(C,{width:n,height:r,opts:o,paint:s=>{K(V(s),t,{lit:void 0,dpr:1})}}):null,t.facetPanels?null:e(st,{model:t,idPrefix:i})]})}function gt({model:t,opts:a}){return e(T,{model:t,rasterize:!!a?.rasterizeLayers,idPrefix:`graph-${t.id}`})}function At(t,a){return U(t,a,gt)}export{At as renderGraphTrackSvg};
2
+ //# sourceMappingURL=renderSvg-UFS2CN6Z.js.map