Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SelectPanel: High contrast theme #4966

Merged
merged 6 commits into from
Sep 19, 2024
Merged
Show file tree
Hide file tree
Changes from all 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/ten-gifts-own.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@primer/react": patch
---

SelectPanel: Fix focus and selection styles for Windows high contrast themes (behind feature flag `primer_react_select_panel_with_modern_action_list`)
Copy link
Member Author

@siddharthkp siddharthkp Sep 17, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note for reviewer: Our visual tests run on linux so this isn't exactly how it looks in windows. (see PR description for screenshots) but I think adding these to our snapshots will at least help us catch unexpected changes because we rarely test these manually

The light theme one is surprisingly similar, but the dark theme is just very different

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
23 changes: 23 additions & 0 deletions e2e/components/SelectPanel.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,4 +60,27 @@ test.describe('SelectPanel', () => {
await expect(page).toHaveNoViolations()
})
}

test(`Default @vrt forced-colors .modern-action-list--true`, async ({page}) => {
await visit(page, {
id: 'components-selectpanel--default',
globals: {featureFlags: {primer_react_select_panel_with_modern_action_list: true}},
})

// Open select panel
await page.keyboard.press('Tab')
await page.keyboard.press('Enter')

// windows high contrast mode: light
await page.emulateMedia({forcedColors: 'active', colorScheme: 'light'})
expect(await page.screenshot({animations: 'disabled'})).toMatchSnapshot(
`SelectPanel-Default-forced-colors-light-modern-action-list--true.png`,
)

// windows high contrast mode: dark
await page.emulateMedia({forcedColors: 'active', colorScheme: 'dark'})
expect(await page.screenshot({animations: 'disabled'})).toMatchSnapshot(
`SelectPanel-Default-forced-colors-dark-modern-action-list--true.png`,
)
})
})
2 changes: 1 addition & 1 deletion packages/react/src/ActionList/Item.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ export const Item = React.forwardRef<HTMLLIElement, ActionListItemProps>(
marginY: 'unset',

'@media (forced-colors: active)': {
':focus, &:focus-visible, > a.focus-visible': {
':focus, &:focus-visible, > a.focus-visible, &[data-is-active-descendant]': {
// Support for Windows high contrast https://sarahmhigley.com/writing/whcm-quick-tips
outline: 'solid 1px transparent !important',
},
Expand Down
5 changes: 5 additions & 0 deletions packages/react/src/ActionList/Selection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,11 @@ export const Selection: React.FC<React.PropsWithChildren<SelectionProps>> = ({se
'@keyframes checkmarkIn': checkmarkIn,
'@keyframes checkmarkOut': checkmarkOut,
},
'@media (forced-colors: active)': {
// Support for Windows high contrast https://sarahmhigley.com/writing/whcm-quick-tips
// background-color will be overriden but border-width is a workaround
borderWidth: selected ? '8px' : '1px',
},
}}
data-component="ActionList.Checkbox"
/>
Expand Down
24 changes: 16 additions & 8 deletions packages/react/src/NavList/__snapshots__/NavList.test.tsx.snap
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,8 @@ exports[`NavList renders a simple list 1`] = `
@media (forced-colors:active) {
.c2:focus,
.c2:focus-visible,
.c2 > a.focus-visible {
.c2 > a.focus-visible,
.c2[data-is-active-descendant] {
outline: solid 1px transparent !important;
}
}
Expand Down Expand Up @@ -333,7 +334,8 @@ exports[`NavList renders a simple list 1`] = `
@media (forced-colors:active) {
.c7:focus,
.c7:focus-visible,
.c7 > a.focus-visible {
.c7 > a.focus-visible,
.c7[data-is-active-descendant] {
outline: solid 1px transparent !important;
}
}
Expand Down Expand Up @@ -794,7 +796,8 @@ exports[`NavList renders with groups 1`] = `
@media (forced-colors:active) {
.c6:focus,
.c6:focus-visible,
.c6 > a.focus-visible {
.c6 > a.focus-visible,
.c6[data-is-active-descendant] {
outline: solid 1px transparent !important;
}
}
Expand Down Expand Up @@ -823,7 +826,8 @@ exports[`NavList renders with groups 1`] = `
@media (forced-colors:active) {
.c11:focus,
.c11:focus-visible,
.c11 > a.focus-visible {
.c11 > a.focus-visible,
.c11[data-is-active-descendant] {
outline: solid 1px transparent !important;
}
}
Expand Down Expand Up @@ -1313,7 +1317,8 @@ exports[`NavList.Item with NavList.SubNav does not have active styles if SubNav
@media (forced-colors:active) {
.c11:focus,
.c11:focus-visible,
.c11 > a.focus-visible {
.c11 > a.focus-visible,
.c11[data-is-active-descendant] {
outline: solid 1px transparent !important;
}
}
Expand Down Expand Up @@ -1342,7 +1347,8 @@ exports[`NavList.Item with NavList.SubNav does not have active styles if SubNav
@media (forced-colors:active) {
.c4:focus,
.c4:focus-visible,
.c4 > a.focus-visible {
.c4 > a.focus-visible,
.c4[data-is-active-descendant] {
outline: solid 1px transparent !important;
}
}
Expand Down Expand Up @@ -1837,7 +1843,8 @@ exports[`NavList.Item with NavList.SubNav has active styles if SubNav contains t
@media (forced-colors:active) {
.c11:focus,
.c11:focus-visible,
.c11 > a.focus-visible {
.c11 > a.focus-visible,
.c11[data-is-active-descendant] {
outline: solid 1px transparent !important;
}
}
Expand Down Expand Up @@ -1874,7 +1881,8 @@ exports[`NavList.Item with NavList.SubNav has active styles if SubNav contains t
@media (forced-colors:active) {
.c4:focus,
.c4:focus-visible,
.c4 > a.focus-visible {
.c4 > a.focus-visible,
.c4[data-is-active-descendant] {
outline: solid 1px transparent !important;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -527,6 +527,14 @@ exports[`snapshots renders a menu that contains an item to add to the menu 1`] =

}

@media (forced-colors:active) {

}

@media (forced-colors:active) {

}

@media (hover:hover) and (pointer:fine) {

}
Expand Down Expand Up @@ -812,10 +820,21 @@ exports[`snapshots renders a menu that contains an item to add to the menu 1`] =
--divider-color: transparent;
}

@media (forced-colors:active) {
.c6 {
border-width: 1px;
}
}

@media (forced-colors:active) {

}

@media (forced-colors:active) {
.c3:focus,
.c3:focus-visible,
.c3 > a.focus-visible {
.c3 > a.focus-visible,
.c3[data-is-active-descendant] {
outline: solid 1px transparent !important;
}
}
Expand Down Expand Up @@ -1359,6 +1378,10 @@ exports[`snapshots renders a multiselect input 1`] = `

}

@media (forced-colors:active) {

}

@media (hover:hover) and (pointer:fine) {

}
Expand Down Expand Up @@ -1595,10 +1618,17 @@ exports[`snapshots renders a multiselect input 1`] = `
border-radius: 6px;
}

@media (forced-colors:active) {
.c5 {
border-width: 1px;
}
}

@media (forced-colors:active) {
.c3:focus,
.c3:focus-visible,
.c3 > a.focus-visible {
.c3 > a.focus-visible,
.c3[data-is-active-descendant] {
outline: solid 1px transparent !important;
}
}
Expand Down Expand Up @@ -2077,6 +2107,14 @@ exports[`snapshots renders a multiselect input with selected menu items 1`] = `

}

@media (forced-colors:active) {

}

@media (forced-colors:active) {

}

@media (hover:hover) and (pointer:fine) {

}
Expand Down Expand Up @@ -2456,10 +2494,23 @@ exports[`snapshots renders a multiselect input with selected menu items 1`] = `
border-radius: 6px;
}

@media (forced-colors:active) {
.c5 {
border-width: 8px;
}
}

@media (forced-colors:active) {
.c9 {
border-width: 1px;
}
}

@media (forced-colors:active) {
.c3:focus,
.c3:focus-visible,
.c3 > a.focus-visible {
.c3 > a.focus-visible,
.c3[data-is-active-descendant] {
outline: solid 1px transparent !important;
}
}
Expand Down Expand Up @@ -2488,7 +2539,8 @@ exports[`snapshots renders a multiselect input with selected menu items 1`] = `
@media (forced-colors:active) {
.c8:focus,
.c8:focus-visible,
.c8 > a.focus-visible {
.c8 > a.focus-visible,
.c8[data-is-active-descendant] {
outline: solid 1px transparent !important;
}
}
Expand Down Expand Up @@ -3168,7 +3220,8 @@ exports[`snapshots renders a single select input 1`] = `
@media (forced-colors:active) {
.c3:focus,
.c3:focus-visible,
.c3 > a.focus-visible {
.c3 > a.focus-visible,
.c3[data-is-active-descendant] {
outline: solid 1px transparent !important;
}
}
Expand Down Expand Up @@ -3654,7 +3707,8 @@ exports[`snapshots renders with a custom text input component 1`] = `
@media (forced-colors:active) {
.c3:focus,
.c3:focus-visible,
.c3 > a.focus-visible {
.c3 > a.focus-visible,
.c3[data-is-active-descendant] {
outline: solid 1px transparent !important;
}
}
Expand Down
Loading