'use client'; import { useState } from 'react'; import { Copy, Check } from '@phosphor-icons/react'; import type { SequenceUtilitiesResult } from '@/types/pipeline'; function StatChip({ label, value, valueClass = 'text-text-primary' }: { label: string; value: string; valueClass?: string }) { return (
{label} {value}
); } function CopyButton({ text }: { text: string }) { const [copied, setCopied] = useState(false); return ( ); } function CompositionBars({ comp }: { comp: NonNullable }) { const max = Math.max(...comp.map(c => c.count)); return (
{comp.map(c => (
{c.aa}
{c.count} {c.pct}%
))}
); } export function SequenceUtilitiesView({ result }: { result: SequenceUtilitiesResult }) { const isNuc = result.sequence_type === 'dna' || result.sequence_type === 'rna'; const typeColor = result.sequence_type === 'dna' ? 'text-accent-cyan' : result.sequence_type === 'rna' ? 'text-accent-purple' : result.sequence_type === 'protein' ? 'text-accent-amber' : 'text-text-muted'; return (
{result.issues.length > 0 && (
{result.issues.map((issue, i) => (

{issue}

))}
)}
{result.gc_content !== null && ( )} {result.molecular_weight !== null && ( )}
{isNuc && result.reverse_complement && (

Reverse complement

            {result.reverse_complement}
          
)} {result.translation && (

Translation (forward frames)

{result.translation.best && (
Best ORF — frame {result.translation.best.frame}, starts at residue{' '} {result.translation.best.start}, {result.translation.best.length} aa {result.translation.best.has_stop ? ' (ends at a stop codon)' : ' (runs to the sequence end)'}.
)} {(() => { const translation = result.translation; if (!translation) return null; return (
{Object.entries(translation.frames).map(([frame, protein]) => (
Frame {frame} {translation.best?.frame === Number(frame) && ( longest ORF )}
                  {protein || '(too short to translate)'}
                
))}
); })()}
)} {result.aa_composition && result.aa_composition.length > 0 && (

Amino-acid composition ({result.translation ? 'translated CDS' : 'protein'})

)} {result.restriction_sites && result.restriction_sites.length > 0 && (

Restriction sites ({result.restriction_sites.length} enzymes)

{result.restriction_sites.map(site => ( ))}
Enzyme Site Sites Positions (1-based)
{site.name} {site.recognition} {site.count} {site.positions.slice(0, 12).join(', ')} {site.positions.length > 12 ? ` … +${site.positions.length - 12}` : ''}
)}
); }