{{ t('Generating Diagram...') }}

gbdraw

gbdraw

{{ t('A genome diagram generator for microbes and organelles') }}
{{ sessionBusyReason }} {{ t('Saving session…') }} {{ t('Loading session…') }} {{ t('Preparing feature details…') }}
{{ t('Save stores the current Result and generation settings draft. It does not Generate.') }}
{{ t('Session') }}

{{ t('Record rotation, feature placement, or tolerance has changes pending Generate. This notice covers record display only; the Result keeps its applied settings.') }}

{{ t('Records not inspected') }} {{ t('Inspecting source records…') }} {{ tn(circularRecordDiscoveryState.records.length, '{count} source record inspected', '{count} source records inspected') }} {{ (circularRecordDiscoveryState.error && errorText(circularRecordDiscoveryState.error.summaryParts)) || t('Source inspection failed. Retry or replace the input.') }} {{ cInputType === 'gff' ? t('Upload both GFF3 and FASTA files to inspect records.') : t('Upload a source file to inspect records.') }}

{{ t('Record') }}

{{ t('Multi-Record Canvas uses a grid. Turn it off to select one record.') }}

{{ circularRecordPresentationError }}

{{ t('Select one record to edit crop, orientation, and title lines.') }}

{{ t('Topology and display start') }}
{{ t('Single-record crop, orientation and titles') }}

{{ form.multi_record_canvas ? t('Available when Multi-Record Canvas is off and one record is selected.') : t('Available when one record is selected.') }}

{{ t('Record label') }}
{{ t('Subtitle') }}
{{ t('Region (optional)') }}

{{ circularRegionNote }}

{{ t('Depth TSV tracks') }} {{ depthTrackCountLabel(files.c_depth) }}

{{ t('Each file is used for every record.') }}

{{ t('Depth Window') }}
{{ t('Depth Step') }}
{{ t('Depth Min') }}
{{ t('Depth Max') }}
{{ t('Depth Width') }}
#{{ track.index + 1 }} {{ depthSeriesName(track.index) }}
{{ t('Legend title') }}
{{ t('Per-track settings') }}
{{ t('Large Tick') }}
{{ t('Small Tick') }}
{{ t('Tick Font Size') }}
{{ linearReorderNotice }}
{{ linearSourceMoveBlockedReason }}
{{ t('File {n}', { n: sourceIndex + 1 }) }} {{ linearCardFileLine(source) }} {{ linearCardFileLine(source) }} {{ t('This file could not be read.') }} {{ t('Gencode required') }}
{{ t('Names for all records in this file') }}
{{ linearSourceDepthSummary(source) }}
#{{ track.index + 1 }} {{ depthSeriesName(track.index) }} {{ track.status.state === 'common' ? t('Attached to all records') : track.status.state === 'mixed' ? t('Attached to some records') : t('Not attached') }}

{{ t('Some records use different files or have no depth track. Choosing a file applies it to every record in this File.') }}

{{ t('Number of records: {count} · {drawn} drawn', { count: source.records.length, drawn: recordSelection.drawnCount('linear', source.records.map(({ sequence }) => sequence.uid)) }) }} {{ t('Gencode required') }}
{{ t('Record options') }} {{ t('OFF') }} {{ t('Gencode required') }}
#{{ idx + 1 }}
{{ t('Per-record Depth TSV') }} {{ depthTrackCountLabel(seq.depth) }}
{{ t('Region (optional)') }}

{{ linearRecordSelectorError(seq) }}

{{ linearRecordSelectorWarning(seq) }}

{{ linearRegionNote(seq) }}

{{ t('LOSAT Gencode') }}
{{ t('Depth track settings') }}

{{ t('These settings are shared by the same numbered series across every File and record.') }}

{{ t('Depth Window') }}
{{ t('Depth Step') }}
{{ t('Depth Min') }}
{{ t('Depth Max') }}
{{ t('Default Depth Height') }}
#{{ track.index + 1 }} {{ depthSeriesName(track.index) }}
{{ linearDepthTrackCoverageLabel(track.index) }}
{{ t('Legend title') }}
{{ t('Height') }}
{{ t('Per-track settings') }}
{{ t('Large Tick') }}
{{ t('Small Tick') }}
{{ t('Tick Font Size') }}
{{ importedComparisonIntent.disposition === 'PRESERVED_READ_ONLY' ? t('Saved comparison preserved as read-only') : t('Saved comparison needs a decision') }}

