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

170
ui/ui.go
View file

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