From 1bb7d1e90954d7d7daa8c57f77f61d97268a8810 Mon Sep 17 00:00:00 2001 From: itexpert228 <67105314+fdaser1337@users.noreply.github.com> Date: Mon, 20 Jul 2026 19:18:11 +0300 Subject: [PATCH] fix: replace huge logo form with compact centered modal for new download screen --- ui/ui.go | 154 ++++++++++++++++++++++++------------------------------- 1 file changed, 66 insertions(+), 88 deletions(-) diff --git a/ui/ui.go b/ui/ui.go index d1dda7d..30c7952 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -1346,120 +1346,98 @@ func (m model) viewSettings() string { } func (m model) viewNewDownload() string { - w := m.width - if w < 80 { - w = 80 - } + // ── Заголовок модалки ── + title := lipgloss.NewStyle(). + Bold(true). + Foreground(lipgloss.Color(ColorCyan)). + Render("⚡ НОВЫЙ ТОРРЕНТ") - header := m.renderLogo() + subtitle := lipgloss.NewStyle(). + Foreground(lipgloss.Color(ColorSubdued)). + Render("Укажите файл или вставьте magnet-ссылку") - // Форма - labels := []string{" Торрент-файл ", " Папка загрузки", " TG Токен "} - icons := []string{" ", " ", " "} - var formRows []string - for i := range m.inputs { - labelStyle := lipgloss.NewStyle(). - Foreground(lipgloss.Color(ColorSubdued)). - Width(18) + // ── Поля ввода ── + labelNames := []string{"Торрент-файл", "Папка загрузки"} + inputW := 60 + + var fieldRows []string + for i := 0; i < 2; i++ { + // метка + labelSt := lipgloss.NewStyle().Foreground(lipgloss.Color(ColorSubdued)) if i == m.focusedInput { - labelStyle = labelStyle.Foreground(lipgloss.Color(ColorCyan)).Bold(true) + labelSt = labelSt.Foreground(lipgloss.Color(ColorCyan)).Bold(true) } - - indicator := " " + cursor := " " if i == m.focusedInput { - indicator = lipgloss.NewStyle().Foreground(lipgloss.Color(ColorPink)).Render("▶ ") + cursor = lipgloss.NewStyle().Foreground(lipgloss.Color(ColorPink)).Render("▶ ") } + labelLine := cursor + labelSt.Render(labelNames[i]) - label := indicator + labelStyle.Render(icons[i]+labels[i]) - - // Кнопка «Обзор» только для поля торрент-файла - var browseHint string + // browse hint рядом с меткой if i == 0 { - browseHint = " " + lipgloss.NewStyle(). - Foreground(lipgloss.Color(ColorPink)). - Bold(true). - Render("[F] Открыть проводник") + hint := lipgloss.NewStyle().Foreground(lipgloss.Color(ColorPink)).Render(" [F] выбрать файл") + labelLine = lipgloss.JoinHorizontal(lipgloss.Center, labelLine, hint) } - inputView := m.inputs[i].View() - inputBoxStyle := lipgloss.NewStyle(). - Border(lipgloss.RoundedBorder()). - Padding(0, 1). - Width(66) + // поле ввода + m.inputs[i].Width = inputW + borderColor := ColorBorder if i == m.focusedInput { - inputBoxStyle = inputBoxStyle.BorderForeground(lipgloss.Color(ColorCyan)) - } else { - inputBoxStyle = inputBoxStyle.BorderForeground(lipgloss.Color(ColorBorder)) + borderColor = ColorCyan } + inputBox := lipgloss.NewStyle(). + Border(lipgloss.RoundedBorder()). + BorderForeground(lipgloss.Color(borderColor)). + Padding(0, 1). + Width(inputW + 2). + Render(m.inputs[i].View()) - formRows = append(formRows, lipgloss.JoinVertical(lipgloss.Left, - lipgloss.JoinHorizontal(lipgloss.Center, label, browseHint), - inputBoxStyle.Render(inputView), - )) + 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) + 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) } // ── Экран загрузки ────────────────────────────────────────────────────────────