feat: image gallery #2

Merged
schreifuchs merged 6 commits from feat/image-gallery into main 2026-06-01 14:07:50 +02:00
5 changed files with 56 additions and 8 deletions
Showing only changes of commit c55e6bc43f - Show all commits
+24 -1
View File
@@ -12,6 +12,29 @@ type Gallery struct {
GridHeight int GridHeight int
Images []Image Images []Image
} }
type Set struct {
SM Gallery
LG Gallery
XLG Gallery
}
func (s *Service) GetGallerySet(ctx context.Context) (gallerySet Set, err error) {
gallerySet.SM, err = s.GetGallery(ctx, 50)
if err != nil {
return
}
gallerySet.LG, err = s.GetGallery(ctx, 80)
if err != nil {
return
}
gallerySet.XLG, err = s.GetGallery(ctx, 120)
if err != nil {
return
}
return
}
func (s *Service) GetGallery(ctx context.Context, width int) (gallery Gallery, err error) { func (s *Service) GetGallery(ctx context.Context, width int) (gallery Gallery, err error) {
imgs, err := s.GetImages(ctx) imgs, err := s.GetImages(ctx)
@@ -19,7 +42,7 @@ func (s *Service) GetGallery(ctx context.Context, width int) (gallery Gallery, e
return return
} }
packer := binpack2d.Create(50, 999999) packer := binpack2d.Create(width, 999999)
for len(imgs) > 0 { for len(imgs) > 0 {
unused := make([]Image, 0, len(imgs)) unused := make([]Image, 0, len(imgs))
+2 -2
View File
@@ -8,11 +8,11 @@ import (
) )
func (h *Handler) gallery(w http.ResponseWriter, r *http.Request) { func (h *Handler) gallery(w http.ResponseWriter, r *http.Request) {
imgs, err := h.srv.GetGallery(r.Context(), 0) imgs, err := h.srv.GetGallerySet(r.Context())
if err != nil { if err != nil {
slog.Error("could not get images", "err", err) slog.Error("could not get images", "err", err)
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
h.r.Render(r.Context(), w, r, pages.Gallery(imgs)) h.r.Render(r.Context(), w, r, pages.GallerySet(imgs))
} }
+1 -1
View File
@@ -33,7 +33,7 @@ func New(renderer renderer, srv galleryService, cfg *config.Gallery) *Handler {
} }
type galleryService interface { type galleryService interface {
GetGallery(ctx context.Context, width int) (gallery gallery.Gallery, err error) GetGallerySet(ctx context.Context) (gallerySet gallery.Set, err error)
} }
type renderer interface { type renderer interface {
Render(ctx context.Context, w io.Writer, r *http.Request, component templ.Component) Render(ctx context.Context, w io.Writer, r *http.Request, component templ.Component)
+28 -3
View File
@@ -1,11 +1,36 @@
package pages package pages
import "git.schreifuchs.ch/schreifuchs/schreifuchs.ch/internal/components/gallery" import (
import "fmt" "fmt"
"git.schreifuchs.ch/schreifuchs/schreifuchs.ch/internal/components/gallery"
)
templ GallerySet(g gallery.Set) {
<div
class="grid gap-5 grid-cols-1 lg:hidden m-5"
>
for _,img := range g.SM.Images {
<img
src={ "/images/" + img.UID }
class="w-full"
alt="Gallery item"
/>
}
</div>
<div class="hidden lg:block 3xl:hidden m-5">
@Gallery(g.SM)
</div>
<div class="hidden 3xl:block 6xl:hidden m-5">
@Gallery(g.LG)
</div>
<div class="hidden 6xl:block m-5">
@Gallery(g.XLG)
</div>
}
templ Gallery(g gallery.Gallery) { templ Gallery(g gallery.Gallery) {
<div <div
class="grid gap-5 m-5" class="grid gap-5"
style={ fmt.Sprintf("grid-template-columns: repeat(%d, 1fr); grid-template-rows: repeat(%d, auto);", g.GridWith, g.GridHeight) } style={ fmt.Sprintf("grid-template-columns: repeat(%d, 1fr); grid-template-rows: repeat(%d, auto);", g.GridWith, g.GridHeight) }
> >
for _, img := range g.Images { for _, img := range g.Images {
File diff suppressed because one or more lines are too long