{{ tm(importedComparisonIntent.message) }}

{{ t('The controls below are a replacement draft. The saved comparison and last successful Result remain unchanged until Generate succeeds.') }}

{{ t('Selected action: {action}', { action: importedComparisonActionText }) }}

{{ t('Run LOSAT requires at least 2 loaded sequences.') }}

{{ t('Custom') }} {{ tn(linearComparisonUi.issues.length, '{count} issue to fix before Generate', '{count} issues to fix before Generate') }}

{{ linearComparisonUi.emptyPlanNotice }}

{{ t('Fix before Generate') }}

  • {{ issue.text }}
{{ t('Settings') }}
{{ t('LOSAT Mode') }}

{{ t('Choose Run LOSAT or Upload BLAST TSV to configure comparisons.') }}

{{ t('LOSATN task') }}
{{ sentenceSeparator() + t('When TLOSATX needs a translation table that a record lacks, Gencode required appears beside its file name.') }}
{{ t('Pairwise display max hits') }}
{{ t('Max unit gap') }}
{{ t('Min block genes') }}
{{ t('Result filters') }}
{{ t('Comparison appearance') }}

{{ comparisonHeightValidationError }}

{{ t('Search limits') }}
{{ t('Max target seqs') }}
{{ t('Max hits per protein for groups') }}
{{ t('Performance') }}
{{ t('Execution') }}
{{ t('Total threads') }}
{{ t('Selected pairs ({count})', { count: linearComparisonUi.activePairCount }) }} {{ t('{count} retained', { count: linearComparisonUi.retainedDormantDraftCount }) }}
{{ t('Unplaced draft') }}
  • {{ tm(issue.message) }}
{{ t('Basic') }}
{{ t('Strain') }}
{{ t('Record Layout') }}
{{ t('OFF') }}
{{ t('LOSAT cache') }}

{{ tn(losatCacheInfo.length, '{count} LOSAT result is cached and reused when the inputs and settings match.', '{count} LOSAT results are cached and reused when the inputs and settings match.') }}

{{ linearComparisonUi.sectionKeys.advanced.includes('collinear-details') ? t('Advanced collinear search') : t('Advanced similarity group settings') }}

{{ annotationImportNotice }}

{{ t('Add an annotation row to download TSV.') }}

{{ t('No annotation sets.') }}

{{ annotationFeatureCaption(item) }}

{{ annotationRecordCaption(item) }}

{{ annotationRecordMissingMessage(item) }}

{{ t('Reference side') }}
{{ t('LOSAT Mode') }}
{{ t('Task') }}
{{ t('Reference gencode') }}

{{ t('Available after a LOSAT comparison has run.') }}

{{ t('Series names') }}
{{ circularConservation.source === 'losat' ? t('LOSAT Settings') : t('BLAST Settings') }}
{{ t('Comparison Track Settings') }}
{{ circularConservationLayoutWarning }}
{{ t('Comparison sequence files') }} {{ t('Series') }}
{{ row.sourceLabel }} - {{ row.filename }}
{{ t('Preserved session settings') }}

{{ t('These validated settings are not editable in the Web UI. They remain active until reset.') }}

{{ entry.path }} {{ entry.displayValue }}

{{ t('Installed fonts can be chosen in Chrome and Edge. Use Load font file in this browser.') }}

{{ t('Loading the font…') }}

{{ t('This font is not part of gbdraw. A saved Session keeps only its name, not the font file: to open it elsewhere, the same font must be available there, or it is replaced with the nearest available font.') }}

{{ t('Plot Title') }}

{{ t('Text') }}
{{ t('Position') }}
{{ t('Font size') }}

{{ t('Record Labels') }}

{{ t('Default font size') }}

{{ linearLabelAutoDisclosure }}

