diff --git a/.changeset/seven-coats-appear.md b/.changeset/seven-coats-appear.md
new file mode 100644
index 0000000000..335f789227
--- /dev/null
+++ b/.changeset/seven-coats-appear.md
@@ -0,0 +1,7 @@
+---
+"@lynx-js/web-core-server": patch
+"@lynx-js/web-core": patch
+"@lynx-js/web-explorer": patch
+---
+
+feat: builtinTagTransformMap add `'input': 'x-input'`
diff --git a/packages/web-platform/web-core-server/src/createLynxView.ts b/packages/web-platform/web-core-server/src/createLynxView.ts
index 23635e608f..5484f3d1d2 100644
--- a/packages/web-platform/web-core-server/src/createLynxView.ts
+++ b/packages/web-platform/web-core-server/src/createLynxView.ts
@@ -81,6 +81,7 @@ const builtinTagTransformMap = {
'image': 'x-image',
'list': 'x-list',
'svg': 'x-svg',
+ 'input': 'x-input',
};
// @ts-expect-error
diff --git a/packages/web-platform/web-core/src/apis/LynxView.ts b/packages/web-platform/web-core/src/apis/LynxView.ts
index 0e83261b65..b6e7e07a67 100644
--- a/packages/web-platform/web-core/src/apis/LynxView.ts
+++ b/packages/web-platform/web-core/src/apis/LynxView.ts
@@ -420,6 +420,7 @@ export class LynxView extends HTMLElement {
'image': 'x-image',
'list': 'x-list',
'svg': 'x-svg',
+ 'input': 'x-input',
...this.overrideLynxTagToHTMLTagMap,
};
if (!this.shadowRoot) {
diff --git a/packages/web-platform/web-tests/tests/react.spec.ts b/packages/web-platform/web-tests/tests/react.spec.ts
index 9ce2603797..cf6c1450ef 100644
--- a/packages/web-platform/web-tests/tests/react.spec.ts
+++ b/packages/web-platform/web-tests/tests/react.spec.ts
@@ -3003,6 +3003,16 @@ test.describe('reactlynx3 tests', () => {
const result = await page.locator('.result').first().innerText();
expect(result).toBe('foobar-6-6');
});
+ // input/bindinput test-case start for
+ test('basic-element-input-bindinput', async ({ page }, { title }) => {
+ await goto(page, title);
+ await page.locator('input').press('Enter');
+ await wait(200);
+ await page.locator('input').fill('foobar');
+ await wait(200);
+ const result = await page.locator('.result').first().innerText();
+ expect(result).toBe('foobar-6-6');
+ });
// input/bindinput test-case end
test(
'basic-element-x-input-getValue',
diff --git a/packages/web-platform/web-tests/tests/react/basic-element-input-bindinput/index.jsx b/packages/web-platform/web-tests/tests/react/basic-element-input-bindinput/index.jsx
new file mode 100644
index 0000000000..f6e138ab2f
--- /dev/null
+++ b/packages/web-platform/web-tests/tests/react/basic-element-input-bindinput/index.jsx
@@ -0,0 +1,42 @@
+// Copyright 2023 The Lynx Authors. All rights reserved.
+// Licensed under the Apache License Version 2.0 that can be found in the
+// LICENSE file in the root directory of this source tree.
+import { root, useState } from '@lynx-js/react';
+
+function App() {
+ const value = 'bindinput';
+ const [result, setResult] = useState();
+
+ const onInput = ({ detail }) => {
+ if (typeof detail !== 'object') {
+ throw new Error(
+ `detail type not match. expect object, got ${typeof detail}`,
+ );
+ }
+
+ const { value, cursor, textLength, selectionStart, selectionEnd } = detail;
+
+ if (value.length !== textLength) {
+ throw new Error(
+ `input length not match. expect ${textLength}, got ${value.length}`,
+ );
+ }
+
+ setResult(`${value}-${selectionStart}-${selectionStart}`);
+ };
+
+ return (
+
+
+
+ {result}
+
+
+ );
+}
+
+root.render();