From b2b29fb336df514ffc603300ed7e7787e60b3f20 Mon Sep 17 00:00:00 2001 From: Robert Snow Date: Fri, 14 Nov 2025 12:35:23 +1100 Subject: [PATCH 01/12] fix some types --- packages/@react-spectrum/s2/package.json | 1 + packages/@react-spectrum/s2/src/ActionBar.tsx | 9 ++++++--- packages/@react-spectrum/s2/src/ContextualHelp.tsx | 6 ++++++ packages/@react-types/combobox/src/index.d.ts | 2 +- yarn.lock | 1 + 5 files changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/@react-spectrum/s2/package.json b/packages/@react-spectrum/s2/package.json index cb644b964bc..4d996a0c34c 100644 --- a/packages/@react-spectrum/s2/package.json +++ b/packages/@react-spectrum/s2/package.json @@ -164,6 +164,7 @@ "@react-stately/utils": "^3.10.8", "@react-types/dialog": "^3.5.22", "@react-types/grid": "^3.3.6", + "@react-types/overlays": "^3.9.2", "@react-types/provider": "^3.8.13", "@react-types/shared": "^3.32.1", "@react-types/table": "^3.13.4", diff --git a/packages/@react-spectrum/s2/src/ActionBar.tsx b/packages/@react-spectrum/s2/src/ActionBar.tsx index e664e66f636..993d3632e90 100644 --- a/packages/@react-spectrum/s2/src/ActionBar.tsx +++ b/packages/@react-spectrum/s2/src/ActionBar.tsx @@ -15,11 +15,12 @@ import {announce} from '@react-aria/live-announcer'; import {CloseButton} from './CloseButton'; import {ContextValue, SlotProps} from 'react-aria-components'; import {createContext, ForwardedRef, forwardRef, ReactElement, ReactNode, RefObject, useCallback, useEffect, useMemo, useRef, useState} from 'react'; -import {DOMRef, DOMRefValue, Key} from '@react-types/shared'; +import {DOMProps, DOMRef, DOMRefValue, Key} from '@react-types/shared'; import {FocusScope, useKeyboard} from 'react-aria'; // @ts-ignore import intlMessages from '../intl/*.json'; import {lightDark, style} from '../style' with {type: 'macro'}; +import {StyleProps} from './style-utils' with { type: 'macro' }; import {useControlledState} from '@react-stately/utils'; import {useDOMRef} from '@react-spectrum/utils'; import {useEnterAnimation, useExitAnimation, useObjectRef, useResizeObserver} from '@react-aria/utils'; @@ -74,7 +75,7 @@ const actionBarStyles = style({ } }); -export interface ActionBarProps extends SlotProps { +export interface ActionBarProps extends SlotProps, StyleProps, DOMProps { /** A list of ActionButtons to display. */ children: ReactNode, /** Whether the ActionBar should be displayed with a emphasized style. */ @@ -106,7 +107,8 @@ export const ActionBar = forwardRef(function ActionBar(props: ActionBarProps, re }); const ActionBarInner = forwardRef(function ActionBarInner(props: ActionBarProps & {isExiting: boolean}, ref: ForwardedRef) { - let {isEmphasized, selectedItemCount = 0, children, onClearSelection, isExiting} = props; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + let {isEmphasized, selectedItemCount = 0, children, onClearSelection, isExiting, slot, ...otherProps} = props; let stringFormatter = useLocalizedStringFormatter(intlMessages, '@react-spectrum/s2'); // Store the last count greater than zero so that we can retain it while rendering the fade-out animation. @@ -158,6 +160,7 @@ const ActionBarInner = forwardRef(function ActionBarInner(props: ActionBarProps
diff --git a/packages/@react-spectrum/s2/src/ContextualHelp.tsx b/packages/@react-spectrum/s2/src/ContextualHelp.tsx index 0590b534438..bf25dedcbb6 100644 --- a/packages/@react-spectrum/s2/src/ContextualHelp.tsx +++ b/packages/@react-spectrum/s2/src/ContextualHelp.tsx @@ -11,6 +11,7 @@ import InfoIcon from '../s2wf-icons/S2_Icon_InfoCircle_20_N.svg'; // @ts-ignore import intlMessages from '../intl/*.json'; import {mergeStyles} from '../style/runtime'; +import {Placement} from '@react-types/overlays'; import {Popover, PopoverDialogProps} from './Popover'; import {space, style} from '../style' with {type: 'macro'}; import {StyleProps} from './style-utils' with { type: 'macro' }; @@ -29,6 +30,11 @@ export interface ContextualHelpProps extends Pick, Pick, ContextualHelpStyleProps, StyleProps, DOMProps, AriaLabelingProps { + /** + * The placement of the popover with respect to the action button. + * @default 'bottom start' + */ + placement?: Placement, /** Contents of the Contextual Help popover. */ children: ReactNode, /** diff --git a/packages/@react-types/combobox/src/index.d.ts b/packages/@react-types/combobox/src/index.d.ts index 5b96371b82e..3558c274dc8 100644 --- a/packages/@react-types/combobox/src/index.d.ts +++ b/packages/@react-types/combobox/src/index.d.ts @@ -84,7 +84,7 @@ export interface SpectrumComboBoxProps extends SpectrumTextInputBase, Omit Date: Mon, 17 Nov 2025 12:50:44 +1100 Subject: [PATCH 02/12] fix extra or missing props --- .../gridlist/src/useGridListItem.ts | 4 +- packages/@react-spectrum/s2/src/TableView.tsx | 4 +- packages/@react-spectrum/s2/src/TagGroup.tsx | 4 +- .../@react-spectrum/s2/test/TagGroup.test.tsx | 39 +++++++++++++++++++ packages/@react-types/tabs/src/index.d.ts | 2 +- .../test/TagGroup.test.js | 14 +++---- 6 files changed, 53 insertions(+), 14 deletions(-) create mode 100644 packages/@react-spectrum/s2/test/TagGroup.test.tsx diff --git a/packages/@react-aria/gridlist/src/useGridListItem.ts b/packages/@react-aria/gridlist/src/useGridListItem.ts index 2ecfc4f8125..f4c32cdfa31 100644 --- a/packages/@react-aria/gridlist/src/useGridListItem.ts +++ b/packages/@react-aria/gridlist/src/useGridListItem.ts @@ -283,10 +283,10 @@ export function useGridListItem(props: AriaGridListItemOptions, state: ListSt onKeyDown, onFocus, // 'aria-label': [(node.textValue || undefined), rowAnnouncement].filter(Boolean).join(', '), - 'aria-label': node.textValue || undefined, + 'aria-label': node['aria-label'] || node.textValue || undefined, 'aria-selected': state.selectionManager.canSelectItem(node.key) ? state.selectionManager.isSelected(node.key) : undefined, 'aria-disabled': state.selectionManager.isDisabled(node.key) || undefined, - 'aria-labelledby': descriptionId && node.textValue ? `${getRowId(state, node.key)} ${descriptionId}` : undefined, + 'aria-labelledby': descriptionId && (node['aria-label'] || node.textValue) ? `${getRowId(state, node.key)} ${descriptionId}` : undefined, id: getRowId(state, node.key) }); diff --git a/packages/@react-spectrum/s2/src/TableView.tsx b/packages/@react-spectrum/s2/src/TableView.tsx index 4d4e9fd494e..ed311856909 100644 --- a/packages/@react-spectrum/s2/src/TableView.tsx +++ b/packages/@react-spectrum/s2/src/TableView.tsx @@ -58,7 +58,7 @@ import Chevron from '../ui-icons/Chevron'; import Close from '../s2wf-icons/S2_Icon_Close_20_N.svg'; import {ColumnSize} from '@react-types/table'; import {CustomDialog, DialogContainer} from '..'; -import {DOMRef, DOMRefValue, forwardRefType, GlobalDOMAttributes, LoadingState, Node} from '@react-types/shared'; +import {DOMProps, DOMRef, DOMRefValue, forwardRefType, GlobalDOMAttributes, LoadingState, Node} from '@react-types/shared'; import {getActiveElement, getOwnerDocument, useLayoutEffect, useObjectRef} from '@react-aria/utils'; import {GridNode} from '@react-types/grid'; import {IconContext} from './Icon'; @@ -120,7 +120,7 @@ interface S2TableProps { } // TODO: Note that loadMore and loadingState are now on the Table instead of on the TableBody -export interface TableViewProps extends Omit, UnsafeStyles, S2TableProps { +export interface TableViewProps extends Omit, DOMProps, UnsafeStyles, S2TableProps { /** Spectrum-defined styles, returned by the `style()` macro. */ styles?: StylesPropWithHeight } diff --git a/packages/@react-spectrum/s2/src/TagGroup.tsx b/packages/@react-spectrum/s2/src/TagGroup.tsx index 8a67d056c8c..235fd9fcd1f 100644 --- a/packages/@react-spectrum/s2/src/TagGroup.tsx +++ b/packages/@react-spectrum/s2/src/TagGroup.tsx @@ -35,7 +35,7 @@ import {ClearButton} from './ClearButton'; import {Collection, CollectionBuilder} from '@react-aria/collections'; import {control, field, getAllowedOverrides, StyleProps} from './style-utils' with {type: 'macro'}; import {createContext, forwardRef, ReactNode, useContext, useEffect, useMemo, useRef, useState} from 'react'; -import {DOMRef, DOMRefValue, GlobalDOMAttributes, HelpTextProps, Node, SpectrumLabelableProps} from '@react-types/shared'; +import {DOMRef, DOMRefValue, GlobalDOMAttributes, HelpTextProps, LabelableProps, Node, SpectrumLabelableProps} from '@react-types/shared'; import {FieldLabel, helpTextStyles} from './Field'; import {flushSync} from 'react-dom'; import {FormContext, useFormProps} from './Form'; @@ -52,7 +52,7 @@ import {useLocalizedStringFormatter} from '@react-aria/i18n'; import {useSpectrumContextProps} from './useSpectrumContextProps'; // Get types from RSP and extend those? -export interface TagProps extends Omit { +export interface TagProps extends Omit, LabelableProps { /** The children of the tag. */ children: ReactNode } diff --git a/packages/@react-spectrum/s2/test/TagGroup.test.tsx b/packages/@react-spectrum/s2/test/TagGroup.test.tsx new file mode 100644 index 00000000000..9f732e2f2dc --- /dev/null +++ b/packages/@react-spectrum/s2/test/TagGroup.test.tsx @@ -0,0 +1,39 @@ +/* + * Copyright 2022 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +import React from 'react'; +import {render} from '@react-spectrum/test-utils-internal'; +import {Tag, TagGroup} from '../'; + +let TestTagGroup = ({tagGroupProps, itemProps}) => ( + + Cat + Dog + Kangaroo + +); + +let renderTagGroup = (tagGroupProps = {}, itemProps = {}) => render(); + +describe('TagGroup', () => { + beforeAll(() => { + jest.useFakeTimers(); + }); + + it('should aria label on tags', () => { + let {getAllByRole} = renderTagGroup({label: 'TagGroup label'}, {'aria-label': 'Test'}); + + for (let row of getAllByRole('row')) { + expect(row).toHaveAttribute('aria-label', 'Test'); + } + }); +}); diff --git a/packages/@react-types/tabs/src/index.d.ts b/packages/@react-types/tabs/src/index.d.ts index a24d94a8338..9a20acc7ef9 100644 --- a/packages/@react-types/tabs/src/index.d.ts +++ b/packages/@react-types/tabs/src/index.d.ts @@ -60,7 +60,7 @@ export interface AriaTabPanelProps extends Omit, AriaLabelingPro id?: Key } -export interface SpectrumTabsProps extends AriaTabListBase, Omit, DOMProps, StyleProps { +export interface SpectrumTabsProps extends AriaTabListBase, Omit, DOMProps, StyleProps { /** The children of the `` element. Should include `` and `` elements. */ children: ReactNode, /** The item objects for each tab, for dynamic collections. */ diff --git a/packages/react-aria-components/test/TagGroup.test.js b/packages/react-aria-components/test/TagGroup.test.js index 2dad220810a..adc4f07135b 100644 --- a/packages/react-aria-components/test/TagGroup.test.js +++ b/packages/react-aria-components/test/TagGroup.test.js @@ -527,9 +527,9 @@ describe('TagGroup', () => { let {getAllByRole} = renderTagGroup({selectionMode: 'single', onSelectionChange}); let items = getAllByRole('row'); - await user.pointer({target: items[0], keys: '[MouseLeft>]'}); + await user.pointer({target: items[0], keys: '[MouseLeft>]'}); expect(onSelectionChange).toBeCalledTimes(1); - + await user.pointer({target: items[0], keys: '[/MouseLeft]'}); expect(onSelectionChange).toBeCalledTimes(1); }); @@ -539,9 +539,9 @@ describe('TagGroup', () => { let {getAllByRole} = renderTagGroup({selectionMode: 'single', onSelectionChange, shouldSelectOnPressUp: false}); let items = getAllByRole('row'); - await user.pointer({target: items[0], keys: '[MouseLeft>]'}); + await user.pointer({target: items[0], keys: '[MouseLeft>]'}); expect(onSelectionChange).toBeCalledTimes(1); - + await user.pointer({target: items[0], keys: '[/MouseLeft]'}); expect(onSelectionChange).toBeCalledTimes(1); }); @@ -551,9 +551,9 @@ describe('TagGroup', () => { let {getAllByRole} = renderTagGroup({selectionMode: 'single', onSelectionChange, shouldSelectOnPressUp: true}); let items = getAllByRole('row'); - await user.pointer({target: items[0], keys: '[MouseLeft>]'}); + await user.pointer({target: items[0], keys: '[MouseLeft>]'}); expect(onSelectionChange).toBeCalledTimes(0); - + await user.pointer({target: items[0], keys: '[/MouseLeft]'}); expect(onSelectionChange).toBeCalledTimes(1); }); @@ -572,7 +572,7 @@ describe('TagGroup', () => { let {getByRole} = renderTagGroup({selectionMode: 'multiple'}, {}, {onPressStart, onPressEnd, onPress, onClick}); let tester = testUtilUser.createTester('GridList', {root: getByRole('grid')}); await tester.triggerRowAction({row: 1, interactionType}); - + expect(onPressStart).toHaveBeenCalledTimes(1); expect(onPressEnd).toHaveBeenCalledTimes(1); expect(onPress).toHaveBeenCalledTimes(1); From 5b166d58b21d56eb1f2268f0634f68b1fd4fb914 Mon Sep 17 00:00:00 2001 From: Robert Snow Date: Mon, 17 Nov 2025 15:02:54 +1100 Subject: [PATCH 03/12] fixes from audit --- .../s2/chromatic/Breadcrumbs.stories.tsx | 4 +- .../@react-spectrum/s2/src/Breadcrumbs.tsx | 4 +- .../@react-spectrum/s2/src/DatePicker.tsx | 9 ++- .../s2/src/DateRangePicker.tsx | 6 +- packages/@react-spectrum/s2/src/Picker.tsx | 2 +- packages/@react-spectrum/s2/src/Provider.tsx | 5 +- .../s2/src/ToggleButtonGroup.tsx | 4 +- packages/@react-spectrum/s2/src/Tooltip.tsx | 14 ++-- .../s2/stories/Breadcrumbs.stories.tsx | 68 +++++++++++-------- .../tree/test/TreeView.test.tsx | 2 +- .../@react-types/numberfield/src/index.d.ts | 5 +- .../react-aria-components/src/Breadcrumbs.tsx | 10 +-- .../react-aria-components/src/Disclosure.tsx | 6 +- .../test/Breadcrumbs.test.js | 4 +- .../test/Disclosure.test.js | 17 +++++ 15 files changed, 103 insertions(+), 57 deletions(-) diff --git a/packages/@react-spectrum/s2/chromatic/Breadcrumbs.stories.tsx b/packages/@react-spectrum/s2/chromatic/Breadcrumbs.stories.tsx index 76996eea018..7fa983a51b1 100644 --- a/packages/@react-spectrum/s2/chromatic/Breadcrumbs.stories.tsx +++ b/packages/@react-spectrum/s2/chromatic/Breadcrumbs.stories.tsx @@ -12,7 +12,7 @@ import {Breadcrumb, Breadcrumbs} from '../src'; import {generatePowerset} from '@react-spectrum/story-utils'; -import {Many} from '../stories/Breadcrumbs.stories'; +import {type IMany, Many} from '../stories/Breadcrumbs.stories'; import type {Meta, StoryObj} from '@storybook/react'; import {ReactNode} from 'react'; import {shortName} from './utils'; @@ -27,7 +27,7 @@ const meta: Meta = { export default meta; -export const Dynamic: StoryObj = { +export const Dynamic: StoryObj = { ...Many, parameters: { // TODO: move these options back to meta above once we get strings for ar-AE. This is just to prevent the RTL story's config from actually applying diff --git a/packages/@react-spectrum/s2/src/Breadcrumbs.tsx b/packages/@react-spectrum/s2/src/Breadcrumbs.tsx index a8369b9e757..689055cfae9 100644 --- a/packages/@react-spectrum/s2/src/Breadcrumbs.tsx +++ b/packages/@react-spectrum/s2/src/Breadcrumbs.tsx @@ -62,9 +62,9 @@ interface BreadcrumbsStyleProps { // TODO: showRoot?: boolean, } -export interface BreadcrumbsProps extends Omit, 'children' | 'items' | 'style' | 'className' | keyof GlobalDOMAttributes>, BreadcrumbsStyleProps, StyleProps { +export interface BreadcrumbsProps extends Omit, 'children' | 'style' | 'className' | keyof GlobalDOMAttributes>, BreadcrumbsStyleProps, StyleProps { /** The children of the Breadcrumbs. */ - children: ReactNode + children: ReactNode | ((item: T) => ReactNode) } export const BreadcrumbsContext = createContext>, DOMRefValue>>(null); diff --git a/packages/@react-spectrum/s2/src/DatePicker.tsx b/packages/@react-spectrum/s2/src/DatePicker.tsx index 7ffc20b7b9f..e707c911ffe 100644 --- a/packages/@react-spectrum/s2/src/DatePicker.tsx +++ b/packages/@react-spectrum/s2/src/DatePicker.tsx @@ -20,6 +20,7 @@ import { Dialog, FormContext, OverlayTriggerStateContext, + PopoverProps, Provider, TimeValue } from 'react-aria-components'; @@ -27,7 +28,7 @@ import {baseColor, focusRing, fontRelative, space, style} from '../style' with { import {Calendar, CalendarProps, IconContext, TimeField} from '../'; import CalendarIcon from '../s2wf-icons/S2_Icon_Calendar_20_N.svg'; import {controlBorderRadius, field, fieldInput, getAllowedOverrides, StyleProps} from './style-utils' with {type: 'macro'}; -import {createContext, forwardRef, PropsWithChildren, ReactElement, Ref, useContext, useRef, useState} from 'react'; +import {createContext, forwardRef, ReactElement, ReactNode, Ref, useContext, useRef, useState} from 'react'; import {DateInput, DateInputContainer, InvalidIndicator} from './DateField'; import {FieldGroup, FieldLabel, HelpText} from './Field'; import {forwardRefType, GlobalDOMAttributes, HelpTextProps, SpectrumLabelableProps} from '@react-types/shared'; @@ -42,6 +43,7 @@ import {useSpectrumContextProps} from './useSpectrumContextProps'; export interface DatePickerProps extends Omit, 'children' | 'className' | 'style' | keyof GlobalDOMAttributes>, Pick, 'createCalendar' | 'pageBehavior' | 'firstDayOfWeek' | 'isDateUnavailable'>, + Pick, StyleProps, SpectrumLabelableProps, HelpTextProps { @@ -203,7 +205,7 @@ export const DatePicker = /*#__PURE__*/ (forwardRef as forwardRefType)(function - + @@ -238,9 +240,10 @@ export const DatePicker = /*#__PURE__*/ (forwardRef as forwardRefType)(function ); }); -export function CalendarPopover(props: PropsWithChildren): ReactElement { +export function CalendarPopover(props: Omit & {children: ReactNode}): ReactElement { return (
extends Omit, 'children' | 'className' | 'style' | keyof GlobalDOMAttributes>, Pick, 'createCalendar' | 'pageBehavior' | 'firstDayOfWeek' | 'isDateUnavailable'>, + Pick, StyleProps, SpectrumLabelableProps, HelpTextProps { @@ -143,7 +145,7 @@ export const DateRangePicker = /*#__PURE__*/ (forwardRef as forwardRefType)(func
- + diff --git a/packages/@react-spectrum/s2/src/Picker.tsx b/packages/@react-spectrum/s2/src/Picker.tsx index bc93a178e33..2755d1a49ec 100644 --- a/packages/@react-spectrum/s2/src/Picker.tsx +++ b/packages/@react-spectrum/s2/src/Picker.tsx @@ -675,7 +675,7 @@ function DefaultProvider({context, value, children}: {context: React.Context{children}; } -export interface PickerSectionProps extends Omit, keyof GlobalDOMAttributes> {} +export interface PickerSectionProps extends Omit, 'style' | 'className' | keyof GlobalDOMAttributes>, StyleProps {} export function PickerSection(props: PickerSectionProps): ReactNode { let {size} = useContext(InternalPickerContext); return ( diff --git a/packages/@react-spectrum/s2/src/Provider.tsx b/packages/@react-spectrum/s2/src/Provider.tsx index b1c34d198c4..bfbae3cc936 100644 --- a/packages/@react-spectrum/s2/src/Provider.tsx +++ b/packages/@react-spectrum/s2/src/Provider.tsx @@ -13,6 +13,8 @@ import type {ColorScheme, Router} from '@react-types/provider'; import {colorScheme, UnsafeStyles} from './style-utils' with {type: 'macro'}; import {createContext, JSX, ReactNode, useContext} from 'react'; +import {DOMProps} from '@react-types/shared'; +import {filterDOMProps} from '@react-aria/utils'; import {Fonts} from './Fonts'; import {generateDefaultColorSchemeStyles} from './page.macro' with {type: 'macro'}; import {I18nProvider, RouterProvider, useLocale} from 'react-aria-components'; @@ -20,7 +22,7 @@ import {mergeStyles} from '../style/runtime'; import {style} from '../style' with {type: 'macro'}; import {StyleString} from '../style/types'; -export interface ProviderProps extends UnsafeStyles { +export interface ProviderProps extends UnsafeStyles, DOMProps { /** The content of the Provider. */ children: ReactNode, /** @@ -113,6 +115,7 @@ function ProviderInner(props: ProviderProps) { let {locale, direction} = useLocale(); return ( { +export interface ToggleButtonGroupProps extends ActionButtonGroupProps, Omit, DOMProps { /** Whether the button should be displayed with an [emphasized style](https://spectrum.adobe.com/page/action-button/#Emphasis). */ isEmphasized?: boolean } diff --git a/packages/@react-spectrum/s2/src/Tooltip.tsx b/packages/@react-spectrum/s2/src/Tooltip.tsx index abeaa5c0352..897787e1a98 100644 --- a/packages/@react-spectrum/s2/src/Tooltip.tsx +++ b/packages/@react-spectrum/s2/src/Tooltip.tsx @@ -23,7 +23,7 @@ import {centerPadding, colorScheme, UnsafeStyles} from './style-utils' with {typ import {ColorScheme} from '@react-types/provider'; import {ColorSchemeContext} from './Provider'; import {createContext, forwardRef, MutableRefObject, ReactNode, useCallback, useContext, useState} from 'react'; -import {DOMRef, GlobalDOMAttributes} from '@react-types/shared'; +import {DOMProps, DOMRef, GlobalDOMAttributes} from '@react-types/shared'; import {style} from '../style' with {type: 'macro'}; import {useDOMRef} from '@react-spectrum/utils'; @@ -35,10 +35,16 @@ export interface TooltipTriggerProps extends Omit, UnsafeStyles { +export interface TooltipProps extends Omit, DOMProps, UnsafeStyles { /** The content of the tooltip. */ children: ReactNode } @@ -139,7 +145,7 @@ export const Tooltip = forwardRef(function Tooltip(props: TooltipProps, ref: DOM let { containerPadding, crossOffset, - offset, + offset = 4, placement = 'top', shouldFlip } = useContext(InternalTooltipTriggerContext); diff --git a/packages/@react-spectrum/s2/stories/Breadcrumbs.stories.tsx b/packages/@react-spectrum/s2/stories/Breadcrumbs.stories.tsx index ab5110309d2..0a6a6affc8f 100644 --- a/packages/@react-spectrum/s2/stories/Breadcrumbs.stories.tsx +++ b/packages/@react-spectrum/s2/stories/Breadcrumbs.stories.tsx @@ -11,7 +11,7 @@ */ import {action} from '@storybook/addon-actions'; -import {Breadcrumb, Breadcrumbs} from '../src'; +import {Breadcrumb, Breadcrumbs, BreadcrumbsProps} from '../src'; import type {Meta, StoryObj} from '@storybook/react'; const meta: Meta = { @@ -57,24 +57,31 @@ export const Example: Story = { ) }; -let items = [ +interface Item { + id: string, + name: string +} +let items: Item[] = [ {id: 'home', name: 'Home'}, {id: 'react-aria', name: 'React Aria'}, {id: 'breadcrumbs', name: 'Breadcrumbs'} ]; -export const WithActions: Story = { - render: (args: any) => ( - - {item => ( - - {item.name} - - )} - - ) + +const BreadcrumbsExampleDynamic = (args: BreadcrumbsProps) => ( + + {item => ( + + {item.name} + + )} + +); + +export const WithActions: StoryObj = { + render: BreadcrumbsExampleDynamic }; -let manyItems = [ +let manyItems: Item[] = [ {id: 'Folder 1', name: 'The quick brown fox jumps over'}, {id: 'Folder 2', name: 'My Documents'}, {id: 'Folder 3', name: 'Kangaroos jump high'}, @@ -83,9 +90,9 @@ let manyItems = [ {id: 'Folder 6', name: 'Wattle trees'}, {id: 'Folder 7', name: 'April 7'} ]; - -export const Many: Story = { - render: (args: any) => ( +export type IMany = typeof BreadcrumbsExampleDynamic; +export const Many: StoryObj = { + render: (args: BreadcrumbsProps) => (
{item => ( @@ -98,7 +105,10 @@ export const Many: Story = { ) }; -let manyItemsWithLinks = [ +interface ItemWithLink extends Item { + href: string +} +let manyItemsWithLinks: ItemWithLink[] = [ {id: 'Folder 1', name: 'The quick brown fox jumps over', href: '/folder1'}, {id: 'Folder 2', name: 'My Documents', href: '/folder2'}, {id: 'Folder 3', name: 'Kangaroos jump high', href: '/folder3'}, @@ -108,16 +118,16 @@ let manyItemsWithLinks = [ {id: 'Folder 7', name: 'April 7', href: '/folder7'} ]; -export const ManyWithLinks: Story = { - render: (args: any) => ( -
- - {item => ( - - {item.name} - - )} - -
- ) +const BreadcrumbsExampleDynamicWithLinks = (args: BreadcrumbsProps) => ( + + {item => ( + + {item.name} + + )} + +); + +export const ManyWithLinks: StoryObj = { + render: BreadcrumbsExampleDynamicWithLinks }; diff --git a/packages/@react-spectrum/tree/test/TreeView.test.tsx b/packages/@react-spectrum/tree/test/TreeView.test.tsx index e7658edd446..f87c26f13a3 100644 --- a/packages/@react-spectrum/tree/test/TreeView.test.tsx +++ b/packages/@react-spectrum/tree/test/TreeView.test.tsx @@ -518,7 +518,7 @@ describe('Tree', () => { let rows = getAllByRole('row'); expect(rows).toHaveLength(1); - expect(rows[0]).toHaveAttribute('aria-label', 'Test'); + expect(rows[0]).toHaveAttribute('aria-label', 'test row'); }); describe('general interactions', () => { diff --git a/packages/@react-types/numberfield/src/index.d.ts b/packages/@react-types/numberfield/src/index.d.ts index 5139118794d..ab27493aa60 100644 --- a/packages/@react-types/numberfield/src/index.d.ts +++ b/packages/@react-types/numberfield/src/index.d.ts @@ -46,6 +46,9 @@ export interface AriaNumberFieldProps extends NumberFieldProps, DOMProps, AriaLa export interface SpectrumNumberFieldProps extends Omit, SpectrumFieldValidation, InputDOMProps, StyleProps, SpectrumLabelableProps { /** Whether the numberfield should be displayed with a quiet style. */ isQuiet?: boolean, - /** Whether to hide the increment and decrement buttons. */ + /** + * Whether to hide the increment and decrement buttons. + * @default false + */ hideStepper?: boolean } diff --git a/packages/react-aria-components/src/Breadcrumbs.tsx b/packages/react-aria-components/src/Breadcrumbs.tsx index 21a0929ace6..9149c9c1ab7 100644 --- a/packages/react-aria-components/src/Breadcrumbs.tsx +++ b/packages/react-aria-components/src/Breadcrumbs.tsx @@ -10,6 +10,7 @@ * governing permissions and limitations under the License. */ import {AriaBreadcrumbsProps, useBreadcrumbs} from 'react-aria'; +import {AriaLabelingProps, forwardRefType, GlobalDOMAttributes, Key} from '@react-types/shared'; import { ClassNameOrFunction, ContextValue, @@ -23,12 +24,11 @@ import { import {Collection, CollectionBuilder, CollectionNode, createLeafComponent} from '@react-aria/collections'; import {CollectionProps, CollectionRendererContext} from './Collection'; import {filterDOMProps, mergeProps} from '@react-aria/utils'; -import {forwardRefType, GlobalDOMAttributes, Key} from '@react-types/shared'; import {LinkContext} from './Link'; import {Node} from 'react-stately'; import React, {createContext, ForwardedRef, forwardRef, useContext} from 'react'; -export interface BreadcrumbsProps extends Omit, 'disabledKeys'>, AriaBreadcrumbsProps, StyleProps, SlotProps, GlobalDOMAttributes { +export interface BreadcrumbsProps extends Omit, 'disabledKeys'>, AriaBreadcrumbsProps, StyleProps, SlotProps, AriaLabelingProps, GlobalDOMAttributes { /** * The CSS [className](https://developer.mozilla.org/en-US/docs/Web/API/Element/className) for the element. * @default 'react-aria-Breadcrumbs' @@ -49,7 +49,7 @@ export const Breadcrumbs = /*#__PURE__*/ (forwardRef as forwardRefType)(function [props, ref] = useContextProps(props, ref, BreadcrumbsContext); let {CollectionRoot} = useContext(CollectionRendererContext); let {navProps} = useBreadcrumbs(props); - let DOMProps = filterDOMProps(props, {global: true}); + let DOMProps = filterDOMProps(props, {global: true, labelable: true}); return ( }> @@ -82,7 +82,7 @@ export interface BreadcrumbRenderProps { isDisabled: boolean } -export interface BreadcrumbProps extends RenderProps, GlobalDOMAttributes { +export interface BreadcrumbProps extends RenderProps, AriaLabelingProps, GlobalDOMAttributes { /** * The CSS [className](https://developer.mozilla.org/en-US/docs/Web/API/Element/className) for the element. A function may be provided to compute the class based on component state. * @default 'react-aria-Breadcrumb' @@ -116,7 +116,7 @@ export const Breadcrumb = /*#__PURE__*/ createLeafComponent(BreadcrumbNode, func defaultClassName: 'react-aria-Breadcrumb' }); - let DOMProps = filterDOMProps(props as any, {global: true}); + let DOMProps = filterDOMProps(props as any, {global: true, labelable: true}); delete DOMProps.id; return ( diff --git a/packages/react-aria-components/src/Disclosure.tsx b/packages/react-aria-components/src/Disclosure.tsx index c4bb05d10aa..6bfebd7db32 100644 --- a/packages/react-aria-components/src/Disclosure.tsx +++ b/packages/react-aria-components/src/Disclosure.tsx @@ -10,7 +10,7 @@ * governing permissions and limitations under the License. */ -import {AriaDisclosureProps, useDisclosure, useFocusRing} from 'react-aria'; +import {AriaDisclosureProps, LabelAriaProps, useDisclosure, useFocusRing} from 'react-aria'; import {ButtonContext} from './Button'; import { ClassNameOrFunction, @@ -206,7 +206,7 @@ export interface DisclosurePanelRenderProps { isFocusVisibleWithin: boolean } -export interface DisclosurePanelProps extends RenderProps, DOMProps, GlobalDOMAttributes { +export interface DisclosurePanelProps extends RenderProps, DOMProps, LabelAriaProps, GlobalDOMAttributes { /** * The CSS [className](https://developer.mozilla.org/en-US/docs/Web/API/Element/className) for the element. A function may be provided to compute the class based on component state. * @default 'react-aria-DisclosurePanel' @@ -240,7 +240,7 @@ export const DisclosurePanel = /*#__PURE__*/ (forwardRef as forwardRefType)(func isFocusVisibleWithin } }); - let DOMProps = filterDOMProps(props, {global: true}); + let DOMProps = filterDOMProps(props, {global: true, labelable: true}); return (
{ }); it('should support DOM props', () => { - let {getByRole, getAllByRole} = renderBreadcrumbs({'data-foo': 'bar'}, {'data-bar': 'foo'}); + let {getByRole, getAllByRole} = renderBreadcrumbs({'data-foo': 'bar', 'aria-label': 'test group'}, {'data-bar': 'foo', 'aria-label': 'test item'}); let breadcrumbs = getByRole('list'); expect(breadcrumbs).toHaveAttribute('data-foo', 'bar'); + expect(breadcrumbs).toHaveAttribute('aria-label', 'test group'); for (let item of getAllByRole('listitem')) { expect(item).toHaveAttribute('data-bar', 'foo'); + expect(item).toHaveAttribute('aria-label', 'test item'); } }); diff --git a/packages/react-aria-components/test/Disclosure.test.js b/packages/react-aria-components/test/Disclosure.test.js index 1ebfb13e91e..00411840f50 100644 --- a/packages/react-aria-components/test/Disclosure.test.js +++ b/packages/react-aria-components/test/Disclosure.test.js @@ -77,6 +77,23 @@ describe('Disclosure', () => { expect(disclosure).toHaveAttribute('data-foo', 'bar'); }); + it('should support aria label', () => { + const {container, getByRole} = render( + + + + + +

Content

+
+
+ ); + const heading = getByRole('heading'); + expect(heading).toHaveAttribute('aria-label', 'Test disclosure heading'); + const panel = container.querySelector('.react-aria-DisclosurePanel'); + expect(panel).toHaveAttribute('aria-label', 'Test disclosure panel'); + }); + it('should support disabled state', () => { const {getByTestId, getByRole, queryByText} = render( From 3f1e00b2e90318c8d6cdd44ddd2dad3d71bc7798 Mon Sep 17 00:00:00 2001 From: Robert Snow Date: Mon, 17 Nov 2025 15:05:03 +1100 Subject: [PATCH 04/12] fix default --- packages/@react-spectrum/s2/src/ActionMenu.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/@react-spectrum/s2/src/ActionMenu.tsx b/packages/@react-spectrum/s2/src/ActionMenu.tsx index ed891a42d70..53787c4bb8d 100644 --- a/packages/@react-spectrum/s2/src/ActionMenu.tsx +++ b/packages/@react-spectrum/s2/src/ActionMenu.tsx @@ -29,6 +29,11 @@ export interface ActionMenuProps extends Pick, 'children' | 'items' | 'disabledKeys' | 'onAction'>, Pick, StyleProps, DOMProps, AriaLabelingProps { + /** + * The size of the Trigger and Menu. + * + * @default 'M' + */ menuSize?: 'S' | 'M' | 'L' | 'XL' } From 3368088fedbe406745de04be9bd74d9bde09514b Mon Sep 17 00:00:00 2001 From: Daniel Lu Date: Tue, 18 Nov 2025 11:13:42 -0800 Subject: [PATCH 05/12] add default for statulight and missing prop in toggle button group example --- packages/@react-spectrum/s2/src/StatusLight.tsx | 2 ++ packages/dev/s2-docs/pages/s2/ToggleButtonGroup.mdx | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/@react-spectrum/s2/src/StatusLight.tsx b/packages/@react-spectrum/s2/src/StatusLight.tsx index f62161bf0b1..7588d3c06d8 100644 --- a/packages/@react-spectrum/s2/src/StatusLight.tsx +++ b/packages/@react-spectrum/s2/src/StatusLight.tsx @@ -26,6 +26,8 @@ interface StatusLightStyleProps { /** * The variant changes the color of the status light. * When status lights have a semantic meaning, they should use the variant for semantic colors. + * + * @default 'neutral' */ variant: 'informative' | 'neutral' | 'positive' | 'notice' | 'negative' | 'celery' | 'chartreuse' | 'cyan' | 'fuchsia' | 'purple' | 'magenta' | 'indigo' | 'seafoam' | 'yellow' | 'pink' | 'turquoise' | 'cinnamon' | 'brown' | 'silver', /** diff --git a/packages/dev/s2-docs/pages/s2/ToggleButtonGroup.mdx b/packages/dev/s2-docs/pages/s2/ToggleButtonGroup.mdx index dd910602b6e..e29832d395e 100644 --- a/packages/dev/s2-docs/pages/s2/ToggleButtonGroup.mdx +++ b/packages/dev/s2-docs/pages/s2/ToggleButtonGroup.mdx @@ -11,7 +11,7 @@ export const description = 'Allows a user to toggle multiple options, with singl {docs.exports.ToggleButtonGroup.description} -```tsx render docs={docs.exports.ToggleButtonGroup} links={docs.links} props={['selectionMode', 'orientation', 'size', 'density', 'staticColor', 'isQuiet', 'isJustified', 'isDisabled']} type="s2" +```tsx render docs={docs.exports.ToggleButtonGroup} links={docs.links} props={['selectionMode', 'orientation', 'size', 'density', 'staticColor', 'isQuiet', 'isJustified', 'isDisabled', 'isEmphasized']} type="s2" "use client"; import {ToggleButtonGroup, ToggleButton, Text} from '@react-spectrum/s2'; import TextBold from '@react-spectrum/s2/icons/TextBold'; From 7ed8da1041fd1639a51e9d86a8ceab68adc8220f Mon Sep 17 00:00:00 2001 From: Robert Snow Date: Tue, 2 Dec 2025 06:32:40 +1100 Subject: [PATCH 06/12] fix jsdoc --- packages/@react-spectrum/s2/src/AlertDialog.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/@react-spectrum/s2/src/AlertDialog.tsx b/packages/@react-spectrum/s2/src/AlertDialog.tsx index dfa156cf042..7395b3169be 100644 --- a/packages/@react-spectrum/s2/src/AlertDialog.tsx +++ b/packages/@react-spectrum/s2/src/AlertDialog.tsx @@ -29,7 +29,10 @@ import {UnsafeStyles} from './style-utils' with {type: 'macro'}; import {useLocalizedStringFormatter} from '@react-aria/i18n'; export interface AlertDialogProps extends DOMProps, UnsafeStyles { - /** The [visual style](https://spectrum.adobe.com/page/alert-dialog/#Options) of the AlertDialog. */ + /** + * The [visual style](https://spectrum.adobe.com/page/alert-dialog/#Options) of the AlertDialog. + * @default 'confirmation' + */ variant?: 'confirmation' | 'information' | 'destructive' | 'error' | 'warning', /** The title of the AlertDialog. */ title: string, From 129cb3e406976c83f739152db7e4988d8d87a935 Mon Sep 17 00:00:00 2001 From: Robert Snow Date: Wed, 3 Dec 2025 13:24:46 +1100 Subject: [PATCH 07/12] fix build and correct api --- packages/@react-spectrum/s2/src/StatusLight.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/@react-spectrum/s2/src/StatusLight.tsx b/packages/@react-spectrum/s2/src/StatusLight.tsx index 7588d3c06d8..ee0b46aa718 100644 --- a/packages/@react-spectrum/s2/src/StatusLight.tsx +++ b/packages/@react-spectrum/s2/src/StatusLight.tsx @@ -29,7 +29,7 @@ interface StatusLightStyleProps { * * @default 'neutral' */ - variant: 'informative' | 'neutral' | 'positive' | 'notice' | 'negative' | 'celery' | 'chartreuse' | 'cyan' | 'fuchsia' | 'purple' | 'magenta' | 'indigo' | 'seafoam' | 'yellow' | 'pink' | 'turquoise' | 'cinnamon' | 'brown' | 'silver', + variant?: 'informative' | 'neutral' | 'positive' | 'notice' | 'negative' | 'celery' | 'chartreuse' | 'cyan' | 'fuchsia' | 'purple' | 'magenta' | 'indigo' | 'seafoam' | 'yellow' | 'pink' | 'turquoise' | 'cinnamon' | 'brown' | 'silver', /** * The size of the StatusLight. * @@ -110,7 +110,7 @@ const light = style({ */ export const StatusLight = /*#__PURE__*/ forwardRef(function StatusLight(props: StatusLightProps, ref: DOMRef) { [props, ref] = useSpectrumContextProps(props, ref, StatusLightContext); - let {children, size = 'M', variant, role, UNSAFE_className = '', UNSAFE_style, styles} = props; + let {children, size = 'M', variant = 'neutral', role, UNSAFE_className = '', UNSAFE_style, styles} = props; let domRef = useDOMRef(ref); let isSkeleton = useIsSkeleton(); From 79efc45cf425cbf56ccf25e97ad5d786f3233f9f Mon Sep 17 00:00:00 2001 From: Robert Snow Date: Thu, 4 Dec 2025 12:03:31 +1100 Subject: [PATCH 08/12] fix props in starter --- starters/docs/src/SearchField.tsx | 5 +++-- starters/tailwind/src/SearchField.tsx | 7 ++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/starters/docs/src/SearchField.tsx b/starters/docs/src/SearchField.tsx index ed5ce0c9af8..1494ff7d43a 100644 --- a/starters/docs/src/SearchField.tsx +++ b/starters/docs/src/SearchField.tsx @@ -15,17 +15,18 @@ export interface SearchFieldProps extends AriaSearchFieldProps { description?: string; errorMessage?: string | ((validation: ValidationResult) => string); placeholder?: string; + autoFocus?: boolean; } export function SearchField( - { label, description, errorMessage, placeholder, ...props }: SearchFieldProps + { label, description, errorMessage, placeholder, autoFocus, ...props }: SearchFieldProps ) { return ( ( {label && } - + {description && {description}} {errorMessage} diff --git a/starters/tailwind/src/SearchField.tsx b/starters/tailwind/src/SearchField.tsx index 12e1d095eca..34740fff409 100644 --- a/starters/tailwind/src/SearchField.tsx +++ b/starters/tailwind/src/SearchField.tsx @@ -14,18 +14,19 @@ export interface SearchFieldProps extends AriaSearchFieldProps { label?: string; description?: string; errorMessage?: string | ((validation: ValidationResult) => string); - placeholder?: string + placeholder?: string; + autoFocus?: boolean; } export function SearchField( - { label, description, errorMessage, placeholder, ...props }: SearchFieldProps + { label, description, errorMessage, placeholder, autoFocus, ...props }: SearchFieldProps ) { return ( {label && } - + From 273cd14241338042a02234769b4d284a51a67f29 Mon Sep 17 00:00:00 2001 From: Robert Snow Date: Fri, 5 Dec 2025 06:41:49 +1100 Subject: [PATCH 09/12] Update packages/@react-spectrum/s2/src/ActionMenu.tsx Co-authored-by: Reid Barber --- packages/@react-spectrum/s2/src/ActionMenu.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@react-spectrum/s2/src/ActionMenu.tsx b/packages/@react-spectrum/s2/src/ActionMenu.tsx index 53787c4bb8d..c533d2c1702 100644 --- a/packages/@react-spectrum/s2/src/ActionMenu.tsx +++ b/packages/@react-spectrum/s2/src/ActionMenu.tsx @@ -30,7 +30,7 @@ export interface ActionMenuProps extends Pick, StyleProps, DOMProps, AriaLabelingProps { /** - * The size of the Trigger and Menu. + * The size of the Menu. * * @default 'M' */ From c9c702b14005fb6320ef1ba834c300308e439a68 Mon Sep 17 00:00:00 2001 From: Robert Snow Date: Fri, 5 Dec 2025 12:21:29 +1100 Subject: [PATCH 10/12] fix review comments --- packages/@react-spectrum/s2/src/Tooltip.tsx | 15 +++------------ packages/dev/s2-docs/pages/s2/Tooltip.mdx | 2 +- starters/docs/src/SearchField.tsx | 5 ++--- starters/tailwind/src/SearchField.tsx | 5 ++--- 4 files changed, 8 insertions(+), 19 deletions(-) diff --git a/packages/@react-spectrum/s2/src/Tooltip.tsx b/packages/@react-spectrum/s2/src/Tooltip.tsx index 897787e1a98..ea3ea7f3b62 100644 --- a/packages/@react-spectrum/s2/src/Tooltip.tsx +++ b/packages/@react-spectrum/s2/src/Tooltip.tsx @@ -27,7 +27,7 @@ import {DOMProps, DOMRef, GlobalDOMAttributes} from '@react-types/shared'; import {style} from '../style' with {type: 'macro'}; import {useDOMRef} from '@react-spectrum/utils'; -export interface TooltipTriggerProps extends Omit, Pick { +export interface TooltipTriggerProps extends Omit, Pick { /** The content of the tooltip. */ children: ReactNode, /** @@ -35,13 +35,7 @@ export interface TooltipTriggerProps extends Omit, DOMProps, UnsafeStyles { @@ -145,7 +139,6 @@ export const Tooltip = forwardRef(function Tooltip(props: TooltipProps, ref: DOM let { containerPadding, crossOffset, - offset = 4, placement = 'top', shouldFlip } = useContext(InternalTooltipTriggerContext); @@ -172,7 +165,7 @@ export const Tooltip = forwardRef(function Tooltip(props: TooltipProps, ref: DOM arrowBoundaryOffset={borderRadius} containerPadding={containerPadding} crossOffset={crossOffset} - offset={offset} + offset={4} placement={placement} shouldFlip={shouldFlip} ref={tooltipRef} @@ -201,7 +194,6 @@ export function TooltipTrigger(props: TooltipTriggerProps): ReactNode { let { containerPadding, crossOffset, - offset, placement, shouldFlip, ...triggerProps @@ -213,7 +205,6 @@ export function TooltipTrigger(props: TooltipTriggerProps): ReactNode { value={{ containerPadding: containerPadding, crossOffset: crossOffset, - offset: offset, placement: placement, shouldFlip: shouldFlip }}> diff --git a/packages/dev/s2-docs/pages/s2/Tooltip.mdx b/packages/dev/s2-docs/pages/s2/Tooltip.mdx index ec1955f281b..26e3f7d83f3 100644 --- a/packages/dev/s2-docs/pages/s2/Tooltip.mdx +++ b/packages/dev/s2-docs/pages/s2/Tooltip.mdx @@ -11,7 +11,7 @@ export const description = 'Displays a description of an element on hover or foc {docs.exports.Tooltip.description} -```tsx render docs={docs.exports.TooltipTrigger} links={docs.links} props={['placement', 'offset', 'crossOffset', 'shouldFlip']} type="s2" +```tsx render docs={docs.exports.TooltipTrigger} links={docs.links} props={['placement', 'crossOffset', 'shouldFlip']} type="s2" "use client"; import {Tooltip, TooltipTrigger, ActionButton} from '@react-spectrum/s2'; import Edit from '@react-spectrum/s2/icons/Edit'; diff --git a/starters/docs/src/SearchField.tsx b/starters/docs/src/SearchField.tsx index 1494ff7d43a..ed5ce0c9af8 100644 --- a/starters/docs/src/SearchField.tsx +++ b/starters/docs/src/SearchField.tsx @@ -15,18 +15,17 @@ export interface SearchFieldProps extends AriaSearchFieldProps { description?: string; errorMessage?: string | ((validation: ValidationResult) => string); placeholder?: string; - autoFocus?: boolean; } export function SearchField( - { label, description, errorMessage, placeholder, autoFocus, ...props }: SearchFieldProps + { label, description, errorMessage, placeholder, ...props }: SearchFieldProps ) { return ( ( {label && } - + {description && {description}} {errorMessage} diff --git a/starters/tailwind/src/SearchField.tsx b/starters/tailwind/src/SearchField.tsx index 34740fff409..9c155fc889a 100644 --- a/starters/tailwind/src/SearchField.tsx +++ b/starters/tailwind/src/SearchField.tsx @@ -15,18 +15,17 @@ export interface SearchFieldProps extends AriaSearchFieldProps { description?: string; errorMessage?: string | ((validation: ValidationResult) => string); placeholder?: string; - autoFocus?: boolean; } export function SearchField( - { label, description, errorMessage, placeholder, autoFocus, ...props }: SearchFieldProps + { label, description, errorMessage, placeholder, ...props }: SearchFieldProps ) { return ( {label && } - + From 7577785ef3746466bcbdcf5c67fe73b01c9d12ae Mon Sep 17 00:00:00 2001 From: Robert Snow Date: Fri, 5 Dec 2025 14:21:07 +1100 Subject: [PATCH 11/12] update default for contextual help --- packages/@react-spectrum/s2/src/ContextualHelp.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/@react-spectrum/s2/src/ContextualHelp.tsx b/packages/@react-spectrum/s2/src/ContextualHelp.tsx index bf25dedcbb6..1a381d40387 100644 --- a/packages/@react-spectrum/s2/src/ContextualHelp.tsx +++ b/packages/@react-spectrum/s2/src/ContextualHelp.tsx @@ -37,6 +37,11 @@ export interface ContextualHelpProps extends placement?: Placement, /** Contents of the Contextual Help popover. */ children: ReactNode, + /** + * The offset of the popover from the trigger button. + * @default 8 + */ + offset?: number, /** * The size of the ActionButton. * From 5b7400ba30b2cb2809c2d3446aad30448d8d4720 Mon Sep 17 00:00:00 2001 From: Robert Snow Date: Mon, 8 Dec 2025 07:45:54 +1100 Subject: [PATCH 12/12] remove offset and fix containerPadding --- packages/@react-spectrum/s2/src/ContextualHelp.tsx | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/packages/@react-spectrum/s2/src/ContextualHelp.tsx b/packages/@react-spectrum/s2/src/ContextualHelp.tsx index 1a381d40387..7cd5a31f5e0 100644 --- a/packages/@react-spectrum/s2/src/ContextualHelp.tsx +++ b/packages/@react-spectrum/s2/src/ContextualHelp.tsx @@ -37,11 +37,6 @@ export interface ContextualHelpProps extends placement?: Placement, /** Contents of the Contextual Help popover. */ children: ReactNode, - /** - * The offset of the popover from the trigger button. - * @default 8 - */ - offset?: number, /** * The size of the ActionButton. * @@ -69,11 +64,10 @@ export const ContextualHelp = forwardRef(function ContextualHelp(props: Contextu let { children, defaultOpen, - // containerPadding = 24, // See popover() above. Issue noted in Popover.tsx. + containerPadding = 8, size = 'XS', crossOffset, isOpen, - offset = 8, onOpenChange, placement = 'bottom start', shouldFlip, @@ -112,8 +106,8 @@ export const ContextualHelp = forwardRef(function ContextualHelp(props: Contextu padding="none" placement={placement} shouldFlip={shouldFlip} - // not working => containerPadding={containerPadding} - offset={offset} + containerPadding={containerPadding} + offset={8} crossOffset={crossOffset} hideArrow>