This document provides an overview of the workspace component architecture in the Prompt Optimizer application. Workspaces are the primary user interfaces for prompt optimization, organized by function mode (basic, context, image) and optimization mode (system vs user). This page covers the common architectural patterns, split-pane layout system, and integration points shared across all workspace types.
For detailed information about specific workspace implementations, see:
For information about how workspaces are integrated into the application shell, see Application Shell and Internationalization.
The application defines six distinct workspace types, organized in a two-dimensional matrix:
| Function Mode | Optimization Mode: System | Optimization Mode: User |
|---|---|---|
| Basic | BasicSystemWorkspace | BasicUserWorkspace |
| Context/Pro | ContextSystemWorkspace | ContextUserWorkspace |
| Image | ImageText2ImageWorkspace | ImageImage2ImageWorkspace |
Function Mode determines the complexity and feature set:
Optimization Mode determines the prompt optimization target:
Sources: packages/ui/src/i18n/locales/en-US.ts110-123 packages/ui/src/components/app-layout/PromptOptimizerApp.vue55-68
Each workspace component:
<RouterView> in PromptOptimizerAppdata-mode attribute for testing and analyticsSources: packages/ui/src/components/app-layout/PromptOptimizerApp.vue55-68 packages/ui/src/components/context-mode/ContextUserWorkspace.vue14 packages/ui/src/components/context-mode/ContextSystemWorkspace.vue2
All workspace components implement a consistent three-column grid layout:
Grid Template Columns: ${mainSplitLeftPct}% 12px 1fr
mainSplitLeftPct (default 50%)1fr)The divider supports both pointer and keyboard interactions:
Pointer Events:
@pointerdown: Captures pointer, starts drag trackingpointermove: Updates split percentagepointerup: Releases pointer, saves to preferencesKeyboard Events (@keydown):
ArrowLeft: Decrease left pane widthArrowRight: Increase left pane widthShift: Larger increments (5% vs 1%)Constraints:
PreferenceServiceSources: packages/ui/src/components/context-mode/ContextUserWorkspace.vue189-197 packages/ui/src/components/basic-mode/BasicSystemWorkspace.vue123-131
All workspaces implement a collapsible input panel to maximize vertical space for optimization results:
Collapsed State (title bar only):
Expanded State (full panel):
InputPanelUI componentImplementation:
Sources: packages/ui/src/components/context-mode/ContextUserWorkspace.vue28-63 packages/ui/src/components/basic-mode/BasicSystemWorkspace.vue19-55
| Workspace Type | Unique Left Pane Features |
|---|---|
| ContextSystemWorkspace | Includes ConversationManager for multi-message editing |
| ContextUserWorkspace | Variable management preview, no conversation manager |
| ImageText2ImageWorkspace | No additional input, prompt optimization only |
| ImageImage2ImageWorkspace | Image upload UI (file selection + preview) |
| BasicSystemWorkspace | Simple single-prompt input |
| BasicUserWorkspace | Simple single-prompt input |
Sources: packages/ui/src/components/context-mode/ContextSystemWorkspace.vue15-49 packages/ui/src/components/image-mode/ImageImage2ImageWorkspace.vue142-196
Context workspaces use a specialized two-tier architecture:
Variables-Only Mode (used by ContextUserWorkspace and ContextSystemWorkspace):
TemporaryVariablesPanelFull Mode (used by BasicSystemWorkspace and BasicUserWorkspace):
Mode Selection Logic:
Sources: packages/ui/src/components/context-mode/ContextUserWorkspace.vue201-218 packages/ui/src/components/context-mode/ContextUserTestPanel.vue128-185 packages/ui/src/components/basic-mode/BasicSystemWorkspace.vue141-165
Context mode workspaces implement a sophisticated multi-column test grid:
Variant Configuration:
Grid Layout Calculation:
Sources: packages/ui/src/components/context-mode/ContextUserWorkspace.vue220-277 packages/ui/src/components/context-mode/ContextSystemWorkspace.vue176-232
Each workspace type integrates with a dedicated Pinia session store:
| Workspace Component | Session Store | Key State Properties |
|---|---|---|
| BasicSystemWorkspace | useBasicSystemSession | prompt, optimizedPrompt, selectedModelKey, selectedTemplateId |
| BasicUserWorkspace | useBasicUserSession | prompt, optimizedPrompt, selectedModelKey, selectedTemplateId |
| ContextSystemWorkspace | useProMultiMessageSession | conversationMessages, selectedMessageId, messageOptimizations |
| ContextUserWorkspace | useProVariableSession | prompt, optimizedPrompt, temporaryVariables |
| ImageText2ImageWorkspace | useImageText2ImageSession | originalPrompt, selectedTextModelKey, selectedImageModelKey |
| ImageImage2ImageWorkspace | useImageImage2ImageSession | originalPrompt, uploadedImage, previewImageUrl |
Session Restoration:
useSessionRestoreCoordinator composableSources: packages/ui/src/components/app-layout/PromptOptimizerApp.vue296-307 packages/ui/src/stores/session/useSessionManager.ts1-50
Sources: packages/ui/src/components/app-layout/PromptOptimizerApp.vue615-655
All workspaces emit standardized events that are handled by PromptOptimizerApp:
Core Events:
| Event Name | Payload | Purpose |
|---|---|---|
config-model | type?: 'text' | 'image' | Opens ModelManagerUI |
config-template | type: TemplateType | Opens TemplateManagerUI |
save-favorite | { content: string, originalContent?: string } | Opens SaveFavoriteDialog |
open-variable-manager | focusVariable?: string | Opens VariableManagerModal |
open-tool-manager | void | Opens ToolManagerModal (Context mode) |
open-preview | { content: string, mode: ContextMode } | Opens PromptPreviewPanel |
message-change | (index, message, action) | Handles conversation updates |
Sources: packages/ui/src/components/context-mode/ContextUserWorkspace.vue169-183 packages/ui/src/components/app-layout/PromptOptimizerApp.vue44-52
Workspaces receive services via props rather than direct service imports:
Benefits:
Sources: packages/ui/src/components/app-layout/PromptOptimizerApp.vue508-516
| Component | Basic Workspaces | Context Workspaces | Image Workspaces | Purpose |
|---|---|---|---|---|
InputPanelUI | ✓ | ✓ | ✗ | Prompt input with model/template selection |
PromptPanelUI | ✓ | ✓ | ✓ | Optimization result display with version control |
TestAreaPanel | ✓ | ✗ | ✓ | Complete test UI (basic/image modes) |
ContextUserTestPanel | ✗ | ✓ (User) | ✗ | Variable-aware test panel |
ConversationTestPanel | ✗ | ✓ (System) | ✗ | Conversation-aware test panel |
ConversationManager | ✗ | ✓ (System only) | ✗ | Multi-message conversation editor |
TemporaryVariablesPanel | ✗ | ✓ | ✗ | Variable value input form |
SelectWithConfig | ✓ | ✓ | ✓ | Model/template selector with config button |
OutputDisplay | ✓ | ✓ | ✓ | Markdown/text result rendering |
EvaluationScoreBadge | ✓ | ✓ | ✓ | Evaluation score display |
Sources: packages/ui/src/components/context-mode/ContextUserWorkspace.vue66-94 packages/ui/src/components/basic-mode/BasicSystemWorkspace.vue58-100 packages/ui/src/components/TestAreaPanel.vue1-45
InputPanelUI Integration:
PromptPanelUI Integration:
Sources: packages/ui/src/components/basic-mode/BasicSystemWorkspace.vue58-100 packages/ui/src/components/basic-mode/BasicSystemWorkspace.vue129-157
All workspaces use useResponsive() composable for consistent responsive behavior:
Breakpoint Rules:
Layout Adaptations:
Sources: packages/ui/src/components/context-mode/ContextUserWorkspace.vue233-234 packages/ui/src/composables/ui/useResponsive.ts1-50
Split pane positions are persisted per workspace type:
This allows users to customize layouts independently for each workspace type.
Sources: packages/ui/src/components/basic-mode/BasicSystemWorkspace.vue180-210
Lazy Rendering:
v-if to completely unmount when closedDebounced Operations:
Performance Monitoring:
Sources: packages/ui/src/components/context-mode/ContextUserTestPanel.vue117-120 packages/ui/src/components/basic-mode/BasicSystemWorkspace.vue195-220
Cleanup on Unmount:
Sources: packages/ui/src/components/TestAreaPanel.vue250-270
All workspaces implement consistent test ID patterns:
Test ID Conventions:
data-testid="workspace"data-mode="[mode-key]"[prefix]-[action] (e.g., basic-system-optimize)[prefix]-[field] (e.g., pro-variable-input)[prefix]-variant-[id]-[element] (e.g., pro-multi-variant-a-model)Sources: packages/ui/src/components/context-mode/ContextUserWorkspace.vue14 packages/ui/src/components/basic-mode/BasicSystemWorkspace.vue4-5
Split Divider Accessibility:
Button Labels:
:aria-label and :title attributesaria-busySources: packages/ui/src/components/context-mode/ContextUserWorkspace.vue189-197
Refresh this wiki