Major overhaul v2

This commit is contained in:
2026-03-08 12:58:09 -04:00
parent 26d0a7b0a3
commit 6e527502db
8 changed files with 485 additions and 192 deletions

View File

@@ -11,7 +11,7 @@ module CommunityLanding
if s.contributors_enabled || (s.participation_enabled rescue true)
User
.joins(:posts)
.includes(:user_profile)
.includes(:user_profile, :user_stat)
.where(posts: { created_at: s.contributors_days.days.ago.. })
.where.not(username: %w[system discobot])
.where(active: true, staged: false)

View File

@@ -419,9 +419,6 @@ module CommunityLanding
title_text = @s.participation_title.presence || "Participation"
border = @s.participation_border_style rescue "none"
min_h = @s.participation_min_height rescue 0
count_label = @s.contributors_count_label.presence || ""
show_count = @s.contributors_count_label_enabled rescue true
html = +""
html << "<section class=\"cl-participation cl-anim\" id=\"cl-participation\"#{section_style(border, min_h)}><div class=\"cl-container\">\n"
html << "<h2 class=\"cl-section-title\"#{title_style(:participation_title_size)}>#{e(title_text)}</h2>\n" if show_title
@@ -429,20 +426,31 @@ module CommunityLanding
html << "<div class=\"cl-participation__grid#{stagger_class}\">\n"
users_with_bio.each do |user|
avatar_url = user.avatar_template.to_s.gsub("{size}", "120")
activity_count = user.attributes["post_count"].to_i rescue 0
bio_raw = user.user_profile.bio_excerpt.to_s
bio_text = bio_raw.length > bio_max ? "#{bio_raw[0...bio_max]}..." : bio_raw
count_prefix = show_count && count_label.present? ? "#{e(count_label)} " : ""
avatar_url = user.avatar_template.to_s.gsub("{size}", "120")
bio_raw = user.user_profile.bio_excerpt.to_s
bio_text = bio_raw.length > bio_max ? "#{bio_raw[0...bio_max]}..." : bio_raw
join_date = user.created_at.strftime("Joined %b %Y") rescue "Member"
location = (user.user_profile&.location.presence rescue nil)
meta_line = location ? "#{join_date} · #{e(location)}" : join_date
topic_count = (user.user_stat&.topic_count.to_i rescue 0)
post_count = (user.user_stat&.post_count.to_i rescue 0)
likes_received = (user.user_stat&.likes_received.to_i rescue 0)
html << "<div class=\"cl-participation-card\">\n"
html << "<div class=\"cl-participation-card__header\">\n"
html << "<div class=\"cl-participation-card__quote\">#{Icons::QUOTE_SVG}</div>\n"
html << "<p class=\"cl-participation-card__bio\">#{e(bio_text)}</p>\n"
html << "</div>\n"
html << "<div class=\"cl-participation-card__stats\">\n"
html << "<div class=\"cl-participation-stat\"><span class=\"cl-participation-stat__value\">#{topic_count}</span><span class=\"cl-participation-stat__label\">Topics</span></div>\n"
html << "<div class=\"cl-participation-stat\"><span class=\"cl-participation-stat__value\">#{post_count}</span><span class=\"cl-participation-stat__label\">Posts</span></div>\n"
html << "<div class=\"cl-participation-stat\"><span class=\"cl-participation-stat__value\">#{likes_received}</span><span class=\"cl-participation-stat__label\">Likes</span></div>\n"
html << "</div>\n"
html << "<div class=\"cl-participation-card__footer\">\n"
html << "<img src=\"#{avatar_url}\" alt=\"#{e(user.username)}\" class=\"cl-participation-card__avatar\" loading=\"lazy\">\n"
html << "<div class=\"cl-participation-card__meta\">\n"
html << "<span class=\"cl-participation-card__name\">@#{e(user.username)}</span>\n"
html << "<span class=\"cl-participation-card__count\">#{count_prefix}#{activity_count}</span>\n"
html << "<span class=\"cl-participation-card__count\">#{e(meta_line)}</span>\n"
html << "</div>\n"
html << "</div>\n"
html << "</div>\n"

