fomantic-ui 2.9.0-beta.99 → 2.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (442) hide show
  1. package/.all-contributorsrc +86 -1
  2. package/.github/codeql/codeql-config.yml +4 -0
  3. package/.github/dependabot.yml +10 -0
  4. package/.github/workflows/ci.yml +10 -6
  5. package/.github/workflows/codeql.yml +68 -0
  6. package/.github/workflows/nightly.yml +16 -8
  7. package/.github/workflows/release.yml +34 -0
  8. package/CHANGELOG.md +925 -650
  9. package/CONTRIBUTORS.md +16 -1
  10. package/FAQ.md +38 -38
  11. package/README.md +7 -7
  12. package/dist/components/accordion.css +136 -40
  13. package/dist/components/accordion.js +10 -4
  14. package/dist/components/accordion.min.css +2 -2
  15. package/dist/components/accordion.min.js +3 -3
  16. package/dist/components/ad.css +4 -4
  17. package/dist/components/ad.min.css +2 -2
  18. package/dist/components/api.js +82 -25
  19. package/dist/components/api.min.js +3 -3
  20. package/dist/components/breadcrumb.css +1 -1
  21. package/dist/components/breadcrumb.min.css +1 -1
  22. package/dist/components/button.css +124 -77
  23. package/dist/components/button.min.css +2 -2
  24. package/dist/components/calendar.css +18 -1
  25. package/dist/components/calendar.js +92 -73
  26. package/dist/components/calendar.min.css +2 -2
  27. package/dist/components/calendar.min.js +3 -3
  28. package/dist/components/card.css +729 -99
  29. package/dist/components/card.min.css +2 -2
  30. package/dist/components/checkbox.css +92 -92
  31. package/dist/components/checkbox.js +4 -3
  32. package/dist/components/checkbox.min.css +2 -2
  33. package/dist/components/checkbox.min.js +3 -3
  34. package/dist/components/comment.css +2 -2
  35. package/dist/components/comment.min.css +2 -2
  36. package/dist/components/container.css +98 -4
  37. package/dist/components/container.min.css +2 -2
  38. package/dist/components/dimmer.css +7 -6
  39. package/dist/components/dimmer.js +19 -10
  40. package/dist/components/dimmer.min.css +2 -2
  41. package/dist/components/dimmer.min.js +3 -3
  42. package/dist/components/divider.css +31 -31
  43. package/dist/components/divider.min.css +2 -2
  44. package/dist/components/dropdown.css +74 -47
  45. package/dist/components/dropdown.js +237 -188
  46. package/dist/components/dropdown.min.css +2 -2
  47. package/dist/components/dropdown.min.js +3 -3
  48. package/dist/components/embed.css +5 -5
  49. package/dist/components/embed.js +14 -10
  50. package/dist/components/embed.min.css +2 -2
  51. package/dist/components/embed.min.js +3 -3
  52. package/dist/components/emoji.css +10797 -8839
  53. package/dist/components/emoji.min.css +1 -1
  54. package/dist/components/feed.css +2 -2
  55. package/dist/components/feed.min.css +2 -2
  56. package/dist/components/flag.css +563 -563
  57. package/dist/components/flag.min.css +2 -2
  58. package/dist/components/flyout.css +592 -0
  59. package/dist/components/flyout.js +1530 -0
  60. package/dist/components/flyout.min.css +9 -0
  61. package/dist/components/flyout.min.js +11 -0
  62. package/dist/components/form.css +67 -39
  63. package/dist/components/form.js +25 -21
  64. package/dist/components/form.min.css +2 -2
  65. package/dist/components/form.min.js +3 -3
  66. package/dist/components/grid.css +15 -14
  67. package/dist/components/grid.min.css +2 -2
  68. package/dist/components/header.css +6 -4
  69. package/dist/components/header.min.css +2 -2
  70. package/dist/components/icon.css +2105 -2061
  71. package/dist/components/icon.min.css +2 -2
  72. package/dist/components/image.css +1 -1
  73. package/dist/components/image.min.css +1 -1
  74. package/dist/components/input.css +743 -21
  75. package/dist/components/input.min.css +2 -2
  76. package/dist/components/item.css +5 -5
  77. package/dist/components/item.min.css +2 -2
  78. package/dist/components/label.css +72 -68
  79. package/dist/components/label.min.css +2 -2
  80. package/dist/components/list.css +31 -31
  81. package/dist/components/list.min.css +2 -2
  82. package/dist/components/loader.css +352 -352
  83. package/dist/components/loader.min.css +2 -2
  84. package/dist/components/menu.css +79 -71
  85. package/dist/components/menu.min.css +1 -1
  86. package/dist/components/message.css +3 -3
  87. package/dist/components/message.min.css +2 -2
  88. package/dist/components/modal.css +35 -6
  89. package/dist/components/modal.js +97 -57
  90. package/dist/components/modal.min.css +2 -2
  91. package/dist/components/modal.min.js +3 -3
  92. package/dist/components/nag.css +1 -1
  93. package/dist/components/nag.js +3 -3
  94. package/dist/components/nag.min.css +1 -1
  95. package/dist/components/nag.min.js +3 -3
  96. package/dist/components/placeholder.css +33 -33
  97. package/dist/components/placeholder.min.css +2 -2
  98. package/dist/components/popup.css +100 -104
  99. package/dist/components/popup.js +17 -23
  100. package/dist/components/popup.min.css +2 -2
  101. package/dist/components/popup.min.js +3 -3
  102. package/dist/components/progress.css +1 -1
  103. package/dist/components/progress.js +6 -3
  104. package/dist/components/progress.min.css +1 -1
  105. package/dist/components/progress.min.js +3 -3
  106. package/dist/components/rail.css +1 -1
  107. package/dist/components/rail.min.css +1 -1
  108. package/dist/components/rating.css +1 -1
  109. package/dist/components/rating.js +8 -4
  110. package/dist/components/rating.min.css +1 -1
  111. package/dist/components/rating.min.js +3 -3
  112. package/dist/components/reset.css +5 -4
  113. package/dist/components/reset.min.css +2 -2
  114. package/dist/components/reveal.css +1 -1
  115. package/dist/components/reveal.min.css +1 -1
  116. package/dist/components/search.css +6 -6
  117. package/dist/components/search.js +48 -21
  118. package/dist/components/search.min.css +2 -2
  119. package/dist/components/search.min.js +3 -3
  120. package/dist/components/segment.css +107 -29
  121. package/dist/components/segment.min.css +2 -2
  122. package/dist/components/shape.css +1 -1
  123. package/dist/components/shape.js +4 -4
  124. package/dist/components/shape.min.css +1 -1
  125. package/dist/components/shape.min.js +3 -3
  126. package/dist/components/sidebar.css +20 -8
  127. package/dist/components/sidebar.js +141 -44
  128. package/dist/components/sidebar.min.css +2 -2
  129. package/dist/components/sidebar.min.js +3 -3
  130. package/dist/components/site.css +79 -4
  131. package/dist/components/site.js +2 -2
  132. package/dist/components/site.min.css +2 -2
  133. package/dist/components/site.min.js +3 -3
  134. package/dist/components/slider.css +17 -17
  135. package/dist/components/slider.js +79 -64
  136. package/dist/components/slider.min.css +1 -1
  137. package/dist/components/slider.min.js +3 -3
  138. package/dist/components/state.js +3 -3
  139. package/dist/components/state.min.js +3 -3
  140. package/dist/components/statistic.css +4 -4
  141. package/dist/components/statistic.min.css +2 -2
  142. package/dist/components/step.css +30 -30
  143. package/dist/components/step.min.css +2 -2
  144. package/dist/components/sticky.css +1 -1
  145. package/dist/components/sticky.js +30 -19
  146. package/dist/components/sticky.min.css +1 -1
  147. package/dist/components/sticky.min.js +3 -3
  148. package/dist/components/tab.css +5 -5
  149. package/dist/components/tab.js +25 -7
  150. package/dist/components/tab.min.css +2 -2
  151. package/dist/components/tab.min.js +3 -3
  152. package/dist/components/table.css +1680 -270
  153. package/dist/components/table.min.css +2 -2
  154. package/dist/components/text.css +1 -1
  155. package/dist/components/text.min.css +1 -1
  156. package/dist/components/toast.css +11 -1
  157. package/dist/components/toast.js +19 -12
  158. package/dist/components/toast.min.css +2 -2
  159. package/dist/components/toast.min.js +3 -3
  160. package/dist/components/transition.css +1 -1
  161. package/dist/components/transition.js +27 -22
  162. package/dist/components/transition.min.css +1 -1
  163. package/dist/components/transition.min.js +3 -3
  164. package/dist/components/visibility.js +5 -5
  165. package/dist/components/visibility.min.js +3 -3
  166. package/dist/semantic.css +41415 -34430
  167. package/dist/semantic.js +2597 -696
  168. package/dist/semantic.min.css +3 -3
  169. package/dist/semantic.min.js +3 -3
  170. package/dist/themes/default/assets/fonts/Lato-Bold.woff +0 -0
  171. package/dist/themes/default/assets/fonts/Lato-Bold.woff2 +0 -0
  172. package/dist/themes/default/assets/fonts/Lato-BoldItalic.woff +0 -0
  173. package/dist/themes/default/assets/fonts/Lato-BoldItalic.woff2 +0 -0
  174. package/dist/themes/default/assets/fonts/Lato-Italic.woff +0 -0
  175. package/dist/themes/default/assets/fonts/Lato-Italic.woff2 +0 -0
  176. package/dist/themes/default/assets/fonts/Lato-Regular.woff +0 -0
  177. package/dist/themes/default/assets/fonts/Lato-Regular.woff2 +0 -0
  178. package/dist/themes/default/assets/fonts/LatoLatin-Bold.woff +0 -0
  179. package/dist/themes/default/assets/fonts/LatoLatin-Bold.woff2 +0 -0
  180. package/dist/themes/default/assets/fonts/LatoLatin-BoldItalic.woff +0 -0
  181. package/dist/themes/default/assets/fonts/LatoLatin-BoldItalic.woff2 +0 -0
  182. package/dist/themes/default/assets/fonts/LatoLatin-Italic.woff +0 -0
  183. package/dist/themes/default/assets/fonts/LatoLatin-Italic.woff2 +0 -0
  184. package/dist/themes/default/assets/fonts/LatoLatin-Regular.woff +0 -0
  185. package/dist/themes/default/assets/fonts/LatoLatin-Regular.woff2 +0 -0
  186. package/dist/themes/default/assets/fonts/brand-icons.woff +0 -0
  187. package/dist/themes/default/assets/fonts/brand-icons.woff2 +0 -0
  188. package/dist/themes/default/assets/fonts/icons.woff +0 -0
  189. package/dist/themes/default/assets/fonts/icons.woff2 +0 -0
  190. package/dist/themes/default/assets/fonts/outline-icons.woff +0 -0
  191. package/dist/themes/default/assets/fonts/outline-icons.woff2 +0 -0
  192. package/dist/themes/{default → famfamfam}/assets/images/flags.png +0 -0
  193. package/examples/assets/library/iframe-content.js +3 -3
  194. package/examples/assets/library/iframe.js +3 -3
  195. package/examples/components/button.html +1 -1
  196. package/examples/components/card.html +1 -1
  197. package/examples/components/input.html +1 -1
  198. package/examples/components/menu.html +1 -1
  199. package/examples/components/site.html +1 -1
  200. package/examples/components/sticky-context.html +197 -0
  201. package/examples/components/table.html +1 -1
  202. package/package.json +20 -18
  203. package/scripts/nightly-version.js +47 -38
  204. package/src/definitions/behaviors/api.js +81 -24
  205. package/src/definitions/behaviors/form.js +24 -20
  206. package/src/definitions/behaviors/state.js +2 -2
  207. package/src/definitions/behaviors/visibility.js +4 -4
  208. package/src/definitions/collections/form.less +43 -31
  209. package/src/definitions/collections/grid.less +11 -11
  210. package/src/definitions/collections/menu.less +62 -47
  211. package/src/definitions/collections/message.less +1 -1
  212. package/src/definitions/collections/table.less +636 -39
  213. package/src/definitions/elements/button.less +254 -125
  214. package/src/definitions/elements/container.less +129 -0
  215. package/src/definitions/elements/divider.less +24 -24
  216. package/src/definitions/elements/emoji.less +25 -2
  217. package/src/definitions/elements/flag.less +47 -1
  218. package/src/definitions/elements/header.less +4 -2
  219. package/src/definitions/elements/icon.less +91 -12
  220. package/src/definitions/elements/input.less +259 -27
  221. package/src/definitions/elements/label.less +42 -39
  222. package/src/definitions/elements/list.less +29 -30
  223. package/src/definitions/elements/loader.less +87 -87
  224. package/src/definitions/elements/placeholder.less +32 -32
  225. package/src/definitions/elements/segment.less +147 -34
  226. package/src/definitions/elements/step.less +25 -25
  227. package/src/definitions/globals/reset.less +2 -2
  228. package/src/definitions/globals/site.js +1 -1
  229. package/src/definitions/globals/site.less +14 -12
  230. package/src/definitions/modules/accordion.js +9 -3
  231. package/src/definitions/modules/accordion.less +371 -269
  232. package/src/definitions/modules/calendar.js +91 -72
  233. package/src/definitions/modules/calendar.less +20 -0
  234. package/src/definitions/modules/checkbox.js +3 -2
  235. package/src/definitions/modules/checkbox.less +53 -53
  236. package/src/definitions/modules/dimmer.js +18 -9
  237. package/src/definitions/modules/dimmer.less +11 -10
  238. package/src/definitions/modules/dropdown.js +236 -187
  239. package/src/definitions/modules/dropdown.less +110 -77
  240. package/src/definitions/modules/embed.js +13 -9
  241. package/src/definitions/modules/embed.less +4 -4
  242. package/src/definitions/modules/flyout.js +1530 -0
  243. package/src/definitions/modules/flyout.less +650 -0
  244. package/src/definitions/modules/modal.js +96 -56
  245. package/src/definitions/modules/modal.less +68 -33
  246. package/src/definitions/modules/nag.js +2 -2
  247. package/src/definitions/modules/popup.js +16 -22
  248. package/src/definitions/modules/popup.less +86 -90
  249. package/src/definitions/modules/progress.js +5 -2
  250. package/src/definitions/modules/rating.js +7 -3
  251. package/src/definitions/modules/search.js +47 -20
  252. package/src/definitions/modules/search.less +3 -3
  253. package/src/definitions/modules/shape.js +3 -3
  254. package/src/definitions/modules/sidebar.js +140 -43
  255. package/src/definitions/modules/sidebar.less +20 -5
  256. package/src/definitions/modules/slider.js +78 -63
  257. package/src/definitions/modules/slider.less +9 -9
  258. package/src/definitions/modules/sticky.js +29 -18
  259. package/src/definitions/modules/sticky.less +3 -1
  260. package/src/definitions/modules/tab.js +24 -6
  261. package/src/definitions/modules/tab.less +4 -4
  262. package/src/definitions/modules/toast.js +18 -11
  263. package/src/definitions/modules/toast.less +6 -0
  264. package/src/definitions/modules/transition.js +26 -21
  265. package/src/definitions/views/ad.less +3 -3
  266. package/src/definitions/views/card.less +124 -18
  267. package/src/definitions/views/comment.less +1 -1
  268. package/src/definitions/views/feed.less +1 -1
  269. package/src/definitions/views/item.less +3 -3
  270. package/src/definitions/views/statistic.less +1 -1
  271. package/src/semantic.less +1 -0
  272. package/src/theme.config.example +1 -0
  273. package/src/theme.less +13 -2
  274. package/src/themes/amazon/globals/site.variables +1 -0
  275. package/src/themes/basic/elements/icon.overrides +149 -149
  276. package/src/themes/basic/elements/icon.variables +16 -6
  277. package/src/themes/basic/elements/step.overrides +2 -2
  278. package/src/themes/bookish/elements/header.overrides +1 -1
  279. package/src/themes/chubby/elements/button.overrides +1 -1
  280. package/src/themes/chubby/elements/header.overrides +1 -1
  281. package/src/themes/default/assets/fonts/Lato-Bold.woff +0 -0
  282. package/src/themes/default/assets/fonts/Lato-Bold.woff2 +0 -0
  283. package/src/themes/default/assets/fonts/Lato-BoldItalic.woff +0 -0
  284. package/src/themes/default/assets/fonts/Lato-BoldItalic.woff2 +0 -0
  285. package/src/themes/default/assets/fonts/Lato-Italic.woff +0 -0
  286. package/src/themes/default/assets/fonts/Lato-Italic.woff2 +0 -0
  287. package/src/themes/default/assets/fonts/Lato-Regular.woff +0 -0
  288. package/src/themes/default/assets/fonts/Lato-Regular.woff2 +0 -0
  289. package/src/themes/default/assets/fonts/LatoLatin-Bold.woff +0 -0
  290. package/src/themes/default/assets/fonts/LatoLatin-Bold.woff2 +0 -0
  291. package/src/themes/default/assets/fonts/LatoLatin-BoldItalic.woff +0 -0
  292. package/src/themes/default/assets/fonts/LatoLatin-BoldItalic.woff2 +0 -0
  293. package/src/themes/default/assets/fonts/LatoLatin-Italic.woff +0 -0
  294. package/src/themes/default/assets/fonts/LatoLatin-Italic.woff2 +0 -0
  295. package/src/themes/default/assets/fonts/LatoLatin-Regular.woff +0 -0
  296. package/src/themes/default/assets/fonts/LatoLatin-Regular.woff2 +0 -0
  297. package/src/themes/default/assets/fonts/brand-icons.woff +0 -0
  298. package/src/themes/default/assets/fonts/brand-icons.woff2 +0 -0
  299. package/src/themes/default/assets/fonts/icons.woff +0 -0
  300. package/src/themes/default/assets/fonts/icons.woff2 +0 -0
  301. package/src/themes/default/assets/fonts/outline-icons.woff +0 -0
  302. package/src/themes/default/assets/fonts/outline-icons.woff2 +0 -0
  303. package/src/themes/default/collections/form.variables +4 -0
  304. package/src/themes/default/collections/table.variables +52 -0
  305. package/src/themes/default/elements/button.variables +5 -0
  306. package/src/themes/default/elements/container.variables +12 -0
  307. package/src/themes/default/elements/divider.overrides +7 -7
  308. package/src/themes/default/elements/emoji.overrides +0 -3090
  309. package/src/themes/default/elements/emoji.variables +3563 -1
  310. package/src/themes/default/elements/flag.overrides +0 -1640
  311. package/src/themes/default/elements/flag.variables +1597 -1
  312. package/src/themes/default/elements/icon.overrides +1 -2043
  313. package/src/themes/default/elements/icon.variables +2045 -30
  314. package/src/themes/default/elements/input.variables +15 -0
  315. package/src/themes/default/elements/segment.variables +8 -0
  316. package/src/themes/default/elements/step.overrides +4 -7
  317. package/src/themes/default/globals/site.variables +103 -8
  318. package/src/themes/default/globals/variation.variables +59 -0
  319. package/src/themes/default/modules/accordion.overrides +7 -9
  320. package/src/themes/default/modules/accordion.variables +34 -2
  321. package/src/themes/default/modules/calendar.variables +3 -0
  322. package/src/themes/default/modules/checkbox.overrides +10 -12
  323. package/src/themes/default/modules/checkbox.variables +5 -5
  324. package/src/themes/default/modules/dropdown.overrides +6 -9
  325. package/src/themes/default/modules/dropdown.variables +6 -9
  326. package/src/themes/default/modules/flyout.overrides +3 -0
  327. package/src/themes/default/modules/flyout.variables +100 -0
  328. package/src/themes/default/modules/modal.variables +16 -2
  329. package/src/themes/default/modules/popup.variables +0 -2
  330. package/src/themes/default/modules/sidebar.variables +4 -1
  331. package/src/themes/default/views/card.variables +8 -0
  332. package/src/themes/{default → famfamfam}/assets/images/flags.png +0 -0
  333. package/src/themes/famfamfam/elements/flag.overrides +496 -496
  334. package/src/themes/famfamfam/elements/flag.variables +8 -1
  335. package/src/themes/github/elements/icon.overrides +206 -206
  336. package/src/themes/github/elements/icon.variables +16 -1
  337. package/src/themes/github/elements/step.overrides +5 -5
  338. package/src/themes/github/globals/site.variables +1 -0
  339. package/src/themes/github/modules/dropdown.overrides +7 -10
  340. package/src/themes/instagram/views/card.overrides +1 -1
  341. package/src/themes/joypixels/elements/emoji.overrides +0 -3089
  342. package/src/themes/joypixels/elements/emoji.variables +3562 -5
  343. package/src/themes/material/collections/menu.overrides +1 -1
  344. package/src/themes/material/elements/button.overrides +1 -1
  345. package/src/themes/material/elements/header.overrides +1 -1
  346. package/src/themes/material/elements/icon.overrides +932 -932
  347. package/src/themes/material/elements/icon.variables +17 -0
  348. package/src/themes/material/globals/site.variables +0 -1
  349. package/src/themes/material/modules/dropdown.overrides +1 -1
  350. package/src/themes/material/modules/modal.overrides +1 -1
  351. package/src/themes/pulsar/elements/loader.overrides +2 -2
  352. package/src/themes/resetcss/globals/reset.overrides +3 -3
  353. package/src/themes/rtl/globals/site.overrides +1 -1
  354. package/src/themes/striped/modules/progress.overrides +1 -1
  355. package/src/themes/systemfont/globals/reset.overrides +8 -0
  356. package/src/themes/systemfont/globals/site.variables +10 -0
  357. package/src/themes/twitter/elements/emoji.overrides +0 -3091
  358. package/src/themes/twitter/elements/emoji.variables +3558 -6
  359. package/tasks/admin/distributions/create.js +1 -1
  360. package/tasks/admin/publish.js +1 -1
  361. package/tasks/admin/release.js +1 -1
  362. package/tasks/build/assets.js +1 -1
  363. package/tasks/build/css.js +3 -3
  364. package/tasks/build/javascript.js +3 -3
  365. package/tasks/check-install.js +1 -1
  366. package/tasks/clean.js +1 -1
  367. package/tasks/collections/README.md +1 -1
  368. package/tasks/collections/admin.js +1 -1
  369. package/tasks/config/admin/oauth.example.js +1 -1
  370. package/tasks/config/admin/release.js +1 -0
  371. package/tasks/config/admin/templates/composer.json +1 -1
  372. package/tasks/config/admin/templates/css-package.js +8 -12
  373. package/tasks/config/admin/templates/less-package.js +2 -2
  374. package/tasks/config/defaults.js +1 -0
  375. package/tasks/config/project/install.js +16 -13
  376. package/tasks/install.js +1 -0
  377. package/tasks/rtl/watch.js +1 -1
  378. package/tasks/version.js +1 -1
  379. package/test/fixtures/accordion.html +1 -1
  380. package/test/fixtures/checkbox.html +1 -1
  381. package/test/fixtures/dropdown.html +1 -1
  382. package/test/fixtures/modal.html +1 -1
  383. package/test/fixtures/popup.html +1 -1
  384. package/test/fixtures/rating.html +1 -1
  385. package/test/fixtures/shape.html +1 -1
  386. package/test/fixtures/sidebar.html +1 -1
  387. package/test/fixtures/tab.html +1 -1
  388. package/test/fixtures/transition.html +1 -1
  389. package/test/fixtures/video.html +1 -1
  390. package/test/helpers/jasmine-jquery.js +2 -2
  391. package/test/helpers/jasmine-sinon.js +1 -1
  392. package/test/helpers/jquery-events.js +1 -1
  393. package/test/helpers/sinon.js +2 -2
  394. package/test/meteor/fonts.js +1 -1
  395. package/test/modules/accordion.spec.js +1 -1
  396. package/test/modules/checkbox.spec.js +1 -1
  397. package/test/modules/dropdown.spec.js +1 -1
  398. package/test/modules/modal.spec.js +1 -1
  399. package/test/modules/module.spec.js +1 -1
  400. package/test/modules/popup.spec.js +1 -1
  401. package/test/modules/search.spec.js +1 -1
  402. package/test/modules/shape.spec.js +1 -1
  403. package/test/modules/sidebar.spec.js +1 -1
  404. package/test/modules/tab.spec.js +1 -1
  405. package/test/modules/transition.spec.js +1 -1
  406. package/test/modules/video.spec.js +1 -1
  407. package/dist/themes/basic/assets/fonts/icons.eot +0 -0
  408. package/dist/themes/basic/assets/fonts/icons.svg +0 -450
  409. package/dist/themes/basic/assets/fonts/icons.ttf +0 -0
  410. package/dist/themes/default/assets/fonts/brand-icons.eot +0 -0
  411. package/dist/themes/default/assets/fonts/brand-icons.svg +0 -3570
  412. package/dist/themes/default/assets/fonts/brand-icons.ttf +0 -0
  413. package/dist/themes/default/assets/fonts/icons.eot +0 -0
  414. package/dist/themes/default/assets/fonts/icons.svg +0 -4938
  415. package/dist/themes/default/assets/fonts/icons.ttf +0 -0
  416. package/dist/themes/default/assets/fonts/outline-icons.eot +0 -0
  417. package/dist/themes/default/assets/fonts/outline-icons.svg +0 -803
  418. package/dist/themes/default/assets/fonts/outline-icons.ttf +0 -0
  419. package/dist/themes/github/assets/fonts/octicons-local.ttf +0 -0
  420. package/dist/themes/github/assets/fonts/octicons.svg +0 -200
  421. package/dist/themes/github/assets/fonts/octicons.ttf +0 -0
  422. package/dist/themes/material/assets/fonts/icons.eot +0 -0
  423. package/dist/themes/material/assets/fonts/icons.svg +0 -2373
  424. package/dist/themes/material/assets/fonts/icons.ttf +0 -0
  425. package/src/themes/basic/assets/fonts/icons.eot +0 -0
  426. package/src/themes/basic/assets/fonts/icons.svg +0 -450
  427. package/src/themes/basic/assets/fonts/icons.ttf +0 -0
  428. package/src/themes/default/assets/fonts/brand-icons.eot +0 -0
  429. package/src/themes/default/assets/fonts/brand-icons.svg +0 -3570
  430. package/src/themes/default/assets/fonts/brand-icons.ttf +0 -0
  431. package/src/themes/default/assets/fonts/icons.eot +0 -0
  432. package/src/themes/default/assets/fonts/icons.svg +0 -4938
  433. package/src/themes/default/assets/fonts/icons.ttf +0 -0
  434. package/src/themes/default/assets/fonts/outline-icons.eot +0 -0
  435. package/src/themes/default/assets/fonts/outline-icons.svg +0 -803
  436. package/src/themes/default/assets/fonts/outline-icons.ttf +0 -0
  437. package/src/themes/github/assets/fonts/octicons-local.ttf +0 -0
  438. package/src/themes/github/assets/fonts/octicons.svg +0 -200
  439. package/src/themes/github/assets/fonts/octicons.ttf +0 -0
  440. package/src/themes/material/assets/fonts/icons.eot +0 -0
  441. package/src/themes/material/assets/fonts/icons.svg +0 -2373
  442. package/src/themes/material/assets/fonts/icons.ttf +0 -0
