Files
headlessui/packages/@headlessui-vue/src/internal/hidden.ts
T
Robin Malfait edbcb81ead Add hidden attribute to internal <Hidden /> component when the Features.Hidden feature is used (#2955)
* add `hidden` attribute for `<Hidden features={Features.Hidden}>`

* update changelog
2024-01-31 13:29:50 +01:00

59 lines
1.5 KiB
TypeScript

import { defineComponent, type PropType } from 'vue'
import { render } from '../utils/render'
export enum Features {
// The default, no features.
None = 1 << 0,
// Whether the element should be focusable or not.
Focusable = 1 << 1,
// Whether it should be completely hidden, even to assistive technologies.
Hidden = 1 << 2,
}
export let Hidden = defineComponent({
name: 'Hidden',
props: {
as: { type: [Object, String], default: 'div' },
features: { type: Number as PropType<Features>, default: Features.None },
},
setup(props, { slots, attrs }) {
return () => {
let { features, ...theirProps } = props
let ourProps = {
'aria-hidden':
(features & Features.Focusable) === Features.Focusable
? true
: // @ts-ignore
theirProps['aria-hidden'] ?? undefined,
hidden: (features & Features.Hidden) === Features.Hidden ? true : undefined,
style: {
position: 'fixed',
top: 1,
left: 1,
width: 1,
height: 0,
padding: 0,
margin: -1,
overflow: 'hidden',
clip: 'rect(0, 0, 0, 0)',
whiteSpace: 'nowrap',
borderWidth: '0',
...((features & Features.Hidden) === Features.Hidden &&
!((features & Features.Focusable) === Features.Focusable) && { display: 'none' }),
},
}
return render({
ourProps,
theirProps,
slot: {},
attrs,
slots,
name: 'Hidden',
})
}
},
})