diff --git a/README.md b/README.md
index d461fc075a..7fb17ee162 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
-
+

@@ -15,7 +15,6 @@
- Highly optimized diff algorithm and seamless hydration from Server Side Rendering
- Supports all modern browsers and IE11
- Transparent asynchronous rendering with a pluggable scheduler
-- **Instant production-grade app setup with [Preact CLI](https://github.com/preactjs/preact-cli)**
### 💁 More information at the [Preact Website ➞](https://preactjs.com)
@@ -52,8 +51,6 @@ You can find some awesome libraries in the [awesome-preact list](https://github.
> 💁 _**Note:** You [don't need ES2015 to use Preact](https://github.com/developit/preact-in-es3)... but give it a try!_
-The easiest way to get started with Preact is to install [Preact CLI](https://github.com/preactjs/preact-cli). This simple command-line tool wraps up the best possible tooling for you, and even keeps things like Webpack and Babel up-to-date as they change. Best of all, it's easy to understand! Start a project or compile for production in a single command (`preact build`), with no configuration needed and best practices baked in! 🙌
-
#### Tutorial: Building UI with Preact
With Preact, you create user interfaces by assembling trees of components and elements. Components are functions or classes that return a description of what their tree should output. These descriptions are typically written in [JSX](https://facebook.github.io/jsx/) (shown underneath), or [HTM](https://github.com/developit/htm) which leverages standard JavaScript Tagged Templates. Both syntaxes can express trees of elements with "props" (similar to HTML attributes) and children.
diff --git a/compat/src/index.js b/compat/src/index.js
index 587dcd6c4e..9c10c18215 100644
--- a/compat/src/index.js
+++ b/compat/src/index.js
@@ -116,7 +116,7 @@ const StrictMode = Fragment;
* @template Arg
* @template Result
* @param {(arg: Arg) => Result} callback function that runs before the flush
- * @param {Arg} [arg] Optional arugment that can be passed to the callback
+ * @param {Arg} [arg] Optional argument that can be passed to the callback
* @returns
*/
const flushSync = (callback, arg) => callback(arg);
diff --git a/compat/test/browser/context.test.js b/compat/test/browser/context.test.js
new file mode 100644
index 0000000000..ec6f3ba1cd
--- /dev/null
+++ b/compat/test/browser/context.test.js
@@ -0,0 +1,144 @@
+import { setupRerender } from 'preact/test-utils';
+import { setupScratch, teardown } from '../../../test/_util/helpers';
+import React, {
+ render,
+ createElement,
+ createContext,
+ Component,
+ useState,
+ useContext
+} from 'preact/compat';
+
+describe('components', () => {
+ /** @type {HTMLDivElement} */
+ let scratch;
+
+ /** @type {() => void} */
+ let rerender;
+
+ beforeEach(() => {
+ scratch = setupScratch();
+ rerender = setupRerender();
+ });
+
+ afterEach(() => {
+ teardown(scratch);
+ });
+
+ it('nested context updates propagate throughout the tree synchronously', () => {
+ const RouterContext = createContext({ location: '__default_value__' });
+
+ const route1 = '/page/1';
+ const route2 = '/page/2';
+
+ /** @type {() => void} */
+ let toggleLocalState;
+ /** @type {() => void} */
+ let toggleLocation;
+
+ /** @type {Array<{location: string, localState: boolean}>} */
+ let pageRenders = [];
+
+ function runUpdate() {
+ toggleLocalState();
+ toggleLocation();
+ }
+
+ /**
+ * @extends {React.Component<{children: any}, {location: string}>}
+ */
+ class Router extends Component {
+ constructor(props) {
+ super(props);
+ this.state = { location: route1 };
+ toggleLocation = () => {
+ const oldLocation = this.state.location;
+ const newLocation = oldLocation === route1 ? route2 : route1;
+ // console.log('Toggling location', oldLocation, '->', newLocation);
+ this.setState({ location: newLocation });
+ };
+ }
+
+ render() {
+ // console.log('Rendering Router', { location: this.state.location });
+ return (
+
+ {this.props.children}
+
+ );
+ }
+ }
+
+ /**
+ * @extends {React.Component<{children: any}>}
+ */
+ class Route extends Component {
+ render() {
+ return (
+
+ {(contextValue) => {
+ // console.log('Rendering Route', {
+ // location: contextValue.location
+ // });
+ // Pretend to do something with the context value
+ const newContextValue = { ...contextValue };
+ return (
+
+ {this.props.children}
+
+ );
+ }}
+
+ );
+ }
+ }
+
+ function Page() {
+ const [localState, setLocalState] = useState(true);
+ const { location } = useContext(RouterContext);
+
+ pageRenders.push({ location, localState });
+ // console.log('Rendering Page', { location, localState });
+
+ toggleLocalState = () => {
+ let newValue = !localState;
+ // console.log('Toggling localState', localState, '->', newValue);
+ setLocalState(newValue);
+ };
+
+ return (
+ <>
+
localState: {localState.toString()}
+ location: {location}
+
+
+
+ >
+ );
+ }
+
+ function App() {
+ return (
+
+
+
+
+
+ );
+ }
+
+ render(, scratch);
+ expect(pageRenders).to.deep.equal([{ location: route1, localState: true }]);
+
+ pageRenders = [];
+ runUpdate(); // Simulate button click
+ rerender();
+
+ // Page should rerender once with both propagated context and local state updates
+ expect(pageRenders).to.deep.equal([
+ { location: route2, localState: false }
+ ]);
+ });
+});
diff --git a/compat/test/browser/suspense.test.js b/compat/test/browser/suspense.test.js
index 0435b05ece..9168bd2175 100644
--- a/compat/test/browser/suspense.test.js
+++ b/compat/test/browser/suspense.test.js
@@ -15,6 +15,7 @@ import { createLazy, createSuspender } from './suspense-utils';
const h = React.createElement;
/* eslint-env browser, mocha */
+// TODO: https://github.com/preactjs/preact/pull/3856
class Catcher extends Component {
constructor(props) {
super(props);
@@ -192,7 +193,9 @@ describe('suspense', () => {
}
}
- const FuncWrapper = props => {props.children}
;
+ const FuncWrapper = (props) => (
+ {props.children}
+ );
const [Suspender, suspend] = createSuspender(() => Hello
);
@@ -228,7 +231,7 @@ describe('suspense', () => {
/** @type {() => Promise} */
let resolve;
let resolved = false;
- const promise = new Promise(_resolve => {
+ const promise = new Promise((_resolve) => {
resolve = () => {
resolved = true;
_resolve();
@@ -296,7 +299,7 @@ describe('suspense', () => {
/** @type {() => Promise} */
let resolve;
let resolved = false;
- const promise = new Promise(_resolve => {
+ const promise = new Promise((_resolve) => {
resolve = () => {
resolved = true;
_resolve();
@@ -1290,7 +1293,7 @@ describe('suspense', () => {
/** @type {() => Promise} */
let resolve;
let resolved = false;
- const promise = new Promise(_resolve => {
+ const promise = new Promise((_resolve) => {
resolve = () => {
resolved = true;
_resolve();
@@ -1298,7 +1301,7 @@ describe('suspense', () => {
};
});
- const Child = props => {
+ const Child = (props) => {
if (!resolved) {
throw promise;
}
@@ -1445,10 +1448,10 @@ describe('suspense', () => {
});
it('should allow same component to be suspended multiple times', async () => {
- const cache = { '1': true };
+ const cache = { 1: true };
function Lazy({ value }) {
if (!cache[value]) {
- throw new Promise(resolve => {
+ throw new Promise((resolve) => {
cache[value] = resolve;
});
}
@@ -1468,7 +1471,7 @@ describe('suspense', () => {
hide = () => {
this.setState({ show: false });
};
- setValue = value => {
+ setValue = (value) => {
this.setState({ value });
};
}
@@ -1632,7 +1635,7 @@ describe('suspense', () => {
let increment;
function Updater() {
const [i, setState] = useState(0);
- increment = () => setState(i => i + 1);
+ increment = () => setState((i) => i + 1);
return (
i: {i}
@@ -1688,7 +1691,7 @@ describe('suspense', () => {
let hide;
let suspender = null;
- let suspenderRef = s => {
+ let suspenderRef = (s) => {
// skip null values as we want to keep the ref even after unmount
if (s) {
suspender = s;
@@ -1858,7 +1861,7 @@ describe('suspense', () => {
return this.state.content;
}
}
- return [content => suspender.unsuspend(content), Suspender];
+ return [(content) => suspender.unsuspend(content), Suspender];
}
const [unsuspender1, Suspender1] = createSuspender();
@@ -2130,7 +2133,7 @@ describe('suspense', () => {
const suspense = (
Suspended...
}>
- {value => }
+ {(value) => }
);
@@ -2139,7 +2142,7 @@ describe('suspense', () => {
rerender();
expect(scratch.innerHTML).to.equal(`Suspended...
`);
- return resolve(props => {props.value}
).then(() => {
+ return resolve((props) => {props.value}
).then(() => {
rerender();
expect(scratch.innerHTML).to.eql(`123
`);
});
@@ -2154,7 +2157,7 @@ describe('suspense', () => {
const suspense = (
Suspended...}>
- {value => }
+ {(value) => }
);
@@ -2166,7 +2169,7 @@ describe('suspense', () => {
rerender();
expect(scratch.innerHTML).to.equal(`Suspended...
`);
- return resolve(props => {props.value}
).then(() => {
+ return resolve((props) => {props.value}
).then(() => {
rerender();
expect(scratch.innerHTML).to.eql(`123
`);
});
diff --git a/debug/src/debug.js b/debug/src/debug.js
index 61ecb46ae5..9b1e42146e 100644
--- a/debug/src/debug.js
+++ b/debug/src/debug.js
@@ -70,7 +70,7 @@ export function initDebug() {
try {
oldCatchError(error, vnode, oldVNode);
- // when an error was handled by an ErrorBoundary we will nontheless emit an error
+ // when an error was handled by an ErrorBoundary we will nonetheless emit an error
// event on the window object. This is to make up for react compatibility in dev mode
// and thus make the Next.js dev overlay work.
if (typeof error.then != 'function') {
@@ -120,6 +120,7 @@ export function initDebug() {
// `{{ foo: 123, bar: "abc" }}`).
if (vnode.constructor !== undefined) {
const keys = Object.keys(vnode).join(',');
+ // TODO: https://github.com/preactjs/preact/pull/3801
throw new Error(
`Objects are not valid as a child. Encountered an object with the keys {${keys}}.` +
`\n\n${getOwnerStack(internal)}`
@@ -327,7 +328,7 @@ export function initDebug() {
// https://esbench.com/bench/6021ebd7d9c27600a7bfdba3
const deprecatedProto = Object.create({}, deprecatedAttributes);
- options.vnode = vnode => {
+ options.vnode = (vnode) => {
const props = vnode.props;
if (props != null && ('__source' in props || '__self' in props)) {
Object.defineProperties(props, debugProps);
@@ -340,7 +341,7 @@ export function initDebug() {
if (oldVnode) oldVnode(vnode);
};
- options.diffed = vnode => {
+ options.diffed = (vnode) => {
hooksAllowed = false;
if (oldDiffed) oldDiffed(vnode);
@@ -374,7 +375,7 @@ export function initDebug() {
const setState = Component.prototype.setState;
/** @this {import('../../src/internal').Component} */
-Component.prototype.setState = function(update, callback) {
+Component.prototype.setState = function (update, callback) {
if (this._internal == null) {
// `this._internal` will be `null` during componentWillMount. But it
// is perfectly valid to call `setState` during cWM. So we
diff --git a/jsx-runtime/src/index.js b/jsx-runtime/src/index.js
index 85dd545379..c5b23efdc7 100644
--- a/jsx-runtime/src/index.js
+++ b/jsx-runtime/src/index.js
@@ -20,10 +20,11 @@ let vnodeId = 0;
* @param {VNode['type']} type
* @param {VNode['props']} props
* @param {VNode['key']} [key]
- * @param {string} [__source]
- * @param {string} [__self]
+ * @param {unknown} [isStaticChildren]
+ * @param {unknown} [__source]
+ * @param {unknown} [__self]
*/
-function createVNode(type, props, key, __source, __self) {
+function createVNode(type, props, key, isStaticChildren, __source, __self) {
// We'll want to preserve `ref` in props to get rid of the need for
// forwardRef components in the future, but that should happen via
// a separate PR.
diff --git a/jsx-runtime/test/browser/jsx-runtime.test.js b/jsx-runtime/test/browser/jsx-runtime.test.js
index 2f66993e1c..acec971d29 100644
--- a/jsx-runtime/test/browser/jsx-runtime.test.js
+++ b/jsx-runtime/test/browser/jsx-runtime.test.js
@@ -1,4 +1,4 @@
-import { Component, createElement, createRef } from 'preact';
+import { createElement, createRef } from 'preact';
import { jsx, jsxs, jsxDEV, Fragment } from 'preact/jsx-runtime';
import { setupScratch, teardown } from '../../../test/_util/helpers';
@@ -32,7 +32,7 @@ describe('Babel jsx/jsxDEV', () => {
});
it('should set __source and __self', () => {
- const vnode = jsx('div', { class: 'foo' }, 'key', 'source', 'self');
+ const vnode = jsx('div', { class: 'foo' }, 'key', false, 'source', 'self');
expect(vnode.__source).to.equal('source');
expect(vnode.__self).to.equal('self');
});
diff --git a/src/component.js b/src/component.js
index 795b652b41..551fbe2c6d 100644
--- a/src/component.js
+++ b/src/component.js
@@ -29,7 +29,7 @@ export function Component(props, context) {
* @param {() => void} [callback] A function to be called once component state is
* updated
*/
-Component.prototype.setState = function(update, callback) {
+Component.prototype.setState = function (update, callback) {
// only clone state when copying to nextState the first time.
let s;
if (this._nextState != null && this._nextState !== this.state) {
@@ -64,7 +64,7 @@ Component.prototype.setState = function(update, callback) {
* @param {() => void} [callback] A function to be called after component is
* re-rendered
*/
-Component.prototype.forceUpdate = function(callback) {
+Component.prototype.forceUpdate = function (callback) {
const internal = this._internal;
if (internal) {
// Set render mode so that we can differentiate where the render request
@@ -141,11 +141,22 @@ export function enqueueRender(internal) {
/** Flush the render queue by rerendering all queued components */
function processRenderQueue() {
- while ((len = processRenderQueue._rerenderCount = renderQueue.length)) {
- renderQueue.sort((a, b) => a._depth - b._depth);
- while (len--) {
- renderQueuedInternal(renderQueue.shift());
+ let c;
+ renderQueue.sort((a, b) => a._depth - b._depth);
+ // Don't update `renderCount` yet. Keep its value non-zero to prevent unnecessary
+ // process() calls from getting scheduled while `queue` is still being consumed.
+ while ((c = renderQueue.shift())) {
+ if (c.flags & DIRTY_BIT) {
+ let renderQueueLength = renderQueue.length;
+ renderQueuedInternal(c);
+ if (renderQueue.length > renderQueueLength) {
+ // When i.e. rerendering a provider additional new items can be injected, we want to
+ // keep the order from top to bottom with those new items so we can handle them in a
+ // single pass
+ renderQueue.sort((a, b) => a._depth - b._depth);
+ }
}
}
+ processRenderQueue._rerenderCount = 0;
}
-let len = (processRenderQueue._rerenderCount = 0);
+processRenderQueue._rerenderCount = 0;
diff --git a/src/create-context.js b/src/create-context.js
index ccb0a67885..191cde99e7 100644
--- a/src/create-context.js
+++ b/src/create-context.js
@@ -1,15 +1,16 @@
import { enqueueRender } from './component';
+import { FORCE_UPDATE } from './constants';
let nextContextId = 0;
const providers = new Set();
/** @param {import('./internal').Internal} internal */
-export const unsubscribeFromContext = internal => {
+export const unsubscribeFromContext = (internal) => {
// if this was a context provider, delete() returns true and we exit:
if (providers.delete(internal)) return;
// ... otherwise, unsubscribe from any contexts:
- providers.forEach(p => {
+ providers.forEach((p) => {
p._component._subs.delete(internal);
});
};
@@ -39,7 +40,10 @@ export const createContext = (defaultValue, contextId) => {
}
// re-render subscribers in response to value change
else if (props.value !== this._prev) {
- this._subs.forEach(enqueueRender);
+ this._subs.forEach((internal) => {
+ internal.flags |= FORCE_UPDATE;
+ enqueueRender(internal);
+ });
}
this._prev = props.value;
@@ -53,5 +57,6 @@ export const createContext = (defaultValue, contextId) => {
// of on the component itself. See:
// https://reactjs.org/docs/context.html#contextdisplayname
- return (context.Provider._contextRef = context.Consumer.contextType = context);
+ return (context.Provider._contextRef = context.Consumer.contextType =
+ context);
};
diff --git a/src/diff/props.js b/src/diff/props.js
index 24cc19ba23..e5d9408939 100644
--- a/src/diff/props.js
+++ b/src/diff/props.js
@@ -2,7 +2,7 @@ import options from '../options';
function setStyle(dom, key, value) {
if (key[0] === '-') {
- dom.style.setProperty(key, value);
+ dom.style.setProperty(key, value == null ? '' : value);
} else {
dom.style[key] = value == null ? '' : value;
}
@@ -69,6 +69,8 @@ export function setProperty(dom, name, value, oldValue, isSvg) {
// - className --> class
name = name.replace(/xlink[H:h]/, 'h').replace(/sName$/, 's');
} else if (
+ name !== 'width' &&
+ name !== 'height' &&
name !== 'href' &&
name !== 'list' &&
name !== 'form' &&
diff --git a/src/index.d.ts b/src/index.d.ts
index b9b1f6986d..60aeece24b 100644
--- a/src/index.d.ts
+++ b/src/index.d.ts
@@ -53,8 +53,8 @@ export type ComponentChild =
export type ComponentChildren = ComponentChild[] | ComponentChild;
export interface Attributes {
- key?: Key;
- jsx?: boolean;
+ key?: Key | undefined;
+ jsx?: boolean | undefined;
}
export interface ClassAttributes extends Attributes {
@@ -270,14 +270,18 @@ export namespace h {
// Preact render
// -----------------------------------
-export function render(
- vnode: ComponentChild,
- parent: Element | Document | ShadowRoot | DocumentFragment
-): void;
-export function hydrate(
- vnode: ComponentChild,
- parent: Element | Document | ShadowRoot | DocumentFragment
-): void;
+interface ContainerNode {
+ nodeType: Node['nodeType'];
+ parentNode: Node['parentNode'];
+ firstChild: Node['firstChild'];
+ insertBefore: Node['insertBefore'];
+ appendChild: Node['appendChild'];
+ removeChild: Node['removeChild'];
+ childNodes: ArrayLike;
+}
+
+export function render(vnode: ComponentChild, parent: ContainerNode): void;
+export function hydrate(vnode: ComponentChild, parent: ContainerNode): void;
export function cloneElement(
vnode: VNode,
props?: any,
diff --git a/src/jsx.d.ts b/src/jsx.d.ts
index 2d41f2ccc9..8fd016cd00 100644
--- a/src/jsx.d.ts
+++ b/src/jsx.d.ts
@@ -4,6 +4,9 @@
import {
ClassAttributes,
Component,
+ ComponentChild,
+ ComponentType,
+ FunctionComponent,
PreactDOMAttributes,
VNode
} from './index';
@@ -26,9 +29,15 @@ export namespace JSXInternal {
key?: any;
}
+ export type ElementType =
+ | {
+ [K in keyof IntrinsicElements]: P extends IntrinsicElements[K]
+ ? K
+ : never;
+ }[keyof IntrinsicElements]
+ | ComponentType
;
export interface Element extends VNode {}
-
- export interface ElementClass extends Component {}
+ export type ElementClass = Component | FunctionComponent;
export interface ElementAttributesProperty {
props: any;
@@ -55,11 +64,29 @@ export namespace JSXInternal {
cssText?: string | null;
}
+ export interface SignalLike {
+ value: T;
+ peek(): T;
+ subscribe(fn: (value: T) => void): () => void;
+ }
+
export interface SVGAttributes
extends HTMLAttributes {
- accentHeight?: number | string;
- accumulate?: 'none' | 'sum';
- additive?: 'replace' | 'sum';
+ accentHeight?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ accumulate?:
+ | 'none'
+ | 'sum'
+ | undefined
+ | SignalLike<'none' | 'sum' | undefined>;
+ additive?:
+ | 'replace'
+ | 'sum'
+ | undefined
+ | SignalLike<'replace' | 'sum' | undefined>;
alignmentBaseline?:
| 'auto'
| 'baseline'
@@ -73,242 +100,920 @@ export namespace JSXInternal {
| '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?: number | string;
- 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?: number | string;
- fill?: string;
- fillOpacity?: number | string;
- fillRule?: 'nonzero' | 'evenodd' | 'inherit';
- filter?: string;
- filterRes?: number | string;
- filterUnits?: number | string;
- floodColor?: number | string;
- floodOpacity?: number | string;
- focusable?: number | string;
- 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;
- 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?: number | string;
- 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?: string | number;
- 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;
+ | 'inherit'
+ | undefined
+ | SignalLike<
+ | 'auto'
+ | 'baseline'
+ | 'before-edge'
+ | 'text-before-edge'
+ | 'middle'
+ | 'central'
+ | 'after-edge'
+ | 'text-after-edge'
+ | 'ideographic'
+ | 'alphabetic'
+ | 'hanging'
+ | 'mathematical'
+ | 'inherit'
+ | undefined
+ >;
+ allowReorder?:
+ | 'no'
+ | 'yes'
+ | undefined
+ | SignalLike<'no' | 'yes' | undefined>;
+ alphabetic?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ amplitude?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ arabicForm?:
+ | 'initial'
+ | 'medial'
+ | 'terminal'
+ | 'isolated'
+ | undefined
+ | SignalLike<'initial' | 'medial' | 'terminal' | 'isolated' | undefined>;
+ ascent?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ attributeName?: string | undefined | SignalLike;
+ attributeType?: string | undefined | SignalLike;
+ autoReverse?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ azimuth?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ baseFrequency?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ baselineShift?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ baseProfile?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ bbox?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ begin?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ bias?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ by?: number | string | undefined | SignalLike;
+ calcMode?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ capHeight?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ clip?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ clipPath?: string | undefined | SignalLike;
+ clipPathUnits?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ clipRule?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ colorInterpolation?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ colorInterpolationFilters?:
+ | 'auto'
+ | 'sRGB'
+ | 'linearRGB'
+ | 'inherit'
+ | undefined
+ | SignalLike<'auto' | 'sRGB' | 'linearRGB' | 'inherit' | undefined>;
+ colorProfile?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ colorRendering?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ contentScriptType?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ contentStyleType?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ cursor?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ cx?: number | string | undefined | SignalLike;
+ cy?: number | string | undefined | SignalLike;
+ d?: string | undefined | SignalLike;
+ decelerate?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ descent?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ diffuseConstant?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ direction?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ display?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ divisor?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ dominantBaseline?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ dur?: number | string | undefined | SignalLike;
+ dx?: number | string | undefined | SignalLike;
+ dy?: number | string | undefined | SignalLike;
+ edgeMode?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ elevation?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ enableBackground?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ end?: number | string | undefined | SignalLike;
+ exponent?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ externalResourcesRequired?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ fill?: string | undefined | SignalLike;
+ fillOpacity?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ fillRule?:
+ | 'nonzero'
+ | 'evenodd'
+ | 'inherit'
+ | undefined
+ | SignalLike<'nonzero' | 'evenodd' | 'inherit' | undefined>;
+ filter?: string | undefined | SignalLike;
+ filterRes?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ filterUnits?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ floodColor?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ floodOpacity?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ focusable?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ fontFamily?: string | undefined | SignalLike;
+ fontSize?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ fontSizeAdjust?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ fontStretch?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ fontStyle?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ fontVariant?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ fontWeight?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ format?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ from?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ fx?: number | string | undefined | SignalLike;
+ fy?: number | string | undefined | SignalLike;
+ g1?: number | string | undefined | SignalLike;
+ g2?: number | string | undefined | SignalLike;
+ glyphName?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ glyphOrientationHorizontal?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ glyphOrientationVertical?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ glyphRef?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ gradientTransform?: string | undefined | SignalLike;
+ gradientUnits?: string | undefined | SignalLike;
+ hanging?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ horizAdvX?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ horizOriginX?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ ideographic?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ imageRendering?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ in2?: number | string | undefined | SignalLike;
+ in?: string | undefined | SignalLike;
+ intercept?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ k1?: number | string | undefined | SignalLike;
+ k2?: number | string | undefined | SignalLike;
+ k3?: number | string | undefined | SignalLike;
+ k4?: number | string | undefined | SignalLike;
+ k?: number | string | undefined | SignalLike;
+ kernelMatrix?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ kernelUnitLength?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ kerning?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ keyPoints?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ keySplines?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ keyTimes?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ lengthAdjust?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ letterSpacing?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ lightingColor?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ limitingConeAngle?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ local?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ markerEnd?: string | undefined | SignalLike;
+ markerHeight?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ markerMid?: string | undefined | SignalLike;
+ markerStart?: string | undefined | SignalLike;
+ markerUnits?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ markerWidth?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ mask?: string | undefined | SignalLike;
+ maskContentUnits?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ maskUnits?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ mathematical?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ mode?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ numOctaves?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ offset?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ opacity?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ operator?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ order?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ orient?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ orientation?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ origin?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ overflow?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ overlinePosition?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ overlineThickness?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ paintOrder?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ panose1?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ pathLength?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ patternContentUnits?: string | undefined | SignalLike;
+ patternTransform?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ patternUnits?: string | undefined | SignalLike;
+ pointerEvents?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ points?: string | undefined | SignalLike;
+ pointsAtX?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ pointsAtY?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ pointsAtZ?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ preserveAlpha?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ preserveAspectRatio?: string | undefined | SignalLike;
+ primitiveUnits?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ r?: number | string | undefined | SignalLike;
+ radius?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ refX?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ refY?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ renderingIntent?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ repeatCount?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ repeatDur?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ requiredExtensions?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ requiredFeatures?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ restart?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ result?: string | undefined | SignalLike;
+ rotate?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ rx?: number | string | undefined | SignalLike;
+ ry?: number | string | undefined | SignalLike;
+ scale?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ seed?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ shapeRendering?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ slope?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ spacing?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ specularConstant?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ specularExponent?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ speed?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ spreadMethod?: string | undefined | SignalLike;
+ startOffset?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ stdDeviation?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ stemh?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ stemv?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ stitchTiles?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ stopColor?: string | undefined | SignalLike;
+ stopOpacity?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ strikethroughPosition?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ strikethroughThickness?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ string?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ stroke?: string | undefined | SignalLike;
+ strokeDasharray?:
+ | string
+ | number
+ | undefined
+ | SignalLike;
+ strokeDashoffset?:
+ | string
+ | number
+ | undefined
+ | SignalLike;
+ strokeLinecap?:
+ | 'butt'
+ | 'round'
+ | 'square'
+ | 'inherit'
+ | undefined
+ | SignalLike<'butt' | 'round' | 'square' | 'inherit' | undefined>;
+ strokeLinejoin?:
+ | 'miter'
+ | 'round'
+ | 'bevel'
+ | 'inherit'
+ | undefined
+ | SignalLike<'miter' | 'round' | 'bevel' | 'inherit' | undefined>;
+ strokeMiterlimit?:
+ | string
+ | number
+ | undefined
+ | SignalLike;
+ strokeOpacity?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ strokeWidth?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ surfaceScale?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ systemLanguage?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ tableValues?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ targetX?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ targetY?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ textAnchor?: string | undefined | SignalLike;
+ textDecoration?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ textLength?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ textRendering?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ to?: number | string | undefined | SignalLike;
+ transform?: string | undefined | SignalLike;
+ u1?: number | string | undefined | SignalLike;
+ u2?: number | string | undefined | SignalLike;
+ underlinePosition?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ underlineThickness?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ unicode?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ unicodeBidi?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ unicodeRange?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ unitsPerEm?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ vAlphabetic?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ values?: string | undefined | SignalLike;
+ vectorEffect?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ version?: string | undefined | SignalLike;
+ vertAdvY?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ vertOriginX?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ vertOriginY?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ vHanging?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ vIdeographic?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ viewBox?: string | undefined | SignalLike;
+ viewTarget?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ visibility?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ vMathematical?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ widths?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ wordSpacing?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ writingMode?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ x1?: number | string | undefined | SignalLike;
+ x2?: number | string | undefined | SignalLike;
+ x?: number | string | undefined | SignalLike;
+ xChannelSelector?: string | undefined | SignalLike;
+ xHeight?:
+ | number
+ | string
+ | undefined
+ | SignalLike;
+ xlinkActuate?: string | undefined | SignalLike;
+ xlinkArcrole?: string | undefined | SignalLike;
+ xlinkHref?: string | undefined | SignalLike;
+ xlinkRole?: string | undefined | SignalLike;
+ xlinkShow?: string | undefined | SignalLike;
+ xlinkTitle?: string | undefined | SignalLike;
+ xlinkType?: string | undefined | SignalLike;
+ xmlBase?: string | undefined | SignalLike;
+ xmlLang?: string | undefined | SignalLike;
+ xmlns?: string | undefined | SignalLike;
+ xmlnsXlink?: string | undefined | SignalLike;
+ xmlSpace?: string | undefined | SignalLike;
+ y1?: number | string | undefined | SignalLike;
+ y2?: number | string | undefined | SignalLike;
+ y?: number | string | undefined | SignalLike;
+ yChannelSelector?: string | undefined | SignalLike;
+ z?: number | string | undefined | SignalLike;
+ zoomAndPan?: string | undefined | SignalLike;
}
export interface PathAttributes {
@@ -322,15 +1027,12 @@ export namespace JSXInternal {
readonly currentTarget: Target;
};
- export type TargetedAnimationEvent<
- Target extends EventTarget
- > = TargetedEvent;
- export type TargetedClipboardEvent<
- Target extends EventTarget
- > = TargetedEvent;
- export type TargetedCompositionEvent<
- Target extends EventTarget
- > = TargetedEvent;
+ export type TargetedAnimationEvent =
+ TargetedEvent;
+ export type TargetedClipboardEvent =
+ TargetedEvent;
+ export type TargetedCompositionEvent =
+ TargetedEvent;
export type TargetedDragEvent