@@ -30,11 +30,6 @@ $.fn.dropdown = function(parameters) {
30
30
 
31
31
  moduleSelector = $allModules.selector || '',
32
32
 
33
- hasTouch = ('ontouchstart' in document.documentElement),
34
- clickEvent = hasTouch
35
- ? 'touchstart'
36
- : 'click',
37
-
38
33
  time = new Date().getTime(),
39
34
  performance = [],
40
35
 
@@ -66,7 +61,7 @@ $.fn.dropdown = function(parameters) {
66
61
  moduleNamespace = 'module-' + namespace,
67
62
 
68
63
  $module = $(this),
69
- $context = $(settings.context),
64
+ $context = [window,document].indexOf(settings.context) < 0 ? $document.find(settings.context) : $(settings.context),
70
65
  $text = $module.find(selector.text),
71
66
  $search = $module.find(selector.search),
72
67
  $sizer = $module.find(selector.sizer),
@@ -116,6 +111,7 @@ $.fn.dropdown = function(parameters) {
116
111
  module.error(error.noNormalize, element);
117
112
  }
118
113
 
114
+ module.create.id();
119
115
  module.setup.layout();
120
116
 
121
117
  if(settings.values) {
@@ -129,7 +125,6 @@ $.fn.dropdown = function(parameters) {
129
125
  module.save.defaults();
130
126
  module.restore.selected();
131
127
 
132
- module.create.id();
133
128
  module.bind.events();
134
129
 
135
130
  module.observeChanges();
@@ -225,7 +220,7 @@ $.fn.dropdown = function(parameters) {
225
220
 
226
221
  create: {
227
222
  id: function() {
228
- id = (Math.random().toString(16) + '000000000').substr(2, 8);
223
+ id = (Math.random().toString(16) + '000000000').slice(2, 10);
229
224
  elementNamespace = '.' + id;
230
225
  module.verbose('Creating unique id for element', id);
231
226
  },
@@ -233,7 +228,6 @@ $.fn.dropdown = function(parameters) {
233
228
  var
234
229
  $userChoices,
235
230
  $userChoice,
236
- isUserValue,
237
231
  html
238
232
  ;
239
233
  values = values || module.get.userValues();
@@ -371,11 +365,20 @@ $.fn.dropdown = function(parameters) {
371
365
  }
372
366
  if( module.is.search() && !module.has.search() ) {
373
367
  module.verbose('Adding search input');
368
+ var
369
+ labelNode = $module.prev('label')
370
+ ;
374
371
  $search = $('<input />')
375
372
  .addClass(className.search)
376
373
  .prop('autocomplete', module.is.chrome() ? 'fomantic-search' : 'off')
377
- .insertBefore($text)
378
374
  ;
375
+ if (labelNode.length) {
376
+ if (!labelNode.attr('id')) {
377
+ labelNode.attr('id', '_' + module.get.id() + '_formLabel');
378
+ }
379
+ $search.attr('aria-labelledby', labelNode.attr('id'));
380
+ }
381
+ $search.insertBefore($text);
379
382
  }
380
383
  if( module.is.multiple() && module.is.searchSelection() && !module.has.sizer()) {
381
384
  module.create.sizer();
@@ -444,7 +447,7 @@ $.fn.dropdown = function(parameters) {
444
447
  // replace module reference
445
448
  $module = $module.parent(selector.dropdown);
446
449
  instance = $module.data(moduleNamespace);
447
- element = $module.get(0);
450
+ element = $module[0];
448
451
  module.refresh();
449
452
  module.setup.returnedObject();
450
453
  },
@@ -540,10 +543,9 @@ $.fn.dropdown = function(parameters) {
540
543
  return true;
541
544
  }
542
545
  if(settings.onShow.call(element) !== false) {
546
+ module.remove.empty();
543
547
  module.animate.show(function() {
544
- if( module.can.click() ) {
545
- module.bind.intent();
546
- }
548
+ module.bind.intent();
547
549
  if(module.has.search() && !preventFocus) {
548
550
  module.focusSearch();
549
551
  }
@@ -570,8 +572,17 @@ $.fn.dropdown = function(parameters) {
570
572
  }
571
573
  callback.call(element);
572
574
  });
575
+ // Hide submenus explicitly. On some browsers (esp. mobile), they will not automatically receive a
576
+ // mouseleave event
577
+ var $subMenu = $module.find(selector.menu);
578
+ if($subMenu.length > 0) {
579
+ module.verbose('Hiding sub-menu', $subMenu);
580
+ $subMenu.each(function() {
581
+ module.animate.hide(false, $(this));
582
+ });
583
+ }
573
584
  }
574
- } else if( module.can.click() ) {
585
+ } else {
575
586
  module.unbind.intent();
576
587
  }
577
588
  iconClicked = false;
@@ -591,7 +602,7 @@ $.fn.dropdown = function(parameters) {
591
602
  module.verbose('Hiding menu instantaneously');
592
603
  module.remove.active();
593
604
  module.remove.visible();
594
- $menu.transition('hide');
605
+ $menu.transition('destroy').transition('hide');
595
606
  },
596
607
 
597
608
  hideSubMenus: function() {
@@ -629,13 +640,18 @@ $.fn.dropdown = function(parameters) {
629
640
  $module
630
641
  .on('change' + eventNamespace, selector.input, module.event.change)
631
642
  ;
643
+ if(module.is.multiple() && module.is.searchSelection()) {
644
+ $module
645
+ .on('paste' + eventNamespace, selector.search, module.event.paste)
646
+ ;
647
+ }
632
648
  },
633
649
  mouseEvents: function() {
634
650
  module.verbose('Binding mouse events');
635
651
  if(module.is.multiple()) {
636
652
  $module
637
- .on(clickEvent + eventNamespace, selector.label, module.event.label.click)
638
- .on(clickEvent + eventNamespace, selector.remove, module.event.remove.click)
653
+ .on('click' + eventNamespace, selector.label, module.event.label.click)
654
+ .on('click' + eventNamespace, selector.remove, module.event.remove.click)
639
655
  ;
640
656
  }
641
657
  if( module.is.searchSelection() ) {
@@ -644,31 +660,33 @@ $.fn.dropdown = function(parameters) {
644
660
  .on('mouseup' + eventNamespace, module.event.mouseup)
645
661
  .on('mousedown' + eventNamespace, selector.menu, module.event.menu.mousedown)
646
662
  .on('mouseup' + eventNamespace, selector.menu, module.event.menu.mouseup)
647
- .on(clickEvent + eventNamespace, selector.icon, module.event.icon.click)
648
- .on(clickEvent + eventNamespace, selector.clearIcon, module.event.clearIcon.click)
663
+ .on('click' + eventNamespace, selector.icon, module.event.icon.click)
664
+ .on('click' + eventNamespace, selector.clearIcon, module.event.clearIcon.click)
649
665
  .on('focus' + eventNamespace, selector.search, module.event.search.focus)
650
- .on(clickEvent + eventNamespace, selector.search, module.event.search.focus)
666
+ .on('click' + eventNamespace, selector.search, module.event.search.focus)
651
667
  .on('blur' + eventNamespace, selector.search, module.event.search.blur)
652
- .on(clickEvent + eventNamespace, selector.text, module.event.text.focus)
668
+ .on('click' + eventNamespace, selector.text, module.event.text.focus)
653
669
  ;
654
670
  if(module.is.multiple()) {
655
671
  $module
656
- .on(clickEvent + eventNamespace, module.event.click)
657
- .on(clickEvent + eventNamespace, module.event.search.focus)
672
+ .on('click' + eventNamespace, module.event.click)
673
+ .on('click' + eventNamespace, module.event.search.focus)
658
674
  ;
659
675
  }
660
676
  }
661
677
  else {
662
678
  if(settings.on == 'click') {
663
679
  $module
664
- .on(clickEvent + eventNamespace, selector.icon, module.event.icon.click)
665
- .on(clickEvent + eventNamespace, module.event.test.toggle)
680
+ .on('click' + eventNamespace, selector.icon, module.event.icon.click)
681
+ .on('click' + eventNamespace, module.event.test.toggle)
666
682
  ;
667
683
  }
668
684
  else if(settings.on == 'hover') {
669
685
  $module
670
686
  .on('mouseenter' + eventNamespace, module.delay.show)
671
687
  .on('mouseleave' + eventNamespace, module.delay.hide)
688
+ .on('touchstart' + eventNamespace, module.event.test.toggle)
689
+ .on('touchstart' + eventNamespace, selector.icon, module.event.icon.click)
672
690
  ;
673
691
  }
674
692
  else {
@@ -680,7 +698,7 @@ $.fn.dropdown = function(parameters) {
680
698
  .on('mousedown' + eventNamespace, module.event.mousedown)
681
699
  .on('mouseup' + eventNamespace, module.event.mouseup)
682
700
  .on('focus' + eventNamespace, module.event.focus)
683
- .on(clickEvent + eventNamespace, selector.clearIcon, module.event.clearIcon.click)
701
+ .on('click' + eventNamespace, selector.clearIcon, module.event.clearIcon.click)
684
702
  ;
685
703
  if(module.has.menuSearch() ) {
686
704
  $module
@@ -694,21 +712,16 @@ $.fn.dropdown = function(parameters) {
694
712
  }
695
713
  }
696
714
  $menu
697
- .on((hasTouch ? 'touchstart' : 'mouseenter') + eventNamespace, selector.item, module.event.item.mouseenter)
715
+ .on('mouseenter' + eventNamespace, selector.item, module.event.item.mouseenter)
716
+ .on('touchstart' + eventNamespace, selector.item, module.event.item.mouseenter)
698
717
  .on('mouseleave' + eventNamespace, selector.item, module.event.item.mouseleave)
699
718
  .on('click' + eventNamespace, selector.item, module.event.item.click)
700
719
  ;
701
720
  },
702
721
  intent: function() {
703
722
  module.verbose('Binding hide intent event to document');
704
- if(hasTouch) {
705
- $document
706
- .on('touchstart' + elementNamespace, module.event.test.touch)
707
- .on('touchmove' + elementNamespace, module.event.test.touch)
708
- ;
709
- }
710
723
  $document
711
- .on(clickEvent + elementNamespace, module.event.test.hide)
724
+ .on('click' + elementNamespace, module.event.test.hide)
712
725
  ;
713
726
  }
714
727
  },
@@ -716,14 +729,8 @@ $.fn.dropdown = function(parameters) {
716
729
  unbind: {
717
730
  intent: function() {
718
731
  module.verbose('Removing hide intent event from document');
719
- if(hasTouch) {
720
- $document
721
- .off('touchstart' + elementNamespace)
722
- .off('touchmove' + elementNamespace)
723
- ;
724
- }
725
732
  $document
726
- .off(clickEvent + elementNamespace)
733
+ .off('click' + elementNamespace)
727
734
  ;
728
735
  }
729
736
  },
@@ -756,6 +763,7 @@ $.fn.dropdown = function(parameters) {
756
763
  }
757
764
  else {
758
765
  module.verbose('All items filtered, hiding dropdown', searchTerm);
766
+ module.set.empty();
759
767
  module.hideMenu();
760
768
  }
761
769
  }
@@ -766,7 +774,7 @@ $.fn.dropdown = function(parameters) {
766
774
  if(settings.allowAdditions) {
767
775
  module.add.userSuggestion(module.escape.htmlEntities(query));
768
776
  }
769
- if(module.is.searchSelection() && module.can.show() && module.is.focusedOnSearch() ) {
777
+ if(module.is.searchSelection() && module.can.show() && module.is.focusedOnSearch() && !module.is.empty()) {
770
778
  module.show();
771
779
  }
772
780
  }
@@ -816,20 +824,28 @@ $.fn.dropdown = function(parameters) {
816
824
  throttle : settings.throttle,
817
825
  urlData : {
818
826
  query: query
819
- },
820
- onError: function() {
827
+ }
828
+ },
829
+ apiCallbacks = {
830
+ onError: function(errorMessage, $module, xhr) {
821
831
  module.add.message(message.serverError);
822
832
  iconClicked = false;
823
833
  focused = false;
824
834
  callback.apply(null, callbackParameters);
835
+ if(typeof settings.apiSettings.onError === 'function') {
836
+ settings.apiSettings.onError.call(this, errorMessage, $module, xhr);
837
+ }
825
838
  },
826
- onFailure: function() {
839
+ onFailure: function(response, $module, xhr) {
827
840
  module.add.message(message.serverError);
828
841
  iconClicked = false;
829
842
  focused = false;
830
843
  callback.apply(null, callbackParameters);
844
+ if(typeof settings.apiSettings.onFailure === 'function') {
845
+ settings.apiSettings.onFailure.call(this, response, $module, xhr);
846
+ }
831
847
  },
832
- onSuccess : function(response) {
848
+ onSuccess : function(response, $module, xhr) {
833
849
  var
834
850
  values = response[fields.remoteValues]
835
851
  ;
@@ -848,19 +864,22 @@ $.fn.dropdown = function(parameters) {
848
864
  var value = module.is.multiple() ? module.get.values() : module.get.value();
849
865
  if (value !== '') {
850
866
  module.verbose('Value(s) present after click icon, select value(s) in items');
851
- module.set.selected(value, null, null, true);
867
+ module.set.selected(value, null, true, true);
852
868
  }
853
869
  }
854
870
  iconClicked = false;
855
871
  focused = false;
856
872
  callback.apply(null, callbackParameters);
873
+ if(typeof settings.apiSettings.onSuccess === 'function') {
874
+ settings.apiSettings.onSuccess.call(this, response, $module, xhr);
875
+ }
857
876
  }
858
877
  }
859
878
  ;
860
879
  if( !$module.api('get request') ) {
861
880
  module.setup.api();
862
881
  }
863
- apiSettings = $.extend(true, {}, apiSettings, settings.apiSettings);
882
+ apiSettings = $.extend(true, {}, apiSettings, settings.apiSettings, apiCallbacks);
864
883
  $module
865
884
  .api('setting', apiSettings)
866
885
  .api('query')
@@ -896,30 +915,18 @@ $.fn.dropdown = function(parameters) {
896
915
  }
897
916
  if(settings.match === 'both' || settings.match === 'text') {
898
917
  text = module.remove.diacritics(String(module.get.choiceText($choice, false)));
899
- if(text.search(beginsWithRegExp) !== -1) {
900
- results.push(this);
901
- return true;
902
- }
903
- else if (settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, text)) {
904
- results.push(this);
905
- return true;
906
- }
907
- else if (settings.fullTextSearch === true && module.fuzzySearch(searchTerm, text)) {
918
+ if(text.search(beginsWithRegExp) !== -1 ||
919
+ (settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, text)) ||
920
+ (settings.fullTextSearch === true && module.fuzzySearch(searchTerm, text))) {
908
921
  results.push(this);
909
922
  return true;
910
923
  }
911
924
  }
912
925
  if(settings.match === 'both' || settings.match === 'value') {
913
926
  value = module.remove.diacritics(String(module.get.choiceValue($choice, text)));
914
- if(value.search(beginsWithRegExp) !== -1) {
915
- results.push(this);
916
- return true;
917
- }
918
- else if (settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, value)) {
919
- results.push(this);
920
- return true;
921
- }
922
- else if (settings.fullTextSearch === true && module.fuzzySearch(searchTerm, value)) {
927
+ if(value.search(beginsWithRegExp) !== -1 ||
928
+ (settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, value)) ||
929
+ (settings.fullTextSearch === true && module.fuzzySearch(searchTerm, value))) {
923
930
  results.push(this);
924
931
  return true;
925
932
  }
@@ -1048,7 +1055,7 @@ $.fn.dropdown = function(parameters) {
1048
1055
  menuConfig[fields.values] = values;
1049
1056
  module.setup.menu(menuConfig);
1050
1057
  $.each(values, function(index, item) {
1051
- if(item.selected == true) {
1058
+ if(item.selected === true) {
1052
1059
  module.debug('Setting initial selection to', item[fields.value]);
1053
1060
  module.set.selected(item[fields.value]);
1054
1061
  if(!module.is.multiple()) {
@@ -1069,7 +1076,7 @@ $.fn.dropdown = function(parameters) {
1069
1076
  settings.preserveHTML
1070
1077
  )
1071
1078
  ;
1072
- $input.append('<option value="' + value + '">' + name + '</option>');
1079
+ $input.append('<option value="' + value + '"' + (item.selected === true ? ' selected' : '') + '>' + name + '</option>');
1073
1080
  });
1074
1081
  module.observe.select();
1075
1082
  }
@@ -1077,6 +1084,15 @@ $.fn.dropdown = function(parameters) {
1077
1084
  },
1078
1085
 
1079
1086
  event: {
1087
+ paste: function(event) {
1088
+ var pasteValue = (event.originalEvent.clipboardData || window.clipboardData).getData('text'),
1089
+ tokens = pasteValue.split(settings.delimiter)
1090
+ ;
1091
+ tokens.forEach(function(value){
1092
+ module.set.selected(module.escape.htmlEntities(value.trim()), null, true, true);
1093
+ });
1094
+ event.preventDefault();
1095
+ },
1080
1096
  change: function() {
1081
1097
  if(!internalChange) {
1082
1098
  module.debug('Input changed, updating selection');
@@ -1097,7 +1113,7 @@ $.fn.dropdown = function(parameters) {
1097
1113
  }
1098
1114
  },
1099
1115
  mousedown: function() {
1100
- if(module.is.searchSelection()) {
1116
+ if(module.is.searchSelection(true)) {
1101
1117
  // prevent menu hiding on immediate re-focus
1102
1118
  willRefocus = true;
1103
1119
  }
@@ -1107,7 +1123,7 @@ $.fn.dropdown = function(parameters) {
1107
1123
  }
1108
1124
  },
1109
1125
  mouseup: function() {
1110
- if(module.is.searchSelection()) {
1126
+ if(module.is.searchSelection(true)) {
1111
1127
  // prevent menu hiding on immediate re-focus
1112
1128
  willRefocus = false;
1113
1129
  }
@@ -1135,14 +1151,14 @@ $.fn.dropdown = function(parameters) {
1135
1151
  if(module.is.multiple()) {
1136
1152
  module.remove.activeLabel();
1137
1153
  }
1138
- if(!focused && !module.is.active() && (settings.showOnFocus || (event.type !== 'focus' && event.type !== 'focusin'))) {
1154
+ if(!focused && !module.is.active() && (settings.showOnFocus || (event.type !== 'focus' && event.type !== 'focusin')) && event.type !== 'touchstart') {
1139
1155
  focused = true;
1140
1156
  module.search();
1141
1157
  }
1142
1158
  },
1143
1159
  blur: function(event) {
1144
1160
  pageLostFocus = (document.activeElement === this);
1145
- if(module.is.searchSelection() && !willRefocus) {
1161
+ if(module.is.searchSelection(true) && !willRefocus) {
1146
1162
  if(!itemActivated && !pageLostFocus) {
1147
1163
  if(settings.forceSelection) {
1148
1164
  module.forceSelection();
@@ -1253,23 +1269,12 @@ $.fn.dropdown = function(parameters) {
1253
1269
  if (!module.is.multiple() || (module.is.multiple() && !module.is.active())) {
1254
1270
  focused = true;
1255
1271
  }
1256
- if( module.determine.eventOnElement(event, toggleBehavior) ) {
1272
+ if( module.determine.eventOnElement(event, toggleBehavior) && event.type !== 'touchstart') {
1273
+ // do not preventDefault of touchstart; so emulated mouseenter is triggered on first touch and not later
1274
+ // (when selecting an item). The double-showing of the dropdown through both events does not hurt.
1257
1275
  event.preventDefault();
1258
1276
  }
1259
1277
  },
1260
- touch: function(event) {
1261
- module.determine.eventOnElement(event, function() {
1262
- if(event.type == 'touchstart') {
1263
- module.timer = setTimeout(function() {
1264
- module.hide();
1265
- }, settings.delay.touch);
1266
- }
1267
- else if(event.type == 'touchmove') {
1268
- clearTimeout(module.timer);
1269
- }
1270
- });
1271
- event.stopPropagation();
1272
- },
1273
1278
  hide: function(event) {
1274
1279
  if(module.determine.eventInModule(event, module.hide)){
1275
1280
  if(element.id && $(event.target).attr('for') === element.id){
@@ -1353,13 +1358,15 @@ $.fn.dropdown = function(parameters) {
1353
1358
  },
1354
1359
  mouseleave: function(event) {
1355
1360
  var
1356
- $subMenu = $(this).children(selector.menu)
1361
+ $subMenu = $(this).find(selector.menu)
1357
1362
  ;
1358
1363
  if($subMenu.length > 0) {
1359
1364
  clearTimeout(module.itemTimer);
1360
1365
  module.itemTimer = setTimeout(function() {
1361
1366
  module.verbose('Hiding sub-menu', $subMenu);
1362
- module.animate.hide(false, $subMenu);
1367
+ $subMenu.each(function() {
1368
+ module.animate.hide(false, $(this));
1369
+ });
1363
1370
  }, settings.delay.hide);
1364
1371
  }
1365
1372
  },
@@ -1384,8 +1391,12 @@ $.fn.dropdown = function(parameters) {
1384
1391
  if(settings.allowAdditions) {
1385
1392
  module.remove.userAddition();
1386
1393
  }
1394
+ module.remove.filteredItem();
1395
+ if(!module.is.visible()) {
1396
+ module.show();
1397
+ }
1387
1398
  module.remove.searchTerm();
1388
- if(!module.is.focusedOnSearch() && !(skipRefocus == true)) {
1399
+ if(!module.is.focusedOnSearch() && skipRefocus !== true) {
1389
1400
  module.focusSearch(true);
1390
1401
  }
1391
1402
  }
@@ -1420,8 +1431,7 @@ $.fn.dropdown = function(parameters) {
1420
1431
  isFocusedOnSearch = module.is.focusedOnSearch(),
1421
1432
  isFocused = module.is.focused(),
1422
1433
  caretAtStart = (isFocusedOnSearch && module.get.caretPosition(false) === 0),
1423
- isSelectedSearch = (caretAtStart && module.get.caretPosition(true) !== 0),
1424
- $nextLabel
1434
+ isSelectedSearch = (caretAtStart && module.get.caretPosition(true) !== 0)
1425
1435
  ;
1426
1436
  if(isSearch && !hasActiveLabel && !isFocusedOnSearch) {
1427
1437
  return;
@@ -1499,12 +1509,18 @@ $.fn.dropdown = function(parameters) {
1499
1509
  }
1500
1510
  $activeLabel.last().next(selector.siblingLabel).addClass(className.active);
1501
1511
  module.remove.activeLabels($activeLabel);
1512
+ if(!module.is.visible()){
1513
+ module.show();
1514
+ }
1502
1515
  event.preventDefault();
1503
1516
  }
1504
1517
  else if(caretAtStart && !isSelectedSearch && !hasActiveLabel && pressedKey == keys.backspace) {
1505
1518
  module.verbose('Removing last label on input backspace');
1506
1519
  $activeLabel = $label.last().addClass(className.active);
1507
1520
  module.remove.activeLabels($activeLabel);
1521
+ if(!module.is.visible()){
1522
+ module.show();
1523
+ }
1508
1524
  }
1509
1525
  }
1510
1526
  else {
@@ -1517,7 +1533,7 @@ $.fn.dropdown = function(parameters) {
1517
1533
  keydown: function(event) {
1518
1534
  var
1519
1535
  pressedKey = event.which,
1520
- isShortcutKey = module.is.inObject(pressedKey, keys)
1536
+ isShortcutKey = module.is.inObject(pressedKey, keys) || event.key === settings.delimiter
1521
1537
  ;
1522
1538
  if(isShortcutKey) {
1523
1539
  var
@@ -1535,16 +1551,17 @@ $.fn.dropdown = function(parameters) {
1535
1551
  hasSubMenu = ($subMenu.length> 0),
1536
1552
  hasSelectedItem = ($selectedItem.length > 0),
1537
1553
  selectedIsSelectable = ($selectedItem.not(selector.unselectable).length > 0),
1538
- delimiterPressed = (pressedKey == keys.delimiter && settings.allowAdditions && module.is.multiple()),
1539
- isAdditionWithoutMenu = (settings.allowAdditions && settings.hideAdditions && (pressedKey == keys.enter || delimiterPressed) && selectedIsSelectable),
1554
+ delimiterPressed = (event.key === settings.delimiter && module.is.multiple()),
1555
+ isAdditionWithoutMenu = settings.allowAdditions && (pressedKey == keys.enter || delimiterPressed),
1540
1556
  $nextItem,
1541
- isSubMenuItem,
1542
- newIndex
1557
+ isSubMenuItem
1543
1558
  ;
1544
1559
  // allow selection with menu closed
1545
1560
  if(isAdditionWithoutMenu) {
1546
- module.verbose('Selecting item from keyboard shortcut', $selectedItem);
1547
- module.event.item.click.call($selectedItem, event);
1561
+ if (selectedIsSelectable && settings.hideAdditions) {
1562
+ module.verbose('Selecting item from keyboard shortcut', $selectedItem);
1563
+ module.event.item.click.call($selectedItem, event);
1564
+ }
1548
1565
  if(module.is.searchSelection()) {
1549
1566
  module.remove.searchTerm();
1550
1567
  }
@@ -1633,7 +1650,7 @@ $.fn.dropdown = function(parameters) {
1633
1650
  .addClass(className.selected)
1634
1651
  ;
1635
1652
  module.set.scrollPosition($nextItem);
1636
- if(settings.selectOnKeydown && module.is.single()) {
1653
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
1637
1654
  module.set.selectedItem($nextItem);
1638
1655
  }
1639
1656
  }
@@ -1643,7 +1660,7 @@ $.fn.dropdown = function(parameters) {
1643
1660
  // down arrow (traverse menu down)
1644
1661
  if(pressedKey == keys.downArrow) {
1645
1662
  $nextItem = (hasSelectedItem && inVisibleMenu)
1646
- ? $nextItem = $selectedItem.nextAll(selector.item + ':not(' + selector.unselectable + ')').eq(0)
1663
+ ? $selectedItem.nextAll(selector.item + ':not(' + selector.unselectable + ')').eq(0)
1647
1664
  : $item.eq(0)
1648
1665
  ;
1649
1666
  if($nextItem.length === 0) {
@@ -1660,7 +1677,7 @@ $.fn.dropdown = function(parameters) {
1660
1677
  .addClass(className.selected)
1661
1678
  ;
1662
1679
  module.set.scrollPosition($nextItem);
1663
- if(settings.selectOnKeydown && module.is.single()) {
1680
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
1664
1681
  module.set.selectedItem($nextItem);
1665
1682
  }
1666
1683
  }
@@ -1681,12 +1698,13 @@ $.fn.dropdown = function(parameters) {
1681
1698
  if(pressedKey == keys.escape) {
1682
1699
  module.verbose('Escape key pressed, closing dropdown');
1683
1700
  module.hide();
1701
+ event.stopPropagation();
1684
1702
  }
1685
1703
 
1686
1704
  }
1687
1705
  else {
1688
1706
  // delimiter key
1689
- if(delimiterPressed) {
1707
+ if(pressedKey == keys.enter || delimiterPressed) {
1690
1708
  event.preventDefault();
1691
1709
  }
1692
1710
  // down arrow (open menu)
@@ -1791,7 +1809,7 @@ $.fn.dropdown = function(parameters) {
1791
1809
  ;
1792
1810
  if( module.can.activate( $(element) ) ) {
1793
1811
  module.set.selected(value, $(element));
1794
- if(!module.is.multiple()) {
1812
+ if(!module.is.multiple() && !(!settings.collapseOnActionable && $(element).hasClass(className.actionable))) {
1795
1813
  module.hideAndClear();
1796
1814
  }
1797
1815
  }
@@ -1804,7 +1822,7 @@ $.fn.dropdown = function(parameters) {
1804
1822
  ;
1805
1823
  if( module.can.activate( $(element) ) ) {
1806
1824
  module.set.value(value, text, $(element));
1807
- if(!module.is.multiple()) {
1825
+ if(!module.is.multiple() && !(!settings.collapseOnActionable && $(element).hasClass(className.actionable))) {
1808
1826
  module.hideAndClear();
1809
1827
  }
1810
1828
  }
@@ -1855,7 +1873,7 @@ $.fn.dropdown = function(parameters) {
1855
1873
  ;
1856
1874
  $sizer.text(value);
1857
1875
  // prevent rounding issues
1858
- return Math.ceil( $sizer.width() + 1);
1876
+ return Math.ceil( $sizer.width() + (module.is.edge() ? 3 : 1));
1859
1877
  },
1860
1878
  selectionCount: function() {
1861
1879
  var
@@ -1882,7 +1900,7 @@ $.fn.dropdown = function(parameters) {
1882
1900
  },
1883
1901
  userValues: function() {
1884
1902
  var
1885
- values = module.get.values()
1903
+ values = module.get.values(true)
1886
1904
  ;
1887
1905
  if(!values) {
1888
1906
  return false;
@@ -1902,7 +1920,7 @@ $.fn.dropdown = function(parameters) {
1902
1920
  },
1903
1921
  caretPosition: function(returnEndPos) {
1904
1922
  var
1905
- input = $search.get(0),
1923
+ input = $search[0],
1906
1924
  range,
1907
1925
  rangeLength
1908
1926
  ;
@@ -2397,7 +2415,6 @@ $.fn.dropdown = function(parameters) {
2397
2415
  currentScroll = $menu.scrollTop(),
2398
2416
  itemHeight = $item.eq(0).outerHeight(),
2399
2417
  itemsPerPage = Math.floor(menuHeight / itemHeight),
2400
- maxScroll = $menu.prop('scrollHeight'),
2401
2418
  newScroll = (direction == 'up')
2402
2419
  ? currentScroll - (itemHeight * itemsPerPage)
2403
2420
  : currentScroll + (itemHeight * itemsPerPage),
@@ -2428,7 +2445,7 @@ $.fn.dropdown = function(parameters) {
2428
2445
  $nextSelectedItem
2429
2446
  .addClass(className.selected)
2430
2447
  ;
2431
- if(settings.selectOnKeydown && module.is.single()) {
2448
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
2432
2449
  module.set.selectedItem($nextSelectedItem);
2433
2450
  }
2434
2451
  $menu
@@ -2514,7 +2531,7 @@ $.fn.dropdown = function(parameters) {
2514
2531
  var
2515
2532
  length = module.get.query().length
2516
2533
  ;
2517
- $search.val( text.substr(0, length));
2534
+ $search.val( text.slice(0, length));
2518
2535
  },
2519
2536
  scrollPosition: function($item, forceScroll) {
2520
2537
  var
@@ -2522,7 +2539,6 @@ $.fn.dropdown = function(parameters) {
2522
2539
  $menu,
2523
2540
  hasActive,
2524
2541
  offset,
2525
- itemHeight,
2526
2542
  itemOffset,
2527
2543
  menuOffset,
2528
2544
  menuScroll,
@@ -2561,7 +2577,7 @@ $.fn.dropdown = function(parameters) {
2561
2577
  $menu.removeClass(className.loading);
2562
2578
  }
2563
2579
  },
2564
- text: function(text) {
2580
+ text: function(text, isNotPlaceholder) {
2565
2581
  if(settings.action === 'combo') {
2566
2582
  module.debug('Changing combo button text', text, $combo);
2567
2583
  if(settings.preserveHTML) {
@@ -2572,7 +2588,7 @@ $.fn.dropdown = function(parameters) {
2572
2588
  }
2573
2589
  }
2574
2590
  else if(settings.action === 'activate') {
2575
- if(text !== module.get.placeholderText()) {
2591
+ if(text !== module.get.placeholderText() || isNotPlaceholder) {
2576
2592
  $text.removeClass(className.placeholder);
2577
2593
  }
2578
2594
  module.debug('Changing text', text, $text);
@@ -2591,7 +2607,7 @@ $.fn.dropdown = function(parameters) {
2591
2607
  var
2592
2608
  value = module.get.choiceValue($item),
2593
2609
  searchText = module.get.choiceText($item, false),
2594
- text = module.get.choiceText($item, true)
2610
+ text = module.get.choiceText($item)
2595
2611
  ;
2596
2612
  module.debug('Setting user selection to item', $item);
2597
2613
  module.remove.activeItem();
@@ -2631,13 +2647,13 @@ $.fn.dropdown = function(parameters) {
2631
2647
  module.set.scrollPosition($nextValue);
2632
2648
  $selectedItem.removeClass(className.selected);
2633
2649
  $nextValue.addClass(className.selected);
2634
- if(settings.selectOnKeydown && module.is.single()) {
2650
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
2635
2651
  module.set.selectedItem($nextValue);
2636
2652
  }
2637
2653
  }
2638
2654
  },
2639
2655
  direction: function($menu) {
2640
- if(settings.direction == 'auto') {
2656
+ if(settings.direction === 'auto') {
2641
2657
  // reset position, remove upward if it's base menu
2642
2658
  if (!$menu) {
2643
2659
  module.remove.upward();
@@ -2656,7 +2672,7 @@ $.fn.dropdown = function(parameters) {
2656
2672
  module.set.leftward($menu);
2657
2673
  }
2658
2674
  }
2659
- else if(settings.direction == 'upward') {
2675
+ else if(settings.direction === 'upward') {
2660
2676
  module.set.upward($menu);
2661
2677
  }
2662
2678
  },
@@ -2669,6 +2685,11 @@ $.fn.dropdown = function(parameters) {
2669
2685
  $element.addClass(className.leftward);
2670
2686
  },
2671
2687
  value: function(value, text, $selected, preventChangeTrigger) {
2688
+ if(typeof text === 'boolean') {
2689
+ preventChangeTrigger = text;
2690
+ $selected = undefined;
2691
+ text = undefined;
2692
+ }
2672
2693
  if(value !== undefined && value !== '' && !(Array.isArray(value) && value.length === 0)) {
2673
2694
  $input.removeClass(className.noselection);
2674
2695
  } else {
@@ -2680,8 +2701,7 @@ $.fn.dropdown = function(parameters) {
2680
2701
  currentValue = module.get.values(),
2681
2702
  stringValue = (value !== undefined)
2682
2703
  ? String(value)
2683
- : value,
2684
- newValue
2704
+ : value
2685
2705
  ;
2686
2706
  if(hasInput) {
2687
2707
  if(!settings.allowReselection && stringValue == currentValue) {
@@ -2732,12 +2752,21 @@ $.fn.dropdown = function(parameters) {
2732
2752
  visible: function() {
2733
2753
  $module.addClass(className.visible);
2734
2754
  },
2735
- exactly: function(value, $selectedItem) {
2755
+ exactly: function(value, $selectedItem, preventChangeTrigger) {
2756
+ if(typeof $selectedItem === 'boolean') {
2757
+ preventChangeTrigger = $selectedItem;
2758
+ $selectedItem = undefined;
2759
+ }
2736
2760
  module.debug('Setting selected to exact values');
2737
2761
  module.clear();
2738
- module.set.selected(value, $selectedItem);
2762
+ module.set.selected(value, $selectedItem, preventChangeTrigger);
2739
2763
  },
2740
2764
  selected: function(value, $selectedItem, preventChangeTrigger, keepSearchTerm) {
2765
+ if(typeof $selectedItem === 'boolean') {
2766
+ keepSearchTerm = preventChangeTrigger;
2767
+ preventChangeTrigger = $selectedItem;
2768
+ $selectedItem = undefined;
2769
+ }
2741
2770
  var
2742
2771
  isMultiple = module.is.multiple()
2743
2772
  ;
@@ -2769,23 +2798,30 @@ $.fn.dropdown = function(parameters) {
2769
2798
 
2770
2799
  isFiltered = $selected.hasClass(className.filtered),
2771
2800
  isActive = $selected.hasClass(className.active),
2801
+ isActionable = $selected.hasClass(className.actionable),
2772
2802
  isUserValue = $selected.hasClass(className.addition),
2773
- shouldAnimate = (isMultiple && $selectedItem.length == 1)
2803
+ shouldAnimate = (isMultiple && $selectedItem && $selectedItem.length === 1)
2774
2804
  ;
2775
- if(isMultiple) {
2805
+ if(isActionable){
2806
+ if((!isMultiple || (!isActive || isUserValue)) && settings.apiSettings && settings.saveRemoteData) {
2807
+ module.save.remoteData(selectedText, selectedValue);
2808
+ }
2809
+ settings.onActionable.call(element, selectedValue, selectedText, $selected);
2810
+ }
2811
+ else if(isMultiple) {
2776
2812
  if(!isActive || isUserValue) {
2777
2813
  if(settings.apiSettings && settings.saveRemoteData) {
2778
2814
  module.save.remoteData(selectedText, selectedValue);
2779
2815
  }
2780
2816
  if(settings.useLabels) {
2817
+ module.add.value(selectedValue, selectedText, $selected, preventChangeTrigger);
2781
2818
  module.add.label(selectedValue, selectedText, shouldAnimate);
2782
- module.add.value(selectedValue, selectedText, $selected);
2783
2819
  module.set.activeItem($selected);
2784
2820
  module.filterActive();
2785
2821
  module.select.nextAvailable($selectedItem);
2786
2822
  }
2787
2823
  else {
2788
- module.add.value(selectedValue, selectedText, $selected);
2824
+ module.add.value(selectedValue, selectedText, $selected, preventChangeTrigger);
2789
2825
  module.set.text(module.add.variables(message.count));
2790
2826
  module.set.activeItem($selected);
2791
2827
  }
@@ -2799,8 +2835,8 @@ $.fn.dropdown = function(parameters) {
2799
2835
  if(settings.apiSettings && settings.saveRemoteData) {
2800
2836
  module.save.remoteData(selectedText, selectedValue);
2801
2837
  }
2802
- if (!keepSearchTerm) {
2803
- module.set.text(selectedText);
2838
+ if (!keepSearchTerm && !$selected.hasClass(className.actionable)) {
2839
+ module.set.text(selectedText, true);
2804
2840
  }
2805
2841
  module.set.value(selectedValue, selectedText, $selected, preventChangeTrigger);
2806
2842
  $selected
@@ -2813,6 +2849,10 @@ $.fn.dropdown = function(parameters) {
2813
2849
  if (!keepSearchTerm) {
2814
2850
  module.remove.searchTerm();
2815
2851
  }
2852
+ if(module.is.allFiltered()) {
2853
+ module.set.empty();
2854
+ module.hideMenu();
2855
+ }
2816
2856
  }
2817
2857
  },
2818
2858
 
@@ -2851,6 +2891,7 @@ $.fn.dropdown = function(parameters) {
2851
2891
  animation : settings.label.transition,
2852
2892
  debug : settings.debug,
2853
2893
  verbose : settings.verbose,
2894
+ silent : settings.silent,
2854
2895
  duration : settings.label.duration
2855
2896
  })
2856
2897
  ;
@@ -2873,7 +2914,7 @@ $.fn.dropdown = function(parameters) {
2873
2914
  ;
2874
2915
  }
2875
2916
  else {
2876
- $message = $('<div/>')
2917
+ $('<div/>')
2877
2918
  .html(html)
2878
2919
  .addClass(className.message)
2879
2920
  .appendTo($menu)
@@ -2898,7 +2939,7 @@ $.fn.dropdown = function(parameters) {
2898
2939
  $('<option/>')
2899
2940
  .prop('value', escapedValue)
2900
2941
  .addClass(className.addition)
2901
- .html(value)
2942
+ .text(value)
2902
2943
  .appendTo($input)
2903
2944
  ;
2904
2945
  module.verbose('Adding user addition as an <option>', value);
@@ -2956,16 +2997,13 @@ $.fn.dropdown = function(parameters) {
2956
2997
  hasCount = (message.search('{count}') !== -1),
2957
2998
  hasMaxCount = (message.search('{maxCount}') !== -1),
2958
2999
  hasTerm = (message.search('{term}') !== -1),
2959
- count,
2960
3000
  query
2961
3001
  ;
2962
3002
  module.verbose('Adding templated variables to message', message);
2963
3003
  if(hasCount) {
2964
- count = module.get.selectionCount();
2965
- message = message.replace('{count}', count);
3004
+ message = message.replace('{count}', module.get.selectionCount());
2966
3005
  }
2967
3006
  if(hasMaxCount) {
2968
- count = module.get.selectionCount();
2969
3007
  message = message.replace('{maxCount}', settings.maxSelections);
2970
3008
  }
2971
3009
  if(hasTerm) {
@@ -2974,7 +3012,12 @@ $.fn.dropdown = function(parameters) {
2974
3012
  }
2975
3013
  return message;
2976
3014
  },
2977
- value: function(addedValue, addedText, $selectedItem) {
3015
+ value: function(addedValue, addedText, $selectedItem, preventChangeTrigger) {
3016
+ if(typeof addedText === 'boolean') {
3017
+ preventChangeTrigger = addedText;
3018
+ $selectedItem = undefined;
3019
+ addedText = undefined;
3020
+ }
2978
3021
  var
2979
3022
  currentValue = module.get.values(true),
2980
3023
  newValue
@@ -2989,7 +3032,7 @@ $.fn.dropdown = function(parameters) {
2989
3032
  }
2990
3033
  // extend current array
2991
3034
  if(Array.isArray(currentValue)) {
2992
- newValue = currentValue.concat([addedValue]);
3035
+ newValue = $selectedItem && $selectedItem.hasClass(className.actionable) ? currentValue : currentValue.concat([addedValue]);
2993
3036
  newValue = module.get.uniqueArray(newValue);
2994
3037
  }
2995
3038
  else {
@@ -3013,7 +3056,7 @@ $.fn.dropdown = function(parameters) {
3013
3056
  else {
3014
3057
  settings.onAdd.call(element, addedValue, addedText, $selectedItem);
3015
3058
  }
3016
- module.set.value(newValue, addedText, $selectedItem);
3059
+ module.set.value(newValue, addedText, $selectedItem, preventChangeTrigger);
3017
3060
  module.check.maxSelections();
3018
3061
  },
3019
3062
  },
@@ -3142,10 +3185,9 @@ $.fn.dropdown = function(parameters) {
3142
3185
  },
3143
3186
  value: function(removedValue, removedText, $removedItem, preventChangeTrigger) {
3144
3187
  var
3145
- values = module.get.values(),
3188
+ values = module.get.values(true),
3146
3189
  newValue
3147
3190
  ;
3148
- removedValue = module.escape.htmlEntities(removedValue);
3149
3191
  if( module.has.selectInput() ) {
3150
3192
  module.verbose('Input is <select> removing selected option', removedValue);
3151
3193
  newValue = module.remove.arrayValue(removedValue, values);
@@ -3375,8 +3417,14 @@ $.fn.dropdown = function(parameters) {
3375
3417
  bubbledIconClick: function(event) {
3376
3418
  return $(event.target).closest($icon).length > 0;
3377
3419
  },
3420
+ edge: function() {
3421
+ return !!window.chrome && !!window.StyleMedia;
3422
+ },
3423
+ empty: function() {
3424
+ return $module.hasClass(className.empty);
3425
+ },
3378
3426
  chrome: function() {
3379
- return !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);
3427
+ return !!window.chrome && !window.StyleMedia;
3380
3428
  },
3381
3429
  alreadySetup: function() {
3382
3430
  return ($module.is('select') && $module.parent(selector.dropdown).data(moduleNamespace) !== undefined && $module.prev().length === 0);
@@ -3404,7 +3452,7 @@ $.fn.dropdown = function(parameters) {
3404
3452
  return (document.activeElement === $search[0]);
3405
3453
  },
3406
3454
  allFiltered: function() {
3407
- return( (module.is.multiple() || module.has.search()) && !(settings.hideAdditions == false && module.has.userSuggestion()) && !module.has.message() && module.has.allResultsFiltered() );
3455
+ return( (module.is.multiple() || module.has.search()) && !(!settings.hideAdditions && module.has.userSuggestion()) && !module.has.message() && module.has.allResultsFiltered() );
3408
3456
  },
3409
3457
  hidden: function($subMenu) {
3410
3458
  return !module.is.visible($subMenu);
@@ -3451,8 +3499,8 @@ $.fn.dropdown = function(parameters) {
3451
3499
  search: function() {
3452
3500
  return $module.hasClass(className.search);
3453
3501
  },
3454
- searchSelection: function() {
3455
- return ( module.has.search() && $search.parent(selector.dropdown).length === 1 );
3502
+ searchSelection: function(deep) {
3503
+ return ( module.has.search() && (deep ? $search.parents(selector.dropdown) : $search.parent(selector.dropdown)).length === 1 );
3456
3504
  },
3457
3505
  selection: function() {
3458
3506
  return $module.hasClass(className.selection);
@@ -3472,7 +3520,7 @@ $.fn.dropdown = function(parameters) {
3472
3520
  },
3473
3521
  verticallyScrollableContext: function() {
3474
3522
  var
3475
- overflowY = ($context.get(0) !== window)
3523
+ overflowY = ($context[0] !== window)
3476
3524
  ? $context.css('overflow-y')
3477
3525
  : false
3478
3526
  ;
@@ -3480,7 +3528,7 @@ $.fn.dropdown = function(parameters) {
3480
3528
  },
3481
3529
  horizontallyScrollableContext: function() {
3482
3530
  var
3483
- overflowX = ($context.get(0) !== window)
3531
+ overflowX = ($context[0] !== window)
3484
3532
  ? $context.css('overflow-X')
3485
3533
  : false
3486
3534
  ;
@@ -3490,22 +3538,17 @@ $.fn.dropdown = function(parameters) {
3490
3538
 
3491
3539
  can: {
3492
3540
  activate: function($item) {
3493
- if(settings.useLabels) {
3494
- return true;
3495
- }
3496
- if(!module.has.maxSelections()) {
3497
- return true;
3498
- }
3499
- if(module.has.maxSelections() && $item.hasClass(className.active)) {
3500
- return true;
3501
- }
3502
- return false;
3541
+ return (
3542
+ settings.useLabels ||
3543
+ !module.has.maxSelections() ||
3544
+ (module.has.maxSelections() && $item.hasClass(className.active))
3545
+ );
3503
3546
  },
3504
3547
  openDownward: function($subMenu) {
3505
3548
  var
3506
3549
  $currentMenu = $subMenu || $menu,
3507
- canOpenDownward = true,
3508
- onScreen = {},
3550
+ canOpenDownward,
3551
+ onScreen,
3509
3552
  calculations
3510
3553
  ;
3511
3554
  $currentMenu
@@ -3513,7 +3556,7 @@ $.fn.dropdown = function(parameters) {
3513
3556
  ;
3514
3557
  calculations = {
3515
3558
  context: {
3516
- offset : ($context.get(0) === window)
3559
+ offset : ($context[0] === window)
3517
3560
  ? { top: 0, left: 0}
3518
3561
  : $context.offset(),
3519
3562
  scrollTop : $context.scrollTop(),
@@ -3561,7 +3604,7 @@ $.fn.dropdown = function(parameters) {
3561
3604
  ;
3562
3605
  calculations = {
3563
3606
  context: {
3564
- offset : ($context.get(0) === window)
3607
+ offset : ($context[0] === window)
3565
3608
  ? { top: 0, left: 0}
3566
3609
  : $context.offset(),
3567
3610
  scrollLeft : $context.scrollLeft(),
@@ -3583,9 +3626,6 @@ $.fn.dropdown = function(parameters) {
3583
3626
  $currentMenu.removeClass(className.loading);
3584
3627
  return canOpenRightward;
3585
3628
  },
3586
- click: function() {
3587
- return (hasTouch || settings.on == 'click');
3588
- },
3589
3629
  extendSelect: function() {
3590
3630
  return settings.allowAdditions || settings.apiSettings;
3591
3631
  },
@@ -3634,6 +3674,7 @@ $.fn.dropdown = function(parameters) {
3634
3674
  animation : transition + ' in',
3635
3675
  debug : settings.debug,
3636
3676
  verbose : settings.verbose,
3677
+ silent : settings.silent,
3637
3678
  duration : settings.transition.showDuration || settings.duration,
3638
3679
  queue : true,
3639
3680
  onStart : start,
@@ -3655,9 +3696,7 @@ $.fn.dropdown = function(parameters) {
3655
3696
  start = ($subMenu)
3656
3697
  ? function() {}
3657
3698
  : function() {
3658
- if( module.can.click() ) {
3659
- module.unbind.intent();
3660
- }
3699
+ module.unbind.intent();
3661
3700
  module.remove.active();
3662
3701
  },
3663
3702
  transition = settings.transition.hideMethod || module.get.transition($subMenu)
@@ -3683,6 +3722,7 @@ $.fn.dropdown = function(parameters) {
3683
3722
  duration : settings.transition.hideDuration || settings.duration,
3684
3723
  debug : settings.debug,
3685
3724
  verbose : settings.verbose,
3725
+ silent : settings.silent,
3686
3726
  queue : false,
3687
3727
  onStart : start,
3688
3728
  displayType: module.get.displayType(),
@@ -3768,7 +3808,7 @@ $.fn.dropdown = function(parameters) {
3768
3808
  }
3769
3809
  ;
3770
3810
  if(shouldEscape.test(string)) {
3771
- string = string.replace(/&(?![a-z0-9#]{1,6};)/, "&amp;");
3811
+ string = string.replace(/&(?![a-z0-9#]{1,12};)/gi, "&amp;");
3772
3812
  return string.replace(badChars, escapedChar);
3773
3813
  }
3774
3814
  return string;
@@ -3890,7 +3930,7 @@ $.fn.dropdown = function(parameters) {
3890
3930
  response
3891
3931
  ;
3892
3932
  passedArguments = passedArguments || queryArguments;
3893
- context = element || context;
3933
+ context = context || element;
3894
3934
  if(typeof query == 'string' && object !== undefined) {
3895
3935
  query = query.split(/[\. ]/);
3896
3936
  maxDepth = query.length - 1;
@@ -4020,6 +4060,8 @@ $.fn.dropdown.settings = {
4020
4060
 
4021
4061
  headerDivider : true, // whether option headers should have an additional divider line underneath when converted from <select> <optgroup>
4022
4062
 
4063
+ collapseOnActionable : true, // whether the dropdown should collapse upon selection of an actionable item
4064
+
4023
4065
  // label settings on multi-select
4024
4066
  label: {
4025
4067
  transition : 'scale',
@@ -4032,13 +4074,13 @@ $.fn.dropdown.settings = {
4032
4074
  hide : 300,
4033
4075
  show : 200,
4034
4076
  search : 20,
4035
- touch : 50
4036
4077
  },
4037
4078
 
4038
4079
  /* Callbacks */
4039
4080
  onChange : function(value, text, $selected){},
4040
4081
  onAdd : function(value, text, $selected){},
4041
4082
  onRemove : function(value, text, $selected){},
4083
+ onActionable : function(value, text, $selected){},
4042
4084
  onSearch : function(searchTerm){},
4043
4085
 
4044
4086
  onLabelSelect : function($selectedLabels){},
@@ -4101,12 +4143,12 @@ $.fn.dropdown.settings = {
4101
4143
  icon : 'icon', // optional icon name
4102
4144
  iconClass : 'iconClass', // optional individual class for icon (for example to use flag instead)
4103
4145
  class : 'class', // optional individual class for item/header
4104
- divider : 'divider' // optional divider append for group headers
4146
+ divider : 'divider', // optional divider append for group headers
4147
+ actionable : 'actionable' // optional actionable item
4105
4148
  },
4106
4149
 
4107
4150
  keys : {
4108
4151
  backspace : 8,
4109
- delimiter : 188, // comma
4110
4152
  deleteKey : 46,
4111
4153
  enter : 13,
4112
4154
  escape : 27,
@@ -4173,7 +4215,8 @@ $.fn.dropdown.settings = {
4173
4215
  header : 'header',
4174
4216
  divider : 'divider',
4175
4217
  groupIcon : '',
4176
- unfilterable : 'unfilterable'
4218
+ unfilterable : 'unfilterable',
4219
+ actionable : 'actionable'
4177
4220
  }
4178
4221
 
4179
4222
  };
@@ -4202,7 +4245,7 @@ $.fn.dropdown.settings.templates = {
4202
4245
  }
4203
4246
  ;
4204
4247
  if(shouldEscape.test(string)) {
4205
- string = string.replace(/&(?![a-z0-9#]{1,6};)/, "&amp;");
4248
+ string = string.replace(/&(?![a-z0-9#]{1,12};)/gi, "&amp;");
4206
4249
  return string.replace(badChars, escapedChar);
4207
4250
  }
4208
4251
  return string;
@@ -4212,7 +4255,8 @@ $.fn.dropdown.settings.templates = {
4212
4255
  var
4213
4256
  placeholder = select.placeholder || false,
4214
4257
  html = '',
4215
- escape = $.fn.dropdown.settings.templates.escape
4258
+ escape = $.fn.dropdown.settings.templates.escape,
4259
+ deQuote = $.fn.dropdown.settings.templates.deQuote
4216
4260
  ;
4217
4261
  html += '<i class="dropdown icon"></i>';
4218
4262
  if(placeholder) {
@@ -4221,7 +4265,7 @@ $.fn.dropdown.settings.templates = {
4221
4265
  else {
4222
4266
  html += '<div class="text"></div>';
4223
4267
  }
4224
- html += '<div class="'+className.menu+'">';
4268
+ html += '<div class="'+deQuote(className.menu)+'">';
4225
4269
  html += $.fn.dropdown.settings.templates.menu(select, fields, preserveHTML,className);
4226
4270
  html += '</div>';
4227
4271
  return html;
@@ -4248,6 +4292,9 @@ $.fn.dropdown.settings.templates = {
4248
4292
  maybeText = (option[fields.text])
4249
4293
  ? ' data-text="' + deQuote(option[fields.text],true) + '"'
4250
4294
  : '',
4295
+ maybeActionable = (option[fields.actionable])
4296
+ ? className.actionable+' '
4297
+ : '',
4251
4298
  maybeDisabled = (option[fields.disabled])
4252
4299
  ? className.disabled+' '
4253
4300
  : '',
@@ -4256,27 +4303,27 @@ $.fn.dropdown.settings.templates = {
4256
4303
  : '',
4257
4304
  hasDescription = (escape(option[fields.description] || '', preserveHTML) != '')
4258
4305
  ;
4259
- html += '<div class="'+ maybeDisabled + maybeDescriptionVertical + (option[fields.class] ? deQuote(option[fields.class]) : className.item)+'" data-value="' + deQuote(option[fields.value],true) + '"' + maybeText + '>';
4306
+ html += '<div class="'+ deQuote(maybeActionable + maybeDisabled + maybeDescriptionVertical + (option[fields.class] ? option[fields.class] : className.item))+'" data-value="' + deQuote(option[fields.value],true) + '"' + maybeText + '>';
4260
4307
  if (isMenu) {
4261
4308
  html += '<i class="'+ (itemType.indexOf('left') !== -1 ? 'left' : '') + ' dropdown icon"></i>';
4262
4309
  }
4263
4310
  if(option[fields.image]) {
4264
- html += '<img class="'+(option[fields.imageClass] ? deQuote(option[fields.imageClass]) : className.image)+'" src="' + deQuote(option[fields.image]) + '">';
4311
+ html += '<img class="'+deQuote(option[fields.imageClass] ? option[fields.imageClass] : className.image)+'" src="' + deQuote(option[fields.image]) + '">';
4265
4312
  }
4266
4313
  if(option[fields.icon]) {
4267
- html += '<i class="'+deQuote(option[fields.icon])+' '+(option[fields.iconClass] ? deQuote(option[fields.iconClass]) : className.icon)+'"></i>';
4314
+ html += '<i class="'+deQuote(option[fields.icon]+' '+(option[fields.iconClass] ? option[fields.iconClass] : className.icon))+'"></i>';
4268
4315
  }
4269
4316
  if(hasDescription){
4270
- html += '<span class="'+ className.description +'">'+ escape(option[fields.description] || '', preserveHTML) + '</span>';
4271
- html += (!isMenu) ? '<span class="'+ className.text + '">' : '';
4317
+ html += '<span class="'+ deQuote(className.description) +'">'+ escape(option[fields.description] || '', preserveHTML) + '</span>';
4318
+ html += (!isMenu) ? '<span class="'+ deQuote(className.text) + '">' : '';
4272
4319
  }
4273
4320
  if (isMenu) {
4274
- html += '<span class="' + className.text + '">';
4321
+ html += '<span class="' + deQuote(className.text) + '">';
4275
4322
  }
4276
4323
  html += escape(option[fields.name] || '', preserveHTML);
4277
4324
  if (isMenu) {
4278
4325
  html += '</span>';
4279
- html += '<div class="' + itemType + '">';
4326
+ html += '<div class="' + deQuote(itemType) + '">';
4280
4327
  html += $.fn.dropdown.settings.templates.menu(option, fields, preserveHTML, className);
4281
4328
  html += '</div>';
4282
4329
  } else if(hasDescription){
@@ -4285,18 +4332,18 @@ $.fn.dropdown.settings.templates = {
4285
4332
  html += '</div>';
4286
4333
  } else if (itemType === 'header') {
4287
4334
  var groupName = escape(option[fields.name] || '', preserveHTML),
4288
- groupIcon = option[fields.icon] ? deQuote(option[fields.icon]) : className.groupIcon
4335
+ groupIcon = deQuote(option[fields.icon] ? option[fields.icon] : className.groupIcon)
4289
4336
  ;
4290
4337
  if(groupName !== '' || groupIcon !== '') {
4291
- html += '<div class="' + (option[fields.class] ? deQuote(option[fields.class]) : className.header) + '">';
4338
+ html += '<div class="' + deQuote(option[fields.class] ? option[fields.class] : className.header) + '">';
4292
4339
  if (groupIcon !== '') {
4293
- html += '<i class="' + groupIcon + ' ' + (option[fields.iconClass] ? deQuote(option[fields.iconClass]) : className.icon) + '"></i>';
4340
+ html += '<i class="' + deQuote(groupIcon + ' ' + (option[fields.iconClass] ? option[fields.iconClass] : className.icon)) + '"></i>';
4294
4341
  }
4295
4342
  html += groupName;
4296
4343
  html += '</div>';
4297
4344
  }
4298
4345
  if(option[fields.divider]){
4299
- html += '<div class="'+className.divider+'"></div>';
4346
+ html += '<div class="'+deQuote(className.divider)+'"></div>';
4300
4347
  }
4301
4348
  }
4302
4349
  });
@@ -4306,8 +4353,10 @@ $.fn.dropdown.settings.templates = {
4306
4353
  // generates label for multiselect
4307
4354
  label: function(value, text, preserveHTML, className) {
4308
4355
  var
4309
- escape = $.fn.dropdown.settings.templates.escape;
4310
- return escape(text,preserveHTML) + '<i class="'+className.delete+' icon"></i>';
4356
+ escape = $.fn.dropdown.settings.templates.escape,
4357
+ deQuote = $.fn.dropdown.settings.templates.deQuote
4358
+ ;
4359
+ return escape(text,preserveHTML) + '<i class="'+deQuote(className.delete)+' icon"></i>';
4311
4360
  },
4312
4361
 
4313
4362