···11# Noteleaf
2233-A task & time management CLI built with Golang & Charm.sh libs.
33+```sh
44+ ,, ,...
55+`7MN. `7MF' mm `7MM .d' ""
66+ MMN. M MM MM dM`
77+ M YMb M ,pW"Wq.mmMMmm .gP"Ya MM .gP"Ya ,6"Yb. mMMmm
88+ M `MN. M 6W' `Wb MM ,M' Yb MM ,M' Yb 8) MM MM
99+ M `MM.M 8M M8 MM 8M"""""" MM 8M"""""" ,pm9MM MM
1010+ M YMM YA. ,A9 MM YM. , MM YM. , 8M MM MM
1111+.JML. YM `Ybmd9' `Mbmo`Mbmmd'.JMML.`Mbmmd' `Moo9^Yo..JMML.
1212+```
1313+1414+A note, task & time management CLI built with Golang & Charm.sh libs. Inspired by TaskWarrior & todo.txt CLI applications.
415516## Development
1717+1818+Requires Go v1.24+
+10-1
ROADMAP.md
···66- `projects` - List all project names
77- `tags` - List all tag names
8899-- `create` - Add new task with description and optional metadata
99+- `create|new` - Add new task with description and optional metadata
10101111- `view` - View task by ID
1212- `done` - Mark task as completed
···6363- `config` - Manage configuration settings
64646565- `undo` - Reverse last operation
6666+6767+## Notes
6868+6969+- `create|new` - Creates a new markdown note and optionally opens in configured editor
7070+ - Creates a note from existing markdown file content
7171+- `list` - Opens interactive TUI browser for navigating and viewing notes
7272+- `read|view` - Displays formatted note content with syntax highlighting
7373+- `edit|update` - Opens configured editor OR Replaces note content with new markdown file
7474+- `remove|rm|delete|del` - Permanently removes the note file and metadata
···11+ ,, ,...
22+`7MN. `7MF' mm `7MM .d' ""
33+ MMN. M MM MM dM`
44+ M YMb M ,pW"Wq.mmMMmm .gP"Ya MM .gP"Ya ,6"Yb. mMMmm
55+ M `MN. M 6W' `Wb MM ,M' Yb MM ,M' Yb 8) MM MM
66+ M `MM.M 8M M8 MM 8M"""""" MM 8M"""""" ,pm9MM MM
77+ M YMM YA. ,A9 MM YM. , MM YM. , 8M MM MM
88+.JML. YM `Ybmd9' `Mbmo`Mbmmd'.JMML.`Mbmmd' `Moo9^Yo..JMML.
+394
internal/ui/colors.go
···11+// This module contains colors from github.com/charmbracelet/x/exp/charmtone
22+//
33+// See: https://github.com/charmbracelet/x/blob/main/exp/charmtone/charmtone.go
44+package ui
55+66+import (
77+ "fmt"
88+ "image/color"
99+ "slices"
1010+1111+ "github.com/lucasb-eyer/go-colorful"
1212+)
1313+1414+var _ color.Color = Key(0)
1515+1616+// Key is a type for color keys.
1717+type Key int
1818+1919+const (
2020+ Cumin Key = iota
2121+ Tang
2222+ Yam
2323+ Paprika
2424+ Bengal
2525+ Uni
2626+ Sriracha
2727+ Coral
2828+ Salmon
2929+ Chili
3030+ Cherry
3131+ Tuna
3232+ Macaron
3333+ Pony
3434+ Cheeky
3535+ Flamingo
3636+ Dolly
3737+ Blush
3838+ Urchin
3939+ Mochi
4040+ Lilac
4141+ Prince
4242+ Violet
4343+ Mauve
4444+ Grape
4545+ Plum
4646+ Orchid
4747+ Jelly
4848+ Charple
4949+ Hazy
5050+ Ox
5151+ Sapphire
5252+ Guppy
5353+ Oceania
5454+ Thunder
5555+ Anchovy
5656+ Damson
5757+ Malibu
5858+ Sardine
5959+ Zinc
6060+ Turtle
6161+ Lichen
6262+ Guac
6363+ Julep
6464+ Bok
6565+ Mustard
6666+ Citron
6767+ Zest
6868+ Pepper
6969+ BBQ
7070+ Charcoal
7171+ Iron
7272+ Oyster
7373+ Squid
7474+ Smoke
7575+ Ash
7676+ Salt
7777+ Butter
7878+7979+ // Diffs: additions. The brightest color in this set is Julep, defined above.
8080+ Pickle
8181+ Gator
8282+ Spinach
8383+8484+ // Diffs: deletions. The brightest color in this set is Cherry, defined above.
8585+ Pom
8686+ Steak
8787+ Toast
8888+8989+ // Provisional.
9090+ NeueGuac
9191+ NeueZinc
9292+)
9393+9494+func (k Key) Hex() string {
9595+ switch k {
9696+ case Cumin:
9797+ return "#BF976F"
9898+ case Tang:
9999+ return "#FF985A"
100100+ case Yam:
101101+ return "#FFB587"
102102+ case Paprika:
103103+ return "#D36C64"
104104+ case Bengal:
105105+ return "#FF6E63"
106106+ case Uni:
107107+ return "#FF937D"
108108+ case Sriracha:
109109+ return "#EB4268"
110110+ case Coral:
111111+ return "#FF577D"
112112+ case Salmon:
113113+ return "#FF7F90"
114114+ case Chili:
115115+ return "#E23080"
116116+ case Cherry:
117117+ return "#FF388B"
118118+ case Tuna:
119119+ return "#FF6DAA"
120120+ case Macaron:
121121+ return "#E940B0"
122122+ case Pony:
123123+ return "#FF4FBF"
124124+ case Cheeky:
125125+ return "#FF79D0"
126126+ case Flamingo:
127127+ return "#F947E3"
128128+ case Dolly:
129129+ return "#FF60FF"
130130+ case Blush:
131131+ return "#FF84FF"
132132+ case Urchin:
133133+ return "#C337E0"
134134+ case Mochi:
135135+ return "#EB5DFF"
136136+ case Lilac:
137137+ return "#F379FF"
138138+ case Prince:
139139+ return "#9C35E1"
140140+ case Violet:
141141+ return "#C259FF"
142142+ case Mauve:
143143+ return "#D46EFF"
144144+ case Grape:
145145+ return "#7134DD"
146146+ case Plum:
147147+ return "#9953FF"
148148+ case Orchid:
149149+ return "#AD6EFF"
150150+ case Jelly:
151151+ return "#4A30D9"
152152+ case Charple:
153153+ return "#6B50FF"
154154+ case Hazy:
155155+ return "#8B75FF"
156156+ case Ox:
157157+ return "#3331B2"
158158+ case Sapphire:
159159+ return "#4949FF"
160160+ case Guppy:
161161+ return "#7272FF"
162162+ case Oceania:
163163+ return "#2B55B3"
164164+ case Thunder:
165165+ return "#4776FF"
166166+ case Anchovy:
167167+ return "#719AFC"
168168+ case Damson:
169169+ return "#007AB8"
170170+ case Malibu:
171171+ return "#00A4FF"
172172+ case Sardine:
173173+ return "#4FBEFE"
174174+ case Zinc:
175175+ return "#10B1AE"
176176+ case Turtle:
177177+ return "#0ADCD9"
178178+ case Lichen:
179179+ return "#5CDFEA"
180180+ case Guac:
181181+ return "#12C78F"
182182+ case Julep:
183183+ return "#00FFB2"
184184+ case Bok:
185185+ return "#68FFD6"
186186+ case Mustard:
187187+ return "#F5EF34"
188188+ case Citron:
189189+ return "#E8FF27"
190190+ case Zest:
191191+ return "#E8FE96"
192192+ case Pepper:
193193+ return "#201F26"
194194+ case BBQ:
195195+ return "#2d2c35"
196196+ case Charcoal:
197197+ return "#3A3943"
198198+ case Iron:
199199+ return "#4D4C57"
200200+ case Oyster:
201201+ return "#605F6B"
202202+ case Squid:
203203+ return "#858392"
204204+ case Smoke:
205205+ return "#BFBCC8"
206206+ case Ash:
207207+ return "#DFDBDD"
208208+ case Salt:
209209+ return "#F1EFEF"
210210+ case Butter:
211211+ return "#FFFAF1"
212212+ // Diffs: additions.
213213+ case Pickle:
214214+ return "#00A475"
215215+ case Gator:
216216+ return "#18463D"
217217+ case Spinach:
218218+ return "#1C3634"
219219+ // Diffs: deletions.
220220+ case Pom:
221221+ return "#AB2454"
222222+ case Steak:
223223+ return "#582238"
224224+ case Toast:
225225+ return "#412130"
226226+ // Provisional.
227227+ case NeueGuac:
228228+ return "#00b875"
229229+ case NeueZinc:
230230+ return "#0e9996"
231231+ default:
232232+ return ""
233233+ }
234234+}
235235+236236+func (k Key) String() string {
237237+ switch k {
238238+ case Cumin:
239239+ return "Cumin"
240240+ case Tang:
241241+ return "Tang"
242242+ case Yam:
243243+ return "Yam"
244244+ case Paprika:
245245+ return "Paprika"
246246+ case Bengal:
247247+ return "Bengal"
248248+ case Uni:
249249+ return "Uni"
250250+ case Sriracha:
251251+ return "Sriracha"
252252+ case Coral:
253253+ return "Coral"
254254+ case Salmon:
255255+ return "Salmon"
256256+ case Chili:
257257+ return "Chili"
258258+ case Cherry:
259259+ return "Cherry"
260260+ case Tuna:
261261+ return "Tuna"
262262+ case Macaron:
263263+ return "Macaron"
264264+ case Pony:
265265+ return "Pony"
266266+ case Cheeky:
267267+ return "Cheeky"
268268+ case Flamingo:
269269+ return "Flamingo"
270270+ case Dolly:
271271+ return "Dolly"
272272+ case Blush:
273273+ return "Blush"
274274+ case Urchin:
275275+ return "Urchin"
276276+ case Mochi:
277277+ return "Mochi"
278278+ case Lilac:
279279+ return "Lilac"
280280+ case Prince:
281281+ return "Prince"
282282+ case Violet:
283283+ return "Violet"
284284+ case Mauve:
285285+ return "Mauve"
286286+ case Grape:
287287+ return "Grape"
288288+ case Plum:
289289+ return "Plum"
290290+ case Orchid:
291291+ return "Orchid"
292292+ case Jelly:
293293+ return "Jelly"
294294+ case Charple:
295295+ return "Charple"
296296+ case Hazy:
297297+ return "Hazy"
298298+ case Ox:
299299+ return "Ox"
300300+ case Sapphire:
301301+ return "Sapphire"
302302+ case Guppy:
303303+ return "Guppy"
304304+ case Oceania:
305305+ return "Oceania"
306306+ case Thunder:
307307+ return "Thunder"
308308+ case Anchovy:
309309+ return "Anchovy"
310310+ case Damson:
311311+ return "Damson"
312312+ case Malibu:
313313+ return "Malibu"
314314+ case Sardine:
315315+ return "Sardine"
316316+ case Zinc:
317317+ return "Zinc"
318318+ case Turtle:
319319+ return "Turtle"
320320+ case Lichen:
321321+ return "Lichen"
322322+ case Guac:
323323+ return "Guac"
324324+ case Julep:
325325+ return "Julep"
326326+ case Bok:
327327+ return "Bok"
328328+ case Mustard:
329329+ return "Mustard"
330330+ case Citron:
331331+ return "Citron"
332332+ case Zest:
333333+ return "Zest"
334334+ case Pepper:
335335+ return "Pepper"
336336+ case BBQ:
337337+ return "BBQ"
338338+ case Charcoal:
339339+ return "Charcoal"
340340+ case Iron:
341341+ return "Iron"
342342+ case Oyster:
343343+ return "Oyster"
344344+ case Squid:
345345+ return "Squid"
346346+ case Smoke:
347347+ return "Smoke"
348348+ case Ash:
349349+ return "Ash"
350350+ case Salt:
351351+ return "Salt"
352352+ case Butter:
353353+ return "Butter"
354354+ case Pickle:
355355+ return "Pickle"
356356+ case Gator:
357357+ return "Gator"
358358+ case Spinach:
359359+ return "Spinach"
360360+ case Pom:
361361+ return "Pom"
362362+ case Steak:
363363+ return "Steak"
364364+ case Toast:
365365+ return "Toast"
366366+ case NeueGuac:
367367+ return "NeueGuac"
368368+ case NeueZinc:
369369+ return "NeueZinc"
370370+ default:
371371+ return fmt.Sprintf("Key(%d)", int(k))
372372+ }
373373+}
374374+375375+// RGBA returns the red, green, blue, and alpha values of the color for interface [color.Color]
376376+func (k Key) RGBA() (r, g, b, a uint32) {
377377+ c, err := colorful.Hex(k.Hex())
378378+ if err != nil {
379379+ panic(fmt.Sprintf("invalid color key %d: %s: %v", k, k.String(), err))
380380+ }
381381+ return c.RGBA()
382382+}
383383+384384+func (k Key) IsPrimary() bool {
385385+ return slices.Contains(PrimaryColors, k)
386386+}
387387+388388+func (k Key) IsSecondary() bool {
389389+ return slices.Contains(SecondaryColors, k)
390390+}
391391+392392+func (k Key) IsTertiary() bool {
393393+ return slices.Contains(TertiaryColors, k)
394394+}