From 29f33ce93c6b7e573cca9f2c0a10bb12ec5245c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arma=C4=9Fan?= Date: Tue, 8 Oct 2024 09:49:17 +1000 Subject: [PATCH 01/20] Tooltip: Do not export all types publicly in the experimental bundle (#5064) * Do not export all types publicly in the experimental bundle * export tooltip direction for button * snapshot * Create eight-avocados-lick.md * Update .changeset/eight-avocados-lick.md --- .changeset/eight-avocados-lick.md | 5 +++++ packages/react/src/TooltipV2/Tooltip.tsx | 2 +- .../react/src/__tests__/__snapshots__/exports.test.ts.snap | 3 --- packages/react/src/experimental/index.ts | 3 ++- 4 files changed, 8 insertions(+), 5 deletions(-) create mode 100644 .changeset/eight-avocados-lick.md diff --git a/.changeset/eight-avocados-lick.md b/.changeset/eight-avocados-lick.md new file mode 100644 index 00000000000..5b98b3dba35 --- /dev/null +++ b/.changeset/eight-avocados-lick.md @@ -0,0 +1,5 @@ +--- +"@primer/react": minor +--- + +Tooltip: Do not export all types publicly in the experimental bundle diff --git a/packages/react/src/TooltipV2/Tooltip.tsx b/packages/react/src/TooltipV2/Tooltip.tsx index ab5c5fe6648..3f613d340a2 100644 --- a/packages/react/src/TooltipV2/Tooltip.tsx +++ b/packages/react/src/TooltipV2/Tooltip.tsx @@ -133,7 +133,7 @@ export type TooltipProps = React.PropsWithChildren< ComponentProps > -export type TriggerPropsType = { +type TriggerPropsType = { 'aria-describedby'?: string 'aria-labelledby'?: string 'aria-label'?: string diff --git a/packages/react/src/__tests__/__snapshots__/exports.test.ts.snap b/packages/react/src/__tests__/__snapshots__/exports.test.ts.snap index d65ca9608e3..d1274f48982 100644 --- a/packages/react/src/__tests__/__snapshots__/exports.test.ts.snap +++ b/packages/react/src/__tests__/__snapshots__/exports.test.ts.snap @@ -316,10 +316,7 @@ exports[`@primer/react/experimental should not update exports without a semver c "type TableTitleProps", "type TitleProps", "Tooltip", - "TooltipContext", - "type TooltipDirection", "type TooltipProps", - "type TriggerPropsType", "UnderlinePanels", "type UnderlinePanelsPanelProps", "type UnderlinePanelsProps", diff --git a/packages/react/src/experimental/index.ts b/packages/react/src/experimental/index.ts index 6bd1da7b233..7cafc776d18 100644 --- a/packages/react/src/experimental/index.ts +++ b/packages/react/src/experimental/index.ts @@ -52,7 +52,8 @@ export type { NavListDividerProps, } from '../NavList' export * from './SelectPanel2' -export * from '../TooltipV2' +export {Tooltip} from '../TooltipV2' +export type {TooltipProps} from '../TooltipV2' export * from '../ActionBar' export {ScrollableRegion} from '../ScrollableRegion' From ce14f8506265131ce4b935d3205c2b9c6181e267 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arma=C4=9Fan?= Date: Tue, 8 Oct 2024 09:53:31 +1000 Subject: [PATCH 02/20] Add tooltipDirection to docs (#5084) --- packages/react/src/Button/IconButton.docs.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/react/src/Button/IconButton.docs.json b/packages/react/src/Button/IconButton.docs.json index 6d606228e6d..dc357c85695 100644 --- a/packages/react/src/Button/IconButton.docs.json +++ b/packages/react/src/Button/IconButton.docs.json @@ -49,6 +49,13 @@ "required": false, "description": "Keyboard shortcuts that trigger the button. Keyboard shortcut will be appended to the accessible name or description (depending on the tooltip type) of the button with a comma (i.e. Bold, Command+B) and it will be displayed in the tooltip." }, + { + "name": "tooltipDirection", + "type": "'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w' | 'nw'", + "defaultValue": "'s'", + "description": "The direction of the tooltip. ", + "required": false + }, { "name": "sx", "type": "SystemStyleObject" From 62e0d6e7ea71d15b431ffb8f6732dbe9ddfc75b2 Mon Sep 17 00:00:00 2001 From: Jon Rohan Date: Mon, 7 Oct 2024 17:03:58 -0700 Subject: [PATCH 03/20] chore: Move CSS modules team feature flag to staff for Banner, ButtonGroup, Checkbox, CounterLabel components (#5063) * Move from team feature flag to staff feature flag * Create tame-walls-travel.md --- .changeset/tame-walls-travel.md | 5 +++++ packages/react/src/Banner/Banner.tsx | 2 +- packages/react/src/ButtonGroup/ButtonGroup.tsx | 4 ++-- packages/react/src/Checkbox/Checkbox.tsx | 2 +- packages/react/src/CounterLabel/CounterLabel.tsx | 2 +- 5 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 .changeset/tame-walls-travel.md diff --git a/.changeset/tame-walls-travel.md b/.changeset/tame-walls-travel.md new file mode 100644 index 00000000000..c73fb558833 --- /dev/null +++ b/.changeset/tame-walls-travel.md @@ -0,0 +1,5 @@ +--- +"@primer/react": patch +--- + +Move CSS modules team feature flag to staff for Banner, ButtonGroup, Checkbox, CounterLabel components diff --git a/packages/react/src/Banner/Banner.tsx b/packages/react/src/Banner/Banner.tsx index d1061e966ed..cf2a27a6336 100644 --- a/packages/react/src/Banner/Banner.tsx +++ b/packages/react/src/Banner/Banner.tsx @@ -87,7 +87,7 @@ const labels: Record = { warning: 'Warning', } -const CSS_MODULES_FEATURE_FLAG = 'primer_react_css_modules_team' +const CSS_MODULES_FEATURE_FLAG = 'primer_react_css_modules_staff' export const Banner = React.forwardRef(function Banner( { diff --git a/packages/react/src/ButtonGroup/ButtonGroup.tsx b/packages/react/src/ButtonGroup/ButtonGroup.tsx index aeed944a1cf..b700f4fcd43 100644 --- a/packages/react/src/ButtonGroup/ButtonGroup.tsx +++ b/packages/react/src/ButtonGroup/ButtonGroup.tsx @@ -9,7 +9,7 @@ import {clsx} from 'clsx' import {useFeatureFlag} from '../FeatureFlags' const StyledButtonGroup = toggleStyledComponent( - 'primer_react_css_modules_team', + 'primer_react_css_modules_staff', styled.div` display: inline-flex; vertical-align: middle; @@ -77,7 +77,7 @@ const ButtonGroup = React.forwardRef(function But {children, className, ...rest}, forwardRef, ) { - const enabled = useFeatureFlag('primer_react_css_modules_team') + const enabled = useFeatureFlag('primer_react_css_modules_staff') return ( ( }, ref, ): ReactElement => { - const enabled = useFeatureFlag('primer_react_css_modules_team') + const enabled = useFeatureFlag('primer_react_css_modules_staff') const checkboxRef = useProvidedRefOrCreate(ref as React.RefObject) const checkboxGroupContext = useContext(CheckboxGroupContext) const handleOnChange: ChangeEventHandler = e => { diff --git a/packages/react/src/CounterLabel/CounterLabel.tsx b/packages/react/src/CounterLabel/CounterLabel.tsx index 01f2b18397e..ecabddea876 100644 --- a/packages/react/src/CounterLabel/CounterLabel.tsx +++ b/packages/react/src/CounterLabel/CounterLabel.tsx @@ -20,7 +20,7 @@ export type CounterLabelProps = React.PropsWithChildren< const CounterLabel = forwardRef( ({scheme = 'secondary', sx = defaultSxProp, className, children, ...rest}, forwardedRef) => { - const enabled = useFeatureFlag('primer_react_css_modules_team') + const enabled = useFeatureFlag('primer_react_css_modules_staff') const label =  ({children}) const counterProps = { ref: forwardedRef, From 0f5d5e05096b1b1599a92c90619cde6e11cb5808 Mon Sep 17 00:00:00 2001 From: Jon Rohan Date: Mon, 7 Oct 2024 17:04:32 -0700 Subject: [PATCH 04/20] chore(Avatar): Move CSS modules feature flag from staff to ga for Avatar component (#5062) * Move Avatar feature flag from staff to ga * Create five-seas-scream.md --- .changeset/five-seas-scream.md | 5 +++++ packages/react/src/Avatar/Avatar.tsx | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/five-seas-scream.md diff --git a/.changeset/five-seas-scream.md b/.changeset/five-seas-scream.md new file mode 100644 index 00000000000..3f7aac42e6a --- /dev/null +++ b/.changeset/five-seas-scream.md @@ -0,0 +1,5 @@ +--- +"@primer/react": patch +--- + +Move CSS modules feature flag from staff to ga for Avatar component diff --git a/packages/react/src/Avatar/Avatar.tsx b/packages/react/src/Avatar/Avatar.tsx index 79d7a1dfefb..4f5f066a147 100644 --- a/packages/react/src/Avatar/Avatar.tsx +++ b/packages/react/src/Avatar/Avatar.tsx @@ -48,7 +48,7 @@ const Avatar = React.forwardRef(function Avatar( {alt = '', size = DEFAULT_AVATAR_SIZE, square = false, sx: sxProp = defaultSxProp, className, ...rest}, ref, ) { - const enabled = useFeatureFlag('primer_react_css_modules_staff') + const enabled = useFeatureFlag('primer_react_css_modules_ga') const isResponsive = isResponsiveValue(size) const avatarSx = isResponsive ? merge( From 8385c334df1f31aa810a8e6575986ca420a683f9 Mon Sep 17 00:00:00 2001 From: Josh Black Date: Mon, 7 Oct 2024 19:26:43 -0500 Subject: [PATCH 05/20] feat: promote Tooltip, Dialog, Stack to stable (#5010) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: promote Tooltip, Dialog, Stack to stable * chore: add changeset * chore: do not remove components from experimental until we update dotcom * Updates from editor * chore: resolve merge conflicts * chore: remove barrel exports from TooltipV2 * fix: add TooltipDirection to Tooltip index module --------- Co-authored-by: Josh Black Co-authored-by: Armağan --- .changeset/khaki-dolls-reflect.md | 5 +++++ packages/react/src/TooltipV2/index.ts | 3 ++- .../src/__tests__/__snapshots__/exports.test.ts.snap | 8 ++++++++ packages/react/src/index.ts | 4 ++++ packages/react/src/next/index.ts | 3 ++- 5 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 .changeset/khaki-dolls-reflect.md diff --git a/.changeset/khaki-dolls-reflect.md b/.changeset/khaki-dolls-reflect.md new file mode 100644 index 00000000000..24f9e125038 --- /dev/null +++ b/.changeset/khaki-dolls-reflect.md @@ -0,0 +1,5 @@ +--- +'@primer/react': minor +--- + +Promote Dialog, Tooltip, and Stack from `@primer/react/experimental` to `@primer/react` diff --git a/packages/react/src/TooltipV2/index.ts b/packages/react/src/TooltipV2/index.ts index ba15f407377..9a336ded38c 100644 --- a/packages/react/src/TooltipV2/index.ts +++ b/packages/react/src/TooltipV2/index.ts @@ -1 +1,2 @@ -export * from './Tooltip' +export {Tooltip} from './Tooltip' +export type {TooltipProps, TooltipDirection} from './Tooltip' diff --git a/packages/react/src/__tests__/__snapshots__/exports.test.ts.snap b/packages/react/src/__tests__/__snapshots__/exports.test.ts.snap index d1274f48982..3651ddc6fbe 100644 --- a/packages/react/src/__tests__/__snapshots__/exports.test.ts.snap +++ b/packages/react/src/__tests__/__snapshots__/exports.test.ts.snap @@ -65,6 +65,12 @@ exports[`@primer/react should not update exports without a semver change 1`] = ` "createComponent", "Details", "type DetailsProps", + "Dialog", + "type DialogButtonProps", + "type DialogHeaderProps", + "type DialogHeight", + "type DialogProps", + "type DialogWidth", "Flash", "type FlashProps", "type FocusTrapHookSettings", @@ -173,6 +179,8 @@ exports[`@primer/react should not update exports without a semver change 1`] = ` "ToggleSwitch", "Token", "type TokenProps", + "Tooltip", + "type TooltipProps", "type TouchOrMouseEvent", "TreeView", "type TreeViewErrorDialogProps", diff --git a/packages/react/src/index.ts b/packages/react/src/index.ts index cbc739faf4b..a6188c13cee 100644 --- a/packages/react/src/index.ts +++ b/packages/react/src/index.ts @@ -93,6 +93,8 @@ export {default as CounterLabel} from './CounterLabel' export type {CounterLabelProps} from './CounterLabel' export {default as Details} from './Details' export type {DetailsProps} from './Details' +export {Dialog} from './Dialog/Dialog' +export type {DialogProps, DialogHeaderProps, DialogButtonProps, DialogWidth, DialogHeight} from './Dialog/Dialog' export type {ConfirmationDialogProps} from './ConfirmationDialog/ConfirmationDialog' export {ConfirmationDialog} from './ConfirmationDialog/ConfirmationDialog' export {default as Flash} from './Flash' @@ -164,6 +166,8 @@ export type { } from './Timeline' export {default as Token, IssueLabelToken, AvatarToken} from './Token' export type {TokenProps, IssueLabelTokenProps} from './Token' +export {Tooltip} from './TooltipV2' +export type {TooltipProps} from './TooltipV2' export {default as Truncate} from './Truncate' export type {TruncateProps} from './Truncate' diff --git a/packages/react/src/next/index.ts b/packages/react/src/next/index.ts index cafa67c9ab8..4b07c532265 100644 --- a/packages/react/src/next/index.ts +++ b/packages/react/src/next/index.ts @@ -1,4 +1,5 @@ 'use client' // next entrypoint is used to export the latest version of the components that have conflicts with the main bundle. -export * from '../TooltipV2' +export {Tooltip} from '../TooltipV2' +export type {TooltipProps} from '../TooltipV2' From 212714ccc005eb57e272b3f64e3736e198c555e8 Mon Sep 17 00:00:00 2001 From: Katie Langerman <18661030+langermank@users.noreply.github.com> Date: Mon, 7 Oct 2024 18:44:55 -0700 Subject: [PATCH 06/20] Add focus styles to Pagination component (#5082) * lil bug fix * Create large-glasses-provide.md --------- Co-authored-by: Jon Rohan --- .changeset/large-glasses-provide.md | 5 +++++ packages/react/src/Pagination/Pagination.tsx | 14 +++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 .changeset/large-glasses-provide.md diff --git a/.changeset/large-glasses-provide.md b/.changeset/large-glasses-provide.md new file mode 100644 index 00000000000..7452e63c888 --- /dev/null +++ b/.changeset/large-glasses-provide.md @@ -0,0 +1,5 @@ +--- +"@primer/react": patch +--- + +Add focus styles to Pagination component diff --git a/packages/react/src/Pagination/Pagination.tsx b/packages/react/src/Pagination/Pagination.tsx index 616272ffd5a..db3671c8dd8 100644 --- a/packages/react/src/Pagination/Pagination.tsx +++ b/packages/react/src/Pagination/Pagination.tsx @@ -4,7 +4,6 @@ import Box from '../Box' import {get} from '../constants' import type {SxProp} from '../sx' import sx from '../sx' -import getGlobalFocusStyles from '../internal/utils/getGlobalFocusStyles' import {buildComponentData, buildPaginationModel} from './model' import type {ResponsiveValue} from '../hooks/useResponsiveValue' import {viewportRanges} from '../hooks/useResponsiveValue' @@ -56,7 +55,10 @@ const Page = styled.a` transition-duration: 0.1s; } - ${getGlobalFocusStyles(0)}; + &:focus-visible { + outline: 2px solid ${get('colors.accent.emphasis')}; + outline-offset: -2px; + } &:active { border-color: ${get('colors.border.muted')}; @@ -74,6 +76,12 @@ const Page = styled.a` border-color: transparent; } + &[aria-current]:focus-visible { + outline: 2px solid ${get('colors.accent.emphasis')}; + outline-offset: -2px; + box-shadow: inset 0 0 0 3px ${get('colors.fg.onEmphasis')}; + } + &[aria-disabled], &[aria-disabled]:hover { margin: 0 2px; @@ -196,7 +204,7 @@ const PaginationContainer = styled.nav` .TablePaginationSteps[data-hidden-viewport-ranges*='${viewportRangeKey}'] > *:first-child { margin-inline-end: 0; } - + .TablePaginationSteps[data-hidden-viewport-ranges*='${viewportRangeKey}'] > *:last-child { margin-inline-start: 0; } From 472967a712e9b81856b3b37088142b0ffbda5b15 Mon Sep 17 00:00:00 2001 From: Siddharth Kshetrapal Date: Tue, 8 Oct 2024 16:07:14 +0200 Subject: [PATCH 07/20] SelectPanel: Fix items not being selected when defined within scope (#5073) * add failing test * track items by id if possible * Create stupid-monkeys-beg.md --------- Co-authored-by: Jon Rohan --- .changeset/stupid-monkeys-beg.md | 5 ++ .../SelectPanel.examples.stories.tsx | 36 ++++++++++++++ .../src/SelectPanel/SelectPanel.test.tsx | 47 +++++++++++++++++++ .../react/src/SelectPanel/SelectPanel.tsx | 18 +++++-- 4 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 .changeset/stupid-monkeys-beg.md diff --git a/.changeset/stupid-monkeys-beg.md b/.changeset/stupid-monkeys-beg.md new file mode 100644 index 00000000000..685c96bab90 --- /dev/null +++ b/.changeset/stupid-monkeys-beg.md @@ -0,0 +1,5 @@ +--- +"@primer/react": patch +--- + +SelectPanel: Fix items not being selected when defined within scope (track selection by item.id) diff --git a/packages/react/src/SelectPanel/SelectPanel.examples.stories.tsx b/packages/react/src/SelectPanel/SelectPanel.examples.stories.tsx index 248432e0f9a..3e261c6bce3 100644 --- a/packages/react/src/SelectPanel/SelectPanel.examples.stories.tsx +++ b/packages/react/src/SelectPanel/SelectPanel.examples.stories.tsx @@ -309,3 +309,39 @@ export const CustomItemRenderer = () => { ) } + +export const ItemsInScope = () => { + // items are defined in the same scope as selection, so they could rerender and create new object references + // We use item.id to track selection + // Reported in: https://github.com/primer/react/issues/4315 + const items = [ + {text: 'enhancement', id: 1}, + {text: 'bug', id: 2}, + {text: 'good first issue', id: 3}, + {text: 'design', id: 4}, + {text: 'blocker', id: 5}, + {text: 'backend', id: 6}, + {text: 'frontend', id: 7}, + ] + + const [selected, setSelected] = React.useState([items[0], items[1]]) + const [open, setOpen] = useState(false) + const [filter, setFilter] = React.useState('') + const filteredItems = items.filter(item => item.text.toLowerCase().startsWith(filter.toLowerCase())) + + return ( + <> +

Items in component scope

+ + + ) +} diff --git a/packages/react/src/SelectPanel/SelectPanel.test.tsx b/packages/react/src/SelectPanel/SelectPanel.test.tsx index 936f3b544fc..a047507fb7e 100644 --- a/packages/react/src/SelectPanel/SelectPanel.test.tsx +++ b/packages/react/src/SelectPanel/SelectPanel.test.tsx @@ -335,6 +335,53 @@ for (const useModernActionList of [false, true]) { screen.getByRole('option', {name: 'item one'}).id, ) }) + + it('should select an item (by item.id) even when items are defined in the component', async () => { + const user = userEvent.setup() + + function Fixture() { + // items are defined in the same scope as selection, so they could rerender and create new object references + // We use item.id to track selection + const items: SelectPanelProps['items'] = [ + {id: 'one', text: 'item one'}, + {id: 'two', text: 'item two'}, + {id: 'three', text: 'item three'}, + ] + + const [open, setOpen] = React.useState(false) + const [selected, setSelected] = React.useState([]) + const [filter, setFilter] = React.useState('') + + return ( + + + + ) + } + + renderWithFlag(, useModernActionList) + + await user.click(screen.getByText('Select items')) + + await user.click(screen.getByText('item one')) + expect(screen.getByRole('option', {name: 'item one'})).toHaveAttribute('aria-selected', 'true') + + await user.click(screen.getByText('item two')) + expect(screen.getByRole('option', {name: 'item two'})).toHaveAttribute('aria-selected', 'true') + + await user.click(screen.getByRole('option', {name: 'item one'})) + expect(screen.getByRole('option', {name: 'item one'})).toHaveAttribute('aria-selected', 'false') + }) }) function FilterableSelectPanel() { diff --git a/packages/react/src/SelectPanel/SelectPanel.tsx b/packages/react/src/SelectPanel/SelectPanel.tsx index efae1b5a7e1..c862950deb3 100644 --- a/packages/react/src/SelectPanel/SelectPanel.tsx +++ b/packages/react/src/SelectPanel/SelectPanel.tsx @@ -61,6 +61,16 @@ const focusZoneSettings: Partial = { disabled: true, } +const areItemsEqual = (itemA: ItemInput, itemB: ItemInput) => { + // prefer checking equivality by item.id + if (typeof itemA.id !== 'undefined') return itemA.id === itemB.id + else return itemA === itemB +} + +const doesItemsIncludeItem = (items: ItemInput[], item: ItemInput) => { + return items.some(i => areItemsEqual(i, item)) +} + export function SelectPanel({ open, onOpenChange, @@ -129,7 +139,7 @@ export function SelectPanel({ const itemsToRender = useMemo(() => { return items.map(item => { - const isItemSelected = isMultiSelectVariant(selected) ? selected.includes(item) : selected === item + const isItemSelected = isMultiSelectVariant(selected) ? doesItemsIncludeItem(selected, item) : selected === item return { ...item, @@ -143,8 +153,10 @@ export function SelectPanel({ } if (isMultiSelectVariant(selected)) { - const otherSelectedItems = selected.filter(selectedItem => selectedItem !== item) - const newSelectedItems = selected.includes(item) ? otherSelectedItems : [...otherSelectedItems, item] + const otherSelectedItems = selected.filter(selectedItem => !areItemsEqual(selectedItem, item)) + const newSelectedItems = doesItemsIncludeItem(selected, item) + ? otherSelectedItems + : [...otherSelectedItems, item] const multiSelectOnChange = onSelectedChange as SelectPanelMultiSelection['onSelectedChange'] multiSelectOnChange(newSelectedItems) From f369706817036b0fe7a950bc0abc3bb138fd02ff Mon Sep 17 00:00:00 2001 From: Siddharth Kshetrapal Date: Tue, 8 Oct 2024 16:16:00 +0200 Subject: [PATCH 08/20] Create recommend-integration-tests.yml (#5065) * Create recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * diff for the sake of it * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * Update recommend-integration-tests.yml * remove test change * prettier * use short link! * add paginate Co-authored-by: Josh Black * create test change * debug * dont need dot data * remove debug statement --------- Co-authored-by: Josh Black --- .../workflows/recommend-integration-tests.yml | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 .github/workflows/recommend-integration-tests.yml diff --git a/.github/workflows/recommend-integration-tests.yml b/.github/workflows/recommend-integration-tests.yml new file mode 100644 index 00000000000..1166c329c0a --- /dev/null +++ b/.github/workflows/recommend-integration-tests.yml @@ -0,0 +1,74 @@ +name: Recommend integration tests +on: + pull_request: + +jobs: + recommend: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + + - name: Get source files changes + id: source-files + run: | + DIFF=$(git diff --name-only origin/main | grep 'packages/react' | grep -Ev '.stories.tsx|.docs.json' || true) + if [ -z "$DIFF" ]; then + echo "diff=" >> $GITHUB_OUTPUT + else + echo "diff=$DIFF" >> $GITHUB_OUTPUT + fi + + - name: Has diff? + run: echo ${{ steps.source-files.outputs.diff != '' }} + + - name: Get or Create Comment + if: ${{ steps.source-files.outputs.diff != '' }} + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const result = await github.paginate(github.rest.issues.listComments, { + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo + }); + + const previousComment = result.filter(c => c.user.login == 'github-actions[bot]' && c.body.startsWith('')) + if (!previousComment.length) { + await github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: '\n\n :wave: Hi, this pull request contains changes to the source code that github/github depends on. If you are GitHub staff, we recommend testing these changes with github/github using the [integration workflow](https://gh.io/testing_primer_at_dotcom). Thanks!' + }) + } + + - name: Add label + if: ${{ steps.source-files.outputs.diff != '' }} + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const result = await github.rest.issues.listLabelsOnIssue({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + }) + + const integrationLabels = result.data.filter(label => label.name.startsWith('integration-tests')) + if (!integrationLabels.length) { + await github.rest.issues.addLabels({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + labels: ['integration-tests: recommended'], + }) + } From 8e87387e245c78639032652415c2d8ad1bd2d988 Mon Sep 17 00:00:00 2001 From: Josh Black Date: Tue, 8 Oct 2024 09:34:28 -0500 Subject: [PATCH 09/20] Update dependabot.yml (#5080) Co-authored-by: Jon Rohan --- .github/dependabot.yml | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 5206c25fd82..97e16d1b9f5 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -9,16 +9,7 @@ updates: directory: '/' schedule: interval: 'weekly' - labels: - - 'dependencies' - - 'skip changeset' - - - package-ecosystem: 'npm' - directory: '/docs' - schedule: - interval: 'weekly' - allow: - - dependency-name: '@primer/gatsby-theme-doctocat' + versioning-strategy: increase labels: - 'dependencies' - 'skip changeset' From 0a1f357c536dc78c5150160fddcb70331d4dda31 Mon Sep 17 00:00:00 2001 From: Jon Rohan Date: Tue, 8 Oct 2024 08:44:09 -0700 Subject: [PATCH 10/20] Try running vrt and aat on 16 core runners (#5083) --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 35b89dfec66..fd6e8942875 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -106,7 +106,7 @@ jobs: run: npm run build -ws --if-present vrt-runner: - runs-on: ubuntu-latest-8-cores + runs-on: ubuntu-latest-16-cores strategy: fail-fast: false matrix: @@ -180,7 +180,7 @@ jobs: run: exit 1 vrt-runner-all-flags: - runs-on: ubuntu-latest-8-cores + runs-on: ubuntu-latest-16-cores strategy: fail-fast: false matrix: @@ -258,7 +258,7 @@ jobs: run: exit 1 aat-runner: - runs-on: ubuntu-latest-8-cores + runs-on: ubuntu-latest-16-cores strategy: fail-fast: false matrix: @@ -332,7 +332,7 @@ jobs: run: exit 1 aat-runner-all-flags: - runs-on: ubuntu-latest-8-cores + runs-on: ubuntu-latest-16-cores strategy: fail-fast: false matrix: From ba3a84ad83f2d8bca8983ffd4adc99321e2e4580 Mon Sep 17 00:00:00 2001 From: Siddharth Kshetrapal Date: Tue, 8 Oct 2024 18:34:40 +0200 Subject: [PATCH 11/20] set output to true instead of files (#5085) --- .github/workflows/recommend-integration-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/recommend-integration-tests.yml b/.github/workflows/recommend-integration-tests.yml index 1166c329c0a..ddeb07db8d3 100644 --- a/.github/workflows/recommend-integration-tests.yml +++ b/.github/workflows/recommend-integration-tests.yml @@ -23,7 +23,7 @@ jobs: if [ -z "$DIFF" ]; then echo "diff=" >> $GITHUB_OUTPUT else - echo "diff=$DIFF" >> $GITHUB_OUTPUT + echo "diff=true" >> $GITHUB_OUTPUT fi - name: Has diff? From 73135c1c57a02e35d33ae6ffba16784043dcabb8 Mon Sep 17 00:00:00 2001 From: Marie Lucca <40550942+francinelucca@users.noreply.github.com> Date: Tue, 8 Oct 2024 14:01:26 -0400 Subject: [PATCH 12/20] fix(Banner): rewrite PrimaryAction & SecondaryAction types (#5055) * fix(Banner): rewrite PrimaryAction & SecondaryAction types * Create modern-cooks-invite.md --- .changeset/modern-cooks-invite.md | 5 +++++ packages/react/src/Banner/Banner.tsx | 27 +++++++++++++++++---------- 2 files changed, 22 insertions(+), 10 deletions(-) create mode 100644 .changeset/modern-cooks-invite.md diff --git a/.changeset/modern-cooks-invite.md b/.changeset/modern-cooks-invite.md new file mode 100644 index 00000000000..df4fde36b37 --- /dev/null +++ b/.changeset/modern-cooks-invite.md @@ -0,0 +1,5 @@ +--- +"@primer/react": patch +--- + +fix(Banner): rewrite PrimaryAction & SecondaryAction types diff --git a/packages/react/src/Banner/Banner.tsx b/packages/react/src/Banner/Banner.tsx index cf2a27a6336..6b85cf67c5e 100644 --- a/packages/react/src/Banner/Banner.tsx +++ b/packages/react/src/Banner/Banner.tsx @@ -1,14 +1,15 @@ import {clsx} from 'clsx' -import React, {useEffect} from 'react' +import React, {forwardRef, useEffect} from 'react' import styled from 'styled-components' import {AlertIcon, InfoIcon, StopIcon, CheckCircleIcon, XIcon} from '@primer/octicons-react' -import {Button, IconButton} from '../Button' +import {Button, IconButton, type ButtonProps} from '../Button' import {get} from '../constants' import {VisuallyHidden} from '../VisuallyHidden' import {useMergedRefs} from '../internal/hooks/useMergedRefs' import {useFeatureFlag} from '../FeatureFlags' import classes from './Banner.module.css' import {toggleStyledComponent} from '../internal/utils/toggleStyledComponent' +import type {ForwardRefComponent as PolymorphicForwardRefComponent} from '../utils/polymorphic' type BannerVariant = 'critical' | 'info' | 'success' | 'upsell' | 'warning' @@ -474,22 +475,28 @@ export function BannerActions({primaryAction, secondaryAction}: BannerActionsPro ) } -export type BannerPrimaryActionProps = Omit, 'variant'> +export type BannerPrimaryActionProps = Omit -export function BannerPrimaryAction({children, className, ...rest}: BannerPrimaryActionProps) { +const BannerPrimaryAction = forwardRef(({children, className, ...rest}, forwardedRef) => { return ( - ) -} +}) as PolymorphicForwardRefComponent<'button', BannerPrimaryActionProps> + +BannerPrimaryAction.displayName = 'BannerPrimaryAction' -export type BannerSecondaryActionProps = Omit, 'variant'> +export type BannerSecondaryActionProps = Omit -export function BannerSecondaryAction({children, className, ...rest}: BannerSecondaryActionProps) { +const BannerSecondaryAction = forwardRef(({children, className, ...rest}, forwardedRef) => { return ( - ) -} +}) as PolymorphicForwardRefComponent<'button', BannerSecondaryActionProps> + +BannerSecondaryAction.displayName = 'BannerSecondaryAction' + +export {BannerPrimaryAction, BannerSecondaryAction} From 6d8b7f4f616d46b022aec32d292177b529ea01d4 Mon Sep 17 00:00:00 2001 From: Jon Rohan Date: Tue, 8 Oct 2024 12:16:09 -0700 Subject: [PATCH 13/20] Convert `Breadcrumbs` and `Breadcrumbs.Item` to CSS modules behind the primer_react_css_modules_team feature flag (#5017) * Convert breadcrumbs to css modules * Create mighty-buckets-push.md * Force the ga flag on for Link * Update AvatarStack snap * Updating styles for item * Updates from editor * Update toggleStyledComponent.tsx * Add defaultAs as a prop to the toggleStyledComponent Co-authored-by: Josh Black --------- Co-authored-by: Josh Black --- .changeset/mighty-buckets-push.md | 5 + e2e/components/Breadcrumbs.test.ts | 48 ++++++ packages/react/src/Banner/Banner.tsx | 1 + .../src/Breadcrumbs/Breadcrumbs.module.css | 57 +++++++ .../react/src/Breadcrumbs/Breadcrumbs.tsx | 147 ++++++++++++------ .../react/src/ButtonGroup/ButtonGroup.tsx | 1 + .../__tests__/toggleStyledComponent.test.tsx | 32 +++- .../internal/utils/toggleStyledComponent.tsx | 10 +- 8 files changed, 246 insertions(+), 55 deletions(-) create mode 100644 .changeset/mighty-buckets-push.md create mode 100644 packages/react/src/Breadcrumbs/Breadcrumbs.module.css diff --git a/.changeset/mighty-buckets-push.md b/.changeset/mighty-buckets-push.md new file mode 100644 index 00000000000..4d4b0f6eea5 --- /dev/null +++ b/.changeset/mighty-buckets-push.md @@ -0,0 +1,5 @@ +--- +"@primer/react": minor +--- + +Convert `Breadcrumbs` and `Breadcrumbs.Item` to CSS modules behind the primer_react_css_modules_team feature flag diff --git a/e2e/components/Breadcrumbs.test.ts b/e2e/components/Breadcrumbs.test.ts index 5b4a763084e..badd8ea4c0f 100644 --- a/e2e/components/Breadcrumbs.test.ts +++ b/e2e/components/Breadcrumbs.test.ts @@ -11,6 +11,32 @@ test.describe('Breadcrumbs', () => { id: 'components-breadcrumbs--default', globals: { colorScheme: theme, + featureFlags: { + primer_react_css_modules_team: true, + }, + }, + }) + + // Default state + expect(await page.screenshot()).toMatchSnapshot(`Breadcrumbs.Default.${theme}.png`) + + // Hover state + await page.getByRole('link', {name: 'Home'}).hover() + expect(await page.screenshot()).toMatchSnapshot(`Breadcrumbs.Default.${theme}.hover.png`) + + // Focus state + await page.keyboard.press('Tab') + expect(await page.screenshot()).toMatchSnapshot(`Breadcrumbs.Default.${theme}.focus.png`) + }) + + test('default @vrt (styled components)', async ({page}) => { + await visit(page, { + id: 'components-breadcrumbs--default', + globals: { + colorScheme: theme, + featureFlags: { + primer_react_css_modules_team: false, + }, }, }) @@ -31,6 +57,28 @@ test.describe('Breadcrumbs', () => { id: 'components-breadcrumbs--default', globals: { colorScheme: theme, + featureFlags: { + primer_react_css_modules_team: true, + }, + }, + }) + await expect(page).toHaveNoViolations({ + rules: { + 'color-contrast': { + enabled: theme !== 'dark_dimmed', + }, + }, + }) + }) + + test('axe @aat (styled components)', async ({page}) => { + await visit(page, { + id: 'components-breadcrumbs--default', + globals: { + colorScheme: theme, + featureFlags: { + primer_react_css_modules_team: false, + }, }, }) await expect(page).toHaveNoViolations({ diff --git a/packages/react/src/Banner/Banner.tsx b/packages/react/src/Banner/Banner.tsx index 6b85cf67c5e..f33021d67d7 100644 --- a/packages/react/src/Banner/Banner.tsx +++ b/packages/react/src/Banner/Banner.tsx @@ -209,6 +209,7 @@ const StyledBanner = toggleStyledComponent( * line-height of `20px` so that means that the height of icons should match * that value. */ + 'div', styled.div` display: grid; grid-template-columns: auto minmax(0, 1fr) auto; diff --git a/packages/react/src/Breadcrumbs/Breadcrumbs.module.css b/packages/react/src/Breadcrumbs/Breadcrumbs.module.css new file mode 100644 index 00000000000..9a1d621fa39 --- /dev/null +++ b/packages/react/src/Breadcrumbs/Breadcrumbs.module.css @@ -0,0 +1,57 @@ +.BreadcrumbsBase { + display: flex; + justify-content: space-between; +} + +.BreadcrumbsList { + padding-left: 0; + margin-top: 0; + margin-bottom: 0; +} + +.ItemWrapper { + display: inline-block; + font-size: var(--text-body-size-medium); + white-space: nowrap; + list-style: none; + + &::after { + display: inline-block; + height: 0.8em; + /* stylelint-disable-next-line primer/spacing */ + margin: 0 0.5em; + font-size: var(--text-body-size-medium); + content: ''; + /* stylelint-disable-next-line primer/borders */ + border-right: 0.1em solid var(--fgColor-muted); + transform: rotate(15deg) translateY(0.0625em); + } + + &:first-child { + margin-left: 0; + } + + &:last-child { + &::after { + content: none; + } + } +} + +.Item { + display: inline-block; + + &:hover, + &:focus { + text-decoration: underline; + } +} + +.ItemSelected { + color: var(--fgColor-default); + pointer-events: none; + + &:focus { + text-decoration: none; + } +} diff --git a/packages/react/src/Breadcrumbs/Breadcrumbs.tsx b/packages/react/src/Breadcrumbs/Breadcrumbs.tsx index 7b1753aa853..909df8ae58d 100644 --- a/packages/react/src/Breadcrumbs/Breadcrumbs.tsx +++ b/packages/react/src/Breadcrumbs/Breadcrumbs.tsx @@ -7,38 +7,50 @@ import {get} from '../constants' import type {SxProp} from '../sx' import sx from '../sx' import type {ComponentProps} from '../utils/types' +import classes from './Breadcrumbs.module.css' +import {toggleStyledComponent} from '../internal/utils/toggleStyledComponent' +import {FeatureFlags, useFeatureFlag} from '../FeatureFlags' +import Link from '../Link' const SELECTED_CLASS = 'selected' -const Wrapper = styled.li` - display: inline-block; - white-space: nowrap; - list-style: none; - &::after { - font-size: ${get('fontSizes.1')}; - content: ''; +const Wrapper = toggleStyledComponent( + 'primer_react_css_modules_team', + 'li', + styled.li` display: inline-block; - height: 0.8em; - margin: 0 0.5em; - border-right: 0.1em solid; - border-color: ${get('colors.fg.muted')}; - transform: rotate(15deg) translateY(0.0625em); - } - &:first-child { - margin-left: 0; - } - &:last-child { + white-space: nowrap; + list-style: none; &::after { - content: none; + font-size: ${get('fontSizes.1')}; + content: ''; + display: inline-block; + height: 0.8em; + margin: 0 0.5em; + border-right: 0.1em solid; + border-color: ${get('colors.fg.muted')}; + transform: rotate(15deg) translateY(0.0625em); } - } -` + &:first-child { + margin-left: 0; + } + &:last-child { + &::after { + content: none; + } + } + `, +) -const BreadcrumbsBase = styled.nav` - display: flex; - justify-content: space-between; - ${sx}; -` +const BreadcrumbsBase = toggleStyledComponent( + 'primer_react_css_modules_team', + 'nav', + styled.nav` + display: flex; + justify-content: space-between; + ${sx}; + `, +) export type BreadcrumbsProps = React.PropsWithChildren< { @@ -46,13 +58,31 @@ export type BreadcrumbsProps = React.PropsWithChildren< } & SxProp > +const BreadcrumbsList = ({children}: React.PropsWithChildren) => { + const enabled = useFeatureFlag('primer_react_css_modules_team') + if (enabled) { + return
    {children}
+ } + + return ( + + {children} + + ) +} + function Breadcrumbs({className, children, sx: sxProp}: React.PropsWithChildren) { - const wrappedChildren = React.Children.map(children, child => {child}) + const enabled = useFeatureFlag('primer_react_css_modules_team') + const wrappedChildren = React.Children.map(children, child => ( + {child} + )) return ( - - - {wrappedChildren} - + + {wrappedChildren} ) } @@ -62,27 +92,46 @@ type StyledBreadcrumbsItemProps = { selected?: boolean } & SxProp -const BreadcrumbsItem = styled.a.attrs(props => ({ - className: clsx(props.selected && SELECTED_CLASS, props.className), - 'aria-current': props.selected ? 'page' : null, -}))` - color: ${get('colors.accent.fg')}; - display: inline-block; - font-size: ${get('fontSizes.1')}; - text-decoration: none; - &:hover, - &:focus { - text-decoration: underline; - } - &.selected { - color: ${get('colors.fg.default')}; - pointer-events: none; - } - &.selected:focus { +const StyledBreadcrumbsItem = toggleStyledComponent( + 'primer_react_css_modules_team', + 'a', + styled.a.attrs(props => ({ + className: clsx(props.selected && SELECTED_CLASS, props.className), + 'aria-current': props.selected ? 'page' : null, + }))` + color: ${get('colors.accent.fg')}; + display: inline-block; + font-size: ${get('fontSizes.1')}; text-decoration: none; + &:hover, + &:focus { + text-decoration: underline; + } + &.selected { + color: ${get('colors.fg.default')}; + pointer-events: none; + } + &.selected:focus { + text-decoration: none; + } + ${sx}; + `, +) +const BreadcrumbsItem = ({ + selected, + ...props +}: StyledBreadcrumbsItemProps & React.ComponentPropsWithoutRef) => { + const enabled = useFeatureFlag('primer_react_css_modules_team') + if (enabled) { + return ( + // Remove this when the feature flag is removed from Link + + + + ) } - ${sx}; -` + return +} Breadcrumbs.displayName = 'Breadcrumbs' diff --git a/packages/react/src/ButtonGroup/ButtonGroup.tsx b/packages/react/src/ButtonGroup/ButtonGroup.tsx index b700f4fcd43..74f9ff32e15 100644 --- a/packages/react/src/ButtonGroup/ButtonGroup.tsx +++ b/packages/react/src/ButtonGroup/ButtonGroup.tsx @@ -10,6 +10,7 @@ import {useFeatureFlag} from '../FeatureFlags' const StyledButtonGroup = toggleStyledComponent( 'primer_react_css_modules_staff', + 'div', styled.div` display: inline-flex; vertical-align: middle; diff --git a/packages/react/src/internal/utils/__tests__/toggleStyledComponent.test.tsx b/packages/react/src/internal/utils/__tests__/toggleStyledComponent.test.tsx index 6a4206003d0..bd243f447cb 100644 --- a/packages/react/src/internal/utils/__tests__/toggleStyledComponent.test.tsx +++ b/packages/react/src/internal/utils/__tests__/toggleStyledComponent.test.tsx @@ -5,8 +5,32 @@ import {toggleStyledComponent} from '../toggleStyledComponent' import styled from 'styled-components' describe('toggleStyledComponent', () => { + test('renders the component as `defaultAs` when flag is enabled and no `as` prop is provided', () => { + const TestComponent = toggleStyledComponent('testFeatureFlag', 'span', ({as: BaseComponent = 'div'}) => ( + + )) + const {container} = render( + + + , + ) + expect(container.firstChild).toBeInstanceOf(HTMLSpanElement) + }) + + test('renders the component as `defaultAs` when flag is disabled and no `as` prop is provided', () => { + const TestComponent = toggleStyledComponent('testFeatureFlag', 'span', ({as: BaseComponent = 'div'}) => ( + + )) + const {container} = render( + + + , + ) + expect(container.firstChild).toBeInstanceOf(HTMLSpanElement) + }) + test('renders the `as` prop when flag is enabled', () => { - const TestComponent = toggleStyledComponent('testFeatureFlag', () =>
) + const TestComponent = toggleStyledComponent('testFeatureFlag', 'div', () =>
) const {container} = render( @@ -16,7 +40,7 @@ describe('toggleStyledComponent', () => { }) test('renders a div as fallback when flag is enabled and no `as` prop is provided', () => { - const TestComponent = toggleStyledComponent('testFeatureFlag', () =>
) + const TestComponent = toggleStyledComponent('testFeatureFlag', 'div', () =>
) const {container} = render( @@ -26,7 +50,7 @@ describe('toggleStyledComponent', () => { }) test('renders Box with `as` if `sx` is provided and flag is enabled', () => { - const TestComponent = toggleStyledComponent('testFeatureFlag', () => styled.div``) + const TestComponent = toggleStyledComponent('testFeatureFlag', 'div', () => styled.div``) const {container} = render( @@ -38,7 +62,7 @@ describe('toggleStyledComponent', () => { }) test('renders styled component when flag is disabled', () => { - const StyledComponent = toggleStyledComponent('testFeatureFlag', styled.div.attrs({['data-styled']: true})``) + const StyledComponent = toggleStyledComponent('testFeatureFlag', 'div', styled.div.attrs({['data-styled']: true})``) const {container} = render( diff --git a/packages/react/src/internal/utils/toggleStyledComponent.tsx b/packages/react/src/internal/utils/toggleStyledComponent.tsx index 7b366cb0eb0..5c551af11f8 100644 --- a/packages/react/src/internal/utils/toggleStyledComponent.tsx +++ b/packages/react/src/internal/utils/toggleStyledComponent.tsx @@ -17,12 +17,18 @@ type CSSModulesProps = { * * @param flag - the feature flag that will control whether or not the provided * styled component is used + * @param defautlAs - the default component to use when `as` is not provided * @param Component - the styled component that will be used if the feature flag * is disabled */ -export function toggleStyledComponent(flag: string, Component: React.ComponentType

) { +export function toggleStyledComponent( + flag: string, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + defaultAs: string | React.ComponentType, + Component: React.ComponentType

, +) { const Wrapper = React.forwardRef(function Wrapper( - {as: BaseComponent = 'div', sx: sxProp = defaultSxProp, ...rest}, + {as: BaseComponent = defaultAs, sx: sxProp = defaultSxProp, ...rest}, ref, ) { const enabled = useFeatureFlag(flag) From 4218bef879ae70aab3cc30492bacfc9c506be8f7 Mon Sep 17 00:00:00 2001 From: Jon Rohan Date: Tue, 8 Oct 2024 18:51:24 -0700 Subject: [PATCH 14/20] Bug fix IconButton width in style prop not working when feature flag is on (#5091) * Button width not working when style used inline vs sx * Create silver-cheetahs-compare.md --- .changeset/silver-cheetahs-compare.md | 5 +++++ packages/react/src/Button/ButtonBase.module.css | 4 +--- .../react/src/Button/IconButton.dev.stories.tsx | 15 ++++++++++++++- 3 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 .changeset/silver-cheetahs-compare.md diff --git a/.changeset/silver-cheetahs-compare.md b/.changeset/silver-cheetahs-compare.md new file mode 100644 index 00000000000..cb207d8e358 --- /dev/null +++ b/.changeset/silver-cheetahs-compare.md @@ -0,0 +1,5 @@ +--- +"@primer/react": patch +--- + +Bug fix for `IconButton` to respect the `style` prop width when the feature flag is on. diff --git a/packages/react/src/Button/ButtonBase.module.css b/packages/react/src/Button/ButtonBase.module.css index ee184dec98b..19464c3c4e4 100644 --- a/packages/react/src/Button/ButtonBase.module.css +++ b/packages/react/src/Button/ButtonBase.module.css @@ -68,7 +68,7 @@ /* IconButton */ - &:where(.IconButton) { + &.IconButton { display: inline-grid; width: var(--control-medium-size); min-width: unset; @@ -78,12 +78,10 @@ &:where([data-size='small']) { width: var(--control-small-size); - min-width: var(--control-small-size); } &:where([data-size='large']) { width: var(--control-large-size); - min-width: var(--control-large-size); } } diff --git a/packages/react/src/Button/IconButton.dev.stories.tsx b/packages/react/src/Button/IconButton.dev.stories.tsx index dd0bffffbe5..bc772a04f28 100644 --- a/packages/react/src/Button/IconButton.dev.stories.tsx +++ b/packages/react/src/Button/IconButton.dev.stories.tsx @@ -1,6 +1,7 @@ -import {ChevronDownIcon} from '@primer/octicons-react' +import {BoldIcon, ChevronDownIcon} from '@primer/octicons-react' import React from 'react' import {IconButton} from '.' +import Box from '../Box' export default { title: 'Components/IconButton/DevOnly', @@ -25,3 +26,15 @@ export const CustomSizeWithMedia = () => { export const CustomIconColor = () => ( ) + +export const CustomSizeWithStyleProp = () => ( + + + +) From 61604369a18dec6a504ef520a37e59ad29e4a9eb Mon Sep 17 00:00:00 2001 From: Jon Rohan Date: Tue, 8 Oct 2024 19:15:44 -0700 Subject: [PATCH 15/20] =?UTF-8?q?Revert=20"Convert=20`Breadcrumbs`=20and?= =?UTF-8?q?=20`Breadcrumbs.Item`=20to=20CSS=20modules=20behind=20th?= =?UTF-8?q?=E2=80=A6"=20(#5092)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 6d8b7f4f616d46b022aec32d292177b529ea01d4. --- .changeset/mighty-buckets-push.md | 5 - e2e/components/Breadcrumbs.test.ts | 48 ------ packages/react/src/Banner/Banner.tsx | 1 - .../src/Breadcrumbs/Breadcrumbs.module.css | 57 ------- .../react/src/Breadcrumbs/Breadcrumbs.tsx | 147 ++++++------------ .../react/src/ButtonGroup/ButtonGroup.tsx | 1 - .../__tests__/toggleStyledComponent.test.tsx | 32 +--- .../internal/utils/toggleStyledComponent.tsx | 10 +- 8 files changed, 55 insertions(+), 246 deletions(-) delete mode 100644 .changeset/mighty-buckets-push.md delete mode 100644 packages/react/src/Breadcrumbs/Breadcrumbs.module.css diff --git a/.changeset/mighty-buckets-push.md b/.changeset/mighty-buckets-push.md deleted file mode 100644 index 4d4b0f6eea5..00000000000 --- a/.changeset/mighty-buckets-push.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@primer/react": minor ---- - -Convert `Breadcrumbs` and `Breadcrumbs.Item` to CSS modules behind the primer_react_css_modules_team feature flag diff --git a/e2e/components/Breadcrumbs.test.ts b/e2e/components/Breadcrumbs.test.ts index badd8ea4c0f..5b4a763084e 100644 --- a/e2e/components/Breadcrumbs.test.ts +++ b/e2e/components/Breadcrumbs.test.ts @@ -11,32 +11,6 @@ test.describe('Breadcrumbs', () => { id: 'components-breadcrumbs--default', globals: { colorScheme: theme, - featureFlags: { - primer_react_css_modules_team: true, - }, - }, - }) - - // Default state - expect(await page.screenshot()).toMatchSnapshot(`Breadcrumbs.Default.${theme}.png`) - - // Hover state - await page.getByRole('link', {name: 'Home'}).hover() - expect(await page.screenshot()).toMatchSnapshot(`Breadcrumbs.Default.${theme}.hover.png`) - - // Focus state - await page.keyboard.press('Tab') - expect(await page.screenshot()).toMatchSnapshot(`Breadcrumbs.Default.${theme}.focus.png`) - }) - - test('default @vrt (styled components)', async ({page}) => { - await visit(page, { - id: 'components-breadcrumbs--default', - globals: { - colorScheme: theme, - featureFlags: { - primer_react_css_modules_team: false, - }, }, }) @@ -57,28 +31,6 @@ test.describe('Breadcrumbs', () => { id: 'components-breadcrumbs--default', globals: { colorScheme: theme, - featureFlags: { - primer_react_css_modules_team: true, - }, - }, - }) - await expect(page).toHaveNoViolations({ - rules: { - 'color-contrast': { - enabled: theme !== 'dark_dimmed', - }, - }, - }) - }) - - test('axe @aat (styled components)', async ({page}) => { - await visit(page, { - id: 'components-breadcrumbs--default', - globals: { - colorScheme: theme, - featureFlags: { - primer_react_css_modules_team: false, - }, }, }) await expect(page).toHaveNoViolations({ diff --git a/packages/react/src/Banner/Banner.tsx b/packages/react/src/Banner/Banner.tsx index f33021d67d7..6b85cf67c5e 100644 --- a/packages/react/src/Banner/Banner.tsx +++ b/packages/react/src/Banner/Banner.tsx @@ -209,7 +209,6 @@ const StyledBanner = toggleStyledComponent( * line-height of `20px` so that means that the height of icons should match * that value. */ - 'div', styled.div` display: grid; grid-template-columns: auto minmax(0, 1fr) auto; diff --git a/packages/react/src/Breadcrumbs/Breadcrumbs.module.css b/packages/react/src/Breadcrumbs/Breadcrumbs.module.css deleted file mode 100644 index 9a1d621fa39..00000000000 --- a/packages/react/src/Breadcrumbs/Breadcrumbs.module.css +++ /dev/null @@ -1,57 +0,0 @@ -.BreadcrumbsBase { - display: flex; - justify-content: space-between; -} - -.BreadcrumbsList { - padding-left: 0; - margin-top: 0; - margin-bottom: 0; -} - -.ItemWrapper { - display: inline-block; - font-size: var(--text-body-size-medium); - white-space: nowrap; - list-style: none; - - &::after { - display: inline-block; - height: 0.8em; - /* stylelint-disable-next-line primer/spacing */ - margin: 0 0.5em; - font-size: var(--text-body-size-medium); - content: ''; - /* stylelint-disable-next-line primer/borders */ - border-right: 0.1em solid var(--fgColor-muted); - transform: rotate(15deg) translateY(0.0625em); - } - - &:first-child { - margin-left: 0; - } - - &:last-child { - &::after { - content: none; - } - } -} - -.Item { - display: inline-block; - - &:hover, - &:focus { - text-decoration: underline; - } -} - -.ItemSelected { - color: var(--fgColor-default); - pointer-events: none; - - &:focus { - text-decoration: none; - } -} diff --git a/packages/react/src/Breadcrumbs/Breadcrumbs.tsx b/packages/react/src/Breadcrumbs/Breadcrumbs.tsx index 909df8ae58d..7b1753aa853 100644 --- a/packages/react/src/Breadcrumbs/Breadcrumbs.tsx +++ b/packages/react/src/Breadcrumbs/Breadcrumbs.tsx @@ -7,50 +7,38 @@ import {get} from '../constants' import type {SxProp} from '../sx' import sx from '../sx' import type {ComponentProps} from '../utils/types' -import classes from './Breadcrumbs.module.css' -import {toggleStyledComponent} from '../internal/utils/toggleStyledComponent' -import {FeatureFlags, useFeatureFlag} from '../FeatureFlags' -import Link from '../Link' const SELECTED_CLASS = 'selected' -const Wrapper = toggleStyledComponent( - 'primer_react_css_modules_team', - 'li', - styled.li` +const Wrapper = styled.li` + display: inline-block; + white-space: nowrap; + list-style: none; + &::after { + font-size: ${get('fontSizes.1')}; + content: ''; display: inline-block; - white-space: nowrap; - list-style: none; + height: 0.8em; + margin: 0 0.5em; + border-right: 0.1em solid; + border-color: ${get('colors.fg.muted')}; + transform: rotate(15deg) translateY(0.0625em); + } + &:first-child { + margin-left: 0; + } + &:last-child { &::after { - font-size: ${get('fontSizes.1')}; - content: ''; - display: inline-block; - height: 0.8em; - margin: 0 0.5em; - border-right: 0.1em solid; - border-color: ${get('colors.fg.muted')}; - transform: rotate(15deg) translateY(0.0625em); - } - &:first-child { - margin-left: 0; - } - &:last-child { - &::after { - content: none; - } + content: none; } - `, -) + } +` -const BreadcrumbsBase = toggleStyledComponent( - 'primer_react_css_modules_team', - 'nav', - styled.nav` - display: flex; - justify-content: space-between; - ${sx}; - `, -) +const BreadcrumbsBase = styled.nav` + display: flex; + justify-content: space-between; + ${sx}; +` export type BreadcrumbsProps = React.PropsWithChildren< { @@ -58,31 +46,13 @@ export type BreadcrumbsProps = React.PropsWithChildren< } & SxProp > -const BreadcrumbsList = ({children}: React.PropsWithChildren) => { - const enabled = useFeatureFlag('primer_react_css_modules_team') - if (enabled) { - return

    {children}
- } - - return ( - - {children} - - ) -} - function Breadcrumbs({className, children, sx: sxProp}: React.PropsWithChildren) { - const enabled = useFeatureFlag('primer_react_css_modules_team') - const wrappedChildren = React.Children.map(children, child => ( - {child} - )) + const wrappedChildren = React.Children.map(children, child => {child}) return ( - - {wrappedChildren} + + + {wrappedChildren} + ) } @@ -92,46 +62,27 @@ type StyledBreadcrumbsItemProps = { selected?: boolean } & SxProp -const StyledBreadcrumbsItem = toggleStyledComponent( - 'primer_react_css_modules_team', - 'a', - styled.a.attrs(props => ({ - className: clsx(props.selected && SELECTED_CLASS, props.className), - 'aria-current': props.selected ? 'page' : null, - }))` - color: ${get('colors.accent.fg')}; - display: inline-block; - font-size: ${get('fontSizes.1')}; +const BreadcrumbsItem = styled.a.attrs(props => ({ + className: clsx(props.selected && SELECTED_CLASS, props.className), + 'aria-current': props.selected ? 'page' : null, +}))` + color: ${get('colors.accent.fg')}; + display: inline-block; + font-size: ${get('fontSizes.1')}; + text-decoration: none; + &:hover, + &:focus { + text-decoration: underline; + } + &.selected { + color: ${get('colors.fg.default')}; + pointer-events: none; + } + &.selected:focus { text-decoration: none; - &:hover, - &:focus { - text-decoration: underline; - } - &.selected { - color: ${get('colors.fg.default')}; - pointer-events: none; - } - &.selected:focus { - text-decoration: none; - } - ${sx}; - `, -) -const BreadcrumbsItem = ({ - selected, - ...props -}: StyledBreadcrumbsItemProps & React.ComponentPropsWithoutRef) => { - const enabled = useFeatureFlag('primer_react_css_modules_team') - if (enabled) { - return ( - // Remove this when the feature flag is removed from Link - - - - ) } - return -} + ${sx}; +` Breadcrumbs.displayName = 'Breadcrumbs' diff --git a/packages/react/src/ButtonGroup/ButtonGroup.tsx b/packages/react/src/ButtonGroup/ButtonGroup.tsx index 74f9ff32e15..b700f4fcd43 100644 --- a/packages/react/src/ButtonGroup/ButtonGroup.tsx +++ b/packages/react/src/ButtonGroup/ButtonGroup.tsx @@ -10,7 +10,6 @@ import {useFeatureFlag} from '../FeatureFlags' const StyledButtonGroup = toggleStyledComponent( 'primer_react_css_modules_staff', - 'div', styled.div` display: inline-flex; vertical-align: middle; diff --git a/packages/react/src/internal/utils/__tests__/toggleStyledComponent.test.tsx b/packages/react/src/internal/utils/__tests__/toggleStyledComponent.test.tsx index bd243f447cb..6a4206003d0 100644 --- a/packages/react/src/internal/utils/__tests__/toggleStyledComponent.test.tsx +++ b/packages/react/src/internal/utils/__tests__/toggleStyledComponent.test.tsx @@ -5,32 +5,8 @@ import {toggleStyledComponent} from '../toggleStyledComponent' import styled from 'styled-components' describe('toggleStyledComponent', () => { - test('renders the component as `defaultAs` when flag is enabled and no `as` prop is provided', () => { - const TestComponent = toggleStyledComponent('testFeatureFlag', 'span', ({as: BaseComponent = 'div'}) => ( - - )) - const {container} = render( - - - , - ) - expect(container.firstChild).toBeInstanceOf(HTMLSpanElement) - }) - - test('renders the component as `defaultAs` when flag is disabled and no `as` prop is provided', () => { - const TestComponent = toggleStyledComponent('testFeatureFlag', 'span', ({as: BaseComponent = 'div'}) => ( - - )) - const {container} = render( - - - , - ) - expect(container.firstChild).toBeInstanceOf(HTMLSpanElement) - }) - test('renders the `as` prop when flag is enabled', () => { - const TestComponent = toggleStyledComponent('testFeatureFlag', 'div', () =>
) + const TestComponent = toggleStyledComponent('testFeatureFlag', () =>
) const {container} = render( @@ -40,7 +16,7 @@ describe('toggleStyledComponent', () => { }) test('renders a div as fallback when flag is enabled and no `as` prop is provided', () => { - const TestComponent = toggleStyledComponent('testFeatureFlag', 'div', () =>
) + const TestComponent = toggleStyledComponent('testFeatureFlag', () =>
) const {container} = render( @@ -50,7 +26,7 @@ describe('toggleStyledComponent', () => { }) test('renders Box with `as` if `sx` is provided and flag is enabled', () => { - const TestComponent = toggleStyledComponent('testFeatureFlag', 'div', () => styled.div``) + const TestComponent = toggleStyledComponent('testFeatureFlag', () => styled.div``) const {container} = render( @@ -62,7 +38,7 @@ describe('toggleStyledComponent', () => { }) test('renders styled component when flag is disabled', () => { - const StyledComponent = toggleStyledComponent('testFeatureFlag', 'div', styled.div.attrs({['data-styled']: true})``) + const StyledComponent = toggleStyledComponent('testFeatureFlag', styled.div.attrs({['data-styled']: true})``) const {container} = render( diff --git a/packages/react/src/internal/utils/toggleStyledComponent.tsx b/packages/react/src/internal/utils/toggleStyledComponent.tsx index 5c551af11f8..7b366cb0eb0 100644 --- a/packages/react/src/internal/utils/toggleStyledComponent.tsx +++ b/packages/react/src/internal/utils/toggleStyledComponent.tsx @@ -17,18 +17,12 @@ type CSSModulesProps = { * * @param flag - the feature flag that will control whether or not the provided * styled component is used - * @param defautlAs - the default component to use when `as` is not provided * @param Component - the styled component that will be used if the feature flag * is disabled */ -export function toggleStyledComponent( - flag: string, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - defaultAs: string | React.ComponentType, - Component: React.ComponentType

, -) { +export function toggleStyledComponent(flag: string, Component: React.ComponentType

) { const Wrapper = React.forwardRef(function Wrapper( - {as: BaseComponent = defaultAs, sx: sxProp = defaultSxProp, ...rest}, + {as: BaseComponent = 'div', sx: sxProp = defaultSxProp, ...rest}, ref, ) { const enabled = useFeatureFlag(flag) From a9d411cfa2406b4530d2770713c335f9997102c5 Mon Sep 17 00:00:00 2001 From: Jon Rohan Date: Tue, 8 Oct 2024 19:26:53 -0700 Subject: [PATCH 16/20] =?UTF-8?q?Revert=20"Remove=20the=20CSS=20modules=20?= =?UTF-8?q?feature=20flag=20from=20the=20Link=20component=20(=E2=80=A6=20(?= =?UTF-8?q?#5093)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Revert "Remove the CSS modules feature flag from the Link component (#5019)" This reverts commit c2f64aa635e6fc6f3548fc05b03f5637a37e6a0c. * Remove featureFlags and redundant tests * Fix story * Remove import --- .changeset/breezy-windows-speak.md | 5 - ...ith-Inline-Links-dark-colorblind-linux.png | Bin 11186 -> 11230 bytes ...ne-With-Inline-Links-dark-dimmed-linux.png | Bin 10935 -> 11055 bytes ...-Inline-Links-dark-high-contrast-linux.png | Bin 11282 -> 11336 bytes .../Timeline-With-Inline-Links-dark-linux.png | Bin 11186 -> 11230 bytes ...ith-Inline-Links-dark-tritanopia-linux.png | Bin 11186 -> 11230 bytes ...th-Inline-Links-light-colorblind-linux.png | Bin 10874 -> 10968 bytes ...Inline-Links-light-high-contrast-linux.png | Bin 10989 -> 11041 bytes ...Timeline-With-Inline-Links-light-linux.png | Bin 10874 -> 10968 bytes ...th-Inline-Links-light-tritanopia-linux.png | Bin 10874 -> 10968 bytes packages/react/src/Link/Link.tsx | 75 ++- .../__snapshots__/Link.test.tsx.snap | 180 ++++++- .../__snapshots__/NavList.test.tsx.snap | 476 +++++++++++------- .../Timeline/Timeline.features.stories.tsx | 6 +- 14 files changed, 542 insertions(+), 200 deletions(-) delete mode 100644 .changeset/breezy-windows-speak.md diff --git a/.changeset/breezy-windows-speak.md b/.changeset/breezy-windows-speak.md deleted file mode 100644 index ab0cb4ecb14..00000000000 --- a/.changeset/breezy-windows-speak.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@primer/react": patch ---- - -Remove the CSS modules feature flag from Link component diff --git a/.playwright/snapshots/components/Timeline.test.ts-snapshots/Timeline-With-Inline-Links-dark-colorblind-linux.png b/.playwright/snapshots/components/Timeline.test.ts-snapshots/Timeline-With-Inline-Links-dark-colorblind-linux.png index 378309a06d6ca2fc9d75f3739ec0c113a2d3ab52..cfd6b5aeb88d7b03065d43754a97b36f806ede3e 100644 GIT binary patch literal 11230 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 diff --git a/.playwright/snapshots/components/Timeline.test.ts-snapshots/Timeline-With-Inline-Links-dark-linux.png b/.playwright/snapshots/components/Timeline.test.ts-snapshots/Timeline-With-Inline-Links-dark-linux.png index 378309a06d6ca2fc9d75f3739ec0c113a2d3ab52..cfd6b5aeb88d7b03065d43754a97b36f806ede3e 100644 GIT binary patch literal 11230 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 j_>|P3srPN|XpsiIzgs7kq5uyYLAwX2Dw3R`K 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 CelC3g literal 10874 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 P2HxlWzGyys?fd@({z+0h literal 10989 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 CelC3g literal 10874 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 CelC3g literal 10874 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 + color: ${props => (props.muted ? get('colors.fg.muted')(props) : get('colors.accent.fg')(props))}; + + /* By default, Link does not have underline */ + text-decoration: none; + + /* You can add one by setting underline={true} */ + text-decoration: ${props => (props.underline ? 'underline' : undefined)}; + + /* Inline links (inside a text block), however, should have underline based on accessibility setting set in data-attribute */ + /* Note: setting underline={false} does not override this */ + [data-a11y-link-underlines='true'] &[data-inline='true'] { + text-decoration: underline; + } + + &:hover { + text-decoration: ${props => (props.muted ? 'none' : 'underline')}; + ${props => (props.hoverColor ? hoverColor : props.muted ? `color: ${get('colors.accent.fg')(props)}` : '')}; + } + &:is(button) { + display: inline-block; + padding: 0; + font-size: inherit; + white-space: nowrap; + cursor: pointer; + user-select: none; + background-color: transparent; + border: 0; + appearance: none; + } + ${sx}; +` + const Link = forwardRef(({as: Component = 'a', className, inline, underline, ...props}, forwardedRef) => { + const enabled = useFeatureFlag('primer_react_css_modules_ga') + const innerRef = React.useRef(null) useRefObjectAsForwardedRef(forwardedRef, innerRef) @@ -44,10 +91,24 @@ const Link = forwardRef(({as: Component = 'a', className, inline, underline, ... }, [innerRef]) } - if (props.sx) { + if (enabled) { + if (props.sx) { + return ( + + ) + } + return ( - `; exports[`Link passes href down to link element 1`] = ` +.c1 { + color: var(--fgColor-accent,var(--color-accent-fg,#0969da)); + -webkit-text-decoration: none; + text-decoration: none; +} + +[data-a11y-link-underlines='true'] .c0[data-inline='true'] { + -webkit-text-decoration: underline; + text-decoration: underline; +} + +.c1:hover { + -webkit-text-decoration: underline; + text-decoration: underline; +} + +.c1:is(button) { + display: inline-block; + padding: 0; + font-size: inherit; + white-space: nowrap; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: transparent; + border: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + `; exports[`Link respects hoverColor prop 1`] = ` +.c1 { + color: var(--fgColor-accent,var(--color-accent-fg,#0969da)); + -webkit-text-decoration: none; + text-decoration: none; +} + +[data-a11y-link-underlines='true'] .c0[data-inline='true'] { + -webkit-text-decoration: underline; + text-decoration: underline; +} + +.c1:hover { + -webkit-text-decoration: underline; + text-decoration: underline; + color: var(--fgColor-accent,var(--color-accent-fg,#0969da)); +} + +.c1:is(button) { + display: inline-block; + padding: 0; + font-size: inherit; + white-space: nowrap; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: transparent; + border: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + `; exports[`Link respects the "sx" prop when "muted" prop is also passed 1`] = ` -.c0 { +.c1 { + color: var(--fgColor-muted,var(--color-fg-muted,#656d76)); + -webkit-text-decoration: none; + text-decoration: none; color: var(--fgColor-onEmphasis,var(--color-fg-on-emphasis,#ffffff)); } +[data-a11y-link-underlines='true'] .c0[data-inline='true'] { + -webkit-text-decoration: underline; + text-decoration: underline; +} + +.c1:hover { + -webkit-text-decoration: none; + text-decoration: none; + color: var(--fgColor-accent,var(--color-accent-fg,#0969da)); +} + +.c1:is(button) { + display: inline-block; + padding: 0; + font-size: inherit; + white-space: nowrap; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: transparent; + border: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + `; exports[`Link respects the "muted" prop 1`] = ` +.c1 { + color: var(--fgColor-muted,var(--color-fg-muted,#656d76)); + -webkit-text-decoration: none; + text-decoration: none; +} + +[data-a11y-link-underlines='true'] .c0[data-inline='true'] { + -webkit-text-decoration: underline; + text-decoration: underline; +} + +.c1:hover { + -webkit-text-decoration: none; + text-decoration: none; + color: var(--fgColor-accent,var(--color-accent-fg,#0969da)); +} + +.c1:is(button) { + display: inline-block; + padding: 0; + font-size: inherit; + white-space: nowrap; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: transparent; + border: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + `; diff --git a/packages/react/src/NavList/__snapshots__/NavList.test.tsx.snap b/packages/react/src/NavList/__snapshots__/NavList.test.tsx.snap index 22a56a4bdac..a8eb41cec20 100644 --- a/packages/react/src/NavList/__snapshots__/NavList.test.tsx.snap +++ b/packages/react/src/NavList/__snapshots__/NavList.test.tsx.snap @@ -1,30 +1,7 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`NavList renders a simple list 1`] = ` -.c3 { - padding-left: 8px; - padding-right: 8px; - padding-top: 6px; - padding-bottom: 6px; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 1; - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; - border-radius: 6px; - color: inherit; -} - -.c3:hover { - color: inherit; - -webkit-text-decoration: none; - text-decoration: none; -} - -.c4 { +.c5 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -39,7 +16,7 @@ exports[`NavList renders a simple list 1`] = ` min-width: 0; } -.c5 { +.c6 { -webkit-box-flex: 1; -webkit-flex-grow: 1; -ms-flex-positive: 1; @@ -48,7 +25,7 @@ exports[`NavList renders a simple list 1`] = ` word-break: break-word; } -.c7 { +.c8 { -webkit-box-flex: 1; -webkit-flex-grow: 1; -ms-flex-positive: 1; @@ -174,7 +151,7 @@ exports[`NavList renders a simple list 1`] = ` border-radius: 6px; } -.c6 { +.c7 { position: relative; display: -webkit-box; display: -webkit-flex; @@ -206,27 +183,27 @@ exports[`NavList renders a simple list 1`] = ` margin-bottom: unset; } -.c6[data-loading] { +.c7[data-loading] { cursor: default; } -.c6[aria-disabled], -.c6[data-inactive] { +.c7[aria-disabled], +.c7[data-inactive] { cursor: not-allowed; } -.c6[aria-disabled] [data-component="ActionList.Checkbox"], -.c6[data-inactive] [data-component="ActionList.Checkbox"] { +.c7[aria-disabled] [data-component="ActionList.Checkbox"], +.c7[data-inactive] [data-component="ActionList.Checkbox"] { cursor: not-allowed; background-color: var(--control-bgColor-disabled,rgba(175,184,193,0.2)); border-color: var(--color-input-disabled-bg,rgba(175,184,193,0.2)); } -.c6 [data-component="ActionList.Item--DividerContainer"] { +.c7 [data-component="ActionList.Item--DividerContainer"] { position: relative; } -.c6 [data-component="ActionList.Item--DividerContainer"]::before { +.c7 [data-component="ActionList.Item--DividerContainer"]::before { content: " "; display: block; position: absolute; @@ -237,7 +214,7 @@ exports[`NavList renders a simple list 1`] = ` border-color: var(--divider-color,transparent); } -.c6:not(:first-of-type) { +.c7:not(:first-of-type) { --divider-color: var(--borderColor-muted,var(--color-action-list-item-inline-divider,rgba(208,215,222,0.48))); } @@ -245,22 +222,22 @@ exports[`NavList renders a simple list 1`] = ` --divider-color: transparent !important; } -.c6:hover:not([aria-disabled]):not([data-inactive]):not([data-loading]), -.c6[data-focus-visible-added]:not([aria-disabled]):not([data-inactive]) { +.c7:hover:not([aria-disabled]):not([data-inactive]):not([data-loading]), +.c7[data-focus-visible-added]:not([aria-disabled]):not([data-inactive]) { --divider-color: transparent; } -.c6:hover:not([aria-disabled]):not([data-inactive]):not([data-loading]) + .c1, -.c6[data-focus-visible-added] + li { +.c7:hover:not([aria-disabled]):not([data-inactive]):not([data-loading]) + .c1, +.c7[data-focus-visible-added] + li { --divider-color: transparent; } -.c6[data-is-active-descendant] { +.c7[data-is-active-descendant] { font-weight: 400; background-color: var(--control-transparent-bgColor-selected,var(--color-action-list-item-default-selected-bg,rgba(208,215,222,0.24))); } -.c6[data-is-active-descendant]::after { +.c7[data-is-active-descendant]::after { position: absolute; top: calc(50% - 12px); left: -8px; @@ -271,6 +248,59 @@ exports[`NavList renders a simple list 1`] = ` border-radius: 6px; } +.c4 { + color: var(--fgColor-accent,var(--color-accent-fg,#0969da)); + -webkit-text-decoration: none; + text-decoration: none; + padding-left: 8px; + padding-right: 8px; + padding-top: 6px; + padding-bottom: 6px; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; + border-radius: 6px; + color: inherit; +} + +[data-a11y-link-underlines='true'] .c3[data-inline='true'] { + -webkit-text-decoration: underline; + text-decoration: underline; +} + +.c4:hover { + -webkit-text-decoration: underline; + text-decoration: underline; +} + +.c4:is(button) { + display: inline-block; + padding: 0; + font-size: inherit; + white-space: nowrap; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: transparent; + border: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.c4:hover { + color: inherit; + -webkit-text-decoration: none; + text-decoration: none; +} + @media (forced-colors:active) { .c2:focus, .c2:focus-visible, @@ -302,30 +332,30 @@ exports[`NavList renders a simple list 1`] = ` } @media (forced-colors:active) { - .c6:focus, - .c6:focus-visible, - .c6 > a.focus-visible, - .c6[data-is-active-descendant] { + .c7:focus, + .c7:focus-visible, + .c7 > a.focus-visible, + .c7[data-is-active-descendant] { outline: solid 1px transparent !important; } } @media (hover:hover) and (pointer:fine) { - .c6:hover:not([aria-disabled]):not([data-inactive]) { + .c7:hover:not([aria-disabled]):not([data-inactive]) { background-color: var(--control-transparent-bgColor-hover,var(--color-action-list-item-default-hover-bg,rgba(208,215,222,0.32))); color: var(--fgColor-default,var(--color-fg-default,#1F2328)); box-shadow: inset 0 0 0 max(1px,0.0625rem) var(--control-transparent-borderColor-active,var(--color-action-list-item-default-active-border,transparent)); } - .c6:focus-visible, - .c6 > a.focus-visible, - .c6:focus.focus-visible { + .c7:focus-visible, + .c7 > a.focus-visible, + .c7:focus.focus-visible { outline: none; border: 2 solid; box-shadow: 0 0 0 2px var(--bgColor-accent-emphasis,var(--color-accent-emphasis,#0969da)); } - .c6:active:not([aria-disabled]):not([data-inactive]) { + .c7:active:not([aria-disabled]):not([data-inactive]) { background-color: var(--control-transparent-bgColor-active,var(--color-action-list-item-default-active-bg,rgba(208,215,222,0.48))); color: var(--fgColor-default,var(--color-fg-default,#1F2328)); } @@ -344,17 +374,17 @@ exports[`NavList renders a simple list 1`] = `

Home @@ -363,21 +393,21 @@ exports[`NavList renders a simple list 1`] = `
  • Contact @@ -462,30 +492,7 @@ exports[`NavList renders with groups 1`] = ` padding-inline-start: 0; } -.c7 { - padding-left: 8px; - padding-right: 8px; - padding-top: 6px; - padding-bottom: 6px; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 1; - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; - border-radius: 6px; - color: inherit; -} - -.c7:hover { - color: inherit; - -webkit-text-decoration: none; - text-decoration: none; -} - -.c8 { +.c9 { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -500,7 +507,7 @@ exports[`NavList renders with groups 1`] = ` min-width: 0; } -.c9 { +.c10 { -webkit-box-flex: 1; -webkit-flex-grow: 1; -ms-flex-positive: 1; @@ -509,7 +516,7 @@ exports[`NavList renders with groups 1`] = ` word-break: break-word; } -.c11 { +.c12 { -webkit-box-flex: 1; -webkit-flex-grow: 1; -ms-flex-positive: 1; @@ -635,7 +642,7 @@ exports[`NavList renders with groups 1`] = ` border-radius: 6px; } -.c10 { +.c11 { position: relative; display: -webkit-box; display: -webkit-flex; @@ -667,27 +674,27 @@ exports[`NavList renders with groups 1`] = ` margin-bottom: unset; } -.c10[data-loading] { +.c11[data-loading] { cursor: default; } -.c10[aria-disabled], -.c10[data-inactive] { +.c11[aria-disabled], +.c11[data-inactive] { cursor: not-allowed; } -.c10[aria-disabled] [data-component="ActionList.Checkbox"], -.c10[data-inactive] [data-component="ActionList.Checkbox"] { +.c11[aria-disabled] [data-component="ActionList.Checkbox"], +.c11[data-inactive] [data-component="ActionList.Checkbox"] { cursor: not-allowed; background-color: var(--control-bgColor-disabled,rgba(175,184,193,0.2)); border-color: var(--color-input-disabled-bg,rgba(175,184,193,0.2)); } -.c10 [data-component="ActionList.Item--DividerContainer"] { +.c11 [data-component="ActionList.Item--DividerContainer"] { position: relative; } -.c10 [data-component="ActionList.Item--DividerContainer"]::before { +.c11 [data-component="ActionList.Item--DividerContainer"]::before { content: " "; display: block; position: absolute; @@ -698,7 +705,7 @@ exports[`NavList renders with groups 1`] = ` border-color: var(--divider-color,transparent); } -.c10:not(:first-of-type) { +.c11:not(:first-of-type) { --divider-color: var(--borderColor-muted,var(--color-action-list-item-inline-divider,rgba(208,215,222,0.48))); } @@ -706,22 +713,22 @@ exports[`NavList renders with groups 1`] = ` --divider-color: transparent !important; } -.c10:hover:not([aria-disabled]):not([data-inactive]):not([data-loading]), -.c10[data-focus-visible-added]:not([aria-disabled]):not([data-inactive]) { +.c11:hover:not([aria-disabled]):not([data-inactive]):not([data-loading]), +.c11[data-focus-visible-added]:not([aria-disabled]):not([data-inactive]) { --divider-color: transparent; } -.c10:hover:not([aria-disabled]):not([data-inactive]):not([data-loading]) + .c5, -.c10[data-focus-visible-added] + li { +.c11:hover:not([aria-disabled]):not([data-inactive]):not([data-loading]) + .c5, +.c11[data-focus-visible-added] + li { --divider-color: transparent; } -.c10[data-is-active-descendant] { +.c11[data-is-active-descendant] { font-weight: 400; background-color: var(--control-transparent-bgColor-selected,var(--color-action-list-item-default-selected-bg,rgba(208,215,222,0.24))); } -.c10[data-is-active-descendant]::after { +.c11[data-is-active-descendant]::after { position: absolute; top: calc(50% - 12px); left: -8px; @@ -732,6 +739,59 @@ exports[`NavList renders with groups 1`] = ` border-radius: 6px; } +.c8 { + color: var(--fgColor-accent,var(--color-accent-fg,#0969da)); + -webkit-text-decoration: none; + text-decoration: none; + padding-left: 8px; + padding-right: 8px; + padding-top: 6px; + padding-bottom: 6px; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; + border-radius: 6px; + color: inherit; +} + +[data-a11y-link-underlines='true'] .c7[data-inline='true'] { + -webkit-text-decoration: underline; + text-decoration: underline; +} + +.c8:hover { + -webkit-text-decoration: underline; + text-decoration: underline; +} + +.c8:is(button) { + display: inline-block; + padding: 0; + font-size: inherit; + white-space: nowrap; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: transparent; + border: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.c8:hover { + color: inherit; + -webkit-text-decoration: none; + text-decoration: none; +} + @media (forced-colors:active) { .c6:focus, .c6:focus-visible, @@ -763,30 +823,30 @@ exports[`NavList renders with groups 1`] = ` } @media (forced-colors:active) { - .c10:focus, - .c10:focus-visible, - .c10 > a.focus-visible, - .c10[data-is-active-descendant] { + .c11:focus, + .c11:focus-visible, + .c11 > a.focus-visible, + .c11[data-is-active-descendant] { outline: solid 1px transparent !important; } } @media (hover:hover) and (pointer:fine) { - .c10:hover:not([aria-disabled]):not([data-inactive]) { + .c11:hover:not([aria-disabled]):not([data-inactive]) { background-color: var(--control-transparent-bgColor-hover,var(--color-action-list-item-default-hover-bg,rgba(208,215,222,0.32))); color: var(--fgColor-default,var(--color-fg-default,#1F2328)); box-shadow: inset 0 0 0 max(1px,0.0625rem) var(--control-transparent-borderColor-active,var(--color-action-list-item-default-active-border,transparent)); } - .c10:focus-visible, - .c10 > a.focus-visible, - .c10:focus.focus-visible { + .c11:focus-visible, + .c11 > a.focus-visible, + .c11:focus.focus-visible { outline: none; border: 2 solid; box-shadow: 0 0 0 2px var(--bgColor-accent-emphasis,var(--color-accent-emphasis,#0969da)); } - .c10:active:not([aria-disabled]):not([data-inactive]) { + .c11:active:not([aria-disabled]):not([data-inactive]) { background-color: var(--control-transparent-bgColor-active,var(--color-action-list-item-default-active-bg,rgba(208,215,222,0.48))); color: var(--fgColor-default,var(--color-fg-default,#1F2328)); } @@ -827,17 +887,17 @@ exports[`NavList renders with groups 1`] = `
    Getting started @@ -870,21 +930,21 @@ exports[`NavList renders with groups 1`] = ` class="c4" >
  • Avatar @@ -954,32 +1014,7 @@ exports[`NavList.Item with NavList.SubNav does not have active styles if SubNav color: var(--fgColor-default,var(--color-fg-default,#1F2328)); } -.c12 { - padding-left: 16px; - padding-right: 8px; - padding-top: 6px; - padding-bottom: 6px; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 1; - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; - border-radius: 6px; - color: inherit; - font-size: 12px; - font-weight: 400; -} - -.c12:hover { - color: inherit; - -webkit-text-decoration: none; - text-decoration: none; -} - -.c13 { +.c14 { -webkit-box-flex: 1; -webkit-flex-grow: 1; -ms-flex-positive: 1; @@ -1005,8 +1040,8 @@ exports[`NavList.Item with NavList.SubNav does not have active styles if SubNav --divider-color: transparent !important; } -.c14:hover:not([aria-disabled]):not([data-inactive]):not([data-loading]) + .c3, -.c14[data-focus-visible-added] + li { +.c15:hover:not([aria-disabled]):not([data-inactive]):not([data-loading]) + .c3, +.c15[data-focus-visible-added] + li { --divider-color: transparent; } @@ -1217,6 +1252,61 @@ exports[`NavList.Item with NavList.SubNav does not have active styles if SubNav border-radius: 6px; } +.c13 { + color: var(--fgColor-accent,var(--color-accent-fg,#0969da)); + -webkit-text-decoration: none; + text-decoration: none; + padding-left: 16px; + padding-right: 8px; + padding-top: 6px; + padding-bottom: 6px; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; + border-radius: 6px; + color: inherit; + font-size: 12px; + font-weight: 400; +} + +[data-a11y-link-underlines='true'] .c12[data-inline='true'] { + -webkit-text-decoration: underline; + text-decoration: underline; +} + +.c13:hover { + -webkit-text-decoration: underline; + text-decoration: underline; +} + +.c13:is(button) { + display: inline-block; + padding: 0; + font-size: inherit; + white-space: nowrap; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: transparent; + border: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.c13:hover { + color: inherit; + -webkit-text-decoration: none; + text-decoration: none; +} + .c9 { -webkit-transform: rotate(180deg); -ms-transform: rotate(180deg); @@ -1357,7 +1447,7 @@ exports[`NavList.Item with NavList.SubNav does not have active styles if SubNav Sub Item @@ -1435,31 +1525,6 @@ exports[`NavList.Item with NavList.SubNav has active styles if SubNav contains t display: none; } -.c12 { - padding-left: 16px; - padding-right: 8px; - padding-top: 6px; - padding-bottom: 6px; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 1; - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; - border-radius: 6px; - color: inherit; - font-size: 12px; - font-weight: 400; -} - -.c12:hover { - color: inherit; - -webkit-text-decoration: none; - text-decoration: none; -} - .c7 { -webkit-box-flex: 1; -webkit-flex-grow: 1; @@ -1480,8 +1545,8 @@ exports[`NavList.Item with NavList.SubNav has active styles if SubNav contains t --divider-color: transparent !important; } -.c13:hover:not([aria-disabled]):not([data-inactive]):not([data-loading]) + .c3, -.c13[data-focus-visible-added] + li { +.c14:hover:not([aria-disabled]):not([data-inactive]):not([data-loading]) + .c3, +.c14[data-focus-visible-added] + li { --divider-color: transparent; } @@ -1599,8 +1664,8 @@ exports[`NavList.Item with NavList.SubNav has active styles if SubNav contains t --divider-color: transparent !important; } -.c14:hover:not([aria-disabled]):not([data-inactive]):not([data-loading]) + .c3, -.c14[data-focus-visible-added] + li { +.c15:hover:not([aria-disabled]):not([data-inactive]):not([data-loading]) + .c3, +.c15[data-focus-visible-added] + li { --divider-color: transparent; } @@ -1713,6 +1778,61 @@ exports[`NavList.Item with NavList.SubNav has active styles if SubNav contains t border-radius: 6px; } +.c13 { + color: var(--fgColor-accent,var(--color-accent-fg,#0969da)); + -webkit-text-decoration: none; + text-decoration: none; + padding-left: 16px; + padding-right: 8px; + padding-top: 6px; + padding-bottom: 6px; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; + border-radius: 6px; + color: inherit; + font-size: 12px; + font-weight: 400; +} + +[data-a11y-link-underlines='true'] .c12[data-inline='true'] { + -webkit-text-decoration: underline; + text-decoration: underline; +} + +.c13:hover { + -webkit-text-decoration: underline; + text-decoration: underline; +} + +.c13:is(button) { + display: inline-block; + padding: 0; + font-size: inherit; + white-space: nowrap; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: transparent; + border: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.c13:hover { + color: inherit; + -webkit-text-decoration: none; + text-decoration: none; +} + .c9 { -webkit-transform: rotate(0deg); -ms-transform: rotate(0deg); @@ -1861,7 +1981,7 @@ exports[`NavList.Item with NavList.SubNav has active styles if SubNav contains t ( - + Monalisa enabled auto-merge (squash) From aca7577e27679913fe20191376e4fff891b4984e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arma=C4=9Fan?= Date: Wed, 9 Oct 2024 14:55:57 +1000 Subject: [PATCH 17/20] =?UTF-8?q?Revert=20"chore:=20Move=20CSS=20modules?= =?UTF-8?q?=20team=20feature=20flag=20to=20staff=20for=20Banner,=20Button?= =?UTF-8?q?=E2=80=A6"=20(#5094)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 62e0d6e7ea71d15b431ffb8f6732dbe9ddfc75b2. --- .changeset/tame-walls-travel.md | 5 ----- packages/react/src/Banner/Banner.tsx | 2 +- packages/react/src/ButtonGroup/ButtonGroup.tsx | 4 ++-- packages/react/src/Checkbox/Checkbox.tsx | 2 +- packages/react/src/CounterLabel/CounterLabel.tsx | 2 +- 5 files changed, 5 insertions(+), 10 deletions(-) delete mode 100644 .changeset/tame-walls-travel.md diff --git a/.changeset/tame-walls-travel.md b/.changeset/tame-walls-travel.md deleted file mode 100644 index c73fb558833..00000000000 --- a/.changeset/tame-walls-travel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@primer/react": patch ---- - -Move CSS modules team feature flag to staff for Banner, ButtonGroup, Checkbox, CounterLabel components diff --git a/packages/react/src/Banner/Banner.tsx b/packages/react/src/Banner/Banner.tsx index 6b85cf67c5e..d540b0c7b3f 100644 --- a/packages/react/src/Banner/Banner.tsx +++ b/packages/react/src/Banner/Banner.tsx @@ -88,7 +88,7 @@ const labels: Record = { warning: 'Warning', } -const CSS_MODULES_FEATURE_FLAG = 'primer_react_css_modules_staff' +const CSS_MODULES_FEATURE_FLAG = 'primer_react_css_modules_team' export const Banner = React.forwardRef(function Banner( { diff --git a/packages/react/src/ButtonGroup/ButtonGroup.tsx b/packages/react/src/ButtonGroup/ButtonGroup.tsx index b700f4fcd43..aeed944a1cf 100644 --- a/packages/react/src/ButtonGroup/ButtonGroup.tsx +++ b/packages/react/src/ButtonGroup/ButtonGroup.tsx @@ -9,7 +9,7 @@ import {clsx} from 'clsx' import {useFeatureFlag} from '../FeatureFlags' const StyledButtonGroup = toggleStyledComponent( - 'primer_react_css_modules_staff', + 'primer_react_css_modules_team', styled.div` display: inline-flex; vertical-align: middle; @@ -77,7 +77,7 @@ const ButtonGroup = React.forwardRef(function But {children, className, ...rest}, forwardRef, ) { - const enabled = useFeatureFlag('primer_react_css_modules_staff') + const enabled = useFeatureFlag('primer_react_css_modules_team') return ( ( }, ref, ): ReactElement => { - const enabled = useFeatureFlag('primer_react_css_modules_staff') + const enabled = useFeatureFlag('primer_react_css_modules_team') const checkboxRef = useProvidedRefOrCreate(ref as React.RefObject) const checkboxGroupContext = useContext(CheckboxGroupContext) const handleOnChange: ChangeEventHandler = e => { diff --git a/packages/react/src/CounterLabel/CounterLabel.tsx b/packages/react/src/CounterLabel/CounterLabel.tsx index ecabddea876..01f2b18397e 100644 --- a/packages/react/src/CounterLabel/CounterLabel.tsx +++ b/packages/react/src/CounterLabel/CounterLabel.tsx @@ -20,7 +20,7 @@ export type CounterLabelProps = React.PropsWithChildren< const CounterLabel = forwardRef( ({scheme = 'secondary', sx = defaultSxProp, className, children, ...rest}, forwardedRef) => { - const enabled = useFeatureFlag('primer_react_css_modules_staff') + const enabled = useFeatureFlag('primer_react_css_modules_team') const label =  ({children}) const counterProps = { ref: forwardedRef, From 00ff2f83b0628098db471b014f3ccf95aad43d43 Mon Sep 17 00:00:00 2001 From: "primer[bot]" <119360173+primer[bot]@users.noreply.github.com> Date: Wed, 9 Oct 2024 18:33:11 +1000 Subject: [PATCH 18/20] Version Packages (rc) (#5067) Co-authored-by: github-actions[bot] --- .changeset/pre.json | 14 ++++++++++++ examples/app-router/package.json | 2 +- examples/codesandbox/package.json | 2 +- examples/consumer-test/package.json | 2 +- examples/theming/package.json | 2 +- packages/react/CHANGELOG.md | 34 +++++++++++++++++++++++++++++ packages/react/package.json | 2 +- 7 files changed, 53 insertions(+), 5 deletions(-) diff --git a/.changeset/pre.json b/.changeset/pre.json index 11d13a9c9a3..7d1b0cf362e 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -24,15 +24,19 @@ "cool-lobsters-nail", "curvy-goats-sell", "dirty-pianos-wash", + "dry-pens-pay", "dry-trainers-protect", + "dull-beans-dance", "dull-dolphins-bake", "dull-mirrors-dream", "dull-turkeys-cheer", "early-lions-vanish", + "eight-avocados-lick", "eighty-houses-beg", "eleven-drinks-kiss", "fifty-foxes-drop", "fifty-rockets-joke", + "five-seas-scream", "flat-avocados-cheer", "flat-weeks-battle", "fluffy-ravens-thank", @@ -48,6 +52,9 @@ "happy-fireants-mate", "honest-ligers-fly", "hot-baboons-allow", + "khaki-dolls-reflect", + "large-glasses-provide", + "large-plants-unite", "lemon-candles-deny", "light-chefs-bow", "little-bats-approve", @@ -55,6 +62,7 @@ "lovely-days-march", "lucky-oranges-camp", "mighty-parrots-carry", + "modern-cooks-invite", "moody-rivers-impress", "nervous-llamas-ring", "new-shirts-beam", @@ -63,6 +71,7 @@ "olive-donkeys-exercise", "orange-steaks-do", "pink-actors-cross", + "plenty-books-agree", "purple-apricots-relax", "quick-adults-buy", "quick-feet-sip", @@ -73,8 +82,10 @@ "serious-terms-sniff", "seven-scissors-explain", "short-boats-cover", + "silent-fireants-kneel", "silent-planes-grab", "silly-weeks-clap", + "silver-cheetahs-compare", "six-owls-walk", "sixty-olives-glow", "slow-walls-drum", @@ -87,6 +98,7 @@ "stale-lizards-report", "stale-pets-tan", "strong-tables-rest", + "stupid-monkeys-beg", "tall-wasps-end", "tame-boats-hide", "ten-gifts-own", @@ -98,11 +110,13 @@ "three-scissors-hide", "tidy-bats-warn", "tidy-clocks-marry", + "tidy-impalas-remain", "tough-pans-punch", "twelve-tables-leave", "twenty-spoons-give", "weak-hats-type", "weak-ravens-greet", + "wet-apples-hide", "wet-otters-pull", "wicked-books-occur", "yellow-tools-call", diff --git a/examples/app-router/package.json b/examples/app-router/package.json index 77ed05ce4e5..f760501a4fa 100644 --- a/examples/app-router/package.json +++ b/examples/app-router/package.json @@ -10,7 +10,7 @@ "type-check": "tsc --noEmit" }, "dependencies": { - "@primer/react": "37.0.0-rc.9", + "@primer/react": "37.0.0-rc.10", "next": "^14.2.10", "react": "^18.3.1", "react-dom": "^18.3.1", diff --git a/examples/codesandbox/package.json b/examples/codesandbox/package.json index dd56088ae5c..e12ea6dd6a1 100644 --- a/examples/codesandbox/package.json +++ b/examples/codesandbox/package.json @@ -20,7 +20,7 @@ "@typescript-eslint/eslint-plugin": "^7.11.0", "@typescript-eslint/parser": "^7.3.1", "@vitejs/plugin-react": "^4.2.1", - "@primer/react": "37.0.0-rc.9", + "@primer/react": "37.0.0-rc.10", "eslint": "^8.56.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.7", diff --git a/examples/consumer-test/package.json b/examples/consumer-test/package.json index 10461a46255..91858def69d 100644 --- a/examples/consumer-test/package.json +++ b/examples/consumer-test/package.json @@ -9,7 +9,7 @@ "@types/react": "^18.2.14", "@types/react-dom": "^18.2.19", "@types/styled-components": "^5.1.11", - "@primer/react": "37.0.0-rc.9", + "@primer/react": "37.0.0-rc.10", "react": "^18.0.0", "react-dom": "^18.0.0", "styled-components": "^5.3.11", diff --git a/examples/theming/package.json b/examples/theming/package.json index 097ba5772ed..1ed3680e828 100644 --- a/examples/theming/package.json +++ b/examples/theming/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@primer/octicons-react": "^19.9.0", - "@primer/react": "37.0.0-rc.9", + "@primer/react": "37.0.0-rc.10", "clsx": "^1.2.1", "next": "^14.2.10", "react": "^18.3.1", diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index a0387a904ab..a323b56b3ce 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -1,5 +1,39 @@ # @primer/react +## 37.0.0-rc.10 + +### Minor Changes + +- [#5064](https://github.com/primer/react/pull/5064) [`29f33ce`](https://github.com/primer/react/commit/29f33ce93c6b7e573cca9f2c0a10bb12ec5245c3) Thanks [@broccolinisoup](https://github.com/broccolinisoup)! - Tooltip: Do not export all types publicly in the experimental bundle + +- [#5010](https://github.com/primer/react/pull/5010) [`8385c33`](https://github.com/primer/react/commit/8385c334df1f31aa810a8e6575986ca420a683f9) Thanks [@joshblack](https://github.com/joshblack)! - Promote Dialog, Tooltip, and Stack from `@primer/react/experimental` to `@primer/react` + +- [#5074](https://github.com/primer/react/pull/5074) [`e4965ed`](https://github.com/primer/react/commit/e4965ed773e32abc6fc49bff623dd79127047c93) Thanks [@joshblack](https://github.com/joshblack)! - Add the `useFeatureFlag` hook to `@primer/react/experimental` + +### Patch Changes + +- [#5059](https://github.com/primer/react/pull/5059) [`682e787`](https://github.com/primer/react/commit/682e787071d9bed26801202cf6823a96c1b39462) Thanks [@gwwar](https://github.com/gwwar)! - Fixes negative and invalid pages in data table pagination on re-render. + +- [#5078](https://github.com/primer/react/pull/5078) [`3b7bf41`](https://github.com/primer/react/commit/3b7bf411c60d5283eb2fba78e7ab1a26b707af5b) Thanks [@jonrohan](https://github.com/jonrohan)! - Set the `min-width` of `IconButton` to `unset` to resolve layout issues. + +- [#5062](https://github.com/primer/react/pull/5062) [`0f5d5e0`](https://github.com/primer/react/commit/0f5d5e05096b1b1599a92c90619cde6e11cb5808) Thanks [@jonrohan](https://github.com/jonrohan)! - Move CSS modules feature flag from staff to ga for Avatar component + +- [#5082](https://github.com/primer/react/pull/5082) [`212714c`](https://github.com/primer/react/commit/212714ccc005eb57e272b3f64e3736e198c555e8) Thanks [@langermank](https://github.com/langermank)! - Add focus styles to Pagination component + +- [#5077](https://github.com/primer/react/pull/5077) [`6490b27`](https://github.com/primer/react/commit/6490b27bde15e7687dcda48c444eb909dec2d5a7) Thanks [@jonrohan](https://github.com/jonrohan)! - Bug fix(Avatar): Changed rounded border calculation for the "square" Avatar to better align with existing border styles + +- [#5055](https://github.com/primer/react/pull/5055) [`73135c1`](https://github.com/primer/react/commit/73135c1c57a02e35d33ae6ffba16784043dcabb8) Thanks [@francinelucca](https://github.com/francinelucca)! - fix(Banner): rewrite PrimaryAction & SecondaryAction types + +- [#5068](https://github.com/primer/react/pull/5068) [`5f7bd0b`](https://github.com/primer/react/commit/5f7bd0b399073b2f22b8eaec548c37ff19a5ea86) Thanks [@jonrohan](https://github.com/jonrohan)! - fix for `toggleStyledComponent` utility, When the feature flag is enabled and sx prop is passed in use, Box + +- [#5091](https://github.com/primer/react/pull/5091) [`4218bef`](https://github.com/primer/react/commit/4218bef879ae70aab3cc30492bacfc9c506be8f7) Thanks [@jonrohan](https://github.com/jonrohan)! - Bug fix for `IconButton` to respect the `style` prop width when the feature flag is on. + +- [#5073](https://github.com/primer/react/pull/5073) [`472967a`](https://github.com/primer/react/commit/472967a712e9b81856b3b37088142b0ffbda5b15) Thanks [@siddharthkp](https://github.com/siddharthkp)! - SelectPanel: Fix items not being selected when defined within scope (track selection by item.id) + +- [#5066](https://github.com/primer/react/pull/5066) [`702ba5c`](https://github.com/primer/react/commit/702ba5ca59d42abc57a1d6da539935534edcd2ab) Thanks [@jonrohan](https://github.com/jonrohan)! - Use the IconButton for the close button on Dialog + +- [#5079](https://github.com/primer/react/pull/5079) [`a2e5671`](https://github.com/primer/react/commit/a2e5671e720e4d78a3f5a9b503fc841db100dc1d) Thanks [@jonrohan](https://github.com/jonrohan)! - Correctly pass styled system typography and common props to the `Box` component in the `Text` component when the CSS modules feature flag is enabled. + ## 37.0.0-rc.9 ### Minor Changes diff --git a/packages/react/package.json b/packages/react/package.json index c442041ab4d..9440e21e91f 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@primer/react", - "version": "37.0.0-rc.9", + "version": "37.0.0-rc.10", "description": "An implementation of GitHub's Primer Design System using React", "main": "lib/index.js", "module": "lib-esm/index.js", From 0d444d75812aa453e6aff11e4befae259bf9deb5 Mon Sep 17 00:00:00 2001 From: Marie Lucca <40550942+francinelucca@users.noreply.github.com> Date: Wed, 9 Oct 2024 11:55:05 -0400 Subject: [PATCH 19/20] fix(SegmentedControl): set global focus styles (#5029) * fix(SegmentedControl): set global focus styles * Create itchy-paws-bake.md --- .changeset/itchy-paws-bake.md | 5 +++++ .../react/src/SegmentedControl/SegmentedControlButton.tsx | 2 ++ .../src/SegmentedControl/SegmentedControlIconButton.tsx | 2 ++ 3 files changed, 9 insertions(+) create mode 100644 .changeset/itchy-paws-bake.md diff --git a/.changeset/itchy-paws-bake.md b/.changeset/itchy-paws-bake.md new file mode 100644 index 00000000000..532507c7a46 --- /dev/null +++ b/.changeset/itchy-paws-bake.md @@ -0,0 +1,5 @@ +--- +"@primer/react": patch +--- + +fix(SegmentedControl): set global focus styles diff --git a/packages/react/src/SegmentedControl/SegmentedControlButton.tsx b/packages/react/src/SegmentedControl/SegmentedControlButton.tsx index 58003d167f5..0474323ab43 100644 --- a/packages/react/src/SegmentedControl/SegmentedControlButton.tsx +++ b/packages/react/src/SegmentedControl/SegmentedControlButton.tsx @@ -7,6 +7,7 @@ import type {SxProp} from '../sx' import sx, {merge} from '../sx' import {getSegmentedControlButtonStyles, getSegmentedControlListItemStyles} from './getSegmentedControlStyles' import {defaultSxProp} from '../utils/defaultSxProp' +import getGlobalFocusStyles from '../internal/utils/getGlobalFocusStyles' export type SegmentedControlButtonProps = { /** The visible label rendered in the button */ @@ -21,6 +22,7 @@ export type SegmentedControlButtonProps = { ButtonHTMLAttributes const SegmentedControlButtonStyled = styled.button` + ${getGlobalFocusStyles()}; ${sx}; ` diff --git a/packages/react/src/SegmentedControl/SegmentedControlIconButton.tsx b/packages/react/src/SegmentedControl/SegmentedControlIconButton.tsx index 11970c0ab47..1986bf92a3f 100644 --- a/packages/react/src/SegmentedControl/SegmentedControlIconButton.tsx +++ b/packages/react/src/SegmentedControl/SegmentedControlIconButton.tsx @@ -7,6 +7,7 @@ import sx, {merge} from '../sx' import {getSegmentedControlButtonStyles, getSegmentedControlListItemStyles} from './getSegmentedControlStyles' import Box from '../Box' import {defaultSxProp} from '../utils/defaultSxProp' +import getGlobalFocusStyles from '../internal/utils/getGlobalFocusStyles' export type SegmentedControlIconButtonProps = { 'aria-label': string @@ -20,6 +21,7 @@ export type SegmentedControlIconButtonProps = { ButtonHTMLAttributes const SegmentedControlIconButtonStyled = styled.button` + ${getGlobalFocusStyles()}; ${sx}; ` From 6cd3960d3e56370b86070efcd93dad197672b2c3 Mon Sep 17 00:00:00 2001 From: Marie Lucca <40550942+francinelucca@users.noreply.github.com> Date: Wed, 9 Oct 2024 12:02:22 -0400 Subject: [PATCH 20/20] fix(AnchoredOverlay): replace broken stories (#5056) * fix(AnchoredOverlay): replace broken stories * fix: storybook build failure * Docs(AnchoredOverlay): rewrite hovercard using stack * Docs(AnchoredOverlay): remove unused variable * Docs(AnchoredOverlay): use text size prop in stories instead of fontSize * Update packages/react/src/AnchoredOverlay/AnchoredOverlay.features.stories.tsx Co-authored-by: Mike Perrotti * Docs(AnchoredOverlay): use sx prop for styling instead of styled-system props --------- Co-authored-by: Mike Perrotti --- .../AnchoredOverlay.features.stories.tsx | 66 ++++++++++++------- .../AnchoredOverlay.stories.tsx | 43 +++++++++--- 2 files changed, 76 insertions(+), 33 deletions(-) diff --git a/packages/react/src/AnchoredOverlay/AnchoredOverlay.features.stories.tsx b/packages/react/src/AnchoredOverlay/AnchoredOverlay.features.stories.tsx index 78ff50b16c8..db336516af6 100644 --- a/packages/react/src/AnchoredOverlay/AnchoredOverlay.features.stories.tsx +++ b/packages/react/src/AnchoredOverlay/AnchoredOverlay.features.stories.tsx @@ -2,17 +2,49 @@ import React, {useEffect, useRef, useState} from 'react' import type {Args, Meta} from '@storybook/react' import {FocusKeys} from '@primer/behaviors' -import {Box, Button} from '..' +import {Avatar, Box, Text} from '..' import {AnchoredOverlay} from '../AnchoredOverlay' import Heading from '../Heading' +import Octicon from '../Octicon' +import {Button} from '../Button' import {registerPortalRoot} from '../Portal' import {Playground} from './AnchoredOverlay.stories' +import {LocationIcon, RepoIcon} from '@primer/octicons-react' +import {Stack} from '../Stack/Stack' export default { title: 'Components/AnchoredOverlay/Features', component: AnchoredOverlay, } as Meta +const hoverCard = ( + + + + + + + monalisa + + Monalisa Octocat + + + Former beach cat and champion swimmer. Now your friendly octapus with a normal face. + + + + Interwebs + + + + + + Owns this repository + + + +) + const HeaderAndLayout = ({children}: {children: JSX.Element}) => { const scrollingElementRef = useRef(null) useEffect(() => { @@ -70,9 +102,7 @@ export const CustomAnchorId = () => { renderAnchor={props => } anchorId="my-custom-anchor-id" > - - kitten - + {hoverCard} ) } @@ -88,9 +118,7 @@ export const Height = () => { renderAnchor={props => } height="large" > - - kitten - + {hoverCard} ) } @@ -106,9 +134,7 @@ export const Width = () => { renderAnchor={props => } width="large" > - - kitten - + {hoverCard} ) } @@ -128,9 +154,7 @@ export const AnchorAlignment = () => { )} align="center" > - - kitten - + {hoverCard} ) } @@ -146,9 +170,7 @@ export const AnchorSide = () => { renderAnchor={props => } side="outside-right" > - - kitten - + {hoverCard} ) } @@ -164,9 +186,7 @@ export const OffsetPositionFromAnchor = () => { renderAnchor={props => } anchorOffset={100} > - - kitten - + {hoverCard} ) } @@ -182,9 +202,7 @@ export const OffsetAlignmentFromAnchor = () => { renderAnchor={props => } alignmentOffset={100} > - - kitten - + {hoverCard} ) } @@ -247,9 +265,7 @@ export const OverlayPropsOverrides = () => {
  • overflow: `auto`
  • maxHeight: `xsmall`
  • - - kitten - + {hoverCard} ) } diff --git a/packages/react/src/AnchoredOverlay/AnchoredOverlay.stories.tsx b/packages/react/src/AnchoredOverlay/AnchoredOverlay.stories.tsx index deba2266964..5a7dcbf50da 100644 --- a/packages/react/src/AnchoredOverlay/AnchoredOverlay.stories.tsx +++ b/packages/react/src/AnchoredOverlay/AnchoredOverlay.stories.tsx @@ -1,16 +1,47 @@ import React, {useState} from 'react' import type {Args, Meta} from '@storybook/react' +import {LocationIcon, RepoIcon} from '@primer/octicons-react' -import {Box} from '..' +import {Avatar, Text} from '..' import {AnchoredOverlay} from '../AnchoredOverlay' import {Button} from '../Button' +import Octicon from '../Octicon' import {action} from '@storybook/addon-actions' +import {Stack} from '../Stack/Stack' export default { title: 'Components/AnchoredOverlay', component: AnchoredOverlay, } as Meta +const hoverCard = ( + + + + + + + monalisa + + Monalisa Octocat + + + Former beach cat and champion swimmer. Now your friendly octapus with a normal face. + + + + Interwebs + + + + + + Owns this repository + + + +) + export const Default = () => { const [open, setOpen] = useState(false) @@ -21,9 +52,7 @@ export const Default = () => { onClose={() => setOpen(false)} renderAnchor={props => } > - - kitten - + {hoverCard} ) } @@ -48,14 +77,12 @@ export const Playground = (args: Args) => { overlayProps={args.portalContainerName} side={args.side} > - - kitten - + {hoverCard} ) } Playground.args = { - width: 'small', + width: 'auto', height: 'auto', portalContainerName: 'Portal name', side: 'outside-bottom',