{"id":13621399,"url":"https://github.com/axisj/react-multi-email","last_synced_at":"2025-08-23T12:04:08.389Z","repository":{"id":33008591,"uuid":"131356602","full_name":"axisj/react-multi-email","owner":"axisj","description":":octocat: A simple react component to format multiple email as the user types.","archived":false,"fork":false,"pushed_at":"2024-07-23T01:32:21.000Z","size":29947,"stargazers_count":316,"open_issues_count":23,"forks_count":73,"subscribers_count":12,"default_branch":"master","last_synced_at":"2025-08-17T02:27:39.566Z","etag":null,"topics":["express","multi-email","react"],"latest_commit_sha":null,"homepage":"https://react-multi-email.vercel.app/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/axisj.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-04-28T00:30:45.000Z","updated_at":"2025-08-07T02:05:11.000Z","dependencies_parsed_at":"2023-01-14T23:01:44.182Z","dependency_job_id":"564c388a-28b9-4ab9-9ab2-db553ff48549","html_url":"https://github.com/axisj/react-multi-email","commit_stats":{"total_commits":93,"total_committers":19,"mean_commits":4.894736842105263,"dds":0.4946236559139785,"last_synced_commit":"8e275657d1b60a55f1ebeab0cf4505c5e95dbe5f"},"previous_names":["jsdevkr/react-multi-email","axui/react-multi-email"],"tags_count":21,"template":false,"template_full_name":null,"purl":"pkg:github/axisj/react-multi-email","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axisj%2Freact-multi-email","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axisj%2Freact-multi-email/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axisj%2Freact-multi-email/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axisj%2Freact-multi-email/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/axisj","download_url":"https://codeload.github.com/axisj/react-multi-email/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axisj%2Freact-multi-email/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271746907,"owners_count":24813594,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-23T02:00:09.327Z","response_time":69,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["express","multi-email","react"],"created_at":"2024-08-01T21:01:05.636Z","updated_at":"2025-08-23T12:04:08.250Z","avatar_url":"https://github.com/axisj.png","language":"TypeScript","readme":"[![npm version](https://badge.fury.io/js/react-multi-email.svg)](https://badge.fury.io/js/react-multi-email)\n[![](https://img.shields.io/npm/dm/react-multi-email.svg)](https://www.npmjs.com/package/react-multi-email)\n[![](https://github.com/axisj/react-multi-email/actions/workflows/npm-test.yml/badge.svg)](https://github.com/axisj/react-multi-email/actions/workflows)\n\n# react-multi-email\n\nA simple react component to format multiple email as the user types.\n\n- Simple code\n- No dependency\n- Small size\n- Simple customization\n\n[See Demo](https://codesandbox.io/s/jpvjk8m5o9)\n\n\n\n\u003cimg src=\"https://cdn.rawgit.com/axui/react-multi-email/c3098f94/react-multi-email.gif\" /\u003e\n\n## Installation\n\n```shell-script\nnpm install react-multi-email\n```\n\n## Usage\n\n```typescript jsx\nimport * as React from 'react';\nimport { ReactMultiEmail, isEmail } from 'react-multi-email';\nimport 'react-multi-email/dist/style.css';\n\ninterface Props {}\n\nfunction BasicExample(props: Props) {\n  const [emails, setEmails] = React.useState\u003cstring[]\u003e([]);\n  const [focused, setFocused] = React.useState(false);\n\n  return (\n    \u003cform\u003e\n      \u003ch3\u003eEmail\u003c/h3\u003e\n      \u003cReactMultiEmail\n        placeholder='Input your email'\n        emails={emails}\n        onChange={(_emails: string[]) =\u003e {\n          setEmails(_emails);\n        }}\n        autoFocus={true}\n        onFocus={() =\u003e setFocused(true)}\n        onBlur={() =\u003e setFocused(false)}\n        getLabel={(email, index, removeEmail) =\u003e {\n          return (\n            \u003cdiv data-tag key={index}\u003e\n              \u003cdiv data-tag-item\u003e{email}\u003c/div\u003e\n              \u003cspan data-tag-handle onClick={() =\u003e removeEmail(index)}\u003e\n                ×\n              \u003c/span\u003e\n            \u003c/div\u003e\n          );\n        }}\n      /\u003e\n      \u003cbr /\u003e\n      \u003ch4\u003ereact-multi-email value\u003c/h4\u003e\n      \u003ch3\u003eFocused: {focused ? 'true' : 'false'}\u003c/h3\u003e\n      \u003cp\u003e{emails.join(', ') || 'empty'}\u003c/p\u003e\n    \u003c/form\u003e\n  );\n}\n\nexport default BasicExample;\n```\n\n## Props\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003cth\u003eProperty\u003c/th\u003e\n    \u003cth\u003eType\u003c/th\u003e\n    \u003cth\u003eDefault\u003c/th\u003e\n    \u003cth\u003eDescription\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eid\u003c/td\u003e\n    \u003ctd\u003estring\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eemails\u003c/td\u003e\n    \u003ctd\u003estring[]\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eonChange\u003c/td\u003e\n    \u003ctd\u003e(emails: string[]) =\u003e void;\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eenable\u003c/td\u003e\n    \u003ctd\u003e({ emailCnt }: { emailCnt: number }) =\u003e boolean;\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eonDisabled\u003c/td\u003e\n    \u003ctd\u003e() =\u003e void;\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eonChangeInput\u003c/td\u003e\n    \u003ctd\u003e(value: string) =\u003e void;\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \n  \u003ctr\u003e\n    \u003ctd\u003eonFocus\u003c/td\u003e\n    \u003ctd\u003e() =\u003e void;\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \n  \u003ctr\u003e\n    \u003ctd\u003eonBlur\u003c/td\u003e\n    \u003ctd\u003e() =\u003e void;\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \n  \u003ctr\u003e\n    \u003ctd\u003eonKeyDown\u003c/td\u003e\n    \u003ctd\u003e(evt: React.KeyboardEvent\u003cHTMLInputElement\u003e) =\u003e void;\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \n  \u003ctr\u003e\n    \u003ctd\u003eonKeyUp\u003c/td\u003e\n    \u003ctd\u003e(evt: React.KeyboardEvent\u003cHTMLInputElement\u003e) =\u003e void;\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \n  \u003ctr\u003e\n    \u003ctd\u003enoClass\u003c/td\u003e\n    \u003ctd\u003eboolean\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \n  \u003ctr\u003e\n    \u003ctd\u003evalidateEmail\u003c/td\u003e\n    \u003ctd\u003e(email: string) =\u003e boolean | Promise\u003cboolean\u003e;\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \n  \u003ctr\u003e\n    \u003ctd\u003eenableSpinner\u003c/td\u003e\n    \u003ctd\u003eboolean\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \n  \u003ctr\u003e\n    \u003ctd\u003estyle\u003c/td\u003e\n    \u003ctd\u003eReact.CSSProperties\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003egetLabel\u003c/td\u003e\n    \u003ctd\u003e\n  (\n    email: string,\n    index: number,\n    removeEmail: (index: number, isDisabled?: boolean) =\u003e void,\n  ) =\u003e React.ReactNode;\n    \u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n    className\u003c/td\u003e\n    \u003ctd\u003estring\u003c/td\u003e\n    \u003ctd\u003e''\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n    inputClassName\u003c/td\u003e\n    \u003ctd\u003estring\u003c/td\u003e\n    \u003ctd\u003e''\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n    placeholder\u003c/td\u003e\n    \u003ctd\u003estring | React.ReactNode;\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n    autoFocus\u003c/td\u003e\n    \u003ctd\u003eboolean;\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n    spinner\u003c/td\u003e\n    \u003ctd\u003e() =\u003e React.ReactNode;\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n    delimiter\u003c/td\u003e\n    \u003ctd\u003estring;\u003c/td\u003e\n    \u003ctd\u003e'[ ,;]'\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n    autoComplete\u003c/td\u003e\n    \u003ctd\u003estring | undefined\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003einitialInputValue\u003c/td\u003e\n    \u003ctd\u003estring | undefined\u003c/td\u003e\n    \u003ctd\u003e''\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n    disableOnBlurValidation\u003c/td\u003e\n    \u003ctd\u003eboolean | undefined\u003c/td\u003e\n    \u003ctd\u003efalse\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e  \n  \u003ctr\u003e\n    \u003ctd\u003einputValue\u003c/td\u003e\n    \u003ctd\u003estring | undefined\u003c/td\u003e\n    \u003ctd\u003eundefined\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## License\n\n[MIT](https://opensource.org/licenses/MIT)\n\n\u003e If you don't mind, don't forget to press \"star\" before leaving.\n","funding_links":[],"categories":["UI Components"],"sub_categories":["Form Components"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faxisj%2Freact-multi-email","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faxisj%2Freact-multi-email","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faxisj%2Freact-multi-email/lists"}