diff --git a/internal/shared/ui/anime_card.templ b/internal/shared/ui/anime_card.templ index 258bb78..dfaf847 100644 --- a/internal/shared/ui/anime_card.templ +++ b/internal/shared/ui/anime_card.templ @@ -6,17 +6,57 @@ type AnimeCardProps struct { ID int Title string ImageURL string + // Options to customize the card behavior + Class string // override default wrapper class + ImgClass string // override default image class + TitleClass string // override default title class + CurrentNode bool // if true, renders a div instead of an anchor tag (useful for graph nodes) } templ AnimeCard(props AnimeCardProps) { - - if props.ImageURL != "" { - { - } else { -
No image
- } -
-
- { props.Title } -
+ if props.CurrentNode { +
+ if props.ImageURL != "" { + { + } else { +
No image
+ } +
+ { props.Title } +
+ { children... } +
+ } else { + + if props.Class == "notification-card" || props.Class == "schedule-card" { +
+ if props.ImageURL != "" { + { + } else { +
No image
+ } +
+ } else { + if props.ImageURL != "" { + { + } else { +
No image
+ } + } + + if props.Class != "notification-card" && props.Class != "schedule-card" { +
+ { props.Title } +
+ } + { children... } +
+ } +} + +func defaultString(val, fallback string) string { + if val == "" { + return fallback + } + return val } diff --git a/internal/templates/anime.templ b/internal/templates/anime.templ index 4f72887..3484c43 100644 --- a/internal/templates/anime.templ +++ b/internal/templates/anime.templ @@ -282,25 +282,15 @@ templ AnimeRelationsList(relations []jikan.RelationEntry) { if len(relations) > 1 {
for _, rel := range relations { - if rel.IsCurrent { -
- if rel.Anime.ImageURL() != "" { - { - } else { -
No image
- } -
{ rel.Anime.DisplayTitle() }
-
- } else { - - if rel.Anime.ImageURL() != "" { - { - } else { -
No image
- } -
{ rel.Anime.DisplayTitle() }
-
- } + @ui.AnimeCard(ui.AnimeCardProps{ + ID: rel.Anime.MalID, + Title: rel.Anime.DisplayTitle(), + ImageURL: rel.Anime.ImageURL(), + Class: "relation-card" + func() string { if rel.IsCurrent { return " current" }; return "" }(), + ImgClass: "relation-thumb", + TitleClass: "relation-title", + CurrentNode: rel.IsCurrent, + }) }
} else { @@ -312,14 +302,14 @@ templ AnimeRecommendations(recs []jikan.Anime) { if len(recs) > 0 {
for _, anime := range recs { - - if anime.ImageURL() != "" { - { - } else { -
No image
- } -
{ anime.DisplayTitle() }
-
+ @ui.AnimeCard(ui.AnimeCardProps{ + ID: anime.MalID, + Title: anime.DisplayTitle(), + ImageURL: anime.ImageURL(), + Class: "relation-card", + ImgClass: "relation-thumb", + TitleClass: "relation-title", + }) }
} else { diff --git a/internal/templates/notifications.templ b/internal/templates/notifications.templ index 6f7c1bc..101c39b 100644 --- a/internal/templates/notifications.templ +++ b/internal/templates/notifications.templ @@ -2,6 +2,7 @@ package templates import "mal/internal/jikan" import "mal/internal/database" +import "mal/internal/shared/ui" import "fmt" type WatchingAnimeWithDetails struct { @@ -32,10 +33,7 @@ templ Notifications(watching []WatchingAnimeWithDetails) {

Because you've watched prequels.

-
-
- Syncing sequel graphs... -
+ @ui.LoadingIndicator("Syncing sequel graphs...")
} @@ -86,14 +84,13 @@ templ renderSplitSeasons(upcomingSeasons []database.GetUpcomingSeasonsRow) { } templ UpcomingSeasonCard(item database.GetUpcomingSeasonsRow) { - -
- if item.ImageUrl != "" { - { - } else { -
No image
- } -
+ @ui.AnimeCard(ui.AnimeCardProps{ + ID: int(item.ID), + Title: displaySeasonTitle(item), + ImageURL: item.ImageUrl, + Class: "notification-card", + ImgClass: "notification-image", + }) {
{ displaySeasonTitle(item) } @@ -102,7 +99,7 @@ templ UpcomingSeasonCard(item database.GetUpcomingSeasonsRow) { Because you watched { item.PrequelTitle }
-
+ } } func displaySeasonTitle(entry database.GetUpcomingSeasonsRow) string { @@ -110,14 +107,13 @@ func displaySeasonTitle(entry database.GetUpcomingSeasonsRow) string { } templ NotificationCard(item WatchingAnimeWithDetails) { - -
- if item.Entry.ImageUrl != "" { - { - } else { -
No image
- } -
+ @ui.AnimeCard(ui.AnimeCardProps{ + ID: int(item.Entry.AnimeID), + Title: displayTitle(item.Entry), + ImageURL: item.Entry.ImageUrl, + Class: "notification-card", + ImgClass: "notification-image", + }) {
{ displayTitle(item.Entry) } @@ -141,7 +137,7 @@ templ NotificationCard(item WatchingAnimeWithDetails) { }
-
+ } } func displayTitle(entry database.GetWatchingAnimeRow) string { diff --git a/internal/templates/schedule.templ b/internal/templates/schedule.templ index d4c5e9d..e86c12f 100644 --- a/internal/templates/schedule.templ +++ b/internal/templates/schedule.templ @@ -52,14 +52,13 @@ templ ScheduleDay(day string, animes []jikan.Anime) { } templ ScheduleAnimeCard(anime jikan.Anime) { - -
- if anime.ImageURL() != "" { - { - } else { -
No image
- } -
+ @ui.AnimeCard(ui.AnimeCardProps{ + ID: anime.MalID, + Title: anime.DisplayTitle(), + ImageURL: anime.ImageURL(), + Class: "schedule-card", + ImgClass: "schedule-card-image", + }) {
{ anime.DisplayTitle() }
@@ -77,5 +76,5 @@ templ ScheduleAnimeCard(anime jikan.Anime) {
★ { fmt.Sprintf("%.1f", anime.Score) }
}
-
+ } }