From 93e0b78f5a0cd2b76e5bd13867fe351cdcfabbeb Mon Sep 17 00:00:00 2001 From: Brianna Major Date: Mon, 9 Mar 2026 14:19:55 -0400 Subject: [PATCH 1/6] Follow modern type hint best practices Do not import `Optional` or `Union`. Signed-off-by: Brianna Major --- src/vtk_prompt/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vtk_prompt/cli.py b/src/vtk_prompt/cli.py index 2234ee1..d4dbd17 100644 --- a/src/vtk_prompt/cli.py +++ b/src/vtk_prompt/cli.py @@ -162,7 +162,7 @@ def main( top_k=top_k, rag=rag, retry_attempts=retry_attempts, - provider=provider, + _provider=provider, custom_prompt=custom_prompt_data, ) From 19e46f3a6a5c1ae26d61928a8f536ebd12e3c060 Mon Sep 17 00:00:00 2001 From: Brianna Major Date: Wed, 11 Mar 2026 14:00:54 -0400 Subject: [PATCH 2/6] Move conversation history into its own component Signed-off-by: Brianna Major --- src/vtk_prompt/controllers/conversation.py | 16 +++- src/vtk_prompt/ui/layout/content.py | 93 +++++++++++++--------- src/vtk_prompt/vtk_prompt_ui.py | 5 ++ 3 files changed, 76 insertions(+), 38 deletions(-) diff --git a/src/vtk_prompt/controllers/conversation.py b/src/vtk_prompt/controllers/conversation.py index c16637b..ef8ca70 100644 --- a/src/vtk_prompt/controllers/conversation.py +++ b/src/vtk_prompt/controllers/conversation.py @@ -83,6 +83,20 @@ def navigate_conversation_right(app: Any) -> None: _update_navigation_state(app) +def navigate_to_conversation(app: Any, target_index: int) -> None: + """Navigate directly to a specific conversation pair by index.""" + if not app.state.conversation_navigation: + return + + nav_length = len(app.state.conversation_navigation) + if target_index < 0 or target_index >= nav_length: + return + + app.state.conversation_index = target_index + _process_conversation_pair(app, target_index) + _update_navigation_state(app) + + def save_conversation(app: Any) -> str: """Save current conversation history as JSON string.""" if hasattr(app, "prompt_client") and app.prompt_client is not None: @@ -183,7 +197,7 @@ def _process_conversation_pair(app: Any, pair_index: int | None = None) -> None: else: query_text = user_content - app.state.query_text = query_text + return query_text def _process_loaded_conversation( diff --git a/src/vtk_prompt/ui/layout/content.py b/src/vtk_prompt/ui/layout/content.py index 68fd2c8..d7f7c99 100644 --- a/src/vtk_prompt/ui/layout/content.py +++ b/src/vtk_prompt/ui/layout/content.py @@ -19,8 +19,8 @@ def build_content(layout: Any, app: Any) -> None: classes="fluid fill-height", style="min-width: 100%; padding: 0!important;" ): with vuetify.VRow(rows=12, classes="fill-height px-4 pt-1 pb-1"): - # Left column - Generated code view - with vuetify.VCol(cols=6): + # Left column - Prompt and conversation history + with vuetify.VCol(cols=3): # Prompt input with vuetify.VCard(classes="h-25"): with vuetify.VCardText(classes="h-100"): @@ -64,15 +64,6 @@ def build_content(layout: Any, app: Any) -> None: ) with html.Div(classes="d-flex", style="height: calc(100% - 75px);"): - with vuetify.VBtn( - variant="tonal", - icon=True, - rounded="0", - disabled=("!can_navigate_left",), - classes="h-auto mr-1", - click=app.ctrl.navigate_conversation_left, - ): - vuetify.VIcon("mdi-arrow-left-circle") # Query input vuetify.VTextarea( label="Describe VTK visualization", @@ -83,30 +74,6 @@ def build_content(layout: Any, app: Any) -> None: hide_details=True, no_resize=True, ) - with vuetify.VBtn( - color=( - "conversation_index ===" - + " conversation_navigation.length - 1" - + " ? 'success' : 'default'", - "default", - ), - variant="tonal", - icon=True, - rounded="0", - disabled=("!can_navigate_right",), - click=app.ctrl.navigate_conversation_right, - ): - vuetify.VIcon( - "mdi-arrow-right-circle", - v_show="conversation_index <" - + " conversation_navigation.length - 1", - ) - vuetify.VIcon( - "mdi-message-plus", - v_show="conversation_index ===" - + " conversation_navigation.length - 1", - ) - # Generate button vuetify.VBtn( "Generate Code", @@ -129,8 +96,60 @@ def build_content(layout: Any, app: Any) -> None: v_show="use_cloud_models && !api_token.trim()", ) + # Bottom: Conversation History + with vuetify.VCard(classes="h-75 w-100 mt-2"): + with vuetify.VCardTitle( + "Conversation History", classes="d-flex align-center" + ): + vuetify.VSpacer() + with vuetify.VCardText( + style="height: calc(100% - 50px); overflow-y: auto;" + ): + # Show message when no history + with vuetify.VAlert( + text="No conversation history yet." + + " Start by generating some VTK code!", + type="info", + variant="tonal", + v_show="conversation_navigation.length === 0", + ): + pass + + # Conversation history list + with vuetify.VCard( + v_for=( + "(pair, idx) in (history_sort_order === 'newest'" + + " ? conversation_navigation.slice().reverse()" + + " : conversation_navigation)" + ), + key="idx", + density="compact", + v_show="conversation_navigation.length > 0", + color=( + "conversation_index === idx ? 'primary' : 'secondary'", + "secondary", + ), + variant=( + "conversation_index === idx ? 'outlined' : 'default'", + "default", + ), + ): + with vuetify.VCardText( + click=(app.ctrl.navigate_to_conversation, "[idx]"), + rounded=True, + classes="mb-2", + ): + # User query preview + html.Span( + "{{ (pair.user.content.includes('')" + + " ? pair.user.content.split('')[1]" + + " : pair.user.content).trim() }}" + ) + + # Middle column - Generated code view + with vuetify.VCol(cols=4): # Generated code panel - with vuetify.VCard(readonly=True, classes="h-75 mt-2"): + with vuetify.VCard(readonly=True, classes="h-100 mt-2"): vuetify.VCardTitle("Generated Code") with vuetify.VCardText(style="height: calc(100% - 50px);"): vuetify.VTextarea( @@ -145,7 +164,7 @@ def build_content(layout: Any, app: Any) -> None: ) # Right column - VTK viewer and prompt - with vuetify.VCol(cols=6): + with vuetify.VCol(cols=5): with vuetify.VRow(no_gutters=True, classes="fill-height"): # Top: VTK render view with vuetify.VCard(classes="h-75 w-100"): diff --git a/src/vtk_prompt/vtk_prompt_ui.py b/src/vtk_prompt/vtk_prompt_ui.py index 8cbfa94..722b1ab 100644 --- a/src/vtk_prompt/vtk_prompt_ui.py +++ b/src/vtk_prompt/vtk_prompt_ui.py @@ -203,6 +203,11 @@ def navigate_conversation_right(self) -> None: """Navigate to next conversation pair.""" conversation.navigate_conversation_right(self) + @controller.set("navigate_to_conversation") + def navigate_to_conversation(self, target_index: int) -> None: + """Navigate directly to a specific conversation pair.""" + conversation.navigate_to_conversation(self, target_index) + @trigger("save_conversation") def save_conversation(self) -> str: """Save current conversation history as JSON string.""" From f7e3a8cca1234ac77a0028beade7b1906f24596c Mon Sep 17 00:00:00 2001 From: Brianna Major Date: Wed, 11 Mar 2026 14:11:28 -0400 Subject: [PATCH 3/6] Refactor history component into its own file Signed-off-by: Brianna Major --- src/vtk_prompt/ui/layout/content.py | 51 +--------------- .../ui/layout/conversation_history.py | 60 +++++++++++++++++++ 2 files changed, 63 insertions(+), 48 deletions(-) create mode 100644 src/vtk_prompt/ui/layout/conversation_history.py diff --git a/src/vtk_prompt/ui/layout/content.py b/src/vtk_prompt/ui/layout/content.py index d7f7c99..80402a4 100644 --- a/src/vtk_prompt/ui/layout/content.py +++ b/src/vtk_prompt/ui/layout/content.py @@ -11,6 +11,8 @@ from trame.widgets import vuetify3 as vuetify from trame_vtk.widgets import vtk as vtk_widgets +from .conversation_history import build_conversation_history + def build_content(layout: Any, app: Any) -> None: """Build the main content area with code panels and VTK viewer.""" @@ -97,54 +99,7 @@ def build_content(layout: Any, app: Any) -> None: ) # Bottom: Conversation History - with vuetify.VCard(classes="h-75 w-100 mt-2"): - with vuetify.VCardTitle( - "Conversation History", classes="d-flex align-center" - ): - vuetify.VSpacer() - with vuetify.VCardText( - style="height: calc(100% - 50px); overflow-y: auto;" - ): - # Show message when no history - with vuetify.VAlert( - text="No conversation history yet." - + " Start by generating some VTK code!", - type="info", - variant="tonal", - v_show="conversation_navigation.length === 0", - ): - pass - - # Conversation history list - with vuetify.VCard( - v_for=( - "(pair, idx) in (history_sort_order === 'newest'" - + " ? conversation_navigation.slice().reverse()" - + " : conversation_navigation)" - ), - key="idx", - density="compact", - v_show="conversation_navigation.length > 0", - color=( - "conversation_index === idx ? 'primary' : 'secondary'", - "secondary", - ), - variant=( - "conversation_index === idx ? 'outlined' : 'default'", - "default", - ), - ): - with vuetify.VCardText( - click=(app.ctrl.navigate_to_conversation, "[idx]"), - rounded=True, - classes="mb-2", - ): - # User query preview - html.Span( - "{{ (pair.user.content.includes('')" - + " ? pair.user.content.split('')[1]" - + " : pair.user.content).trim() }}" - ) + build_conversation_history(app) # Middle column - Generated code view with vuetify.VCol(cols=4): diff --git a/src/vtk_prompt/ui/layout/conversation_history.py b/src/vtk_prompt/ui/layout/conversation_history.py new file mode 100644 index 0000000..41da142 --- /dev/null +++ b/src/vtk_prompt/ui/layout/conversation_history.py @@ -0,0 +1,60 @@ +# SPDX-License-Identifier: Apache-2.0 +# Copyright (c) 2024, The PyTK developers. +# Distributed under a BSD-3-Clause license. +# See the LICENSE file for details. + +"""Conversation History Component for VTK Prompt UI.""" + +from typing import Any + +from trame.widgets import html +from trame.widgets import vuetify3 as vuetify + + +def build_conversation_history(app: Any) -> None: + """Build the conversation history component with clickable conversation cards.""" + # Bottom: Conversation History + with vuetify.VCard(classes="h-75 w-100 mt-2"): + with vuetify.VCardTitle("Conversation History", classes="d-flex align-center"): + vuetify.VSpacer() + + with vuetify.VCardText(style="height: calc(100% - 50px); overflow-y: auto;"): + # Show message when no history + with vuetify.VAlert( + text="No conversation history yet." + " Start by generating some VTK code!", + type="info", + variant="tonal", + v_show="conversation_navigation.length === 0", + ): + pass + + # Conversation history list + with vuetify.VCard( + v_for=( + "(pair, idx) in (history_sort_order === 'newest'" + + " ? conversation_navigation.slice().reverse()" + + " : conversation_navigation)" + ), + key="idx", + density="compact", + v_show="conversation_navigation.length > 0", + color=( + "conversation_index === idx ? 'primary' : 'secondary'", + "secondary", + ), + variant=( + "conversation_index === idx ? 'outlined' : 'default'", + "default", + ), + ): + with vuetify.VCardText( + click=(app.ctrl.navigate_to_conversation, "[idx]"), + rounded=True, + classes="mb-2", + ): + # User query preview + html.Span( + "{{ (pair.user.content.includes('')" + + " ? pair.user.content.split('')[1]" + + " : pair.user.content).trim() }}" + ) From 0ec2a4ac6ba9bb48c8825e3b2413a3fb9f45b191 Mon Sep 17 00:00:00 2001 From: Brianna Major Date: Wed, 11 Mar 2026 14:24:02 -0400 Subject: [PATCH 4/6] Add the ability to sort conversation history Signed-off-by: Brianna Major --- src/vtk_prompt/state/initializer.py | 1 + .../ui/layout/conversation_history.py | 51 ++++++++++++++++--- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/src/vtk_prompt/state/initializer.py b/src/vtk_prompt/state/initializer.py index 66ce7a6..9f4c48a 100644 --- a/src/vtk_prompt/state/initializer.py +++ b/src/vtk_prompt/state/initializer.py @@ -46,6 +46,7 @@ def initialize_state(app: Any) -> None: app.state.can_navigate_left = False app.state.can_navigate_right = False app.state.is_viewing_history = False + app.state.history_sort_order = "newest" # Conversation history sort order # Prompt file state variables app.state.prompt_object = None diff --git a/src/vtk_prompt/ui/layout/conversation_history.py b/src/vtk_prompt/ui/layout/conversation_history.py index 41da142..2194ff4 100644 --- a/src/vtk_prompt/ui/layout/conversation_history.py +++ b/src/vtk_prompt/ui/layout/conversation_history.py @@ -18,15 +18,36 @@ def build_conversation_history(app: Any) -> None: with vuetify.VCardTitle("Conversation History", classes="d-flex align-center"): vuetify.VSpacer() + # Sort toggle button + with vuetify.VTooltip(text="Toggle sort order", location="bottom"): + with vuetify.Template(v_slot_activator="{ props }"): + vuetify.VBtn( + icon=( + "history_sort_order === 'newest'" + + " ? 'mdi-sort-descending' : 'mdi-sort-ascending'", + "mdi-sort-descending", + ), + click=( + "history_sort_order = " + + "(history_sort_order === 'newest')" + + " ? 'oldest' : 'newest'" + ), + variant="text", + density="compact", + color="primary", + v_bind="props", + ) + + # TODO: Filter by favorited prompts + with vuetify.VCardText(style="height: calc(100% - 50px); overflow-y: auto;"): # Show message when no history - with vuetify.VAlert( + vuetify.VAlert( text="No conversation history yet." + " Start by generating some VTK code!", type="info", variant="tonal", v_show="conversation_navigation.length === 0", - ): - pass + ) # Conversation history list with vuetify.VCard( @@ -39,16 +60,34 @@ def build_conversation_history(app: Any) -> None: density="compact", v_show="conversation_navigation.length > 0", color=( - "conversation_index === idx ? 'primary' : 'secondary'", + "conversation_index === (history_sort_order === 'newest'" + + " ? (conversation_navigation.length - 1 - idx) : idx)" + + " ? 'primary' : 'secondary'", "secondary", ), variant=( - "conversation_index === idx ? 'outlined' : 'default'", + "conversation_index === (history_sort_order === 'newest'" + + " ? (conversation_navigation.length - 1 - idx) : idx)" + + " ? 'outlined' : 'default'", "default", ), ): + # TODO: Track favorited prompts + with vuetify.VCardTitle(classes="text-end"): + vuetify.VIcon( + click=("favorited = !favorited",), + icon=( + "favorited ? 'mdi-heart' : 'mdi-heart-outline'", + "mdi-heart-outline", + ), + size="small", + ) with vuetify.VCardText( - click=(app.ctrl.navigate_to_conversation, "[idx]"), + click=( + app.ctrl.navigate_to_conversation, + "[history_sort_order === 'newest' ? " + + " (conversation_navigation.length - 1 - idx) : idx]", + ), rounded=True, classes="mb-2", ): From 0c8176db78b80ee4281e5675fc5da60a278a2c07 Mon Sep 17 00:00:00 2001 From: Brianna Major Date: Wed, 11 Mar 2026 14:51:25 -0400 Subject: [PATCH 5/6] Support favoriting historical prompts Signed-off-by: Brianna Major --- src/vtk_prompt/controllers/conversation.py | 16 +++++ src/vtk_prompt/state/initializer.py | 2 + .../ui/layout/conversation_history.py | 71 ++++++++++++++----- src/vtk_prompt/vtk_prompt_ui.py | 5 ++ 4 files changed, 76 insertions(+), 18 deletions(-) diff --git a/src/vtk_prompt/controllers/conversation.py b/src/vtk_prompt/controllers/conversation.py index ef8ca70..7791959 100644 --- a/src/vtk_prompt/controllers/conversation.py +++ b/src/vtk_prompt/controllers/conversation.py @@ -97,6 +97,22 @@ def navigate_to_conversation(app: Any, target_index: int) -> None: _update_navigation_state(app) +def toggle_favorite_conversation(app: Any, conversation_index: int) -> None: + """Toggle favorite status for a conversation by index.""" + if not hasattr(app.state, "favorited_conversations"): + app.state.favorited_conversations = [] + + current_favorites = app.state.favorited_conversations[:] + + if conversation_index in current_favorites: + current_favorites.remove(conversation_index) + else: + current_favorites.append(conversation_index) + + # Force reactivity by replacing the entire array + app.state.favorited_conversations = current_favorites + + def save_conversation(app: Any) -> str: """Save current conversation history as JSON string.""" if hasattr(app, "prompt_client") and app.prompt_client is not None: diff --git a/src/vtk_prompt/state/initializer.py b/src/vtk_prompt/state/initializer.py index 9f4c48a..ba9acce 100644 --- a/src/vtk_prompt/state/initializer.py +++ b/src/vtk_prompt/state/initializer.py @@ -47,6 +47,8 @@ def initialize_state(app: Any) -> None: app.state.can_navigate_right = False app.state.is_viewing_history = False app.state.history_sort_order = "newest" # Conversation history sort order + app.state.favorited_conversations = [] # List of favorited conversation indices + app.state.history_filter_mode = "all" # Filter mode: "all" or "favorites" # Prompt file state variables app.state.prompt_object = None diff --git a/src/vtk_prompt/ui/layout/conversation_history.py b/src/vtk_prompt/ui/layout/conversation_history.py index 2194ff4..90d0c65 100644 --- a/src/vtk_prompt/ui/layout/conversation_history.py +++ b/src/vtk_prompt/ui/layout/conversation_history.py @@ -35,10 +35,36 @@ def build_conversation_history(app: Any) -> None: variant="text", density="compact", color="primary", + disabled=("conversation_navigation.length === 0", False), v_bind="props", ) - # TODO: Filter by favorited prompts + # Filter toggle button + with vuetify.VTooltip(text="Toggle favorites filter", location="bottom"): + with vuetify.Template(v_slot_activator="{ props }"): + vuetify.VBtn( + icon=( + "history_filter_mode === 'favorites'" + + " ? 'mdi-heart' : 'mdi-heart-off'", + "mdi-format-list-bulleted", + ), + click=( + "history_filter_mode = (history_filter_mode === 'all')" + + " ? 'favorites' : 'all'" + ), + variant="text", + density="compact", + color=( + "history_filter_mode === 'favorites' ? 'red' : 'primary'", + "primary", + ), + disabled=( + "conversation_navigation.length === 0" + + " || favorited_conversations.length === 0", + False, + ), + v_bind="props", + ) with vuetify.VCardText(style="height: calc(100% - 50px); overflow-y: auto;"): # Show message when no history @@ -52,48 +78,57 @@ def build_conversation_history(app: Any) -> None: # Conversation history list with vuetify.VCard( v_for=( - "(pair, idx) in (history_sort_order === 'newest'" + "item in (history_sort_order === 'newest'" + " ? conversation_navigation.slice().reverse()" - + " : conversation_navigation)" + + ".map((pair, idx) => ({pair, originalIndex: " + + "conversation_navigation.length - 1 - idx}))" + + " : conversation_navigation.map((pair, idx) => " + + "({pair, originalIndex: idx})))" + + ".filter(item => history_filter_mode === 'all' || " + + "favorited_conversations.includes(item.originalIndex))" ), - key="idx", + key="item.originalIndex", density="compact", v_show="conversation_navigation.length > 0", color=( - "conversation_index === (history_sort_order === 'newest'" - + " ? (conversation_navigation.length - 1 - idx) : idx)" - + " ? 'primary' : 'secondary'", + "conversation_index === item.originalIndex" + " ? 'primary' : 'secondary'", "secondary", ), variant=( - "conversation_index === (history_sort_order === 'newest'" - + " ? (conversation_navigation.length - 1 - idx) : idx)" - + " ? 'outlined' : 'default'", + "conversation_index === item.originalIndex" + " ? 'outlined' : 'default'", "default", ), ): - # TODO: Track favorited prompts + # Track favorited prompts with vuetify.VCardTitle(classes="text-end"): vuetify.VIcon( - click=("favorited = !favorited",), + click=( + app.ctrl.toggle_favorite_conversation, + "[item.originalIndex]", + ), icon=( - "favorited ? 'mdi-heart' : 'mdi-heart-outline'", + "favorited_conversations.includes(item.originalIndex) ? " + + "'mdi-heart' : 'mdi-heart-outline'", "mdi-heart-outline", ), size="small", + color=( + "favorited_conversations.includes(item.originalIndex) ? " + + "'red' : 'grey'", + "grey", + ), ) with vuetify.VCardText( click=( app.ctrl.navigate_to_conversation, - "[history_sort_order === 'newest' ? " - + " (conversation_navigation.length - 1 - idx) : idx]", + "[item.originalIndex]", ), rounded=True, classes="mb-2", ): # User query preview html.Span( - "{{ (pair.user.content.includes('')" - + " ? pair.user.content.split('')[1]" - + " : pair.user.content).trim() }}" + "{{ (item.pair.user.content.includes('')" + + " ? item.pair.user.content.split('')[1]" + + " : item.pair.user.content).trim() }}" ) diff --git a/src/vtk_prompt/vtk_prompt_ui.py b/src/vtk_prompt/vtk_prompt_ui.py index 722b1ab..1f3d7cd 100644 --- a/src/vtk_prompt/vtk_prompt_ui.py +++ b/src/vtk_prompt/vtk_prompt_ui.py @@ -208,6 +208,11 @@ def navigate_to_conversation(self, target_index: int) -> None: """Navigate directly to a specific conversation pair.""" conversation.navigate_to_conversation(self, target_index) + @controller.set("toggle_favorite_conversation") + def toggle_favorite_conversation(self, conversation_index: int) -> None: + """Toggle favorite status for a conversation.""" + conversation.toggle_favorite_conversation(self, conversation_index) + @trigger("save_conversation") def save_conversation(self) -> str: """Save current conversation history as JSON string.""" From 0bd71c992460e50f0df41a617f97b99112169046 Mon Sep 17 00:00:00 2001 From: Brianna Major Date: Thu, 9 Apr 2026 09:21:59 -0400 Subject: [PATCH 6/6] Prevent container overflow on page Signed-off-by: Brianna Major --- src/vtk_prompt/ui/layout/content.py | 2 +- src/vtk_prompt/ui/layout/conversation_history.py | 3 ++- src/vtk_prompt/vtk_prompt_ui.py | 5 ++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/vtk_prompt/ui/layout/content.py b/src/vtk_prompt/ui/layout/content.py index 80402a4..483b169 100644 --- a/src/vtk_prompt/ui/layout/content.py +++ b/src/vtk_prompt/ui/layout/content.py @@ -22,7 +22,7 @@ def build_content(layout: Any, app: Any) -> None: ): with vuetify.VRow(rows=12, classes="fill-height px-4 pt-1 pb-1"): # Left column - Prompt and conversation history - with vuetify.VCol(cols=3): + with vuetify.VCol(cols=3, classes="fill-height"): # Prompt input with vuetify.VCard(classes="h-25"): with vuetify.VCardText(classes="h-100"): diff --git a/src/vtk_prompt/ui/layout/conversation_history.py b/src/vtk_prompt/ui/layout/conversation_history.py index 90d0c65..49d26f6 100644 --- a/src/vtk_prompt/ui/layout/conversation_history.py +++ b/src/vtk_prompt/ui/layout/conversation_history.py @@ -130,5 +130,6 @@ def build_conversation_history(app: Any) -> None: html.Span( "{{ (item.pair.user.content.includes('')" + " ? item.pair.user.content.split('')[1]" - + " : item.pair.user.content).trim() }}" + + " : item.pair.user.content)" + + ".trim().replace(/^Request:\\s*/i, '') }}" ) diff --git a/src/vtk_prompt/vtk_prompt_ui.py b/src/vtk_prompt/vtk_prompt_ui.py index 1f3d7cd..7fd9ffc 100644 --- a/src/vtk_prompt/vtk_prompt_ui.py +++ b/src/vtk_prompt/vtk_prompt_ui.py @@ -234,7 +234,7 @@ def _build_ui(self) -> None: self.state.main_drawer = False with SinglePageLayout( - self.server, theme=("theme_mode", "light"), style="max-height: 100vh;" + self.server, theme=("theme_mode", "light"), style="max-height: 100vh; overflow: hidden;" ) as layout: layout.title.set_text("VTK Prompt UI") @@ -243,6 +243,9 @@ def _build_ui(self) -> None: build_content(layout, self) build_settings_dialog(layout, self) + with layout.footer as footer: + footer.hide() + def start(self) -> None: """Start the trame server.""" self.server.start()