VibecoderMcSwaggins's picture
feat(frontend): React + Vite + NiiVue frontend (replaces Gradio) (#32)
e4daa3b unverified
"""Reusable UI components."""
from __future__ import annotations
import gradio as gr
# Disabled: Gradio NiiVue viewer replaced with standalone React frontend (see frontend/ directory)
# Original: from gradio_niivueviewer import NiiVueViewer
from stroke_deepisles_demo.core.config import get_settings
from stroke_deepisles_demo.core.logging import get_logger
logger = get_logger(__name__)
def create_case_selector() -> gr.Dropdown:
"""
Create a dropdown for selecting cases.
Initially empty; populated by app load event to prevent blocking startup.
Returns:
Configured gr.Dropdown component
"""
return gr.Dropdown(
choices=[],
value=None,
label="Select Case",
info="Initializing dataset... please wait.",
filterable=True,
interactive=True,
)
def create_results_display() -> dict[str, gr.components.Component]:
"""
Create results display components.
Returns:
Dictionary of component name -> gr.Component
"""
# Using gr.Group to group them visually
with gr.Group():
with gr.Tabs():
with gr.Tab("Interactive 3D"):
# Disabled: Gradio NiiVue viewer replaced with React frontend
# See frontend/ directory for the new NiiVue implementation
niivue_viewer = gr.JSON(
label="NiiVue Data (React frontend active)",
value=None,
)
with gr.Tab("Static Report"):
# Slice comparisons (Matplotlib)
slice_plot = gr.Plot(label="Slice Comparison (Validation)")
ortho_plot = gr.Plot(label="Orthogonal Views (Anatomy)")
metrics = gr.JSON(label="Metrics")
download = gr.File(label="Download Prediction")
return {
"niivue_viewer": niivue_viewer,
"slice_plot": slice_plot,
"ortho_plot": ortho_plot,
"metrics": metrics,
"download": download,
}
def create_settings_accordion() -> dict[str, gr.components.Component]:
"""
Create expandable settings section.
Returns:
Dictionary of setting name -> gr.Component
"""
settings = get_settings()
with gr.Accordion("Advanced Settings", open=False):
fast_mode = gr.Checkbox(
value=settings.deepisles_fast_mode,
label="Fast Mode (SEALS)",
info="Run SEALS only (ISLES'22 winner, requires DWI+ADC). Disable for full ensemble (requires FLAIR).",
)
show_ground_truth = gr.Checkbox(
value=True,
label="Show Ground Truth",
info="Display ground truth mask if available",
)
return {
"fast_mode": fast_mode,
"show_ground_truth": show_ground_truth,
}