Skip to content

Commit 8362f33

Browse files
committed
Unify/nicefy participant lists
Make them more compact, and use icons for contributor statuses instead of colored borders.
1 parent 7c77699 commit 8362f33

6 files changed

Lines changed: 70 additions & 81 deletions

File tree

app/assets/stylesheets/colors.css

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
--color-bg-input: var(--color-gray-50);
5252
--color-bg-container: #ffffff;
5353
--color-bg-card: var(--color-bg-container);
54+
--color-bg-card-hover: var(--color-gray-200);
5455
--color-bg-hover: var(--color-primary-2);
5556
--color-bg-sidebar: #f3f4ff;
5657
--color-bg-sidebar-header: var(--color-primary-2);
@@ -141,6 +142,7 @@
141142
--color-bg-input: var(--color-gray-100);
142143
--color-bg-container: var(--color-primary-2);
143144
--color-bg-card: var(--color-gray-100);
145+
--color-bg-card-hover: var(--color-gray-300);
144146
--color-bg-hover: var(--color-gray-300);
145147
--color-bg-sidebar: var(--color-primary-2);
146148
--color-bg-sidebar-header: var(--color-gray-100);

app/assets/stylesheets/components/participants.css

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@
3939
}
4040
}
4141

42+
.participant-left {
43+
text-align: left;
44+
}
45+
4246
.participant-avatar-link {
4347
display: inline-block;
4448
}
@@ -52,30 +56,8 @@
5256
text-decoration: underline;
5357
}
5458

