diff --git a/static/css/v3/buttons.css b/static/css/v3/buttons.css
index fa6d19ed5..689467e03 100644
--- a/static/css/v3/buttons.css
+++ b/static/css/v3/buttons.css
@@ -70,6 +70,7 @@
.btn-secondary {
border-color: var(--color-stroke-strong);
+ background-color: var(--color-surface-weak);
color: var(--color-text-primary);
}
diff --git a/static/css/v3/components.css b/static/css/v3/components.css
index 4989719dc..585fe62d8 100644
--- a/static/css/v3/components.css
+++ b/static/css/v3/components.css
@@ -54,3 +54,5 @@
@import "./library-discovery-card.css";
@import "./help-card.css";
@import "./quick-start-card.css";
+@import "./mailing-list-activity-card.css";
+@import "./user-profile-bio-card.css";
diff --git a/static/css/v3/mailing-list-activity-card.css b/static/css/v3/mailing-list-activity-card.css
new file mode 100644
index 000000000..c506220d3
--- /dev/null
+++ b/static/css/v3/mailing-list-activity-card.css
@@ -0,0 +1,25 @@
+.mailing-list-activity-card__mailing-items {
+ display: grid;
+ grid-template-columns: auto 1fr;
+ width: 100%;
+ gap: var(--space-large);
+}
+
+.mailing-list-activity-card__date {
+ color: var(--color-text-secondary);
+ font-family: var(--font-sans);
+ font-size: var(--font-size-xs);
+ font-weight: var(--font-weight-regular);
+ line-height: var(--line-height-default);
+ letter-spacing: var(--letter-spacing-tight);
+ width: 80px;
+}
+
+.mailing-list-activity-card__headline {
+ color: var(--color-text-primary);
+ font-family: var(--font-sans);
+ font-size: var(--font-size-small);
+ font-weight: var(--font-weight-medium);
+ line-height: var(--line-height-relaxed);
+ letter-spacing: var(--letter-spacing-tight);
+}
diff --git a/static/css/v3/post-card.css b/static/css/v3/post-card.css
index e59209140..8b7aef295 100644
--- a/static/css/v3/post-card.css
+++ b/static/css/v3/post-card.css
@@ -44,6 +44,15 @@
letter-spacing: -0.12px;
}
+.post-card__summary {
+ color: var(--color-text-secondary);
+ font-family: var(--font-sans);
+ font-size: var(--font-size-xs);
+ font-weight: var(--font-weight-regular);
+ line-height: var(--line-height-default);
+ letter-spacing: var(--letter-spacing-tight);
+}
+
.post-card__meta > :not(:first-child)::before {
content: "•";
user-select: none;
diff --git a/static/css/v3/user-profile-bio-card.css b/static/css/v3/user-profile-bio-card.css
new file mode 100644
index 000000000..e7ba5b62f
--- /dev/null
+++ b/static/css/v3/user-profile-bio-card.css
@@ -0,0 +1,17 @@
+.bio-card__contributor_role {
+ color: var(--color-text-primary);
+ font-family: var(--font-sans);
+ font-size: var(--font-size-small);
+ font-weight: var(--font-weight-medium);
+ line-height: var(--line-height-relaxed);
+ letter-spacing: var(--letter-spacing-tight);
+}
+
+.bio-card__contributor_libraries {
+ color: var(--color-text-secondary);
+ font-family: var(--font-sans);
+ font-size: var(--font-size-small);
+ font-weight: var(--font-weight-regular);
+ line-height: var(--line-height-relaxed);
+ letter-spacing: var(--letter-spacing-tight);
+}
diff --git a/static/css/v3/user-profile-page.css b/static/css/v3/user-profile-page.css
new file mode 100644
index 000000000..0dfac7ead
--- /dev/null
+++ b/static/css/v3/user-profile-page.css
@@ -0,0 +1,77 @@
+/* ──────── Top Level Container ──────── */
+.user-profile__container {
+ margin-top: var(--space-xl);
+ padding: 0 var(--space-large);
+}
+
+/* ──────── Header row, including profile card and buttons ──────── */
+
+.user-profile__profile-card-row {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ margin-bottom: var(--space-large);
+ align-items: flex-end;
+}
+
+.user-profile__button-group {
+ display: flex;
+ flex-direction: row;
+ gap: var(--space-s);
+ height: fit-content;
+ align-self: flex-end;
+ max-width: 100%;
+ flex-wrap: wrap;
+}
+
+/* ──────── Two Row Card Display ──────── */
+
+.user-profile__profile-content-area {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: var(--space-large);
+ margin-bottom: var(--space-xl);
+}
+
+
+.user-profile__col {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-large);
+}
+
+/* ──────── Override card width to fill columns ────────*/
+
+.user-profile__profile-content-area .card,
+.user-profile__profile-content-area .card-group {
+ max-width: 100%;
+}
+
+@media (max-width: 767px) {
+ /* ──────── Stack header row on mobile ──────── */
+ .user-profile__profile-card-row {
+ flex-direction: column;
+ gap: var(--space-xl);
+ align-items: flex-start;
+ }
+
+ /* ──────── Collapse to one column on mobile ──────── */
+ .user-profile__profile-content-area {
+ grid-template-columns: 1fr;
+ }
+
+ /* Lift the column wrappers out of the layout so the cards become
+ direct grid children and `order` can interleave them in the
+ single-column cascade. */
+ .user-profile__col {
+ display: contents;
+ }
+
+ .user-profile__bio { order: 1; }
+ .user-profile__achievements { order: 2; }
+ .user-profile__badges { order: 3; }
+ .user-profile__github { order: 4; }
+ .user-profile__posts { order: 5; }
+ .user-profile__mailing-list { order: 6; }
+ .user-profile__connections { order: 7; }
+}
diff --git a/templates/includes/icon.html b/templates/includes/icon.html
index 80709f8da..e2381cae2 100644
--- a/templates/includes/icon.html
+++ b/templates/includes/icon.html
@@ -109,6 +109,16 @@