Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/fast-pumas-juggle.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@primer/view-components": patch
---

Improve CSS style-recalc performance by removing selectors with universal subjects and expanding merged `:is()` selector lists so the browser can fast-reject them. Affects `autocomplete-item`, `Popover-message--*`, `breadcrumb-item`, and `FormControl-checkbox-wrap`/`FormControl-radio-wrap` styles.
13 changes: 3 additions & 10 deletions app/components/primer/alpha/auto_complete.pcss
Original file line number Diff line number Diff line change
Expand Up @@ -92,15 +92,13 @@
background-color: var(--overlay-bgColor);
border: 0;

/* `color` is inherited, so setting it on the item recolors descendants
** without a universal `… *` descendant rule (which forces a slow
** style-recalc match attempt against every element on the page). */
&:hover {
color: var(--fgColor-onEmphasis);
text-decoration: none;
background-color: var(--bgColor-accent-emphasis);

/* Inherit color on all child elements to ensure enough contrast */
& * {
color: inherit !important;
}
}

&.selected,
Expand All @@ -109,10 +107,5 @@
color: var(--fgColor-onEmphasis);
text-decoration: none;
background-color: var(--bgColor-accent-emphasis);

/* Inherit color on all child elements to ensure enough contrast */
& * {
color: inherit !important;
}
}
}
17 changes: 10 additions & 7 deletions app/components/primer/alpha/text_field.pcss
Original file line number Diff line number Diff line change
Expand Up @@ -634,18 +634,21 @@
grid-template-columns: min-content auto;
gap: var(--base-size-8);

& .FormControl-checkbox-labelWrap,
& .FormControl-radio-labelWrap {
display: flex;
flex-direction: column;
gap: var(--base-size-4);
}

& .FormControl-label {
cursor: pointer;
}
}

/* Expanded per-class so the subject buckets by a single class during style
** recalc, instead of compiling to a merged `:is(...)` subject that Blink
** cannot fast-reject. */
.FormControl-checkbox-wrap .FormControl-checkbox-labelWrap,
.FormControl-radio-wrap .FormControl-radio-labelWrap {
display: flex;
flex-direction: column;
gap: var(--base-size-4);
}

.FormControl-radio-group-wrap {
& fieldset {
padding: 0;
Expand Down
11 changes: 6 additions & 5 deletions app/components/primer/beta/breadcrumbs.pcss
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,12 @@
}
}

.breadcrumb-item-selected,
.breadcrumb-item[aria-current]:not([aria-current='false']) {
&::after {
content: none;
}
/* Expanded per-class so each selector buckets by its own class during style
** recalc, instead of compiling to a merged `:is(...)` that Blink cannot
** fast-reject. */
.breadcrumb-item-selected::after,
.breadcrumb-item[aria-current]:not([aria-current='false'])::after {
content: none;
}

/* stylelint-disable-next-line selector-max-type */
Expand Down
232 changes: 131 additions & 101 deletions app/components/primer/beta/popover.pcss
Original file line number Diff line number Diff line change
Expand Up @@ -54,150 +54,180 @@
}
}

/* The caret variants below are authored as expanded per-class selectors
** (rather than nesting `&::before`/`&::after` under a selector list) so each
** rule's subject buckets by its own class during style recalc. The merged
** `:is(.Popover-message--…, …)::before` form cannot be fast-rejected by Blink
** and shows up as pure slow-path selector matching. */

/* Bottom-oriented carets */
.Popover-message--bottom,
.Popover-message--bottom-right,
.Popover-message--bottom-left {
&::before,
&::after {
top: auto;
border-bottom-color: transparent;
}
.Popover-message--bottom::before,
.Popover-message--bottom::after,
.Popover-message--bottom-right::before,
.Popover-message--bottom-right::after,
.Popover-message--bottom-left::before,
.Popover-message--bottom-left::after {
top: auto;
border-bottom-color: transparent;
}

&::before {
bottom: -16px;
border-top-color: var(--borderColor-default);
}
.Popover-message--bottom::before,
.Popover-message--bottom-right::before,
.Popover-message--bottom-left::before {
bottom: -16px;
border-top-color: var(--borderColor-default);
}

&::after {
bottom: -14px;
/* stylelint-disable-next-line primer/colors */
border-top-color: var(--overlay-bgColor);
}
.Popover-message--bottom::after,
.Popover-message--bottom-right::after,
.Popover-message--bottom-left::after {
bottom: -14px;
/* stylelint-disable-next-line primer/colors */
border-top-color: var(--overlay-bgColor);
}

/* Top and Bottom: Right-oriented carets */
.Popover-message--top-right,
.Popover-message--bottom-right {
right: -9px;
margin-right: 0;
}

&::before,
&::after {
left: auto;
margin-left: 0;
}
.Popover-message--top-right::before,
.Popover-message--top-right::after,
.Popover-message--bottom-right::before,
.Popover-message--bottom-right::after {
left: auto;
margin-left: 0;
}

&::before {
right: var(--base-size-20);
}
.Popover-message--top-right::before,
.Popover-message--bottom-right::before {
right: var(--base-size-20);
}

&::after {
right: var(--base-size-20);
margin-right: 1px;
}
.Popover-message--top-right::after,
.Popover-message--bottom-right::after {
right: var(--base-size-20);
margin-right: 1px;
}

/* Top and Bottom: Left-oriented carets */
.Popover-message--top-left,
.Popover-message--bottom-left {
left: -9px;
margin-left: 0;
}

&::before,
&::after {
left: var(--base-size-24);
margin-left: 0;
}
.Popover-message--top-left::before,
.Popover-message--top-left::after,
.Popover-message--bottom-left::before,
.Popover-message--bottom-left::after {
left: var(--base-size-24);
margin-left: 0;
}

&::after {
left: var(--base-size-24);
margin-left: 1px;
}
.Popover-message--top-left::after,
.Popover-message--bottom-left::after {
left: var(--base-size-24);
margin-left: 1px;
}

/* Right- and Left-oriented carets */
.Popover-message--right,
.Popover-message--right-top,
.Popover-message--right-bottom,
.Popover-message--left,
.Popover-message--left-top,
.Popover-message--left-bottom {
&::before,
&::after {
top: 50%;
left: auto;
margin-left: 0;
border-bottom-color: transparent;
}
.Popover-message--right::before,
.Popover-message--right::after,
.Popover-message--right-top::before,
.Popover-message--right-top::after,
.Popover-message--right-bottom::before,
.Popover-message--right-bottom::after,
.Popover-message--left::before,
.Popover-message--left::after,
.Popover-message--left-top::before,
.Popover-message--left-top::after,
.Popover-message--left-bottom::before,
.Popover-message--left-bottom::after {
top: 50%;
left: auto;
margin-left: 0;
border-bottom-color: transparent;
}

&::before {
margin-top: -9px;
}
.Popover-message--right::before,
.Popover-message--right-top::before,
.Popover-message--right-bottom::before,
.Popover-message--left::before,
.Popover-message--left-top::before,
.Popover-message--left-bottom::before {
margin-top: -9px;
}

&::after {
margin-top: -8px;
}
.Popover-message--right::after,
.Popover-message--right-top::after,
.Popover-message--right-bottom::after,
.Popover-message--left::after,
.Popover-message--left-top::after,
.Popover-message--left-bottom::after {
margin-top: -8px;
}

/* Right-oriented carets */
.Popover-message--right,
.Popover-message--right-top,
.Popover-message--right-bottom {
&::before {
right: -16px;
border-left-color: var(--borderColor-default);
}
.Popover-message--right::before,
.Popover-message--right-top::before,
.Popover-message--right-bottom::before {
right: -16px;
border-left-color: var(--borderColor-default);
}

&::after {
right: -14px;
/* stylelint-disable-next-line primer/colors */
border-left-color: var(--overlay-bgColor);
}
.Popover-message--right::after,
.Popover-message--right-top::after,
.Popover-message--right-bottom::after {
right: -14px;
/* stylelint-disable-next-line primer/colors */
border-left-color: var(--overlay-bgColor);
}

/* Left-oriented carets */
.Popover-message--left,
.Popover-message--left-top,
.Popover-message--left-bottom {
&::before {
left: -16px;
border-right-color: var(--borderColor-default);
}
.Popover-message--left::before,
.Popover-message--left-top::before,
.Popover-message--left-bottom::before {
left: -16px;
border-right-color: var(--borderColor-default);
}

&::after {
left: -14px;
margin-bottom: 1px;
/* stylelint-disable-next-line primer/colors */
border-right-color: var(--overlay-bgColor);
}
.Popover-message--left::after,
.Popover-message--left-top::after,
.Popover-message--left-bottom::after {
left: -14px;
margin-bottom: 1px;
/* stylelint-disable-next-line primer/colors */
border-right-color: var(--overlay-bgColor);
}

/* Right and Left: Top-oriented carets */
.Popover-message--right-top,
.Popover-message--left-top {
&::before,
&::after {
top: var(--base-size-24);
}
.Popover-message--right-top::before,
.Popover-message--right-top::after,
.Popover-message--left-top::before,
.Popover-message--left-top::after {
top: var(--base-size-24);
}

/* Right and Left: Bottom-oriented carets */
.Popover-message--right-bottom,
.Popover-message--left-bottom {
&::before,
&::after {
top: auto;
}
.Popover-message--right-bottom::before,
.Popover-message--right-bottom::after,
.Popover-message--left-bottom::before,
.Popover-message--left-bottom::after {
top: auto;
}

&::before {
bottom: var(--base-size-16);
}
.Popover-message--right-bottom::before,
.Popover-message--left-bottom::before {
bottom: var(--base-size-16);
}

&::after {
bottom: var(--base-size-16);
margin-bottom: 1px;
}
.Popover-message--right-bottom::after,
.Popover-message--left-bottom::after {
bottom: var(--base-size-16);
margin-bottom: 1px;
}

@media (min-width: 544px) {
Expand Down
Loading
Loading