diff --git a/packages/compiler-core/__tests__/transforms/vOn.spec.ts b/packages/compiler-core/__tests__/transforms/vOn.spec.ts index b1c37e3f74e..e7932f972d7 100644 --- a/packages/compiler-core/__tests__/transforms/vOn.spec.ts +++ b/packages/compiler-core/__tests__/transforms/vOn.spec.ts @@ -733,5 +733,18 @@ describe('compiler: transform v-on', () => { }, }) }) + it('Popover api @beforetoggle', () => { + const { node } = parseWithVOn(`
`, { + prefixIdentifiers: true, + }) + const vnodeCall = node.codegenNode as VNodeCall + const properties = (vnodeCall.props as ObjectExpression).properties[0] + .value + expect(properties).toMatchObject({ + type: NodeTypes.SIMPLE_EXPRESSION, + content: '_ctx.test', + isStatic: false, + }) + }) }) }) diff --git a/packages/runtime-dom/src/jsx.ts b/packages/runtime-dom/src/jsx.ts index 5ba9b948849..3713c215d62 100644 --- a/packages/runtime-dom/src/jsx.ts +++ b/packages/runtime-dom/src/jsx.ts @@ -323,6 +323,11 @@ export interface HTMLAttributes extends AriaAttributes, EventHandlers { * @see https://html.spec.whatwg.org/multipage/custom-elements.html#attr-is */ is?: string + + // Popover API: https://developer.mozilla.org/en-US/docs/Web/API/Popover_API + popover?: true | 'auto' | 'manual' + onBeforetoggle?: Event + onToggle?: Event } type HTMLAttributeReferrerPolicy = @@ -372,7 +377,7 @@ export interface BlockquoteHTMLAttributes extends HTMLAttributes { cite?: string } -export interface ButtonHTMLAttributes extends HTMLAttributes { +export interface ButtonHTMLAttributes extends PopoverHTMLAttributes { autofocus?: Booleanish disabled?: Booleanish form?: string @@ -404,6 +409,12 @@ export interface DataHTMLAttributes extends HTMLAttributes { value?: string | ReadonlyArray | number } +/* Popover API: https://developer.mozilla.org/en-US/docs/Web/API/Popover_API */ +export interface PopoverHTMLAttributes extends HTMLAttributes { + popovertarget?: string + popovertargetaction?: 'hide' | 'show' | 'toggle' +} + export interface DetailsHTMLAttributes extends HTMLAttributes { open?: Booleanish onToggle?: Event @@ -512,7 +523,7 @@ export type InputTypeHTMLAttribute = | 'week' | (string & {}) -export interface InputHTMLAttributes extends HTMLAttributes { +export interface InputHTMLAttributes extends PopoverHTMLAttributes { accept?: string alt?: string autocomplete?: string diff --git a/packages/shared/src/domAttrConfig.ts b/packages/shared/src/domAttrConfig.ts index 758dfb307be..167b0135de0 100644 --- a/packages/shared/src/domAttrConfig.ts +++ b/packages/shared/src/domAttrConfig.ts @@ -10,9 +10,13 @@ import { makeMap } from './makeMap' * - nomodule -> noModule * - novalidate -> noValidate * - readonly -> readOnly + * - popovertarget -> popoverTargetElement (TODO: how to map this?) + * - popovertargetaction -> popoverTargetAction */ const specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly` -export const isSpecialBooleanAttr = /*#__PURE__*/ makeMap(specialBooleanAttrs) +export const isSpecialBooleanAttr = /*#__PURE__*/ makeMap( + `${specialBooleanAttrs},popovertarget,popovertargetaction`, +) /** * The full list is needed during SSR to produce the correct initial markup. @@ -20,7 +24,7 @@ export const isSpecialBooleanAttr = /*#__PURE__*/ makeMap(specialBooleanAttrs) export const isBooleanAttr = /*#__PURE__*/ makeMap( specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,` + - `inert,loop,open,required,reversed,scoped,seamless,` + + `inert,loop,open,popover,required,reversed,scoped,seamless,` + `checked,muted,multiple,selected`, ) @@ -70,7 +74,8 @@ export const isKnownHtmlAttr = /*#__PURE__*/ makeMap( `height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,` + `ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,` + `manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,` + - `open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,` + + `open,optimum,pattern,ping,placeholder,popover,popovertarget,popovertargetaction,` + + `poster,preload,radiogroup,readonly,` + `referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,` + `selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,` + `start,step,style,summary,tabindex,target,title,translate,type,usemap,` +