fix: replace huge logo form with compact centered modal for new download screen
This commit is contained in:
parent
832ed6f81f
commit
1bb7d1e909
1 changed files with 66 additions and 88 deletions
154
ui/ui.go
154
ui/ui.go
|
|
@ -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
|
Bold(true).
|
||||||
}
|
Foreground(lipgloss.Color(ColorCyan)).
|
||||||
|
Render("⚡ НОВЫЙ ТОРРЕНТ")
|
||||||
|
|
||||||
header := m.renderLogo()
|
subtitle := lipgloss.NewStyle().
|
||||||
|
Foreground(lipgloss.Color(ColorSubdued)).
|
||||||
|
Render("Укажите файл или вставьте magnet-ссылку")
|
||||||
|
|
||||||
// Форма
|
// ── Поля ввода ──
|
||||||
labels := []string{" Торрент-файл ", " Папка загрузки", " TG Токен "}
|
labelNames := []string{"Торрент-файл", "Папка загрузки"}
|
||||||
icons := []string{" ", " ", " "}
|
inputW := 60
|
||||||
var formRows []string
|
|
||||||
for i := range m.inputs {
|
var fieldRows []string
|
||||||
labelStyle := lipgloss.NewStyle().
|
for i := 0; i < 2; i++ {
|
||||||
Foreground(lipgloss.Color(ColorSubdued)).
|
// метка
|
||||||
Width(18)
|
labelSt := lipgloss.NewStyle().Foreground(lipgloss.Color(ColorSubdued))
|
||||||
if i == m.focusedInput {
|
if i == m.focusedInput {
|
||||||
labelStyle = labelStyle.Foreground(lipgloss.Color(ColorCyan)).Bold(true)
|
labelSt = labelSt.Foreground(lipgloss.Color(ColorCyan)).Bold(true)
|
||||||
}
|
}
|
||||||
|
cursor := " "
|
||||||
indicator := " "
|
|
||||||
if i == m.focusedInput {
|
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])
|
// browse hint рядом с меткой
|
||||||
|
|
||||||
// Кнопка «Обзор» только для поля торрент-файла
|
|
||||||
var browseHint string
|
|
||||||
if i == 0 {
|
if i == 0 {
|
||||||
browseHint = " " + lipgloss.NewStyle().
|
hint := lipgloss.NewStyle().Foreground(lipgloss.Color(ColorPink)).Render(" [F] выбрать файл")
|
||||||
Foreground(lipgloss.Color(ColorPink)).
|
labelLine = lipgloss.JoinHorizontal(lipgloss.Center, labelLine, hint)
|
||||||
Bold(true).
|
|
||||||
Render("[F] Открыть проводник")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inputView := m.inputs[i].View()
|
// поле ввода
|
||||||
inputBoxStyle := lipgloss.NewStyle().
|
m.inputs[i].Width = inputW
|
||||||
Border(lipgloss.RoundedBorder()).
|
borderColor := ColorBorder
|
||||||
Padding(0, 1).
|
|
||||||
Width(66)
|
|
||||||
if i == m.focusedInput {
|
if i == m.focusedInput {
|
||||||
inputBoxStyle = inputBoxStyle.BorderForeground(lipgloss.Color(ColorCyan))
|
borderColor = ColorCyan
|
||||||
} else {
|
|
||||||
inputBoxStyle = inputBoxStyle.BorderForeground(lipgloss.Color(ColorBorder))
|
|
||||||
}
|
}
|
||||||
|
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,
|
fieldRows = append(fieldRows, labelLine, inputBox, "")
|
||||||
lipgloss.JoinHorizontal(lipgloss.Center, label, browseHint),
|
|
||||||
inputBoxStyle.Render(inputView),
|
|
||||||
))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── Экран загрузки ────────────────────────────────────────────────────────────
|
// ── Экран загрузки ────────────────────────────────────────────────────────────
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue