You've already forked agentic-coding-workflow
feat(web): PromptInput component (Send/Cancel toggle)
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
|
||||
const props = defineProps<{
|
||||
disabled: boolean
|
||||
isPrompting: boolean
|
||||
}>()
|
||||
|
||||
const emit = defineEmits<{
|
||||
(e: 'send', text: string): void
|
||||
(e: 'cancel'): void
|
||||
}>()
|
||||
|
||||
const text = ref('')
|
||||
|
||||
function submit() {
|
||||
if (props.disabled) return
|
||||
if (props.isPrompting) {
|
||||
emit('cancel')
|
||||
return
|
||||
}
|
||||
const t = text.value.trim()
|
||||
if (!t) return
|
||||
emit('send', t)
|
||||
text.value = ''
|
||||
}
|
||||
|
||||
function onKeydown(ev: KeyboardEvent) {
|
||||
// Enter (no Shift) → submit. Shift+Enter → newline.
|
||||
if (ev.key === 'Enter' && !ev.shiftKey) {
|
||||
ev.preventDefault()
|
||||
submit()
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<form class="flex gap-2 items-end" @submit.prevent="submit">
|
||||
<textarea
|
||||
v-model="text"
|
||||
class="flex-1 resize-none border rounded px-2 py-1 text-sm"
|
||||
rows="2"
|
||||
:placeholder="disabled ? 'Session ended' : 'Type a prompt...'"
|
||||
:disabled="disabled || isPrompting"
|
||||
@keydown="onKeydown"
|
||||
/>
|
||||
<button
|
||||
type="submit"
|
||||
class="px-3 py-1 rounded text-sm font-medium border"
|
||||
:class="
|
||||
isPrompting
|
||||
? 'bg-yellow-100 border-yellow-300 text-yellow-800 hover:bg-yellow-200'
|
||||
: 'bg-blue-600 border-blue-600 text-white hover:bg-blue-700 disabled:bg-gray-300 disabled:border-gray-300 disabled:text-gray-500'
|
||||
"
|
||||
:disabled="disabled || (!isPrompting && !text.trim())"
|
||||
>
|
||||
{{ isPrompting ? 'Cancel' : 'Send' }}
|
||||
</button>
|
||||
</form>
|
||||
</template>
|
||||
Reference in New Issue
Block a user