包详细信息

datalist-polyfill

mfranzke11.5kMIT1.25.1

A minimal and dependency-free vanilla JavaScript datalist polyfill. Supports all standard's functionality as well as mimics other browsers behavior.

datalist, polyfill, javascript, html

自述文件

datalist-polyfill

Financial Contributors on Open Collective MIT license npm bundle size Total downloads ~ Npmjs jsDelivr CDN downloads Codacy Badge GitHub Super-Linter CodeQL Known Vulnerabilities datalist-polyfill on Npmjs code style: prettier XO code style Conventional Commits Join the chat at https://gitter.im/datalist-polyfill/community PRs Welcome Open Source Love Contributor Covenant

Update: Safari now supports the datalist element at least basically, as announced earlier in 2019 with the latest release of Safari both for iOS and MacOS X. Yeah !!! Exciting news! I'm planning to release a new major version soon to both cheer as well as accommodate their implementation.

This is a minimal and dependency-free vanilla JavaScript polyfill for the awesome datalist-functionality, that will bring joy and happiness into our lives :-)

  • supports all standard's functionality as well as mimics other browsers behavior.
  • mitigating the different levels of support both by Safari and IE9+ as well as Edge
  • Released under the MIT license
  • Made in Germany. And supported by so many great people from all over this planet - see "Credits" accordingly.
  • Compatible down to Microsoft Internet Explorer 9

Features

  • Lightweight (see the badge above)
  • Fully flexible to change the datalist entries / <option>s
  • Supporting:
    • the relevant input field types: text, email, number, search, tel and url ...
    • ... while leaving the others like color or date related, as those would most likely need another polyfill to work correctly or have a meaningful UI
    • input[type=email] elements multiple attribute
    • properties .options for datalist elements and .list for input elements
    • right to left text-direction
    • non-touch and touch interactions
    • different types of option declarations
    • both Safari and Internet Explorer (IE9+) browsers
    • controlling the display of differing value and label values
    • on input[type=url] omitting the scheme part and performing intelligent matching on the domain name
    • substring matching on both the value and the text values
  • Emits "input" event when item in the datalist is selected
  • Enables core keyboard controls such as
    • on the input
      • up and down arrow keys
    • on the select
      • ESC
      • ENTER
      • BACKSPACE
      • pressing printable characters
  • Implements the WAI-ARIA design pattern

Core concepts

The polyfill was designed with the following concepts kept in mind:

  • dependency-free
  • Supporting DOM changes by event delegation and MutationObserver
  • code accessibility / readability

Installation

Just integrate the JavaScript file into your code - et voilà.

You may optionally load via NPM or Bower:

$ npm install datalist-polyfill
$ bower install datalist-polyfill

API

Nothing really, just plug it in, it will should work out of the box.

This package is also enabling the .options (for datalist elements) and .list (for input elements) properties according to the specs.

If you set a title-Attribute on the <datalist> HTML tag, it would get used as label for the first disabled entry within the polyfilling select on non-touch interactions.

dynamic HTML (or DHTML, if you like to be a little bit nostalgic)

In case that you'd like to dynamically add or modify / create your HTML code, you're good to go with this polyfill, as it's based on event delegation and additionally using MutationObserver (IE11+) that makes your UI work easily - no refresh nor reinit function to call after DOM manipulation or something similar.

Changes to the available option elements

If you'd like to make a change to the integrated list of <option> elements, feel free to either remove or add them right away - the list would get generated on the fly after the user typed in something into the <input> field, so you're covered on this.

You can also disable <option> elements by adding the disabled attribute to the <option> HTML tag if necessary.

Differing value and label values

As the browser vendors (Google Chrome vs. the others) don't seem to be aligned on this topic, I've decided to enable the label-attribute to serve as the definitive label being displayed, even if a value is being defined differing from the label. On different value and text values, both of them would get displayed within the suggestions, as Google Chrome does it. But if you define a differing label-attribute, its value would get displayed exclusively (as all the other browsers do it) to give you some flexibility on how to define those suggestions. Check out the „Different ways of defining an option“ section on the demo page regarding this topic.

value property on the option elements for Microsoft IE 10 & IE 11 and Edge