55-
.participant-avatar.is-core-team {
56-
border-color: #ff0080;
57-
border-width: 3px;
58-
box-shadow: 0 0 0 1px #ff0080;
59-
}
60-
61-
.participant-avatar.is-committer {
62-
border-color: #8b5cf6;
63-
border-width: 3px;
64-
}
65-
66-
.participant-avatar.is-major-contributor {
67-
border-color: #f59e0b;
68-
border-width: 2px;
69-
}
70-
71-
.participant-avatar.is-significant-contributor {
72-
border-color: #10b981;
73-
border-width: 2px;
74-
}
75-
76-
.participant-avatar.is-past-contributor {
77-
border-color: var(--color-text-muted);
78-
border-style: dashed;
59+
.participant-name-link.is-committer {
60+
font-weight: var(--font-weight-semibold);
7961
}
8062

8163
.participants-count {

app/assets/stylesheets/components/topics.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@
217217
border-radius: var(--border-radius-md);
218218
padding: var(--spacing-3);
219219
box-shadow: var(--shadow-lg);
220-
min-width: 260px;
220+
min-width: 320px;
221221
}
222222

223223
.topic-participants .topic-icon-hover {

app/assets/stylesheets/layouts/topic-view.css

Lines changed: 31 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -86,62 +86,57 @@
8686
.participants-list {
8787
display: flex;
8888
flex-direction: column;
89-
gap: var(--spacing-3);
89+
gap: var(--spacing-1);
9090
}
9191

9292
.participant-row {
93-
display: grid;
94-
grid-template-columns: auto 1fr;
95-
gap: var(--spacing-3);
93+
display: flex;
9694
align-items: center;
97-
padding: var(--spacing-3);
98-
border: var(--border-width) solid var(--color-border);
99-
border-radius: var(--border-radius-md);
95+
justify-content: space-between;
96+
padding: 0 var(--spacing-3);
10097
background: var(--color-bg-card);
101-
transition: transform var(--transition-fast), box-shadow var(--transition-fast), border-color var(--transition-fast);
102-
103-
&.is-core-team {
104-
border-color: #ff0080;
105-
box-shadow: 0 2px 8px rgba(255, 0, 128, 0.15);
106-
}
107-
108-
&.is-committer {
109-
border-color: #8b5cf6;
110-
box-shadow: 0 2px 8px rgba(139, 92, 246, 0.12);
111-
}
112-
113-
&.is-major-contributor {
114-
border-color: #f59e0b;
115-
box-shadow: 0 2px 8px rgba(245, 158, 11, 0.12);
116-
}
117-
118-
&.is-significant-contributor {
119-
border-color: #10b981;
120-
box-shadow: 0 2px 8px rgba(16, 185, 129, 0.12);
121-
}
122-
123-
&.is-past-contributor {
124-
border-color: var(--color-border);
125-
background: var(--color-gray-50);
126-
}
12798

12899
&:hover {
129-
transform: translateY(-2px);
130-
box-shadow: var(--shadow-lg);
100+
background: var(--color-bg-card-hover);
131101
}
132102
}
133103

104+
.participant-left {
105+
display: flex;
106+
align-items: center;
107+
gap: var(--spacing-3);
108+
min-width: 0;
109+
}
110+
134111
.participant-details {
135112
display: flex;
136113
flex-direction: column;
137114
gap: var(--spacing-1);
138115
}
139116

140117
.participant-name {
141-
font-weight: var(--font-weight-semibold);
142118
color: var(--color-text-primary);
143119
}
144120

121+
.participant-memberships {
122+
display: inline-flex;
123+
align-items: center;
124+
gap: var(--spacing-2);
125+
color: var(--color-text-muted);
126+
font-size: var(--font-size-sm);
127+
}
128+
129+
.participant-icon {
130+
display: inline-flex;
131+
align-items: center;
132+
justify-content: center;
133+
width: 22px;
134+
height: 22px;
135+
border-radius: var(--border-radius-full);
136+
background: var(--color-bg-hover);
137+
color: var(--color-text-secondary);
138+
}
139+
145140
.participant-more {
146141
color: var(--color-text-muted);
147142
font-size: var(--font-size-sm);

app/models/topic.rb

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,14 @@ def contributor_participants
7373

7474
stats = messages.joins(sender: :person)
7575
.where(people: { id: contributor_ids })
76-
.group(:sender_id)
77-
.select('sender_id, COUNT(*) AS message_count, MAX(messages.created_at) AS last_at')
76+
.group('people.id')
77+
.select('people.id AS person_id, COUNT(*) AS message_count, MAX(messages.created_at) AS last_at')
7878

79-
alias_map = Alias.includes(person: :contributor_memberships).where(id: stats.map(&:sender_id)).index_by(&:id)
79+
people = Person.includes(:default_alias, :contributor_memberships).where(id: stats.map(&:person_id)).index_by(&:id)
8080

8181
stats.map do |row|
82-
alias_record = alias_map[row.sender_id]
82+
person = people[row.person_id]
83+
alias_record = person&.default_alias
8384
next unless alias_record
8485

8586
{

app/views/topics/_participant_row.html.slim

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,28 @@
88
- tooltip_parts << "last #{smart_time_display(last_at)}" if last_at
99
- tooltip = local_assigns[:tooltip] || (tooltip_parts.any? ? tooltip_parts.join(", ") : alias_record.name)
1010
- avatar_classes = ["participant-avatar"]
11-
- avatar_classes << "is-core-team" if alias_record.core_team?
12-
- avatar_classes << "is-committer" if !alias_record.core_team? && alias_record.committer?
13-
- avatar_classes << "is-major-contributor" if !alias_record.core_team? && !alias_record.committer? && alias_record.major_contributor?
14-
- avatar_classes << "is-significant-contributor" if !alias_record.core_team? && !alias_record.committer? && !alias_record.major_contributor? && alias_record.significant_contributor?
15-
- avatar_classes << "is-past-contributor" if alias_record.past_contributor?
16-
- row_classes = ["participant-row"]
17-
- row_classes << "is-core-team" if alias_record.core_team?
18-
- row_classes << "is-committer" if alias_record.committer?
19-
- row_classes << "is-major-contributor" if alias_record.major_contributor?
20-
- row_classes << "is-significant-contributor" if alias_record.significant_contributor?
21-
- row_classes << "is-past-contributor" if alias_record.past_contributor?
22-
.participant-row class=row_classes.join(" ") title=tooltip
23-
= link_to person_path(alias_record.email), class: "participant-avatar-link" do
24-
= image_tag alias_record.display_gravatar_url(size: avatar_size), class: avatar_classes.join(" "), alt: alias_record.name, title: tooltip
25-
.participant-details
26-
.participant-name = link_to alias_record.name, person_path(alias_record.email), class: "participant-name-link"
11+
- membership_icons = []
12+
- membership_types = alias_record.contributor_membership_types
13+
- if membership_types.include?("core_team")
14+
- membership_icons << { icon: "fa-solid fa-people-group", label: "Core Team" }
15+
- if membership_types.include?("committer")
16+
- membership_icons << { icon: "fa-solid fa-code-branch", label: "Committer" }
17+
- if membership_types.include?("major_contributor")
18+
- membership_icons << { icon: "fa-solid fa-star", label: "Major Contributor" }
19+
- if membership_types.include?("significant_contributor")
20+
- membership_icons << { icon: "fa-solid fa-award", label: "Significant Contributor" }
21+
- if membership_types.include?("past_major_contributor") || membership_types.include?("past_significant_contributor")
22+
- membership_icons << { icon: "fa-solid fa-clock-rotate-left", label: "Past Contributor" }
23+
.participant-row title=tooltip
24+
.participant-left
25+
= link_to person_path(alias_record.email), class: "participant-avatar-link" do
26+
= image_tag alias_record.display_gravatar_url(size: avatar_size), class: avatar_classes.join(" "), alt: alias_record.name, title: tooltip
27+
.participant-details
28+
- name_classes = ["participant-name-link"]
29+
- name_classes << "is-committer" if membership_types.include?("committer")
30+
.participant-name = link_to alias_record.name, person_path(alias_record.email), class: name_classes.join(" ")
31+
- if membership_icons.any?
32+
.participant-memberships
33+
- membership_icons.each do |entry|
34+
span.participant-icon title=entry[:label]
35+
i class=entry[:icon]

0 commit comments

Comments
 (0)