song.templ (1910B)
1 package song 2 3 import ( 4 "lyrics/internal/domain" 5 "lyrics/internal/server/routes" 6 "lyrics/internal/server/ui/layouts/base" 7 "time" 8 ) 9 10 templ Song(params SongParams) { 11 @base.Base(base.BaseParams{Title: params.Song.Title, PageStylesheets: []string{"song.css"}}) { 12 <article class="song-layout"> 13 <section class="song-content"> 14 <header> 15 <h1 id="song-title"> 16 { params.Song.Title } 17 if params.Song.LatinTitle != nil { 18 <span>({ *params.Song.LatinTitle })</span> 19 } 20 </h1> 21 </header> 22 <section> 23 <h2 id="lyrics-heading">Lyrics</h2> 24 <pre>{ params.Song.Lyrics }</pre> 25 </section> 26 </section> 27 <aside class="song-details"> 28 <dl> 29 <dt>Artist(s)</dt> 30 <dd> 31 <ul> 32 for _, artist := range params.Song.Artists { 33 <li> 34 <a href={ routes.Artist(artist.Artist) }> 35 { artist.Artist.Name } 36 if artist.Artist.LatinName != nil { 37 <span>({ *artist.Artist.LatinName })</span> 38 } 39 if artist.Role == domain.RoleFeatured { 40 <span>[featured]</span> 41 } 42 </a> 43 </li> 44 } 45 </ul> 46 </dd> 47 <dt>Released</dt> 48 <dd> 49 <time datetime={ params.Song.ReleaseDate.Format(time.DateOnly) }> 50 { params.Song.ReleaseDate.Format("Jan 2, 2006") } 51 </time> 52 </dd> 53 <dt>Genre(s)</dt> 54 <dd> 55 <ul> 56 for _, genre := range params.Song.Genres { 57 <li>{ genre }</li> 58 } 59 </ul> 60 </dd> 61 <dt>Release(s)</dt> 62 <dd> 63 <ul> 64 for _, release := range params.Song.Releases { 65 <li> 66 <a href={ routes.Release(release.Release) }> 67 { release.Release.Title } 68 if release.Release.LatinTitle != nil { 69 <span>({ *release.Release.LatinTitle })</span> 70 } 71 </a> 72 </li> 73 } 74 </ul> 75 </dd> 76 </dl> 77 </aside> 78 </article> 79 } 80 }