As explained in detail below in the section "Microsoft Internet Explorer 10 & 11 and Microsoft Edge", for fixing missing behaviour in IE 10+ and Edge we're manipulating the value for the option elements in those browser so you can't access them securely as a getter, but would need to take the original values out of data-originalvalue.

Microsoft Internet Explorer

Microsoft Edge

Microsoft Edge doesn't trigger the input event any more after selecting an item via mouseclick (on input elements other than type of text), even though that IE11 still did, nevermind ...

That for the optimizations on substring matching for Microsoft Edge specifically by #GH-39 (as explained further in the following "Microsoft Internet Explorer 10 & 11 and Microsoft Edge" section) need to get restricted to input[type="text"] elements even only.

There might be possible solutions to even also achieve the expected behaviour on non-text-input elements - even though that I only could think about ugly solutions that I don't want to have within the polyfill and that might even also break existing CSS & JS architecture / selectors.

Microsoft Internet Explorer 10 & 11 and Microsoft Edge

As mentioned with #GH-63, related to aspects reported via #GH-36 and #GH-39 (and in Microsoft Edges platform issues), it doesn't work in IE 10 & 11 as well as in Edge to "Search both the value and label, using substring matching; currently it searches both the value and label, but uses prefix matching".

As requested with #GH-36 we wanted to even also enrich the experience within the "newest" IE versions (10 & 11) and Edge browsers that provided basic support, but not the substring matching for users input. In this case the technical solution has been to manipulate the values in a way that the browser could actually handle that functionality as well, by including the users input at the beginning of the value after a substring matching to the original value, followed by a unique string for preventing any inconsistencies, followed by the original value itself, in this case for the sorting of the entries (this is mainly done in the updateIEOptions function around line 191 to 200 of the code).

This actually leads to a different behavior for the developers on the value property of each option elements within the datalist element for IE & Edge, but on the other hand provides a better UX for IE & Edge users by a consistent behavior for the user.

Microsoft Internet Explorer 9

You'll need the declaration for the standard hidden attribute, that you might already have included in case you're using normalize.css. Otherwise just adapt it from there:

/**
 * Add the correct
 * display in IE 10-
 */

[hidden] {
    display: none;
}

And you need to add a nesting select element wrapped by a conditional comment into the datalist element. Please have a look at the demo page accordingly, the code is being listed at the beginning.

Demo

See the polyfill in action either by downloading / forking this repo and have a look at demos/index.html and demos/ie9/index.html, or at the hosted demo: https://mfranzke.github.io/datalist-polyfill/demos/ and https://mfranzke.github.io/datalist-polyfill/demos/ie9/

