├── .eslintrc ├── .gitattributes ├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── feature_request.md │ └── help-with-something.md ├── .gitignore ├── LICENSE ├── README.md ├── dist ├── react.tagify.jsx ├── react.tagify.jsx.map ├── tagify.css ├── tagify.esm.js ├── tagify.esm.js.map ├── tagify.js ├── tagify.js.map ├── tagify.polyfills.min.js ├── tagify.polyfills.min.js.map └── tagify.vue ├── docs ├── codepen.css ├── codepen.js ├── demo.gif ├── demo2.apng ├── examples │ ├── dist │ │ ├── RTL.html │ │ ├── advance-options.html │ │ ├── basic.html │ │ ├── different-look.html │ │ ├── disabled-user-input.html │ │ ├── disabled.html │ │ ├── drag-sort.html │ │ ├── extra-properties.html │ │ ├── input-suggestions-styled-as-tags.html │ │ ├── input.html │ │ ├── manual-suggestions.html │ │ ├── mix.html │ │ ├── mode-select.html │ │ ├── outside-of-the-box.html │ │ ├── readonly-mixed.html │ │ ├── readonly.html │ │ ├── textarea.html │ │ └── users-list.html │ └── src │ │ ├── RTL │ │ ├── RTL.css │ │ ├── RTL.html │ │ └── RTL.js │ │ ├── advance-options │ │ ├── advance-options.css │ │ ├── advance-options.html │ │ └── advance-options.js │ │ ├── basic │ │ ├── basic.html │ │ └── basic.js │ │ ├── different-look │ │ ├── different-look.css │ │ ├── different-look.html │ │ └── different-look.js │ │ ├── disabled-user-input │ │ ├── disabled-user-input.css │ │ ├── disabled-user-input.html │ │ └── disabled-user-input.js │ │ ├── disabled │ │ ├── disabled.html │ │ └── disabled.js │ │ ├── drag-sort │ │ ├── drag-sort.html │ │ └── drag-sort.js │ │ ├── example-template.html │ │ ├── extra-properties │ │ ├── extra-properties.css │ │ ├── extra-properties.html │ │ └── extra-properties.js │ │ ├── input-suggestions-styled-as-tags │ │ ├── input-suggestions-styled-as-tags.css │ │ ├── input-suggestions-styled-as-tags.html │ │ └── input-suggestions-styled-as-tags.js │ │ ├── input │ │ ├── input.html │ │ └── input.js │ │ ├── manual-suggestions │ │ ├── manual-suggestions.css │ │ ├── manual-suggestions.html │ │ └── manual-suggestions.js │ │ ├── mix │ │ ├── mix.html │ │ └── mix.js │ │ ├── mode-select │ │ ├── mode-select.css │ │ ├── mode-select.html │ │ └── mode-select.js │ │ ├── outside-of-the-box │ │ ├── outside-of-the-box.css │ │ ├── outside-of-the-box.html │ │ └── outside-of-the-box.js │ │ ├── readonly-mixed │ │ ├── readonly-mixed.css │ │ ├── readonly-mixed.html │ │ └── readonly-mixed.js │ │ ├── readonly │ │ ├── readonly.html │ │ └── readonly.js │ │ ├── textarea │ │ ├── textarea.html │ │ └── textarea.js │ │ └── users-list │ │ ├── users-list.css │ │ ├── users-list.html │ │ └── users-list.js ├── homepage │ ├── head.html │ ├── header.html │ ├── index.html │ ├── scripts.html │ └── section.njk ├── logo.svg ├── mix2.gif ├── mix3.gif ├── readme-header.svg └── suggestions-list.apng ├── gulpfile.js ├── index.html ├── package.json ├── playwright.config.js ├── pnpm-lock.yaml ├── roadmap.md ├── src ├── parts │ ├── EventDispatcher.js │ ├── constants.js │ ├── defaults.js │ ├── dropdown.js │ ├── events.js │ ├── helpers.js │ ├── persist.js │ ├── suggestions.js │ ├── templates.js │ └── texts.js ├── polyfills │ ├── Array.findIndex.js │ ├── Array.includes.js │ ├── Array.some.js │ ├── AutoUrlDetect.js │ ├── Element.classList.js │ ├── Element.closest.js │ ├── Element.matches.js │ ├── Event.js │ ├── NodeList.forEach.js │ ├── Object.assign.js │ ├── String.includes.js │ ├── String.trim.js │ └── es6-promise.js ├── react-compat-layer.js ├── react.tagify.jsx ├── tagify.js ├── tagify.polyfills.js └── tagify.scss ├── test ├── basic-RTL.html ├── basic.html ├── dragsort.html ├── easy-to-customize.html ├── manual-suggestions.html ├── mix.html ├── mode-select.html ├── scroll-tracking.html ├── tagify.test.js ├── test.html ├── test2.html ├── text-input.html ├── textarea.html ├── users-list.html └── validate.html └── tests └── basic.spec.js /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "no-console" : ["error", { "allow": ["warn", "error"] }], 4 | "no-mixed-spaces-and-tabs": [2, "smart-tabs"], 5 | "block-spacing" : [2, "always"], 6 | "comma-style" : [2, "last"], 7 | "no-debugger" : [1], 8 | "no-alert" : [1], 9 | "indent" : [1, 4, {"SwitchCase":1}], 10 | "strict" : 0, 11 | "no-undef" : 1, 12 | "no-dupe-args" : 2, 13 | "no-const-assign" : 2, 14 | "no-extra-semi" : 2, 15 | "no-dupe-class-members" : 2, 16 | "no-dupe-else-if" : 2, 17 | "no-dupe-keys" : 2, 18 | "no-invalid-regexp" : 2, 19 | "valid-typeof" : 2 20 | }, 21 | "parserOptions": { 22 | "ecmaVersion" : 2020, 23 | "sourceType": "module", 24 | "ecmaFeatures": { 25 | "modules": true, 26 | "sourceType": "module" 27 | } 28 | }, 29 | "env": { 30 | "es6": true, 31 | "browser": true, 32 | "node": true 33 | }, 34 | "globals": { 35 | "jQuery": "readonly" 36 | } 37 | } -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: "⚠️ Please make a DEMO page if possible" 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | ## Prerequisites 11 | 12 | - [x] I am running the latest version 13 | - [ ] I checked the documentation and found no answer 14 | - [ ] I checked to make sure that this issue has not already been filed 15 | 16 | ### 💥 Demo Page 17 | 18 | 19 | https://jsbin.com/jekuqap/edit?html,js,output 20 | 21 | ***React*** issue template: 22 | https://codesandbox.io/s/tagify-react-issue-template-4ub1r?file=/src/index.js 23 | 24 | ### Explanation 25 | 26 | - **What is the expected behavior?** 27 | 28 | - **What is happening instead?** 29 | 30 | - **What error message are you getting?** 31 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: 'Suggest an idea ' 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | 11 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/help-with-something.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Help with something 3 | about: "⚠️ Please make a DEMO page if possible" 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | ## Prerequisites 11 | 12 | - [x] I am running the latest version 13 | - [ ] I checked the documentation and found no answer 14 | - [ ] I checked to make sure that this issue has not already been filed 15 | 16 | ### Demo Page - *clone one of the below:* 17 | 18 | 19 | https://jsbin.com/jekuqap/edit?html,js,output 20 | 21 | ***React*** issue template: 22 | https://codesandbox.io/s/tagify-react-issue-template-4ub1r?file=/src/index.js 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Windows image file caches 2 | Thumbs.db 3 | ehthumbs.db 4 | 5 | # Folder config file 6 | Desktop.ini 7 | 8 | # Recycle Bin used on file shares 9 | $RECYCLE.BIN/ 10 | 11 | # Windows Installer files 12 | *.cab 13 | *.msi 14 | *.msm 15 | *.msp 16 | 17 | # Windows shortcuts 18 | *.lnk 19 | 20 | # ========================= 21 | # Operating System Files 22 | # ========================= 23 | 24 | # OSX 25 | # ========================= 26 | 27 | .DS_Store 28 | .AppleDouble 29 | .LSOverride 30 | 31 | # Thumbnails 32 | ._* 33 | 34 | # Files that might appear in the root of a volume 35 | .DocumentRevisions-V100 36 | .fseventsd 37 | .Spotlight-V100 38 | .TemporaryItems 39 | .Trashes 40 | .VolumeIcon.icns 41 | 42 | # Directories potentially created on remote AFP share 43 | .AppleDB 44 | .AppleDesktop 45 | Network Trash Folder 46 | Temporary Items 47 | .apdisk 48 | /node_modules 49 | /test.html 50 | /.npmrc 51 | /.babelrc 52 | /test2.html 53 | /package-lock.json 54 | /react 55 | /react-demo.html 56 | .idea 57 | /.vscode/bookmarks.json 58 | /.vscode/launch.json 59 | /.vscode/settings.json 60 | /111.html 61 | /logo.psd 62 | /test/_temp.html 63 | /test/test-1.html 64 | /test-results/ 65 | /playwright-report/ 66 | /blob-report/ 67 | /playwright/.cache/ 68 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Permission is hereby granted, free of charge, to any person obtaining a copy 2 | of this software and associated documentation files (the "Software"), to deal 3 | in the Software without restriction, including without limitation the rights 4 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 5 | copies of the Software, and to permit persons to whom the Software is 6 | furnished to do so, subject to the following conditions: 7 | 8 | The above copyright notice and this permission notice shall be included in 9 | all copies or substantial portions of the Software. 10 | 11 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 12 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 13 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 14 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 15 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 16 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 17 | THE SOFTWARE. 18 | 19 | This Software may not be rebranded and sold as a library under any other name 20 | other than "Tagify" (by owner) or as part of another library. -------------------------------------------------------------------------------- /dist/tagify.vue: -------------------------------------------------------------------------------- 1 |