Skip to content

Commit 0bd8c47

Browse files
authored
use HTMLElement for generic DOM node types (#3169)
We keep specific types for elements with special meaning, such as `HTMLButtonElement`, `HTMLLabelElement` or `HTMLInputElement` because they receive certain attributes that generic DOM nodes (such as HTMLDivElement) don't For the components where we use simple `div` elements (and where people use `as={...}`) that renders a different element, it doesn't make sense to use `HTMLDivElement`. Using a more generic `HTMLElement` is simpler and more correct (we still had `HTMLUListElement` and `HTMLLIElement` for "div" DOM nodes which is incorrect). This shouldn't be a breaking change because an `HTMLDivElement` is still a valid `HTMLElement`. The other way around wouldn't be the case.
1 parent f0e3e5b commit 0bd8c47

File tree

9 files changed

+27
-27
lines changed

9 files changed

+27
-27
lines changed

packages/@headlessui-react/src/components/combobox/combobox.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -550,7 +550,7 @@ let ComboboxDataContext = createContext<
550550

551551
inputRef: MutableRefObject<HTMLInputElement | null>
552552
buttonRef: MutableRefObject<HTMLButtonElement | null>
553-
optionsRef: MutableRefObject<HTMLUListElement | null>
553+
optionsRef: MutableRefObject<HTMLElement | null>
554554
} & Omit<StateDefinition<unknown>, 'dataRef'>)
555555
| null
556556
>(null)
@@ -1425,7 +1425,7 @@ function ButtonFn<TTag extends ElementType = typeof DEFAULT_BUTTON_TAG>(
14251425

14261426
let refocusInput = useRefocusableInput(data.inputRef)
14271427

1428-
let handleKeyDown = useEvent((event: ReactKeyboardEvent<HTMLUListElement>) => {
1428+
let handleKeyDown = useEvent((event: ReactKeyboardEvent<HTMLElement>) => {
14291429
switch (event.key) {
14301430
// Ref: https://www.w3.org/WAI/ARIA/apg/patterns/menu/#keyboard-interaction-12
14311431

@@ -1574,7 +1574,7 @@ export type ComboboxOptionsProps<TTag extends ElementType = typeof DEFAULT_OPTIO
15741574

15751575
function OptionsFn<TTag extends ElementType = typeof DEFAULT_OPTIONS_TAG>(
15761576
props: ComboboxOptionsProps<TTag>,
1577-
ref: Ref<HTMLUListElement>
1577+
ref: Ref<HTMLElement>
15781578
) {
15791579
let internalId = useId()
15801580
let {
@@ -1750,7 +1750,7 @@ function OptionFn<
17501750
// TODO: One day we will be able to infer this type from the generic in Combobox itself.
17511751
// But today is not that day..
17521752
TType = Parameters<typeof ComboboxRoot>[0]['value'],
1753-
>(props: ComboboxOptionProps<TTag, TType>, ref: Ref<HTMLLIElement>) {
1753+
>(props: ComboboxOptionProps<TTag, TType>, ref: Ref<HTMLElement>) {
17541754
let data = useData('Combobox.Option')
17551755
let actions = useActions('Combobox.Option')
17561756

@@ -1772,7 +1772,7 @@ function OptionFn<
17721772
: data.options[data.activeOptionIndex]?.id === id
17731773

17741774
let selected = data.isSelected(value)
1775-
let internalOptionRef = useRef<HTMLLIElement | null>(null)
1775+
let internalOptionRef = useRef<HTMLElement | null>(null)
17761776

17771777
let bag = useLatestValue<ComboboxOptionDataRef<TType>['current']>({
17781778
disabled,

packages/@headlessui-react/src/components/description/description.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ export type DescriptionProps<TTag extends ElementType = typeof DEFAULT_DESCRIPTI
107107

108108
function DescriptionFn<TTag extends ElementType = typeof DEFAULT_DESCRIPTION_TAG>(
109109
props: DescriptionProps<TTag>,
110-
ref: Ref<HTMLParagraphElement>
110+
ref: Ref<HTMLElement>
111111
) {
112112
let internalId = useId()
113113
let providedDisabled = useDisabled()

packages/@headlessui-react/src/components/dialog/dialog.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ enum DialogStates {
6161

6262
interface StateDefinition {
6363
titleId: string | null
64-
panelRef: MutableRefObject<HTMLDivElement | null>
64+
panelRef: MutableRefObject<HTMLElement | null>
6565
}
6666

6767
enum ActionTypes {
@@ -135,7 +135,7 @@ export type DialogProps<TTag extends ElementType = typeof DEFAULT_DIALOG_TAG> =
135135

136136
function DialogFn<TTag extends ElementType = typeof DEFAULT_DIALOG_TAG>(
137137
props: DialogProps<TTag>,
138-
ref: Ref<HTMLDivElement>
138+
ref: Ref<HTMLElement>
139139
) {
140140
let internalId = useId()
141141
let {
@@ -173,7 +173,7 @@ function DialogFn<TTag extends ElementType = typeof DEFAULT_DIALOG_TAG>(
173173
open = (usesOpenClosedState & State.Open) === State.Open
174174
}
175175

176-
let internalDialogRef = useRef<HTMLDivElement | null>(null)
176+
let internalDialogRef = useRef<HTMLElement | null>(null)
177177
let dialogRef = useSyncRefs(internalDialogRef, ref)
178178

179179
let ownerDocument = useOwnerDocument(internalDialogRef)
@@ -440,7 +440,7 @@ export type DialogOverlayProps<TTag extends ElementType = typeof DEFAULT_OVERLAY
440440

441441
function OverlayFn<TTag extends ElementType = typeof DEFAULT_OVERLAY_TAG>(
442442
props: DialogOverlayProps<TTag>,
443-
ref: Ref<HTMLDivElement>
443+
ref: Ref<HTMLElement>
444444
) {
445445
let internalId = useId()
446446
let { id = `headlessui-dialog-overlay-${internalId}`, ...theirProps } = props
@@ -492,7 +492,7 @@ export type DialogBackdropProps<TTag extends ElementType = typeof DEFAULT_BACKDR
492492

493493
function BackdropFn<TTag extends ElementType = typeof DEFAULT_BACKDROP_TAG>(
494494
props: DialogBackdropProps<TTag>,
495-
ref: Ref<HTMLDivElement>
495+
ref: Ref<HTMLElement>
496496
) {
497497
let internalId = useId()
498498
let { id = `headlessui-dialog-backdrop-${internalId}`, ...theirProps } = props
@@ -547,7 +547,7 @@ export type DialogPanelProps<TTag extends ElementType = typeof DEFAULT_PANEL_TAG
547547

548548
function PanelFn<TTag extends ElementType = typeof DEFAULT_PANEL_TAG>(
549549
props: DialogPanelProps<TTag>,
550-
ref: Ref<HTMLDivElement>
550+
ref: Ref<HTMLElement>
551551
) {
552552
let internalId = useId()
553553
let { id = `headlessui-dialog-panel-${internalId}`, ...theirProps } = props
@@ -594,7 +594,7 @@ export type DialogTitleProps<TTag extends ElementType = typeof DEFAULT_TITLE_TAG
594594

595595
function TitleFn<TTag extends ElementType = typeof DEFAULT_TITLE_TAG>(
596596
props: DialogTitleProps<TTag>,
597-
ref: Ref<HTMLHeadingElement>
597+
ref: Ref<HTMLElement>
598598
) {
599599
let internalId = useId()
600600
let { id = `headlessui-dialog-title-${internalId}`, ...theirProps } = props

packages/@headlessui-react/src/components/disclosure/disclosure.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ interface StateDefinition {
5454
linkedPanel: boolean
5555

5656
buttonRef: MutableRefObject<HTMLButtonElement | null>
57-
panelRef: MutableRefObject<HTMLDivElement | null>
57+
panelRef: MutableRefObject<HTMLElement | null>
5858

5959
buttonId: string | null
6060
panelId: string | null
@@ -433,7 +433,7 @@ export type DisclosurePanelProps<TTag extends ElementType = typeof DEFAULT_PANEL
433433

434434
function PanelFn<TTag extends ElementType = typeof DEFAULT_PANEL_TAG>(
435435
props: DisclosurePanelProps<TTag>,
436-
ref: Ref<HTMLDivElement>
436+
ref: Ref<HTMLElement>
437437
) {
438438
let internalId = useId()
439439
let { id = `headlessui-disclosure-panel-${internalId}`, ...theirProps } = props

packages/@headlessui-react/src/components/focus-trap/focus-trap.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,9 @@ export type FocusTrapProps<TTag extends ElementType = typeof DEFAULT_FOCUS_TRAP_
9090

9191
function FocusTrapFn<TTag extends ElementType = typeof DEFAULT_FOCUS_TRAP_TAG>(
9292
props: FocusTrapProps<TTag>,
93-
ref: Ref<HTMLDivElement>
93+
ref: Ref<HTMLElement>
9494
) {
95-
let container = useRef<HTMLDivElement | null>(null)
95+
let container = useRef<HTMLElement | null>(null)
9696
let focusTrapRef = useSyncRefs(container, ref)
9797
let {
9898
initialFocus,

packages/@headlessui-react/src/components/listbox/listbox.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ let ListboxDataContext = createContext<
418418
listRef: MutableRefObject<Map<string, HTMLElement | null>>
419419

420420
buttonRef: MutableRefObject<HTMLButtonElement | null>
421-
optionsRef: MutableRefObject<HTMLUListElement | null>
421+
optionsRef: MutableRefObject<HTMLElement | null>
422422
} & Omit<StateDefinition<unknown>, 'dataRef'>)
423423
| null
424424
>(null)
@@ -1003,7 +1003,7 @@ function OptionsFn<TTag extends ElementType = typeof DEFAULT_OPTIONS_TAG>(
10031003
container?.focus({ preventScroll: true })
10041004
}, [data.listboxState, data.optionsRef, data.optionsRef.current])
10051005

1006-
let handleKeyDown = useEvent((event: ReactKeyboardEvent<HTMLUListElement>) => {
1006+
let handleKeyDown = useEvent((event: ReactKeyboardEvent<HTMLElement>) => {
10071007
searchDisposables.dispose()
10081008

10091009
switch (event.key) {
@@ -1176,7 +1176,7 @@ function OptionFn<
11761176
data.activeOptionIndex !== null ? data.options[data.activeOptionIndex].id === id : false
11771177

11781178
let selected = data.isSelected(value)
1179-
let internalOptionRef = useRef<HTMLLIElement | null>(null)
1179+
let internalOptionRef = useRef<HTMLElement | null>(null)
11801180
let getTextValue = useTextValue(internalOptionRef)
11811181
let bag = useLatestValue<ListboxOptionDataRef<TType>['current']>({
11821182
disabled,

packages/@headlessui-react/src/components/menu/menu.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ interface StateDefinition {
9393
__demoMode: boolean
9494
menuState: MenuStates
9595
buttonRef: MutableRefObject<HTMLButtonElement | null>
96-
itemsRef: MutableRefObject<HTMLDivElement | null>
96+
itemsRef: MutableRefObject<HTMLElement | null>
9797
items: { id: string; dataRef: MenuItemDataRef }[]
9898
searchQuery: string
9999
activeItemIndex: number | null
@@ -590,7 +590,7 @@ export type MenuItemsProps<TTag extends ElementType = typeof DEFAULT_ITEMS_TAG>
590590

591591
function ItemsFn<TTag extends ElementType = typeof DEFAULT_ITEMS_TAG>(
592592
props: MenuItemsProps<TTag>,
593-
ref: Ref<HTMLDivElement>
593+
ref: Ref<HTMLElement>
594594
) {
595595
let internalId = useId()
596596
let {
@@ -675,7 +675,7 @@ function ItemsFn<TTag extends ElementType = typeof DEFAULT_ITEMS_TAG>(
675675
},
676676
})
677677

678-
let handleKeyDown = useEvent((event: ReactKeyboardEvent<HTMLDivElement>) => {
678+
let handleKeyDown = useEvent((event: ReactKeyboardEvent<HTMLElement>) => {
679679
searchDisposables.dispose()
680680

681681
switch (event.key) {

packages/@headlessui-react/src/components/popover/popover.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -730,7 +730,7 @@ export type PopoverOverlayProps<TTag extends ElementType = typeof DEFAULT_OVERLA
730730

731731
function OverlayFn<TTag extends ElementType = typeof DEFAULT_OVERLAY_TAG>(
732732
props: PopoverOverlayProps<TTag>,
733-
ref: Ref<HTMLDivElement>
733+
ref: Ref<HTMLElement>
734734
) {
735735
let internalId = useId()
736736
let { id = `headlessui-popover-overlay-${internalId}`, ...theirProps } = props
@@ -804,7 +804,7 @@ export type PopoverPanelProps<TTag extends ElementType = typeof DEFAULT_PANEL_TA
804804

805805
function PanelFn<TTag extends ElementType = typeof DEFAULT_PANEL_TAG>(
806806
props: PopoverPanelProps<TTag>,
807-
ref: Ref<HTMLDivElement>
807+
ref: Ref<HTMLElement>
808808
) {
809809
let internalId = useId()
810810
let {
@@ -822,7 +822,7 @@ function PanelFn<TTag extends ElementType = typeof DEFAULT_PANEL_TAG>(
822822
let beforePanelSentinelId = `headlessui-focus-sentinel-before-${internalId}`
823823
let afterPanelSentinelId = `headlessui-focus-sentinel-after-${internalId}`
824824

825-
let internalPanelRef = useRef<HTMLDivElement | null>(null)
825+
let internalPanelRef = useRef<HTMLElement | null>(null)
826826
let anchor = useResolvedAnchor(rawAnchor)
827827
let [floatingRef, style] = useFloatingPanel(anchor)
828828
let getFloatingPanelProps = useFloatingPanelProps()

packages/@headlessui-react/src/components/transition/transition.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ function useNesting(done?: () => void, parent?: NestingContextValues) {
303303
// ---
304304

305305
let DEFAULT_TRANSITION_CHILD_TAG = Fragment
306-
type TransitionChildRenderPropArg = MutableRefObject<HTMLDivElement>
306+
type TransitionChildRenderPropArg = MutableRefObject<HTMLElement>
307307
let TransitionChildRenderFeatures = RenderFeatures.RenderStrategy
308308

309309
function TransitionChildFn<TTag extends ElementType = typeof DEFAULT_TRANSITION_CHILD_TAG>(

0 commit comments

Comments
 (0)