View File

@@ -56,6 +56,11 @@ module CommunityLanding
part_card_dark = safe_hex(:participation_card_bg_dark)
part_card_light = safe_hex(:participation_card_bg_light)
part_icon_color = safe_hex(:participation_icon_color)
part_stat_color = safe_hex(:participation_stat_color)
part_stat_lbl_color = safe_hex(:participation_stat_label_color)
part_bio_color = safe_hex(:participation_bio_color)
part_name_color = safe_hex(:participation_name_color)
part_meta_color = safe_hex(:participation_meta_color)
orb_color = safe_hex(:orb_color)
orb_opacity = [[@s.orb_opacity.to_i, 0].max, 100].min rescue 50
@@ -128,6 +133,11 @@ module CommunityLanding
--cl-about-card-bg: #{about_dark_css};
--cl-participation-card-bg: #{part_card_dark || 'var(--cl-card)'};
--cl-participation-icon-color: #{part_icon_color || 'var(--cl-accent)'};
--cl-participation-stat-color: #{part_stat_color || 'var(--cl-text-strong)'};
--cl-participation-stat-label-color: #{part_stat_lbl_color || 'var(--cl-text-muted, var(--cl-text))'};
--cl-participation-bio-color: #{part_bio_color || 'var(--cl-text)'};
--cl-participation-name-color: #{part_name_color || 'var(--cl-text-strong)'};
--cl-participation-meta-color: #{part_meta_color || 'var(--cl-participation-icon-color)'};
--cl-faq-card-bg: #{faq_card_dark || 'var(--cl-card)'};
--cl-app-gradient: linear-gradient(135deg, #{app_g1_dark}, #{app_g2_dark}, #{app_g3_dark});#{dark_extras}
}
@@ -153,6 +163,11 @@ module CommunityLanding
--cl-about-card-bg: #{about_light_css};
--cl-participation-card-bg: #{part_card_light || part_card_dark || 'var(--cl-card)'};
--cl-participation-icon-color: #{part_icon_color || 'var(--cl-accent)'};
--cl-participation-stat-color: #{part_stat_color || 'var(--cl-text-strong)'};
--cl-participation-stat-label-color: #{part_stat_lbl_color || 'var(--cl-text-muted, var(--cl-text))'};
--cl-participation-bio-color: #{part_bio_color || 'var(--cl-text)'};
--cl-participation-name-color: #{part_name_color || 'var(--cl-text-strong)'};
--cl-participation-meta-color: #{part_meta_color || 'var(--cl-participation-icon-color)'};
--cl-faq-card-bg: #{faq_card_light || faq_card_dark || 'var(--cl-card)'};
--cl-app-gradient: linear-gradient(135deg, #{app_g1_light || app_g1_dark}, #{app_g2_light || app_g2_dark}, #{app_g3_light || app_g3_dark});#{light_extras}
}
@@ -176,6 +191,11 @@ module CommunityLanding
--cl-about-card-bg: #{about_light_css};
--cl-participation-card-bg: #{part_card_light || part_card_dark || 'var(--cl-card)'};
--cl-participation-icon-color: #{part_icon_color || 'var(--cl-accent)'};
--cl-participation-stat-color: #{part_stat_color || 'var(--cl-text-strong)'};
--cl-participation-stat-label-color: #{part_stat_lbl_color || 'var(--cl-text-muted, var(--cl-text))'};
--cl-participation-bio-color: #{part_bio_color || 'var(--cl-text)'};
--cl-participation-name-color: #{part_name_color || 'var(--cl-text-strong)'};
--cl-participation-meta-color: #{part_meta_color || 'var(--cl-participation-icon-color)'};
--cl-faq-card-bg: #{faq_card_light || faq_card_dark || 'var(--cl-card)'};
--cl-app-gradient: linear-gradient(135deg, #{app_g1_light || app_g1_dark}, #{app_g2_light || app_g2_dark}, #{app_g3_light || app_g3_dark});#{light_extras}
}