borderless / ui /workspace.py
spagestic's picture
right panel now toggles between two full-height views
a9deb6d
Raw
History Blame Contribute Delete
2.52 kB
# ui/workspace.py
import gradio as gr
from ui.agent import respond
from ui.agent.system_prompt import BORDERLESS_SYSTEM_PROMPT
from ui.chat.defaults import DEFAULT_MAX_TOKENS, DEFAULT_TEMPERATURE, DEFAULT_TOP_P
from ui.chat.panel import SidebarChatInterface
from ui.globe import render_globe_panel
from ui.globe_commands import empty_globe_state
from ui.intake import render_intake_panel
def create_main_workspace(
history_container: gr.Column | None = None,
) -> gr.ChatInterface:
"""
Compose the main workspace: globe panel, intake form, and chat.
"""
globe_state = gr.JSON(value=empty_globe_state(), visible=False, elem_id="globe-state")
chat_input = gr.MultimodalTextbox(
show_label=False,
placeholder="Create a prompt from the form, choose a demo, or type directly...",
file_count="multiple",
sources=["upload"],
lines=3,
max_lines=12,
elem_classes=["borderless-chat-input"],
render=False,
)
with gr.Row(elem_classes=["borderless-main-workspace"], equal_height=True):
with gr.Column(
scale=7,
min_width=520,
elem_classes=["borderless-center-panel"],
):
globe_column = gr.Column(elem_classes=["globe-column"])
with globe_column:
render_globe_panel(height="70vh")
with gr.Column(
scale=4,
min_width=360,
elem_classes=["borderless-chat-panel"],
):
render_intake_panel(chat_input)
chat = SidebarChatInterface(
respond,
multimodal=True,
chatbot=gr.Chatbot(
show_label=False,
container=False,
elem_classes=["borderless-chatbot"],
),
textbox=chat_input,
history_container=history_container,
fill_height=True,
additional_inputs=[
gr.State(BORDERLESS_SYSTEM_PROMPT),
gr.State(DEFAULT_MAX_TOKENS),
gr.State(DEFAULT_TEMPERATURE),
gr.State(DEFAULT_TOP_P),
globe_state,
],
additional_outputs=[globe_state],
)
globe_state.change(
fn=None,
inputs=[globe_state],
outputs=[],
js="(state) => { window.BorderlessGlobe?.applyState(state); return []; }",
queue=False,
)
return chat