{{ row.label }}
{{ t('Style') }}{{ ' ' }}{{ t('(line hidden)') }}
{{ t('Weight') }}
{{ t('Color') }}
{{ getDefinitionLineStyleColorMode(row.key) === 'none' ? t('None') : t('Auto') }}
· {{ legendPositionLabel(form.legend) }}
{{ t('Swatch size') }}
{{ t('Font size') }}

{{ t('PRESET SCHEMES') }}

{{ t('Replaces the specific rules; the palette is unchanged.') }}

{{ t('DEFAULT COLORS') }}

{{ t('Palette') }} {{ settingApplicationText(paletteInstantPreviewEnabled ? 'live' : 'generate') }}
{{ t('Colors in this figure or changed') }} {{ settingApplicationText(hasPendingPaletteDraft ? 'generate' : 'live') }}
{{ feat }}
{{ t('More colors ({count})', { count: defaultColorGroups.more.length }) }}
{{ feat }}
{{ t('Optional TSV of default colors.') }}

{{ t('Checking color rules…') }}

{{ t('SPECIFIC RULES') }}

{{ t('Rules on the same qualifier: the first match wins.') }}

{{ t('Optional TSV of specific rules.') }}
{{ t('Feature Types') }}
{{ f }} {{ t('No feature types selected') }}
{{ t('Arrow Geometry') }}
{{ t('Head Length Ratio') }}
{{ t('Shaft Width Ratio') }}
{{ t('Feature Visibility') }}
#{{ i + 1 }} {{ featureVisibilityRuleDetail(rule) }}
{{ t('Record ID') }} {{ t('Feature Type') }} {{ t('Qualifier') }}
{{ t('Action') }}
{{ t('No manual visibility rules') }}
{{ t('Feature Appearance') }}
{{ t('Feature Height') }}
{{ t('Axis Gap') }}
{{ t('Feature Track Width') }}
{{ t('Block Stroke Color') }}
{{ t('Block Stroke Width') }}
{{ t('Line Stroke Color') }}
{{ t('Line Stroke Width') }}

{{ t('LABEL FILTERING') }}

{{ t('Exclude labels containing these keywords.') }}

{{ t('- OR -') }}

{{ t('- OR -') }}

{{ t('QUALIFIER PRIORITY') }}

{{rule.feat}} {{rule.order}}
{{ t('No priority rules defined') }}
{{ t('- OR UPLOAD FILE -') }}
{{ t('Label Font Size') }}
{{ t('Label Rendering') }}
{{ t('Label Line') }}
{{ t('Label Protection') }}

{{ t('LABEL GEOMETRY') }}

{{ t('Enable labels to configure filtering, qualifier priority, text settings, and circular label geometry. While a feature\'s Label visibility is On, all of these except filtering show; filters do not apply to that label.') }}

{{ t('Axis Stroke Color') }}
{{ t('Axis Stroke Width') }}
{{ t('Scale Style') }}
{{ t('Line Width') }}
{{ t('Scale Line Color') }}

{{ t('Relinking copies the current Scale Font Size to Ruler Label Font Size once.') }}

{{ t('Scale Font Size') }}
{{ t('Ruler Label Font Size') }}
{{ t('Interval') }}
{{ t('Ruler Label Color') }}

{{ t('Custom Track Slots are active. Use an enabled Ticks slot to control coordinate-scale visibility.') }}

{{ t('Axis Stroke Color') }}
{{ t('Axis Stroke Width') }}
{{ t('Scale Interval') }}
{{ t('Tick Label Font Size') }}
{{ t('Window') }}
{{ t('Step') }}
{{ t('Dinucleotide') }}
{{ t('GC Content Mode') }}
{{ t('GC Min %') }}
{{ t('GC Max %') }}
{{ t('Large Tick') }}
{{ t('Small Tick') }}
{{ t('Tick Font Size') }}
{{ t('Privacy & Security') }} {{ sentenceSeparator() + t('Uploaded genomic data is processed locally and never leaves your device.') }}
{{ t('Hosted Site Analytics') }} {{ t('Uploaded genome files and generated diagrams are still processed locally in your browser and are not sent to Google Analytics by gbdraw.') }}
{{ t('How to cite') }}

