0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-02-10 23:36:14 -05:00

Changed post and page rows go to editor plus code and styles cleanup

- Made the majority of the row go to the editor instead
- Removed illegal nested hyperlinks and cleaned up other markup
- Removed some feature flag code around this page and fixed styles for them
- Improved some dark mode styling
- Lots of refactoring with code and styles

refs https://github.com/TryGhost/Team/issues/2223
This commit is contained in:
James Morris 2022-11-08 14:29:04 +00:00
parent d4c0224fd8
commit 2fb6fcabb2
5 changed files with 147 additions and 268 deletions

View file

@ -1,5 +1,5 @@
{{!-- template-lint-disable no-invalid-interactive --}}
<li class="gh-list-row gh-posts-list-item gh-posts-list-item-labs gh-post-list-plain-status"
<li class="gh-list-row gh-posts-list-item gh-post-list-plain-status"
{{on "mouseover" this.mouseOver}}
{{on "mouseleave" this.mouseLeave}}
...attributes
@ -45,7 +45,7 @@
{{/unless}}
</a>
{{else}}
<LinkTo @route={{this.routeForLink}} @models={{this.modelsForLink}} class="permalink gh-list-data gh-post-list-title">
<LinkTo @route="editor.edit" @models={{array this.post.displayName this.post.id}} class="permalink gh-list-data gh-post-list-title">
<h3 class="gh-content-entry-title">
{{@post.title}}
{{#if @post.lexical}}
@ -74,10 +74,10 @@
</p>
<p class="gh-content-entry-status">
{{#if @post.isScheduled}}
<span class="scheduled" {{on "mouseover" (fn (mut this.isStateHovered) true)}} {{on "mouseleave" (fn (mut this.isStateHovered) false)}}>
<span class="scheduled">
<span class="status-dot"></span>
Scheduled
{{#if this.isStateHovered}}
{{#if this.isHovered}}
<span class="schedule-details" {{css-transition "anim-fade-in-scale"}}>to be published {{if @post.newsletter "and sent "}}{{this.scheduledText}} to {{humanize-recipient-filter @post.emailSegment}}</span>
{{/if}}
</span>
@ -91,7 +91,7 @@
{{/if}}
{{#if @post.isPublished}}
<span class="published {{this.errorClass}}" {{on "mouseover" (fn (mut this.isStateHovered) true)}} {{on "mouseleave" (fn (mut this.isStateHovered) false)}}>
<span class="published {{this.errorClass}}">
Published
{{#if @post.didEmailFail}}
but failed to send newsletter
@ -105,7 +105,7 @@
{{/if}}
{{#if @post.isSent}}
<span class="sent {{this.errorClass}}" {{on "mouseover" (fn (mut this.isStateHovered) true)}} {{on "mouseleave" (fn (mut this.isStateHovered) false)}}>
<span class="sent {{this.errorClass}}">
{{#if @post.didEmailFail}}
Failed to send newsletter
{{else}}
@ -122,9 +122,60 @@
{{/if}}
{{!-- Opened / Signups column --}}
<LinkTo @route={{this.routeForLink}} @models={{this.modelsForLink}} class="permalink gh-list-data gh-post-list-opens">
{{#if (and @post.showEmailOpenAnalytics @post.showEmailClickAnalytics) }}
<LinkTo @route="members" @query={{hash filterParam=(concat "opened_emails.post_id:[" @post.id "]") }} class="flex flex-column gh-post-row-event" {{on "mouseover" (fn (mut this.isOpenStatHovered) true)}} {{on "mouseleave" (fn (mut this.isOpenStatHovered) false)}}>
{{#if (and @post.showEmailOpenAnalytics @post.showEmailClickAnalytics) }}
<LinkTo @route="members" @query={{hash filterParam=(concat "opened_emails.post_id:[" @post.id "]") }} class="permalink gh-list-data gh-post-list-metrics">
<span class="gh-content-email-stats-value">
{{#if this.isHovered}}
{{format-number @post.email.openedCount}}
{{else}}
{{@post.email.openRate}}<sup>%</sup>
{{/if}}
</span>
<span class="gh-content-email-stats">
opened
</span>
</LinkTo>
{{else if (and @post.isPage @post.showAttributionAnalytics) }}
<LinkTo @route="members" @query={{hash filterParam=(concat "signup:[" @post.id "]") }} class="permalink gh-list-data gh-post-list-metrics">
<span class="gh-content-email-stats-value">
{{@post.count.signups}}
</span>
<span class="gh-content-email-stats">
signups
</span>
</LinkTo>
{{else}}
<LinkTo @route="editor.edit" @models={{array this.post.displayName this.post.id}} class="permalink gh-list-data">
{{!-- Empty on purpose --}}
</LinkTo>
{{/if}}
{{!-- Clicked / Conversions column --}}
{{#if @post.showEmailClickAnalytics }}
<LinkTo @route="members" @query={{hash filterParam=(concat "clicked_links.post_id:[" @post.id "]") }} class="permalink gh-list-data gh-post-list-metrics">
<span class="gh-content-email-stats-value">
{{#if this.isHovered}}
{{format-number @post.count.clicks}}
{{else}}
{{@post.clickRate}}<sup>%</sup>
{{/if}}
</span>
<span class="gh-content-email-stats">
clicked
</span>
</LinkTo>
{{else if (and @post.isPage @post.showPaidAttributionAnalytics) }}
<LinkTo @route="members" @query={{hash filterParam=(concat "conversion:[" @post.id "]") }} class="permalink gh-list-data gh-post-list-metrics">
<span class="gh-content-email-stats-value">
{{@post.count.paid_conversions}}
</span>
<span class="gh-content-email-stats">
conversions
</span>
</LinkTo>
{{else}}
{{#if @post.showEmailOpenAnalytics }}
<LinkTo @route="members" @query={{hash filterParam=(concat "opened_emails.post_id:[" @post.id "]") }} class="permalink gh-list-data gh-post-list-metrics">
<span class="gh-content-email-stats-value">
{{#if this.isHovered}}
{{format-number @post.email.openedCount}}
@ -136,73 +187,25 @@
opened
</span>
</LinkTo>
{{else if (and @post.isPage @post.showAttributionAnalytics) }}
<LinkTo @route="members" @query={{hash filterParam=(concat "signup:[" @post.id "]") }} class="flex flex-column gh-post-row-event" {{on "mouseover" (fn (mut this.isOpenStatHovered) true)}} {{on "mouseleave" (fn (mut this.isOpenStatHovered) false)}}>
<span class="gh-content-email-stats-value">
{{@post.count.signups}}
</span>
<span class="gh-content-email-stats">
signups
</span>
{{else}}
<LinkTo @route="editor.edit" @models={{array this.post.displayName this.post.id}} class="permalink gh-list-data">
{{!-- Empty on purpose --}}
</LinkTo>
{{/if}}
</LinkTo>
{{!-- Clicked / Conversions column --}}
<LinkTo @route={{this.routeForLink}} @models={{this.modelsForLink}} class="permalink gh-list-data gh-post-list-clicks">
{{#unless @post.showEmailClickAnalytics}}
{{#if @post.showEmailOpenAnalytics }}
<LinkTo @route="members" @query={{hash filterParam=(concat "opened_emails.post_id:[" @post.id "]") }} class="flex flex-column gh-post-row-event" {{on "mouseover" (fn (mut this.isOpenStatHovered) true)}} {{on "mouseleave" (fn (mut this.isOpenStatHovered) false)}}>
<span class="gh-content-email-stats-value">
{{#if this.isHovered}}
{{format-number @post.email.openedCount}}
{{else}}
{{@post.email.openRate}}<sup>%</sup>
{{/if}}
</span>
<span class="gh-content-email-stats">
opened
</span>
</LinkTo>
{{/if}}
{{/unless}}
{{#if @post.showEmailClickAnalytics }}
<LinkTo @route="members" @query={{hash filterParam=(concat "clicked_links.post_id:[" @post.id "]") }} class="flex flex-column gh-post-row-event" {{on "mouseover" (fn (mut this.isClickStatHovered) true)}} {{on "mouseleave" (fn (mut this.isClickStatHovered) false)}}>
<span class="gh-content-email-stats-value">
{{#if this.isHovered}}
{{format-number @post.count.clicks}}
{{else}}
{{@post.clickRate}}<sup>%</sup>
{{/if}}
</span>
<span class="gh-content-email-stats">
clicked
</span>
</LinkTo>
{{else if (and @post.isPage @post.showPaidAttributionAnalytics) }}
<LinkTo @route="members" @query={{hash filterParam=(concat "conversion:[" @post.id "]") }} class="flex flex-column gh-post-row-event" {{on "mouseover" (fn (mut this.isClickStatHovered) true)}} {{on "mouseleave" (fn (mut this.isClickStatHovered) false)}}>
<span class="gh-content-email-stats-value">
{{@post.count.paid_conversions}}
</span>
<span class="gh-content-email-stats">
conversions
</span>
</LinkTo>
{{/if}}
</LinkTo>
{{/if}}
{{!-- Button column --}}
<LinkTo @route={{this.routeForLink}} @models={{this.modelsForLink}} class="permalink gh-list-data gh-post-list-button">
<div class="gh-list-data-inner">
{{#if @post.hasAnalyticsPage }}
<LinkTo @route={{this.routeForLink}} @models={{this.modelsForLink}} class="gh-post-list-cta stats {{if this.isHovered "is-hovered"}}" title="">
{{svg-jar "stats" title=""}}
</LinkTo>
{{else}}
<LinkTo @route={{this.routeForLink}} @models={{this.modelsForLink}} class="gh-post-list-cta edit {{if this.isHovered "is-hovered"}}" title="">
{{svg-jar "pen" title=""}}
</LinkTo>
{{/if}}
</div>
</LinkTo>
{{#if @post.hasAnalyticsPage }}
<LinkTo @route="posts.analytics" @models={{array @post}} class="permalink gh-list-data gh-post-list-button" title="">
<span class="gh-post-list-cta stats {{if this.isHovered "is-hovered"}}" title="Go to Analytics">
{{svg-jar "stats" title="Go to Analytics"}}
</span>
</LinkTo>
{{else}}
<LinkTo @route="editor.edit" @models={{array this.post.displayName this.post.id}} class="permalink gh-list-data gh-post-list-button" title="">
<span class="gh-post-list-cta edit {{if this.isHovered "is-hovered"}}" title="Go to Editor">
{{svg-jar "pen" title="Go to Editor"}}
</span>
</LinkTo>
{{/if}}
</li>

View file

@ -34,20 +34,6 @@ export default class PostsListItemClicks extends Component {
return text.join(' ');
}
get routeForLink() {
if (this.post.hasAnalyticsPage) {
return 'posts.analytics';
}
return 'editor.edit';
}
get modelsForLink() {
if (this.post.hasAnalyticsPage) {
return [this.post];
}
return [this.post.displayName, this.post.id];
}
@action
mouseOver() {
this.isHovered = true;

View file

@ -978,27 +978,27 @@ input:focus,
border-top: 1px solid var(--hairline-color-1);
}
a.gh-post-list-cta {
.gh-post-list-cta {
background: #26282b;
color: #ffffff;
border-color: #33373d;
}
a.gh-post-list-cta > svg {
.gh-post-list-cta > svg {
color: #ffffff;
}
a.gh-post-list-cta > span {
.gh-post-list-cta > span {
color: #ffffff;
}
a.gh-post-list-cta.is-hovered {
.gh-post-list-cta.is-hovered {
background: #1d1e20;
border-color: #33373d;
box-shadow: 0 1px 2px rgb(0 0 0 / 10%);
}
a.gh-post-list-cta.is-hovered:hover {
.gh-post-list-cta.is-hovered:hover {
background: #1d1e20;
}
@ -1225,7 +1225,6 @@ kbd {
/* Finishing touches */
/* ---------------------------------------------------- */
.gh-done {
background: #15171A;
@ -1460,3 +1459,12 @@ kbd {
.gh-post-activity-feed .gh-dashboard-list-item:hover {
background: transparent;
}
/* Post rows */
.gh-posts-list-item .gh-content-entry-meta,
.gh-posts-list-item .gh-content-entry-status,
.gh-posts-list-item .gh-content-email-stats {
color: #626D79;
}

View file

@ -129,15 +129,6 @@ ul.nostyle li {
color: var(--darkgrey);
}
.gh-list-data a.gh-post-row-event {
opacity: 1;
transition: opacity .1s linear;
}
.gh-list-data a.gh-post-row-event:hover {
opacity: 0.7;
}
.gh-list-data-date {
font-weight: 500;
font-size: 1.3rem;

View file

@ -231,29 +231,21 @@
.gh-post-list-updated,
.gh-post-list-author,
.gh-post-list-recipients,
.gh-post-list-opens,
.gh-post-list-signups,
.gh-post-list-conversions {
.gh-post-list-metrics {
color: var(--middarkgrey);
font-size: 1.3rem;
}
.gh-post-list-signups,
.gh-post-list-conversions,
.gh-post-list-recipients {
padding-right: 8px;
}
/** TODO: improve this hover style */
a.gh-post-list-signups.active:hover > span, a.gh-post-list-conversions.active:hover > span {
opacity: 0.5;
}
.gh-post-list-button {
width: 78px;
}
.gh-list-data.gh-post-list-metrics,
.gh-list-data.gh-post-list-button {
vertical-align: top;
padding-left: 0;
}
.gh-list .gh-content-entry-title {
display: flex;
align-items: center;
@ -268,9 +260,6 @@ a.gh-post-list-signups.active:hover > span, a.gh-post-list-conversions.active:ho
.gh-posts-list-item p {
margin: 0 0 2px;
font-size: 1.3rem;
overflow-wrap: break-word;
color: var(--middarkgrey);
}
.gh-schedule-plan {
@ -281,15 +270,6 @@ a.gh-post-list-signups.active:hover > span, a.gh-post-list-conversions.active:ho
max-width: 200px;
}
.gh-content-entry-meta {
font-size: 1.3rem;
color: var(--midlightgrey);
}
.gh-content-entry-meta .gh-badge {
margin-right: 3px;
}
.gh-content-email-stats-mobile {
display: none;
}
@ -454,10 +434,7 @@ a.gh-post-list-signups.active:hover > span, a.gh-post-list-conversions.active:ho
@media (max-width: 1600px) {
.feature-memberAttribution .gh-post-list-status,
.feature-memberAttribution .gh-post-list-recipients,
.feature-memberAttribution .gh-post-list-opens,
.feature-memberAttribution .gh-post-list-signups,
.feature-memberAttribution .gh-post-list-conversions {
.feature-memberAttribution .gh-post-list-metrics {
padding-left: 12px;
padding-right: 12px;
}
@ -477,10 +454,7 @@ a.gh-post-list-signups.active:hover > span, a.gh-post-list-conversions.active:ho
/* Mobile style of post list */
@media (max-width: 1200px) {
.feature-memberAttribution .gh-post-list-status,
.feature-memberAttribution .gh-post-list-recipients,
.feature-memberAttribution .gh-post-list-opens,
.feature-memberAttribution .gh-post-list-signups,
.feature-memberAttribution .gh-post-list-conversions {
.feature-memberAttribution .gh-post-list-metrics {
padding-left: 0;
padding-right: 0;
}
@ -493,86 +467,11 @@ a.gh-post-list-signups.active:hover > span, a.gh-post-list-conversions.active:ho
padding-right: 12px;
}
.gh-posts-list-item:not(.gh-posts-list-item-labs) {
display: flex;
flex-wrap: wrap;
border-bottom: 1px solid var(--whitegrey);
margin: 0;
}
.gh-posts-list-item:not(.gh-posts-list-item-labs):nth-of-type(2) {
border-top-left-radius: 5px;
border-top-right-radius: 5px;
}
.gh-posts-list-item:not(.gh-posts-list-item-labs):hover {
background: var(--whitegrey-l2);
}
.gh-posts-list-item:not(.gh-posts-list-item-labs):hover .gh-list-data {
background: none !important;
}
.gh-posts-list-item:not(.gh-posts-list-item-labs) .gh-post-list-featured {
display: block;
order: 1;
border-bottom: none;
position: absolute;
left: -6px;
top: 4px;
border: none;
}
.gh-posts-list-item:not(.gh-posts-list-item-labs) .gh-post-list-title {
display: block;
order: 2;
flex: 1 1 100%;
border: none;
padding: 20px 0 4px;
}
.gh-posts-list-item:not(.gh-posts-list-item-labs) .gh-post-list-status,
.gh-posts-list-item:not(.gh-posts-list-item-labs) .gh-post-list-recipients,
.gh-posts-list-item:not(.gh-posts-list-item-labs) .gh-post-list-opens,
.gh-posts-list-item:not(.gh-posts-list-item-labs) .gh-post-list-signups,
.gh-posts-list-item:not(.gh-posts-list-item-labs) .gh-post-list-conversions {
display: inline-block;
border: none;
padding: 0 4px 20px 0;
font-size: 1.3rem;
max-width: 140px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.gh-posts-list-item:not(.gh-posts-list-item-labs) .gh-post-list-status {
order: 3;
}
.gh-posts-list-item:not(.gh-posts-list-item-labs) .gh-post-list-recipients {
order: 4;
}
.gh-posts-list-item:not(.gh-posts-list-item-labs) .gh-post-list-opens {
order: 5;
}
.gh-posts-list-item:not(.gh-posts-list-item-labs) .gh-post-list-signups {
order: 6;
}
.gh-posts-list-item:not(.gh-posts-list-item-labs) .gh-post-list-conversions {
order: 7;
}
.gh-posts-list-item.gh-posts-list-item-labs .gh-post-list-opens,
.gh-posts-list-item.gh-posts-list-item-labs .gh-post-list-clicks {
.gh-posts-list-item .gh-post-list-metrics {
width: 0;
}
.gh-posts-list-item.gh-posts-list-item-labs .gh-post-list-opens > div,
.gh-posts-list-item.gh-posts-list-item-labs .gh-post-list-clicks > div {
.gh-posts-list-item .gh-post-list-metrics > * {
display: none;
}
@ -609,7 +508,7 @@ a.gh-post-list-signups.active:hover > span, a.gh-post-list-conversions.active:ho
display: none;
}
.gh-list-data a.gh-post-row-event {
.gh-list-data a.gh-post-list-metrics {
display: none;
}
@ -1373,53 +1272,42 @@ a.gh-post-list-signups.active:hover > span, a.gh-post-list-conversions.active:ho
stroke: var(--midgrey);
}
/* Post list LABS
/* ---------------------------------------------------------- */
.gh-posts-list-item-labs .gh-list-data {
padding: 2rem 0;
vertical-align: top;
}
.gh-posts-list-item-labs .gh-list-data-inner {
display: flex;
justify-content: flex-end;
padding: 0 20px 0 0;
}
.gh-posts-list-item-labs:nth-of-type(2) .gh-list-data {
.gh-posts-list-item:nth-of-type(2) .gh-list-data {
border-top: var(--whitegrey) 1px solid;
}
.gh-posts-list-item-labs .gh-content-entry-title {
.gh-content-entry-title {
margin: 0 0 2px;
font-size: 1.55rem;
font-weight: 600;
}
.gh-posts-list-item-labs .gh-content-entry-meta,
.gh-posts-list-item-labs .gh-content-entry-status {
.gh-content-entry-meta,
.gh-content-entry-status {
max-width: max-content;
font-size: 1.35rem;
color: var(--midlightgrey-d2);
color: #99a3ad;
}
.gh-posts-list-item-labs .gh-content-entry-status .draft {
.gh-content-entry-meta .gh-badge {
margin-right: 3px;
}
.gh-content-entry-status .draft {
display: flex;
align-items: center;
color: var(--pink);
font-weight: 500;
}
.gh-posts-list-item-labs .gh-content-entry-status .scheduled {
.gh-content-entry-status .scheduled {
display: flex;
align-items: center;
color: var(--green);
font-weight: 500;
}
.gh-posts-list-item-labs .gh-content-entry-status .status-dot {
.gh-content-entry-status .status-dot {
display: inline-block;
width: 6px;
height: 6px;
@ -1427,27 +1315,27 @@ a.gh-post-list-signups.active:hover > span, a.gh-post-list-conversions.active:ho
border-radius: 999px;
}
.gh-posts-list-item-labs .gh-content-entry-status .scheduled .status-dot {
.gh-content-entry-status .scheduled .status-dot {
border-color: var(--green);
background: var(--green);
}
.gh-posts-list-item-labs .gh-content-entry-status .draft .status-dot {
.gh-content-entry-status .draft .status-dot {
border-color: var(--pink);
background: var(--pink);
}
.gh-posts-list-item-labs .gh-content-entry-status .error {
.gh-content-entry-status .error {
color: var(--red);
font-weight: 500;
}
.gh-posts-list-item-labs .schedule-details {
.schedule-details {
margin-left: 3px;
color: var(--midlightgrey-d1);
}
.gh-posts-list-item-labs .schedule-details.absolute {
.schedule-details.absolute {
position: absolute;
transform: translateX(-100%);
min-width: max-content;
@ -1459,25 +1347,24 @@ a.gh-post-list-signups.active:hover > span, a.gh-post-list-conversions.active:ho
transition: all 1s ease;
}
.gh-posts-list-item-labs .gh-post-list-clicks,
.gh-posts-list-item-labs .gh-post-list-opens {
padding-right: 24px;
.gh-post-list-metrics {
width: 120px;
}
.gh-posts-list-item-labs .gh-content-email-stats,
.gh-posts-list-item-labs a.gh-post-list-cta {
.gh-content-email-stats,
.gh-post-list-cta {
margin: 0 0 3px;
color: var(--midlightgrey-d2);
font-size: 1.35rem;
font-weight: 400;
}
.gh-posts-list-item-labs .gh-content-email-stats {
.gh-content-email-stats {
margin-top: -1px;
}
.gh-content-email-stats-value {
display: block;
color: var(--black);
font-size: 1.55rem;
font-weight: 600;
@ -1490,11 +1377,15 @@ a.gh-post-list-signups.active:hover > span, a.gh-post-list-conversions.active:ho
padding: 0 0 0 1px;
}
a.gh-post-list-cta {
.gh-post-list-button {
width: 78px;
}
.gh-post-list-cta {
display: flex;
align-items: center;
justify-content: flex-start;
margin: -7px 16px 0 0;
margin: 0;
padding: 1px 14px;
border: 1px solid var(--whitegrey-d1);
background: var(--white);
@ -1507,40 +1398,40 @@ a.gh-post-list-cta {
transition: all .1s linear;
}
.gh-post-list-button a.gh-post-list-cta {
.gh-list-data .gh-post-list-cta {
justify-content: center;
width: 56px;
}
.gh-post-analytics-header a.gh-post-list-cta {
.gh-post-analytics-header .gh-post-list-cta {
margin-top: -14px;
margin-right: 0;
}
a.gh-post-list-cta.is-hovered {
.gh-post-list-cta.is-hovered {
border-color: var(--whitegrey-d2);
}
a.gh-post-list-cta.stats.is-hovered {
.gh-post-list-cta.stats.is-hovered {
color: var(--green);
}
a.gh-post-list-cta.stats.is-hovered:hover {
.gh-post-list-cta.stats.is-hovered:hover {
border-color: var(--lightgrey-l2);
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);
}
a.gh-post-list-cta.edit.is-hovered {
.gh-post-list-cta.edit.is-hovered {
color: var(--pink);
}
a.gh-post-list-cta.edit.is-hovered:hover,
a.gh-post-list-cta.edit:not(.is-hovered):hover {
.gh-post-list-cta.edit.is-hovered:hover,
.gh-post-list-cta.edit:not(.is-hovered):hover {
border-color: var(--lightgrey-l2);
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);
}
a.gh-post-list-cta > svg {
.gh-post-list-cta > svg {
width: 1.5rem;
height: 1.5rem;
color: var(--darkgrey);
@ -1548,11 +1439,11 @@ a.gh-post-list-cta > svg {
transition: all .1s linear;
}
a.gh-post-list-cta > svg path {
.gh-post-list-cta > svg path {
stroke-width: 2;
}
a.gh-post-list-cta > span {
.gh-post-list-cta > span {
line-height: 36px;
font-weight: 600;
padding: 0 0 0 0.75rem;
@ -1560,14 +1451,14 @@ a.gh-post-list-cta > span {
transition: all .1s linear;
}
a.gh-post-list-cta.edit.is-hovered > *,
a.gh-post-list-cta.edit.is-hovered:hover > *,
a.gh-post-list-cta.edit:not(.is-hovered):hover > * {
.gh-post-list-cta.edit.is-hovered > *,
.gh-post-list-cta.edit.is-hovered:hover > *,
.gh-post-list-cta.edit:not(.is-hovered):hover > * {
color: var(--pink-d1);
}
a.gh-post-list-cta.stats.is-hovered > *,
a.gh-post-list-cta.stats.is-hovered:hover > * {
.gh-post-list-cta.stats.is-hovered > *,
.gh-post-list-cta.stats.is-hovered:hover > * {
color: var(--green-d1);
}