From 95cd867ab43e8c2179569ea6e61ad71a6c386256 Mon Sep 17 00:00:00 2001 From: Randall Krauskopf <104226843+randall-krauskopf@users.noreply.github.com> Date: Wed, 8 May 2024 11:32:31 -0500 Subject: [PATCH 1/4] `TreeView`: Fix expanding/collapsing item when `Space` is pressed (#4548) * Account for the {Space} key event * Create quiet-lamps-kiss.md * Update quiet-lamps-kiss.md --------- Co-authored-by: Ian Sanders Co-authored-by: Siddharth Kshetrapal --- .changeset/quiet-lamps-kiss.md | 5 + packages/react/src/TreeView/TreeView.test.tsx | 96 +++++++++++++++++++ packages/react/src/TreeView/TreeView.tsx | 2 +- packages/react/src/TreeView/useTypeahead.ts | 2 +- 4 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 .changeset/quiet-lamps-kiss.md diff --git a/.changeset/quiet-lamps-kiss.md b/.changeset/quiet-lamps-kiss.md new file mode 100644 index 00000000000..0b5bd73d05f --- /dev/null +++ b/.changeset/quiet-lamps-kiss.md @@ -0,0 +1,5 @@ +--- +"@primer/react": patch +--- + +TreeView: Fix toggling subtree via Space key (in addition to Enter key) diff --git a/packages/react/src/TreeView/TreeView.test.tsx b/packages/react/src/TreeView/TreeView.test.tsx index 00f076da368..ff48cbde3b6 100644 --- a/packages/react/src/TreeView/TreeView.test.tsx +++ b/packages/react/src/TreeView/TreeView.test.tsx @@ -981,6 +981,102 @@ describe('Keyboard interactions', () => { }) }) + describe('Space', () => { + it('calls onSelect function if provided and checks if the item has been selected', () => { + const onSelect = jest.fn() + const {getByRole} = renderWithTheme( + + + Parent 1 + + + Child 1 + + + + + Parent 2 + + + Child2 + + + + + Parent 3 + + + Child 3 + + + + , + ) + const itemChild = getByRole('treeitem', {name: 'Child2'}) + + act(() => { + // Focus first item + itemChild.focus() + }) + + // Press Enter + fireEvent.keyDown(document.activeElement || document.body, {key: ' '}) + + // onSelect should have been called + expect(onSelect).toHaveBeenCalledTimes(1) + + onSelect.mockClear() + + // Press middle click + fireEvent.click(document.activeElement?.firstChild || document.body, {button: 1}) + + // onSelect should have been called + expect(onSelect).toHaveBeenCalledTimes(1) + }) + + it('toggles expanded state if no onSelect function is provided', () => { + const {getByRole, queryByRole} = renderWithTheme( + + + Parent + + Child 1 + Child 2 + + + , + ) + + const parent = getByRole('treeitem', {name: 'Parent'}) + + act(() => { + // Focus first item + parent.focus() + }) + + // aria-expanded should be false + expect(parent).toHaveAttribute('aria-expanded', 'false') + + // Press Enter + fireEvent.keyDown(document.activeElement || document.body, {key: 'Enter'}) + + // aria-expanded should now be true + expect(parent).toHaveAttribute('aria-expanded', 'true') + + // Subtree should be visible + expect(queryByRole('group')).toBeVisible() + + // Press Enter + fireEvent.keyDown(document.activeElement || document.body, {key: 'Enter'}) + + // aria-expanded should now be false + expect(parent).toHaveAttribute('aria-expanded', 'false') + + // Subtree should no longer be visible + expect(queryByRole('group')).not.toBeInTheDocument() + }) + }) + describe('Typeahead', () => { it('moves focus to the next item that matches the typed character', () => { const {getByRole} = renderWithTheme( diff --git a/packages/react/src/TreeView/TreeView.tsx b/packages/react/src/TreeView/TreeView.tsx index 234a8115da3..212bb9bf49c 100644 --- a/packages/react/src/TreeView/TreeView.tsx +++ b/packages/react/src/TreeView/TreeView.tsx @@ -396,7 +396,7 @@ const Item = React.forwardRef( (event: React.KeyboardEvent) => { switch (event.key) { case 'Enter': - case 'Space': + case ' ': if (onSelect) { onSelect(event) } else { diff --git a/packages/react/src/TreeView/useTypeahead.ts b/packages/react/src/TreeView/useTypeahead.ts index fe430c597a3..cfd5f35f6d4 100644 --- a/packages/react/src/TreeView/useTypeahead.ts +++ b/packages/react/src/TreeView/useTypeahead.ts @@ -63,7 +63,7 @@ export function useTypeahead({containerRef, onFocusChange}: TypeaheadOptions) { function onKeyDown(event: KeyboardEvent) { // Ignore key presses that don't produce a character value - if (!event.key || event.key.length > 1) return + if (!event.key || event.key.length > 1 || event.key === ' ') return // Ignore key presses that occur with a modifier if (event.ctrlKey || event.altKey || event.metaKey) return From 02a2a2bf0b02e0c2f9a09351eefbe91f9370e210 Mon Sep 17 00:00:00 2001 From: Owen Niblock Date: Wed, 8 May 2024 17:39:26 +0100 Subject: [PATCH 2/4] Export things we need for CommentEditor (#4513) * Export things we need for CommentEditor * Add changeset * Update snapshot * Remove ComponentProps export and use React.ComponentProps in dotcom * Remove the bits of ComponentProps --- .changeset/tiny-ghosts-notice.md | 5 +++++ packages/react/src/RelativeTime/RelativeTime.tsx | 2 +- .../react/src/__tests__/__snapshots__/exports.test.ts.snap | 1 + packages/react/src/drafts/TabPanels/TabPanels.tsx | 2 +- packages/react/src/index.ts | 3 +++ .../src/utils/{custom-element.ts => create-component.ts} | 0 6 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 .changeset/tiny-ghosts-notice.md rename packages/react/src/utils/{custom-element.ts => create-component.ts} (100%) diff --git a/.changeset/tiny-ghosts-notice.md b/.changeset/tiny-ghosts-notice.md new file mode 100644 index 00000000000..bc390eb0811 --- /dev/null +++ b/.changeset/tiny-ghosts-notice.md @@ -0,0 +1,5 @@ +--- +'@primer/react': minor +--- + +Exports createComponent diff --git a/packages/react/src/RelativeTime/RelativeTime.tsx b/packages/react/src/RelativeTime/RelativeTime.tsx index 12eb1776669..b33e8d79a45 100644 --- a/packages/react/src/RelativeTime/RelativeTime.tsx +++ b/packages/react/src/RelativeTime/RelativeTime.tsx @@ -1,7 +1,7 @@ import React from 'react' import {RelativeTimeElement} from '@github/relative-time-element' import type {ComponentProps} from '../utils/types' -import {createComponent} from '../utils/custom-element' +import {createComponent} from '../utils/create-component' const RelativeTimeComponent = createComponent(RelativeTimeElement, 'relative-time') diff --git a/packages/react/src/__tests__/__snapshots__/exports.test.ts.snap b/packages/react/src/__tests__/__snapshots__/exports.test.ts.snap index c29dc006f94..4dbaf3f35d0 100644 --- a/packages/react/src/__tests__/__snapshots__/exports.test.ts.snap +++ b/packages/react/src/__tests__/__snapshots__/exports.test.ts.snap @@ -58,6 +58,7 @@ exports[`@primer/react should not update exports without a semver change 1`] = ` "type ConfirmationDialogProps", "CounterLabel", "type CounterLabelProps", + "createComponent", "Details", "type DetailsProps", "Dialog", diff --git a/packages/react/src/drafts/TabPanels/TabPanels.tsx b/packages/react/src/drafts/TabPanels/TabPanels.tsx index 85bd5de263b..ba73e72783b 100644 --- a/packages/react/src/drafts/TabPanels/TabPanels.tsx +++ b/packages/react/src/drafts/TabPanels/TabPanels.tsx @@ -4,7 +4,7 @@ import React from 'react' import styled from 'styled-components' import {get} from '../../constants' import {TabContainerElement} from '@github/tab-container-element' -import {createComponent} from '../../utils/custom-element' +import {createComponent} from '../../utils/create-component' import sx, {type SxProp} from '../../sx' import type {ComponentProps} from '../../utils/types' import getGlobalFocusStyles from '../../internal/utils/getGlobalFocusStyles' diff --git a/packages/react/src/index.ts b/packages/react/src/index.ts index 16c9d5c7e86..e3148feb8f4 100644 --- a/packages/react/src/index.ts +++ b/packages/react/src/index.ts @@ -45,6 +45,9 @@ export {useRefObjectAsForwardedRef} from './hooks/useRefObjectAsForwardedRef' export {useResizeObserver} from './hooks/useResizeObserver' export {useResponsiveValue} from './hooks/useResponsiveValue' +// Utils +export {createComponent} from './utils/create-component' + // Components export {default as Radio} from './Radio' export type {RadioProps} from './Radio' diff --git a/packages/react/src/utils/custom-element.ts b/packages/react/src/utils/create-component.ts similarity index 100% rename from packages/react/src/utils/custom-element.ts rename to packages/react/src/utils/create-component.ts From 564db1dbc6f588bee56ab4ba362771fb7c1edc1e Mon Sep 17 00:00:00 2001 From: Dusty Greif Date: Wed, 8 May 2024 13:53:36 -0700 Subject: [PATCH 3/4] Trigger onClose when Dialog backdrop is clicked (#4565) * Trigger onClose when Dialog backdrop is clicked * Update docs with new backdrop gesture --- .changeset/popular-jokes-kiss.md | 5 +++++ docs/content/drafts/Dialog.mdx | 14 +++++++------- .../ConfirmationDialog/ConfirmationDialog.tsx | 2 +- packages/react/src/Dialog/Dialog.test.tsx | 19 +++++++++++++++++-- packages/react/src/Dialog/Dialog.tsx | 18 +++++++++++++----- 5 files changed, 43 insertions(+), 15 deletions(-) create mode 100644 .changeset/popular-jokes-kiss.md diff --git a/.changeset/popular-jokes-kiss.md b/.changeset/popular-jokes-kiss.md new file mode 100644 index 00000000000..cb5f5102995 --- /dev/null +++ b/.changeset/popular-jokes-kiss.md @@ -0,0 +1,5 @@ +--- +'@primer/react': minor +--- + +`Dialog` and `ConfirmationDialog` can now be closed by clicking on the backdrop surrounding the dialog. This will cause `onClose` to be called with a new `'backdrop'` gesture. diff --git a/docs/content/drafts/Dialog.mdx b/docs/content/drafts/Dialog.mdx index 791d871f6e8..baccf89d4a8 100644 --- a/docs/content/drafts/Dialog.mdx +++ b/docs/content/drafts/Dialog.mdx @@ -157,13 +157,13 @@ render() ### ConfirmationDialogProps -| Prop name | Type | Default | Description | -| :------------------- | :-------------------------------------------------------------------- | :--------- | :---------------------------------------------------------------------------------------------------------------------------- | -| title | `React.ReactNode` | | Required. Sets the title of the dialog, which by default is also used as the `aria-labelledby` attribute. | -| onClose | `(gesture: 'confirm' │ 'cancel' │ 'close-button' │ 'escape') => void` | | Required. This callback is invoked when a gesture to close the dialog is performed. The first argument indicates the gesture. | -| cancelButtonContent | `React.ReactNode` | `"Cancel"` | The content to use for the cancel button. | -| confirmButtonContent | `React.ReactNode` | `"OK"` | The content to use for the confirm button. | -| confirmButtonType | `"normal" │ "primary" │ "danger"` | `Button` | The type of button to use for the confirm button. | +| Prop name | Type | Default | Description | +| :------------------- | :----------------------------------------------- | :----------------------------- | :-------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | +| title | `React.ReactNode` | | Required. Sets the title of the dialog, which by default is also used as the `aria-labelledby` attribute. | +| onClose | `(gesture: 'confirm' │ 'cancel' │ 'close-button' | 'backdrop │ 'escape') => void` | | Required. This callback is invoked when a gesture to close the dialog is performed. The first argument indicates the gesture. | +| cancelButtonContent | `React.ReactNode` | `"Cancel"` | The content to use for the cancel button. | +| confirmButtonContent | `React.ReactNode` | `"OK"` | The content to use for the confirm button. | +| confirmButtonType | `"normal" │ "primary" │ "danger"` | `Button` | The type of button to use for the confirm button. | ### ConfirmOptions diff --git a/packages/react/src/ConfirmationDialog/ConfirmationDialog.tsx b/packages/react/src/ConfirmationDialog/ConfirmationDialog.tsx index 73311e348a5..9a5a8a19df7 100644 --- a/packages/react/src/ConfirmationDialog/ConfirmationDialog.tsx +++ b/packages/react/src/ConfirmationDialog/ConfirmationDialog.tsx @@ -19,7 +19,7 @@ export interface ConfirmationDialogProps { * Required. This callback is invoked when a gesture to close the dialog * is performed. The first argument indicates the gesture. */ - onClose: (gesture: 'confirm' | 'close-button' | 'cancel' | 'escape') => void + onClose: (gesture: 'confirm' | 'close-button' | 'backdrop' | 'cancel' | 'escape') => void /** * Required. The title of the ConfirmationDialog. This is usually a brief diff --git a/packages/react/src/Dialog/Dialog.test.tsx b/packages/react/src/Dialog/Dialog.test.tsx index 3c8088542e2..da4e38cf698 100644 --- a/packages/react/src/Dialog/Dialog.test.tsx +++ b/packages/react/src/Dialog/Dialog.test.tsx @@ -67,7 +67,22 @@ describe('Dialog', () => { await user.click(getByLabelText('Close')) - expect(onClose).toHaveBeenCalled() + expect(onClose).toHaveBeenCalledWith('close-button') + expect(onClose).toHaveBeenCalledTimes(1) // Ensure it's not called with a backdrop gesture as well + }) + + it('calls `onClose` when clicking the backdrop', async () => { + const user = userEvent.setup() + const onClose = jest.fn() + const {getByRole} = render(Pay attention to me) + + expect(onClose).not.toHaveBeenCalled() + + const dialog = getByRole('dialog') + const backdrop = dialog.parentElement! + await user.click(backdrop) + + expect(onClose).toHaveBeenCalledWith('backdrop') }) it('calls `onClose` when keying "Escape"', async () => { @@ -80,7 +95,7 @@ describe('Dialog', () => { await user.keyboard('{Escape}') - expect(onClose).toHaveBeenCalled() + expect(onClose).toHaveBeenCalledWith('escape') }) it('changes the style for `overflow` if it is not set to "hidden"', () => { diff --git a/packages/react/src/Dialog/Dialog.tsx b/packages/react/src/Dialog/Dialog.tsx index 81692f9ae45..6744210c1d3 100644 --- a/packages/react/src/Dialog/Dialog.tsx +++ b/packages/react/src/Dialog/Dialog.tsx @@ -1,4 +1,4 @@ -import React, {useCallback, useEffect, useRef, useState} from 'react' +import React, {useCallback, useEffect, useRef, useState, type SyntheticEvent} from 'react' import styled from 'styled-components' import type {ButtonProps} from '../Button' import {Button} from '../Button' @@ -98,11 +98,11 @@ export interface DialogProps extends SxProp { /** * This method is invoked when a gesture to close the dialog is used (either - * an Escape key press or clicking the "X" in the top-right corner). The + * an Escape key press, clicking the backdrop, or clicking the "X" in the top-right corner). The * gesture argument indicates the gesture that was used to close the dialog - * (either 'close-button' or 'escape'). + * ('close-button', 'backdrop', or 'escape'). */ - onClose: (gesture: 'close-button' | 'escape') => void + onClose: (gesture: 'close-button' | 'backdrop' | 'escape') => void /** * Default: "dialog". The ARIA role to assign to this dialog. @@ -414,6 +414,14 @@ const _Dialog = React.forwardRef { + if (e.target === e.currentTarget) { + onClose('backdrop') + } + }, + [onClose], + ) const dialogRef = useRef(null) useRefObjectAsForwardedRef(forwardedRef, dialogRef) @@ -465,7 +473,7 @@ const _Dialog = React.forwardRef - + Date: Thu, 9 May 2024 09:49:50 +1000 Subject: [PATCH 4/4] ActionBar: Add a few fixes and tests (#4536) * Add a few fixes and a test plan * Add test for overflow * Add overflow e2e test to actionbar * Add tests * Create mean-terms-bathe.md * test(vrt): update snapshots --------- Co-authored-by: pksjce --- .changeset/mean-terms-bathe.md | 5 ++ ...onBar-CommentBox-dark-colorblind-linux.png | Bin 0 -> 10110 bytes ...ActionBar-CommentBox-dark-dimmed-linux.png | Bin 0 -> 9974 bytes ...ar-CommentBox-dark-high-contrast-linux.png | Bin 0 -> 10311 bytes ...drafts-ActionBar-CommentBox-dark-linux.png | Bin 0 -> 10110 bytes ...onBar-CommentBox-dark-tritanopia-linux.png | Bin 0 -> 10110 bytes ...nBar-CommentBox-light-colorblind-linux.png | Bin 0 -> 10081 bytes ...r-CommentBox-light-high-contrast-linux.png | Bin 0 -> 10243 bytes ...rafts-ActionBar-CommentBox-light-linux.png | Bin 0 -> 10081 bytes ...nBar-CommentBox-light-tritanopia-linux.png | Bin 0 -> 10081 bytes e2e/components/drafts/ActionBar.test.ts | 54 ++++++++++++++++++ .../drafts/ActionBar/ActionBar.stories.tsx | 2 +- .../react/src/drafts/ActionBar/ActionBar.tsx | 2 +- 13 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 .changeset/mean-terms-bathe.md create mode 100644 .playwright/snapshots/components/drafts/ActionBar.test.ts-snapshots/drafts-ActionBar-CommentBox-dark-colorblind-linux.png create mode 100644 .playwright/snapshots/components/drafts/ActionBar.test.ts-snapshots/drafts-ActionBar-CommentBox-dark-dimmed-linux.png create mode 100644 .playwright/snapshots/components/drafts/ActionBar.test.ts-snapshots/drafts-ActionBar-CommentBox-dark-high-contrast-linux.png create mode 100644 .playwright/snapshots/components/drafts/ActionBar.test.ts-snapshots/drafts-ActionBar-CommentBox-dark-linux.png create mode 100644 .playwright/snapshots/components/drafts/ActionBar.test.ts-snapshots/drafts-ActionBar-CommentBox-dark-tritanopia-linux.png create mode 100644 .playwright/snapshots/components/drafts/ActionBar.test.ts-snapshots/drafts-ActionBar-CommentBox-light-colorblind-linux.png create mode 100644 .playwright/snapshots/components/drafts/ActionBar.test.ts-snapshots/drafts-ActionBar-CommentBox-light-high-contrast-linux.png create mode 100644 .playwright/snapshots/components/drafts/ActionBar.test.ts-snapshots/drafts-ActionBar-CommentBox-light-linux.png create mode 100644 .playwright/snapshots/components/drafts/ActionBar.test.ts-snapshots/drafts-ActionBar-CommentBox-light-tritanopia-linux.png create mode 100644 e2e/components/drafts/ActionBar.test.ts diff --git a/.changeset/mean-terms-bathe.md b/.changeset/mean-terms-bathe.md new file mode 100644 index 00000000000..9b7ddae6349 --- /dev/null +++ b/.changeset/mean-terms-bathe.md @@ -0,0 +1,5 @@ +--- +"@primer/react": patch +--- + +ActionBar: Add a few fixes and relevant tests diff --git a/.playwright/snapshots/components/drafts/ActionBar.test.ts-snapshots/drafts-ActionBar-CommentBox-dark-colorblind-linux.png b/.playwright/snapshots/components/drafts/ActionBar.test.ts-snapshots/drafts-ActionBar-CommentBox-dark-colorblind-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..4a72d6fa66f74afee267f3b786c8856edced2776 GIT binary patch literal 10110 zcmeHNX;hNw+oy3RXS6KJ)ZCbIDtE>)#WJ-;B{Ox*Oik0mO3f{E!40TsN^*f_%B3_Z z9W^yIa?J%T1sXRp_XSbN6-7}20g?A%&Urulzx#`l3N2lpl`PVcajeph60x@k>}tiLFL_=b0E<7AP3tM z=VNmg>2X>8Jk%_gc17i?$4=X=TU2+ZYJBxZ|DBn=Q!1D8)ZD3laC&^SC@$<#jSFXW zZ1lh)Dn6V*;hUS7!9rDbBhTK@*qsUb>f~`(F!<}ML#p?-Y|VON8p(mQ{OUyhF|s@H zGf$*L%VFdQpV2gbV#U#xkfi351k-N)Z-6yDJX3pS2XF;7Vt&yEF1vOC%LYAs_*@pZ+KZ0v$j3@BPIc`MEou$I(KG`6(kDdVYQV zDdct#DCcA{8F3h9MlQd!y{9g~rGR?JxVW`M+b5A2dSiJc za^iVlXmFagRlI$1nbCMWyG*yH%GTREn0nUhI=$ZAF51ayo7#`xE4b71A_j8~x_d$lrQ@URjyh z(`-JqFij(`Z$Jel;+L(R2DRwrNpEjS*WOb9xTIu$s21sGyD!g!=9{i9U;p@#l87V` z*?D_=KRy#mjHHfgnYydK32MC`7;IpV*S6BP0s<-L_mYy5JR;FVlrvuODgSuptxqTX zMw=3%mU?tz8k_R{56=G*voN%`h_~Q1X95CEJnkPEQK2^wF3g!ccRVuZ&Mqk}&Hq`~ zHnMjU_vEGGjj$0&wV7GEHn4ThUUY?TJU;!BAN3)6wiI|wwb@d_G{Z4CIQYD~yL
MzN<$_hQDNWxHMf=2;-3lL6_tAx$Y8AQ+fZ-`9ZAWkfFRmDBv zdN`+wn^&RFtUDHwV|z~}ZMQ^t12b*c7@+=6PC+bY2OmY9x^9UVy> z4R2=AT;O#QoMpapLF~e$yi06NcUBN38rJrW4xD0xS(MgLSm+?VW{gl7m|z1-sgfha?I{ z;UUsAhOo)ACMw7<%cj;aQZuye?F_l9w2d4uq`FS-v$5?oQ%gXk9SJN zcx}8$;hF2#ng)`*SPXv(O0|-%76p`v8%bjua}m|r)4qiUxRq#H9_ zn4j>BxF)ju$f4YL{_uJwRN`=KFITL=uhF~3Yr6diK0 z_h;oQF`yu=qLLE*Zb;k}TicM4s$xVW00qo8Epx-%Y+mIXtLduJBI+JiMXIVQH2Fwn zE{ZDF5{=1jV6ijTY4d$=DZVDg<)US?#aj3!i-TwpONt%LFiOK>_YV51%E>FG9zq{B zotoooGG@?hq|Sb3En2`?pN5ex%th>1%DrwAvC_xK8(b5a4OTZ_n;jSpv*DmFUQF)! z_*y5U@wIM-(WQ&i-%a*iAU-EpCB*n(B)=7zJ3TQsQx_bjJT7*_e=E`h5W=)e!95US zvDLwYHJHSUcx`Tg-{!5(9HD2Xf(VP9&d6Brt|jdSgXs$3fHla@-io*8+lz@WnUFzTW&BVt=1o!Xe%Ck^TD-fK`+OnQ3V=)1Arg z29d^CRjQZan@=gt(f91Qn^V~gi|gJ82$?({&m?N-wT^S8Ujx5OhP7!g9;Ll*_LM5z zw(WOS6+1^qZkD*O?>zO%-R@*|Se>5p(qQxc@ZavZxs!iEcfa!D$`hoC+td&1)`Zd3 z!CXvhfm#aqiok;LZwV7fY%jh zxtnf!UIdN9A8kM`;oe4Gr#itH>h${Plu4cLw9-Nvw!qO32e`EDt^flaA0ZhTYgif^ zzg>7U+glsHa3c_Vgl4^)#|!qKclV$U2Mm&1cc7b5gqdv+?OOB(zix>wRVFm9dNBJv zd~unXjcWb<{U)KJR0~1lYMwaA3ei!R#$9vCO}*5h&V-?71c(7sms$cs$aNV5H;LCC zETP2S0FEzDwA8JZ`=x|$^jf(Z)?`THBp7#Y8E$t?nLvSV6k=6^%^XuBUHA@ z^Hnywk2`u&>@M8m)|S7~9p|3El>vvKCob9eb=z?V%DuE)j#-ToHf2aYgF5|#6Tf8_~DZ4hM2|b_2s01w!vm@THRD(b{>gDI>(4_ z7#J7;Xxdd*Ij_3RD1L2ruSCR8370m9Q%Fr|CP1b!*=%>@&R7=-p zNCv~n?RyLm3w7W1o_>hplBLF;AG8l<-|^(2FA6;CCWL`wm6jtTBg|8oKI#?5D7~6c`mTa= zdIPV#_Q(i7E5%ybyEX(z2Y@uTN(*Mp2xt6uRzUsGZLBEvg+2bp^%g4DHZZ=qxjj$` z8fL*@@x1vx(Wht+qS^EQ%Ma_ZSlLD$KD>aHarnb}xut&fbFjlerL-M%6b``1(7NtN zU#DpIVTkk%(LbMr4jndjMSge{K)_}CChnu)G$6o!aB%|5W7C!_$*L^i-}3Lr28;RY z!@V}44AMe>fywG`Nq}RfxT4?=#59mDzW2|Si{T9I-C?yX$+|i9$L>0$FiqX+;K8#w zK0SM7=DBR#yuPhiLmh@$c;@E_0~T1hb-OV;^1gu=Tj}rMgi2`whdqu|IJ3Z z%vVorFup!WI*;2W=A_6NCbDuylN-%;UY-@bo}6j>toMk;v01;XQ`5{F@Ydp6<-B}4 zGEyhDkxt&xpewlcm+1p$rxl@BSbQ-+96HV&HcgBh_*Ju<_ z1k^yPAwT_L?CaC`GM}IXQUV%+WJP;iG8PN;Qkgs=t>N<3wYlC}$;+s>UGe-mT@`P{ z*sl*U|@ZB%Y2`-$ufE+O0g{_^UYGg4TX_dfF4Iqeu78rix z7}fTrsRPiqE{N2&uX)%^39-#8z*E^fnHaZ9sk_|wvW{Dr-OvVJGArF-D~VH0O{4-w zm-R@hIM<#jI$ztfT{Ikdo$RqW$Y{$l@kh*86?1{027|d9jY4jLjj(riyeZ*q?y)1A z;>_m6w!!MgR&fk&psGS|bA=||Pg-5XEIt-8@G>IbMDFNx)wes$8K$GJZazHcJqoT( zAtS`#RF>CUgx#1)Ok&^p!8V}|oILMdiaR2i`?x4>mXr;VP~r$dWq^Pq>rvExiV8GD z2@8fAkm0FMBSO~}k@0cPuXenC*f*IH^bGm#gKqj6ljT>Hh>7Qw zM?>#aAWf0o3%XHkm3(`@*s~w;>ZXNmK(B|G!D;o3^(m|3NV+OU8+Lt|^`~s+rw%HG zg|{9%aI(bIOL?i~42PVN5xc^WmZ4X#xbOx%_21C*sSq{z~eC4&<63Iz*8IORk&5hPdK1js8 z>ym7f__cfR5X*!Q4~H6q+=iiMGM2tF(=Fhc$@t{9Dc)!K4;|{q$s!^jgNUQWjpq--fLq~z`=7oDH{(_;3KRcs~OKIOjMAPe? z39Q(ZAg7$D34PGi#gK(ST9;@z0{TP%70^fL@R#({nR7+xT`+oLaN@#lLMo6@s1ubm zoUEz$ zsIF+N`oTJ$O-1y#?{RJBcc~q_dU{O69c4X$SPzg8s{k`HR}3g{!N|x|mY)G;L(n)@J$+G^Pc+HM_F5)B&BNFC z+`!V_=Q>S;?_CXiF=Zi8G$Xiw{?=T(BFeqJeJ~U5UKfCUJmnvD>D2q6sa z(6_o+w9efvRmnD&FwHXUxcfV!@30F5bFB3W{z;{x2!CII0G@ggA=4nckXRlu8m3iIbg(#Sis6My8qohjwg{F-5# zG{)xAIs~(6;}1~2KTEWon{FfRP&R?cLwEla-o20&vB>Mm2h@|M(tXz@3r}>6o2wAy zm8>5l&KaVnrUHX4H_xmoPSer=0;^+raFR>H+=)P-0UMh%3U#R>k*uv(dc2wGnV1O4 zq?3j@1>kK%tbB{!6~IXA^OScLv|`ovum>_kEsbh1Z>S zy|p8(SC5VoL>qS%g|9BYWm+v|56jXBQ1R+pZ3QiF8N{^Qj&1l#asA}hQ}grI%k(Wv zaI&#CpoW1qR{p6R7Pap}o&1FDztYD_46KeH1g6%vI;pP#3wgQrEig62Q)|~+>4ow@ zX`M0{$b8EC6lr`9R|7R$MZ&u!LVrht}*yMTTFZW^RCXab*=gaCrx zGl$3)6Q3F-VCb&-htHv&UjzEytnE`d+|;*!i|qHWJn>Jx`EQGhU!L-x%CTQO_KzN$ z{ls6QyU&52JIb{0pY69Z_bA2~mFN+%%_;`D8n#oTkK zN(#_39lfp&fGZyX$iRToO7wiS=J~N8C+Z^%W@Z-}8cID2{4r+*hZ9N?kg^+x%@!-x z0{)PolOg8a=6d{g$ zc>t(AcW7FK7?A&4BtL36tFs@F<@cb(x!TqA26%LIG<;D75Pr!(H46wy$@lL+Bi0g$ zpIFB;`(FH|{y&B%`6S7X33Q?V_rG%F^2Nztoctf1(R~S+F9Guv7cFLQfk5(xvUdUg7Y^S4o<)9H*x&s^#Fu^fl5D>u+yCoi`z4S4KgeTJNcX_{ W(6aDF1ki6n?BD8 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 KtnTKW$NvR@y}fS$ literal 0 HcmV?d00001 diff --git a/.playwright/snapshots/components/drafts/ActionBar.test.ts-snapshots/drafts-ActionBar-CommentBox-light-high-contrast-linux.png b/.playwright/snapshots/components/drafts/ActionBar.test.ts-snapshots/drafts-ActionBar-CommentBox-light-high-contrast-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..b5ea113e4b1b3df194ea640c9f1142a4f532b1b6 GIT binary patch literal 10243 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 literal 0 HcmV?d00001 diff --git a/.playwright/snapshots/components/drafts/ActionBar.test.ts-snapshots/drafts-ActionBar-CommentBox-light-linux.png b/.playwright/snapshots/components/drafts/ActionBar.test.ts-snapshots/drafts-ActionBar-CommentBox-light-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..ee281093c965d1577d047bc593e09d5bd613eea0 GIT binary patch literal 10081 zcmeHNXIN9|wvNN7*NTV;QjaL248ldE1`?4r4g$l_Ym_KOn)DI^jvl2aj!KoHF!T~L z^v+0%LkmbxfFO|`z(61&_3oT=@85gMz2`Z9{E_`V`+M^3z4lt~de{2iy;FX)u{?29 z_9zGhI&tfJv!6g9F(&W>{l_6-CiRkf5HK7F|H<+usBTDp6$JVd=$4s@Lrnh0Z0sG! z-P|t>)z(`s_h8?eyB;*@k^044qS3p$*1UFN!e+OiZHydA&W)n$BPsqt;HI4+=0@2l zUSp!las8(sYm&dQbBnI|A=CVf$+rh_-<|^X|R0jRZMs5 zGS9{w>!L0)==l%#TMq*xXbxf`4h%<*!~w_ezaJI@fo|M0|LF1t5kEaNZQ*dMoij_ zbXt{%p~ZrJ5?R)SLlwGX)lwzwJROsr^#apR$mv;{nwnbC+ddzCdNaZgrceNmN*^jP z%tFY6KvT62f&0ElxM@enQf5U>O?m<{E-O~e58-xkr3koA)zPOe-FM**X1F=TUV2_$ z)n$hzqmu5oSgp0SHQIh=b%{&*%6P3+LjcTv6AJ>}X|{KDl?a%qMRPcZ?8M!t7Z(y@ zH@>q|x2Qoxnnp~Qm>ys4b_T3?sk?MR`DkY5$XlefXv)FK0oRv3k%hPjx}%4sKOJ9G zJV1U$Ab3Zt&s>p}m7^_2uJ;?CY`D_yF{@dN)TyfeuH-jmZ&Kl`n@^SQy@$dsJK)Ca z6Wwl`b|N#zT+}T{bp^D=#>a|te%VhFXl2$|!MOEExic#(x8lUwXtjICZwaQYL?AS? zPH(GD$>~mHB98mnN5y7x0Y6`!2tu9QnhzKNH(*jSB476#13{-ZrQ(x0zorG72KfJS zY*tQIwz%p?zZB2LTaHg}lBKvnXk&c)+QSrpNYe>Gz+D~cxgTieenLs@RUrzWL=u#EHyT|`EfdM zp)Hr}gk^-*;?y5nOT%K#TsB`EBCG8)l$zH4W!0%@5dr1+8#O)*tq*c^d@6Iz?~Z&p z6DMO3?@~>AXDnKZjmP(GK$@JX##Y;%{{5Rdv9>ctK^FAsYG*n$@OvZP3Y<|*6=;wf zt5HuZ(CVxh;RP0y?N{T`_@KP7-528p=5a?)cd<%}EX>T~Iq$ovtJ7}qvT6($X>?7< zU{6eH1e2ZWT)huNHJ_b4$IGIYPY76!&9UJ;wrY3!qGnBch+r!*xRC||+YXC;K{Wyv z=^;(J!p5r<2!U1<4nEe*42d*Vk9lxc-J|0ogqyPCeM5-+;ab0(wLw%EV2N5P-g_pB z=s6OCfrQRy{Wx3ijCnEeC5a-CNsRS2;f*e9JZR#-z`)MZh>B-bZ48<&h6e@-XtspG zQ6HS0Bq~|k1_?7W>)^8C3jtIfx@C{lmE~`kId*YmoY0~kzZANj-gHOfH`L#Mibh_=sQU50zPP)nn2KK})2hm$6>ToS4% zE87@-YSDiT4FzxLSAVIXMxZTf)%a^qh?Fqe9B$qaz0LJmu1gT-_#IHw(jI5$h8= z7HE09-{1nl1Z82!HQamKPIBQ_Nfc#?!77TlIX0<>Q_$W@ArJ^ToVn=idv!!0wvO3q%9*7ZTN?a^t!^d{lCHbxM`sFmRbBJay;xmos5fm?hx zs3D)j;l!{|^N*1Iy2MmzCxZPkY2p~G@RXF4l#0QU99+=ADr)In?i5TF)GwKt zHN=gPIuOA#G5yRkv{F19tH1uFoY2xMo{^j!5Zt0t2ov0lriY7wk)cGP^0OMjQF(lUX;Q~xV67I(q(nTKE8yKRGm}R!aTS%7 z(@O?Gpc(XV5^;QTPNv$aR-<3#+Pii&_hF@Q=C5plc!IoU$GdAB=Cro5vJa^;!@j&w zel)n<7@(Qa_HXN#CkU=eoI60BK&C_3Us~vtY(goO!(z{rL(ipU8%g#%cbpRLCTgTT zA*KTrk0YbK`Jv@=KP*+eDAs~U?}HIAm^Q;K<8Gt9*>YI?;)^s|#Rb(Y!LhpJm5JJb z(In%z2=t(;f)Z3Xt}`+`d7RP{(x}upgnELHfBa_gPTt-=?s54-YLU=TgWm@wCh}KQt;=U7$AeIE zA-RfZW9**}H0pH&7N*RHbnT zE<7XFldh(fS`}sdVQKr|Xy5CQeN*0M9u?<>h>%Va#Y^*p5jv~iTJd?{)-ua7;ciPU&@ z;@p|EEcFaAONCPz85vmm{-T|uqry6H{|IskT-~kV;-M2Ve_HyvVXo!f*hG_;U)7np zmdjp&N7h!geF&bcF+vEY`-)(Hr$}wpNR);me%5+<=@mW49tAd>s6(iTDpyP|_zO6U zZ$0WgK_}}6Z~szzdQ{x#IyAUY_X0{D+T^dpwT^u4O(=*arh~VF zY@yCI{Gjox@252cYG;myj{PF(y+?1AkkArhyUiTmp1J_Ih=!7p3t#HkgYFxIFIiB# zklw<(rmrEau}W3q^WUEo!-=SnxOA#uuZ=yNTTZO7yHN7uWn4Q7e2IVtD+jargSEWz z&PJVp34%iOtRz=l;k2V8hVOO1myp3Iq@h!SXWK*pCC4VBj?hk`1zfs9W@e_=gU`t_ zKnKd(|Jkxw*u^ilWNk90B#$XKsejZKYTDxN9@Z1q1_F)EK)dj*sGgfm)_E4UwW-&r-sX)4SPfi}$oPX6>t-NS^F6Vlvho}@!Qm+Rkkr42KX2R~y ziHwZU!CgIbDx~wZH$>T+H`TlFerE_}dQ$dWlEO7Z4MSmm^u2+dJYxhao#YjfP!F4L zPyt%N?{9b0>V6ygPvANAxAMh_@6AcLL|7|7VD*A>9BWO&s>t2x=zDfWMMZLoBmtie-b~*iak)A6h!A<>)e4^?y*I+4&UV4TN8ggY zu2=?N$!jhUK`Jcm#^3gwU1Ia_u#BngZ>qYw&hIH1UK}!{y((KibM&cC`65P?PrIw; zp+Z@6cLTpB*wzIQBJJp^q3c%Ug?~B2XcFY*Cw8Gu;@>+WBe?<*>+ zP$ptrqA7X+4dX4f>AyKKpc`j32IWjig5zy~f)+T{g8eo8_syCP6X@y(Hc`_{9t~yO z8_0E+E5B`Qpsak!Mn(zN&7@%cN6RWYSzYX<$!;=zr>ZJCn7+3`!8>cT>I){P6DQSn zx)pTB#~G!G?9Ty84rUSSA9bplIfh4{E~(yjaCRp8Z$YnIQqoCi=Nf%}W2Y4m6%<%i zoo1=XwMtjiiGMv>RMniXCIpt>V^Z3;qFAGy?vpMY`fmWDwYBcfB>oCmFm^X>!Q3O7R%>T(udtjS zX))RqmH=Dg@Bbe2Qf$=Z`THk0bDap{ z2QdrWOe>3EDh@qO?WDg3$R!3q#aySmNBHb6HhA_st7mxE;?F0%kgRlL#4h<04Y9W-h1k71Shj4&9TM)O6SQvXrtsmUO1oo90VylaP!PwAc2bd|Lg z?5^tXw#j&rb`bO>(NYhN$=A^SwcW;fN$JywN9^C`@fJnmd9McWx!z(lX z%bVqM3H@swX=gQ2=bs$LQwt(};(5g+TszfR1(m0NUNL^b;@zCL)FTmOF_}+{crJ;CIqQY`PxYKckYnQ$I+nLco!OD=+BP8FYK&93{ zFyMc|fq=WI&gZN7CSm^=phR$GnyAlnbm2Y`8)TKe6*hUbP_*%54RmUv zWE0J9b^AQZVmckO%rIc~yy#>js~xMYO0Q}%9W_J*Dl03ypf@=ygVu~u1Edz-Y_3u= z7JgELIRd~2>1C#W=K<0AhAQ@7iQ{T2isnc=r+M_S4qo zXPi+752Gqe_#vh6-l5r>hqxbJVhSKJ!(U87_GbnZW5Ys^%Qe`F6q&hCS)K0;IlEW* z-*i3y9VQKBp|(!OfIZ|-0K&@uF0}cX);tvN8Twnwn`0*8(QQE+yEP2`yziX}_Z8w> zKnRMiIeUcj)*e)ZVD!($Ep(jE^@ zS}h;x-VzDkK@$h1Jx*oA5@K74|1CrPil-vs7Zk?xJ1x;6@=ZlLN?8s6JM>gfG~ zBjh~KlN_L%#Xqx-ys8Z(_B#s2a7nXe{_)hiN)5vX%$0SI;R$-!Fl&W;#i_fa?tU2{ zuSNw>()Rl`yN#SW8#Lk~HasS#-_%YozS){6wRdoGBBW{72IZ!RG~JIVZ^6^?fZ`u3 z(t|zsF0aQAPdJ=$U-^c8U$X`UC{8QmB>@f9b*X(ntZx7p7HW(3O#b1>j+VHfGe7mh0D1b> zRauebf5Ts2^Z(@qz*lhpJHY)nO3c?{@D-L{Vfhce$ovYJuYma%0jBYmf-?woSX}fi z!2ji4`&Wp5h3LNsqF-V8Pk#aPH7mbn<=3qI`@b0bYrZgrpv>u2Skn75O~7sxbj#ev KtnTKW$NvR@y}fS$ literal 0 HcmV?d00001 diff --git a/.playwright/snapshots/components/drafts/ActionBar.test.ts-snapshots/drafts-ActionBar-CommentBox-light-tritanopia-linux.png b/.playwright/snapshots/components/drafts/ActionBar.test.ts-snapshots/drafts-ActionBar-CommentBox-light-tritanopia-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..ee281093c965d1577d047bc593e09d5bd613eea0 GIT binary patch literal 10081 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 KtnTKW$NvR@y}fS$ literal 0 HcmV?d00001 diff --git a/e2e/components/drafts/ActionBar.test.ts b/e2e/components/drafts/ActionBar.test.ts new file mode 100644 index 00000000000..f7c74f0f750 --- /dev/null +++ b/e2e/components/drafts/ActionBar.test.ts @@ -0,0 +1,54 @@ +import {test, expect} from '@playwright/test' +import {visit} from '../../test-helpers/storybook' +import {themes} from '../../test-helpers/themes' +import {viewports} from '../../test-helpers/viewports' + +test.describe('ActionBar', () => { + test.describe('Default state', () => { + for (const theme of themes) { + test.describe(theme, () => { + test('default @vrt', async ({page}) => { + await visit(page, { + id: 'drafts-components-actionbar--comment-box', + globals: { + colorScheme: theme, + }, + }) + expect(await page.screenshot()).toMatchSnapshot(`drafts.ActionBar.CommentBox.${theme}.png`) + }) + + test('axe @aat', async ({page}) => { + await visit(page, { + id: 'drafts-components-actionbar--comment-box', + globals: { + colorScheme: theme, + }, + }) + await expect(page).toHaveNoViolations() + }) + }) + } + }) + + test.describe('ActionBar Interactions', () => { + for (const theme of themes) { + test.describe(theme, () => { + test('Overflow interaction @vrt', async ({page}) => { + await visit(page, { + id: 'drafts-components-actionbar--comment-box', + globals: { + colorScheme: theme, + }, + }) + const toolbarButtonSelector = `button[data-component="IconButton"]` + await expect(page.locator(toolbarButtonSelector)).toHaveCount(10) + await page.setViewportSize({width: viewports['primer.breakpoint.xs'], height: 768}) + await expect(page.locator(toolbarButtonSelector)).toHaveCount(6) + const moreButtonSelector = `button[aria-label="More Comment box toolbar items"]` + await page.locator(moreButtonSelector).click() + await expect(page.locator('ul[role="menu"]>li')).toHaveCount(5) + }) + }) + } + }) +}) diff --git a/packages/react/src/drafts/ActionBar/ActionBar.stories.tsx b/packages/react/src/drafts/ActionBar/ActionBar.stories.tsx index 27d5ce0173e..f2dd0563a0a 100644 --- a/packages/react/src/drafts/ActionBar/ActionBar.stories.tsx +++ b/packages/react/src/drafts/ActionBar/ActionBar.stories.tsx @@ -68,7 +68,7 @@ export const CommentBox = (props: CommentBoxProps) => { const [value, setValue] = React.useState('') const [isOpen, setIsOpen] = React.useState(false) const buttonRef = React.useRef(null) - const toolBarLabel = `${ariaLabel} toolbar` + const toolBarLabel = `${ariaLabel ? ariaLabel : 'Comment box'} toolbar` return ( ).current.getBoundingClientRect() setChildrenWidth({text, width: domRect.width}) }, [ref, setChildrenWidth]) - return + return }) const sizeToHeight = {