mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-20 14:30:41 +00:00
## Summary - move queue batch controls to the left of the run button - align run control styling to the Figma queue modal spec using PrimeVue PT/Tailwind (secondary background on batch + dropdown, primary run button) - normalize control heights to match actionbar buttons and tighten dropdown hit area - update run typography/spacing and replace all three chevrons (dropdown + batch up/down) with the requested SVG Design: https://www.figma.com/design/LVilZgHGk5RwWOkVN6yCEK/Queue-Progress-Modal?node-id=3845-23904&m=dev <img width="303" height="122" alt="image" src="https://github.com/user-attachments/assets/4ed80ee7-3ceb-4512-96ce-f55ec6da835e" /> ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-9134-fix-align-run-controls-with-queue-modal-design-3106d73d36508160afcedbcfe4b98291) by [Unito](https://www.unito.io) --------- Co-authored-by: github-actions <github-actions@github.com> Co-authored-by: GitHub Action <action@github.com>
113 lines
2.8 KiB
Vue
113 lines
2.8 KiB
Vue
<template>
|
|
<div ref="rootEl" class="relative size-full overflow-hidden bg-neutral-900">
|
|
<div class="p-terminal size-full rounded-none p-2">
|
|
<div ref="terminalEl" class="terminal-host h-full" />
|
|
</div>
|
|
<Button
|
|
v-tooltip.left="{
|
|
value: tooltipText,
|
|
showDelay: 300
|
|
}"
|
|
icon="pi pi-copy"
|
|
severity="secondary"
|
|
size="small"
|
|
:class="
|
|
cn('absolute top-2 right-8 transition-opacity', {
|
|
'pointer-events-none opacity-0 select-none': !isHovered
|
|
})
|
|
"
|
|
:aria-label="tooltipText"
|
|
@click="handleCopy"
|
|
/>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { useElementHover, useEventListener } from '@vueuse/core'
|
|
import type { IDisposable } from '@xterm/xterm'
|
|
import Button from 'primevue/button'
|
|
import type { Ref } from 'vue'
|
|
import { computed, onMounted, onUnmounted, ref } from 'vue'
|
|
import { useI18n } from 'vue-i18n'
|
|
|
|
import { useTerminal } from '@/composables/bottomPanelTabs/useTerminal'
|
|
import { electronAPI, isElectron } from '@/utils/envUtil'
|
|
import { cn } from '@/utils/tailwindUtil'
|
|
|
|
const { t } = useI18n()
|
|
|
|
const emit = defineEmits<{
|
|
created: [ReturnType<typeof useTerminal>, Ref<HTMLElement | undefined>]
|
|
unmounted: []
|
|
}>()
|
|
const terminalEl = ref<HTMLElement | undefined>()
|
|
const rootEl = ref<HTMLElement | undefined>()
|
|
const hasSelection = ref(false)
|
|
|
|
const isHovered = useElementHover(rootEl)
|
|
|
|
const terminalData = useTerminal(terminalEl)
|
|
emit('created', terminalData, ref(rootEl))
|
|
|
|
const { terminal } = terminalData
|
|
let selectionDisposable: IDisposable | undefined
|
|
|
|
const tooltipText = computed(() => {
|
|
return hasSelection.value
|
|
? t('serverStart.copySelectionTooltip')
|
|
: t('serverStart.copyAllTooltip')
|
|
})
|
|
|
|
const handleCopy = async () => {
|
|
const existingSelection = terminal.getSelection()
|
|
const shouldSelectAll = !existingSelection
|
|
if (shouldSelectAll) terminal.selectAll()
|
|
|
|
const selectedText = shouldSelectAll
|
|
? terminal.getSelection()
|
|
: existingSelection
|
|
|
|
if (selectedText) {
|
|
await navigator.clipboard.writeText(selectedText)
|
|
|
|
if (shouldSelectAll) {
|
|
terminal.clearSelection()
|
|
}
|
|
}
|
|
}
|
|
|
|
const showContextMenu = (event: MouseEvent) => {
|
|
event.preventDefault()
|
|
electronAPI()?.showContextMenu({ type: 'text' })
|
|
}
|
|
|
|
if (isElectron()) {
|
|
useEventListener(terminalEl, 'contextmenu', showContextMenu)
|
|
}
|
|
|
|
onMounted(() => {
|
|
selectionDisposable = terminal.onSelectionChange(() => {
|
|
hasSelection.value = terminal.hasSelection()
|
|
})
|
|
})
|
|
|
|
onUnmounted(() => {
|
|
selectionDisposable?.dispose()
|
|
emit('unmounted')
|
|
})
|
|
</script>
|
|
|
|
<style scoped>
|
|
/* xterm renders its internal DOM outside Vue templates, so :deep selectors are
|
|
* required to style those generated nodes.
|
|
*/
|
|
:deep(.p-terminal) .xterm {
|
|
overflow: hidden;
|
|
}
|
|
|
|
:deep(.p-terminal) .xterm-screen {
|
|
overflow: hidden;
|
|
background-color: var(--color-neutral-900);
|
|
}
|
|
</style>
|