fconvert 0.1.5 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fconvert",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "Fast local CLI conversion tool with graph-based anything-to-anything routing",
5
5
  "type": "module",
6
6
  "main": "src/cli/main.ts",
@@ -2,11 +2,13 @@ module github.com/timmy6942025/convert/tools/format-picker
2
2
 
3
3
  go 1.22
4
4
 
5
- require github.com/charmbracelet/bubbletea v1.3.4
5
+ require (
6
+ github.com/charmbracelet/bubbletea v1.3.4
7
+ github.com/charmbracelet/lipgloss v1.0.0
8
+ )
6
9
 
7
10
  require (
8
11
  github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
9
- github.com/charmbracelet/lipgloss v1.0.0 // indirect
10
12
  github.com/charmbracelet/x/ansi v0.8.0 // indirect
11
13
  github.com/charmbracelet/x/term v0.2.1 // indirect
12
14
  github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
@@ -9,6 +9,7 @@ import (
9
9
  "strings"
10
10
 
11
11
  tea "github.com/charmbracelet/bubbletea"
12
+ "github.com/charmbracelet/lipgloss"
12
13
  )
13
14
 
14
15
  type option struct {
@@ -42,6 +43,33 @@ type model struct {
42
43
  height int
43
44
  }
44
45
 
46
+ var (
47
+ frameStyle = lipgloss.NewStyle().
48
+ Padding(0, 1)
49
+
50
+ headerStyle = lipgloss.NewStyle().
51
+ Bold(true)
52
+
53
+ promptStyle = lipgloss.NewStyle().
54
+ Foreground(lipgloss.AdaptiveColor{Light: "241", Dark: "248"})
55
+
56
+ hintStyle = lipgloss.NewStyle().
57
+ Foreground(lipgloss.AdaptiveColor{Light: "245", Dark: "240"})
58
+
59
+ selectedStyle = lipgloss.NewStyle().
60
+ Bold(true).
61
+ Foreground(lipgloss.AdaptiveColor{Light: "39", Dark: "117"})
62
+
63
+ rowStyle = lipgloss.NewStyle().
64
+ Foreground(lipgloss.AdaptiveColor{Light: "250", Dark: "252"})
65
+
66
+ footerStyle = lipgloss.NewStyle().
67
+ Foreground(lipgloss.AdaptiveColor{Light: "245", Dark: "240"})
68
+
69
+ emptyStyle = lipgloss.NewStyle().
70
+ Foreground(lipgloss.AdaptiveColor{Light: "203", Dark: "210"})
71
+ )
72
+
45
73
  func (m model) Init() tea.Cmd {
46
74
  return nil
47
75
  }
@@ -94,15 +122,19 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
94
122
 
95
123
  func (m model) View() string {
96
124
  var builder strings.Builder
97
- builder.WriteString(fmt.Sprintf("%s > %s\n", m.prompt, m.query))
125
+ line := fmt.Sprintf("%s > %s", promptStyle.Render(m.prompt), m.query)
126
+ builder.WriteString(headerStyle.Render(line))
127
+ builder.WriteString("\n")
98
128
  if m.query == "" && m.preferred != "" {
99
- builder.WriteString(fmt.Sprintf(" hint: original extension '.%s' is ranked first\n", m.preferred))
129
+ builder.WriteString(hintStyle.Render(fmt.Sprintf("hint: original extension '.%s' is ranked first", m.preferred)))
130
+ builder.WriteString("\n")
100
131
  }
101
132
 
102
133
  if len(m.filtered) == 0 {
103
- builder.WriteString(" no matches\n")
104
- builder.WriteString(" enter to keep typing, esc to cancel")
105
- return builder.String()
134
+ builder.WriteString(emptyStyle.Render("no matches"))
135
+ builder.WriteString("\n")
136
+ builder.WriteString(footerStyle.Render("keys: type to search, backspace delete, esc cancel"))
137
+ return frameStyle.Render(builder.String())
106
138
  }
107
139
 
108
140
  maxRows := 8
@@ -128,15 +160,26 @@ func (m model) View() string {
128
160
 
129
161
  for index := start; index < end; index++ {
130
162
  prefix := " "
163
+ style := rowStyle
131
164
  if index == m.cursor {
132
165
  prefix = "> "
166
+ style = selectedStyle
133
167
  }
134
168
  item := m.filtered[index]
135
- builder.WriteString(fmt.Sprintf("%s%-10s .%-6s %s\n", prefix, item.ID, item.Extension, item.Name))
169
+ line := fmt.Sprintf("%s%-10s .%-6s %s", prefix, item.ID, item.Extension, item.Name)
170
+ builder.WriteString(style.Render(line))
171
+ builder.WriteString("\n")
136
172
  }
137
173
 
138
- builder.WriteString(" enter select esc cancel")
139
- return builder.String()
174
+ status := fmt.Sprintf("%d shown / %d total", len(m.filtered), len(m.all))
175
+ if len(m.filtered) != len(m.all) {
176
+ status = fmt.Sprintf("%d matches / %d total", len(m.filtered), len(m.all))
177
+ }
178
+ builder.WriteString(footerStyle.Render(status))
179
+ builder.WriteString("\n")
180
+ builder.WriteString(footerStyle.Render("keys: up/down move, enter select, esc cancel"))
181
+
182
+ return frameStyle.Render(builder.String())
140
183
  }
141
184
 
142
185
  func (m *model) refilter() {
@@ -249,6 +292,10 @@ func readPayload(path string) (payload, error) {
249
292
  if data.Prompt == "" {
250
293
  data.Prompt = "output format"
251
294
  }
295
+ if data.Query != "" {
296
+ data.Query = strings.TrimSpace(data.Query)
297
+ }
298
+ data.Prompt = strings.TrimSpace(data.Prompt)
252
299
  return data, nil
253
300
  }
254
301