{{ t('If you use gbdraw in your research, please cite the preprint:') }}

Kawato, S. (2026). gbdraw: a genome diagram generator for microbes and organelles. bioRxiv. https://doi.org/10.64898/2026.04.07.716863

DOI: https://doi.org/10.64898/2026.04.07.716863

{{ t('Source code:') }} https://github.com/satoshikawato/gbdraw

{{ t('License & Notices') }}

{{ t('gbdraw is released under the MIT License. Open source notices for the hosted app, vendored browser assets, and bundled fonts are available on a local static page.') }}

{{ notice.text }}

  • {{ item }}

{{ labelReflowProcessing ? t('Live edit applying: geometry is being updated. Direct edits already applied are kept.') : errorText(labelReflowLastError.noteParts) }}

{{ t('This Result comes from a Session saved by an older gbdraw. Generate once before Save Session.') }}

{{ t('Last Successful Result') }} {{ t('Result Preview') }}

{{ t('Save Session stores the current Result and settings draft. The SVG, Interactive SVG, PNG, and PDF buttons download the current Result. Neither applies pending settings.') }}

{{ t('Turn on Layout edit to move a legend, title, or Linear scale. When off, drag to pan. Use the Layout edit button with click, tap, Space, or Enter.') }}

DPI

{{ tn(annotationWarnings.filter(w => w.code !== 'out_of_bounds_clipped').length, 'Skipped {count} annotation row.', 'Skipped {count} annotation rows.') }}

{{ t('{set}/{annotation} · record #{n} ({record}): {message}', { set: warning.setId, annotation: warning.annotationId, n: warning.recordIndex + 1, record: warning.recordId, message: warning.message }) }}

{{ tn(featureIdentityNoticeSummary.dormant, '{count} feature edit applies to a feature outside the current crop or display; it applies again when that feature is drawn.', '{count} feature edits apply to features outside the current crop or display; they apply again when those features are drawn.') }}

{{ tn(featureIdentityNoticeSummary.removed, 'Removed {count} feature edit whose feature the replaced source no longer has.', 'Removed {count} feature edits whose features the replaced source no longer has.') }}

{{ tn(featureIdentityNoticeSummary.unmatched, '{count} feature edit names a feature the source does not have.', '{count} feature edits name features the source does not have.') }}

{{ t('Comparison table rows were placed by position.') }}

{{ warning.message }}

{{ sentence }}

{{ t('Showing the last successful result.') }}

{{ t('It matches the current settings.') }}

{{ t('Current changes were not applied.') }}

{{ similarityAlignmentStatus === 'resolving' ? t('Resolving similarity alignment…') : t('Applying similarity alignment…') }}
{{ t('Similarity alignment applied.') }} {{ t('{count} aligned', { count: similarityAlignmentSummary.aligned }) }} · {{ t('{count} unchanged', { count: similarityAlignmentSummary.unchanged }) }} · {{ t('{count} explicitly skipped', { count: similarityAlignmentSummary.explicitlySkipped }) }} · {{ t('{count} no-candidate', { count: similarityAlignmentSummary.noCandidate }) }} · {{ t('{count} reversed', { count: similarityAlignmentSummary.reversed }) }}
{{ similarityAlignmentNotice }}
{{ previewFeatureSearchStatusText }} {{ previewFeatureSearchActiveDetail }}
{{ featureSelectionStatus }}
{{ t('{count} selected', { count: selectedFeatureCount }) }}

{{ t('Drag a record, legend, title, or Linear scale to reposition') }}

{{ t('Canvas Padding') }}

{{ t('Space around the diagram, in pixels') }}

{{ clickedFeatureHeading.title }}
{{ clickedFeatureHeading.product }}
{{ clickedFeatureSummary }}

{{ t('Appearance') }} {{ settingApplicationNote('feature-appearance').text }}

{{ clickedFeature.color }}
{{ t('Label') }}

{{ clickedFeatureLabelHint }}

{{ clickedFeature.labelUnavailableReason }}