things to keep in mind

  • The HTML demo code is meant to be simple - I do know that things like a surrounding <form> are missing, and I've left the latin letters and english expressions for the right to left text-direction example. But lets focus on the relevant tags that this polyfill is all about for the demo.
  • iOS Safari handles the label-attribute different from Safari on Mac OS. This is being equalized during the handling of the label-attributes-value for differing value and label values.
  • After I thought it through and did some experiments, I've finally chosen the <select> element to polyfill the <datalist>, as it brought most of the functionality, whereas I accepted that it doesn't behave and doesn't look equally.
    • As I wanted to mainly focus on native elements in the most low level / simple way instead of visually emulating a list and than afterwards regain all of the functionality via a lot of JavaScript logic, I've ended up with this element, that knows how to play nicely with nested <option> elements.
    • I tried its multiple attribute, as this is most likely already what you're up to regarding appearance, but it does violate the form-follows-function concept and results in - surprise - the possibility for multiple selections, which isn't always <datalist> elements kind of thing... Then the size attribute came to my attention, which much better fits the requirements and behaves as designed quite perfectly.
  • Let the datalist element be a direct follower of the input element - and don't nest it into the label in case that you're doing so with the input (which you nevertheless shouldn't do in general, but hey, gods great zoo is great).
  • If embedding a webview within an iOS app, you should be using WKWebView instead of UIWebView, as it supports datalist right natively and the latter even also leads to a JavaScript error (thanks to @jscho13 for mentioning this).

Credits

Supported by Christian, Johannes, @mitchhentges, @mertenhanisch, @ailintom, @Kravimir, @mischah, @hryamzik, @ottoville, @IceCreamYou, @wlekin, @eddr, @beebee1987, @mricherzhagen, @acespace90, @damien-git, @nexces, @Sora2455, @jscho13, @alexirion and @vinyfc93. Thank you very much for that, highly appreciated !

Tested with

  • Mac
    • macOS 10.13, Safari 11
    • macOS 10.12, Safari 10
    • macOS 10.11, Safari 9
  • iOS
    • iPhone 8 Simulator, Mobile Safari 11.0
    • iPhone 7 Plus Simulator, Mobile Safari 10.0
    • iPad Pro Simulator, Mobile Safari 9.3
  • Windows
    • Windows 7 SP1, Internet Explorer 9.0.8112.16421
    • Windows 8.1, Internet Explorer 11.0.9600.19101

Big Thanks

Cross-browser testing platform provided by CrossBrowserTesting

CrossBrowserTesting

Prospects & functionality overview

The following problems are mainly reported and listed on caniuse as well as due to issues flagged on Github.

Problem IE9 iOS Safari < 12.1 iOS WebView Safari >= 12.1 IE11+ Edge Firefox Chrome Chrome WebView
Basic functionality Polyfill ✔ via WKWebView #GH-33
long lists of items are unscrollable resulting in unselectable options fixed with v.69
No substring matching for the suggestions ✔ by #GH-39
datalist popups gets "emptied" when receiving focus via tab ✔ by #GH-49

Outro

Personally I even also do like the "keep it simple" approach provided within the W3C specs even already.

But on the other hand this leads to an additional visible field, but doesn't emulate the (hopefully, fingers crossed) upcoming x-browser implementation and leaves unnecessary syntax for all of the clients that wouldn't even need it (anymore).

If you're trying out and using my work, feel free to contact me and give me any feedback. I'm curious about how it's gonna be used.

And if you do like this polyfill, please consider even also having a look at the other polyfill we've developed: https://github.com/mfranzke/loading-attribute-polyfill

Contributors

Code Contributors

This project exists thanks to all the people who contribute. [Contribute].

Financial Contributors

Become a financial contributor and help us sustain our community. [Contribute]

Individuals

Organizations

Support this project with your organization. Your logo will show up here with a link to your website. [Contribute]

更新日志

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog and this project adheres to Semantic Versioning.

[Unreleased]

Changed

  • Safari TP seems to support the datalist element at least basically. Yeah !!! Exciting news! I'm planning to release a new major version soon to both cheer as well as accommodate their implementation.

[1.25.0] - 2022-05-16

Added

  • npm scripts for easier releasing
  • test: html-validate for testing
  • code conventions file #76
  • test: CodeQL
  • Recommended VS Code extensions
  • test: Super linter
  • build: CI/CD workflows / actions
  • renovate for Dependency updates
  • feature detection result shown on the demo page
  • financial contributors to the README (#82)

Changed

  • optimized documentation
  • updated devDependencies
  • optimized build process
  • .gitignore file according to githubs default content
  • manifested to use Node 14 for the moment dependening on Webdriver.io
  • default branch name from master to main
  • replaced dependencies badge

[1.24.4] - 2020-05-23

Changed

  • Updated webdriverio, prettier, husky and xo dependencies
  • Replaced Greenkeeper by Snyk for vulnerabilities scanning
  • Formatted code by prettier
  • husky: moved the hook to the dedicated config file
  • README: added Gitter badge

Fixed

  • npmignore: added necessary folder

[1.24.3] - 2020-03-22

Changed

  • Updated webdriverio and prettier dependencies

Fixed

  • build: *.min.js files should't get prettified

[1.24.2] - 2020-03-19

Added

  • improvement(prettier): run prettier when committing files
  • a minzipped size badge

Changed

  • Updated webdriverio dependency
  • improvement(prettier): prettified and optimized the file
  • Formatting and code & content optimizations
  • xo: added further rules for IE9 & IE10 compatibility

[1.24.1] - 2020-03-15

Changed

  • Updated webdriverio, commitlint, husky, prettier and xo dependencies
  • test(xo): specifying the JS filename explicitly
  • build the minified JS file again

Fix

  • Corrected some metadata regarding the packages
  • build(packages): corrected metadata regarding files to ignore and updated bower.json

[1.24.0] - 2020-02-26

Added

  • Linking Apples changelog on the datalist feature from our readme
  • .gitignore file
  • Docs: further mentioned IE10+ and EDGE specifics
  • .npmignore file
  • Commitlint & husky for CI

Changed

  • Updated webdriverio and xo dependencies
  • Reformatted the JS code
  • Removed pointless loop in the code PR #61
  • Updated docs regarding browser support #62

Fixed

  • Docs: filesize in the readme
  • fixed to have a "correct" minification #58
  • Fix exception in IE9 emulator mode PR #65
  • Badges displaying problems in some readers / compilers
  • Docs: optimizing on the typos and clearity

[1.23.3] - 2019-01-28

Changed

  • update xo to version 0.24.0

Fixed

  • No substring matching for multiple emailadress suggestions in IE10+ and EDGE / #54
  • EDGE: Incorrect handling of non-text input fields / #55
  • IE10: Changes by #39 break script execution due to usage of .dataset / #56
  • Some simple corrections, like e.g. removing incorrectly set multiple attributes

[1.23.2] - 2019-01-08

Fixed

  • Prevent the form to be submitted on selecting a value via ENTER key within the select / #51

[1.23.1] - 2019-01-07

Fixed

  • JavaScript bug in IE9 and corrected the handling of the browsers towards IE10+ / #50

[1.23.0] - 2019-01-05

Added

  • Microsoft EDGE / datalist popups get "emptied" when receiving focus via tabbing / #49

Changed

  • Updated webdriver.io testing framework to version 5
  • Updated some aspects within the README file as well as announced some upcoming bigger changes regarding and to cheer the recognized basic support of datalist elements within Apple Safari browser.
  • Refactoring to prevent a „Function has a complexity of 21.“
  • Some simple reformatting of the code according to prettier

[1.22.2] - 2018-11-03

Changed

  • Added comment regarding the structure of the HTML code / #44 & #45

Fixed

  • Preventing a JS error on no type-attribute being provided for the input-element / #45

[1.22.1] - 2018-08-27

Fixed

  • Escaping the user inputs value as doublequotes wouldn't work on the newly added IE11+ and EDGE functionality / #40

[1.22.0] - 2018-08-27

Added

  • Substring matching for the suggestions on both the value and the text values / #36

[1.21.2] - 2018-08-11

Added

  • Finally integrated the test regarding clicking the selects option elements, as this was actually previously prevented by the other bug fixed in the previous release

Fixed

  • Corrected the code style of the README file again, as this got incorrectly reformatted previously

[1.21.1] - 2018-08-09

Fixed

  • Suggestions aren‘t working onClick any more (#35)

[1.21.0] - 2018-08-08

Added

Changed

  • increased specificity on one of the selectors according the usage in other parts of the code
  • Check for correct element on the inputs event delegation
  • Simplified some code parts
  • Further aligned the naming conventions
  • code and complexity simplifications

Fixed

  • Arrow keys (top&down) disturb the general browser behaviour on number fields (#32)

[1.20.1] - 2018-07-20

Changed

  • Code simplifications

Fixed

  • Suggestions aren‘t working onclick any more #31

[1.20.0] - 2018-07-18

Changed

  • on input[type=url] omitting the scheme part and performing intelligent matching on the domain name (#28)
  • README: Updated the tested browsers list as well as updated the Features section due to the updates by this release
  • Preparation for automated testing / splitting the demo page by regular and IE9

Fixed

  • IE9: Use .getAttribute for retrieving .type and .multiple values/existance (#29)
  • list IDL attribute must return the current suggestions source element (#30)

[1.19.0] - 2018-07-13

Added

  • In case of the ESC key being pressed while focusing the polyfilling select, we still want to focus the input[list]

Changed

  • Performance: Set a local variable
  • Preparation for some automated testing
  • Changed and added some functionality to the description within the README file

[1.18.1] - 2018-07-10

Added

  • Dispatch the input event as well on the related input[list] on using the Backspace key within the polyfilling select

[1.18.0] - 2018-07-10

Changed

  • Defined the system-font for the demo-page
  • Renamed some variables to some more meaningful names
  • Cleanup on some unnecessary variables & comments

Removed

  • Removed an old separation in between eventTarget-Tagnames of select and option, that was integrated due to the mouse-event, which has been replaced again a while ago

[1.17.0] - 2018-07-07

Added

  • Include behavior on pressing Tab or other printable keys (#27)
  • Added Greenkeeper badge. I'm using this service to keep being updated on the dev dependencies.

[1.16.2] - 2018-07-04

Fixed

  • Fixed a bug that lead to an incorrectly selected suggestion (first instead of last) while using the up key on the input element
  • Fix for input[list] elements with class attribute - thanks to @mricherzhagen for mentioning this and even also providing a solution by pull request #25

[1.16.1] - 2018-06-28

Fixed

  • Introduced a new bug by the fix for #23. Reverted that one and corrected the ESLint rules settings. (#24)

[1.16.0] - 2018-06-27

Added

  • Linting as well as security: prettier, xo, codacy
  • And their badges

Changed

Made a lot of code changes in relation to what the previously mentioned linters reported. (e.g. #23)

Security

Made some code changes in relation to what the previously mentioned linters reported. (e.g. #21, #22)

[1.15.1] - 2018-06-22

Fixed

  • A previous checkin has broken the solution provided for #16, so I've fixed this again.

[1.15.0] - 2018-06-22

Changed

  • Mainly simplified the code.

[1.14.4] - 2018-06-21

Fixed

  • IE9: After choosing a suggestion out of the polyfilling select, the select itself wouldn't get hidden. (#19)

[1.14.3] - 2018-06-20

Changed

  • Changed the order in a comparsion as this simplifies the response.

Fixed

  • Sadly another small bug slipped through today, it's about an incorrect variable being used.

[1.14.2] - 2018-06-20

Fixed

  • A small bug sadly slipped through that doesn't hide the polyfilling select on non-matching option elements regarding the value.

[1.14.1] - 2018-06-20

Added

  • Hiding the polyfilling select on pressing ENTER, which is equal to the behavior on pressing ESC.
  • Added more badges to the README. I'm loving badges.

Changed

  • Made some necessary changes to enhance the current demo page by the minimum amount of relevant HTML tags that should be included within every page (and even also added the IE related meta tag due to backwards compatibility).

Removed

  • Removed some sample code out of the README page due to the new NPM websites layout.

Fixed

  • The determination of option elements within the polyfilling select has incorrectly even also included :disabled elements.

[1.14.0] - 2018-06-12

Added

  • Added MutationObserver to even also capture changes to the option elements as a correction to enhance the current functionality (#16).

Changed

  • Changed some URLs from HTTP to the new kid on the block: HTTPS. Nice ! ;-)
  • Additionally did some necessary updates to the documentation.

[1.13.2] - 2018-06-11

Changed

  • Focusing the input[list] after selecting a suggestion, as in #18

[1.13.1] - 2018-06-04

Changed

  • Some code refactoring, nothing really serious By the way, it was polyfills 1st birthday one month ago. Yeah !!!

[1.13.0] - 2018-05-28

Added

  • Thanks to @eddr and @Kravimir for inspiring me via #5 that there should be another possibility on defining value and label for the suggestions. As the browser vendors (GC vs. the others) don't seem to be aligned on this topic, I've decided to enable the label-attribute to serve as the definitive label being displayed, even if a value is being defined differing from the label. Check out the „Different ways of defining an option“ section on the demo page regarding this topic.

Changed

  • The docs. And changed (dependencies) and added (jsdelivr) badges. I like badges.
  • As well as extracted the CHANGELOG to an external file.

[1.12.3] - 2018-05-04

Fixed

  • @wlekin thankfully mentioned (extracted to #15) that the polyfilling select gets positioned incorrectly underneath the input[list] element on iOS.

[1.12.2] - 2018-05-01

Fixed

  • Thank you @IceCreamYou for fixing the case sensitive focusOut -> focusout event name

[1.12.1] - 2018-04-07

Changed

  • simple (code) style changes (plus added .editorconfig to keep it that way) and typo

[1.12.0] - 2018-03-18

Added

  • @ottoville thankfully contributed by mentioning and implementing the feature of emitting an event when item in datalist is selected

[1.11.2] - 2018-03-17

Changed

  • @mertenhanisch has styled the code according to more „standard“ formatting and also improved the wording of the documentation, which is awesome.
  • And @mitchhentges thankfully supports on reviewing your great community support and ensures to the keep the wheels turning on the development of this projects. Many kudos to the both of you !!!

[1.11.1] - 2017-11-24

Fixed

  • @hryamzik thankfully mentioned by #7 that the polyfilling select gets positioned incorrectly in case of the input[list] element being styled as a block-level element.

[1.11.0] - 2017-10-08

Changed

  • I'm very thankful for @ailintom mentioning the missing IE9 support with #2, which is still relevant (at least and maybe foremost) for the Windows Vista users.
  • Additionally @Kravimir thankfully brought to my attention, that IE9 handles the option subelements quite restricted - so I've added a section regarding IE9 support to the demo page with the additional two lines of HTML, that you'll need to add in case you also need / want to still support IE9 in your projects, as well as changed the JavaScript code to even also support IE9.

[1.10.3] - 2017-10-07

Changed

  • Added a comment regarding IE9 - and some simple code styling.

[1.10.2] - 2017-09-26

Fixed

  • Simple corrections.

[1.10.1] - 2017-09-25

Fixed

  • Simple bugfix, that came up through the latest implementation on the up and down arrow keys.

[1.10.0] - 2017-08-16

Changed

  • Added the ability to open the datalist on the up and down keys even in case that no value has been provided - this seems to be intentionally and even also adapts the behavior by supporting browsers.

[1.9.0] - 2017-07-20

Changed

Regarding the changes out of release version 1.6.0 to emulate the expected UI quite nicely, I was still struggling with using that hacky solution (multiple attribute) and even also of how to prevent multiple selections on the polyfilling select.

  • Actually the attribute size came to my attention, which much better fits the requirements and behaves as designed quite perfectly. Chapeau!

[1.8.1] - 2017-07-18

Fixed

  • Bugfix regarding the handling of the label values.

[1.8.0] - 2017-07-24

Changed

  • Restricted the polyfill to only work with relevant input types; we’d like to exclude the ones that even already need another polyfill to „work“ correctly or have a meaningful UI, like e.g. color or date-related ones, as those polyfills should handle the support of the datalist themselves depending on their own functionality.

[1.7.0] - 2017-06-29

Added

  • As mentioned by @aFarkas within his review, option elements could be of some different formats. This release especially follows the spec regarding the aspect that „Each suggestion has a value and a label.“.

[1.6.2] - 2017-06-28

Changed

  • Optimized the behavior to select the entries within the polyfilling select[multiple] on using the up and down arrow keys from the polyfilled input[list].

[1.6.1] - 2017-06-16

Changed

  • Introduced speaking variables for the different keycodes.
  • And implemented some feedback by flow.
  • As well as additional code simplifications.

[1.6.0] - 2017-06-16

Changed

This is so far the biggest and greatest update !

  • Depending of the feedback by Michael the visual appearance has changed and will better emulate the expected layout as in other browsers (on non-touch interactions). That for the script is creating the polyfilling select as a multiple-selection type, which emulates the expected „form“ better.
  • And better positioning as well as styling the polyfilling select according to the input field, like e.g. even also set the polyfilling select elements border-radius equally as the one by the polyfilled input.

[1.5.0] - 2017-06-10

Changed

  • Simplified the styling and got rid of the external CSS files / dependency. You could remove that one now. Yeah!

[1.4.0] - 2017-06-09

Added

  • Added RTL text-direction support

[1.3.0] - 2017-05-30

Added

  • Added support for multiple email addresses, separated by comma.

Changed

  • And again, updated documentation slightly. And demo accordingly.

[1.2.1] - 2017-05-29

Changed

  • Simple code style modifications. Because style matters.

[1.2.0] - 2017-05-29

Added

  • Added .options (for datalist elements) and .list (for input elements) properties according to the specs.

[1.1.2] - 2017-05-22

Changed

  • Further simplified the code, so that we could even skip the .matches() polyfill. Yeah.
  • And documentation updates.

[1.1.1] - 2017-05-10

Fixed

  • fixed another simple bug that lead to an incorrect index being selected - let's skip this, as it's not even the standard behavior

[1.1.0] - 2017-05-09

Fixed

  • some small corrections

[1.0.3] - 2017-05-09

Changed

  • better preselection on entries within the dropdown depending on the input elements value

[1.0.2] - 2017-05-08

Added

  • added a package.json file

[1.0.1] - 2017-05-08

Fixed

  • Small, but important typo. :-) Thanks @Fyrd for mentioning this.

[1.0.0] - 2017-05-04

Added

  • First release.