{"_id":"easydropdown","_rev":"10-dd890c0986f4aa942b6cf0db63106814","time":{"4.0.0":"2018-05-07T22:17:26.074Z","created":"2018-05-08T22:24:42.087Z","4.0.1":"2018-05-08T22:24:42.163Z","modified":"2022-04-30T19:30:40.211Z","4.0.2":"2018-05-08T23:04:56.735Z","4.0.3":"2018-05-10T13:15:19.037Z","4.0.4":"2018-10-01T09:14:43.351Z","4.0.5":"2018-10-02T08:57:17.270Z","4.1.0":"2019-03-27T23:27:16.723Z","4.1.1":"2019-03-31T22:32:56.239Z","4.2.0":"2020-02-02T22:59:37.979Z"},"name":"easydropdown","dist-tags":{"latest":"4.2.0"},"versions":{"4.0.1":{"name":"easydropdown","version":"4.0.1","description":"A lightweight library for building beautiful styleable select elements","author":{"name":"KunkaLabs Limited"},"private":false,"license":"Apache-2.0","main":"./dist/index.js","types":"./dist/index.d.ts","browser":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/patrickkunka/easydropdown.git"},"scripts":{"test":"mocha --opts ./config/mocha/mocha.opts","test:watch":"npm run test -- --watch","test:cover":"nyc npm run test","lint":"npm run lint:ts && npm run lint:css","lint:ts":"tslint --project tsconfig.json -c './config/tslint/tslint.json' './src/**/*.ts' './src/**/*.test.ts'","lint:css":"stylelint --config './config/stylelint/.stylelintrc.json' './demos/**/*.css'","watch":"tsc --watch","build":"tsc","bundle":"webpack --config ./config/webpack/config.ts","bundle:watch":"npm run bundle -- --watch","bundle:build":"npm run bundle -- --env=production && npm run copy:bundle","copy:bundle":"cp ./bundle/easydropdown.js ./demos/easydropdown.js && cp ./bundle/easydropdown.js.map ./demos/easydropdown.js.map","prepublishOnly":"npm run test && npm run lint && npm run bundle:build && npm run build","coveralls":"npm run test:cover -- --report lcovonly && cat ./coverage/lcov.info | coveralls"},"nyc":{"extends":"./config/nyc/.nycrc.json"},"dependencies":{"custom-event-polyfill":"^0.3.0","helpful-merge":"^0.1.0"},"devDependencies":{"@types/chai":"^4.0.5","@types/mocha":"^2.2.44","@types/node":"^8.0.53","@types/sinon":"^4.3.1","chai":"^3.5.0","chai-shallow-deep-equal":"^1.4.0","coveralls":"^3.0.0","istanbul":"^0.4.5","jsdom":"^11.8.0","jsdom-global":"^3.0.2","mocha":"^3.0.2","nyc":"^11.3.0","sinon":"^4.5.0","source-map-support":"^0.5.0","stylelint":"^9.2.0","stylelint-config-standard":"^18.2.0","ts-loader":"^4.2.0","ts-node":"^3.3.0","tsconfig-paths":"^3.3.1","tslint":"^5.8.0","tslint-eslint-rules":"^5.1.0","typescript":"^2.6.1","webpack":"^4.6.0","webpack-cli":"^2.1.2"},"gitHead":"b65f437533664434cba5e4317e6f00c92dabe3d6","bugs":{"url":"https://github.com/patrickkunka/easydropdown/issues"},"homepage":"https://github.com/patrickkunka/easydropdown#readme","_id":"easydropdown@4.0.1","_npmVersion":"6.0.0","_nodeVersion":"8.9.4","_npmUser":{"name":"kunkalabs","email":"info@kunkalabs.com"},"dist":{"integrity":"sha512-HxBfirmQa4gNhwv5sjk+KMJterxESZXS2pE4XVVxvKN5Suw4GPyCuqknvcAlGpo1u9cSWymUzfIPWzfQ1IWufA==","shasum":"54197d209a5979e0576f50c99001ed870f3df5be","tarball":"https://registry.npmjs.org/easydropdown/-/easydropdown-4.0.1.tgz","fileCount":145,"unpackedSize":170425,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa8iOsCRA9TVsSAnZWagAAW4UP/1YG6A2LmCsrZlcQL3uk\nz1Zom9yetpi7DOQoNqtvAMI3YWnEJVkJbQM2UBvdvvLM7uK8nyFsaoSb4Uyr\n2FYjLOaiYmkUle4Zcad+hf06EumMfDwGs+slx9sFxxU5cwc26CTiLAuNpjQR\nubxXZOKb8CCZzyf+tvdwdL0AvfstTmZ7Ui4SRmO5weKsMIA6EUlY5L2MTYRK\nWUM6dvlDKv0Tu6Uymkc6+c7lhkgzvBXlJBuaNSsZceDffJ672VdAFodd69kG\ntAb8kRgHCBHeZlPQ4XY+/zzoyycR4sB9U7OwlpJTFqOdN1bL/1niTCRcMd57\n6PKNhjg5pM/cGWQd/xG4cAJOSl32cWreSBRoFFrEoHnwPVo/glroMbXKBt4M\nme9zVtV/gh7myobsPNvdmpGxq9euvZyv1mKuD8Fc8ZOgznK/ooizv38JGBGi\nVsC8xEsPJAtFJANFd1fOx50LYUB5V6XbAfjB69BWG5jD0XcETQuVqhu0c/uq\n0Z/gQ7LiM3oDM2RzeEf/KIya6uw1wr/AAE+Z/rc8aoOfHlSpxAV9m4JEQfRQ\n8bjZAXd3KsGx0IZrOW7X3cMcpMyyEv+qbnml5Py6UQmUfFq1W6Ks0OnjUaWY\nabRcw0wEBwGBpkSSBNPg++MjTTTTuHR6sis/C35pV7EJ5fCf3Dx+9wKP4Ju/\npzdu\r\n=PRBy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICIVADpcpDaE13vH8f8GUFY2I0yziydv8urbW5Mh30jrAiBWCYUQY1vVVDylgi/VIPu0TBhJZHWw3SX2fAo0EuVxCw=="}]},"maintainers":[{"name":"kunkalabs","email":"info@kunkalabs.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/easydropdown_4.0.1_1525818282088_0.7754934583364756"},"_hasShrinkwrap":false},"4.0.2":{"name":"easydropdown","version":"4.0.2","description":"A lightweight library for building beautiful styleable select elements","author":{"name":"KunkaLabs Limited"},"private":false,"license":"Apache-2.0","main":"./dist/index.js","types":"./dist/index.d.ts","browser":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/patrickkunka/easydropdown.git"},"scripts":{"test":"mocha --opts ./config/mocha/mocha.opts","test:watch":"npm run test -- --watch","test:cover":"nyc npm run test","lint":"npm run lint:ts && npm run lint:css","lint:ts":"tslint --project tsconfig.json -c './config/tslint/tslint.json' './src/**/*.ts' './src/**/*.test.ts'","lint:css":"stylelint --config './config/stylelint/.stylelintrc.json' './demos/**/*.css'","watch":"tsc --watch","build":"tsc","bundle":"webpack --config ./config/webpack/config.ts","bundle:watch":"npm run bundle -- --watch","bundle:build":"npm run bundle -- --env=production && npm run copy:bundle","copy:bundle":"cp ./bundle/easydropdown.js ./demos/easydropdown.js && cp ./bundle/easydropdown.js.map ./demos/easydropdown.js.map","prepublishOnly":"npm run test && npm run lint && npm run bundle:build && npm run build","coveralls":"npm run test:cover -- --report lcovonly && cat ./coverage/lcov.info | coveralls"},"nyc":{"extends":"./config/nyc/.nycrc.json"},"dependencies":{"custom-event-polyfill":"^0.3.0","helpful-merge":"^0.1.0"},"devDependencies":{"@types/chai":"^4.0.5","@types/mocha":"^2.2.44","@types/node":"^8.0.53","@types/sinon":"^4.3.1","chai":"^3.5.0","chai-shallow-deep-equal":"^1.4.0","coveralls":"^3.0.0","istanbul":"^0.4.5","jsdom":"^11.8.0","jsdom-global":"^3.0.2","mocha":"^3.0.2","nyc":"^11.3.0","sinon":"^4.5.0","source-map-support":"^0.5.0","stylelint":"^9.2.0","stylelint-config-standard":"^18.2.0","ts-loader":"^4.2.0","ts-node":"^3.3.0","tsconfig-paths":"^3.3.1","tslint":"^5.8.0","tslint-eslint-rules":"^5.1.0","typescript":"^2.6.1","webpack":"^4.6.0","webpack-cli":"^2.1.2"},"gitHead":"c1b7b6779c1a2773eb88b804317745b6bfbf1efc","bugs":{"url":"https://github.com/patrickkunka/easydropdown/issues"},"homepage":"https://github.com/patrickkunka/easydropdown#readme","_id":"easydropdown@4.0.2","_npmVersion":"6.0.0","_nodeVersion":"8.9.4","_npmUser":{"name":"kunkalabs","email":"info@kunkalabs.com"},"dist":{"integrity":"sha512-d7R2L3YCzTi5QqVXSbpIqT8VUVX1UrxV7r6gCcqk4UjQMga1oS9F+q/NqZlxB/UkEIAxuFzylok65XacMnkWSQ==","shasum":"a6b1e436b7788c685628bd963b3d207615e1dc7b","tarball":"https://registry.npmjs.org/easydropdown/-/easydropdown-4.0.2.tgz","fileCount":145,"unpackedSize":170635,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa8i0aCRA9TVsSAnZWagAAC4MP/2qFPVOkITeRJcgd29qe\nx6pD3YdF+ad84m3Lmr1eToOwK7p1dQJD4RMvWpy0DF6n7JaXEZJyWf0CwyQ0\nZevKULhvbfjGyIKTcW/3ly4eo5GBNVc3VjxjRzOLNR6GqvGJNnQYeYFbVJrK\nlM3KPV/Bs1qtPbNw1Tm9iic7lTCvuUOAoTgPYx6ybp0LyEhn+GHVsbNaSY/c\nIC9XzdOL4EhKbFhnkME86EjbCkeVbV+JnxyZutVVH99UwuHpdxWXbwrs65kg\nZM5Fqwb0l7JuTsXnYCar5SXw4tMBUPYoV0GhKlqpwtNxmM5hIPv3mY7K7miZ\no/5u25BtR7wcTGY5LG2aGwL38k4ZvsSn6F5PoAA6RjSbgIPbjVmfH+Uif7AO\nnwuZNFlzsyzOi80eb9Q1jV0gZ/NqiuxzE1vA4snkcpIXdK70Yf2oC4SsJHvm\nZwz9QdW0TPAwkz8FONhjOScXK2XSIFixQpY8j5QofMkIjNpzDbyfEwOcj5Fk\nukh0jyFOgB7G6f6W9n1ESB41gHP+4ff4nePKUyGKKn112iiZzW/qT3uaZF3Y\nRCO7u3+DjAbTtEkH9sKmZvg7tG/S1V1oblMyM+NbHlzg+t6Vs5fhH/FaJ6Vl\ntWLqqwWMS7VYrSzUkr/SQY2YIhDMmsmnIlul9lqGcrsKhFIWP4ZhQjiO/mc/\nvu4T\r\n=zm2U\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCd1l1OyGkKUTIXkxVVYk7VlKlkkCnbGGDCSS9Rf3WGVAIhAKaG/jW5H5/Kr0GI67k4PPlNhLCxv5mVK++M1Y9U8pLn"}]},"maintainers":[{"name":"kunkalabs","email":"info@kunkalabs.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/easydropdown_4.0.2_1525820696621_0.9273052391534222"},"_hasShrinkwrap":false},"4.0.3":{"name":"easydropdown","version":"4.0.3","description":"A lightweight library for building beautiful styleable select elements","author":{"name":"KunkaLabs Limited"},"private":false,"license":"Apache-2.0","main":"./dist/index.js","types":"./dist/index.d.ts","browser":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/patrickkunka/easydropdown.git"},"scripts":{"test":"mocha --opts ./config/mocha/mocha.opts","test:watch":"npm run test -- --watch","test:cover":"nyc npm run test","lint":"npm run lint:ts && npm run lint:css","lint:ts":"tslint --project tsconfig.json -c './config/tslint/tslint.json' './src/**/*.ts' './src/**/*.test.ts'","lint:css":"stylelint --config './config/stylelint/.stylelintrc.json' './demos/**/*.css'","watch":"tsc --watch","build":"tsc","bundle":"webpack --config ./config/webpack/config.ts","bundle:watch":"npm run bundle -- --watch","bundle:build":"npm run bundle -- --env=production && npm run copy:bundle","copy:bundle":"cp ./bundle/easydropdown.js ./demos/easydropdown.js && cp ./bundle/easydropdown.js.map ./demos/easydropdown.js.map","prepublishOnly":"npm run test && npm run lint && npm run bundle:build && npm run build","coveralls":"npm run test:cover -- --report lcovonly && cat ./coverage/lcov.info | coveralls"},"nyc":{"extends":"./config/nyc/.nycrc.json"},"dependencies":{"custom-event-polyfill":"^0.3.0","helpful-merge":"^0.1.0"},"devDependencies":{"@types/chai":"^4.0.5","@types/mocha":"^2.2.44","@types/node":"^8.0.53","@types/sinon":"^4.3.1","chai":"^3.5.0","chai-shallow-deep-equal":"^1.4.0","coveralls":"^3.0.0","istanbul":"^0.4.5","jsdom":"^11.8.0","jsdom-global":"^3.0.2","mocha":"^3.0.2","nyc":"^11.3.0","sinon":"^4.5.0","source-map-support":"^0.5.0","stylelint":"^9.2.0","stylelint-config-standard":"^18.2.0","ts-loader":"^4.2.0","ts-node":"^3.3.0","tsconfig-paths":"^3.3.1","tslint":"^5.8.0","tslint-eslint-rules":"^5.1.0","typescript":"^2.6.1","webpack":"^4.6.0","webpack-cli":"^2.1.2"},"gitHead":"92f6791e00d13757e803b73f597d0faf2579f2a0","bugs":{"url":"https://github.com/patrickkunka/easydropdown/issues"},"homepage":"https://github.com/patrickkunka/easydropdown#readme","_id":"easydropdown@4.0.3","_npmVersion":"6.0.1","_nodeVersion":"8.9.4","_npmUser":{"name":"kunkalabs","email":"info@kunkalabs.com"},"dist":{"integrity":"sha512-b2yXklvqYUtyM9+sbs/qlRIoAzziWqUH3x0jksASRn+GIDbmdfmq0m91joyP2D7O5hZKBNMnPAmOyOoN4S6Mdw==","shasum":"bf7aa2fed5ec213751704d6e7e28477b785fac85","tarball":"https://registry.npmjs.org/easydropdown/-/easydropdown-4.0.3.tgz","fileCount":165,"unpackedSize":179773,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa9EXpCRA9TVsSAnZWagAAyqwQAJYMMY/1ushPwAWqnaun\nDfS7X1UIoHFVM1qvndyh2AJYitJR+pPBC5WPwDgd5ckQFbAfX0l1tHgWhy/a\nmVfvPqgjgmAZSuCyzQTxGqvrIbR1EaFDnG0RK/OYNT6HOGr6DKNvU6SQZODq\nHoWhyWPPze3dJ/04Cvk7yYHI6RTnLPDqdRpiYR7ulNMPyMJc6GMOARfRUI2S\ntgb9G4WebDcBXwUH5v9hc10e8MruvBRpgXVqe9ySEsUFqiBJ7VVzzA3USWOV\nsU3I4rx0PCAr2c/QekrASb6+tn0Y4UqxwCZhjOwivzhUJmRWp9AFOGG4JMpa\nQrN404I8pLb3mEZMiciJiwgFuowhoTjtrtz01m9AalKO1XDvgTvb+lShbCiI\n04svrLs6UgS53wqaGykcmTKQl946nm9/O/MOFugbEbTtmGE9l5oaZx3x4+SV\nmN72XOrnxaufKFMWk8cT4L7GANTrjRKt3iN7yz/ui6wFARAdwRhJWIQr9R6g\nqJsyYwFT7JjdYuP2jr9vgJZweSUCWXw43YgYGF8xBfoVeKuslvqigH69SNNY\nmMnC0KzIOG1AlWPo2xeLLQiVR6brS2V58Votyk5JyPONPKfz/wwgtOBV50UD\nkAlZaY3ZGWrFl5YjpAVyZTCM0xSzVzGwLMxyCzcrMy7VxEuaxw5LwU6/b5++\n3kuP\r\n=gYD2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDnbETmV6/RYmtcd8Uoo86CQuazaamCAUm52A7mRpi7uQIhAN4qAz/KVu0E0rGPXnVv2ZdZEIgzFsVVfJUMDC+pm9oy"}]},"maintainers":[{"name":"kunkalabs","email":"info@kunkalabs.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/easydropdown_4.0.3_1525958118915_0.036159177596367"},"_hasShrinkwrap":false},"4.0.4":{"name":"easydropdown","version":"4.0.4","description":"A lightweight library for building beautiful styleable select elements","author":{"name":"KunkaLabs Limited"},"private":false,"license":"Apache-2.0","main":"./dist/index.js","types":"./dist/index.d.ts","browser":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/patrickkunka/easydropdown.git"},"scripts":{"test":"mocha --opts ./config/mocha/mocha.opts","test:watch":"npm run test -- --watch","test:cover":"nyc npm run test","test:size":"bundlesize","lint":"npm run lint:ts && npm run lint:css","lint:ts":"tslint --project tsconfig.json -c './config/tslint/tslint.json' './src/**/*.ts' './src/**/*.test.ts'","lint:css":"stylelint --config './config/stylelint/.stylelintrc.json' './demos/**/*.css'","watch":"tsc --watch","build":"tsc","bundle":"webpack --config ./config/webpack/config.ts","bundle:watch":"npm run bundle -- --watch","bundle:build":"npm run bundle -- --env=production && npm run copy:bundle","copy:bundle":"cp ./bundle/easydropdown.js ./demos/easydropdown.js && cp ./bundle/easydropdown.js.map ./demos/easydropdown.js.map","prepublishOnly":"npm run test && npm run lint && npm run bundle:build && npm run build","coveralls":"npm run test:cover -- --report lcovonly && cat ./coverage/lcov.info | coveralls"},"nyc":{"extends":"./config/nyc/.nycrc.json"},"bundlesize":[{"path":"./bundle/easydropdown.js","maxSize":"9.17 kB"}],"dependencies":{"custom-event-polyfill":"^0.3.0","helpful-merge":"^0.1.0"},"devDependencies":{"@types/chai":"^4.0.5","@types/mocha":"^2.2.44","@types/node":"^8.0.53","@types/sinon":"^4.3.1","bundlesize":"^0.17.0","chai":"^3.5.0","chai-shallow-deep-equal":"^1.4.0","coveralls":"^3.0.0","istanbul":"^0.4.5","jsdom":"^11.8.0","jsdom-global":"^3.0.2","mocha":"^3.0.2","nyc":"^11.3.0","sinon":"^4.5.0","source-map-support":"^0.5.0","stylelint":"^9.2.0","stylelint-config-standard":"^18.2.0","ts-loader":"^4.2.0","ts-node":"^3.3.0","tsconfig-paths":"^3.3.1","tslint":"^5.8.0","tslint-eslint-rules":"^5.1.0","typescript":"^2.6.1","webpack":"^4.6.0","webpack-cli":"^2.1.2"},"gitHead":"731a18cedaa0cbec0d68ae182bd8db92c73fc89c","bugs":{"url":"https://github.com/patrickkunka/easydropdown/issues"},"homepage":"https://github.com/patrickkunka/easydropdown#readme","_id":"easydropdown@4.0.4","_npmVersion":"6.4.1","_nodeVersion":"8.9.4","_npmUser":{"name":"kunkalabs","email":"info@kunkalabs.com"},"dist":{"integrity":"sha512-0XJndtf8d8ZQTaSmOf9MIhRZIbqcZMW3gN70rdEEnUZCOEO1T8st2+Yv0vyxCiQBeNvCDkAImtdsHhe2o1diCw==","shasum":"29ed08f37c9d114fe24fd1e64a905d361a71fd42","tarball":"https://registry.npmjs.org/easydropdown/-/easydropdown-4.0.4.tgz","fileCount":166,"unpackedSize":180125,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbseWDCRA9TVsSAnZWagAAzP4P/A1nvTm9UoBoOqFES7+j\ndu7aSNMyKn7EB8S0ETPFxN+pqoW7Z2Ew0ayNZbIapTXt3dBOoaDyg3tDDffj\nrjSmgNcjyuo8bySRItSfwfnvrEadaY22PUAL02bTPXn7+9fXYXICQwoF07JP\nJPDGA67s5A1zg0ZeSvEEamCV/BimbbweQ7tlr8BU7oErX6NmShITQ1YF428t\n/YOFzh6sT+0VUvPSDvRqrYPNTOMSm+ZtT7GW6iSAC5J3dTass2dkCFwq00bW\nEVo6QkHJUu3JauCsBGpZ7/4vHCR3P/6BrH1IYSU9tHIYGSsXZg41vaeLzsU3\n5ul/shHPFISIpX3yBL978Tzc85U05oJUgm3dHtAjFIyhQ+mqMu4Na1QmvuWa\nAjq+VFDgUXQjn0zVjisDv1jh/zeWvrmavPZ1rpscCfHUWT9MBT/8GlJPcNS+\nA9WJAlvm00fCSsLC1Ib87Lb9eDBRRFYHYi9wVK3bdaNJFirG5PZtZumVzgAf\nRRz9phw1i2ilTZ/iFu0QxgS2VCBOEddLZXB6BJywSy8Nb4hkXdcqaswUoXrJ\nVibi4Y/KjSFmneM0/0j6509NoJR7m0fJBV5DEEh4GAiTGnzTsUip8Kt4DfV9\nP69k7rDTPgL/zOYNPHVmBTkN+ta7R394QJVMBpQfeGWES/PAytMKgC74r6Oj\nuh/A\r\n=SFlj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHPyDPX6K91k4EBDaDEj91jWjUAKkWz3VbZfOcjKYSQ5AiEApmgPd2KKXFFMoZNyjV8pp6jgC+G68/V9fuFSqb8hHgw="}]},"maintainers":[{"name":"kunkalabs","email":"info@kunkalabs.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/easydropdown_4.0.4_1538385283223_0.7359491588852864"},"_hasShrinkwrap":false},"4.0.5":{"name":"easydropdown","version":"4.0.5","description":"A lightweight library for building beautiful styleable select elements","author":{"name":"KunkaLabs Limited"},"private":false,"license":"Apache-2.0","main":"./dist/index.js","types":"./dist/index.d.ts","browser":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/patrickkunka/easydropdown.git"},"scripts":{"test":"mocha --opts ./config/mocha/mocha.opts","test:watch":"npm run test -- --watch","test:cover":"nyc npm run test","test:size":"bundlesize","lint":"npm run lint:ts && npm run lint:css","lint:ts":"tslint --project tsconfig.json -c './config/tslint/tslint.json' './src/**/*.ts' './src/**/*.test.ts'","lint:css":"stylelint --config './config/stylelint/.stylelintrc.json' './demos/**/*.css'","watch":"tsc --watch","build":"tsc","bundle":"webpack --config ./config/webpack/config.ts","bundle:watch":"npm run bundle -- --watch","bundle:build":"npm run bundle -- --env=production && npm run copy:bundle","copy:bundle":"cp ./bundle/easydropdown.js ./demos/easydropdown.js && cp ./bundle/easydropdown.js.map ./demos/easydropdown.js.map","prepublishOnly":"npm run test && npm run lint && npm run bundle:build && npm run build","coveralls":"npm run test:cover -- --report lcovonly && cat ./coverage/lcov.info | coveralls"},"nyc":{"extends":"./config/nyc/.nycrc.json"},"bundlesize":[{"path":"./bundle/easydropdown.js","maxSize":"9.17 kB"}],"dependencies":{"custom-event-polyfill":"^0.3.0","helpful-merge":"^0.1.0"},"devDependencies":{"@types/chai":"^4.0.5","@types/mocha":"^2.2.44","@types/node":"^8.0.53","@types/sinon":"^4.3.1","bundlesize":"^0.17.0","chai":"^3.5.0","chai-shallow-deep-equal":"^1.4.0","coveralls":"^3.0.0","istanbul":"^0.4.5","jsdom":"^11.8.0","jsdom-global":"^3.0.2","mocha":"^3.0.2","nyc":"^11.3.0","sinon":"^4.5.0","source-map-support":"^0.5.0","stylelint":"^9.2.0","stylelint-config-standard":"^18.2.0","ts-loader":"^4.2.0","ts-node":"^3.3.0","tsconfig-paths":"^3.3.1","tslint":"^5.8.0","tslint-eslint-rules":"^5.1.0","typescript":"^2.6.1","webpack":"^4.6.0","webpack-cli":"^2.1.2"},"gitHead":"1b11306f2afbaec029aba6c39295970a9ea9e1fd","bugs":{"url":"https://github.com/patrickkunka/easydropdown/issues"},"homepage":"https://github.com/patrickkunka/easydropdown#readme","_id":"easydropdown@4.0.5","_npmVersion":"6.4.1","_nodeVersion":"8.9.4","_npmUser":{"name":"kunkalabs","email":"info@kunkalabs.com"},"dist":{"integrity":"sha512-r1/eKRxcJt3G9Ec9Pa3HL0gQj1v4tqcYIxxRRB4Ox1M10rjyiWnjKzs/HdC6FiOHcVKJrMuiQn4SZKh80BkA3g==","shasum":"0184c26d722fd00ad0ba5e9ee4624cf26e97ceb6","tarball":"https://registry.npmjs.org/easydropdown/-/easydropdown-4.0.5.tgz","fileCount":166,"unpackedSize":180265,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbszLtCRA9TVsSAnZWagAAyLMP+wYPjU278G9AVBvzaKQB\nDbiSM46Q1ja4fdLqypf/FyFatPdlOPEyDNKRemvY1cOHQOAjySV7fRr0vEiT\npuIwCyDppLwe084XKda+GfauvTYBURrt44NJNHJnLr27qq+gUieuJVeTm7Ve\nf61xqRWBUoK+qcy7gWtGgrfmCOHyzTQLa0r+r9WqHSKk4BUSvVsuzOP5U2ow\nDKdpsD+Atu9TbhOFuTGbTqo0czKgukDqG6PlGKHbk0pHzQrw+HvrEOG5YP5W\nTCHoCoHM3PhrsOWFQPfuLdaytGm4nMNInFsI31Kro27+6lkRuyaPShF9yMs8\nFQRk80F5jLYWQtgCHkHCG2U15itfIJQB7YxvIu5XqmWFt8odUX/qewpQhQwP\nksfBeP9i4e4H6qIl+o2JBNAwqLXKidtBpp8KK8+X4RbjJXY4H//an/wvIZfa\nYWkusw47hADXQD9C78kJli9liJjW6rxEfyTumbVkNd5PpM+53l/3qRSfJrAa\n/xhEptBrHGjLYa/YLM68ZPSYZWYcYNIu8PVM4MKmiFwr6rcZXQfDuVjmdDMQ\nDzyUsWNaIQPCpH43AWDhl1wiNPf9jM7MK6JNuBBFNlq3GRk8nZ6zpeaBPhvk\nh4se7o18m7RQ5UnIVcDPgvpPm9jHCwUSPuWCb0dMTtZR4xHTdY7YhL0dbdEf\n/3Mm\r\n=D6r4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH6axLJCrnGA2G1B8GBZJsec70kf88/+UbdFSIdjFds9AiAT/D7deqYFXMU6L8WlZIrmCuhAMH3FcKdsc4zsxBHD7A=="}]},"maintainers":[{"name":"kunkalabs","email":"info@kunkalabs.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/easydropdown_4.0.5_1538470637033_0.015463727070291089"},"_hasShrinkwrap":false},"4.1.0":{"name":"easydropdown","version":"4.1.0","description":"A lightweight library for building beautiful styleable select elements","author":{"name":"KunkaLabs Limited"},"private":false,"license":"Apache-2.0","main":"./dist/index.js","types":"./dist/index.d.ts","browser":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/patrickkunka/easydropdown.git"},"scripts":{"test":"mocha --opts ./config/mocha/mocha.opts --exit","test:watch":"npm run test -- --watch","test:cover":"nyc npm run test","test:size":"bundlesize","lint":"npm run lint:ts && npm run lint:css","lint:ts":"tslint --project tsconfig.json -c './config/tslint/tslint.json' './src/**/*.ts' './src/**/*.test.ts'","lint:css":"stylelint --config './config/stylelint/.stylelintrc.json' './demos/**/*.css'","watch":"tsc --watch","build":"tsc","bundle":"webpack --config ./config/webpack/config.ts","bundle:watch":"npm run bundle -- --watch","bundle:build":"npm run bundle -- --env=production && npm run copy:bundle","copy:bundle":"cp ./bundle/easydropdown.js ./demos/easydropdown.js && cp ./bundle/easydropdown.js.map ./demos/easydropdown.js.map","prepublishOnly":"npm run test && npm run lint && npm run bundle:build && npm run build","coveralls":"npm run test:cover -- --report lcovonly && cat ./coverage/lcov.info | coveralls"},"nyc":{"extends":"./config/nyc/.nycrc.json"},"bundlesize":[{"path":"./bundle/easydropdown.js","maxSize":"9.17 kB"}],"dependencies":{"custom-event-polyfill":"1.0.6","helpful-merge":"0.2.0"},"devDependencies":{"@types/chai":"4.1.7","@types/mocha":"5.2.5","@types/node":"10.12.12","@types/sinon":"7.0.4","bundlesize":"0.17.1","chai":"4.2.0","chai-shallow-deep-equal":"1.4.6","coveralls":"3.0.3","istanbul":"0.4.5","jsdom":"13.0.0","jsdom-global":"3.0.2","mocha":"5.2.0","nyc":"13.3.0","sinon":"7.2.3","source-map-support":"0.5.0","stylelint":"9.10.1","stylelint-config-standard":"18.2.0","ts-loader":"5.3.0","ts-node":"7.0.1","tsconfig-paths":"3.3.1","tslint":"5.14.0","tslint-eslint-rules":"5.4.0","typescript":"3.1.6","webpack":"4.29.6","webpack-cli":"3.1.0"},"gitHead":"216384cbe67b176d21aa03fedd49da1ab7de02bf","bugs":{"url":"https://github.com/patrickkunka/easydropdown/issues"},"homepage":"https://github.com/patrickkunka/easydropdown#readme","_id":"easydropdown@4.1.0","_nodeVersion":"11.12.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-J8Rp5IYm5Q2MM7wzNh8TRaKg2YfdgugA2XRoPjbIqkpriLvPrnAKyofUYJ/A3jB/IxEdhFXRicN/RG6U/wVyQQ==","shasum":"ae52869f576116103f67bb0263c6e3147c1ad136","tarball":"https://registry.npmjs.org/easydropdown/-/easydropdown-4.1.0.tgz","fileCount":260,"unpackedSize":283686,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcnAbVCRA9TVsSAnZWagAAhnAP/0AKIuLOT+8WVfKi8qJT\n6uMHXJkw6lNOkVG4I5Ao8lF+F6UwfJamNVPOJOfYtNnNS+BPgyIPB2F/+WBE\nXpPL9sgwmD9wC/fOVwpcPJqWH5898oBnXRhXcPftMTJvbphOQJ/fDZaI/DlI\nmoxx68qvh1vDRWoPDmvuBXn46lPycNwHHsnoIPm/jN6A4hp15DCj3yYC3z4w\nzFyjlJNN7xqdI+Xcn/TY+/T6eEcbjfZAkz7wA1bweuoWAIuFmWzv2iO/ecUS\nAhob3Pyqt1nbI3+KfaO0Ji5NN6f0xvESHtmC3p3HkmZeRytJJmFLH72RaVMM\nwgRx/ZQN+lLcsUvqOEUdE4e3wUgmaUT6O1E7956ozl6QAe4m4ga+MuogS2CF\n8RPhFvGxpz4YbVhm963WQvD60mGlkaycp8n3AfTqwwm2fTecd35CIjeQE4LF\nXeZ1707kMfTB2FQIBCBXG2rO6kIs5kU8zRh+UtiD/Iv/Q/NpsyiHZLAHhG8c\nZI+imlyey9Lrn5RCBNlIuP197jtPz/KoY1189sr/jh1hYYFF8P9NTGP1+Fta\nDkYdubv2GW4gqvxtHcM4+NDbzb/z08Djcs8+MJkXM5Tpc5qAqFqOrSNHFJa+\nPZ98cjiaFf191FFVXPm274wDkiHp0kSfiubo/60OlRethR7SqfFmNrT+9ZCh\nINNl\r\n=Kp/l\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIChE355QqKz2fWt/s0Fy7vE/DLIGHVyMUFKXUDfebrQVAiBJwcIhy4QvSY19q+SEh/+wFt9OJghREB54X6uu/gb3ng=="}]},"maintainers":[{"name":"kunkalabs","email":"info@kunkalabs.com"}],"_npmUser":{"name":"kunkalabs","email":"info@kunkalabs.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/easydropdown_4.1.0_1553729236228_0.8982686314276473"},"_hasShrinkwrap":false},"4.1.1":{"name":"easydropdown","version":"4.1.1","description":"A lightweight library for building beautiful styleable select elements","author":{"name":"KunkaLabs Limited"},"private":false,"license":"Apache-2.0","main":"./dist/index.js","types":"./dist/index.d.ts","browser":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/patrickkunka/easydropdown.git"},"scripts":{"test":"mocha --opts ./config/mocha/mocha.opts --exit","test:watch":"npm run test -- --watch","test:cover":"nyc npm run test","test:size":"bundlesize","lint":"npm run lint:ts && npm run lint:css","lint:ts":"tslint --project tsconfig.json -c './config/tslint/tslint.json' './src/**/*.ts' './src/**/*.test.ts'","lint:css":"stylelint --config './config/stylelint/.stylelintrc.json' './demos/**/*.css'","watch":"tsc --watch","build":"tsc","bundle":"webpack --config ./config/webpack/config.ts","bundle:watch":"npm run bundle -- --watch","bundle:build":"npm run bundle -- --env=production && npm run copy:bundle","copy:bundle":"cp ./bundle/easydropdown.js ./demos/easydropdown.js && cp ./bundle/easydropdown.js.map ./demos/easydropdown.js.map","prepublishOnly":"npm run test && npm run lint && npm run bundle:build && npm run build","coveralls":"npm run test:cover -- --report lcovonly && cat ./coverage/lcov.info | coveralls"},"nyc":{"extends":"./config/nyc/.nycrc.json"},"bundlesize":[{"path":"./bundle/easydropdown.js","maxSize":"9.17 kB"}],"dependencies":{"custom-event-polyfill":"1.0.6","helpful-merge":"0.2.0"},"devDependencies":{"@types/chai":"4.1.7","@types/mocha":"5.2.5","@types/node":"10.12.12","@types/sinon":"7.0.4","bundlesize":"0.17.1","chai":"4.2.0","chai-shallow-deep-equal":"1.4.6","coveralls":"3.0.3","istanbul":"0.4.5","jsdom":"13.0.0","jsdom-global":"3.0.2","mocha":"5.2.0","nyc":"13.3.0","sinon":"7.2.3","source-map-support":"0.5.0","stylelint":"9.10.1","stylelint-config-standard":"18.2.0","ts-loader":"5.3.0","ts-node":"7.0.1","tsconfig-paths":"3.3.1","tslint":"5.14.0","tslint-eslint-rules":"5.4.0","typescript":"3.1.6","webpack":"4.29.6","webpack-cli":"3.1.0"},"gitHead":"525f7750830f606ed6ffb897184af5048f3723ab","bugs":{"url":"https://github.com/patrickkunka/easydropdown/issues"},"homepage":"https://github.com/patrickkunka/easydropdown#readme","_id":"easydropdown@4.1.1","_nodeVersion":"11.12.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-gh3Tiv6ys2Z9dA+GKWvaG0SLWR3ltK197a+WROGJOdawcbH8+y8uc777gSil2d/OACYnLGC7A2q3D5QJPw++Bw==","shasum":"890616424a62a0dc965898604db57a255c4f8d3f","tarball":"https://registry.npmjs.org/easydropdown/-/easydropdown-4.1.1.tgz","fileCount":262,"unpackedSize":285449,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcoUAYCRA9TVsSAnZWagAAoAQQAIUhAI3I0xDwmiNfgxN2\nQ7ZHMp8Oo1kbuU0djxndVBFbf0KdLmQEM47KkeKuiXuzjR9XGo9dbwQBiz0N\n+psgs5Q2xRVNe4D2aNYFHKQCEhy+fV9HklgP6mKFYs3aHHfIomEH2a1UAYSV\n7VOJGSsx3PTk782MajrW0Runzm0L74pIQhVmJ62gtTvWIDezUI1GzaIdgOIM\nkUDcsGHSrEakhnSxkBNkwvTzdHxiuJrRbQ2kL2Eks1Iz1KujB+2v+LQXwCFt\nbns7wazbVI03xATiEFhPV7MN21A4QlYtqDfpnYZb23appSfGeO1expZJnKUH\nDM/NZyAX+n7uM8hYCII6Jx87fQL559cfzaX5aLxwidzVd7pj7mk7aFoOD/k5\ngcA42OwMxbB+0zA57iqnJF/aO2kNaezpOqnIw+Yvq3lstYNgpQjq6yCUiM3p\n9yrHC+cSE2/DE+USyb5WetgYyjlqlWWA/UfehdhBsZ1BPEQyX7/6hoSa7Cbe\nqiOprjlLb8Q4sdILPTTvawydDMB/d11ImwB+p3fuxsxN750eaAIY4IH5tLGb\nlvDw/Pz1Gg2Sd9hGlXf0jK4m0nUmKOFLHRvXTcv+cWPjHnTKJ3aKNTA7ZSp3\nDra+Igz0Ckuz4Yl5vEUjsUxnm182g9fDyw9Kefy2BaBs7pN9mXDdgS1pEYtF\n8owA\r\n=0T1K\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBVE/MNRs546tDhz+kuas4u/UfNHE7QlOZ4CLZqIz8bqAiAWGYp4uidYVH664lAdHhOStXgPy8etxk5qeOFU74hxLg=="}]},"maintainers":[{"name":"kunkalabs","email":"info@kunkalabs.com"}],"_npmUser":{"name":"kunkalabs","email":"info@kunkalabs.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/easydropdown_4.1.1_1554071576125_0.1938052552447984"},"_hasShrinkwrap":false},"4.2.0":{"name":"easydropdown","version":"4.2.0","description":"A lightweight library for building beautiful styleable select elements","author":{"name":"KunkaLabs Limited"},"private":false,"license":"Apache-2.0","main":"./dist/index.js","types":"./dist/index.d.ts","browser":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/patrickkunka/easydropdown.git"},"scripts":{"test":"mocha --opts ./config/mocha/mocha.opts --exit","test:watch":"npm run test -- --watch","test:cover":"nyc npm run test","test:size":"bundlesize","lint":"npm run lint:ts && npm run lint:css","lint:ts":"tslint --project tsconfig.json -c './config/tslint/tslint.json' './src/**/*.ts' './src/**/*.test.ts'","lint:css":"stylelint --config './config/stylelint/.stylelintrc.json' './demos/**/*.css'","watch":"tsc --watch","build":"tsc","bundle":"webpack --config ./config/webpack/config.ts","bundle:watch":"npm run bundle -- --watch","bundle:build":"npm run bundle -- --env=production && npm run copy:bundle","copy:bundle":"cp ./bundle/easydropdown.js ./demos/easydropdown.js && cp ./bundle/easydropdown.js.map ./demos/easydropdown.js.map","prepublishOnly":"npm run test && npm run lint && npm run bundle:build && npm run build","coveralls":"npm run test:cover -- --report lcovonly && cat ./coverage/lcov.info | coveralls"},"nyc":{"extends":"./config/nyc/.nycrc.json"},"bundlesize":[{"path":"./bundle/easydropdown.js","maxSize":"9.17 kB"}],"dependencies":{"custom-event-polyfill":"1.0.6","helpful-merge":"0.2.0"},"devDependencies":{"@types/chai":"4.1.7","@types/mocha":"5.2.5","@types/node":"10.12.12","@types/sinon":"7.0.4","bundlesize":"0.17.1","chai":"4.2.0","chai-shallow-deep-equal":"1.4.6","coveralls":"3.0.3","istanbul":"0.4.5","jsdom":"13.0.0","jsdom-global":"3.0.2","mocha":"5.2.0","nyc":"13.3.0","sinon":"7.2.3","source-map-support":"0.5.0","stylelint":"9.10.1","stylelint-config-standard":"18.2.0","ts-loader":"5.3.0","ts-node":"7.0.1","tsconfig-paths":"3.3.1","tslint":"5.14.0","tslint-eslint-rules":"5.4.0","typescript":"3.1.6","webpack":"4.29.6","webpack-cli":"3.1.0"},"gitHead":"96c373038f4a7fcb17b715ef307441e679aca1a2","bugs":{"url":"https://github.com/patrickkunka/easydropdown/issues"},"homepage":"https://github.com/patrickkunka/easydropdown#readme","_id":"easydropdown@4.2.0","_nodeVersion":"7.2.0","_npmVersion":"6.13.6","dist":{"integrity":"sha512-oicfb/8VT2e9s1nCqzBEB2qCXvuJl4nQnHT6ej+HG8Ot6vNkymxKOL9qE1G4h2uMe16xFW9NF1/WiOIF6yX00g==","shasum":"9d4b9ac5c24cf0aa9b364e7d25c94cd5492f55ea","tarball":"https://registry.npmjs.org/easydropdown/-/easydropdown-4.2.0.tgz","fileCount":263,"unpackedSize":283584,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeN1RbCRA9TVsSAnZWagAAUWYQAJhpG/E3eyxWHvo+H8oa\nRNmfG9qyFZGAsGfmMqlakmXSeAXXZja1OE0IdjdJgwFb4yE0wGWDXDb43CC5\n/HKmL7U5ps52XC4XBVdj+99c5eIiTo4lGcFC+x4r1lhAWyFXpj31ZL17ekGz\nw0sazYq2hEi1c7JTYx8CFC0jyxJj0mOY/sfqFCebYE+t+m1ji0RBwloYKIJN\nzpOnjlrIDBwHMVUwMFQNp85zbw6zFutX9henGov/W6MAcig7u8s5m/lXkk9d\nfUGMoD4gKB/NehegZyLS3TzMzBBZrvjH0hPmu0GIQRbVqHJ+pZpP2v7oOT3B\nCixBylat5JHV9sSqd0GU+n2DryIWffgFRtZtPnd87eVKJ4rtDwuBRqpl8gi1\nNYlb1jY8nvFqeFpE6sBbURM0gVnir7ZgtLy4cF6U+3t+asGbSkbdyiev8oKe\nKngkhv8EwCWxNYM4EKoiEP+5ZoJvhcoQCDvMzwE0pQYEBBen9dFm6yhpWjkV\nNkaT2zrhT4mO46aPjxEx1zIA6z4IA4PtPA7ICnW9ZgO7o13pNtpNIIKRb62r\nYAg65JOugP5qeE9Ky0ymR7rqZAoYsJpCE/Mblj73RNi9VXsUHkvku6GbNtR7\nl3qdmod+sd/wI3xULp89J/6Rdnh8/RtpK+8MwwmDyi3ARDzMnGn0k+rJwvt2\njesv\r\n=Nvoe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCLrZR2zqAYfFzg5YRhGPpsFp5bR4nj1jMb4aQQA0kKdwIhAKUiL0Kr296b77uNqI+wDMdLcpY/AuNIh+JNgCfOH1u1"}]},"maintainers":[{"name":"kunkalabs","email":"info@kunkalabs.com"}],"_npmUser":{"name":"kunkalabs","email":"info@kunkalabs.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/easydropdown_4.2.0_1580684377809_0.0386402524390832"},"_hasShrinkwrap":false}},"maintainers":[{"name":"kunkalabs","email":"info@kunkalabs.com"}],"description":"A lightweight library for building beautiful styleable select elements","homepage":"https://github.com/patrickkunka/easydropdown#readme","repository":{"type":"git","url":"git+https://github.com/patrickkunka/easydropdown.git"},"author":{"name":"KunkaLabs Limited"},"bugs":{"url":"https://github.com/patrickkunka/easydropdown/issues"},"license":"Apache-2.0","readme":"# EasyDropDown 4\n\n[![Build Status](https://img.shields.io/travis/patrickkunka/easydropdown.svg?style=flat-square)](https://travis-ci.org/patrickkunka/easydropdown)\n[![Coverage Status](https://img.shields.io/coveralls/patrickkunka/easydropdown.svg?style=flat-square)](https://coveralls.io/github/patrickkunka/easydropdown)\n[![Latest Release](https://img.shields.io/npm/v/easydropdown.svg?style=flat-square)](https://www.npmjs.com/package/easydropdown)\n[![Apache License](https://img.shields.io/npm/l/easydropdown.svg?style=flat-square)](https://www.apache.org/licenses/)\n\nEasyDropDown transforms the humble `<select>` element into a blank canvas for your design and brand. As a drop-in enhancement, EasyDropDown maintains all the functionality and accessibility of a standard single-option select menu, while exposing a semantic DOM-structure that's easy to style and customize to the needs of your design.\n\nEasyDropDown comes bundled with three [ready-made themes](./demos/themes) which can be used as a starting point for custom styling.\n\nCheck out the **[demos](https://demos.kunkalabs.com/easydropdown/)** to see what's possible. The source code for the demos can be found in the [./demos/](./demos/) directory.\n\n*NB: If you are viewing the demos on a mobile device, you will see the device's native select UI as per the [default configuration](#usenativeuionmobile).*\n\n### Features\n- Respects the native `<select>` element API*\n- Full keyboard support (navigation, search and select)\n- Emits native `change` events\n- Enhanced placeholder support\n- Form reset and validation support\n- Collision detection\n- Live updates\n- Falls back to native UI on mobile devices\n- CSS Modules support\n- TypeScript/intellisense support\n- ARIA-compliant-markup\n- Support for IE9+, and all modern browsers.\n- 9kb gzipped\n- No third-party dependencies\n\n**EasyDropDown [does not support](#multiple-attribute-support) the `multiple` attribute.*\n\n#### Contents\n\n- [Installation](#installation)\n- [Usage](#usage)\n    - [Single-instance instantiation](#single-instance-instantiation)\n    - [Batch instantiation](#batch-instantiation)\n    - [Placeholder Functionality](#placeholder-functionality)\n    - [Reading and Writing Values](#reading-and-writing-values)\n- [Anatomy of EasyDropDown](#anatomy-of-easydropdown)\n- [Configuration Options](#configuration-options)\n    - [Available Options](#available-options)\n- [API Methods](#api-methods)\n- [React Example](#react-example)\n- [CSS Modules Example](#css-modules-example)\n- [TypeScript Support](#typescript-support)\n- [Multiple Attribute Support](#multiple-attribute-support)\n\n## Installation\n\nFirstly, install the package using your package manager of choice.\n\n```\nnpm install easydropdown --save\n```\n\n#### Module Import\n\nYou may then import the `easydropdown()` factory function into your project's modules.\n\n```js\n// ES Modules\nimport easydropdown from 'easydropdown';\n\n// CommonJS\nconst easydropdown = require('easydropdown');\n\n// AMD/RequireJS\ndefine(['easydropdown/bundles/easydropdown.js'] , easydropdown => {\n    ...\n});\n```\n\n#### Script Tag\n\nAlternatively, for basic projects without modular scoping or a build process, the most simple way to use EasyDropDown is via a `<script>` tag before your closing body tag. A pre-built \"UMD\" bundle is provided for this purpose which can be found at `./bundle/easydropdown.js`.\n\n```html\n    ...\n    <script src=\"./path/to/easydropdown.min.js\"/>\n</body>\n```\n\nThis will attach the `easydropdown` factory function to the `window` as a global.\n\n## Usage\n\nBecause EasyDropDown is an enhancement on top of native the `<select>` element, we must firstly create an underlying select element in our project's HTML, just as we normally would:\n\n```html\n<select name=\"foo\" id=\"my-select\">\n    <option value=\"\">Select</option>\n    <option value=\"1\">Option 1</option>\n    <option value=\"2\">Option 2</option>\n    <option value=\"3\">Option 3</option>\n    ...\n</select>\n```\n\nNext, we instantiate EasyDropDown by passing a reference to the select element(s), or a selector string. We can either instantiate a single instance at a time, or a batch of instances.\n\n#### Single-instance Instantiation\n\nWe can create an instance of EasyDropDown by passing a reference to a `<select>` element to the `easydropdown()` factory function:\n\n```js\nconst selectElement = document.querySelector('#my-select');\n\nconst edd = easydropdown(selectElement);\n```\n\nOr, by passing a selector string directly:\n\n```js\nconst edd = easydropdown('#my-select');\n```\n\nAs shown above, a reference to the dropdown instance  (`edd`) can be held onto in order to destroy it later, or interact with the dropdown programmatically. See [API Methods](#api-methods) for more information.\n\nThis approach is recommended for any component-based architecture where only the component is concerned with the dropdown instance.\n\nThe factory function also accepts an optional second parameter of configuration options. See [Configuration Options](#configuration-options) for more information.\n\n#### Batch Instantiation\n\nFor simple static pages/applications, we can use the `.all()` static method of the factory function to crawl the DOM for *all* `<select>` elements found in the document, and then batch instantiate EasyDropDown on each one.\n\n```js\neasydropdown.all();\n```\n\nThe `all()` method also accepts an optional parameter of configuration options to be passed to each instance. See [Configuration Options](#configuration-options) for more information.\n\n### Placeholder Functionality\n\nWith the exception of the [multiple attribute](#multiple-attribute), EasyDropDown supports all the available attributes of the native `<select>` element, such as `disabled`, `required` and `selected`. In addition to these, EasyDropDown adds a new \"placeholder\" attribute.\n\nA common pattern when working with `<select>` elements, is to use the first `<option>` element as a placeholder value by giving it an empty `\"\"` value, as the first option will always be selected by default. For example:\n\n```html\n<select>\n    <option value=\"\">Select an option</option>\n    <option value=\"1\">Option 1</option>\n    <option value=\"2\">Option 2</option>\n    <option value=\"3\">Option 3</option>\n    ...\n</select>\n```\n\nEasyDropDown enhances this pattern with the ability to add a `data-placeholder` attribute to this element to inform EasyDropDown that the option is a placeholder only and should *not* be an available selection once the user has selected a value.\n\n```html\n<select>\n    <option value=\"\" data-placeholder>Select an option</option>\n    <option value=\"1\">Option 1</option>\n    <option value=\"2\">Option 2</option>\n    <option value=\"3\">Option 3</option>\n    ...\n</select>\n```\n\nCheck out the [Basic List with Placeholder](https://demos.kunkalabs.com/easydropdown/02-basic-list-with-placeholder.html) demo to see an example of this feature.\n\n*NB: This feature should not be used if you want the user to be able to leave the field blank.*\n\nAdditionally, EasyDropDown can be configured to reshow the placeholder value after a value has been selected as a hint to the user whenever the dropdown is open. This is available via the `behavior.showPlaceholderWhenOpen` configuration option, and can be seen in the [Show Placeholder When Open](https://demos.kunkalabs.com/easydropdown/11-show-placeholder-when-open.html) demo.\n\n### Reading and Writing Values\n\nAs en enhancement on top of native `<select>` elements, EasyDropDown always keeps the underyling `<select>` element in sync with the current selection (emitting a `change` event on value change), and conversely, always updates itself in response to a programmatic change in value to the underlying select.\n\nAs such, you can read and write the `value` of the underlying select, just as you normally would.\n\n```js\nconst selectElement = document.querySelector('#my-select');\n\nconst edd = easydropdown(selectElement);\n\nselectElement.value = 'foo';\n\nconsole.log(edd.value); // foo\n```\n> Writing a value to the select element\n\n```js\nconst selectElement = document.querySelector('#my-select');\n\nconst edd = easydropdown(selectElement);\n\nedd.value = 'foo';\n\nconsole.log(selectElement.value); // foo\n```\n> Reading a value from the select element\n\nAs seen in the above examples, the `EasydropdownFacade` instance returned from the factory function does expose a `.value` getter/setter property for convenience, but there should never be any reason to use this over the native interface.\n\nLikewise, if we need to listen for a change in value to the underyling select, we can attach a `change` event handler to it just as we normally would. EasyDropDown also provides the ability to provide an optional `callbacks.onSelect` callback via the configuration object as an alternative to manually attaching a change handler.\n\nSee the `onSelect` [configuration option](#onselect) documentation for more information.\n\n## Anatomy of EasyDropDown\n\nThe DOM structure created by EasyDropDown is broken into 12 semantic components each with a unique class name which can be targeted for styling. Each component may also have one or more states which can again be used for styling via class names which are added and removed in response to interactions.\n\nEach of the 12 components are shown on the following diagram, and described in detail below along with their respective states.\n\n![](./docs/easydropdown-anatomy.png)\n\n### Root\n\nThe \"root\" component forms the top level container of the dropdown, and supports several states which can be used to target the styling of child components.\n\n| State       | Default Class         | Configuration Option       |\n| ----------- | --------------------  | -------------------------- |\n| Base        | `edd-root`            | `classNames.root`          |\n| Open        | `edd-root-open`       | `classNames.rootOpen`      |\n| Open above  | `edd-root-open-above` | `classNames.rootOpenAbove` |\n| Open below  | `edd-root-open-below` | `classNames.rootOpenBelow` |\n| Disabled    | `edd-root-disabled`   | `classNames.rootDisabled`  |\n| Invalid     | `edd-root-invalid`    | `classNames.rootInvalid`   |\n| Focused     | `edd-root-focused`    | `classNames.rootFocused`   |\n| Has value   | `edd-root-has-value`  | `classNames.rootHasValue`  |\n| Native      | `edd-root-native`     | `classNames.rootNative`    |\n\n### Head\n\nThe \"head\" component forms the top portion of the dropdown, and contains the current \"value\" and a presentational \"arrow\". When the head is clicked the \"body\" opens. When the dropdown is closed, only the head is visible.\n\n| State       | Default Class         | Configuration Option       |\n| ----------- | --------------------- | -------------------------- |\n| Base        | `edd-head`            | `classNames.head`          |\n\n### Value\n\nThe \"value\" component contains the current (human-readable) value of the the dropdown. This may be a placeholder value, or the text content of the currently selected option.\n\n| State       | Default Class         | Configuration Option       |\n| ----------- | --------------------- | -------------------------- |\n| Base        | `edd-value`           | `classNames.value`         |\n\n### Arrow\n\nThe \"arrow\" component can be used to communicate the open/closed state of the dropdown and also to provide an additional affordance for opening the dropdown. By using the \"open\" state on the \"root\" parent above, we can adjust the styling of the arrow based on whether or not the dropdown is open or closed.\n\n| State       | Default Class         | Configuration Option       |\n| ----------- | --------------------- | -------------------------- |\n| Base        | `edd-arrow`           | `classNames.arrow`         |\n\n### Select\n\nThis is the actual select element passed to the `easydropdown()` factory function on instantiation. Once the dropdown markup has been generated, the original `select` element is appended to the head, and given the class name shown below (`'edd-select'` by default).\n\nIt is held inside the head in order to maintain tab-to-focus and various other keyboard-related functionality. For this reason, the `<select>` element must be invisible (e.g `opacity: 0`) but not hidden (e.g. `display: none`).\n\nWhen in native mode, we can target the select element using the \"native\" state on the \"root\" parent above in order to ensure that the select element is clickable, and visible when open.\n\n| State       | Default Class         | Configuration Option       |\n| ----------- | --------------------- | -------------------------- |\n| Base        | `edd-select`          | `classNames.select`        |\n\n### Body\n\nThe \"body\" forms the lower menu portion of the dropdown, and is shown and hidden based on whether the dropdown is open or closed.\n\nThe body should be hidden by default, and shown using a combination of the `open`, `openBelow` or `openAbove` class names added to the \"root\" component above. EasyDropDown will determine whether to apply the `openBelow` or `openAbove` class names based on collision detection using the height of the body.\n\n| State       | Default Class         | Configuration Option        |\n| ----------- | --------------------- | --------------------------- |\n| Base        | `edd-body`            | `classNames.body`           |\n| Scrollable  | `edd-body-scrollable` | `classNames.bodyScrollable` |\n| At top      | `edd-body-at-top`     | `classNames.bodyAtTop`      |\n| At bottom   | `edd-body-at-bottom`  | `classNames.bodyAtBotom`    |\n\n### Gradient Top\n\nThe \"gradient top\" component can be used to apply a gradation to the top of the body to indicate that there are additional items above the visible area and create a scroll affordance. This can be shown or hidden based on the `bodyAtTop` class name applied to the \"body\" component above.\n\n| State       | Default Class         | Configuration Option       |\n| ----------- | --------------------- | -------------------------- |\n| Base        | `edd-gradient-top`    | `classNames.gradientTop`   |\n\n### Gradient Bottom\n\nThe \"gradient bottom\" component can be used to apply a gradation to the bottom of the body to indicate that there are additional items below the visible area and create a scroll affordance. This can be shown or hidden based on the `bodyAtBottom` class name applied to the \"body\" component above.\n\n| State       | Default Class         | Configuration Option        |\n| ----------- | --------------------- | --------------------------- |\n| Base        | `edd-gradient-bottom` | `classNames.gradientBottom` |\n\n### Items List\n\nThe \"items list\" component holds all items in the dropdown, and is used to restrict the scrollable height of the body by applying `max-height` and `overflow: auto` styles.\n\nWhen open, EasyDropDown will apply an inline `max-height` style to the items list component which is calculated based on the desired maximum visible items defined via the `behavior.maxVisibleItems` configuration option. This value may be further reduced to avoid collisions between the body and the viewport edge when the `behavior.clampMaxVisibleItems` configuration option is set.\n\n| State       | Default Class         | Configuration Option       |\n| ----------- | --------------------- | -------------------------- |\n| Base        | `edd-items-list`      | `classNames.itemsList`     |\n\n### Group\n\n\"Group\" components are used to wrap arbitrary groups of options, equivalent to the `<optgroup>` elements in the underyling `<select>` element.\n\nEven when there are no `<optgroup>` elements present in the provided select, a single wrapping `group` component will still be present. Internally, this simplifies component logic by providing a consistent component hierarchy.\n\nWhen a group is present intentionally, it will typically include a \"group label\" element describing the purpose of the group. Groups that contain a label have a `groupHasLabel` class which can be used to target the styling of their child options (adding indentation, for example).\n\n| State       | Default Class         | Configuration Option       |\n| ----------- | --------------------- | -------------------------- |\n| Base        | `edd-group`           | `classNames.group`         |\n| Disabled    | `edd-group-disabled`  | `classNames.groupDisabled` |\n| Has label   | `edd-group-has-label` | `classNames.groupHasLabel` |\n\n### Group Label\n\n\"Group label\" components are added to groups derived from `<optgroup>` elements in the provided `<select>` element, and contain the value of the `label` attribute of the `<optgroup>`.\n\n| State       | Default Class         | Configuration Option       |\n| ----------- | --------------------- | -------------------------- |\n| Base        | `edd-group-label`     | `classNames.groupLabel`    |\n\n### Option\n\n\"Option\" components make up the individual options of the dropdown menu. Additional classes are added when the option is in a \"disabled\", \"focused\", or \"selected\" state.\n\nThe focused state is added on mouseover, or on keyboard focus (via the up/down arrow keys). If an option is disabled, it is no longer focusable or selectable.\n\n| State       | Default Class         | Configuration Option        |\n| ----------- | --------------------- | --------------------------- |\n| Base        | `edd-option`          | `classNames.option`         |\n| Disabled    | `edd-option-disabled` | `classNames.optionDisabled` |\n| Focused     | `edd-option-focused`  | `classNames.optionFocused`  |\n| Selected    | `edd-option-selected` | `classNames.optionSelected` |\n\n## Configuration Options\n\nWhen using either the `easydropdown()` factory function, or the `.all()` static method, an optional configuration object may be passed containing zero or more configuration options with the following defaults.\n\n```js\n{\n    behavior: {\n        clampMaxVisibleItems:    true;\n        closeOnSelect:           false;\n        openOnFocus:             false;\n        showPlaceholderWhenOpen: false;\n        liveUpdates:             false;\n        loop:                    false;\n        maxVisibleItems:         15;\n        useNativeUiOnMobile:     true;\n    },\n    callbacks: {\n        onClose:  null,\n        onOpen:   null,\n        onSelect: null\n    },\n    classNames: {\n        root:           'edd-root';\n        rootOpen:       'edd-root-open';\n        rootOpenAbove:  'edd-root-open-above';\n        rootOpenBelow:  'edd-root-open-below';\n        rootDisabled:   'edd-root-disabled';\n        rootInvalid:    'edd-root-invalid';\n        rootFocused:    'edd-root-focused';\n        rootHasValue:   'edd-root-has-value';\n        rootNative:     'edd-root-native';\n        gradientTop:    'edd-gradient-top';\n        gradientBottom: 'edd-gradient-bottom';\n        head:           'edd-head';\n        value:          'edd-value';\n        arrow:          'edd-arrow';\n        select:         'edd-select';\n        body:           'edd-body';\n        bodyScrollable: 'edd-body-scrollable';\n        bodyAtTop:      'edd-body-at-top';\n        bodyAtBottom:   'edd-body-at-bottom';\n        itemsList:      'edd-items-list';\n        group:          'edd-group';\n        groupDisabled:  'edd-group-disabled';\n        groupHasLabel:  'edd-group-has-label';\n        groupLabel:     'edd-group-label';\n        option:         'edd-option';\n        optionDisabled: 'edd-option-disabled';\n        optionFocused:  'edd-option-focused';\n        optionSelected: 'edd-option-selected';\n    }\n}\n```\n\nDepending on the entry point, the configuration object is passed as either the second or first parameter.\n\n```js\nconst edd = easydropdown('.my-select', {\n    behavior: {\n        openOnFocus: true\n    }\n});\n```\n> Factory function with configuration object\n\n```js\nconst edd = easydropdown.all({\n    behavior: {\n        openOnFocus: true\n    }\n});\n```\n> Batch instantiation with configuration object\n\n### Available Options\n\n#### `behavior`\n\n- [clampMaxVisibleItems](#clampmaxvisibleitems)\n- [closeOnSelect](#closeonselect)\n- [openOnFocus](#openonfocus)\n- [showPlaceholderWhenOpen](#showplaceholderwhenopen)\n- [liveUpdates](#liveupdates)\n- [loop](#loop)\n- [maxVisibleItems](#maxvisibleitems)\n- [useNativeUiOnMobile](#usenativeuionmobile)\n\n#### `callbacks`\n\n- [onClose](#onclose)\n- [onOpen](#onopen)\n- [onSelect](#onselect)\n- [onOptionClick](#onoptionclick)\n\n#### `classNames`\n\nPlease see the [Anatomy of EasyDropDown](#anatomy-of-easydropdown) section for information on each configurable class name.\n\nIf you do not wish to use the default class names, or wish to use locally-scoped class names (e.g, via CSS-modules), you may use the `classNames` configuration object to override the classNames in the generated markup with your own.\n\n## Behavior\n\n### `clampMaxVisibleItems`\n\n| Type      | Default |\n|-----------|---------|\n| `boolean` | `true`  |\n\nA boolean dictating whether or not to further reduce the `maxVisibleItems` value of the dropdown menu when a collision occurs.\n\nBy default, EasyDropDown will reduce the number of visible items until at least 10px of clearspace is created between the nearest viewport edge and the bottom or top of the dropdown body. This prevents the need to scroll the window to view the dropdown body when a collision occurs.\n\nYou may wish to disable this option if your select UI will always appear within a collision zone, and you do not wish to reduce the number of visible options beyond the defined `maxVisibleOptions` value.\n\n##### Example: Disabling `clampMaxVisibleItems`\n\n```js\nconst edd = easydropdown(selectElement, {\n    behavior: {\n        clampMaxVisibleItems: false\n    }\n});\n```\n\n### `closeOnSelect`\n\n| Type      | Default |\n|-----------|---------|\n| `boolean` | `true`  |\n\nA boolean dictating whether or not the dropdown should close when a value is selected.\n\nThis is default behavior, but may be disabled if you wish the dropdown to stay open until the dropdown is explicitally closed by the user (by clicking the head, pressing \"esc\", or clicking outside of the dropdown).\n\n##### Example: Disabling `closeOnSelect`\n\n```js\nconst edd = easydropdown(selectElement, {\n    behavior: {\n        closeOnSelect: false\n    }\n});\n```\n\n### `openOnFocus`\n\n| Type      | Default |\n|-----------|---------|\n| `boolean` | `false` |\n\nA boolean dictating whether or not the dropdown should open automatically whenever it gains focus.\n\nBy default, the dropdown will only open when the head is clicked, or the user presses the up or down arrow key.\n\n##### Example: Enabling `openOnFocus`\n\n```js\nconst edd = easydropdown(selectElement, {\n    behavior: {\n        openOnFocus: true\n    }\n});\n```\n\n### `showPlaceholderWhenOpen`\n\n| Type      | Default |\n|-----------|---------|\n| `boolean` | `false` |\n\nA boolean dictating whether or not the [placeholder](#placeholder-functionality) text (if provided) should be shown whenever the dropdown is open (even once a value has been selected).\n\nThis can provide an additional hint to the user during the process of selection, once the placeholder has already been lost due to an initial selection taking place.\n\n##### Example: Enabling `showPlaceholderWhenOpen`\n\n```js\nconst edd = easydropdown(selectElement, {\n    behavior: {\n        showPlaceholderWhenOpen: true\n    }\n});\n```\n\n### `liveUpdates`\n\n| Type      | Default |\n|-----------|---------|\n| `boolean` | `false` |\n\nA boolean dictating whether or not the dropdown should watch for updates to the underyling `<select>` element and reactively update itself. For example, when an `<option>` is added or removed, or the `disabled` attribute is toggled on.\n\nThis should be enabled in dynamic applications where we expect changes to the dropdown to occur during the course of a session. This does however incur the small overhead of periodically polling the provided `<select>` element for updates, and as such is disabled by default.\n\nIf you know exactly when the `<select>` element has been updated, you may wish to use the `.refresh()` API method as an imperative alternative.\n\nSee the [Live Updates](https://demos.kunkalabs.com/easydropdown/13-live-updates.html) demo for a working example.\n\n##### Example: Enabling `liveUpdates`\n\n```js\nconst edd = easydropdown(selectElement, {\n    behavior: {\n        liveUpdates: true\n    }\n});\n```\n\n### `loop`\n\n| Type      | Default |\n|-----------|---------|\n| `boolean` | `false` |\n\nA boolean dictating whether or not the user should be able to loop from the top of the menu to the bottom (and vice-versa) when changing the focused option by pressing the up/down arrow keys.\n\nThis may be desirable in longer lists as a quick way of returning the user to the start of the list without the need for excessive scrolling.\n\nSee the [Loop](https://demos.kunkalabs.com/easydropdown/14-loop.html) demo for a working example.\n\n##### Example: Enabling `loop`\n\n```js\nconst edd = easydropdown(selectElement, {\n    behavior: {\n        loop: true\n    }\n});\n```\n\n### `maxVisibleItems`\n\n| Type      | Default |\n|-----------|---------|\n| `number`  | `15`    |\n\nAn integer dictating the maximum visible options that should be visible in the dropdown body before limiting its height and forcing the user to scroll.\n\nIt may be desirable to increase this value when dealing with long lists and when we can be sure that collision with the viewport edge will not occur (if collision does occur the value will be clamped anyway, providing `clampMaxVisibleItems` is set).\n\n##### Example: Changing `maxVisibleOptions`\n\n```js\nconst edd = easydropdown(selectElement, {\n    behavior: {\n        maxVisibleOptions: 25\n    }\n});\n```\n\n### `useNativeUiOnMobile`\n\n| Type      | Default |\n|-----------|---------|\n| `boolean` | `true`  |\n\nA boolean dictating whether or not to fall back to the native `<select>` UI on mobile devices (while maintaing a styled \"head\").\n\nAll mobile browsers implement an optimized OS-level interface for open `<select>` elements, which is generally deemed to provide a superior user experience to anything that can be created with CSS and JavaScript. For this reason, this setting is enabled by default and activated based on user-agent sniffing.\n\nYou may however decide that you want to create a completely consistent user experience across all platforms, in which case this setting can be disabled and EasyDropDown will render the \"body\" when open, just as on desktop.\n\n##### Example: Disabling `useNativeUiOnMobile`\n\n```js\nconst edd = easydropdown(selectElement, {\n    behavior: {\n        useNativeUiOnMobile: false\n    }\n});\n```\n\n## Callbacks\n\n### `onClose`\n\n| Type       | Default |\n|------------|---------|\n| `function` | `null`  |\n\nAn optional callback function to be invoked whenever the dropdown is closed.\n\nSee the [Callbacks](https://demos.kunkalabs.com/easydropdown/15-callbacks.html) demo for a working example.\n\n##### Example: Adding an `onClose` callback\n\n```js\nconst edd = easydropdown(selectElement, {\n    callbacks: {\n        onClose: () => console.log('closed!')\n    }\n});\n```\n\n### `onOpen`\n\n| Type       | Default |\n|------------|---------|\n| `function` | `null`  |\n\nAn optional callback function to be invoked whenever the dropdown is opened.\n\nSee the [Callbacks](https://demos.kunkalabs.com/easydropdown/15-callbacks.html) demo for a working example.\n\n##### Example: Adding an `onOpen` callback\n\n```js\nconst edd = easydropdown(selectElement, {\n    callbacks: {\n        onOpen: () => console.log('opened!')\n    }\n});\n```\n\n### `onSelect`\n\n| Type       | Default |\n|------------|---------|\n| `function` | `null`  |\n\nAn optional callback function to be invoked whenever an option is selected. The selected option's value is passed as the first argument to the callback.\n\nYou may wish to use this callback as a more concise alternative to attaching a `change` event handler to the underlying select element in order to read the select value and update your application state.\n\nSee the [Callbacks](https://demos.kunkalabs.com/easydropdown/15-callbacks.html) demo for a working example.\n\n##### Example: Adding an `onSelect` callback\n\n```js\nconst edd = easydropdown(selectElement, {\n    callbacks: {\n        onSelect: value => console.log(`selected ${value}`)\n    }\n});\n```\n\n### `onClickOption`\n\n| Type       | Default |\n|------------|---------|\n| `function` | `null`  |\n\nAn optional callback function to be invoked whenever an option is clicked, regardless of whether that option is already selected, selectable or disabled. The clicked option's value is passed as the first argument to the callback.\n\nSee the [Callbacks](https://demos.kunkalabs.com/easydropdown/15-callbacks.html) demo for a working example.\n\n##### Example: Adding an `onClickOption` callback\n\n```js\nconst edd = easydropdown(selectElement, {\n    callbacks: {\n        onClickOption: value => console.log(`clicked option ${value}`)\n    }\n});\n```\n\n## API Methods\n\nThe `EasydropdownFacade` instance returned from the factory function exposes several API methods for programmatic control of the dropdown, and instance destruction.\n\n### open()\n\n`.open()`\n\nProgrammatically opens the dropdown, closing any other open instances.\n\n```js\n\nconst edd = easydropdown(selectElement);\n\nedd.open();\n```\n\n### close()\n\n`.close()`\n\nProgrammatically closes the dropdown.\n\n\n```js\n\nconst edd = easydropdown(selectElement);\n\nedd.close();\n```\n\n### refresh()\n\n`.refresh()`\n\nRefreshes the instance and updates the DOM in response to a change in the underlying `<select>` element (for example, adding or removing an option).\n\nWhen `behavior.liveUpdates` configuration option is set, this method is not neccessary, as EasyDropDown will react automatically. However, when we know exactly when the select element has been updated, we may want to use the `.refresh()` method as a less-expensive (albeit more imperative) alternative.\n\n```js\n\nconst edd = easydropdown(selectElement);\n\nedd.refresh();\n```\n\n### validate()\n\n`.validate()`\n\nValidates the instance and returns a boolean whether validation succeeded. Helpful if you need to validate without hitting the form submit button.\n\n```js\n\nconst edd = easydropdown(selectElement);\n\nconst isValid = edd.validate();\n\nconsole.log(isValid); // false\n```\n\n### destroy()\n\n`.destroy()`\n\nDestroys the instance by removing all EasyDropDown-generated elements from the DOM, and unbinding all event handlers. The underlying select is returned to the root position.\n\nWhen using any kind of component-based framework (e.g. React), this method should always be called at the end of the lifecycle of your component in order to clean up (e.g, `componentWillUnmount()`).\n\n```js\n\nconst edd = easydropdown(selectElement);\n\nedd.destroy();\n```\n\n## React Example\n\nEasyDropDown is fully compatible with React and can be integrated into any component where you would normally use a `<select>` element.\n\nThe following example shows a basic `Select` component with EasyDropDown integrated, and assumes that a `name`, a `value`, an array of `options`, and a `handleChange` function are passed in as \"props\" from a parent compoment.\n\nAdditional features such as `disabled` attributes and validation could be added as required.\n\n```jsx\nimport easydropdown from 'easydropdown';\nimport React from 'react';\n\nclass Select extends React.Component {\n    setSelectElementRef(selectElement) {\n        this.selectElement = selectElement;\n    }\n\n    componentDidMount() {\n        this.edd = easydropdown(this.selectElement, {\n            callbacks: {\n                onSelect: nextValue => this.props.handleChange(this.props.name, nextValue)\n            }\n        });\n    }\n\n    renderOption(option) {\n        const isSelected = option.value === this.props.value;\n\n        return (\n            <option value={option.value} selected={isSelected}>\n                {option.label}\n            </option>\n        );\n    }\n\n    render() {\n        return (\n            <select\n                name={this.props.name}\n                ref={this.setSelectElementRef}\n            >\n                <option value=\"\" data-placeholder>Select an option</option>\n                {this.props.options.map(option => this.renderOption(option))}\n            </select>\n        )\n    }\n\n    componentWillUnmount() {\n        this.edd.destroy();\n    }\n}\n```\n\n## CSS Modules Example\n\nIf you are using [CSS Modules](https://github.com/css-modules/css-modules) in your project, you may wish to take advantage of the locally scoped safety provided by CSS Modules when styling your EasyDropDown-enabled components.\n\nBecause all EasyDropDown class names are configurable via the `classNames` configuration object, we can easily overwrite the default class names with those generated by CSS modules.\n\nThe following example shows part of a React component using CSS Modules (see above for the full [React Example](#react-example)), and demonstrates how we can provide imported styles to the EasyDropDown factory function.\n\n```jsx\nimport easydropdown from 'easydropdown';\nimport React from 'react';\n\nimport styles from './styles.css';\n\nclass Select extends React.Component {\n    ...\n\n    componentDidMount() {\n        this.edd = easydropdown(this.selectElement, {\n            callbacks: {\n                onSelect: nextValue => this.props.handleChange(this.props.name, nextValue)\n            },\n            classNames: styles\n        });\n    }\n}\n```\n\nProvided your styles respect the interface defined in [IClassNames](./src/Config/Interfaces/IClassNames.ts), you should be able to pass a reference to the imported `styles` object directly into the EasyDropDown configuration. The `IClassNames` interface is equivalent to the default class names with the `edd-` namespace prefix removed (and automatically converted to camel case on import).\n\nIf you are using TypeScript and CSS Modules, an EasyDropDown [CSS type definition](./demos/themes/theme.css.d.ts) is provided to assist you in authoring custom styles, in which case you would import your styles using `import * as styles from './styles.css'`.\n\n## TypeScript Support\n\nEasyDropDown is written in [TypeScript](https://www.typescriptlang.org), and as such exports types for all API entry points and configuration interfaces, providing full intellisense in compatible editors for a great developer experience.\n\nAdditionally, if you are using CSS modules with TypeScript, a `theme.css.d.ts` type definition is provided in the [./themes/](./themes/) directory enumerating the entire `classNames` configuration object interface assist you in authoring custom styles.\n\n## Multiple Attribute Support\n\nEasyDropDown **does not support** the `<select multiple>` attribute by design. A single vertical list is a very poor user interface for a selecting multiple options from a menu as it lacks any concept of ordering, and requires non-intuitive keyboard interaction.\n\nThere are many UI libraries aimed at solving this problem specifically, which typically involve two parallel lists, with drag-to-select and drag-to-reorder functionality. EasyDropDown is not intended to solve this problem and was created to function as a simple **lightweight** solution for styling single-option select menus only. The added functionality required for the above would far beyond the scope of this library, and as such you should look elsewhere if you require multi-select UI.\n\n---\n\n© 2018 Patrick Kunka / KunkaLabs Ltd","readmeFilename":"README.md"}