diff --git a/ui-tui/src/app/uiStore.ts b/ui-tui/src/app/uiStore.ts index b3d5a942c7..ea592700b7 100644 --- a/ui-tui/src/app/uiStore.ts +++ b/ui-tui/src/app/uiStore.ts @@ -1,4 +1,4 @@ -import { atom } from 'nanostores' +import { atom, computed } from 'nanostores' import { MOUSE_TRACKING } from '../config/env.js' import { ZERO } from '../domain/usage.js' @@ -30,6 +30,9 @@ const buildUiState = (): UiState => ({ export const $uiState = atom(buildUiState()) +export const $uiTheme = computed($uiState, state => state.theme) +export const $uiSessionId = computed($uiState, state => state.sid) + export const getUiState = () => $uiState.get() export const patchUiState = (next: Partial | ((state: UiState) => UiState)) => diff --git a/ui-tui/src/components/appOverlays.tsx b/ui-tui/src/components/appOverlays.tsx index 1e33559f0a..e4a80ba816 100644 --- a/ui-tui/src/components/appOverlays.tsx +++ b/ui-tui/src/components/appOverlays.tsx @@ -4,7 +4,7 @@ import { useStore } from '@nanostores/react' import { useGateway } from '../app/gatewayContext.js' import type { AppOverlaysProps } from '../app/interfaces.js' import { $overlayState, patchOverlayState } from '../app/overlayStore.js' -import { $uiState } from '../app/uiStore.js' +import { $uiSessionId, $uiTheme } from '../app/uiStore.js' import { FloatBox } from './appChrome.js' import { MaskedPrompt } from './maskedPrompt.js' @@ -24,12 +24,12 @@ export function PromptZone({ onSudoSubmit }: Pick) { const overlay = useStore($overlayState) - const ui = useStore($uiState) + const theme = useStore($uiTheme) if (overlay.approval) { return ( - + ) } @@ -46,7 +46,7 @@ export function PromptZone({ return ( - + ) } @@ -59,7 +59,7 @@ export function PromptZone({ onAnswer={onClarifyAnswer} onCancel={() => onClarifyAnswer('')} req={overlay.clarify} - t={ui.theme} + t={theme} /> ) @@ -68,7 +68,7 @@ export function PromptZone({ if (overlay.sudo) { return ( - + ) } @@ -82,7 +82,7 @@ export function PromptZone({ label={overlay.secret.prompt} onSubmit={onSecretSubmit} sub={`for ${overlay.secret.envVar}`} - t={ui.theme} + t={theme} /> ) @@ -101,7 +101,8 @@ export function FloatingOverlays({ }: Pick) { const { gw } = useGateway() const overlay = useStore($overlayState) - const ui = useStore($uiState) + const sid = useStore($uiSessionId) + const theme = useStore($uiTheme) const hasAny = overlay.modelPicker || overlay.pager || overlay.picker || overlay.skillsHub || completions.length @@ -119,40 +120,40 @@ export function FloatingOverlays({ return ( {overlay.picker && ( - + patchOverlayState({ picker: false })} onSelect={onPickerSelect} - t={ui.theme} + t={theme} /> )} {overlay.modelPicker && ( - + patchOverlayState({ modelPicker: false })} onSelect={onModelSelect} - sessionId={ui.sid} - t={ui.theme} + sessionId={sid} + t={theme} /> )} {overlay.skillsHub && ( - - patchOverlayState({ skillsHub: false })} t={ui.theme} /> + + patchOverlayState({ skillsHub: false })} t={theme} /> )} {overlay.pager && ( - + {overlay.pager.title && ( - + {overlay.pager.title} @@ -163,7 +164,7 @@ export function FloatingOverlays({ ))} - + {overlay.pager.offset + pagerPageSize < overlay.pager.lines.length ? `鈫戔啌/jk line 路 Enter/Space/PgDn page 路 b/PgUp back 路 g/G top/bottom 路 Esc/q close (${Math.min(overlay.pager.offset + pagerPageSize, overlay.pager.lines.length)}/${overlay.pager.lines.length})` : `end 路 鈫戔啌/jk 路 b/PgUp back 路 g top 路 Esc/q close (${overlay.pager.lines.length} lines)`} @@ -174,23 +175,23 @@ export function FloatingOverlays({ )} {!!completions.length && ( - + {completions.slice(start, start + viewportSize).map((item, i) => { const active = start + i === compIdx return ( - + {' '} {item.display} - {item.meta ? {item.meta} : null} + {item.meta ? {item.meta} : null} ) })}