diff --git a/dev/kitchen-sink/Row1.tsx b/dev/kitchen-sink/Row1.tsx index 245abfc3..2a031022 100644 --- a/dev/kitchen-sink/Row1.tsx +++ b/dev/kitchen-sink/Row1.tsx @@ -25,7 +25,7 @@ export default function Row1() {
Accordion content 2
- + diff --git a/package-lock.json b/package-lock.json index 2c4d30eb..46d3337f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "@types/karma-chrome-launcher": "^3.1.4", "@types/karma-mocha": "^1.3.4", "@types/mocha": "^10.0.10", - "@types/react-dom": "^18.3.3", + "@types/react-dom": "^19", "@types/sinon": "^17.0.3", "@vitejs/plugin-react": "^4.3.4", "chai-as-promised": "^8.0.1", @@ -938,14 +938,6 @@ "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.1.tgz", "integrity": "sha512-wx4aBmgeGvFmOKucFKY+8VFJSYZxs9poN3SDNQFF6lT6NrQUnHiPB2PWz2sc4ieEcAaYYzN+1uWahEeTq2aRIQ==" }, - "node_modules/@lit/react": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@lit/react/-/react-1.0.6.tgz", - "integrity": "sha512-QIss8MPh6qUoFJmuaF4dSHts3qCsA36S3HcOLiNPShxhgYPr4XJRnCBKPipk85sR9xr6TQrOcDMfexwbNdJHYA==", - "peerDependencies": { - "@types/react": "17 || 18" - } - }, "node_modules/@lit/reactive-element": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.4.tgz", @@ -1526,29 +1518,25 @@ "undici-types": "~6.20.0" } }, - "node_modules/@types/prop-types": { - "version": "15.7.14", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", - "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", - "peer": true - }, "node_modules/@types/react": { - "version": "18.3.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", - "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", + "version": "19.0.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.2.tgz", + "integrity": "sha512-USU8ZI/xyKJwFTpjSVIrSeHBVAGagkHQKPNbxeWwql/vDmnTIBgx+TJnhFnj1NXgz8XfprU0egV2dROLGpsBEg==", + "devOptional": true, + "license": "MIT", "peer": true, "dependencies": { - "@types/prop-types": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", - "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", + "version": "19.0.2", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.2.tgz", + "integrity": "sha512-c1s+7TKFaDRRxr1TxccIX2u7sfCnc3RxkVyBIUA2lCpyqCF+QoAwQ/CBg7bsMdVwP120HEH143VQezKtef5nCg==", "devOptional": true, + "license": "MIT", "peerDependencies": { - "@types/react": "^18.0.0" + "@types/react": "^19.0.0" } }, "node_modules/@types/sinon": { @@ -3349,6 +3337,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "devOptional": true, "peer": true }, "node_modules/custom-event": { @@ -7750,7 +7739,6 @@ "version": "24.7.0-alpha3", "license": "Apache-2.0", "dependencies": { - "@lit/react": "^1.0.6", "@vaadin/a11y-base": "24.7.0-alpha3", "@vaadin/accordion": "24.7.0-alpha3", "@vaadin/app-layout": "24.7.0-alpha3", @@ -7812,10 +7800,10 @@ "@vaadin/virtual-list": "24.7.0-alpha3" }, "peerDependencies": { - "@types/react": "^18.2.37 || ^19", - "@types/react-dom": "^18.2.15 || ^19", - "react": "^18.2.0 || ^19", - "react-dom": "^18.2.0 || ^19" + "@types/react": "^19", + "@types/react-dom": "^19", + "react": "^19", + "react-dom": "^19" }, "peerDependenciesMeta": { "@types/react": { @@ -7831,7 +7819,6 @@ "version": "24.7.0-alpha3", "license": "SEE LICENSE IN LICENSE", "dependencies": { - "@lit/react": "^1.0.6", "@vaadin/board": "24.7.0-alpha3", "@vaadin/charts": "24.7.0-alpha3", "@vaadin/cookie-consent": "24.7.0-alpha3", @@ -7843,10 +7830,10 @@ "@vaadin/rich-text-editor": "24.7.0-alpha3" }, "peerDependencies": { - "@types/react": "^18.2.37 || ^19", - "@types/react-dom": "^18.2.15 || ^19", - "react": "^18.2.0 || ^19", - "react-dom": "^18.2.0 || ^19" + "@types/react": "^19", + "@types/react-dom": "^19", + "react": "^19", + "react-dom": "^19" }, "peerDependenciesMeta": { "@types/react": { @@ -8404,12 +8391,6 @@ "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.1.tgz", "integrity": "sha512-wx4aBmgeGvFmOKucFKY+8VFJSYZxs9poN3SDNQFF6lT6NrQUnHiPB2PWz2sc4ieEcAaYYzN+1uWahEeTq2aRIQ==" }, - "@lit/react": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@lit/react/-/react-1.0.6.tgz", - "integrity": "sha512-QIss8MPh6qUoFJmuaF4dSHts3qCsA36S3HcOLiNPShxhgYPr4XJRnCBKPipk85sR9xr6TQrOcDMfexwbNdJHYA==", - "requires": {} - }, "@lit/reactive-element": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.4.tgz", @@ -8836,26 +8817,20 @@ "undici-types": "~6.20.0" } }, - "@types/prop-types": { - "version": "15.7.14", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", - "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", - "peer": true - }, "@types/react": { - "version": "18.3.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", - "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", + "version": "19.0.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.2.tgz", + "integrity": "sha512-USU8ZI/xyKJwFTpjSVIrSeHBVAGagkHQKPNbxeWwql/vDmnTIBgx+TJnhFnj1NXgz8XfprU0egV2dROLGpsBEg==", + "devOptional": true, "peer": true, "requires": { - "@types/prop-types": "*", "csstype": "^3.0.2" } }, "@types/react-dom": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", - "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", + "version": "19.0.2", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.2.tgz", + "integrity": "sha512-c1s+7TKFaDRRxr1TxccIX2u7sfCnc3RxkVyBIUA2lCpyqCF+QoAwQ/CBg7bsMdVwP120HEH143VQezKtef5nCg==", "devOptional": true, "requires": {} }, @@ -9652,7 +9627,6 @@ "@vaadin/react-components": { "version": "file:packages/react-components", "requires": { - "@lit/react": "^1.0.6", "@vaadin/a11y-base": "24.7.0-alpha3", "@vaadin/accordion": "24.7.0-alpha3", "@vaadin/app-layout": "24.7.0-alpha3", @@ -9717,7 +9691,6 @@ "@vaadin/react-components-pro": { "version": "file:packages/react-components-pro", "requires": { - "@lit/react": "^1.0.6", "@vaadin/board": "24.7.0-alpha3", "@vaadin/charts": "24.7.0-alpha3", "@vaadin/cookie-consent": "24.7.0-alpha3", @@ -10533,6 +10506,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "devOptional": true, "peer": true }, "custom-event": { diff --git a/package.json b/package.json index 0e95daa4..739c651f 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "@types/karma-chrome-launcher": "^3.1.4", "@types/karma-mocha": "^1.3.4", "@types/mocha": "^10.0.10", - "@types/react-dom": "^18.3.3", + "@types/react-dom": "^19", "@types/sinon": "^17.0.3", "@vitejs/plugin-react": "^4.3.4", "chai-as-promised": "^8.0.1", diff --git a/packages/react-components-pro/package.json b/packages/react-components-pro/package.json index fd28ac02..3cbecc34 100644 --- a/packages/react-components-pro/package.json +++ b/packages/react-components-pro/package.json @@ -25,7 +25,6 @@ "version": "tsx ../../scripts/package-json-version.ts" }, "dependencies": { - "@lit/react": "^1.0.6", "@vaadin/board": "24.7.0-alpha3", "@vaadin/charts": "24.7.0-alpha3", "@vaadin/cookie-consent": "24.7.0-alpha3", @@ -39,10 +38,10 @@ "author": "Vaadin Ltd.", "license": "SEE LICENSE IN LICENSE", "peerDependencies": { - "@types/react": "^18.2.37 || ^19", - "@types/react-dom": "^18.2.15 || ^19", - "react": "^18.2.0 || ^19", - "react-dom": "^18.2.0 || ^19" + "@types/react": "^19", + "@types/react-dom": "^19", + "react": "^19", + "react-dom": "^19" }, "peerDependenciesMeta": { "@types/react": { diff --git a/packages/react-components/package.json b/packages/react-components/package.json index a98fe979..d7e609e3 100644 --- a/packages/react-components/package.json +++ b/packages/react-components/package.json @@ -26,7 +26,6 @@ "version": "tsx ../../scripts/package-json-version.ts" }, "dependencies": { - "@lit/react": "^1.0.6", "@vaadin/a11y-base": "24.7.0-alpha3", "@vaadin/accordion": "24.7.0-alpha3", "@vaadin/app-layout": "24.7.0-alpha3", @@ -90,10 +89,10 @@ "author": "Vaadin Ltd.", "license": "Apache-2.0", "peerDependencies": { - "@types/react": "^18.2.37 || ^19", - "@types/react-dom": "^18.2.15 || ^19", - "react": "^18.2.0 || ^19", - "react-dom": "^18.2.0 || ^19" + "@types/react": "^19", + "@types/react-dom": "^19", + "react": "^19", + "react-dom": "^19" }, "peerDependenciesMeta": { "@types/react": { @@ -493,6 +492,10 @@ "./css/material/Shadow.css": "./css/material/Shadow.css", "./css/material/Typography.css": "./css/material/Typography.css", "./css/material/UserColors.css": "./css/material/UserColors.css", + "./utils/addOrUpdateEventListener.d.ts": "./utils/addOrUpdateEventListener.d.ts", + "./utils/addOrUpdateEventListener.d.ts.map": "./utils/addOrUpdateEventListener.d.ts.map", + "./utils/addOrUpdateEventListener.js": "./utils/addOrUpdateEventListener.js", + "./utils/addOrUpdateEventListener.js.map": "./utils/addOrUpdateEventListener.js.map", "./utils/createComponent.d.ts": "./utils/createComponent.d.ts", "./utils/createComponent.d.ts.map": "./utils/createComponent.d.ts.map", "./utils/createComponent.js": "./utils/createComponent.js", @@ -501,6 +504,10 @@ "./utils/createComponentWithOrderedProps.d.ts.map": "./utils/createComponentWithOrderedProps.d.ts.map", "./utils/createComponentWithOrderedProps.js": "./utils/createComponentWithOrderedProps.js", "./utils/createComponentWithOrderedProps.js.map": "./utils/createComponentWithOrderedProps.js.map", + "./utils/flushInMicrotask.d.ts": "./utils/flushInMicrotask.d.ts", + "./utils/flushInMicrotask.d.ts.map": "./utils/flushInMicrotask.d.ts.map", + "./utils/flushInMicrotask.js": "./utils/flushInMicrotask.js", + "./utils/flushInMicrotask.js.map": "./utils/flushInMicrotask.js.map", "./utils/flushMicrotask.d.ts": "./utils/flushMicrotask.d.ts", "./utils/flushMicrotask.d.ts.map": "./utils/flushMicrotask.d.ts.map", "./utils/flushMicrotask.js": "./utils/flushMicrotask.js", @@ -514,9 +521,16 @@ "./utils/useMergedRefs.js": "./utils/useMergedRefs.js", "./utils/useMergedRefs.js.map": "./utils/useMergedRefs.js.map", "./renderers/combobox.d.ts": "./renderers/combobox.d.ts", + "./renderers/createRendererCallback.d.ts": "./renderers/createRendererCallback.d.ts", + "./renderers/createRendererCallback.d.ts.map": "./renderers/createRendererCallback.d.ts.map", + "./renderers/createRendererCallback.js": "./renderers/createRendererCallback.js", + "./renderers/createRendererCallback.js.map": "./renderers/createRendererCallback.js.map", "./renderers/grid.d.ts": "./renderers/grid.d.ts", "./renderers/multiSelectCombobox.d.ts": "./renderers/multiSelectCombobox.d.ts", "./renderers/renderer.d.ts": "./renderers/renderer.d.ts", + "./renderers/renderer.d.ts.map": "./renderers/renderer.d.ts.map", + "./renderers/renderer.js": "./renderers/renderer.js", + "./renderers/renderer.js.map": "./renderers/renderer.js.map", "./renderers/useContextRenderer.d.ts": "./renderers/useContextRenderer.d.ts", "./renderers/useContextRenderer.d.ts.map": "./renderers/useContextRenderer.d.ts.map", "./renderers/useContextRenderer.js": "./renderers/useContextRenderer.js", @@ -529,6 +543,10 @@ "./renderers/useRenderer.d.ts.map": "./renderers/useRenderer.d.ts.map", "./renderers/useRenderer.js": "./renderers/useRenderer.js", "./renderers/useRenderer.js.map": "./renderers/useRenderer.js.map", + "./renderers/useRendererCallback.d.ts": "./renderers/useRendererCallback.d.ts", + "./renderers/useRendererCallback.d.ts.map": "./renderers/useRendererCallback.d.ts.map", + "./renderers/useRendererCallback.js": "./renderers/useRendererCallback.js", + "./renderers/useRendererCallback.js.map": "./renderers/useRendererCallback.js.map", "./renderers/useSimpleOrChildrenRenderer.d.ts": "./renderers/useSimpleOrChildrenRenderer.d.ts", "./renderers/useSimpleOrChildrenRenderer.d.ts.map": "./renderers/useSimpleOrChildrenRenderer.d.ts.map", "./renderers/useSimpleOrChildrenRenderer.js": "./renderers/useSimpleOrChildrenRenderer.js", diff --git a/packages/react-components/src/Select.tsx b/packages/react-components/src/Select.tsx index 1a343c21..ec7439ea 100644 --- a/packages/react-components/src/Select.tsx +++ b/packages/react-components/src/Select.tsx @@ -2,6 +2,7 @@ import { type ComponentType, type ForwardedRef, forwardRef, + type HTMLAttributes, isValidElement, type ReactElement, type ReactNode, @@ -31,7 +32,7 @@ function Select(props: SelectProps, ref: ForwardedRef): ReactElem // Components with slot attribute should stay in light DOM. const slottedChildren = children.filter((child): child is ReactNode => { - return isValidElement(child) && child.props.slot; + return isValidElement>(child) && !!child.props.slot; }); // Component without slot attribute should go to the overlay. diff --git a/packages/react-components/src/renderers/useRenderer.ts b/packages/react-components/src/renderers/useRenderer.ts index 4f3e55bb..3d73f492 100644 --- a/packages/react-components/src/renderers/useRenderer.ts +++ b/packages/react-components/src/renderers/useRenderer.ts @@ -45,7 +45,7 @@ export function useRenderer

( convert?: (props: Slice, 1>) => PropsWithChildren

, config?: RendererConfig, ): UseRendererResult { - const [map, update] = useReducer>(rendererReducer, initialState); + const [map, update] = useReducer(rendererReducer, initialState); const renderer = useCallback( ((...args: Parameters) => { if (config?.renderMode === 'microtask') { diff --git a/packages/react-components/src/utils/addOrUpdateEventListener.ts b/packages/react-components/src/utils/addOrUpdateEventListener.ts new file mode 100644 index 00000000..c72e9538 --- /dev/null +++ b/packages/react-components/src/utils/addOrUpdateEventListener.ts @@ -0,0 +1,30 @@ +const listenedEvents = new WeakMap>(); + +export default function addOrUpdateEventListener( + node: Element, + event: string, + listener: ((event: Event) => void) | undefined, +) { + let nodeEvents = listenedEvents.get(node); + if (nodeEvents === undefined) { + nodeEvents = new Map(); + listenedEvents.set(node, nodeEvents); + } + + let handler = nodeEvents.get(event); + if (listener !== undefined) { + if (handler === undefined) { + // If necessary, add listener and track handler + handler = { handleEvent: listener }; + node.addEventListener(event, handler); + nodeEvents.set(event, handler); + } else { + // Otherwise just update the listener with new value + handler.handleEvent = listener; + } + } else if (handler !== undefined) { + // Remove listener if one exists and value is undefined + node.removeEventListener(event, handler); + nodeEvents.delete(event); + } +} diff --git a/packages/react-components/src/utils/createComponent.ts b/packages/react-components/src/utils/createComponent.ts index 74fe3659..20caf940 100644 --- a/packages/react-components/src/utils/createComponent.ts +++ b/packages/react-components/src/utils/createComponent.ts @@ -1,7 +1,8 @@ -import { createComponent as _createComponent, type EventName } from '@lit/react'; import type { ThemePropertyMixinClass } from '@vaadin/vaadin-themable-mixin/vaadin-theme-property-mixin.js'; import type React from 'react'; -import type { RefAttributes } from 'react'; +import { createElement, useLayoutEffect, useRef, type RefAttributes } from 'react'; +import useMergedRefs from './useMergedRefs.js'; +import addOrUpdateEventListener from './addOrUpdateEventListener.js'; declare const __VERSION__: string; @@ -28,8 +29,11 @@ window.Vaadin.registrations.push({ version: __VERSION__, }); -// TODO: Remove when types from @lit-labs/react are exported -export type EventNames = Record; +export type EventName = string & { + __eventType: T; +}; + +export type EventNames = Record; type Constructor = { new (): T; name: string }; type PolymerConstructor = Constructor & { _properties: Record }; type Options = Readonly<{ @@ -79,30 +83,56 @@ type AllWebComponentProps = I export type WebComponentProps = Partial>; -// We need a separate declaration here; otherwise, the TypeScript fails into the -// endless loop trying to resolve the typings. export function createComponent( options: Options, -): (props: WebComponentProps & RefAttributes) => React.ReactElement | null; - -export function createComponent(options: Options): any { - const { elementClass } = options; - - return _createComponent( - '_properties' in elementClass - ? { - ...options, - // TODO: improve or remove the Polymer workaround - // 'createComponent' relies on key presence on the custom element class, - // but Polymer defines properties on the prototype when the first element - // is created. Workaround: pass a mock object with properties in - // the prototype. - elementClass: { - // @ts-expect-error: it is a specific workaround for Polymer classes. - name: elementClass.name, - prototype: { ...elementClass._properties, hidden: Boolean }, - }, +): (props: WebComponentProps & RefAttributes) => React.ReactElement { + const { tagName, events: eventsMap } = options; + + return (props) => { + const innerRef = useRef(null); + const finalRef = useMergedRefs(innerRef, props.ref); + const prevEventsRef = useRef(new Set()); + + // Option 1 (no initial property events): + useLayoutEffect(() => { + if (eventsMap) { + const events = new Set(Object.keys(props).filter((event) => eventsMap[event])); + events.forEach((event) => { + addOrUpdateEventListener(innerRef.current!, eventsMap[event], props[event]); + }); + + prevEventsRef.current.forEach((event) => { + if (!events.has(event)) { + addOrUpdateEventListener(innerRef.current!, eventsMap[event], undefined); + } + }); + + prevEventsRef.current = events; + } + }); + + useLayoutEffect(() => { + return () => { + if (eventsMap) { + prevEventsRef.current.forEach((event) => { + addOrUpdateEventListener(innerRef.current!, eventsMap[event], undefined); + }); } - : options, - ); + }; + }, []); + + const finalProps = Object.fromEntries(Object.entries(props).filter(([key]) => !eventsMap?.[key])); + + // Option 2 (initial property events are fired): + // const finalProps = Object.fromEntries( + // Object.entries(props).map(([key, value]) => { + // if (eventsMap?.[key]) { + // return [`on${eventsMap[key]}`, value]; + // } + // return [key, value]; + // }) + // ); + + return createElement(tagName, { ...finalProps, ref: finalRef }); + }; } diff --git a/packages/react-components/src/utils/useMergedRefs.ts b/packages/react-components/src/utils/useMergedRefs.ts index 3a02cc50..dea3dc53 100644 --- a/packages/react-components/src/utils/useMergedRefs.ts +++ b/packages/react-components/src/utils/useMergedRefs.ts @@ -1,6 +1,8 @@ -import { type ForwardedRef, type RefCallback, useCallback } from 'react'; +import { type Ref, type RefCallback, useCallback } from 'react'; -export default function useMergedRefs(...refs: ReadonlyArray>): RefCallback { +export default function useMergedRefs( + ...refs: ReadonlyArray | undefined> +): RefCallback { return useCallback((element: T) => { refs.forEach((ref) => { if (typeof ref === 'function') { diff --git a/scripts/generator.ts b/scripts/generator.ts index 4cc20581..14922667 100644 --- a/scripts/generator.ts +++ b/scripts/generator.ts @@ -35,7 +35,6 @@ const CREATE_COMPONENT_PATH = '$CREATE_COMPONENT_PATH$'; const EVENT_MAP = '$EVENT_MAP$'; const EVENT_MAP_REF_IN_EVENTS = '$EVENT_MAP_REF_IN_EVENTS$'; const EVENTS_DECLARATION = '$EVENTS_DECLARATION$'; -const LIT_REACT_PATH = '@lit/react'; const MODULE_PATH = '$MODULE_PATH$'; type ElementData = Readonly<{ @@ -321,14 +320,13 @@ function generateReactComponent({ name, js }: SchemaHTMLElement, { packageName, const ast = template( ` -import type { EventName } from "${LIT_REACT_PATH}"; import { ${COMPONENT_NAME} as ${COMPONENT_NAME}Element type ${COMPONENT_NAME}EventMap as _${COMPONENT_NAME}EventMap, ${[...new Set(genericElementInfo?.typeConstraints || [])].map((constraint) => `type ${constraint}`)} } from "${MODULE_PATH}"; import * as React from "react"; -import { createComponent, type WebComponentProps } from "${CREATE_COMPONENT_PATH}"; +import { createComponent, type WebComponentProps, type EventName } from "${CREATE_COMPONENT_PATH}"; export * from "${MODULE_PATH}"; diff --git a/test/Select.spec.tsx b/test/Select.spec.tsx index 29a20d7b..88387330 100644 --- a/test/Select.spec.tsx +++ b/test/Select.spec.tsx @@ -157,13 +157,13 @@ describe('Select', () => { it(`should be true in the element if ${property} prop is true`, async () => { render(); const select = await findByQuerySelector('vaadin-select'); - expect(select[property]).not.to.be.ok; + expect(select[property]).to.be.false; }); }); });