diff options
Diffstat (limited to 'std/types/react.d.ts')
-rw-r--r-- | std/types/react.d.ts | 3843 |
1 files changed, 3843 insertions, 0 deletions
diff --git a/std/types/react.d.ts b/std/types/react.d.ts new file mode 100644 index 000000000..b512a43a2 --- /dev/null +++ b/std/types/react.d.ts @@ -0,0 +1,3843 @@ +// These types are adapted from +// https://github.com/DefinitelyTyped/DefinitelyTyped to work under Deno. +// +// Type definitions for React 16.9 +// Project: http://facebook.github.io/react/ +// Definitions by: Asana <https://asana.com> +// AssureSign <http://www.assuresign.com> +// Microsoft <https://microsoft.com> +// John Reilly <https://github.com/johnnyreilly> +// Benoit Benezech <https://github.com/bbenezech> +// Patricio Zavolinsky <https://github.com/pzavolinsky> +// Digiguru <https://github.com/digiguru> +// Eric Anderson <https://github.com/ericanderson> +// Dovydas Navickas <https://github.com/DovydasNavickas> +// Josh Rutherford <https://github.com/theruther4d> +// Guilherme Hübner <https://github.com/guilhermehubner> +// Ferdy Budhidharma <https://github.com/ferdaber> +// Johann Rakotoharisoa <https://github.com/jrakotoharisoa> +// Olivier Pascal <https://github.com/pascaloliv> +// Martin Hochel <https://github.com/hotell> +// Frank Li <https://github.com/franklixuefei> +// Jessica Franco <https://github.com/Jessidhia> +// Saransh Kataria <https://github.com/saranshkataria> +// Kanitkorn Sujautra <https://github.com/lukyth> +// Sebastian Silbermann <https://github.com/eps1lon> +// Kyle Scully <https://github.com/zieka> +// Cong Zhang <https://github.com/dancerphil> +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +/* eslint-disable */ + +import "./react/react_global.d.ts"; + +import * as CSS from "./react/csstype.d.ts"; +import * as PropTypes from "./react/prop-types.d.ts"; + +type NativeAnimationEvent = AnimationEvent; +type NativeClipboardEvent = ClipboardEvent; +type NativeCompositionEvent = CompositionEvent; +type NativeDragEvent = DragEvent; +type NativeFocusEvent = FocusEvent; +type NativeKeyboardEvent = KeyboardEvent; +type NativeMouseEvent = MouseEvent; +type NativeTouchEvent = TouchEvent; +type NativePointerEvent = PointerEvent; +type NativeTransitionEvent = TransitionEvent; +type NativeUIEvent = UIEvent; +type NativeWheelEvent = WheelEvent; +type Booleanish = boolean | "true" | "false"; + +/** + * defined in scheduler/tracing + */ +interface SchedulerInteraction { + id: number; + name: string; + timestamp: number; +} + +// tslint:disable-next-line:export-just-namespace +export = React; +export as namespace React; + +declare namespace React { + // + // React Elements + // ---------------------------------------------------------------------- + + type ElementType<P = any> = + | { + [K in keyof JSX.IntrinsicElements]: P extends JSX.IntrinsicElements[K] + ? K + : never; + }[keyof JSX.IntrinsicElements] + | ComponentType<P>; + /** + * @deprecated Please use `ElementType` + */ + type ReactType<P = any> = ElementType<P>; + type ComponentType<P = {}> = ComponentClass<P> | FunctionComponent<P>; + + type JSXElementConstructor<P> = + | ((props: P) => ReactElement | null) + | (new (props: P) => Component<P, any>); + + type Key = string | number; + + interface RefObject<T> { + readonly current: T | null; + } + + type Ref<T> = + | { bivarianceHack(instance: T | null): void }["bivarianceHack"] + | RefObject<T> + | null; + type LegacyRef<T> = string | Ref<T>; + + type ComponentState = any; + + /** + * @internal You shouldn't need to use this type since you never see these attributes + * inside your component or have to validate them. + */ + interface Attributes { + key?: Key; + } + interface RefAttributes<T> extends Attributes { + ref?: Ref<T>; + } + interface ClassAttributes<T> extends Attributes { + ref?: LegacyRef<T>; + } + + interface ReactElement< + P = any, + T extends string | JSXElementConstructor<any> = + | string + | JSXElementConstructor<any> + > { + type: T; + props: P; + key: Key | null; + } + + interface ReactComponentElement< + T extends keyof JSX.IntrinsicElements | JSXElementConstructor<any>, + P = Pick<ComponentProps<T>, Exclude<keyof ComponentProps<T>, "key" | "ref">> + > extends ReactElement<P, T> {} + + /** + * @deprecated Please use `FunctionComponentElement` + */ + type SFCElement<P> = FunctionComponentElement<P>; + + interface FunctionComponentElement<P> + extends ReactElement<P, FunctionComponent<P>> { + ref?: "ref" extends keyof P + ? P extends { ref?: infer R } + ? R + : never + : never; + } + + type CElement<P, T extends Component<P, ComponentState>> = ComponentElement< + P, + T + >; + interface ComponentElement<P, T extends Component<P, ComponentState>> + extends ReactElement<P, ComponentClass<P>> { + ref?: LegacyRef<T>; + } + + type ClassicElement<P> = CElement<P, ClassicComponent<P, ComponentState>>; + + // string fallback for custom web-components + interface DOMElement< + P extends HTMLAttributes<T> | SVGAttributes<T>, + T extends Element + > extends ReactElement<P, string> { + ref: LegacyRef<T>; + } + + // ReactHTML for ReactHTMLElement + // tslint:disable-next-line:no-empty-interface + interface ReactHTMLElement<T extends HTMLElement> + extends DetailedReactHTMLElement<AllHTMLAttributes<T>, T> {} + + interface DetailedReactHTMLElement< + P extends HTMLAttributes<T>, + T extends HTMLElement + > extends DOMElement<P, T> { + type: keyof ReactHTML; + } + + // ReactSVG for ReactSVGElement + interface ReactSVGElement + extends DOMElement<SVGAttributes<SVGElement>, SVGElement> { + type: keyof ReactSVG; + } + + interface ReactPortal extends ReactElement { + key: Key | null; + children: ReactNode; + } + + // + // Factories + // ---------------------------------------------------------------------- + + type Factory<P> = ( + props?: Attributes & P, + ...children: ReactNode[] + ) => ReactElement<P>; + + /** + * @deprecated Please use `FunctionComponentFactory` + */ + type SFCFactory<P> = FunctionComponentFactory<P>; + + type FunctionComponentFactory<P> = ( + props?: Attributes & P, + ...children: ReactNode[] + ) => FunctionComponentElement<P>; + + type ComponentFactory<P, T extends Component<P, ComponentState>> = ( + props?: ClassAttributes<T> & P, + ...children: ReactNode[] + ) => CElement<P, T>; + + type CFactory<P, T extends Component<P, ComponentState>> = ComponentFactory< + P, + T + >; + type ClassicFactory<P> = CFactory<P, ClassicComponent<P, ComponentState>>; + + type DOMFactory<P extends DOMAttributes<T>, T extends Element> = ( + props?: (ClassAttributes<T> & P) | null, + ...children: ReactNode[] + ) => DOMElement<P, T>; + + // tslint:disable-next-line:no-empty-interface + interface HTMLFactory<T extends HTMLElement> + extends DetailedHTMLFactory<AllHTMLAttributes<T>, T> {} + + interface DetailedHTMLFactory< + P extends HTMLAttributes<T>, + T extends HTMLElement + > extends DOMFactory<P, T> { + ( + props?: (ClassAttributes<T> & P) | null, + ...children: ReactNode[] + ): DetailedReactHTMLElement<P, T>; + } + + interface SVGFactory + extends DOMFactory<SVGAttributes<SVGElement>, SVGElement> { + ( + props?: (ClassAttributes<SVGElement> & SVGAttributes<SVGElement>) | null, + ...children: ReactNode[] + ): ReactSVGElement; + } + + // + // React Nodes + // http://facebook.github.io/react/docs/glossary.html + // ---------------------------------------------------------------------- + + type ReactText = string | number; + type ReactChild = ReactElement | ReactText; + + interface ReactNodeArray extends Array<ReactNode> {} + type ReactFragment = {} | ReactNodeArray; + type ReactNode = + | ReactChild + | ReactFragment + | ReactPortal + | boolean + | null + | undefined; + + // + // Top Level API + // ---------------------------------------------------------------------- + + // DOM Elements + function createFactory<T extends HTMLElement>( + type: keyof ReactHTML + ): HTMLFactory<T>; + function createFactory(type: keyof ReactSVG): SVGFactory; + function createFactory<P extends DOMAttributes<T>, T extends Element>( + type: string + ): DOMFactory<P, T>; + + // Custom components + function createFactory<P>( + type: FunctionComponent<P> + ): FunctionComponentFactory<P>; + function createFactory<P>( + type: ClassType< + P, + ClassicComponent<P, ComponentState>, + ClassicComponentClass<P> + > + ): CFactory<P, ClassicComponent<P, ComponentState>>; + function createFactory< + P, + T extends Component<P, ComponentState>, + C extends ComponentClass<P> + >(type: ClassType<P, T, C>): CFactory<P, T>; + function createFactory<P>(type: ComponentClass<P>): Factory<P>; + + // DOM Elements + // TODO: generalize this to everything in `keyof ReactHTML`, not just "input" + function createElement( + type: "input", + props?: + | (InputHTMLAttributes<HTMLInputElement> & + ClassAttributes<HTMLInputElement>) + | null, + ...children: ReactNode[] + ): DetailedReactHTMLElement< + InputHTMLAttributes<HTMLInputElement>, + HTMLInputElement + >; + function createElement<P extends HTMLAttributes<T>, T extends HTMLElement>( + type: keyof ReactHTML, + props?: (ClassAttributes<T> & P) | null, + ...children: ReactNode[] + ): DetailedReactHTMLElement<P, T>; + function createElement<P extends SVGAttributes<T>, T extends SVGElement>( + type: keyof ReactSVG, + props?: (ClassAttributes<T> & P) | null, + ...children: ReactNode[] + ): ReactSVGElement; + function createElement<P extends DOMAttributes<T>, T extends Element>( + type: string, + props?: (ClassAttributes<T> & P) | null, + ...children: ReactNode[] + ): DOMElement<P, T>; + + // Custom components + + function createElement<P extends {}>( + type: FunctionComponent<P>, + props?: (Attributes & P) | null, + ...children: ReactNode[] + ): FunctionComponentElement<P>; + function createElement<P extends {}>( + type: ClassType< + P, + ClassicComponent<P, ComponentState>, + ClassicComponentClass<P> + >, + props?: (ClassAttributes<ClassicComponent<P, ComponentState>> & P) | null, + ...children: ReactNode[] + ): CElement<P, ClassicComponent<P, ComponentState>>; + function createElement< + P extends {}, + T extends Component<P, ComponentState>, + C extends ComponentClass<P> + >( + type: ClassType<P, T, C>, + props?: (ClassAttributes<T> & P) | null, + ...children: ReactNode[] + ): CElement<P, T>; + function createElement<P extends {}>( + type: FunctionComponent<P> | ComponentClass<P> | string, + props?: (Attributes & P) | null, + ...children: ReactNode[] + ): ReactElement<P>; + + // DOM Elements + // ReactHTMLElement + function cloneElement<P extends HTMLAttributes<T>, T extends HTMLElement>( + element: DetailedReactHTMLElement<P, T>, + props?: P, + ...children: ReactNode[] + ): DetailedReactHTMLElement<P, T>; + // ReactHTMLElement, less specific + function cloneElement<P extends HTMLAttributes<T>, T extends HTMLElement>( + element: ReactHTMLElement<T>, + props?: P, + ...children: ReactNode[] + ): ReactHTMLElement<T>; + // SVGElement + function cloneElement<P extends SVGAttributes<T>, T extends SVGElement>( + element: ReactSVGElement, + props?: P, + ...children: ReactNode[] + ): ReactSVGElement; + // DOM Element (has to be the last, because type checking stops at first overload that fits) + function cloneElement<P extends DOMAttributes<T>, T extends Element>( + element: DOMElement<P, T>, + props?: DOMAttributes<T> & P, + ...children: ReactNode[] + ): DOMElement<P, T>; + + // Custom components + function cloneElement<P>( + element: FunctionComponentElement<P>, + props?: Partial<P> & Attributes, + ...children: ReactNode[] + ): FunctionComponentElement<P>; + function cloneElement<P, T extends Component<P, ComponentState>>( + element: CElement<P, T>, + props?: Partial<P> & ClassAttributes<T>, + ...children: ReactNode[] + ): CElement<P, T>; + function cloneElement<P>( + element: ReactElement<P>, + props?: Partial<P> & Attributes, + ...children: ReactNode[] + ): ReactElement<P>; + + // Context via RenderProps + interface ProviderProps<T> { + value: T; + children?: ReactNode; + } + + interface ConsumerProps<T> { + children: (value: T) => ReactNode; + unstable_observedBits?: number; + } + + // TODO: similar to how Fragment is actually a symbol, the values returned from createContext, + // forwardRef and memo are actually objects that are treated specially by the renderer; see: + // https://github.com/facebook/react/blob/v16.6.0/packages/react/src/ReactContext.js#L35-L48 + // https://github.com/facebook/react/blob/v16.6.0/packages/react/src/forwardRef.js#L42-L45 + // https://github.com/facebook/react/blob/v16.6.0/packages/react/src/memo.js#L27-L31 + // However, we have no way of telling the JSX parser that it's a JSX element type or its props other than + // by pretending to be a normal component. + // + // We don't just use ComponentType or SFC types because you are not supposed to attach statics to this + // object, but rather to the original function. + interface ExoticComponent<P = {}> { + /** + * **NOTE**: Exotic components are not callable. + */ + (props: P): ReactElement | null; + readonly $$typeof: symbol; + } + + interface NamedExoticComponent<P = {}> extends ExoticComponent<P> { + displayName?: string; + } + + interface ProviderExoticComponent<P> extends ExoticComponent<P> { + propTypes?: WeakValidationMap<P>; + } + + type ContextType<C extends Context<any>> = C extends Context<infer T> + ? T + : never; + + // NOTE: only the Context object itself can get a displayName + // https://github.com/facebook/react-devtools/blob/e0b854e4c/backend/attachRendererFiber.js#L310-L325 + type Provider<T> = ProviderExoticComponent<ProviderProps<T>>; + type Consumer<T> = ExoticComponent<ConsumerProps<T>>; + interface Context<T> { + Provider: Provider<T>; + Consumer: Consumer<T>; + displayName?: string; + } + function createContext<T>( + // If you thought this should be optional, see + // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/24509#issuecomment-382213106 + defaultValue: T, + calculateChangedBits?: (prev: T, next: T) => number + ): Context<T>; + + function isValidElement<P>( + object: {} | null | undefined + ): object is ReactElement<P>; + + const Children: ReactChildren; + const Fragment: ExoticComponent<{ children?: ReactNode }>; + const StrictMode: ExoticComponent<{ children?: ReactNode }>; + + interface SuspenseProps { + children?: ReactNode; + + /** A fallback react tree to show when a Suspense child (like React.lazy) suspends */ + fallback: NonNullable<ReactNode> | null; + /** + * Tells React whether to “skip” revealing this boundary during the initial load. + * This API will likely be removed in a future release. + */ + // NOTE: this is unflagged and is respected even in stable builds + unstable_avoidThisFallback?: boolean; + } + /** + * This feature is not yet available for server-side rendering. + * Suspense support will be added in a later release. + */ + const Suspense: ExoticComponent<SuspenseProps>; + const version: string; + + /** + * {@link https://github.com/bvaughn/rfcs/blob/profiler/text/0000-profiler.md#detailed-design | API} + */ + type ProfilerOnRenderCallback = ( + id: string, + phase: "mount" | "update", + actualDuration: number, + baseDuration: number, + startTime: number, + commitTime: number, + interactions: Set<SchedulerInteraction> + ) => void; + interface ProfilerProps { + children?: ReactNode; + id: string; + onRender: ProfilerOnRenderCallback; + } + + const Profiler: ExoticComponent<ProfilerProps>; + + // + // Component API + // ---------------------------------------------------------------------- + + type ReactInstance = Component<any> | Element; + + // Base component for plain JS classes + // tslint:disable-next-line:no-empty-interface + interface Component<P = {}, S = {}, SS = any> + extends ComponentLifecycle<P, S, SS> {} + class Component<P, S> { + // tslint won't let me format the sample code in a way that vscode likes it :( + /** + * If set, `this.context` will be set at runtime to the current value of the given Context. + * + * Usage: + * + * ```ts + * type MyContext = number + * const Ctx = React.createContext<MyContext>(0) + * + * class Foo extends React.Component { + * static contextType = Ctx + * context!: React.ContextType<typeof Ctx> + * render () { + * return <>My context's value: {this.context}</>; + * } + * } + * ``` + * + * @see https://reactjs.org/docs/context.html#classcontexttype + */ + static contextType?: Context<any>; + + /** + * If using the new style context, re-declare this in your class to be the + * `React.ContextType` of your `static contextType`. + * Should be used with type annotation or static contextType. + * + * ```ts + * static contextType = MyContext + * // For TS pre-3.7: + * context!: React.ContextType<typeof MyContext> + * // For TS 3.7 and above: + * declare context: React.ContextType<typeof MyContext> + * ``` + * + * @see https://reactjs.org/docs/context.html + */ + // TODO (TypeScript 3.0): unknown + context: any; + + constructor(props: Readonly<P>); + /** + * @deprecated + * @see https://reactjs.org/docs/legacy-context.html + */ + constructor(props: P, context?: any); + + // We MUST keep setState() as a unified signature because it allows proper checking of the method return type. + // See: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/18365#issuecomment-351013257 + // Also, the ` | S` allows intellisense to not be dumbisense + setState<K extends keyof S>( + state: + | (( + prevState: Readonly<S>, + props: Readonly<P> + ) => Pick<S, K> | S | null) + | (Pick<S, K> | S | null), + callback?: () => void + ): void; + + forceUpdate(callback?: () => void): void; + render(): ReactNode; + + // React.Props<T> is now deprecated, which means that the `children` + // property is not available on `P` by default, even though you can + // always pass children as variadic arguments to `createElement`. + // In the future, if we can define its call signature conditionally + // on the existence of `children` in `P`, then we should remove this. + readonly props: Readonly<P> & Readonly<{ children?: ReactNode }>; + state: Readonly<S>; + /** + * @deprecated + * https://reactjs.org/docs/refs-and-the-dom.html#legacy-api-string-refs + */ + refs: { + [key: string]: ReactInstance; + }; + } + + class PureComponent<P = {}, S = {}, SS = any> extends Component<P, S, SS> {} + + interface ClassicComponent<P = {}, S = {}> extends Component<P, S> { + replaceState(nextState: S, callback?: () => void): void; + isMounted(): boolean; + getInitialState?(): S; + } + + interface ChildContextProvider<CC> { + getChildContext(): CC; + } + + // + // Class Interfaces + // ---------------------------------------------------------------------- + + /** + * @deprecated as of recent React versions, function components can no + * longer be considered 'stateless'. Please use `FunctionComponent` instead. + * + * @see [React Hooks](https://reactjs.org/docs/hooks-intro.html) + */ + type SFC<P = {}> = FunctionComponent<P>; + + /** + * @deprecated as of recent React versions, function components can no + * longer be considered 'stateless'. Please use `FunctionComponent` instead. + * + * @see [React Hooks](https://reactjs.org/docs/hooks-intro.html) + */ + type StatelessComponent<P = {}> = FunctionComponent<P>; + + type FC<P = {}> = FunctionComponent<P>; + + interface FunctionComponent<P = {}> { + (props: PropsWithChildren<P>, context?: any): ReactElement | null; + propTypes?: WeakValidationMap<P>; + contextTypes?: ValidationMap<any>; + defaultProps?: Partial<P>; + displayName?: string; + } + + interface RefForwardingComponent<T, P = {}> { + (props: PropsWithChildren<P>, ref: Ref<T>): ReactElement | null; + propTypes?: WeakValidationMap<P>; + contextTypes?: ValidationMap<any>; + defaultProps?: Partial<P>; + displayName?: string; + } + + interface ComponentClass<P = {}, S = ComponentState> + extends StaticLifecycle<P, S> { + new (props: P, context?: any): Component<P, S>; + propTypes?: WeakValidationMap<P>; + contextType?: Context<any>; + contextTypes?: ValidationMap<any>; + childContextTypes?: ValidationMap<any>; + defaultProps?: Partial<P>; + displayName?: string; + } + + interface ClassicComponentClass<P = {}> extends ComponentClass<P> { + new (props: P, context?: any): ClassicComponent<P, ComponentState>; + getDefaultProps?(): P; + } + + /** + * We use an intersection type to infer multiple type parameters from + * a single argument, which is useful for many top-level API defs. + * See https://github.com/Microsoft/TypeScript/issues/7234 for more info. + */ + type ClassType< + P, + T extends Component<P, ComponentState>, + C extends ComponentClass<P> + > = C & (new (props: P, context?: any) => T); + + // + // Component Specs and Lifecycle + // ---------------------------------------------------------------------- + + // This should actually be something like `Lifecycle<P, S> | DeprecatedLifecycle<P, S>`, + // as React will _not_ call the deprecated lifecycle methods if any of the new lifecycle + // methods are present. + interface ComponentLifecycle<P, S, SS = any> + extends NewLifecycle<P, S, SS>, + DeprecatedLifecycle<P, S> { + /** + * Called immediately after a component is mounted. Setting state here will trigger re-rendering. + */ + componentDidMount?(): void; + /** + * Called to determine whether the change in props and state should trigger a re-render. + * + * `Component` always returns true. + * `PureComponent` implements a shallow comparison on props and state and returns true if any + * props or states have changed. + * + * If false is returned, `Component#render`, `componentWillUpdate` + * and `componentDidUpdate` will not be called. + */ + shouldComponentUpdate?( + nextProps: Readonly<P>, + nextState: Readonly<S>, + nextContext: any + ): boolean; + /** + * Called immediately before a component is destroyed. Perform any necessary cleanup in this method, such as + * cancelled network requests, or cleaning up any DOM elements created in `componentDidMount`. + */ + componentWillUnmount?(): void; + /** + * Catches exceptions generated in descendant components. Unhandled exceptions will cause + * the entire component tree to unmount. + */ + componentDidCatch?(error: Error, errorInfo: ErrorInfo): void; + } + + // Unfortunately, we have no way of declaring that the component constructor must implement this + interface StaticLifecycle<P, S> { + getDerivedStateFromProps?: GetDerivedStateFromProps<P, S>; + getDerivedStateFromError?: GetDerivedStateFromError<P, S>; + } + + type GetDerivedStateFromProps<P, S> = + /** + * Returns an update to a component's state based on its new props and old state. + * + * Note: its presence prevents any of the deprecated lifecycle methods from being invoked + */ + (nextProps: Readonly<P>, prevState: S) => Partial<S> | null; + + type GetDerivedStateFromError<P, S> = + /** + * This lifecycle is invoked after an error has been thrown by a descendant component. + * It receives the error that was thrown as a parameter and should return a value to update state. + * + * Note: its presence prevents any of the deprecated lifecycle methods from being invoked + */ + (error: any) => Partial<S> | null; + + // This should be "infer SS" but can't use it yet + interface NewLifecycle<P, S, SS> { + /** + * Runs before React applies the result of `render` to the document, and + * returns an object to be given to componentDidUpdate. Useful for saving + * things such as scroll position before `render` causes changes to it. + * + * Note: the presence of getSnapshotBeforeUpdate prevents any of the deprecated + * lifecycle events from running. + */ + getSnapshotBeforeUpdate?( + prevProps: Readonly<P>, + prevState: Readonly<S> + ): SS | null; + /** + * Called immediately after updating occurs. Not called for the initial render. + * + * The snapshot is only present if getSnapshotBeforeUpdate is present and returns non-null. + */ + componentDidUpdate?( + prevProps: Readonly<P>, + prevState: Readonly<S>, + snapshot?: SS + ): void; + } + + interface DeprecatedLifecycle<P, S> { + /** + * Called immediately before mounting occurs, and before `Component#render`. + * Avoid introducing any side-effects or subscriptions in this method. + * + * Note: the presence of getSnapshotBeforeUpdate or getDerivedStateFromProps + * prevents this from being invoked. + * + * @deprecated 16.3, use componentDidMount or the constructor instead; will stop working in React 17 + * @see https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html#initializing-state + * @see https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html#gradual-migration-path + */ + componentWillMount?(): void; + /** + * Called immediately before mounting occurs, and before `Component#render`. + * Avoid introducing any side-effects or subscriptions in this method. + * + * This method will not stop working in React 17. + * + * Note: the presence of getSnapshotBeforeUpdate or getDerivedStateFromProps + * prevents this from being invoked. + * + * @deprecated 16.3, use componentDidMount or the constructor instead + * @see https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html#initializing-state + * @see https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html#gradual-migration-path + */ + UNSAFE_componentWillMount?(): void; + /** + * Called when the component may be receiving new props. + * React may call this even if props have not changed, so be sure to compare new and existing + * props if you only want to handle changes. + * + * Calling `Component#setState` generally does not trigger this method. + * + * Note: the presence of getSnapshotBeforeUpdate or getDerivedStateFromProps + * prevents this from being invoked. + * + * @deprecated 16.3, use static getDerivedStateFromProps instead; will stop working in React 17 + * @see https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html#updating-state-based-on-props + * @see https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html#gradual-migration-path + */ + componentWillReceiveProps?(nextProps: Readonly<P>, nextContext: any): void; + /** + * Called when the component may be receiving new props. + * React may call this even if props have not changed, so be sure to compare new and existing + * props if you only want to handle changes. + * + * Calling `Component#setState` generally does not trigger this method. + * + * This method will not stop working in React 17. + * + * Note: the presence of getSnapshotBeforeUpdate or getDerivedStateFromProps + * prevents this from being invoked. + * + * @deprecated 16.3, use static getDerivedStateFromProps instead + * @see https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html#updating-state-based-on-props + * @see https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html#gradual-migration-path + */ + UNSAFE_componentWillReceiveProps?( + nextProps: Readonly<P>, + nextContext: any + ): void; + /** + * Called immediately before rendering when new props or state is received. Not called for the initial render. + * + * Note: You cannot call `Component#setState` here. + * + * Note: the presence of getSnapshotBeforeUpdate or getDerivedStateFromProps + * prevents this from being invoked. + * + * @deprecated 16.3, use getSnapshotBeforeUpdate instead; will stop working in React 17 + * @see https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html#reading-dom-properties-before-an-update + * @see https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html#gradual-migration-path + */ + componentWillUpdate?( + nextProps: Readonly<P>, + nextState: Readonly<S>, + nextContext: any + ): void; + /** + * Called immediately before rendering when new props or state is received. Not called for the initial render. + * + * Note: You cannot call `Component#setState` here. + * + * This method will not stop working in React 17. + * + * Note: the presence of getSnapshotBeforeUpdate or getDerivedStateFromProps + * prevents this from being invoked. + * + * @deprecated 16.3, use getSnapshotBeforeUpdate instead + * @see https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html#reading-dom-properties-before-an-update + * @see https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html#gradual-migration-path + */ + UNSAFE_componentWillUpdate?( + nextProps: Readonly<P>, + nextState: Readonly<S>, + nextContext: any + ): void; + } + + interface Mixin<P, S> extends ComponentLifecycle<P, S> { + mixins?: Array<Mixin<P, S>>; + statics?: { + [key: string]: any; + }; + + displayName?: string; + propTypes?: ValidationMap<any>; + contextTypes?: ValidationMap<any>; + childContextTypes?: ValidationMap<any>; + + getDefaultProps?(): P; + getInitialState?(): S; + } + + interface ComponentSpec<P, S> extends Mixin<P, S> { + render(): ReactNode; + + [propertyName: string]: any; + } + + function createRef<T>(): RefObject<T>; + + // will show `ForwardRef(${Component.displayName || Component.name})` in devtools by default, + // but can be given its own specific name + interface ForwardRefExoticComponent<P> extends NamedExoticComponent<P> { + defaultProps?: Partial<P>; + propTypes?: WeakValidationMap<P>; + } + + function forwardRef<T, P = {}>( + Component: RefForwardingComponent<T, P> + ): ForwardRefExoticComponent<PropsWithoutRef<P> & RefAttributes<T>>; + + /** Ensures that the props do not include ref at all */ + type PropsWithoutRef<P> = + // Just Pick would be sufficient for this, but I'm trying to avoid unnecessary mapping over union types + // https://github.com/Microsoft/TypeScript/issues/28339 + "ref" extends keyof P ? Pick<P, Exclude<keyof P, "ref">> : P; + /** Ensures that the props do not include string ref, which cannot be forwarded */ + type PropsWithRef<P> = + // Just "P extends { ref?: infer R }" looks sufficient, but R will infer as {} if P is {}. + "ref" extends keyof P + ? P extends { ref?: infer R } + ? string extends R + ? PropsWithoutRef<P> & { ref?: Exclude<R, string> } + : P + : P + : P; + + type PropsWithChildren<P> = P & { children?: ReactNode }; + + /** + * NOTE: prefer ComponentPropsWithRef, if the ref is forwarded, + * or ComponentPropsWithoutRef when refs are not supported. + */ + type ComponentProps< + T extends keyof JSX.IntrinsicElements | JSXElementConstructor<any> + > = T extends JSXElementConstructor<infer P> + ? P + : T extends keyof JSX.IntrinsicElements + ? JSX.IntrinsicElements[T] + : {}; + type ComponentPropsWithRef<T extends ElementType> = T extends ComponentClass< + infer P + > + ? PropsWithoutRef<P> & RefAttributes<InstanceType<T>> + : PropsWithRef<ComponentProps<T>>; + type ComponentPropsWithoutRef<T extends ElementType> = PropsWithoutRef< + ComponentProps<T> + >; + + // will show `Memo(${Component.displayName || Component.name})` in devtools by default, + // but can be given its own specific name + type MemoExoticComponent<T extends ComponentType<any>> = NamedExoticComponent< + ComponentPropsWithRef<T> + > & { + readonly type: T; + }; + + function memo<P extends object>( + Component: SFC<P>, + propsAreEqual?: ( + prevProps: Readonly<PropsWithChildren<P>>, + nextProps: Readonly<PropsWithChildren<P>> + ) => boolean + ): NamedExoticComponent<P>; + function memo<T extends ComponentType<any>>( + Component: T, + propsAreEqual?: ( + prevProps: Readonly<ComponentProps<T>>, + nextProps: Readonly<ComponentProps<T>> + ) => boolean + ): MemoExoticComponent<T>; + + type LazyExoticComponent<T extends ComponentType<any>> = ExoticComponent< + ComponentPropsWithRef<T> + > & { + readonly _result: T; + }; + + function lazy<T extends ComponentType<any>>( + factory: () => Promise<{ default: T }> + ): LazyExoticComponent<T>; + + // + // React Hooks + // ---------------------------------------------------------------------- + + // based on the code in https://github.com/facebook/react/pull/13968 + + // Unlike the class component setState, the updates are not allowed to be partial + type SetStateAction<S> = S | ((prevState: S) => S); + // this technically does accept a second argument, but it's already under a deprecation warning + // and it's not even released so probably better to not define it. + type Dispatch<A> = (value: A) => void; + // Since action _can_ be undefined, dispatch may be called without any parameters. + type DispatchWithoutAction = () => void; + // Unlike redux, the actions _can_ be anything + type Reducer<S, A> = (prevState: S, action: A) => S; + // If useReducer accepts a reducer without action, dispatch may be called without any parameters. + type ReducerWithoutAction<S> = (prevState: S) => S; + // types used to try and prevent the compiler from reducing S + // to a supertype common with the second argument to useReducer() + type ReducerState<R extends Reducer<any, any>> = R extends Reducer< + infer S, + any + > + ? S + : never; + type ReducerAction<R extends Reducer<any, any>> = R extends Reducer< + any, + infer A + > + ? A + : never; + // The identity check is done with the SameValue algorithm (Object.is), which is stricter than === + type ReducerStateWithoutAction< + R extends ReducerWithoutAction<any> + > = R extends ReducerWithoutAction<infer S> ? S : never; + // TODO (TypeScript 3.0): ReadonlyArray<unknown> + type DependencyList = ReadonlyArray<any>; + + // NOTE: callbacks are _only_ allowed to return either void, or a destructor. + // The destructor is itself only allowed to return void. + type EffectCallback = () => void | (() => void | undefined); + + interface MutableRefObject<T> { + current: T; + } + + // This will technically work if you give a Consumer<T> or Provider<T> but it's deprecated and warns + /** + * Accepts a context object (the value returned from `React.createContext`) and returns the current + * context value, as given by the nearest context provider for the given context. + * + * @version 16.8.0 + * @see https://reactjs.org/docs/hooks-reference.html#usecontext + */ + function useContext<T>( + context: Context<T> /*, (not public API) observedBits?: number|boolean */ + ): T; + /** + * Returns a stateful value, and a function to update it. + * + * @version 16.8.0 + * @see https://reactjs.org/docs/hooks-reference.html#usestate + */ + function useState<S>( + initialState: S | (() => S) + ): [S, Dispatch<SetStateAction<S>>]; + // convenience overload when first argument is ommitted + /** + * Returns a stateful value, and a function to update it. + * + * @version 16.8.0 + * @see https://reactjs.org/docs/hooks-reference.html#usestate + */ + function useState<S = undefined>(): [ + S | undefined, + Dispatch<SetStateAction<S | undefined>> + ]; + /** + * An alternative to `useState`. + * + * `useReducer` is usually preferable to `useState` when you have complex state logic that involves + * multiple sub-values. It also lets you optimize performance for components that trigger deep + * updates because you can pass `dispatch` down instead of callbacks. + * + * @version 16.8.0 + * @see https://reactjs.org/docs/hooks-reference.html#usereducer + */ + // overload where dispatch could accept 0 arguments. + function useReducer<R extends ReducerWithoutAction<any>, I>( + reducer: R, + initializerArg: I, + initializer: (arg: I) => ReducerStateWithoutAction<R> + ): [ReducerStateWithoutAction<R>, DispatchWithoutAction]; + /** + * An alternative to `useState`. + * + * `useReducer` is usually preferable to `useState` when you have complex state logic that involves + * multiple sub-values. It also lets you optimize performance for components that trigger deep + * updates because you can pass `dispatch` down instead of callbacks. + * + * @version 16.8.0 + * @see https://reactjs.org/docs/hooks-reference.html#usereducer + */ + // overload where dispatch could accept 0 arguments. + function useReducer<R extends ReducerWithoutAction<any>>( + reducer: R, + initializerArg: ReducerStateWithoutAction<R>, + initializer?: undefined + ): [ReducerStateWithoutAction<R>, DispatchWithoutAction]; + /** + * An alternative to `useState`. + * + * `useReducer` is usually preferable to `useState` when you have complex state logic that involves + * multiple sub-values. It also lets you optimize performance for components that trigger deep + * updates because you can pass `dispatch` down instead of callbacks. + * + * @version 16.8.0 + * @see https://reactjs.org/docs/hooks-reference.html#usereducer + */ + // overload where "I" may be a subset of ReducerState<R>; used to provide autocompletion. + // If "I" matches ReducerState<R> exactly then the last overload will allow initializer to be ommitted. + // the last overload effectively behaves as if the identity function (x => x) is the initializer. + function useReducer<R extends Reducer<any, any>, I>( + reducer: R, + initializerArg: I & ReducerState<R>, + initializer: (arg: I & ReducerState<R>) => ReducerState<R> + ): [ReducerState<R>, Dispatch<ReducerAction<R>>]; + /** + * An alternative to `useState`. + * + * `useReducer` is usually preferable to `useState` when you have complex state logic that involves + * multiple sub-values. It also lets you optimize performance for components that trigger deep + * updates because you can pass `dispatch` down instead of callbacks. + * + * @version 16.8.0 + * @see https://reactjs.org/docs/hooks-reference.html#usereducer + */ + // overload for free "I"; all goes as long as initializer converts it into "ReducerState<R>". + function useReducer<R extends Reducer<any, any>, I>( + reducer: R, + initializerArg: I, + initializer: (arg: I) => ReducerState<R> + ): [ReducerState<R>, Dispatch<ReducerAction<R>>]; + /** + * An alternative to `useState`. + * + * `useReducer` is usually preferable to `useState` when you have complex state logic that involves + * multiple sub-values. It also lets you optimize performance for components that trigger deep + * updates because you can pass `dispatch` down instead of callbacks. + * + * @version 16.8.0 + * @see https://reactjs.org/docs/hooks-reference.html#usereducer + */ + + // I'm not sure if I keep this 2-ary or if I make it (2,3)-ary; it's currently (2,3)-ary. + // The Flow types do have an overload for 3-ary invocation with undefined initializer. + + // NOTE: without the ReducerState indirection, TypeScript would reduce S to be the most common + // supertype between the reducer's return type and the initialState (or the initializer's return type), + // which would prevent autocompletion from ever working. + + // TODO: double-check if this weird overload logic is necessary. It is possible it's either a bug + // in older versions, or a regression in newer versions of the typescript completion service. + function useReducer<R extends Reducer<any, any>>( + reducer: R, + initialState: ReducerState<R>, + initializer?: undefined + ): [ReducerState<R>, Dispatch<ReducerAction<R>>]; + /** + * `useRef` returns a mutable ref object whose `.current` property is initialized to the passed argument + * (`initialValue`). The returned object will persist for the full lifetime of the component. + * + * Note that `useRef()` is useful for more than the `ref` attribute. It’s handy for keeping any mutable + * value around similar to how you’d use instance fields in classes. + * + * @version 16.8.0 + * @see https://reactjs.org/docs/hooks-reference.html#useref + */ + // TODO (TypeScript 3.0): <T extends unknown> + function useRef<T>(initialValue: T): MutableRefObject<T>; + // convenience overload for refs given as a ref prop as they typically start with a null value + /** + * `useRef` returns a mutable ref object whose `.current` property is initialized to the passed argument + * (`initialValue`). The returned object will persist for the full lifetime of the component. + * + * Note that `useRef()` is useful for more than the `ref` attribute. It’s handy for keeping any mutable + * value around similar to how you’d use instance fields in classes. + * + * Usage note: if you need the result of useRef to be directly mutable, include `| null` in the type + * of the generic argument. + * + * @version 16.8.0 + * @see https://reactjs.org/docs/hooks-reference.html#useref + */ + // TODO (TypeScript 3.0): <T extends unknown> + function useRef<T>(initialValue: T | null): RefObject<T>; + // convenience overload for potentially undefined initialValue / call with 0 arguments + // has a default to stop it from defaulting to {} instead + /** + * `useRef` returns a mutable ref object whose `.current` property is initialized to the passed argument + * (`initialValue`). The returned object will persist for the full lifetime of the component. + * + * Note that `useRef()` is useful for more than the `ref` attribute. It’s handy for keeping any mutable + * value around similar to how you’d use instance fields in classes. + * + * @version 16.8.0 + * @see https://reactjs.org/docs/hooks-reference.html#useref + */ + // TODO (TypeScript 3.0): <T extends unknown> + function useRef<T = undefined>(): MutableRefObject<T | undefined>; + /** + * The signature is identical to `useEffect`, but it fires synchronously after all DOM mutations. + * Use this to read layout from the DOM and synchronously re-render. Updates scheduled inside + * `useLayoutEffect` will be flushed synchronously, before the browser has a chance to paint. + * + * Prefer the standard `useEffect` when possible to avoid blocking visual updates. + * + * If you’re migrating code from a class component, `useLayoutEffect` fires in the same phase as + * `componentDidMount` and `componentDidUpdate`. + * + * @version 16.8.0 + * @see https://reactjs.org/docs/hooks-reference.html#uselayouteffect + */ + function useLayoutEffect(effect: EffectCallback, deps?: DependencyList): void; + /** + * Accepts a function that contains imperative, possibly effectful code. + * + * @param effect Imperative function that can return a cleanup function + * @param deps If present, effect will only activate if the values in the list change. + * + * @version 16.8.0 + * @see https://reactjs.org/docs/hooks-reference.html#useeffect + */ + function useEffect(effect: EffectCallback, deps?: DependencyList): void; + // NOTE: this does not accept strings, but this will have to be fixed by removing strings from type Ref<T> + /** + * `useImperativeHandle` customizes the instance value that is exposed to parent components when using + * `ref`. As always, imperative code using refs should be avoided in most cases. + * + * `useImperativeHandle` should be used with `React.forwardRef`. + * + * @version 16.8.0 + * @see https://reactjs.org/docs/hooks-reference.html#useimperativehandle + */ + function useImperativeHandle<T, R extends T>( + ref: Ref<T> | undefined, + init: () => R, + deps?: DependencyList + ): void; + // I made 'inputs' required here and in useMemo as there's no point to memoizing without the memoization key + // useCallback(X) is identical to just using X, useMemo(() => Y) is identical to just using Y. + /** + * `useCallback` will return a memoized version of the callback that only changes if one of the `inputs` + * has changed. + * + * @version 16.8.0 + * @see https://reactjs.org/docs/hooks-reference.html#usecallback + */ + // TODO (TypeScript 3.0): <T extends (...args: never[]) => unknown> + function useCallback<T extends (...args: any[]) => any>( + callback: T, + deps: DependencyList + ): T; + /** + * `useMemo` will only recompute the memoized value when one of the `deps` has changed. + * + * Usage note: if calling `useMemo` with a referentially stable function, also give it as the input in + * the second argument. + * + * ```ts + * function expensive () { ... } + * + * function Component () { + * const expensiveResult = useMemo(expensive, [expensive]) + * return ... + * } + * ``` + * + * @version 16.8.0 + * @see https://reactjs.org/docs/hooks-reference.html#usememo + */ + // allow undefined, but don't make it optional as that is very likely a mistake + function useMemo<T>(factory: () => T, deps: DependencyList | undefined): T; + /** + * `useDebugValue` can be used to display a label for custom hooks in React DevTools. + * + * NOTE: We don’t recommend adding debug values to every custom hook. + * It’s most valuable for custom hooks that are part of shared libraries. + * + * @version 16.8.0 + * @see https://reactjs.org/docs/hooks-reference.html#usedebugvalue + */ + // the name of the custom hook is itself derived from the function name at runtime: + // it's just the function name without the "use" prefix. + function useDebugValue<T>(value: T, format?: (value: T) => any): void; + + // + // Event System + // ---------------------------------------------------------------------- + // TODO: change any to unknown when moving to TS v3 + interface BaseSyntheticEvent<E = object, C = any, T = any> { + nativeEvent: E; + currentTarget: C; + target: T; + bubbles: boolean; + cancelable: boolean; + defaultPrevented: boolean; + eventPhase: number; + isTrusted: boolean; + preventDefault(): void; + isDefaultPrevented(): boolean; + stopPropagation(): void; + isPropagationStopped(): boolean; + persist(): void; + timeStamp: number; + type: string; + } + + /** + * currentTarget - a reference to the element on which the event listener is registered. + * + * target - a reference to the element from which the event was originally dispatched. + * This might be a child element to the element on which the event listener is registered. + * If you thought this should be `EventTarget & T`, see https://github.com/DefinitelyTyped/DefinitelyTyped/pull/12239 + */ + interface SyntheticEvent<T = Element, E = Event> + extends BaseSyntheticEvent<E, EventTarget & T, EventTarget> {} + + interface ClipboardEvent<T = Element> + extends SyntheticEvent<T, NativeClipboardEvent> { + clipboardData: DataTransfer; + } + + interface CompositionEvent<T = Element> + extends SyntheticEvent<T, NativeCompositionEvent> { + data: string; + } + + interface DragEvent<T = Element> extends MouseEvent<T, NativeDragEvent> { + dataTransfer: DataTransfer; + } + + interface PointerEvent<T = Element> + extends MouseEvent<T, NativePointerEvent> { + pointerId: number; + pressure: number; + tiltX: number; + tiltY: number; + width: number; + height: number; + pointerType: "mouse" | "pen" | "touch"; + isPrimary: boolean; + } + + interface FocusEvent<T = Element> + extends SyntheticEvent<T, NativeFocusEvent> { + relatedTarget: EventTarget | null; + target: EventTarget & T; + } + + // tslint:disable-next-line:no-empty-interface + interface FormEvent<T = Element> extends SyntheticEvent<T> {} + + interface InvalidEvent<T = Element> extends SyntheticEvent<T> { + target: EventTarget & T; + } + + interface ChangeEvent<T = Element> extends SyntheticEvent<T> { + target: EventTarget & T; + } + + interface KeyboardEvent<T = Element> + extends SyntheticEvent<T, NativeKeyboardEvent> { + altKey: boolean; + charCode: number; + ctrlKey: boolean; + /** + * See [DOM Level 3 Events spec](https://www.w3.org/TR/uievents-key/#keys-modifier). for a list of valid (case-sensitive) arguments to this method. + */ + getModifierState(key: string): boolean; + /** + * See the [DOM Level 3 Events spec](https://www.w3.org/TR/uievents-key/#named-key-attribute-values). for possible values + */ + key: string; + keyCode: number; + locale: string; + location: number; + metaKey: boolean; + repeat: boolean; + shiftKey: boolean; + which: number; + } + + interface MouseEvent<T = Element, E = NativeMouseEvent> + extends SyntheticEvent<T, E> { + altKey: boolean; + button: number; + buttons: number; + clientX: number; + clientY: number; + ctrlKey: boolean; + /** + * See [DOM Level 3 Events spec](https://www.w3.org/TR/uievents-key/#keys-modifier). for a list of valid (case-sensitive) arguments to this method. + */ + getModifierState(key: string): boolean; + metaKey: boolean; + movementX: number; + movementY: number; + pageX: number; + pageY: number; + relatedTarget: EventTarget | null; + screenX: number; + screenY: number; + shiftKey: boolean; + } + + interface TouchEvent<T = Element> + extends SyntheticEvent<T, NativeTouchEvent> { + altKey: boolean; + changedTouches: TouchList; + ctrlKey: boolean; + /** + * See [DOM Level 3 Events spec](https://www.w3.org/TR/uievents-key/#keys-modifier). for a list of valid (case-sensitive) arguments to this method. + */ + getModifierState(key: string): boolean; + metaKey: boolean; + shiftKey: boolean; + targetTouches: TouchList; + touches: TouchList; + } + + interface UIEvent<T = Element> extends SyntheticEvent<T, NativeUIEvent> { + detail: number; + view: AbstractView; + } + + interface WheelEvent<T = Element> extends MouseEvent<T, NativeWheelEvent> { + deltaMode: number; + deltaX: number; + deltaY: number; + deltaZ: number; + } + + interface AnimationEvent<T = Element> + extends SyntheticEvent<T, NativeAnimationEvent> { + animationName: string; + elapsedTime: number; + pseudoElement: string; + } + + interface TransitionEvent<T = Element> + extends SyntheticEvent<T, NativeTransitionEvent> { + elapsedTime: number; + propertyName: string; + pseudoElement: string; + } + + // + // Event Handler Types + // ---------------------------------------------------------------------- + + type EventHandler<E extends SyntheticEvent<any>> = { + bivarianceHack(event: E): void; + }["bivarianceHack"]; + + type ReactEventHandler<T = Element> = EventHandler<SyntheticEvent<T>>; + + type ClipboardEventHandler<T = Element> = EventHandler<ClipboardEvent<T>>; + type CompositionEventHandler<T = Element> = EventHandler<CompositionEvent<T>>; + type DragEventHandler<T = Element> = EventHandler<DragEvent<T>>; + type FocusEventHandler<T = Element> = EventHandler<FocusEvent<T>>; + type FormEventHandler<T = Element> = EventHandler<FormEvent<T>>; + type ChangeEventHandler<T = Element> = EventHandler<ChangeEvent<T>>; + type KeyboardEventHandler<T = Element> = EventHandler<KeyboardEvent<T>>; + type MouseEventHandler<T = Element> = EventHandler<MouseEvent<T>>; + type TouchEventHandler<T = Element> = EventHandler<TouchEvent<T>>; + type PointerEventHandler<T = Element> = EventHandler<PointerEvent<T>>; + type UIEventHandler<T = Element> = EventHandler<UIEvent<T>>; + type WheelEventHandler<T = Element> = EventHandler<WheelEvent<T>>; + type AnimationEventHandler<T = Element> = EventHandler<AnimationEvent<T>>; + type TransitionEventHandler<T = Element> = EventHandler<TransitionEvent<T>>; + + // + // Props / DOM Attributes + // ---------------------------------------------------------------------- + + /** + * @deprecated. This was used to allow clients to pass `ref` and `key` + * to `createElement`, which is no longer necessary due to intersection + * types. If you need to declare a props object before passing it to + * `createElement` or a factory, use `ClassAttributes<T>`: + * + * ```ts + * var b: Button | null; + * var props: ButtonProps & ClassAttributes<Button> = { + * ref: b => button = b, // ok! + * label: "I'm a Button" + * }; + * ``` + */ + interface Props<T> { + children?: ReactNode; + key?: Key; + ref?: LegacyRef<T>; + } + + interface HTMLProps<T> extends AllHTMLAttributes<T>, ClassAttributes<T> {} + + type DetailedHTMLProps<E extends HTMLAttributes<T>, T> = ClassAttributes<T> & + E; + + interface SVGProps<T> extends SVGAttributes<T>, ClassAttributes<T> {} + + interface DOMAttributes<T> { + children?: ReactNode; + dangerouslySetInnerHTML?: { + __html: string; + }; + + // Clipboard Events + onCopy?: ClipboardEventHandler<T>; + onCopyCapture?: ClipboardEventHandler<T>; + onCut?: ClipboardEventHandler<T>; + onCutCapture?: ClipboardEventHandler<T>; + onPaste?: ClipboardEventHandler<T>; + onPasteCapture?: ClipboardEventHandler<T>; + + // Composition Events + onCompositionEnd?: CompositionEventHandler<T>; + onCompositionEndCapture?: CompositionEventHandler<T>; + onCompositionStart?: CompositionEventHandler<T>; + onCompositionStartCapture?: CompositionEventHandler<T>; + onCompositionUpdate?: CompositionEventHandler<T>; + onCompositionUpdateCapture?: CompositionEventHandler<T>; + + // Focus Events + onFocus?: FocusEventHandler<T>; + onFocusCapture?: FocusEventHandler<T>; + onBlur?: FocusEventHandler<T>; + onBlurCapture?: FocusEventHandler<T>; + + // Form Events + onChange?: FormEventHandler<T>; + onChangeCapture?: FormEventHandler<T>; + onBeforeInput?: FormEventHandler<T>; + onBeforeInputCapture?: FormEventHandler<T>; + onInput?: FormEventHandler<T>; + onInputCapture?: FormEventHandler<T>; + onReset?: FormEventHandler<T>; + onResetCapture?: FormEventHandler<T>; + onSubmit?: FormEventHandler<T>; + onSubmitCapture?: FormEventHandler<T>; + onInvalid?: FormEventHandler<T>; + onInvalidCapture?: FormEventHandler<T>; + + // Image Events + onLoad?: ReactEventHandler<T>; + onLoadCapture?: ReactEventHandler<T>; + onError?: ReactEventHandler<T>; // also a Media Event + onErrorCapture?: ReactEventHandler<T>; // also a Media Event + + // Keyboard Events + onKeyDown?: KeyboardEventHandler<T>; + onKeyDownCapture?: KeyboardEventHandler<T>; + onKeyPress?: KeyboardEventHandler<T>; + onKeyPressCapture?: KeyboardEventHandler<T>; + onKeyUp?: KeyboardEventHandler<T>; + onKeyUpCapture?: KeyboardEventHandler<T>; + + // Media Events + onAbort?: ReactEventHandler<T>; + onAbortCapture?: ReactEventHandler<T>; + onCanPlay?: ReactEventHandler<T>; + onCanPlayCapture?: ReactEventHandler<T>; + onCanPlayThrough?: ReactEventHandler<T>; + onCanPlayThroughCapture?: ReactEventHandler<T>; + onDurationChange?: ReactEventHandler<T>; + onDurationChangeCapture?: ReactEventHandler<T>; + onEmptied?: ReactEventHandler<T>; + onEmptiedCapture?: ReactEventHandler<T>; + onEncrypted?: ReactEventHandler<T>; + onEncryptedCapture?: ReactEventHandler<T>; + onEnded?: ReactEventHandler<T>; + onEndedCapture?: ReactEventHandler<T>; + onLoadedData?: ReactEventHandler<T>; + onLoadedDataCapture?: ReactEventHandler<T>; + onLoadedMetadata?: ReactEventHandler<T>; + onLoadedMetadataCapture?: ReactEventHandler<T>; + onLoadStart?: ReactEventHandler<T>; + onLoadStartCapture?: ReactEventHandler<T>; + onPause?: ReactEventHandler<T>; + onPauseCapture?: ReactEventHandler<T>; + onPlay?: ReactEventHandler<T>; + onPlayCapture?: ReactEventHandler<T>; + onPlaying?: ReactEventHandler<T>; + onPlayingCapture?: ReactEventHandler<T>; + onProgress?: ReactEventHandler<T>; + onProgressCapture?: ReactEventHandler<T>; + onRateChange?: ReactEventHandler<T>; + onRateChangeCapture?: ReactEventHandler<T>; + onSeeked?: ReactEventHandler<T>; + onSeekedCapture?: ReactEventHandler<T>; + onSeeking?: ReactEventHandler<T>; + onSeekingCapture?: ReactEventHandler<T>; + onStalled?: ReactEventHandler<T>; + onStalledCapture?: ReactEventHandler<T>; + onSuspend?: ReactEventHandler<T>; + onSuspendCapture?: ReactEventHandler<T>; + onTimeUpdate?: ReactEventHandler<T>; + onTimeUpdateCapture?: ReactEventHandler<T>; + onVolumeChange?: ReactEventHandler<T>; + onVolumeChangeCapture?: ReactEventHandler<T>; + onWaiting?: ReactEventHandler<T>; + onWaitingCapture?: ReactEventHandler<T>; + + // MouseEvents + onAuxClick?: MouseEventHandler<T>; + onAuxClickCapture?: MouseEventHandler<T>; + onClick?: MouseEventHandler<T>; + onClickCapture?: MouseEventHandler<T>; + onContextMenu?: MouseEventHandler<T>; + onContextMenuCapture?: MouseEventHandler<T>; + onDoubleClick?: MouseEventHandler<T>; + onDoubleClickCapture?: MouseEventHandler<T>; + onDrag?: DragEventHandler<T>; + onDragCapture?: DragEventHandler<T>; + onDragEnd?: DragEventHandler<T>; + onDragEndCapture?: DragEventHandler<T>; + onDragEnter?: DragEventHandler<T>; + onDragEnterCapture?: DragEventHandler<T>; + onDragExit?: DragEventHandler<T>; + onDragExitCapture?: DragEventHandler<T>; + onDragLeave?: DragEventHandler<T>; + onDragLeaveCapture?: DragEventHandler<T>; + onDragOver?: DragEventHandler<T>; + onDragOverCapture?: DragEventHandler<T>; + onDragStart?: DragEventHandler<T>; + onDragStartCapture?: DragEventHandler<T>; + onDrop?: DragEventHandler<T>; + onDropCapture?: DragEventHandler<T>; + onMouseDown?: MouseEventHandler<T>; + onMouseDownCapture?: MouseEventHandler<T>; + onMouseEnter?: MouseEventHandler<T>; + onMouseLeave?: MouseEventHandler<T>; + onMouseMove?: MouseEventHandler<T>; + onMouseMoveCapture?: MouseEventHandler<T>; + onMouseOut?: MouseEventHandler<T>; + onMouseOutCapture?: MouseEventHandler<T>; + onMouseOver?: MouseEventHandler<T>; + onMouseOverCapture?: MouseEventHandler<T>; + onMouseUp?: MouseEventHandler<T>; + onMouseUpCapture?: MouseEventHandler<T>; + + // Selection Events + onSelect?: ReactEventHandler<T>; + onSelectCapture?: ReactEventHandler<T>; + + // Touch Events + onTouchCancel?: TouchEventHandler<T>; + onTouchCancelCapture?: TouchEventHandler<T>; + onTouchEnd?: TouchEventHandler<T>; + onTouchEndCapture?: TouchEventHandler<T>; + onTouchMove?: TouchEventHandler<T>; + onTouchMoveCapture?: TouchEventHandler<T>; + onTouchStart?: TouchEventHandler<T>; + onTouchStartCapture?: TouchEventHandler<T>; + + // Pointer Events + onPointerDown?: PointerEventHandler<T>; + onPointerDownCapture?: PointerEventHandler<T>; + onPointerMove?: PointerEventHandler<T>; + onPointerMoveCapture?: PointerEventHandler<T>; + onPointerUp?: PointerEventHandler<T>; + onPointerUpCapture?: PointerEventHandler<T>; + onPointerCancel?: PointerEventHandler<T>; + onPointerCancelCapture?: PointerEventHandler<T>; + onPointerEnter?: PointerEventHandler<T>; + onPointerEnterCapture?: PointerEventHandler<T>; + onPointerLeave?: PointerEventHandler<T>; + onPointerLeaveCapture?: PointerEventHandler<T>; + onPointerOver?: PointerEventHandler<T>; + onPointerOverCapture?: PointerEventHandler<T>; + onPointerOut?: PointerEventHandler<T>; + onPointerOutCapture?: PointerEventHandler<T>; + onGotPointerCapture?: PointerEventHandler<T>; + onGotPointerCaptureCapture?: PointerEventHandler<T>; + onLostPointerCapture?: PointerEventHandler<T>; + onLostPointerCaptureCapture?: PointerEventHandler<T>; + + // UI Events + onScroll?: UIEventHandler<T>; + onScrollCapture?: UIEventHandler<T>; + + // Wheel Events + onWheel?: WheelEventHandler<T>; + onWheelCapture?: WheelEventHandler<T>; + + // Animation Events + onAnimationStart?: AnimationEventHandler<T>; + onAnimationStartCapture?: AnimationEventHandler<T>; + onAnimationEnd?: AnimationEventHandler<T>; + onAnimationEndCapture?: AnimationEventHandler<T>; + onAnimationIteration?: AnimationEventHandler<T>; + onAnimationIterationCapture?: AnimationEventHandler<T>; + + // Transition Events + onTransitionEnd?: TransitionEventHandler<T>; + onTransitionEndCapture?: TransitionEventHandler<T>; + } + + export interface CSSProperties extends CSS.Properties<string | number> { + /** + * The index signature was removed to enable closed typing for style + * using CSSType. You're able to use type assertion or module augmentation + * to add properties or an index signature of your own. + * + * For examples and more information, visit: + * https://github.com/frenic/csstype#what-should-i-do-when-i-get-type-errors + */ + } + + // All the WAI-ARIA 1.1 attributes from https://www.w3.org/TR/wai-aria-1.1/ + interface AriaAttributes { + /** Identifies the currently active element when DOM focus is on a composite widget, textbox, group, or application. */ + "aria-activedescendant"?: string; + /** Indicates whether assistive technologies will present all, or only parts of, the changed region based on the change notifications defined by the aria-relevant attribute. */ + "aria-atomic"?: boolean | "false" | "true"; + /** + * Indicates whether inputting text could trigger display of one or more predictions of the user's intended value for an input and specifies how predictions would be + * presented if they are made. + */ + "aria-autocomplete"?: "none" | "inline" | "list" | "both"; + /** Indicates an element is being modified and that assistive technologies MAY want to wait until the modifications are complete before exposing them to the user. */ + "aria-busy"?: boolean | "false" | "true"; + /** + * Indicates the current "checked" state of checkboxes, radio buttons, and other widgets. + * @see aria-pressed @see aria-selected. + */ + "aria-checked"?: boolean | "false" | "mixed" | "true"; + /** + * Defines the total number of columns in a table, grid, or treegrid. + * @see aria-colindex. + */ + "aria-colcount"?: number; + /** + * Defines an element's column index or position with respect to the total number of columns within a table, grid, or treegrid. + * @see aria-colcount @see aria-colspan. + */ + "aria-colindex"?: number; + /** + * Defines the number of columns spanned by a cell or gridcell within a table, grid, or treegrid. + * @see aria-colindex @see aria-rowspan. + */ + "aria-colspan"?: number; + /** + * Identifies the element (or elements) whose contents or presence are controlled by the current element. + * @see aria-owns. + */ + "aria-controls"?: string; + /** Indicates the element that represents the current item within a container or set of related elements. */ + "aria-current"?: + | boolean + | "false" + | "true" + | "page" + | "step" + | "location" + | "date" + | "time"; + /** + * Identifies the element (or elements) that describes the object. + * @see aria-labelledby + */ + "aria-describedby"?: string; + /** + * Identifies the element that provides a detailed, extended description for the object. + * @see aria-describedby. + */ + "aria-details"?: string; + /** + * Indicates that the element is perceivable but disabled, so it is not editable or otherwise operable. + * @see aria-hidden @see aria-readonly. + */ + "aria-disabled"?: boolean | "false" | "true"; + /** + * Indicates what functions can be performed when a dragged object is released on the drop target. + * @deprecated in ARIA 1.1 + */ + "aria-dropeffect"?: "none" | "copy" | "execute" | "link" | "move" | "popup"; + /** + * Identifies the element that provides an error message for the object. + * @see aria-invalid @see aria-describedby. + */ + "aria-errormessage"?: string; + /** Indicates whether the element, or another grouping element it controls, is currently expanded or collapsed. */ + "aria-expanded"?: boolean | "false" | "true"; + /** + * Identifies the next element (or elements) in an alternate reading order of content which, at the user's discretion, + * allows assistive technology to override the general default of reading in document source order. + */ + "aria-flowto"?: string; + /** + * Indicates an element's "grabbed" state in a drag-and-drop operation. + * @deprecated in ARIA 1.1 + */ + "aria-grabbed"?: boolean | "false" | "true"; + /** Indicates the availability and type of interactive popup element, such as menu or dialog, that can be triggered by an element. */ + "aria-haspopup"?: + | boolean + | "false" + | "true" + | "menu" + | "listbox" + | "tree" + | "grid" + | "dialog"; + /** + * Indicates whether the element is exposed to an accessibility API. + * @see aria-disabled. + */ + "aria-hidden"?: boolean | "false" | "true"; + /** + * Indicates the entered value does not conform to the format expected by the application. + * @see aria-errormessage. + */ + "aria-invalid"?: boolean | "false" | "true" | "grammar" | "spelling"; + /** Indicates keyboard shortcuts that an author has implemented to activate or give focus to an element. */ + "aria-keyshortcuts"?: string; + /** + * Defines a string value that labels the current element. + * @see aria-labelledby. + */ + "aria-label"?: string; + /** + * Identifies the element (or elements) that labels the current element. + * @see aria-describedby. + */ + "aria-labelledby"?: string; + /** Defines the hierarchical level of an element within a structure. */ + "aria-level"?: number; + /** Indicates that an element will be updated, and describes the types of updates the user agents, assistive technologies, and user can expect from the live region. */ + "aria-live"?: "off" | "assertive" | "polite"; + /** Indicates whether an element is modal when displayed. */ + "aria-modal"?: boolean | "false" | "true"; + /** Indicates whether a text box accepts multiple lines of input or only a single line. */ + "aria-multiline"?: boolean | "false" | "true"; + /** Indicates that the user may select more than one item from the current selectable descendants. */ + "aria-multiselectable"?: boolean | "false" | "true"; + /** Indicates whether the element's orientation is horizontal, vertical, or unknown/ambiguous. */ + "aria-orientation"?: "horizontal" | "vertical"; + /** + * Identifies an element (or elements) in order to define a visual, functional, or contextual parent/child relationship + * between DOM elements where the DOM hierarchy cannot be used to represent the relationship. + * @see aria-controls. + */ + "aria-owns"?: string; + /** + * Defines a short hint (a word or short phrase) intended to aid the user with data entry when the control has no value. + * A hint could be a sample value or a brief description of the expected format. + */ + "aria-placeholder"?: string; + /** + * Defines an element's number or position in the current set of listitems or treeitems. Not required if all elements in the set are present in the DOM. + * @see aria-setsize. + */ + "aria-posinset"?: number; + /** + * Indicates the current "pressed" state of toggle buttons. + * @see aria-checked @see aria-selected. + */ + "aria-pressed"?: boolean | "false" | "mixed" | "true"; + /** + * Indicates that the element is not editable, but is otherwise operable. + * @see aria-disabled. + */ + "aria-readonly"?: boolean | "false" | "true"; + /** + * Indicates what notifications the user agent will trigger when the accessibility tree within a live region is modified. + * @see aria-atomic. + */ + "aria-relevant"?: + | "additions" + | "additions text" + | "all" + | "removals" + | "text"; + /** Indicates that user input is required on the element before a form may be submitted. */ + "aria-required"?: boolean | "false" | "true"; + /** Defines a human-readable, author-localized description for the role of an element. */ + "aria-roledescription"?: string; + /** + * Defines the total number of rows in a table, grid, or treegrid. + * @see aria-rowindex. + */ + "aria-rowcount"?: number; + /** + * Defines an element's row index or position with respect to the total number of rows within a table, grid, or treegrid. + * @see aria-rowcount @see aria-rowspan. + */ + "aria-rowindex"?: number; + /** + * Defines the number of rows spanned by a cell or gridcell within a table, grid, or treegrid. + * @see aria-rowindex @see aria-colspan. + */ + "aria-rowspan"?: number; + /** + * Indicates the current "selected" state of various widgets. + * @see aria-checked @see aria-pressed. + */ + "aria-selected"?: boolean | "false" | "true"; + /** + * Defines the number of items in the current set of listitems or treeitems. Not required if all elements in the set are present in the DOM. + * @see aria-posinset. + */ + "aria-setsize"?: number; + /** Indicates if items in a table or grid are sorted in ascending or descending order. */ + "aria-sort"?: "none" | "ascending" | "descending" | "other"; + /** Defines the maximum allowed value for a range widget. */ + "aria-valuemax"?: number; + /** Defines the minimum allowed value for a range widget. */ + "aria-valuemin"?: number; + /** + * Defines the current value for a range widget. + * @see aria-valuetext. + */ + "aria-valuenow"?: number; + /** Defines the human readable text alternative of aria-valuenow for a range widget. */ + "aria-valuetext"?: string; + } + + interface HTMLAttributes<T> extends AriaAttributes, DOMAttributes<T> { + // React-specific Attributes + defaultChecked?: boolean; + defaultValue?: string | number | string[]; + suppressContentEditableWarning?: boolean; + suppressHydrationWarning?: boolean; + + // Standard HTML Attributes + accessKey?: string; + className?: string; + contentEditable?: Booleanish | "inherit"; + contextMenu?: string; + dir?: string; + draggable?: Booleanish; + hidden?: boolean; + id?: string; + lang?: string; + placeholder?: string; + slot?: string; + spellCheck?: Booleanish; + style?: CSSProperties; + tabIndex?: number; + title?: string; + translate?: "yes" | "no"; + + // Unknown + radioGroup?: string; // <command>, <menuitem> + + // WAI-ARIA + role?: string; + + // RDFa Attributes + about?: string; + datatype?: string; + inlist?: any; + prefix?: string; + property?: string; + resource?: string; + typeof?: string; + vocab?: string; + + // Non-standard Attributes + autoCapitalize?: string; + autoCorrect?: string; + autoSave?: string; + color?: string; + itemProp?: string; + itemScope?: boolean; + itemType?: string; + itemID?: string; + itemRef?: string; + results?: number; + security?: string; + unselectable?: "on" | "off"; + + // Living Standard + /** + * Hints at the type of data that might be entered by the user while editing the element or its contents + * @see https://html.spec.whatwg.org/multipage/interaction.html#input-modalities:-the-inputmode-attribute + */ + inputMode?: + | "none" + | "text" + | "tel" + | "url" + | "email" + | "numeric" + | "decimal" + | "search"; + /** + * Specify that a standard HTML element should behave like a defined custom built-in element + * @see https://html.spec.whatwg.org/multipage/custom-elements.html#attr-is + */ + is?: string; + } + + interface AllHTMLAttributes<T> extends HTMLAttributes<T> { + // Standard HTML Attributes + accept?: string; + acceptCharset?: string; + action?: string; + allowFullScreen?: boolean; + allowTransparency?: boolean; + alt?: string; + as?: string; + async?: boolean; + autoComplete?: string; + autoFocus?: boolean; + autoPlay?: boolean; + capture?: boolean | string; + cellPadding?: number | string; + cellSpacing?: number | string; + charSet?: string; + challenge?: string; + checked?: boolean; + cite?: string; + classID?: string; + cols?: number; + colSpan?: number; + content?: string; + controls?: boolean; + coords?: string; + crossOrigin?: string; + data?: string; + dateTime?: string; + default?: boolean; + defer?: boolean; + disabled?: boolean; + download?: any; + encType?: string; + form?: string; + formAction?: string; + formEncType?: string; + formMethod?: string; + formNoValidate?: boolean; + formTarget?: string; + frameBorder?: number | string; + headers?: string; + height?: number | string; + high?: number; + href?: string; + hrefLang?: string; + htmlFor?: string; + httpEquiv?: string; + integrity?: string; + keyParams?: string; + keyType?: string; + kind?: string; + label?: string; + list?: string; + loop?: boolean; + low?: number; + manifest?: string; + marginHeight?: number; + marginWidth?: number; + max?: number | string; + maxLength?: number; + media?: string; + mediaGroup?: string; + method?: string; + min?: number | string; + minLength?: number; + multiple?: boolean; + muted?: boolean; + name?: string; + nonce?: string; + noValidate?: boolean; + open?: boolean; + optimum?: number; + pattern?: string; + placeholder?: string; + playsInline?: boolean; + poster?: string; + preload?: string; + readOnly?: boolean; + rel?: string; + required?: boolean; + reversed?: boolean; + rows?: number; + rowSpan?: number; + sandbox?: string; + scope?: string; + scoped?: boolean; + scrolling?: string; + seamless?: boolean; + selected?: boolean; + shape?: string; + size?: number; + sizes?: string; + span?: number; + src?: string; + srcDoc?: string; + srcLang?: string; + srcSet?: string; + start?: number; + step?: number | string; + summary?: string; + target?: string; + type?: string; + useMap?: string; + value?: string | string[] | number; + width?: number | string; + wmode?: string; + wrap?: string; + } + + interface AnchorHTMLAttributes<T> extends HTMLAttributes<T> { + download?: any; + href?: string; + hrefLang?: string; + media?: string; + ping?: string; + rel?: string; + target?: string; + type?: string; + referrerPolicy?: string; + } + + // tslint:disable-next-line:no-empty-interface + interface AudioHTMLAttributes<T> extends MediaHTMLAttributes<T> {} + + interface AreaHTMLAttributes<T> extends HTMLAttributes<T> { + alt?: string; + coords?: string; + download?: any; + href?: string; + hrefLang?: string; + media?: string; + rel?: string; + shape?: string; + target?: string; + } + + interface BaseHTMLAttributes<T> extends HTMLAttributes<T> { + href?: string; + target?: string; + } + + interface BlockquoteHTMLAttributes<T> extends HTMLAttributes<T> { + cite?: string; + } + + interface ButtonHTMLAttributes<T> extends HTMLAttributes<T> { + autoFocus?: boolean; + disabled?: boolean; + form?: string; + formAction?: string; + formEncType?: string; + formMethod?: string; + formNoValidate?: boolean; + formTarget?: string; + name?: string; + type?: "submit" | "reset" | "button"; + value?: string | string[] | number; + } + + interface CanvasHTMLAttributes<T> extends HTMLAttributes<T> { + height?: number | string; + width?: number | string; + } + + interface ColHTMLAttributes<T> extends HTMLAttributes<T> { + span?: number; + width?: number | string; + } + + interface ColgroupHTMLAttributes<T> extends HTMLAttributes<T> { + span?: number; + } + + interface DataHTMLAttributes<T> extends HTMLAttributes<T> { + value?: string | string[] | number; + } + + interface DetailsHTMLAttributes<T> extends HTMLAttributes<T> { + open?: boolean; + } + + interface DelHTMLAttributes<T> extends HTMLAttributes<T> { + cite?: string; + dateTime?: string; + } + + interface DialogHTMLAttributes<T> extends HTMLAttributes<T> { + open?: boolean; + } + + interface EmbedHTMLAttributes<T> extends HTMLAttributes<T> { + height?: number | string; + src?: string; + type?: string; + width?: number | string; + } + + interface FieldsetHTMLAttributes<T> extends HTMLAttributes<T> { + disabled?: boolean; + form?: string; + name?: string; + } + + interface FormHTMLAttributes<T> extends HTMLAttributes<T> { + acceptCharset?: string; + action?: string; + autoComplete?: string; + encType?: string; + method?: string; + name?: string; + noValidate?: boolean; + target?: string; + } + + interface HtmlHTMLAttributes<T> extends HTMLAttributes<T> { + manifest?: string; + } + + interface IframeHTMLAttributes<T> extends HTMLAttributes<T> { + allow?: string; + allowFullScreen?: boolean; + allowTransparency?: boolean; + frameBorder?: number | string; + height?: number | string; + marginHeight?: number; + marginWidth?: number; + name?: string; + referrerPolicy?: string; + sandbox?: string; + scrolling?: string; + seamless?: boolean; + src?: string; + srcDoc?: string; + width?: number | string; + } + + interface ImgHTMLAttributes<T> extends HTMLAttributes<T> { + alt?: string; + crossOrigin?: "anonymous" | "use-credentials" | ""; + decoding?: "async" | "auto" | "sync"; + height?: number | string; + sizes?: string; + src?: string; + srcSet?: string; + useMap?: string; + width?: number | string; + } + + interface InsHTMLAttributes<T> extends HTMLAttributes<T> { + cite?: string; + dateTime?: string; + } + + interface InputHTMLAttributes<T> extends HTMLAttributes<T> { + accept?: string; + alt?: string; + autoComplete?: string; + autoFocus?: boolean; + capture?: boolean | string; // https://www.w3.org/TR/html-media-capture/#the-capture-attribute + checked?: boolean; + crossOrigin?: string; + disabled?: boolean; + form?: string; + formAction?: string; + formEncType?: string; + formMethod?: string; + formNoValidate?: boolean; + formTarget?: string; + height?: number | string; + list?: string; + max?: number | string; + maxLength?: number; + min?: number | string; + minLength?: number; + multiple?: boolean; + name?: string; + pattern?: string; + placeholder?: string; + readOnly?: boolean; + required?: boolean; + size?: number; + src?: string; + step?: number | string; + type?: string; + value?: string | string[] | number; + width?: number | string; + + onChange?: ChangeEventHandler<T>; + } + + interface KeygenHTMLAttributes<T> extends HTMLAttributes<T> { + autoFocus?: boolean; + challenge?: string; + disabled?: boolean; + form?: string; + keyType?: string; + keyParams?: string; + name?: string; + } + + interface LabelHTMLAttributes<T> extends HTMLAttributes<T> { + form?: string; + htmlFor?: string; + } + + interface LiHTMLAttributes<T> extends HTMLAttributes<T> { + value?: string | string[] | number; + } + + interface LinkHTMLAttributes<T> extends HTMLAttributes<T> { + as?: string; + crossOrigin?: string; + href?: string; + hrefLang?: string; + integrity?: string; + media?: string; + rel?: string; + sizes?: string; + type?: string; + } + + interface MapHTMLAttributes<T> extends HTMLAttributes<T> { + name?: string; + } + + interface MenuHTMLAttributes<T> extends HTMLAttributes<T> { + type?: string; + } + + interface MediaHTMLAttributes<T> extends HTMLAttributes<T> { + autoPlay?: boolean; + controls?: boolean; + controlsList?: string; + crossOrigin?: string; + loop?: boolean; + mediaGroup?: string; + muted?: boolean; + playsinline?: boolean; + preload?: string; + src?: string; + } + + interface MetaHTMLAttributes<T> extends HTMLAttributes<T> { + charSet?: string; + content?: string; + httpEquiv?: string; + name?: string; + } + + interface MeterHTMLAttributes<T> extends HTMLAttributes<T> { + form?: string; + high?: number; + low?: number; + max?: number | string; + min?: number | string; + optimum?: number; + value?: string | string[] | number; + } + + interface QuoteHTMLAttributes<T> extends HTMLAttributes<T> { + cite?: string; + } + + interface ObjectHTMLAttributes<T> extends HTMLAttributes<T> { + classID?: string; + data?: string; + form?: string; + height?: number | string; + name?: string; + type?: string; + useMap?: string; + width?: number | string; + wmode?: string; + } + + interface OlHTMLAttributes<T> extends HTMLAttributes<T> { + reversed?: boolean; + start?: number; + type?: "1" | "a" | "A" | "i" | "I"; + } + + interface OptgroupHTMLAttributes<T> extends HTMLAttributes<T> { + disabled?: boolean; + label?: string; + } + + interface OptionHTMLAttributes<T> extends HTMLAttributes<T> { + disabled?: boolean; + label?: string; + selected?: boolean; + value?: string | string[] | number; + } + + interface OutputHTMLAttributes<T> extends HTMLAttributes<T> { + form?: string; + htmlFor?: string; + name?: string; + } + + interface ParamHTMLAttributes<T> extends HTMLAttributes<T> { + name?: string; + value?: string | string[] | number; + } + + interface ProgressHTMLAttributes<T> extends HTMLAttributes<T> { + max?: number | string; + value?: string | string[] | number; + } + + interface ScriptHTMLAttributes<T> extends HTMLAttributes<T> { + async?: boolean; + charSet?: string; + crossOrigin?: string; + defer?: boolean; + integrity?: string; + noModule?: boolean; + nonce?: string; + src?: string; + type?: string; + } + + interface SelectHTMLAttributes<T> extends HTMLAttributes<T> { + autoComplete?: string; + autoFocus?: boolean; + disabled?: boolean; + form?: string; + multiple?: boolean; + name?: string; + required?: boolean; + size?: number; + value?: string | string[] | number; + onChange?: ChangeEventHandler<T>; + } + + interface SourceHTMLAttributes<T> extends HTMLAttributes<T> { + media?: string; + sizes?: string; + src?: string; + srcSet?: string; + type?: string; + } + + interface StyleHTMLAttributes<T> extends HTMLAttributes<T> { + media?: string; + nonce?: string; + scoped?: boolean; + type?: string; + } + + interface TableHTMLAttributes<T> extends HTMLAttributes<T> { + cellPadding?: number | string; + cellSpacing?: number | string; + summary?: string; + } + + interface TextareaHTMLAttributes<T> extends HTMLAttributes<T> { + autoComplete?: string; + autoFocus?: boolean; + cols?: number; + dirName?: string; + disabled?: boolean; + form?: string; + maxLength?: number; + minLength?: number; + name?: string; + placeholder?: string; + readOnly?: boolean; + required?: boolean; + rows?: number; + value?: string | string[] | number; + wrap?: string; + + onChange?: ChangeEventHandler<T>; + } + + interface TdHTMLAttributes<T> extends HTMLAttributes<T> { + align?: "left" | "center" | "right" | "justify" | "char"; + colSpan?: number; + headers?: string; + rowSpan?: number; + scope?: string; + abbr?: string; + valign?: "top" | "middle" | "bottom" | "baseline"; + } + + interface ThHTMLAttributes<T> extends HTMLAttributes<T> { + align?: "left" | "center" | "right" | "justify" | "char"; + colSpan?: number; + headers?: string; + rowSpan?: number; + scope?: string; + abbr?: string; + } + + interface TimeHTMLAttributes<T> extends HTMLAttributes<T> { + dateTime?: string; + } + + interface TrackHTMLAttributes<T> extends HTMLAttributes<T> { + default?: boolean; + kind?: string; + label?: string; + src?: string; + srcLang?: string; + } + + interface VideoHTMLAttributes<T> extends MediaHTMLAttributes<T> { + height?: number | string; + playsInline?: boolean; + poster?: string; + width?: number | string; + disablePictureInPicture?: boolean; + } + + // this list is "complete" in that it contains every SVG attribute + // that React supports, but the types can be improved. + // Full list here: https://facebook.github.io/react/docs/dom-elements.html + // + // The three broad type categories are (in order of restrictiveness): + // - "number | string" + // - "string" + // - union of string literals + interface SVGAttributes<T> extends AriaAttributes, DOMAttributes<T> { + // Attributes which also defined in HTMLAttributes + // See comment in SVGDOMPropertyConfig.js + className?: string; + color?: string; + height?: number | string; + id?: string; + lang?: string; + max?: number | string; + media?: string; + method?: string; + min?: number | string; + name?: string; + style?: CSSProperties; + target?: string; + type?: string; + width?: number | string; + + // Other HTML properties supported by SVG elements in browsers + role?: string; + tabIndex?: number; + crossOrigin?: "anonymous" | "use-credentials" | ""; + + // SVG Specific attributes + accentHeight?: number | string; + accumulate?: "none" | "sum"; + additive?: "replace" | "sum"; + alignmentBaseline?: + | "auto" + | "baseline" + | "before-edge" + | "text-before-edge" + | "middle" + | "central" + | "after-edge" + | "text-after-edge" + | "ideographic" + | "alphabetic" + | "hanging" + | "mathematical" + | "inherit"; + allowReorder?: "no" | "yes"; + alphabetic?: number | string; + amplitude?: number | string; + arabicForm?: "initial" | "medial" | "terminal" | "isolated"; + ascent?: number | string; + attributeName?: string; + attributeType?: string; + autoReverse?: Booleanish; + azimuth?: number | string; + baseFrequency?: number | string; + baselineShift?: number | string; + baseProfile?: number | string; + bbox?: number | string; + begin?: number | string; + bias?: number | string; + by?: number | string; + calcMode?: number | string; + capHeight?: number | string; + clip?: number | string; + clipPath?: string; + clipPathUnits?: number | string; + clipRule?: number | string; + colorInterpolation?: number | string; + colorInterpolationFilters?: "auto" | "sRGB" | "linearRGB" | "inherit"; + colorProfile?: number | string; + colorRendering?: number | string; + contentScriptType?: number | string; + contentStyleType?: number | string; + cursor?: number | string; + cx?: number | string; + cy?: number | string; + d?: string; + decelerate?: number | string; + descent?: number | string; + diffuseConstant?: number | string; + direction?: number | string; + display?: number | string; + divisor?: number | string; + dominantBaseline?: number | string; + dur?: number | string; + dx?: number | string; + dy?: number | string; + edgeMode?: number | string; + elevation?: number | string; + enableBackground?: number | string; + end?: number | string; + exponent?: number | string; + externalResourcesRequired?: Booleanish; + fill?: string; + fillOpacity?: number | string; + fillRule?: "nonzero" | "evenodd" | "inherit"; + filter?: string; + filterRes?: number | string; + filterUnits?: number | string; + floodColor?: number | string; + floodOpacity?: number | string; + focusable?: Booleanish | "auto"; + fontFamily?: string; + fontSize?: number | string; + fontSizeAdjust?: number | string; + fontStretch?: number | string; + fontStyle?: number | string; + fontVariant?: number | string; + fontWeight?: number | string; + format?: number | string; + from?: number | string; + fx?: number | string; + fy?: number | string; + g1?: number | string; + g2?: number | string; + glyphName?: number | string; + glyphOrientationHorizontal?: number | string; + glyphOrientationVertical?: number | string; + glyphRef?: number | string; + gradientTransform?: string; + gradientUnits?: string; + hanging?: number | string; + horizAdvX?: number | string; + horizOriginX?: number | string; + href?: string; + ideographic?: number | string; + imageRendering?: number | string; + in2?: number | string; + in?: string; + intercept?: number | string; + k1?: number | string; + k2?: number | string; + k3?: number | string; + k4?: number | string; + k?: number | string; + kernelMatrix?: number | string; + kernelUnitLength?: number | string; + kerning?: number | string; + keyPoints?: number | string; + keySplines?: number | string; + keyTimes?: number | string; + lengthAdjust?: number | string; + letterSpacing?: number | string; + lightingColor?: number | string; + limitingConeAngle?: number | string; + local?: number | string; + markerEnd?: string; + markerHeight?: number | string; + markerMid?: string; + markerStart?: string; + markerUnits?: number | string; + markerWidth?: number | string; + mask?: string; + maskContentUnits?: number | string; + maskUnits?: number | string; + mathematical?: number | string; + mode?: number | string; + numOctaves?: number | string; + offset?: number | string; + opacity?: number | string; + operator?: number | string; + order?: number | string; + orient?: number | string; + orientation?: number | string; + origin?: number | string; + overflow?: number | string; + overlinePosition?: number | string; + overlineThickness?: number | string; + paintOrder?: number | string; + panose1?: number | string; + pathLength?: number | string; + patternContentUnits?: string; + patternTransform?: number | string; + patternUnits?: string; + pointerEvents?: number | string; + points?: string; + pointsAtX?: number | string; + pointsAtY?: number | string; + pointsAtZ?: number | string; + preserveAlpha?: Booleanish; + preserveAspectRatio?: string; + primitiveUnits?: number | string; + r?: number | string; + radius?: number | string; + refX?: number | string; + refY?: number | string; + renderingIntent?: number | string; + repeatCount?: number | string; + repeatDur?: number | string; + requiredExtensions?: number | string; + requiredFeatures?: number | string; + restart?: number | string; + result?: string; + rotate?: number | string; + rx?: number | string; + ry?: number | string; + scale?: number | string; + seed?: number | string; + shapeRendering?: number | string; + slope?: number | string; + spacing?: number | string; + specularConstant?: number | string; + specularExponent?: number | string; + speed?: number | string; + spreadMethod?: string; + startOffset?: number | string; + stdDeviation?: number | string; + stemh?: number | string; + stemv?: number | string; + stitchTiles?: number | string; + stopColor?: string; + stopOpacity?: number | string; + strikethroughPosition?: number | string; + strikethroughThickness?: number | string; + string?: number | string; + stroke?: string; + strokeDasharray?: string | number; + strokeDashoffset?: string | number; + strokeLinecap?: "butt" | "round" | "square" | "inherit"; + strokeLinejoin?: "miter" | "round" | "bevel" | "inherit"; + strokeMiterlimit?: number | string; + strokeOpacity?: number | string; + strokeWidth?: number | string; + surfaceScale?: number | string; + systemLanguage?: number | string; + tableValues?: number | string; + targetX?: number | string; + targetY?: number | string; + textAnchor?: string; + textDecoration?: number | string; + textLength?: number | string; + textRendering?: number | string; + to?: number | string; + transform?: string; + u1?: number | string; + u2?: number | string; + underlinePosition?: number | string; + underlineThickness?: number | string; + unicode?: number | string; + unicodeBidi?: number | string; + unicodeRange?: number | string; + unitsPerEm?: number | string; + vAlphabetic?: number | string; + values?: string; + vectorEffect?: number | string; + version?: string; + vertAdvY?: number | string; + vertOriginX?: number | string; + vertOriginY?: number | string; + vHanging?: number | string; + vIdeographic?: number | string; + viewBox?: string; + viewTarget?: number | string; + visibility?: number | string; + vMathematical?: number | string; + widths?: number | string; + wordSpacing?: number | string; + writingMode?: number | string; + x1?: number | string; + x2?: number | string; + x?: number | string; + xChannelSelector?: string; + xHeight?: number | string; + xlinkActuate?: string; + xlinkArcrole?: string; + xlinkHref?: string; + xlinkRole?: string; + xlinkShow?: string; + xlinkTitle?: string; + xlinkType?: string; + xmlBase?: string; + xmlLang?: string; + xmlns?: string; + xmlnsXlink?: string; + xmlSpace?: string; + y1?: number | string; + y2?: number | string; + y?: number | string; + yChannelSelector?: string; + z?: number | string; + zoomAndPan?: string; + } + + interface WebViewHTMLAttributes<T> extends HTMLAttributes<T> { + allowFullScreen?: boolean; + allowpopups?: boolean; + autoFocus?: boolean; + autosize?: boolean; + blinkfeatures?: string; + disableblinkfeatures?: string; + disableguestresize?: boolean; + disablewebsecurity?: boolean; + guestinstance?: string; + httpreferrer?: string; + nodeintegration?: boolean; + partition?: string; + plugins?: boolean; + preload?: string; + src?: string; + useragent?: string; + webpreferences?: string; + } + + // + // React.DOM + // ---------------------------------------------------------------------- + + interface ReactHTML { + a: DetailedHTMLFactory< + AnchorHTMLAttributes<HTMLAnchorElement>, + HTMLAnchorElement + >; + abbr: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + address: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + area: DetailedHTMLFactory< + AreaHTMLAttributes<HTMLAreaElement>, + HTMLAreaElement + >; + article: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + aside: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + audio: DetailedHTMLFactory< + AudioHTMLAttributes<HTMLAudioElement>, + HTMLAudioElement + >; + b: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + base: DetailedHTMLFactory< + BaseHTMLAttributes<HTMLBaseElement>, + HTMLBaseElement + >; + bdi: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + bdo: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + big: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + blockquote: DetailedHTMLFactory< + BlockquoteHTMLAttributes<HTMLElement>, + HTMLElement + >; + body: DetailedHTMLFactory<HTMLAttributes<HTMLBodyElement>, HTMLBodyElement>; + br: DetailedHTMLFactory<HTMLAttributes<HTMLBRElement>, HTMLBRElement>; + button: DetailedHTMLFactory< + ButtonHTMLAttributes<HTMLButtonElement>, + HTMLButtonElement + >; + canvas: DetailedHTMLFactory< + CanvasHTMLAttributes<HTMLCanvasElement>, + HTMLCanvasElement + >; + caption: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + cite: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + code: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + col: DetailedHTMLFactory< + ColHTMLAttributes<HTMLTableColElement>, + HTMLTableColElement + >; + colgroup: DetailedHTMLFactory< + ColgroupHTMLAttributes<HTMLTableColElement>, + HTMLTableColElement + >; + data: DetailedHTMLFactory< + DataHTMLAttributes<HTMLDataElement>, + HTMLDataElement + >; + datalist: DetailedHTMLFactory< + HTMLAttributes<HTMLDataListElement>, + HTMLDataListElement + >; + dd: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + del: DetailedHTMLFactory<DelHTMLAttributes<HTMLElement>, HTMLElement>; + details: DetailedHTMLFactory< + DetailsHTMLAttributes<HTMLElement>, + HTMLElement + >; + dfn: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + dialog: DetailedHTMLFactory< + DialogHTMLAttributes<HTMLDialogElement>, + HTMLDialogElement + >; + div: DetailedHTMLFactory<HTMLAttributes<HTMLDivElement>, HTMLDivElement>; + dl: DetailedHTMLFactory<HTMLAttributes<HTMLDListElement>, HTMLDListElement>; + dt: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + em: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + embed: DetailedHTMLFactory< + EmbedHTMLAttributes<HTMLEmbedElement>, + HTMLEmbedElement + >; + fieldset: DetailedHTMLFactory< + FieldsetHTMLAttributes<HTMLFieldSetElement>, + HTMLFieldSetElement + >; + figcaption: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + figure: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + footer: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + form: DetailedHTMLFactory< + FormHTMLAttributes<HTMLFormElement>, + HTMLFormElement + >; + h1: DetailedHTMLFactory< + HTMLAttributes<HTMLHeadingElement>, + HTMLHeadingElement + >; + h2: DetailedHTMLFactory< + HTMLAttributes<HTMLHeadingElement>, + HTMLHeadingElement + >; + h3: DetailedHTMLFactory< + HTMLAttributes<HTMLHeadingElement>, + HTMLHeadingElement + >; + h4: DetailedHTMLFactory< + HTMLAttributes<HTMLHeadingElement>, + HTMLHeadingElement + >; + h5: DetailedHTMLFactory< + HTMLAttributes<HTMLHeadingElement>, + HTMLHeadingElement + >; + h6: DetailedHTMLFactory< + HTMLAttributes<HTMLHeadingElement>, + HTMLHeadingElement + >; + head: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLHeadElement>; + header: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + hgroup: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + hr: DetailedHTMLFactory<HTMLAttributes<HTMLHRElement>, HTMLHRElement>; + html: DetailedHTMLFactory< + HtmlHTMLAttributes<HTMLHtmlElement>, + HTMLHtmlElement + >; + i: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + iframe: DetailedHTMLFactory< + IframeHTMLAttributes<HTMLIFrameElement>, + HTMLIFrameElement + >; + img: DetailedHTMLFactory< + ImgHTMLAttributes<HTMLImageElement>, + HTMLImageElement + >; + input: DetailedHTMLFactory< + InputHTMLAttributes<HTMLInputElement>, + HTMLInputElement + >; + ins: DetailedHTMLFactory<InsHTMLAttributes<HTMLModElement>, HTMLModElement>; + kbd: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + keygen: DetailedHTMLFactory<KeygenHTMLAttributes<HTMLElement>, HTMLElement>; + label: DetailedHTMLFactory< + LabelHTMLAttributes<HTMLLabelElement>, + HTMLLabelElement + >; + legend: DetailedHTMLFactory< + HTMLAttributes<HTMLLegendElement>, + HTMLLegendElement + >; + li: DetailedHTMLFactory<LiHTMLAttributes<HTMLLIElement>, HTMLLIElement>; + link: DetailedHTMLFactory< + LinkHTMLAttributes<HTMLLinkElement>, + HTMLLinkElement + >; + main: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + map: DetailedHTMLFactory<MapHTMLAttributes<HTMLMapElement>, HTMLMapElement>; + mark: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + menu: DetailedHTMLFactory<MenuHTMLAttributes<HTMLElement>, HTMLElement>; + menuitem: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + meta: DetailedHTMLFactory< + MetaHTMLAttributes<HTMLMetaElement>, + HTMLMetaElement + >; + meter: DetailedHTMLFactory<MeterHTMLAttributes<HTMLElement>, HTMLElement>; + nav: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + noscript: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + object: DetailedHTMLFactory< + ObjectHTMLAttributes<HTMLObjectElement>, + HTMLObjectElement + >; + ol: DetailedHTMLFactory< + OlHTMLAttributes<HTMLOListElement>, + HTMLOListElement + >; + optgroup: DetailedHTMLFactory< + OptgroupHTMLAttributes<HTMLOptGroupElement>, + HTMLOptGroupElement + >; + option: DetailedHTMLFactory< + OptionHTMLAttributes<HTMLOptionElement>, + HTMLOptionElement + >; + output: DetailedHTMLFactory<OutputHTMLAttributes<HTMLElement>, HTMLElement>; + p: DetailedHTMLFactory< + HTMLAttributes<HTMLParagraphElement>, + HTMLParagraphElement + >; + param: DetailedHTMLFactory< + ParamHTMLAttributes<HTMLParamElement>, + HTMLParamElement + >; + picture: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + pre: DetailedHTMLFactory<HTMLAttributes<HTMLPreElement>, HTMLPreElement>; + progress: DetailedHTMLFactory< + ProgressHTMLAttributes<HTMLProgressElement>, + HTMLProgressElement + >; + q: DetailedHTMLFactory< + QuoteHTMLAttributes<HTMLQuoteElement>, + HTMLQuoteElement + >; + rp: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + rt: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + ruby: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + s: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + samp: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + script: DetailedHTMLFactory< + ScriptHTMLAttributes<HTMLScriptElement>, + HTMLScriptElement + >; + section: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + select: DetailedHTMLFactory< + SelectHTMLAttributes<HTMLSelectElement>, + HTMLSelectElement + >; + small: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + source: DetailedHTMLFactory< + SourceHTMLAttributes<HTMLSourceElement>, + HTMLSourceElement + >; + span: DetailedHTMLFactory<HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>; + strong: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + style: DetailedHTMLFactory< + StyleHTMLAttributes<HTMLStyleElement>, + HTMLStyleElement + >; + sub: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + summary: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + sup: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + table: DetailedHTMLFactory< + TableHTMLAttributes<HTMLTableElement>, + HTMLTableElement + >; + template: DetailedHTMLFactory< + HTMLAttributes<HTMLTemplateElement>, + HTMLTemplateElement + >; + tbody: DetailedHTMLFactory< + HTMLAttributes<HTMLTableSectionElement>, + HTMLTableSectionElement + >; + td: DetailedHTMLFactory< + TdHTMLAttributes<HTMLTableDataCellElement>, + HTMLTableDataCellElement + >; + textarea: DetailedHTMLFactory< + TextareaHTMLAttributes<HTMLTextAreaElement>, + HTMLTextAreaElement + >; + tfoot: DetailedHTMLFactory< + HTMLAttributes<HTMLTableSectionElement>, + HTMLTableSectionElement + >; + th: DetailedHTMLFactory< + ThHTMLAttributes<HTMLTableHeaderCellElement>, + HTMLTableHeaderCellElement + >; + thead: DetailedHTMLFactory< + HTMLAttributes<HTMLTableSectionElement>, + HTMLTableSectionElement + >; + time: DetailedHTMLFactory<TimeHTMLAttributes<HTMLElement>, HTMLElement>; + title: DetailedHTMLFactory< + HTMLAttributes<HTMLTitleElement>, + HTMLTitleElement + >; + tr: DetailedHTMLFactory< + HTMLAttributes<HTMLTableRowElement>, + HTMLTableRowElement + >; + track: DetailedHTMLFactory< + TrackHTMLAttributes<HTMLTrackElement>, + HTMLTrackElement + >; + u: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + ul: DetailedHTMLFactory<HTMLAttributes<HTMLUListElement>, HTMLUListElement>; + var: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + video: DetailedHTMLFactory< + VideoHTMLAttributes<HTMLVideoElement>, + HTMLVideoElement + >; + wbr: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>; + webview: DetailedHTMLFactory< + WebViewHTMLAttributes<HTMLWebViewElement>, + HTMLWebViewElement + >; + } + + interface ReactSVG { + animate: SVGFactory; + circle: SVGFactory; + clipPath: SVGFactory; + defs: SVGFactory; + desc: SVGFactory; + ellipse: SVGFactory; + feBlend: SVGFactory; + feColorMatrix: SVGFactory; + feComponentTransfer: SVGFactory; + feComposite: SVGFactory; + feConvolveMatrix: SVGFactory; + feDiffuseLighting: SVGFactory; + feDisplacementMap: SVGFactory; + feDistantLight: SVGFactory; + feDropShadow: SVGFactory; + feFlood: SVGFactory; + feFuncA: SVGFactory; + feFuncB: SVGFactory; + feFuncG: SVGFactory; + feFuncR: SVGFactory; + feGaussianBlur: SVGFactory; + feImage: SVGFactory; + feMerge: SVGFactory; + feMergeNode: SVGFactory; + feMorphology: SVGFactory; + feOffset: SVGFactory; + fePointLight: SVGFactory; + feSpecularLighting: SVGFactory; + feSpotLight: SVGFactory; + feTile: SVGFactory; + feTurbulence: SVGFactory; + filter: SVGFactory; + foreignObject: SVGFactory; + g: SVGFactory; + image: SVGFactory; + line: SVGFactory; + linearGradient: SVGFactory; + marker: SVGFactory; + mask: SVGFactory; + metadata: SVGFactory; + path: SVGFactory; + pattern: SVGFactory; + polygon: SVGFactory; + polyline: SVGFactory; + radialGradient: SVGFactory; + rect: SVGFactory; + stop: SVGFactory; + svg: SVGFactory; + switch: SVGFactory; + symbol: SVGFactory; + text: SVGFactory; + textPath: SVGFactory; + tspan: SVGFactory; + use: SVGFactory; + view: SVGFactory; + } + + interface ReactDOM extends ReactHTML, ReactSVG {} + + // + // React.PropTypes + // ---------------------------------------------------------------------- + + type Validator<T> = PropTypes.Validator<T>; + + type Requireable<T> = PropTypes.Requireable<T>; + + type ValidationMap<T> = PropTypes.ValidationMap<T>; + + type WeakValidationMap<T> = { + [K in keyof T]?: null extends T[K] + ? Validator<T[K] | null | undefined> + : undefined extends T[K] + ? Validator<T[K] | null | undefined> + : Validator<T[K]>; + }; + + interface ReactPropTypes { + any: typeof PropTypes.any; + array: typeof PropTypes.array; + bool: typeof PropTypes.bool; + func: typeof PropTypes.func; + number: typeof PropTypes.number; + object: typeof PropTypes.object; + string: typeof PropTypes.string; + node: typeof PropTypes.node; + element: typeof PropTypes.element; + instanceOf: typeof PropTypes.instanceOf; + oneOf: typeof PropTypes.oneOf; + oneOfType: typeof PropTypes.oneOfType; + arrayOf: typeof PropTypes.arrayOf; + objectOf: typeof PropTypes.objectOf; + shape: typeof PropTypes.shape; + exact: typeof PropTypes.exact; + } + + // + // React.Children + // ---------------------------------------------------------------------- + + interface ReactChildren { + map<T, C>( + children: C | C[], + fn: (child: C, index: number) => T + ): C extends null | undefined + ? C + : Array<Exclude<T, boolean | null | undefined>>; + forEach<C>(children: C | C[], fn: (child: C, index: number) => void): void; + count(children: any): number; + only<C>(children: C): C extends any[] ? never : C; + toArray( + children: ReactNode | ReactNode[] + ): Array<Exclude<ReactNode, boolean | null | undefined>>; + } + + // + // Browser Interfaces + // https://github.com/nikeee/2048-typescript/blob/master/2048/js/touch.d.ts + // ---------------------------------------------------------------------- + + interface AbstractView { + styleMedia: StyleMedia; + document: Document; + } + + interface Touch { + identifier: number; + target: EventTarget; + screenX: number; + screenY: number; + clientX: number; + clientY: number; + pageX: number; + pageY: number; + } + + interface TouchList { + [index: number]: Touch; + length: number; + item(index: number): Touch; + identifiedTouch(identifier: number): Touch; + } + + // + // Error Interfaces + // ---------------------------------------------------------------------- + interface ErrorInfo { + /** + * Captures which component contained the exception, and its ancestors. + */ + componentStack: string; + } +} + +// naked 'any' type in a conditional type will short circuit and union both the then/else branches +// so boolean is only resolved for T = any +type IsExactlyAny<T> = boolean extends (T extends never +? true +: false) + ? true + : false; + +type ExactlyAnyPropertyKeys<T> = { + [K in keyof T]: IsExactlyAny<T[K]> extends true ? K : never; +}[keyof T]; +type NotExactlyAnyPropertyKeys<T> = Exclude<keyof T, ExactlyAnyPropertyKeys<T>>; + +// Try to resolve ill-defined props like for JS users: props can be any, or sometimes objects with properties of type any +type MergePropTypes<P, T> = + // Distribute over P in case it is a union type + P extends any // If props is type any, use propTypes definitions + ? IsExactlyAny<P> extends true + ? T // If declared props have indexed properties, ignore inferred props entirely as keyof gets widened + : string extends keyof P + ? P // Prefer declared types which are not exactly any + : Pick<P, NotExactlyAnyPropertyKeys<P>> & + // For props which are exactly any, use the type inferred from propTypes if present + Pick<T, Exclude<keyof T, NotExactlyAnyPropertyKeys<P>>> & + // Keep leftover props not specified in propTypes + Pick<P, Exclude<keyof P, keyof T>> + : never; + +// Any prop that has a default prop becomes optional, but its type is unchanged +// Undeclared default props are augmented into the resulting allowable attributes +// If declared props have indexed properties, ignore default props entirely as keyof gets widened +// Wrap in an outer-level conditional type to allow distribution over props that are unions +type Defaultize<P, D> = P extends any + ? string extends keyof P + ? P + : Pick<P, Exclude<keyof P, keyof D>> & + Partial<Pick<P, Extract<keyof P, keyof D>>> & + Partial<Pick<D, Exclude<keyof D, keyof P>>> + : never; + +type ReactManagedAttributes<C, P> = C extends { + propTypes: infer T; + defaultProps: infer D; +} + ? Defaultize<MergePropTypes<P, PropTypes.InferProps<T>>, D> + : C extends { propTypes: infer T } + ? MergePropTypes<P, PropTypes.InferProps<T>> + : C extends { defaultProps: infer D } + ? Defaultize<P, D> + : P; + +declare global { + namespace JSX { + // tslint:disable-next-line:no-empty-interface + interface Element extends React.ReactElement<any, any> {} + interface ElementClass extends React.Component<any> { + render(): React.ReactNode; + } + interface ElementAttributesProperty { + props: {}; + } + interface ElementChildrenAttribute { + children: {}; + } + + // We can't recurse forever because `type` can't be self-referential; + // let's assume it's reasonable to do a single React.lazy() around a single React.memo() / vice-versa + type LibraryManagedAttributes<C, P> = C extends + | React.MemoExoticComponent<infer T> + | React.LazyExoticComponent<infer T> + ? T extends + | React.MemoExoticComponent<infer U> + | React.LazyExoticComponent<infer U> + ? ReactManagedAttributes<U, P> + : ReactManagedAttributes<T, P> + : ReactManagedAttributes<C, P>; + + // tslint:disable-next-line:no-empty-interface + interface IntrinsicAttributes extends React.Attributes {} + // tslint:disable-next-line:no-empty-interface + interface IntrinsicClassAttributes<T> extends React.ClassAttributes<T> {} + + interface IntrinsicElements { + // HTML + a: React.DetailedHTMLProps< + React.AnchorHTMLAttributes<HTMLAnchorElement>, + HTMLAnchorElement + >; + abbr: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + address: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + area: React.DetailedHTMLProps< + React.AreaHTMLAttributes<HTMLAreaElement>, + HTMLAreaElement + >; + article: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + aside: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + audio: React.DetailedHTMLProps< + React.AudioHTMLAttributes<HTMLAudioElement>, + HTMLAudioElement + >; + b: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + base: React.DetailedHTMLProps< + React.BaseHTMLAttributes<HTMLBaseElement>, + HTMLBaseElement + >; + bdi: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + bdo: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + big: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + blockquote: React.DetailedHTMLProps< + React.BlockquoteHTMLAttributes<HTMLElement>, + HTMLElement + >; + body: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLBodyElement>, + HTMLBodyElement + >; + br: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLBRElement>, + HTMLBRElement + >; + button: React.DetailedHTMLProps< + React.ButtonHTMLAttributes<HTMLButtonElement>, + HTMLButtonElement + >; + canvas: React.DetailedHTMLProps< + React.CanvasHTMLAttributes<HTMLCanvasElement>, + HTMLCanvasElement + >; + caption: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + cite: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + code: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + col: React.DetailedHTMLProps< + React.ColHTMLAttributes<HTMLTableColElement>, + HTMLTableColElement + >; + colgroup: React.DetailedHTMLProps< + React.ColgroupHTMLAttributes<HTMLTableColElement>, + HTMLTableColElement + >; + data: React.DetailedHTMLProps< + React.DataHTMLAttributes<HTMLDataElement>, + HTMLDataElement + >; + datalist: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLDataListElement>, + HTMLDataListElement + >; + dd: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + del: React.DetailedHTMLProps< + React.DelHTMLAttributes<HTMLElement>, + HTMLElement + >; + details: React.DetailedHTMLProps< + React.DetailsHTMLAttributes<HTMLElement>, + HTMLElement + >; + dfn: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + dialog: React.DetailedHTMLProps< + React.DialogHTMLAttributes<HTMLDialogElement>, + HTMLDialogElement + >; + div: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLDivElement>, + HTMLDivElement + >; + dl: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLDListElement>, + HTMLDListElement + >; + dt: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + em: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + embed: React.DetailedHTMLProps< + React.EmbedHTMLAttributes<HTMLEmbedElement>, + HTMLEmbedElement + >; + fieldset: React.DetailedHTMLProps< + React.FieldsetHTMLAttributes<HTMLFieldSetElement>, + HTMLFieldSetElement + >; + figcaption: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + figure: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + footer: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + form: React.DetailedHTMLProps< + React.FormHTMLAttributes<HTMLFormElement>, + HTMLFormElement + >; + h1: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLHeadingElement>, + HTMLHeadingElement + >; + h2: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLHeadingElement>, + HTMLHeadingElement + >; + h3: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLHeadingElement>, + HTMLHeadingElement + >; + h4: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLHeadingElement>, + HTMLHeadingElement + >; + h5: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLHeadingElement>, + HTMLHeadingElement + >; + h6: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLHeadingElement>, + HTMLHeadingElement + >; + head: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLHeadElement>, + HTMLHeadElement + >; + header: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + hgroup: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + hr: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLHRElement>, + HTMLHRElement + >; + html: React.DetailedHTMLProps< + React.HtmlHTMLAttributes<HTMLHtmlElement>, + HTMLHtmlElement + >; + i: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + iframe: React.DetailedHTMLProps< + React.IframeHTMLAttributes<HTMLIFrameElement>, + HTMLIFrameElement + >; + img: React.DetailedHTMLProps< + React.ImgHTMLAttributes<HTMLImageElement>, + HTMLImageElement + >; + input: React.DetailedHTMLProps< + React.InputHTMLAttributes<HTMLInputElement>, + HTMLInputElement + >; + ins: React.DetailedHTMLProps< + React.InsHTMLAttributes<HTMLModElement>, + HTMLModElement + >; + kbd: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + keygen: React.DetailedHTMLProps< + React.KeygenHTMLAttributes<HTMLElement>, + HTMLElement + >; + label: React.DetailedHTMLProps< + React.LabelHTMLAttributes<HTMLLabelElement>, + HTMLLabelElement + >; + legend: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLLegendElement>, + HTMLLegendElement + >; + li: React.DetailedHTMLProps< + React.LiHTMLAttributes<HTMLLIElement>, + HTMLLIElement + >; + link: React.DetailedHTMLProps< + React.LinkHTMLAttributes<HTMLLinkElement>, + HTMLLinkElement + >; + main: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + map: React.DetailedHTMLProps< + React.MapHTMLAttributes<HTMLMapElement>, + HTMLMapElement + >; + mark: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + menu: React.DetailedHTMLProps< + React.MenuHTMLAttributes<HTMLElement>, + HTMLElement + >; + menuitem: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + meta: React.DetailedHTMLProps< + React.MetaHTMLAttributes<HTMLMetaElement>, + HTMLMetaElement + >; + meter: React.DetailedHTMLProps< + React.MeterHTMLAttributes<HTMLElement>, + HTMLElement + >; + nav: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + noindex: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + noscript: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + object: React.DetailedHTMLProps< + React.ObjectHTMLAttributes<HTMLObjectElement>, + HTMLObjectElement + >; + ol: React.DetailedHTMLProps< + React.OlHTMLAttributes<HTMLOListElement>, + HTMLOListElement + >; + optgroup: React.DetailedHTMLProps< + React.OptgroupHTMLAttributes<HTMLOptGroupElement>, + HTMLOptGroupElement + >; + option: React.DetailedHTMLProps< + React.OptionHTMLAttributes<HTMLOptionElement>, + HTMLOptionElement + >; + output: React.DetailedHTMLProps< + React.OutputHTMLAttributes<HTMLElement>, + HTMLElement + >; + p: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLParagraphElement>, + HTMLParagraphElement + >; + param: React.DetailedHTMLProps< + React.ParamHTMLAttributes<HTMLParamElement>, + HTMLParamElement + >; + picture: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + pre: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLPreElement>, + HTMLPreElement + >; + progress: React.DetailedHTMLProps< + React.ProgressHTMLAttributes<HTMLProgressElement>, + HTMLProgressElement + >; + q: React.DetailedHTMLProps< + React.QuoteHTMLAttributes<HTMLQuoteElement>, + HTMLQuoteElement + >; + rp: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + rt: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + ruby: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + s: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + samp: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + script: React.DetailedHTMLProps< + React.ScriptHTMLAttributes<HTMLScriptElement>, + HTMLScriptElement + >; + section: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + select: React.DetailedHTMLProps< + React.SelectHTMLAttributes<HTMLSelectElement>, + HTMLSelectElement + >; + small: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + source: React.DetailedHTMLProps< + React.SourceHTMLAttributes<HTMLSourceElement>, + HTMLSourceElement + >; + span: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLSpanElement>, + HTMLSpanElement + >; + strong: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + style: React.DetailedHTMLProps< + React.StyleHTMLAttributes<HTMLStyleElement>, + HTMLStyleElement + >; + sub: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + summary: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + sup: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + table: React.DetailedHTMLProps< + React.TableHTMLAttributes<HTMLTableElement>, + HTMLTableElement + >; + template: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLTemplateElement>, + HTMLTemplateElement + >; + tbody: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLTableSectionElement>, + HTMLTableSectionElement + >; + td: React.DetailedHTMLProps< + React.TdHTMLAttributes<HTMLTableDataCellElement>, + HTMLTableDataCellElement + >; + textarea: React.DetailedHTMLProps< + React.TextareaHTMLAttributes<HTMLTextAreaElement>, + HTMLTextAreaElement + >; + tfoot: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLTableSectionElement>, + HTMLTableSectionElement + >; + th: React.DetailedHTMLProps< + React.ThHTMLAttributes<HTMLTableHeaderCellElement>, + HTMLTableHeaderCellElement + >; + thead: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLTableSectionElement>, + HTMLTableSectionElement + >; + time: React.DetailedHTMLProps< + React.TimeHTMLAttributes<HTMLElement>, + HTMLElement + >; + title: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLTitleElement>, + HTMLTitleElement + >; + tr: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLTableRowElement>, + HTMLTableRowElement + >; + track: React.DetailedHTMLProps< + React.TrackHTMLAttributes<HTMLTrackElement>, + HTMLTrackElement + >; + u: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + ul: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLUListElement>, + HTMLUListElement + >; + var: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + video: React.DetailedHTMLProps< + React.VideoHTMLAttributes<HTMLVideoElement>, + HTMLVideoElement + >; + wbr: React.DetailedHTMLProps< + React.HTMLAttributes<HTMLElement>, + HTMLElement + >; + webview: React.DetailedHTMLProps< + React.WebViewHTMLAttributes<HTMLWebViewElement>, + HTMLWebViewElement + >; + + // SVG + svg: React.SVGProps<SVGSVGElement>; + + animate: React.SVGProps<SVGElement>; // TODO: It is SVGAnimateElement but is not in TypeScript's lib.dom.d.ts for now. + animateMotion: React.SVGProps<SVGElement>; + animateTransform: React.SVGProps<SVGElement>; // TODO: It is SVGAnimateTransformElement but is not in TypeScript's lib.dom.d.ts for now. + circle: React.SVGProps<SVGCircleElement>; + clipPath: React.SVGProps<SVGClipPathElement>; + defs: React.SVGProps<SVGDefsElement>; + desc: React.SVGProps<SVGDescElement>; + ellipse: React.SVGProps<SVGEllipseElement>; + feBlend: React.SVGProps<SVGFEBlendElement>; + feColorMatrix: React.SVGProps<SVGFEColorMatrixElement>; + feComponentTransfer: React.SVGProps<SVGFEComponentTransferElement>; + feComposite: React.SVGProps<SVGFECompositeElement>; + feConvolveMatrix: React.SVGProps<SVGFEConvolveMatrixElement>; + feDiffuseLighting: React.SVGProps<SVGFEDiffuseLightingElement>; + feDisplacementMap: React.SVGProps<SVGFEDisplacementMapElement>; + feDistantLight: React.SVGProps<SVGFEDistantLightElement>; + feDropShadow: React.SVGProps<SVGFEDropShadowElement>; + feFlood: React.SVGProps<SVGFEFloodElement>; + feFuncA: React.SVGProps<SVGFEFuncAElement>; + feFuncB: React.SVGProps<SVGFEFuncBElement>; + feFuncG: React.SVGProps<SVGFEFuncGElement>; + feFuncR: React.SVGProps<SVGFEFuncRElement>; + feGaussianBlur: React.SVGProps<SVGFEGaussianBlurElement>; + feImage: React.SVGProps<SVGFEImageElement>; + feMerge: React.SVGProps<SVGFEMergeElement>; + feMergeNode: React.SVGProps<SVGFEMergeNodeElement>; + feMorphology: React.SVGProps<SVGFEMorphologyElement>; + feOffset: React.SVGProps<SVGFEOffsetElement>; + fePointLight: React.SVGProps<SVGFEPointLightElement>; + feSpecularLighting: React.SVGProps<SVGFESpecularLightingElement>; + feSpotLight: React.SVGProps<SVGFESpotLightElement>; + feTile: React.SVGProps<SVGFETileElement>; + feTurbulence: React.SVGProps<SVGFETurbulenceElement>; + filter: React.SVGProps<SVGFilterElement>; + foreignObject: React.SVGProps<SVGForeignObjectElement>; + g: React.SVGProps<SVGGElement>; + image: React.SVGProps<SVGImageElement>; + line: React.SVGProps<SVGLineElement>; + linearGradient: React.SVGProps<SVGLinearGradientElement>; + marker: React.SVGProps<SVGMarkerElement>; + mask: React.SVGProps<SVGMaskElement>; + metadata: React.SVGProps<SVGMetadataElement>; + mpath: React.SVGProps<SVGElement>; + path: React.SVGProps<SVGPathElement>; + pattern: React.SVGProps<SVGPatternElement>; + polygon: React.SVGProps<SVGPolygonElement>; + polyline: React.SVGProps<SVGPolylineElement>; + radialGradient: React.SVGProps<SVGRadialGradientElement>; + rect: React.SVGProps<SVGRectElement>; + stop: React.SVGProps<SVGStopElement>; + switch: React.SVGProps<SVGSwitchElement>; + symbol: React.SVGProps<SVGSymbolElement>; + text: React.SVGProps<SVGTextElement>; + textPath: React.SVGProps<SVGTextPathElement>; + tspan: React.SVGProps<SVGTSpanElement>; + use: React.SVGProps<SVGUseElement>; + view: React.SVGProps<SVGViewElement>; + } + } +} |