{{ t('Generate the diagram again to edit this feature\'s visibility.') }}

{{ t('This feature is hidden. Choose On to show it.') }}

{{ t('Similarity group') }}

{{ clickedFeature.orthogroupId }} {{ clickedOrthogroupDetail.displayName }} {{ clickedOrthogroupDetail.scopeLabel }} {{ clickedOrthogroupDetail ? clickedOrthogroupDetail.countText : tn(Number(clickedFeature.orthogroupMemberCount), '{count} gene', '{count} genes') }}
{{ clickedOrthogroupDetail.genesText }}
{{ t('Record') }} {{ t('Location') }} {{ t('Product') }} {{ t('Sequence') }}

{{ t('Layout') }}

{{ featureRecordRotationUnavailable }}

{{ featureRecordRotationDraft.disabledReason }}

{{ featureRecordRotationDraft.status }}

{{ t('No qualifiers available.') }}
{{ warning }}
{{ t('Nucleotide') }}
{{ clickedFeature.nucleotideFasta }}
{{ t('No nucleotide sequence available.') }}
{{ t('Amino acid') }}
{{ clickedFeature.aminoAcidFasta }}
{{ t('No amino acid sequence available.') }}

{{ t('Feature Visibility Scope') }}

{{ t('Apply this visibility to:') }}

{{ t('Label Text Scope') }}

{{ t('Lost when you Generate again.') }}

{{ t('Label Not Shown') }}

{{ hiddenLabelTextMessage }}

{{ labelOnDialog.reason === 'hidden' ? t('Feature Is Hidden') : (labelOnDialog.reason === 'underlay' ? t('Label Cannot Be Drawn') : t('Label Does Not Fit')) }}

{{ featureStyleScopeDialog.kind === 'stroke' ? t('Stroke Change Scope') : t('Color Change Scope') }}

{{ t('All features with the same') }}

{{ legendRenameDialog.mode === 'scope' ? t('Legend Name Scope') : t('Legend Name Conflict') }}

{{ legendRenameDialog.reason }}

{{ t('The existing "{name}" becomes "{after}".', { name: shownLegendName(legendRenameDialog.targetKey), after: legendRenameDialog.targetNameAfter }) }}

  • {{ legendRenameDialog.targetKey ? shownLegendName(legendRenameDialog.targetKey) : legendRenameDialog.targetCaption }}
  • {{ shownLegendName(legendRenameDialog.sourceKey) }} {{ t('(the item you renamed)') }}

{{ paletteColorsDialog.kind === 'reset' ? t('Reset default colors') : t('Change palette to "{palette}"', { palette: paletteColorsDialog.toPalette }) }}

{{ t('Reset Fill Color') }}


{{ t('How do you want to reset the color?') }}

{{ t('Mode') }}
{{ lastRunInfo.mode }}
{{ t('Run time') }}
{{ runInfoElapsedText(lastRunInfo) }}
{{ t('Results') }}
{{ lastRunInfo.resultCount }}
{{ t('CLI rerun') }}
{{ runInfoReproducibilityText(lastRunInfo) }}
{{ t('Search runtime') }}
  • {{ errorText(runtime.textParts) }}
{{ t('Source recipe') }}
{{ lastRunInfo.sourceRecipe?.command || lastRunInfo.command }}
{{ errorText(lastRunInfo.sourceRecipe.unavailableReasonParts) }}
{{ t('Exact replay') }}
{{ lastRunInfo.exactReplay?.command || lastRunInfo.sessionCommand }}
{{ t('Reproducibility files') }}

{{ errorText(lastRunInfo.downloadBundle.descriptionParts) }}

{{ errorText([note]) }}

{{ t('Run info is available after a successful manual generation.') }}
{{ t('Editor') }}
{{ t('Stroke:') }}
{{ t('No legend entries found') }}
{{ t('Deleted items') }}
  • {{ shownLegendEntryName(entry) }}

{{ t('Features ({count})', { count: filteredFeatures.length }) }}

{{ featureEditorStatusText }}
{{ t('Preparing features...') }}
{{ formatFeatureLocation(feat) }}
{{ feat.type }} {{ t('No label on the diagram') }}
{{ t('No features found') }}
{{ t('Reflowing label placement...') }}

