fix: replace huge logo form with compact centered modal for new download screen

This commit is contained in:
itexpert228 2026-07-20 19:18:11 +03:00
parent 832ed6f81f
commit 1bb7d1e909

168
ui/ui.go
View file

@ -1346,120 +1346,98 @@ func (m model) viewSettings() string {
}
func (m model) viewNewDownload() string {
w := m.width
if w < 80 {
w = 80
}
header := m.renderLogo()
// Форма
labels := []string{" Торрент-файл ", " Папка загрузки", " TG Токен "}
icons := []string{" ", " ", " "}
var formRows []string
for i := range m.inputs {
labelStyle := lipgloss.NewStyle().
Foreground(lipgloss.Color(ColorSubdued)).
Width(18)
if i == m.focusedInput {
labelStyle = labelStyle.Foreground(lipgloss.Color(ColorCyan)).Bold(true)
}
indicator := " "
if i == m.focusedInput {
indicator = lipgloss.NewStyle().Foreground(lipgloss.Color(ColorPink)).Render("▶ ")
}
label := indicator + labelStyle.Render(icons[i]+labels[i])
// Кнопка «Обзор» только для поля торрент-файла
var browseHint string
if i == 0 {
browseHint = " " + lipgloss.NewStyle().
Foreground(lipgloss.Color(ColorPink)).
// ── Заголовок модалки ──
title := lipgloss.NewStyle().
Bold(true).
Render("[F] Открыть проводник")
}
Foreground(lipgloss.Color(ColorCyan)).
Render("⚡ НОВЫЙ ТОРРЕНТ")
inputView := m.inputs[i].View()
inputBoxStyle := lipgloss.NewStyle().
Border(lipgloss.RoundedBorder()).
Padding(0, 1).
Width(66)
subtitle := lipgloss.NewStyle().
Foreground(lipgloss.Color(ColorSubdued)).
Render("Укажите файл или вставьте magnet-ссылку")
// ── Поля ввода ──
labelNames := []string{"Торрент-файл", "Папка загрузки"}
inputW := 60
var fieldRows []string
for i := 0; i < 2; i++ {
// метка
labelSt := lipgloss.NewStyle().Foreground(lipgloss.Color(ColorSubdued))
if i == m.focusedInput {
inputBoxStyle = inputBoxStyle.BorderForeground(lipgloss.Color(ColorCyan))
} else {
inputBoxStyle = inputBoxStyle.BorderForeground(lipgloss.Color(ColorBorder))
labelSt = labelSt.Foreground(lipgloss.Color(ColorCyan)).Bold(true)
}
cursor := " "
if i == m.focusedInput {
cursor = lipgloss.NewStyle().Foreground(lipgloss.Color(ColorPink)).Render("▶ ")
}
labelLine := cursor + labelSt.Render(labelNames[i])
// browse hint рядом с меткой
if i == 0 {
hint := lipgloss.NewStyle().Foreground(lipgloss.Color(ColorPink)).Render(" [F] выбрать файл")
labelLine = lipgloss.JoinHorizontal(lipgloss.Center, labelLine, hint)
}
formRows = append(formRows, lipgloss.JoinVertical(lipgloss.Left,
lipgloss.JoinHorizontal(lipgloss.Center, label, browseHint),
inputBoxStyle.Render(inputView),
))
// поле ввода
m.inputs[i].Width = inputW
borderColor := ColorBorder
if i == m.focusedInput {
borderColor = ColorCyan
}
inputBox := lipgloss.NewStyle().
Border(lipgloss.RoundedBorder()).
BorderForeground(lipgloss.Color(borderColor)).
Padding(0, 1).
Width(inputW + 2).
Render(m.inputs[i].View())
fieldRows = append(fieldRows, labelLine, inputBox, "")
}
formInner := lipgloss.JoinVertical(lipgloss.Left,
formRows[0],
"",
formRows[1],
)
boxWidth := 85
centeredFormInner := lipgloss.PlaceHorizontal(boxWidth, lipgloss.Center, formInner)
boxContent := lipgloss.NewStyle().Padding(2, 0).Render(centeredFormInner)
formBox := lipgloss.NewStyle().
Border(lipgloss.ThickBorder()).
BorderForeground(lipgloss.Color(ColorBorder)).
MarginTop(1).
Width(boxWidth).
Render(boxContent)
// Кнопка
btnStyle := lipgloss.NewStyle().
// ── Кнопка ──
btn := lipgloss.NewStyle().
Background(lipgloss.Color(ColorCyan)).
Foreground(lipgloss.Color("#0b1017")).
Bold(true).
Padding(0, 4).
MarginTop(1)
btn := btnStyle.Render("▶ НАЧАТЬ СКАЧИВАНИЕ [ Enter ]")
Padding(0, 3).
Render("▶ НАЧАТЬ [ Enter ]")
// Ошибка
errBlock := ""
// ── Ошибка ──
errLine := ""
if m.validationErr != "" {
errBlock = "\n" + lipgloss.NewStyle().
errLine = lipgloss.NewStyle().
Foreground(lipgloss.Color(ColorRed)).
Bold(true).
Border(lipgloss.RoundedBorder()).
BorderForeground(lipgloss.Color(ColorRed)).
Padding(0, 2).
Render("✗ " + m.validationErr)
}
// Подсказки
help := lipgloss.NewStyle().
Foreground(lipgloss.Color(ColorSubdued)).
MarginTop(1).
Render(fmt.Sprintf(
"%s Tab — сменить поле %s F — выбрать файл %s Enter — начать %s Q — выйти %s ? — дополнительно",
lipgloss.NewStyle().Foreground(lipgloss.Color(ColorPink)).Render("●"),
lipgloss.NewStyle().Foreground(lipgloss.Color(ColorCyan)).Render("●"),
lipgloss.NewStyle().Foreground(lipgloss.Color(ColorCyan)).Render("●"),
lipgloss.NewStyle().Foreground(lipgloss.Color(ColorRed)).Render("●"),
lipgloss.NewStyle().Foreground(lipgloss.Color("#bd93f9")).Render("●"),
))
body := lipgloss.JoinVertical(lipgloss.Left,
header,
formBox,
errBlock,
btn,
help,
// ── Всё вместе в рамку ──
innerParts := []string{
title,
subtitle,
"",
}
innerParts = append(innerParts, fieldRows...)
innerParts = append(innerParts, btn)
if errLine != "" {
innerParts = append(innerParts, "", errLine)
}
innerParts = append(innerParts, "")
innerParts = append(innerParts,
lipgloss.NewStyle().Foreground(lipgloss.Color(ColorSubdued)).
Render("Tab — поле F — файл Enter — старт Esc — назад Q — выйти"),
)
return lipgloss.NewStyle().
Padding(2, 4).
Render(body)
inner := lipgloss.JoinVertical(lipgloss.Left, innerParts...)
modal := lipgloss.NewStyle().
Border(lipgloss.RoundedBorder()).
BorderForeground(lipgloss.Color(ColorCyan)).
Padding(1, 3).
Render(inner)
return lipgloss.Place(m.width, m.height, lipgloss.Center, lipgloss.Center, modal)
}
// ── Экран загрузки ────────────────────────────────────────────────────────────