diff --git a/README.md b/README.md index 71516f2..f943752 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,9 @@ Desktop app (Go + Fyne) that creates application shortcuts on Linux in a few cli from an executable file, or from a web URL as a PWA. Ships as a single-file AppImage, no terminal needed. +*Dream-sky theme: night violet, dusk pink and a moon-coloured accent that subtly +breathes while the app is open (the koala in `assets/logo.svg` is the mascot).* + 
diff --git a/assets/icon.png b/assets/icon.png index 8a81e1c..bb17161 100644 Binary files a/assets/icon.png and b/assets/icon.png differ diff --git a/assets/logo.svg b/assets/logo.svg new file mode 100644 index 0000000..70fc510 --- /dev/null +++ b/assets/logo.svg @@ -0,0 +1,85 @@ + diff --git a/docs/dialog-executable.png b/docs/dialog-executable.png index 5bba4b1..2df6866 100644 Binary files a/docs/dialog-executable.png and b/docs/dialog-executable.png differ diff --git a/docs/dialog-icons.png b/docs/dialog-icons.png index 0a4b80f..abd3cff 100644 Binary files a/docs/dialog-icons.png and b/docs/dialog-icons.png differ diff --git a/docs/main-dark.png b/docs/main-dark.png index 8c6679f..92ddbed 100644 Binary files a/docs/main-dark.png and b/docs/main-dark.png differ diff --git a/docs/main-light.png b/docs/main-light.png index b98774e..e09dabb 100644 Binary files a/docs/main-light.png and b/docs/main-light.png differ diff --git a/internal/icon/raster.go b/internal/icon/raster.go index 2ec0657..ab7396e 100644 --- a/internal/icon/raster.go +++ b/internal/icon/raster.go @@ -11,8 +11,9 @@ import ( "github.com/srwiley/rasterx" ) -// currentColor diisi ke SVG yang memakai fill="currentColor". -const currentColor = "#4f46e5" +// currentColor diisi ke SVG yang memakai fill="currentColor" +// (warna brand: dusk pink, terlihat di background terang maupun gelap). +const currentColor = "#c25c9e" // Rasterize mengubah SVG menjadi PNG persegi `size`x`size`. // diff --git a/internal/icon/raster_test.go b/internal/icon/raster_test.go index 3b1106e..66a904e 100644 --- a/internal/icon/raster_test.go +++ b/internal/icon/raster_test.go @@ -76,9 +76,9 @@ func TestRasterizeColorsCurrentColorIcons(t *testing.T) { if a == 0 { t.Fatal("ikon currentColor tidak terwarnai (transparan)") } - // brand indigo #4F46E5: biru > merah > hijau - if !(b > r && r > g) { - t.Errorf("warna pengganti bukan brand indigo: r=%d g=%d b=%d", r>>8, g>>8, b>>8) + // brand dusk pink #C25C9E: merah > biru > hijau + if !(r > b && b > g) { + t.Errorf("warna pengganti bukan warna brand: r=%d g=%d b=%d", r>>8, g>>8, b>>8) } } diff --git a/internal/ui/animation.go b/internal/ui/animation.go index b927136..797499d 100644 --- a/internal/ui/animation.go +++ b/internal/ui/animation.go @@ -17,7 +17,7 @@ import ( // pulseGradient membuat garis aksen bergerak bolak-balik antara indigo dan cyan. func pulseGradient(bar *canvas.LinearGradient) { - anim := canvas.NewColorRGBAAnimation(brandIndigo, brandCyan, 3*time.Second, func(c color.Color) { + anim := canvas.NewColorRGBAAnimation(brandAmber, brandMagenta, 3*time.Second, func(c color.Color) { bar.EndColor = c canvas.Refresh(bar) }) diff --git a/internal/ui/main_window.go b/internal/ui/main_window.go index de3337b..bbef443 100644 --- a/internal/ui/main_window.go +++ b/internal/ui/main_window.go @@ -32,6 +32,7 @@ type app struct { icons *iconCache count *canvas.Text // angka jumlah shortcut di header daftar versionText *canvas.Text // versi di footer; berubah kalau ada update + accent *canvas.LinearGradient version string } @@ -87,9 +88,9 @@ func build(a fyne.App, version string) (*app, error) { ui.versionText, ) - accent := accentBar() - pulseGradient(accent) - top := container.NewVBox(header, accent, + ui.accent = accentBar() + pulseGradient(ui.accent) + top := container.NewVBox(header, ui.accent, container.NewHBox(sectionLabel(T("installed")), countChip)) body := container.NewBorder( top, diff --git a/internal/ui/style.go b/internal/ui/style.go index e7b1fa3..2d70d7d 100644 --- a/internal/ui/style.go +++ b/internal/ui/style.go @@ -78,7 +78,7 @@ func chipLabel(text string, bg fyne.ThemeColorName) (fyne.CanvasObject, *canvas. // accentBar adalah garis gradien brand di bawah header. func accentBar() *canvas.LinearGradient { - bar := canvas.NewLinearGradient(brandIndigo, brandCyan, 90) + bar := canvas.NewLinearGradient(brandAmber, brandMagenta, 90) bar.SetMinSize(fyne.NewSize(0, 3)) return bar } diff --git a/internal/ui/theme.go b/internal/ui/theme.go index 4bbb0a3..1602242 100644 --- a/internal/ui/theme.go +++ b/internal/ui/theme.go @@ -7,10 +7,11 @@ import ( "fyne.io/fyne/v2/theme" ) -// Palet brand LazyRun, diambil dari ikon aplikasi. +// Palet brand LazyRun, diambil dari logo (dream sky: ungu malam, senja pink, bulan amber). var ( - brandIndigo = color.NRGBA{R: 0x4F, G: 0x46, B: 0xE5, A: 0xFF} - brandCyan = color.NRGBA{R: 0x06, G: 0xB6, B: 0xD4, A: 0xFF} + brandPurple = color.NRGBA{R: 0x6A, G: 0x3D, B: 0x9A, A: 0xFF} + brandMagenta = color.NRGBA{R: 0xC2, G: 0x5C, B: 0x9E, A: 0xFF} + brandAmber = color.NRGBA{R: 0xFF, G: 0xD1, B: 0x66, A: 0xFF} ) // Nama warna tambahan di luar tema standar Fyne. @@ -31,31 +32,34 @@ func (b brand) Color(name fyne.ThemeColorName, variant fyne.ThemeVariant) color. dark := variant == theme.VariantDark switch name { case theme.ColorNamePrimary: - return pick(dark, color.NRGBA{R: 0x7C, G: 0x7A, B: 0xFF, A: 0xFF}, brandIndigo) + // senja pink di malam hari, ungu tua di tema terang + return pick(dark, brandMagenta, color.NRGBA{R: 0x8E, G: 0x3F, B: 0xA8, A: 0xFF}) case theme.ColorNameBackground: - return pick(dark, color.NRGBA{R: 0x13, G: 0x13, B: 0x1B, A: 0xFF}, color.NRGBA{R: 0xF5, G: 0xF5, B: 0xFA, A: 0xFF}) + // langit malam surreal + return pick(dark, color.NRGBA{R: 0x14, G: 0x0E, B: 0x24, A: 0xFF}, color.NRGBA{R: 0xF5, G: 0xEF, B: 0xF9, A: 0xFF}) case colorNameCard: - return pick(dark, color.NRGBA{R: 0x1D, G: 0x1D, B: 0x28, A: 0xFF}, color.NRGBA{R: 0xFF, G: 0xFF, B: 0xFF, A: 0xFF}) + return pick(dark, color.NRGBA{R: 0x1E, G: 0x16, B: 0x36, A: 0xFF}, color.NRGBA{R: 0xFF, G: 0xFF, B: 0xFF, A: 0xFF}) case colorNameCardHover: - return withAlpha(brandIndigo, pick[uint8](dark, 0x2E, 0x14)) + return withAlpha(brandAmber, pick[uint8](dark, 0x1F, 0x18)) case theme.ColorNameInputBackground: - return pick(dark, color.NRGBA{R: 0x1A, G: 0x1A, B: 0x24, A: 0xFF}, color.NRGBA{R: 0xFF, G: 0xFF, B: 0xFF, A: 0xFF}) + return pick(dark, color.NRGBA{R: 0x19, G: 0x11, B: 0x35, A: 0xFF}, color.NRGBA{R: 0xFF, G: 0xFF, B: 0xFF, A: 0xFF}) case theme.ColorNameButton, theme.ColorNameMenuBackground: - return pick(dark, color.NRGBA{R: 0x22, G: 0x22, B: 0x2E, A: 0xFF}, color.NRGBA{R: 0xEC, G: 0xEC, B: 0xF4, A: 0xFF}) + return pick(dark, color.NRGBA{R: 0x26, G: 0x1B, B: 0x45, A: 0xFF}, color.NRGBA{R: 0xED, G: 0xE3, B: 0xF5, A: 0xFF}) case theme.ColorNameOverlayBackground: - return pick(dark, color.NRGBA{R: 0x1B, G: 0x1B, B: 0x25, A: 0xFF}, color.NRGBA{R: 0xFF, G: 0xFF, B: 0xFF, A: 0xFF}) + return pick(dark, color.NRGBA{R: 0x1B, G: 0x13, B: 0x33, A: 0xFF}, color.NRGBA{R: 0xFF, G: 0xFF, B: 0xFF, A: 0xFF}) case theme.ColorNameInputBorder, theme.ColorNameSeparator: - return pick(dark, color.NRGBA{R: 0x32, G: 0x32, B: 0x44, A: 0xFF}, color.NRGBA{R: 0xDC, G: 0xDC, B: 0xE8, A: 0xFF}) + return pick(dark, color.NRGBA{R: 0x3A, G: 0x2A, B: 0x63, A: 0xFF}, color.NRGBA{R: 0xDC, G: 0xCF, B: 0xE9, A: 0xFF}) case colorNameMuted: - return pick(dark, color.NRGBA{R: 0x9C, G: 0x9C, B: 0xB4, A: 0xFF}, color.NRGBA{R: 0x6B, G: 0x6B, B: 0x80, A: 0xFF}) + return pick(dark, color.NRGBA{R: 0xA7, G: 0x9A, B: 0xC8, A: 0xFF}, color.NRGBA{R: 0x6E, G: 0x61, B: 0x83, A: 0xFF}) case colorNameChipMenu: - return withAlpha(brandIndigo, pick[uint8](dark, 0x44, 0x26)) + return withAlpha(brandPurple, pick[uint8](dark, 0x66, 0x2E)) case colorNameChipDesk: - return withAlpha(brandCyan, pick[uint8](dark, 0x3D, 0x2C)) + return withAlpha(brandMagenta, pick[uint8](dark, 0x4E, 0x30)) case colorNameChipKind: - return pick(dark, color.NRGBA{R: 0xFF, G: 0xFF, B: 0xFF, A: 0x1C}, color.NRGBA{R: 0x00, G: 0x00, B: 0x00, A: 0x12}) + return withAlpha(color.NRGBA{R: 0xFF, G: 0xD1, B: 0x66, A: 0xFF}, pick[uint8](dark, 0x24, 0x30)) case colorNameChipBroken: - return withAlpha(color.NRGBA{R: 0xE0, G: 0x4F, B: 0x4F, A: 0xFF}, pick[uint8](dark, 0x4A, 0x2E)) + // merah senja: peringatan yang tetap terasa "seram" tapi terbaca + return withAlpha(color.NRGBA{R: 0xD9, G: 0x46, B: 0x3C, A: 0xFF}, pick[uint8](dark, 0x50, 0x30)) } return b.Theme.Color(name, variant) }