use keymap state for layer visibility (#26246)

This commit is contained in:
Sebastian
2026-05-19 17:07:26 +02:00
committed by GitHub
parent 18b9cec50d
commit 8dd6448c90
17 changed files with 418 additions and 222 deletions
@@ -13,12 +13,11 @@ import { getScrollAcceleration } from "../../util/scroll"
import { useTuiConfig } from "../../context/tui-config"
import { useTheme, selectedForeground } from "@tui/context/theme"
import { SplitBorder } from "@tui/component/border"
import { useCommandPalette } from "../../context/command-palette"
import { useTerminalDimensions } from "@opentui/solid"
import { Locale } from "@/util/locale"
import type { PromptInfo } from "./history"
import { useFrecency } from "./frecency"
import { useBindings } from "../../keymap"
import { useBindings, useCommandSlashes, useOpencodeModeStack } from "../../keymap"
import { Reference } from "@/reference/reference"
import { ConfigReference } from "@/config/reference"
import { displayCharAt, mentionTriggerIndex } from "@/cli/cmd/prompt-display"
@@ -87,7 +86,8 @@ export function Autocomplete(props: {
const sdk = useSDK()
const sync = useSync()
const project = useProject()
const command = useCommandPalette()
const slashes = useCommandSlashes()
const modeStack = useOpencodeModeStack()
const { theme } = useTheme()
const dimensions = useTerminalDimensions()
const frecency = useFrecency()
@@ -101,6 +101,12 @@ export function Autocomplete(props: {
const [positionTick, setPositionTick] = createSignal(0)
createEffect(() => {
if (!store.visible) return
const popMode = modeStack.push("autocomplete")
onCleanup(popMode)
})
createEffect(() => {
if (store.visible) {
let lastPos = { x: 0, y: 0, width: 0 }
@@ -367,7 +373,6 @@ export function Autocomplete(props: {
const { filename, part } = createFilePart(item, lineRange)
const index = store.visible === "@" ? store.index : props.input().cursorOffset
command.suspend(false)
setStore("visible", false)
setStore("index", index)
insertPart(filename, part)
@@ -539,7 +544,7 @@ export function Autocomplete(props: {
)
const commands = createMemo((): AutocompleteOption[] => {
const results: AutocompleteOption[] = [...command.slashes()]
const results: AutocompleteOption[] = [...slashes()]
for (const serverCommand of sync.data.command) {
if (serverCommand.source === "skill") continue
@@ -730,7 +735,6 @@ export function Autocomplete(props: {
}))
function show(mode: "@" | "/") {
command.suspend(true)
setStore({
visible: mode,
index: props.input().cursorOffset,
@@ -747,7 +751,6 @@ export function Autocomplete(props: {
draft.input = props.input().plainText
})
}
command.suspend(false)
setStore("visible", false)
}