{"_id":"ink-multiline-input","_rev":"2-3f285baffd899cc97400d215e5744eac","name":"ink-multiline-input","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"name":"ink-multiline-input","version":"0.0.1","keywords":["react","ink","cli","terminal","scrollview","component","ui"],"author":{"name":"ByteLand Technology","email":"github@byteland.app"},"license":"MIT","_id":"ink-multiline-input@0.0.1","maintainers":[{"name":"byteland-technology","email":"npm@byteland.app"}],"homepage":"https://www.byteland.app/opensource/ink-multiline-input","bugs":{"url":"https://github.com/ByteLandTechnology/ink-multiline-input/issues"},"dist":{"shasum":"4257a640cda2e0404bdb26df193ec8d30d7a5942","tarball":"https://registry.npmjs.org/ink-multiline-input/-/ink-multiline-input-0.0.1.tgz","fileCount":18,"integrity":"sha512-m3UE9zVO6QqjPYtIwifjLDXD6eWibJfsfUpSv+bHwrcNeYdXtH3yMc7rwmVC4cNt/JkpKP3Yw+bvtoYu6GOLEw==","signatures":[{"sig":"MEUCICMLxxuA7go23K20k5jh1jvjv+K3NIeirSeVOKhzLCeMAiEAzylUJCyb1b/rJfOsA6IeJ/4dF6ajzcIR8XUqgURhgAc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":491992},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","source":"src/index.tsx","gitHead":"9ccf2256c98144dbf25772f7c6812143a67d28ae","scripts":{"docs":"typedoc --plugin typedoc-plugin-markdown --disableSources --out docs/api && prettier --write docs/api","test":"vitest run","build":"tsup","prepare":"husky"},"_npmUser":{"name":"byteland-technology","email":"npm@byteland.app"},"repository":{"url":"git+https://github.com/ByteLandTechnology/ink-multiline-input.git","type":"git"},"_npmVersion":"11.6.2","description":"A multiline text input component for Ink CLI applications","directories":{},"_nodeVersion":"25.2.0","_hasShrinkwrap":false,"devDependencies":{"ink":"^6.5.1","tsup":"^8.5.1","husky":"^9.1.7","react":"^19.2.1","typedoc":"^0.28.15","prettier":"^3.7.4","@types/ink":"^0.5.2","@types/node":"^24.10.1","lint-staged":"^16.2.7","@types/react":"^19.2.7","@commitlint/cli":"^20.2.0","@sindresorhus/tsconfig":"^8.1.0","typedoc-plugin-markdown":"^4.9.0","@commitlint/config-conventional":"^20.2.0"},"peerDependencies":{"ink":">=6","react":">=19"},"_npmOperationalInternal":{"tmp":"tmp/ink-multiline-input_0.0.1_1765530113336_0.2217276614167003","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"ink-multiline-input","version":"0.1.0","description":"A multiline text input component for Ink CLI applications","keywords":["react","ink","cli","terminal","scrollview","component","ui"],"homepage":"https://www.byteland.app/opensource/ink-multiline-input","bugs":{"url":"https://github.com/ByteLandTechnology/ink-multiline-input/issues"},"repository":{"type":"git","url":"git+https://github.com/ByteLandTechnology/ink-multiline-input.git"},"license":"MIT","author":{"name":"ByteLand Technology","email":"github@byteland.app"},"type":"module","main":"dist/index.js","types":"dist/index.d.ts","source":"src/index.tsx","scripts":{"test":"vitest run","prepare":"husky","build":"tsup","docs":"typedoc --plugin typedoc-plugin-markdown --disableSources --out docs/api && prettier --write docs/api"},"peerDependencies":{"ink":">=6","react":">=19"},"devDependencies":{"@commitlint/cli":"^20.2.0","@commitlint/config-conventional":"^20.2.0","@sindresorhus/tsconfig":"^8.1.0","@types/ink":"^0.5.2","@types/node":"^24.10.1","@types/react":"^19.2.7","husky":"^9.1.7","ink":"^6.5.1","ink-testing-library":"^4.0.0","lint-staged":"^16.2.7","prettier":"^3.7.4","react":"^19.2.1","tsup":"^8.5.1","typedoc":"^0.28.15","typedoc-plugin-markdown":"^4.9.0","vitest":"^4.0.16"},"gitHead":"27b5ddffbe62c15a4ad357fe8dd9f780bfa0aef3","_id":"ink-multiline-input@0.1.0","_nodeVersion":"25.2.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-GmIF5YdaxmT5pHwI67yTDe5UDId20WeGJx39zwaYJ6SwMrlioRRMn+BxklsAUYsvA6BJfh2kpHNR1Kan69UTxw==","shasum":"2e082037e3fdffb6e9229cd70d8d941c193dfc34","tarball":"https://registry.npmjs.org/ink-multiline-input/-/ink-multiline-input-0.1.0.tgz","fileCount":23,"unpackedSize":907380,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCcRTi3zQu9QbVc+rVxrT6pjXmPMSI+tZRHMOM1o7BRmgIhANSSrm1WTsAcUpCMNpVQykgPGgG6OHOGicqCce5pjVCz"}]},"_npmUser":{"name":"byteland-technology","email":"npm@byteland.app"},"directories":{},"maintainers":[{"name":"byteland-technology","email":"npm@byteland.app"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ink-multiline-input_0.1.0_1767421074813_0.7587591158883134"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-12T09:01:53.206Z","modified":"2026-01-03T06:17:55.160Z","0.0.1":"2025-12-12T09:01:53.474Z","0.1.0":"2026-01-03T06:17:54.976Z"},"bugs":{"url":"https://github.com/ByteLandTechnology/ink-multiline-input/issues"},"author":{"name":"ByteLand Technology","email":"github@byteland.app"},"license":"MIT","homepage":"https://www.byteland.app/opensource/ink-multiline-input","keywords":["react","ink","cli","terminal","scrollview","component","ui"],"repository":{"type":"git","url":"git+https://github.com/ByteLandTechnology/ink-multiline-input.git"},"description":"A multiline text input component for Ink CLI applications","maintainers":[{"name":"byteland-technology","email":"npm@byteland.app"}],"readme":"# ink-multiline-input 📝\n\n> A robust multi-line text input component for [Ink](https://github.com/vadimdemedes/ink) applications. 🚀\n\n## Features ✨\n\n- ↕️ **Vertical Scrolling**: Automatically scrolls to keep the cursor in view.\n- 🖱️ **Cursor Navigation**: Full support for arrow keys (Up, Down, Left, Right).\n- 🔙 **Editing**: Supports Backspace and Delete keys.\n- 🎨 **Customization**: Style the active line with `highlightStyle`.\n- 🎭 **Mask Support**: Hide text with mask characters for password inputs.\n- 📏 **Flexible Sizing**: Control visible rows with `rows` and `maxRows`.\n\n## Demo 🎬\n\n### 📝 Typing\n\n![Typing Demo](./docs/_media/typing.svg)\n\n### 🧭 Navigation\n\n![Navigation Demo](./docs/_media/navigation.svg)\n\n### ✂️ Editing\n\n![Editing Demo](./docs/_media/editing.svg)\n\n### 🎨 Styling & Mask\n\n![Styling Demo](./docs/_media/styling.svg)\n\n### 📜 Scrolling\n\n![Scrolling Demo](./docs/_media/scrolling.svg)\n\n## Installation 📦\n\n```bash\nnpm install ink-multiline-input\n```\n\n## Usage 🛠️\n\n```tsx\nimport React, { useState } from \"react\";\nimport { render, Box } from \"ink\";\nimport { MultilineInput } from \"ink-multiline-input\";\n\nconst App = () => {\n  const [value, setValue] = useState(\"\");\n\n  return (\n    <Box padding={1}>\n      <MultilineInput\n        value={value}\n        onChange={setValue}\n        rows={3}\n        maxRows={10}\n        placeholder=\"Type something here...\"\n        highlightStyle={{ backgroundColor: \"blue\" }}\n        textStyle={{ color: \"white\" }}\n        onSubmit={(val) => console.log(\"Submitted:\", val)}\n        keyBindings={{\n          submit: (key) => key.ctrl && key.return,\n        }}\n      />\n    </Box>\n  );\n};\n\nrender(<App />);\n```\n\n## Props ⚙️\n\n### MultilineInput (Controlled)\n\n| Prop                  | Type                      | Default | Description                                                       |\n| --------------------- | ------------------------- | ------- | ----------------------------------------------------------------- |\n| `value`               | `string`                  | -       | 📝 The current value of the input.                                |\n| `onChange`            | `(value: string) => void` | -       | 🔄 Callback function triggered when the value changes.            |\n| `onSubmit`            | `(value: string) => void` | -       | 🚀 (Optional) Callback triggered when the submit key is pressed.  |\n| `rows`                | `number`                  | -       | 📏 (Optional) Minimum number of rows to display.                  |\n| `maxRows`             | `number`                  | -       | 📏 (Optional) Maximum number of rows to display.                  |\n| `highlightStyle`      | `TextProps`               | -       | 🎨 (Optional) Style to apply to the current line.                 |\n| `textStyle`           | `TextProps`               | -       | 🔤 (Optional) Style to apply to the text.                         |\n| `placeholder`         | `string`                  | `\"\"`    | 📭 (Optional) Text to display when value is empty.                |\n| `mask`                | `string`                  | -       | 🎭 (Optional) Character to mask text (e.g., `\"*\"` for passwords). |\n| `showCursor`          | `boolean`                 | `true`  | 🖱️ (Optional) Whether to show the cursor.                         |\n| `focus`               | `boolean`                 | `true`  | 🎯 (Optional) Whether this input should receive keyboard input.   |\n| `tabSize`             | `number`                  | `4`     | ↔️ (Optional) Number of spaces to expand tabs to.                 |\n| `keyBindings`         | `object`                  | -       | ⌨️ (Optional) Custom key bindings for `submit` and `newline`.     |\n| `highlightPastedText` | `boolean`                 | `false` | 🎨 (Optional) Highlight recently pasted text.                     |\n| `useCustomInput`      | `function`                | -       | 🔌 (Optional) Custom input hook to replace default `useInput`.    |\n\n### Key Bindings\n\nYou can customize which keys trigger specific actions:\n\n```tsx\nkeyBindings={{\n  submit: (key) => key.ctrl && key.return, // Ctrl+Enter to submit\n  newline: (key) => key.return, // Enter for newline (default)\n}}\n```\n\n### ControlledMultilineInput\n\nFor advanced use cases where you want to control the cursor position yourself, use `ControlledMultilineInput`:\n\n```tsx\nimport { ControlledMultilineInput } from \"ink-multiline-input\";\n\n<ControlledMultilineInput\n  value={text}\n  cursorIndex={cursorPos}\n  maxRows={10}\n  showCursor={true}\n  focus={true}\n/>;\n```\n\n## API Documentation 📚\n\nFor detailed API documentation, see the [API Reference](./docs/api/README.md).\n\n## License 📄\n\nMIT\n","readmeFilename":"README.md"}