diff --git a/.changeset/tender-zebras-flow.md b/.changeset/tender-zebras-flow.md new file mode 100644 index 000000000..dd118d66f --- /dev/null +++ b/.changeset/tender-zebras-flow.md @@ -0,0 +1,5 @@ +--- +"@sit-onyx/storybook-utils": minor +--- + +feat: added withNativeEventLogging to log and document native events diff --git a/apps/docs/playwright/snapshots/development-packages-storybook-utils-chromium-linux.png b/apps/docs/playwright/snapshots/development-packages-storybook-utils-chromium-linux.png index d0bc08fcd..a5c76c4d3 100644 Binary files a/apps/docs/playwright/snapshots/development-packages-storybook-utils-chromium-linux.png and b/apps/docs/playwright/snapshots/development-packages-storybook-utils-chromium-linux.png differ diff --git a/apps/docs/playwright/snapshots/development-packages-storybook-utils-firefox-linux.png b/apps/docs/playwright/snapshots/development-packages-storybook-utils-firefox-linux.png index 73d1fa600..d9d3dd48b 100644 Binary files a/apps/docs/playwright/snapshots/development-packages-storybook-utils-firefox-linux.png and b/apps/docs/playwright/snapshots/development-packages-storybook-utils-firefox-linux.png differ diff --git a/apps/docs/playwright/snapshots/development-packages-storybook-utils-webkit-linux.png b/apps/docs/playwright/snapshots/development-packages-storybook-utils-webkit-linux.png index 2955cfc62..c208ab302 100644 Binary files a/apps/docs/playwright/snapshots/development-packages-storybook-utils-webkit-linux.png and b/apps/docs/playwright/snapshots/development-packages-storybook-utils-webkit-linux.png differ diff --git a/apps/docs/src/development/packages/storybook-utils.md b/apps/docs/src/development/packages/storybook-utils.md index e605af2ae..e2d455c8c 100644 --- a/apps/docs/src/development/packages/storybook-utils.md +++ b/apps/docs/src/development/packages/storybook-utils.md @@ -154,3 +154,21 @@ export default preview; ``` ::: + +### withNativeEventLogging + +Allows logging and documentation for the passed native event listeners in Storybook. +These will be documented in a extra "Relevant HTML events" section in the Storybook documentation. + +```ts [.storybook/preview.ts] +import { withNativeEventLogging } from "@sit-onyx/storybook-utils"; + +const meta: Meta = { + title: "Buttons/Button", + component: OnyxButton, + argTypes: { + somethingElse: { ...someOtherArgType }, + ...withNativeEventLogging(["onClick"]), + }, +}; +``` diff --git a/packages/sit-onyx/src/components/OnyxButton/OnyxButton.stories.ts b/packages/sit-onyx/src/components/OnyxButton/OnyxButton.stories.ts index 179c1e8a8..f854774a8 100644 --- a/packages/sit-onyx/src/components/OnyxButton/OnyxButton.stories.ts +++ b/packages/sit-onyx/src/components/OnyxButton/OnyxButton.stories.ts @@ -1,4 +1,5 @@ import checkSmall from "@sit-onyx/icons/check-small.svg?raw"; +import { withNativeEventLogging } from "@sit-onyx/storybook-utils"; import type { Meta, StoryObj } from "@storybook/vue3"; import { defineIconSelectArgType } from "../../utils/storybook"; import OnyxButton from "./OnyxButton.vue"; @@ -17,6 +18,7 @@ const meta: Meta = { component: OnyxButton, argTypes: { icon: defineIconSelectArgType(), + ...withNativeEventLogging(["onClick"]), }, }; diff --git a/packages/sit-onyx/src/components/OnyxIconButton/OnyxIconButton.stories.ts b/packages/sit-onyx/src/components/OnyxIconButton/OnyxIconButton.stories.ts index 86c847e71..f2e1ba8c8 100644 --- a/packages/sit-onyx/src/components/OnyxIconButton/OnyxIconButton.stories.ts +++ b/packages/sit-onyx/src/components/OnyxIconButton/OnyxIconButton.stories.ts @@ -1,4 +1,5 @@ import trash from "@sit-onyx/icons/trash.svg?raw"; +import { withNativeEventLogging } from "@sit-onyx/storybook-utils"; import type { Meta, StoryObj } from "@storybook/vue3"; import { h } from "vue"; import { defineIconSelectArgType } from "../../utils/storybook"; @@ -13,6 +14,7 @@ const meta: Meta = { argTypes: { icon: defineIconSelectArgType(), default: { control: { disable: true } }, + ...withNativeEventLogging(["onClick"]), }, }; diff --git a/packages/sit-onyx/src/components/OnyxInput/OnyxInput.stories.ts b/packages/sit-onyx/src/components/OnyxInput/OnyxInput.stories.ts index a1241d599..e165b86aa 100644 --- a/packages/sit-onyx/src/components/OnyxInput/OnyxInput.stories.ts +++ b/packages/sit-onyx/src/components/OnyxInput/OnyxInput.stories.ts @@ -1,3 +1,4 @@ +import { withNativeEventLogging } from "@sit-onyx/storybook-utils"; import type { Meta, StoryObj } from "@storybook/vue3"; import OnyxInput from "./OnyxInput.vue"; @@ -16,6 +17,7 @@ const meta: Meta = { ], argTypes: { pattern: { control: { type: "text" } }, + ...withNativeEventLogging(["onInput", "onChange", "onFocusin", "onFocusout"]), }, }; diff --git a/packages/sit-onyx/src/components/OnyxLink/OnyxLink.stories.ts b/packages/sit-onyx/src/components/OnyxLink/OnyxLink.stories.ts index 8fda6bdf4..2802cacec 100644 --- a/packages/sit-onyx/src/components/OnyxLink/OnyxLink.stories.ts +++ b/packages/sit-onyx/src/components/OnyxLink/OnyxLink.stories.ts @@ -1,3 +1,4 @@ +import { withNativeEventLogging } from "@sit-onyx/storybook-utils"; import type { Meta, StoryObj } from "@storybook/vue3"; import OnyxLink from "./OnyxLink.vue"; @@ -15,6 +16,7 @@ const meta: Meta = { options: ["auto", true, false], control: { type: "radio" }, }, + ...withNativeEventLogging(["onClick"]), }, decorators: [ (story) => ({ diff --git a/packages/sit-onyx/src/components/OnyxNavAppArea/OnyxNavAppArea.stories.ts b/packages/sit-onyx/src/components/OnyxNavAppArea/OnyxNavAppArea.stories.ts index f49445d1b..955919668 100644 --- a/packages/sit-onyx/src/components/OnyxNavAppArea/OnyxNavAppArea.stories.ts +++ b/packages/sit-onyx/src/components/OnyxNavAppArea/OnyxNavAppArea.stories.ts @@ -1,3 +1,4 @@ +import { withNativeEventLogging } from "@sit-onyx/storybook-utils"; import type { Meta, StoryObj } from "@storybook/vue3"; import OnyxNavAppArea from "./OnyxNavAppArea.vue"; @@ -9,6 +10,7 @@ const meta: Meta = { component: OnyxNavAppArea, argTypes: { default: { control: { type: "text" } }, + ...withNativeEventLogging(["onClick"]), }, }; diff --git a/packages/sit-onyx/src/components/OnyxNavBar/modules/OnyxMenuItem/OnyxMenuItem.stories.ts b/packages/sit-onyx/src/components/OnyxNavBar/modules/OnyxMenuItem/OnyxMenuItem.stories.ts index 565768807..679f7f3bd 100644 --- a/packages/sit-onyx/src/components/OnyxNavBar/modules/OnyxMenuItem/OnyxMenuItem.stories.ts +++ b/packages/sit-onyx/src/components/OnyxNavBar/modules/OnyxMenuItem/OnyxMenuItem.stories.ts @@ -1,4 +1,5 @@ import placeholder from "@sit-onyx/icons/placeholder.svg?raw"; +import { withNativeEventLogging } from "@sit-onyx/storybook-utils"; import type { Meta, StoryObj } from "@storybook/vue3"; import { h } from "vue"; import OnyxIcon from "../../../OnyxIcon/OnyxIcon.vue"; @@ -12,6 +13,7 @@ const meta: Meta = { component: OnyxMenuItem, argTypes: { default: { control: { type: "text" } }, + ...withNativeEventLogging(["onClick"]), }, decorators: [ (story) => ({ diff --git a/packages/sit-onyx/src/components/OnyxRadioButton/OnyxRadioButton.stories.ts b/packages/sit-onyx/src/components/OnyxRadioButton/OnyxRadioButton.stories.ts index 05c10727c..2e6ce4d05 100644 --- a/packages/sit-onyx/src/components/OnyxRadioButton/OnyxRadioButton.stories.ts +++ b/packages/sit-onyx/src/components/OnyxRadioButton/OnyxRadioButton.stories.ts @@ -1,3 +1,4 @@ +import { withNativeEventLogging } from "@sit-onyx/storybook-utils"; import type { Meta, StoryObj } from "@storybook/vue3"; import OnyxRadioButton from "./OnyxRadioButton.vue"; @@ -7,6 +8,9 @@ import OnyxRadioButton from "./OnyxRadioButton.vue"; const meta: Meta = { title: "Support/RadioButton", component: OnyxRadioButton, + argTypes: { + ...withNativeEventLogging(["onChange"]), + }, }; export default meta; diff --git a/packages/sit-onyx/src/components/OnyxStepper/OnyxStepper.stories.ts b/packages/sit-onyx/src/components/OnyxStepper/OnyxStepper.stories.ts index 98acbc60a..a957187a2 100644 --- a/packages/sit-onyx/src/components/OnyxStepper/OnyxStepper.stories.ts +++ b/packages/sit-onyx/src/components/OnyxStepper/OnyxStepper.stories.ts @@ -1,3 +1,4 @@ +import { withNativeEventLogging } from "@sit-onyx/storybook-utils"; import type { Meta, StoryObj } from "@storybook/vue3"; import OnyxStepper from "./OnyxStepper.vue"; @@ -10,6 +11,9 @@ const meta: Meta = { template: `
`, }), ], + argTypes: { + ...withNativeEventLogging(["onChange"]), + }, }; export default meta; diff --git a/packages/sit-onyx/src/components/OnyxTextarea/OnyxTextarea.stories.ts b/packages/sit-onyx/src/components/OnyxTextarea/OnyxTextarea.stories.ts index 0a26aa09b..97e7179da 100644 --- a/packages/sit-onyx/src/components/OnyxTextarea/OnyxTextarea.stories.ts +++ b/packages/sit-onyx/src/components/OnyxTextarea/OnyxTextarea.stories.ts @@ -1,3 +1,4 @@ +import { withNativeEventLogging } from "@sit-onyx/storybook-utils"; import type { Meta, StoryObj } from "@storybook/vue3"; import OnyxTextarea from "./OnyxTextarea.vue"; @@ -10,6 +11,9 @@ const meta: Meta = { template: `
`, }), ], + argTypes: { + ...withNativeEventLogging(["onChange"]), + }, }; export default meta; diff --git a/packages/sit-onyx/src/components/OnyxToastMessage/OnyxToastMessage.stories.ts b/packages/sit-onyx/src/components/OnyxToastMessage/OnyxToastMessage.stories.ts index 6a2e991a5..329a4ce28 100644 --- a/packages/sit-onyx/src/components/OnyxToastMessage/OnyxToastMessage.stories.ts +++ b/packages/sit-onyx/src/components/OnyxToastMessage/OnyxToastMessage.stories.ts @@ -1,3 +1,4 @@ +import { withNativeEventLogging } from "@sit-onyx/storybook-utils"; import type { Meta, StoryObj } from "@storybook/vue3"; import { defineIconSelectArgType } from "../../utils/storybook"; import OnyxToastMessage from "./OnyxToastMessage.vue"; @@ -10,6 +11,7 @@ const meta: Meta = { component: OnyxToastMessage, argTypes: { icon: defineIconSelectArgType(), + ...withNativeEventLogging(["onClick"]), }, }; diff --git a/packages/storybook-utils/src/actions.ts b/packages/storybook-utils/src/actions.ts index d95d2bf69..26c7babfa 100644 --- a/packages/storybook-utils/src/actions.ts +++ b/packages/storybook-utils/src/actions.ts @@ -1,7 +1,8 @@ import type { Decorator } from "@storybook/vue3"; import { useArgs } from "storybook/internal/preview-api"; -import type { ArgTypesEnhancer, StrictInputType } from "storybook/internal/types"; -import { isReactive, reactive, watch } from "vue"; +import type { ArgTypes, ArgTypesEnhancer, StrictInputType } from "storybook/internal/types"; +import { isReactive, reactive, watch, type Events } from "vue"; +import { EVENT_DOC_MAP } from "./events"; /** * Adds actions for all argTypes of the 'event' category, so that they are logged via the actions plugin. @@ -23,6 +24,41 @@ export const enhanceEventArgTypes: ArgTypesEnhancer = ({ argTypes }) => { return argTypes; }; +/** + * Allows logging and documentation for the passed event listener names in Storybook. + * Will be documented in a extra "Relevant HTML events" section in the Storybook documentation. + * + * @example + * ```typescript + * const meta: Meta = { + * title: "Buttons/Button", + * component: OnyxButton, + * argTypes: { + * somethingElse: { ...someOtherArgType }, + * ...withNativeEventLogging(["onClick"]), + * }, + *}; + * ``` + * + * @param relevantEvents a list of event names that should be logged + * @returns Storybook ArgTypes object + */ +export const withNativeEventLogging = (relevantEvents: (keyof Events)[]) => + relevantEvents.reduce((argTypes, eventName) => { + const { constructor, event } = EVENT_DOC_MAP[eventName]; + argTypes[eventName] = { + name: event.name, + control: false, + description: `The native HTML [${event.name}](${event.url}) event which dispatches an [${constructor.name}](${constructor.url}).`, + table: { + category: "Relevant HTML events", + type: { summary: constructor.name }, + }, + action: event.name, + }; + return argTypes; + }, {} as ArgTypes); + export type WithVModelDecoratorOptions = { /** * The matcher for the v-model events. diff --git a/packages/storybook-utils/src/events.ts b/packages/storybook-utils/src/events.ts new file mode 100644 index 000000000..5b09befd3 --- /dev/null +++ b/packages/storybook-utils/src/events.ts @@ -0,0 +1,777 @@ +import type { Events } from "vue"; + +// prettier-ignore +type EventName = + T extends ClipboardEvent ? "ClipboardEvent" +: T extends WheelEvent ? "WheelEvent" +: T extends PointerEvent ? "PointerEvent" +: T extends DragEvent ? "DragEvent" +: T extends MouseEvent ? "MouseEvent" +: T extends CompositionEvent ? "CompositionEvent" +: T extends FocusEvent ? "FocusEvent" +: T extends KeyboardEvent ? "KeyboardEvent" +: T extends TouchEvent ? "TouchEvent" +: T extends AnimationEvent ? "AnimationEvent" +: T extends TransitionEvent ? "TransitionEvent" +: "Event"; + +/** + * Removes a prefix from a string type. + * @example ```ts + * type Trimmed = TrimStart<"onclick", "on">; + * const trimmed: Trimmed = "click"; + * ``` + */ +type TrimStart< + TString extends string, + TPrefix extends string, +> = TString extends `${TPrefix}${infer TBase}` ? TBase : TString; + +type EventDocMap = { + [Key in keyof Events]: { + constructor: Docs>; + event: Docs>>; + }; +}; + +/** + * The doc type ensures that a name has a valid URL that includes the name. + */ +type Docs = { + name: Name; + url: `${string}${Name}${string}`; +}; + +export const EVENT_DOC_MAP: EventDocMap = { + onCopy: { + constructor: { + name: "ClipboardEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/ClipboardEvent", + }, + event: { + name: "copy", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/copy_event", + }, + }, + onCut: { + constructor: { + name: "ClipboardEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/ClipboardEvent", + }, + event: { + name: "cut", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/cut_event", + }, + }, + onPaste: { + constructor: { + name: "ClipboardEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/ClipboardEvent", + }, + event: { + name: "paste", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/paste_event", + }, + }, + onCompositionend: { + constructor: { + name: "CompositionEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent", + }, + event: { + name: "compositionend", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/compositionend_event", + }, + }, + onCompositionstart: { + constructor: { + name: "CompositionEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent", + }, + event: { + name: "compositionstart", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/compositionstart_event", + }, + }, + onCompositionupdate: { + constructor: { + name: "CompositionEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent", + }, + event: { + name: "compositionupdate", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/compositionupdate_event", + }, + }, + onDrag: { + constructor: { + name: "DragEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/DragEvent", + }, + event: { + name: "drag", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/drag_event", + }, + }, + onDragend: { + constructor: { + name: "DragEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/DragEvent", + }, + event: { + name: "dragend", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dragend_event", + }, + }, + onDragenter: { + constructor: { + name: "DragEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/DragEvent", + }, + event: { + name: "dragenter", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dragenter_event", + }, + }, + onDragexit: { + constructor: { + name: "DragEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/DragEvent", + }, + event: { + name: "dragexit", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dragexit_event", + }, + }, + onDragleave: { + constructor: { + name: "DragEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/DragEvent", + }, + event: { + name: "dragleave", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dragleave_event", + }, + }, + onDragover: { + constructor: { + name: "DragEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/DragEvent", + }, + event: { + name: "dragover", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dragover_event", + }, + }, + onDragstart: { + constructor: { + name: "DragEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/DragEvent", + }, + event: { + name: "dragstart", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dragstart_event", + }, + }, + onDrop: { + constructor: { + name: "DragEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/DragEvent", + }, + event: { + name: "drop", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/drop_event", + }, + }, + onFocus: { + constructor: { + name: "FocusEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/FocusEvent", + }, + event: { + name: "focus", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/focus_event", + }, + }, + onFocusin: { + constructor: { + name: "FocusEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/FocusEvent", + }, + event: { + name: "focusin", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/focusin_event", + }, + }, + onFocusout: { + constructor: { + name: "FocusEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/FocusEvent", + }, + event: { + name: "focusout", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/focusout_event", + }, + }, + onBlur: { + constructor: { + name: "FocusEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/FocusEvent", + }, + event: { + name: "blur", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/blur_event", + }, + }, + onChange: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "change", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/change_event", + }, + }, + onBeforeinput: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "beforeinput", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/beforeinput_event", + }, + }, + onInput: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "input", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/input_event", + }, + }, + onReset: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "reset", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/reset_event", + }, + }, + onSubmit: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "submit", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit_event", + }, + }, + onInvalid: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "invalid", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/invalid_event", + }, + }, + onLoad: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "load", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event", + }, + }, + onError: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "error", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/error_event", + }, + }, + onKeydown: { + constructor: { + name: "KeyboardEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent", + }, + event: { + name: "keydown", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/keydown_event", + }, + }, + onKeypress: { + constructor: { + name: "KeyboardEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent", + }, + event: { + name: "keypress", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/keypress_event", + }, + }, + onKeyup: { + constructor: { + name: "KeyboardEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent", + }, + event: { + name: "keyup", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/keyup_event", + }, + }, + onAuxclick: { + constructor: { + name: "MouseEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent", + }, + event: { + name: "auxclick", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/auxclick_event", + }, + }, + onClick: { + constructor: { + name: "MouseEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent", + }, + event: { + name: "click", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/click_event", + }, + }, + onContextmenu: { + constructor: { + name: "MouseEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent", + }, + event: { + name: "contextmenu", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/contextmenu_event", + }, + }, + onDblclick: { + constructor: { + name: "MouseEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent", + }, + event: { + name: "dblclick", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/dblclick_event", + }, + }, + onMousedown: { + constructor: { + name: "MouseEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent", + }, + event: { + name: "mousedown", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/mousedown_event", + }, + }, + onMouseenter: { + constructor: { + name: "MouseEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent", + }, + event: { + name: "mouseenter", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/mouseenter_event", + }, + }, + onMouseleave: { + constructor: { + name: "MouseEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent", + }, + event: { + name: "mouseleave", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/mouseleave_event", + }, + }, + onMousemove: { + constructor: { + name: "MouseEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent", + }, + event: { + name: "mousemove", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/mousemove_event", + }, + }, + onMouseout: { + constructor: { + name: "MouseEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent", + }, + event: { + name: "mouseout", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/mouseout_event", + }, + }, + onMouseover: { + constructor: { + name: "MouseEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent", + }, + event: { + name: "mouseover", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/mouseover_event", + }, + }, + onMouseup: { + constructor: { + name: "MouseEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent", + }, + event: { + name: "mouseup", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/mouseup_event", + }, + }, + onAbort: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "abort", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/abort_event", + }, + }, + onCanplay: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "canplay", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/canplay_event", + }, + }, + onCanplaythrough: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "canplaythrough", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/canplaythrough_event", + }, + }, + onDurationchange: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "durationchange", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/durationchange_event", + }, + }, + onEmptied: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "emptied", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/emptied_event", + }, + }, + onEncrypted: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "encrypted", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/encrypted_event", + }, + }, + onEnded: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "ended", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/ended_event", + }, + }, + onLoadeddata: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "loadeddata", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/loadeddata_event", + }, + }, + onLoadedmetadata: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "loadedmetadata", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/loadedmetadata_event", + }, + }, + onLoadstart: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "loadstart", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/loadstart_event", + }, + }, + onPause: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "pause", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/pause_event", + }, + }, + onPlay: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "play", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/play_event", + }, + }, + onPlaying: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "playing", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/playing_event", + }, + }, + onProgress: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "progress", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/progress_event", + }, + }, + onRatechange: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "ratechange", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/ratechange_event", + }, + }, + onSeeked: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "seeked", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/seeked_event", + }, + }, + onSeeking: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "seeking", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/seeking_event", + }, + }, + onStalled: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "stalled", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/stalled_event", + }, + }, + onSuspend: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "suspend", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/suspend_event", + }, + }, + onTimeupdate: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "timeupdate", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/timeupdate_event", + }, + }, + onVolumechange: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "volumechange", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/volumechange_event", + }, + }, + onWaiting: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "waiting", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/waiting_event", + }, + }, + onSelect: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "select", + url: "https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/select_event", + }, + }, + onScroll: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "scroll", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/scroll_event", + }, + }, + onScrollend: { + constructor: { name: "Event", url: "https://developer.mozilla.org/en-US/docs/Web/API/Event" }, + event: { + name: "scrollend", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollend_event", + }, + }, + onTouchcancel: { + constructor: { + name: "TouchEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent", + }, + event: { + name: "touchcancel", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/touchcancel_event", + }, + }, + onTouchend: { + constructor: { + name: "TouchEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent", + }, + event: { + name: "touchend", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/touchend_event", + }, + }, + onTouchmove: { + constructor: { + name: "TouchEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent", + }, + event: { + name: "touchmove", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/touchmove_event", + }, + }, + onTouchstart: { + constructor: { + name: "TouchEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent", + }, + event: { + name: "touchstart", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/touchstart_event", + }, + }, + onPointerdown: { + constructor: { + name: "PointerEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent", + }, + event: { + name: "pointerdown", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/pointerdown_event", + }, + }, + onPointermove: { + constructor: { + name: "PointerEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent", + }, + event: { + name: "pointermove", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/pointermove_event", + }, + }, + onPointerup: { + constructor: { + name: "PointerEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent", + }, + event: { + name: "pointerup", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/pointerup_event", + }, + }, + onPointercancel: { + constructor: { + name: "PointerEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent", + }, + event: { + name: "pointercancel", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/pointercancel_event", + }, + }, + onPointerenter: { + constructor: { + name: "PointerEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent", + }, + event: { + name: "pointerenter", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/pointerenter_event", + }, + }, + onPointerleave: { + constructor: { + name: "PointerEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent", + }, + event: { + name: "pointerleave", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/pointerleave_event", + }, + }, + onPointerover: { + constructor: { + name: "PointerEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent", + }, + event: { + name: "pointerover", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/pointerover_event", + }, + }, + onPointerout: { + constructor: { + name: "PointerEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent", + }, + event: { + name: "pointerout", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/pointerout_event", + }, + }, + onWheel: { + constructor: { + name: "WheelEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/WheelEvent", + }, + event: { + name: "wheel", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/wheel_event", + }, + }, + onAnimationstart: { + constructor: { + name: "AnimationEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/AnimationEvent", + }, + event: { + name: "animationstart", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/animationstart_event", + }, + }, + onAnimationend: { + constructor: { + name: "AnimationEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/AnimationEvent", + }, + event: { + name: "animationend", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/animationend_event", + }, + }, + onAnimationiteration: { + constructor: { + name: "AnimationEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/AnimationEvent", + }, + event: { + name: "animationiteration", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/animationiteration_event", + }, + }, + onTransitionend: { + constructor: { + name: "TransitionEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent", + }, + event: { + name: "transitionend", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/transitionend_event", + }, + }, + onTransitionstart: { + constructor: { + name: "TransitionEvent", + url: "https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent", + }, + event: { + name: "transitionstart", + url: "https://developer.mozilla.org/en-US/docs/Web/API/Element/transitionstart_event", + }, + }, +};