{{ t('Auto Reflow failed. Current diagram is kept.') }}

{{ tn(orthogroupCount, '{count} similarity group', '{count} similarity groups') }}
{{ similarityAlignmentPlanInspector.summary }}
{{ t('Exact reference:') }} {{ similarityAlignmentPlanInspector.reference.recordLabel }} · {{ similarityAlignmentPlanInspector.reference.label }}
  • {{ record.anchorLabel }} · {{ record.rationaleLabel }}
    {{ t('rev') }}
{{ t('Saved names waiting for their original members: {names}', { names: orthogroupDormantNames.join(', ') }) }}
{{ t('No similarity groups found') }}
{{ selectedOrthogroup.id }} {{ orthogroupScopeLabel(selectedOrthogroup) }} {{ t('Edited') }}

{{ similarityAlignmentDrawer.disabledReason || t('The selected exact feature will remain fixed as the reference.') }}

{{ t('Name suggestions ({count})', { count: (selectedOrthogroup.nameCandidates || []).length }) }}

{{ selectedOrthogroup.description }}

{{ candidate.text }} {{ candidate.source }}
{{ t('{genes} · {records} · score {score}', { genes: tn(Number(candidate.memberCount), '{count} gene', '{count} genes'), records: tn(Number(candidate.recordCoverageCount), '{count} record', '{count} records'), score: Number(candidate.score || 0).toFixed(1) }) }}
{{ t('No suggestions') }}
{{ t('Members') }}
{{ t('Selected group:') }} {{ resolveOrthogroupName(selectedOrthogroup) }}

{{ mode === 'linear' ? t('No Linear Result yet. Configure settings and click Generate.') : t('No Circular Result yet. Configure settings and click Generate.') }}

{{ t('BLAST TSV missing') }}

{{ t('Choose a BLAST TSV for each pair, or skip these comparisons.') }}

  • {{ row.label }} {{ row.missing ? t('No file') : row.fileName }}

{{ t('Labels do not fit') }}

{{ labelFitDialog.drawn ? t('The figure is drawn. Choose a fix to Generate again, or Cancel to keep it.') : t('Nothing was drawn. Choose a fix to Generate again.') }}

  • {{ record.recordId }}: {{ record.labelCount }} {{ record.labelKindTitle }} at {{ record.fontSize }} pt ({{ record.counts }})

{{ t('No setting in this dialog makes these labels fit.') }}

{{ t('Fix') }}

{{ t('Choose records') }}

{{ sentenceSeparator() + settingApplicationSentence('inputs') }}

  • {{ t('settings') }} {{ formatRecordLength(row.length) }}
  • {{ t('No record ID matches the search.') }}

{{ t('Remove the whole file?') }}

{{ t('Choose an example') }}

{{ t('Each example opens its Gallery Session: the inputs, settings, and Result.') }}

{{ t('Reset Feature placements?') }}

{{ featurePlacementActions.layoutChange.value ? tn(featurePlacementActions.layoutChange.count, 'Changing {setting} to {value} removes the lane for {count} feature you placed manually.', 'Changing {setting} to {value} removes the lane for {count} features you placed manually.', { setting: featurePlacementActions.layoutChange.setting, value: featurePlacementActions.layoutChange.value }) : featurePlacementActions.layoutChange.setting ? tn(featurePlacementActions.layoutChange.count, 'Choosing {setting} removes the lane for {count} feature you placed manually.', 'Choosing {setting} removes the lane for {count} features you placed manually.', { setting: featurePlacementActions.layoutChange.setting }) : tn(featurePlacementActions.layoutChange.count, 'This change removes the lane for {count} feature you placed manually.', 'This change removes the lane for {count} features you placed manually.') }}

{{ t('Choose installed font') }}

{{ notice.announcement }}

{{ choicePrompt.title }}

{{ choicePrompt.description }}

  • {{ item }}

{{ choicePrompt.note }}

gbdraw
Initializing gbdraw...
Loading the browser application.
Loading gbdraw...