From f1716fe0d16d42da7d3ca9b85847a63fc27da456 Mon Sep 17 00:00:00 2001 From: Dennis Reimann Date: Mon, 2 Oct 2023 16:45:33 +0200 Subject: [PATCH] Improve participants lists --- helpers.js | 7 ++++-- src/css/sections/podcast.css | 44 ++++++++++++++++++++---------------- src/includes/mixins.pug | 25 ++++++++++++-------- tasks/fetch_feed.js | 3 ++- 4 files changed, 47 insertions(+), 32 deletions(-) diff --git a/helpers.js b/helpers.js index 4d84e2030b2..2f395ff215e 100644 --- a/helpers.js +++ b/helpers.js @@ -37,8 +37,11 @@ const truncate = (str, wordCount) => { return [head, tail] } -const memberUrl = member => - member.url || member.nostr ? `https://snort.social/p/${member.nostr}` : `https://twitter.com/${member.twitter}` +const memberUrl = member => { + if (member.url) return member.url + else if (member.nostr) return `https://snort.social/p/${member.nostr}` + else if (member.twitter) return `https://twitter.com/${member.twitter}` +} module.exports = { markdown: mdTransformer.render, diff --git a/src/css/sections/podcast.css b/src/css/sections/podcast.css index 07c971dbaf0..b6ad4f8192b 100644 --- a/src/css/sections/podcast.css +++ b/src/css/sections/podcast.css @@ -82,8 +82,8 @@ .avatar { display: block; - height: 2rem; - width: 2rem; + height: var(--avatar-size, 2rem); + width: var(--avatar-size, 2rem); border-radius: 50%; } @@ -101,13 +101,14 @@ } .episodeItem { + --avatar-size: 1rem; margin: 0; border-radius: var(--space-l); background-color: var(--color-card-bg); transition-property: background-color; transition-duration: var(--transition-duration-fast); - & a { + & a.plain { display: flex; &:hover .meta { @@ -146,18 +147,25 @@ & .content { flex: 1; - - @media (--up_to_M) { - padding: var(--space-m) var(--space-l); - } - @media (--M_and_up) { - padding: var(--space-l); - } + padding: var(--space-m) var(--space-l); & > *:last-child { margin-bottom: 0; } } + + & .participants { + margin-top: var(--space-m); + } +} + +.player .participants, +.episodeItem .participants { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: var(--space-m); + list-style: none; } .player { @@ -166,6 +174,7 @@ display: flex; border-radius: var(--border-radius); + background-color: var(--color-card-bg); overflow: hidden; @media (--up_to_M) { @@ -173,6 +182,10 @@ min-width: 300px; max-width: 400px; } + + & .participants { + margin: var(--space-m) var(--space-l) var(--space-m) calc(var(--player-button-size) + var(--player-button-margin) + var(--space-l)); + } } .player__coverlink { @@ -194,7 +207,6 @@ flex-direction: column; flex: 1; color: var(--color-body-text); - background-color: var(--color-card-bg); transition-property: color, background-color; transition-duration: var(--transition-duration-fast); } @@ -231,15 +243,7 @@ content: '2.0x'; } -.player__participants { - flex-wrap: wrap; - gap: var(--space-m); - margin: 0 0 0 calc(var(--player-button-size) + var(--player-button-margin)); - list-style: none; -} - -.player__controls, -.player__participants { +.player__controls { display: flex; align-items: center; padding: var(--space-m) var(--space-l); diff --git a/src/includes/mixins.pug b/src/includes/mixins.pug index 53315d25cda..585f923e8c3 100644 --- a/src/includes/mixins.pug +++ b/src/includes/mixins.pug @@ -125,6 +125,19 @@ mixin spende(d, trunc = false) else if d.info p.info= d.info +mixin participants(ps, link) + .participants + for participant in ps + - const member = team[participant.toLowerCase()] + if member + if link + a(href=memberUrl(member)) + img.avatar(src=assetPath(member.image || "/img/avatar.svg") alt=member.name) + else + img.avatar(src=assetPath(member.image || "/img/avatar.svg") alt=member.name) + else + img.avatar(src=assetPath("/img/avatar.svg") alt=participant) + mixin episodeItem(e) article.episodeItem&attributes(attributes) a.plain(href=`/podcast/${e.slug}/`) @@ -135,6 +148,8 @@ mixin episodeItem(e) span= e.categoryName + (e.number ? ` #${e.number}` : '') time(datetime=e.date)= e.block || formatDate(e.date) .title=e.titlePlain + if e.participants.length + +participants(e.participants, false) mixin episodePlayer(e) .player.player--single&attributes(attributes) @@ -167,15 +182,7 @@ mixin episodePlayer(e) .player__name(data-amplitude-song-info="name" data-amplitude-main-song-info="true") if e.participants.length - ul.player__participants - for participant in e.participants - - const member = team[participant.toLowerCase()] - li - if member - a(href=memberUrl(member)) - img.avatar(src=assetPath(member.image || "/img/avatar.svg") alt=member.name) - else - img.avatar(src=assetPath("/img/avatar.svg") alt=participant) + +participants(e.participants, true) .player__links a.player__download(href=e.enclosure.url) diff --git a/tasks/fetch_feed.js b/tasks/fetch_feed.js index 6548e49dd0e..48cbb8c0505 100644 --- a/tasks/fetch_feed.js +++ b/tasks/fetch_feed.js @@ -67,12 +67,13 @@ const parseEpisode = e => { const duration = e['itunes:duration'] const enclosure = e.enclosure.__attr const [, participantsString] = - firstLine.match(/(?:(?:von\sund\s)?mit\s)([^.]*)$/i) || [] + firstLine.match(/(?:(?:von\sund\s)?mit\s)([^.]*)/i) || [] const participants = participantsString ? participantsString .replace(/(\s*,\s*|\s*und\s*|\s*&\s*)/gi, '%') .trim() .split('%') + .map(p => p.trim()) : [] return { block,