JBrowse 2 · Build Your Own examples

Dark theme

The mode option sets light or dark from your app's state.

With mode left off, the tracks follow the page’s CSS color-scheme: the OS preference where the page declares light dark, and light where it declares nothing. The worker draws feature labels into the image it returns, so mode goes to the worker as well. For that, mount EmbedProvider or SessionPaletteProvider, and not PaletteProvider alone.

View source — 70 lines
import { useState } from 'react'

import { EmbedProvider, Toolbar, TrackStack } from '@jbrowse/display-ui/embed'
import { useCreateViewState } from '@jbrowse/react-linear-genome-view2'
import { observer } from 'mobx-react'

const modes = ['light', 'dark'] as const

const DarkTheme = observer(function DarkTheme() {
  const [mode, setMode] = useState<(typeof modes)[number]>('dark')
  const state = useCreateViewState({
    assembly: {
      name: 'hg38',
      uri: 'https://jbrowse.org/genomes/GRCh38/fasta/hg38.prefix.fa.gz',
      refNameAliases: {
        uri: 'https://jbrowse.org/genomes/GRCh38/hg38_aliases.txt',
      },
    },
    tracks: [
      {
        trackId: 'hg38_phylop',
        name: 'phyloP 100-way conservation',
        uri: 'https://jbrowse.org/demos/phylop/hg38.phyloP100way.brca1.bw',
        displayDefaults: { height: 100 },
      },
      {
        trackId: 'hg38_genes',
        name: 'RefSeq curated genes',
        uri: 'https://jbrowse.org/ucsc/hg38/ncbiRefSeqCurated.gff.gz',
        index: 'https://jbrowse.org/ucsc/hg38/ncbiRefSeqCurated.gff.gz.csi',
        displayDefaults: { height: 120 },
      },
    ],
    view: {
      loc: 'chr17:43,044,295..43,125,364',
      tracks: ['hg38_phylop', 'hg38_genes'],
    },
  })
  return state ? (
    <EmbedProvider session={state.session} mode={mode}>
      <div
        style={{
          colorScheme: mode,
          color: 'CanvasText',
          background: 'Canvas',
          padding: 8,
        }}
      >
        <Toolbar>
          {modes.map(name => (
            <label key={name}>
              <input
                type="radio"
                name="mode"
                checked={mode === name}
                onChange={() => {
                  setMode(name)
                }}
              />
              {name}
            </label>
          ))}
        </Toolbar>
        <TrackStack view={state.session.view} />
      </div>
    </EmbedProvider>
  ) : null
})

export default DarkTheme