fomantic-ui 2.9.0-beta.32 → 2.9.0-beta.321

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 (424) hide show
  1. package/.all-contributorsrc +274 -4
  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/CONTRIBUTORS.md +86 -37
  9. package/FAQ.md +38 -38
  10. package/README.md +8 -8
  11. package/dist/components/accordion.css +176 -36
  12. package/dist/components/accordion.js +10 -4
  13. package/dist/components/accordion.min.css +2 -2
  14. package/dist/components/accordion.min.js +3 -3
  15. package/dist/components/ad.css +4 -4
  16. package/dist/components/ad.min.css +2 -2
  17. package/dist/components/api.js +92 -33
  18. package/dist/components/api.min.js +3 -3
  19. package/dist/components/breadcrumb.css +1 -1
  20. package/dist/components/breadcrumb.min.css +1 -1
  21. package/dist/components/button.css +204 -157
  22. package/dist/components/button.min.css +2 -2
  23. package/dist/components/calendar.css +18 -1
  24. package/dist/components/calendar.js +93 -74
  25. package/dist/components/calendar.min.css +2 -2
  26. package/dist/components/calendar.min.js +3 -3
  27. package/dist/components/card.css +754 -117
  28. package/dist/components/card.min.css +2 -2
  29. package/dist/components/checkbox.css +92 -91
  30. package/dist/components/checkbox.js +21 -14
  31. package/dist/components/checkbox.min.css +2 -2
  32. package/dist/components/checkbox.min.js +3 -3
  33. package/dist/components/comment.css +12 -12
  34. package/dist/components/comment.min.css +2 -2
  35. package/dist/components/container.css +98 -4
  36. package/dist/components/container.min.css +2 -2
  37. package/dist/components/dimmer.css +33 -18
  38. package/dist/components/dimmer.js +19 -10
  39. package/dist/components/dimmer.min.css +2 -2
  40. package/dist/components/dimmer.min.js +3 -3
  41. package/dist/components/divider.css +31 -31
  42. package/dist/components/divider.min.css +2 -2
  43. package/dist/components/dropdown.css +100 -50
  44. package/dist/components/dropdown.js +212 -187
  45. package/dist/components/dropdown.min.css +2 -2
  46. package/dist/components/dropdown.min.js +3 -3
  47. package/dist/components/embed.css +5 -5
  48. package/dist/components/embed.js +14 -10
  49. package/dist/components/embed.min.css +2 -2
  50. package/dist/components/embed.min.js +3 -3
  51. package/dist/components/emoji.css +10799 -8841
  52. package/dist/components/emoji.min.css +1 -1
  53. package/dist/components/feed.css +29 -29
  54. package/dist/components/feed.min.css +2 -2
  55. package/dist/components/flag.css +1021 -915
  56. package/dist/components/flag.min.css +2 -2
  57. package/dist/components/flyout.css +592 -0
  58. package/dist/components/flyout.js +1529 -0
  59. package/dist/components/flyout.min.css +9 -0
  60. package/dist/components/flyout.min.js +11 -0
  61. package/dist/components/form.css +160 -83
  62. package/dist/components/form.js +46 -42
  63. package/dist/components/form.min.css +2 -2
  64. package/dist/components/form.min.js +3 -3
  65. package/dist/components/grid.css +25 -21
  66. package/dist/components/grid.min.css +2 -2
  67. package/dist/components/header.css +6 -4
  68. package/dist/components/header.min.css +2 -2
  69. package/dist/components/icon.css +2063 -1984
  70. package/dist/components/icon.min.css +2 -2
  71. package/dist/components/image.css +1 -1
  72. package/dist/components/image.min.css +1 -1
  73. package/dist/components/input.css +759 -22
  74. package/dist/components/input.min.css +2 -2
  75. package/dist/components/item.css +17 -17
  76. package/dist/components/item.min.css +2 -2
  77. package/dist/components/label.css +72 -68
  78. package/dist/components/label.min.css +2 -2
  79. package/dist/components/list.css +31 -31
  80. package/dist/components/list.min.css +2 -2
  81. package/dist/components/loader.css +352 -352
  82. package/dist/components/loader.min.css +2 -2
  83. package/dist/components/menu.css +108 -76
  84. package/dist/components/menu.min.css +1 -1
  85. package/dist/components/message.css +43 -43
  86. package/dist/components/message.min.css +2 -2
  87. package/dist/components/modal.css +37 -6
  88. package/dist/components/modal.js +187 -84
  89. package/dist/components/modal.min.css +2 -2
  90. package/dist/components/modal.min.js +3 -3
  91. package/dist/components/nag.css +1 -1
  92. package/dist/components/nag.js +3 -3
  93. package/dist/components/nag.min.css +1 -1
  94. package/dist/components/nag.min.js +3 -3
  95. package/dist/components/placeholder.css +33 -33
  96. package/dist/components/placeholder.min.css +2 -2
  97. package/dist/components/popup.css +100 -104
  98. package/dist/components/popup.js +17 -23
  99. package/dist/components/popup.min.css +2 -2
  100. package/dist/components/popup.min.js +3 -3
  101. package/dist/components/progress.css +1 -1
  102. package/dist/components/progress.js +6 -3
  103. package/dist/components/progress.min.css +1 -1
  104. package/dist/components/progress.min.js +3 -3
  105. package/dist/components/rail.css +1 -1
  106. package/dist/components/rail.min.css +1 -1
  107. package/dist/components/rating.css +1 -1
  108. package/dist/components/rating.js +8 -4
  109. package/dist/components/rating.min.css +1 -1
  110. package/dist/components/rating.min.js +3 -3
  111. package/dist/components/reset.css +5 -4
  112. package/dist/components/reset.min.css +2 -2
  113. package/dist/components/reveal.css +1 -1
  114. package/dist/components/reveal.min.css +1 -1
  115. package/dist/components/search.css +6 -6
  116. package/dist/components/search.js +48 -21
  117. package/dist/components/search.min.css +2 -2
  118. package/dist/components/search.min.js +3 -3
  119. package/dist/components/segment.css +118 -34
  120. package/dist/components/segment.min.css +2 -2
  121. package/dist/components/shape.css +1 -1
  122. package/dist/components/shape.js +4 -4
  123. package/dist/components/shape.min.css +1 -1
  124. package/dist/components/shape.min.js +3 -3
  125. package/dist/components/sidebar.css +23 -9
  126. package/dist/components/sidebar.js +141 -44
  127. package/dist/components/sidebar.min.css +2 -2
  128. package/dist/components/sidebar.min.js +3 -3
  129. package/dist/components/site.css +139 -42
  130. package/dist/components/site.js +2 -2
  131. package/dist/components/site.min.css +2 -2
  132. package/dist/components/site.min.js +3 -3
  133. package/dist/components/slider.css +17 -17
  134. package/dist/components/slider.js +79 -64
  135. package/dist/components/slider.min.css +1 -1
  136. package/dist/components/slider.min.js +3 -3
  137. package/dist/components/state.js +3 -3
  138. package/dist/components/state.min.js +3 -3
  139. package/dist/components/statistic.css +4 -4
  140. package/dist/components/statistic.min.css +2 -2
  141. package/dist/components/step.css +31 -31
  142. package/dist/components/step.min.css +2 -2
  143. package/dist/components/sticky.css +1 -1
  144. package/dist/components/sticky.js +11 -18
  145. package/dist/components/sticky.min.css +1 -1
  146. package/dist/components/sticky.min.js +3 -3
  147. package/dist/components/tab.css +5 -5
  148. package/dist/components/tab.js +25 -7
  149. package/dist/components/tab.min.css +2 -2
  150. package/dist/components/tab.min.js +3 -3
  151. package/dist/components/table.css +1684 -272
  152. package/dist/components/table.min.css +2 -2
  153. package/dist/components/text.css +1 -1
  154. package/dist/components/text.min.css +1 -1
  155. package/dist/components/toast.css +43 -1
  156. package/dist/components/toast.js +68 -34
  157. package/dist/components/toast.min.css +2 -2
  158. package/dist/components/toast.min.js +3 -3
  159. package/dist/components/transition.css +1 -1
  160. package/dist/components/transition.js +27 -22
  161. package/dist/components/transition.min.css +1 -1
  162. package/dist/components/transition.min.js +3 -3
  163. package/dist/components/visibility.js +5 -5
  164. package/dist/components/visibility.min.js +3 -3
  165. package/dist/semantic.css +42008 -34578
  166. package/dist/semantic.js +2719 -763
  167. package/dist/semantic.min.css +3 -3
  168. package/dist/semantic.min.js +3 -3
  169. package/dist/themes/default/assets/fonts/Lato-Bold.woff +0 -0
  170. package/dist/themes/default/assets/fonts/Lato-Bold.woff2 +0 -0
  171. package/dist/themes/default/assets/fonts/Lato-BoldItalic.woff +0 -0
  172. package/dist/themes/default/assets/fonts/Lato-BoldItalic.woff2 +0 -0
  173. package/dist/themes/default/assets/fonts/Lato-Italic.woff +0 -0
  174. package/dist/themes/default/assets/fonts/Lato-Italic.woff2 +0 -0
  175. package/dist/themes/default/assets/fonts/Lato-Regular.woff +0 -0
  176. package/dist/themes/default/assets/fonts/Lato-Regular.woff2 +0 -0
  177. package/dist/themes/default/assets/fonts/LatoLatin-Bold.woff +0 -0
  178. package/dist/themes/default/assets/fonts/LatoLatin-Bold.woff2 +0 -0
  179. package/dist/themes/default/assets/fonts/LatoLatin-BoldItalic.woff +0 -0
  180. package/dist/themes/default/assets/fonts/LatoLatin-BoldItalic.woff2 +0 -0
  181. package/dist/themes/default/assets/fonts/LatoLatin-Italic.woff +0 -0
  182. package/dist/themes/default/assets/fonts/LatoLatin-Italic.woff2 +0 -0
  183. package/dist/themes/default/assets/fonts/LatoLatin-Regular.woff +0 -0
  184. package/dist/themes/default/assets/fonts/LatoLatin-Regular.woff2 +0 -0
  185. package/dist/themes/default/assets/fonts/brand-icons.eot +0 -0
  186. package/dist/themes/default/assets/fonts/brand-icons.svg +801 -654
  187. package/dist/themes/default/assets/fonts/brand-icons.ttf +0 -0
  188. package/dist/themes/default/assets/fonts/brand-icons.woff +0 -0
  189. package/dist/themes/default/assets/fonts/brand-icons.woff2 +0 -0
  190. package/dist/themes/default/assets/fonts/icons.eot +0 -0
  191. package/dist/themes/default/assets/fonts/icons.svg +1175 -1079
  192. package/dist/themes/default/assets/fonts/icons.ttf +0 -0
  193. package/dist/themes/default/assets/fonts/icons.woff +0 -0
  194. package/dist/themes/default/assets/fonts/icons.woff2 +0 -0
  195. package/dist/themes/default/assets/fonts/outline-icons.eot +0 -0
  196. package/dist/themes/default/assets/fonts/outline-icons.svg +93 -95
  197. package/dist/themes/default/assets/fonts/outline-icons.ttf +0 -0
  198. package/dist/themes/default/assets/fonts/outline-icons.woff +0 -0
  199. package/dist/themes/default/assets/fonts/outline-icons.woff2 +0 -0
  200. package/dist/themes/{default → famfamfam}/assets/images/flags.png +0 -0
  201. package/examples/assets/library/iframe-content.js +8 -8
  202. package/examples/assets/library/iframe.js +3 -3
  203. package/examples/components/button.html +1 -1
  204. package/examples/components/card.html +1 -1
  205. package/examples/components/input.html +1 -1
  206. package/examples/components/menu.html +1 -1
  207. package/examples/components/site.html +1 -1
  208. package/examples/components/table.html +1 -1
  209. package/package.json +18 -16
  210. package/scripts/nightly-version.js +47 -38
  211. package/src/definitions/behaviors/api.js +91 -32
  212. package/src/definitions/behaviors/form.js +45 -41
  213. package/src/definitions/behaviors/state.js +2 -2
  214. package/src/definitions/behaviors/visibility.js +4 -4
  215. package/src/definitions/collections/form.less +229 -166
  216. package/src/definitions/collections/grid.less +723 -687
  217. package/src/definitions/collections/menu.less +232 -170
  218. package/src/definitions/collections/message.less +49 -47
  219. package/src/definitions/collections/table.less +882 -272
  220. package/src/definitions/elements/button.less +611 -469
  221. package/src/definitions/elements/container.less +145 -8
  222. package/src/definitions/elements/divider.less +24 -24
  223. package/src/definitions/elements/emoji.less +39 -10
  224. package/src/definitions/elements/flag.less +54 -18
  225. package/src/definitions/elements/header.less +46 -37
  226. package/src/definitions/elements/icon.less +39 -32
  227. package/src/definitions/elements/input.less +281 -33
  228. package/src/definitions/elements/label.less +132 -128
  229. package/src/definitions/elements/list.less +84 -75
  230. package/src/definitions/elements/loader.less +99 -98
  231. package/src/definitions/elements/placeholder.less +32 -32
  232. package/src/definitions/elements/segment.less +177 -56
  233. package/src/definitions/elements/step.less +76 -72
  234. package/src/definitions/elements/text.less +17 -15
  235. package/src/definitions/globals/reset.less +2 -2
  236. package/src/definitions/globals/site.js +1 -1
  237. package/src/definitions/globals/site.less +25 -2
  238. package/src/definitions/modules/accordion.js +9 -3
  239. package/src/definitions/modules/accordion.less +371 -219
  240. package/src/definitions/modules/calendar.js +92 -73
  241. package/src/definitions/modules/calendar.less +20 -0
  242. package/src/definitions/modules/checkbox.js +20 -13
  243. package/src/definitions/modules/checkbox.less +83 -227
  244. package/src/definitions/modules/dimmer.js +18 -9
  245. package/src/definitions/modules/dimmer.less +26 -12
  246. package/src/definitions/modules/dropdown.js +211 -186
  247. package/src/definitions/modules/dropdown.less +201 -136
  248. package/src/definitions/modules/embed.js +13 -9
  249. package/src/definitions/modules/embed.less +4 -4
  250. package/src/definitions/modules/flyout.js +1529 -0
  251. package/src/definitions/modules/flyout.less +650 -0
  252. package/src/definitions/modules/modal.js +186 -83
  253. package/src/definitions/modules/modal.less +70 -33
  254. package/src/definitions/modules/nag.js +2 -2
  255. package/src/definitions/modules/nag.less +20 -19
  256. package/src/definitions/modules/popup.js +16 -22
  257. package/src/definitions/modules/popup.less +86 -90
  258. package/src/definitions/modules/progress.js +5 -2
  259. package/src/definitions/modules/progress.less +19 -18
  260. package/src/definitions/modules/rating.js +7 -3
  261. package/src/definitions/modules/rating.less +35 -34
  262. package/src/definitions/modules/search.js +47 -20
  263. package/src/definitions/modules/search.less +35 -19
  264. package/src/definitions/modules/shape.js +3 -3
  265. package/src/definitions/modules/sidebar.js +140 -43
  266. package/src/definitions/modules/sidebar.less +53 -24
  267. package/src/definitions/modules/slider.js +78 -63
  268. package/src/definitions/modules/slider.less +48 -47
  269. package/src/definitions/modules/sticky.js +10 -17
  270. package/src/definitions/modules/sticky.less +3 -1
  271. package/src/definitions/modules/tab.js +24 -6
  272. package/src/definitions/modules/tab.less +4 -4
  273. package/src/definitions/modules/toast.js +67 -33
  274. package/src/definitions/modules/toast.less +52 -16
  275. package/src/definitions/modules/transition.js +26 -21
  276. package/src/definitions/views/ad.less +3 -3
  277. package/src/definitions/views/card.less +522 -375
  278. package/src/definitions/views/comment.less +93 -82
  279. package/src/definitions/views/feed.less +164 -144
  280. package/src/definitions/views/item.less +251 -198
  281. package/src/definitions/views/statistic.less +91 -89
  282. package/src/semantic.less +1 -0
  283. package/src/theme.config.example +1 -0
  284. package/src/theme.less +13 -2
  285. package/src/themes/amazon/globals/site.variables +1 -0
  286. package/src/themes/basic/elements/icon.overrides +149 -149
  287. package/src/themes/basic/elements/step.overrides +2 -2
  288. package/src/themes/bookish/elements/header.overrides +1 -1
  289. package/src/themes/chubby/elements/button.overrides +1 -1
  290. package/src/themes/chubby/elements/header.overrides +1 -1
  291. package/src/themes/default/assets/fonts/Lato-Bold.woff +0 -0
  292. package/src/themes/default/assets/fonts/Lato-Bold.woff2 +0 -0
  293. package/src/themes/default/assets/fonts/Lato-BoldItalic.woff +0 -0
  294. package/src/themes/default/assets/fonts/Lato-BoldItalic.woff2 +0 -0
  295. package/src/themes/default/assets/fonts/Lato-Italic.woff +0 -0
  296. package/src/themes/default/assets/fonts/Lato-Italic.woff2 +0 -0
  297. package/src/themes/default/assets/fonts/Lato-Regular.woff +0 -0
  298. package/src/themes/default/assets/fonts/Lato-Regular.woff2 +0 -0
  299. package/src/themes/default/assets/fonts/LatoLatin-Bold.woff +0 -0
  300. package/src/themes/default/assets/fonts/LatoLatin-Bold.woff2 +0 -0
  301. package/src/themes/default/assets/fonts/LatoLatin-BoldItalic.woff +0 -0
  302. package/src/themes/default/assets/fonts/LatoLatin-BoldItalic.woff2 +0 -0
  303. package/src/themes/default/assets/fonts/LatoLatin-Italic.woff +0 -0
  304. package/src/themes/default/assets/fonts/LatoLatin-Italic.woff2 +0 -0
  305. package/src/themes/default/assets/fonts/LatoLatin-Regular.woff +0 -0
  306. package/src/themes/default/assets/fonts/LatoLatin-Regular.woff2 +0 -0
  307. package/src/themes/default/assets/fonts/brand-icons.eot +0 -0
  308. package/src/themes/default/assets/fonts/brand-icons.svg +801 -654
  309. package/src/themes/default/assets/fonts/brand-icons.ttf +0 -0
  310. package/src/themes/default/assets/fonts/brand-icons.woff +0 -0
  311. package/src/themes/default/assets/fonts/brand-icons.woff2 +0 -0
  312. package/src/themes/default/assets/fonts/icons.eot +0 -0
  313. package/src/themes/default/assets/fonts/icons.svg +1175 -1079
  314. package/src/themes/default/assets/fonts/icons.ttf +0 -0
  315. package/src/themes/default/assets/fonts/icons.woff +0 -0
  316. package/src/themes/default/assets/fonts/icons.woff2 +0 -0
  317. package/src/themes/default/assets/fonts/outline-icons.eot +0 -0
  318. package/src/themes/default/assets/fonts/outline-icons.svg +93 -95
  319. package/src/themes/default/assets/fonts/outline-icons.ttf +0 -0
  320. package/src/themes/default/assets/fonts/outline-icons.woff +0 -0
  321. package/src/themes/default/assets/fonts/outline-icons.woff2 +0 -0
  322. package/src/themes/default/collections/form.variables +4 -0
  323. package/src/themes/default/collections/menu.variables +6 -0
  324. package/src/themes/default/collections/table.variables +52 -0
  325. package/src/themes/default/elements/button.variables +7 -1
  326. package/src/themes/default/elements/container.variables +12 -0
  327. package/src/themes/default/elements/divider.overrides +7 -7
  328. package/src/themes/default/elements/emoji.overrides +0 -3090
  329. package/src/themes/default/elements/emoji.variables +3563 -1
  330. package/src/themes/default/elements/flag.overrides +0 -991
  331. package/src/themes/default/elements/flag.variables +1603 -5
  332. package/src/themes/default/elements/icon.overrides +1975 -1949
  333. package/src/themes/default/elements/icon.variables +1 -0
  334. package/src/themes/default/elements/input.variables +15 -0
  335. package/src/themes/default/elements/segment.variables +8 -0
  336. package/src/themes/default/elements/step.overrides +3 -3
  337. package/src/themes/default/globals/site.variables +109 -8
  338. package/src/themes/default/globals/variation.variables +161 -6
  339. package/src/themes/default/modules/accordion.overrides +6 -5
  340. package/src/themes/default/modules/accordion.variables +49 -2
  341. package/src/themes/default/modules/calendar.variables +3 -0
  342. package/src/themes/default/modules/checkbox.overrides +9 -9
  343. package/src/themes/default/modules/checkbox.variables +5 -5
  344. package/src/themes/default/modules/dimmer.variables +1 -1
  345. package/src/themes/default/modules/dropdown.overrides +5 -5
  346. package/src/themes/default/modules/dropdown.variables +7 -10
  347. package/src/themes/default/modules/flyout.overrides +3 -0
  348. package/src/themes/default/modules/flyout.variables +100 -0
  349. package/src/themes/default/modules/modal.variables +16 -2
  350. package/src/themes/default/modules/popup.variables +0 -2
  351. package/src/themes/default/modules/sidebar.variables +4 -1
  352. package/src/themes/default/modules/toast.variables +3 -0
  353. package/src/themes/default/views/card.variables +8 -0
  354. package/src/themes/{default → famfamfam}/assets/images/flags.png +0 -0
  355. package/src/themes/famfamfam/elements/flag.overrides +1026 -0
  356. package/src/themes/famfamfam/elements/flag.variables +20 -0
  357. package/src/themes/github/elements/icon.overrides +206 -206
  358. package/src/themes/github/elements/step.overrides +5 -5
  359. package/src/themes/github/globals/site.variables +1 -0
  360. package/src/themes/github/modules/dropdown.overrides +6 -6
  361. package/src/themes/instagram/views/card.overrides +1 -1
  362. package/src/themes/joypixels/elements/emoji.overrides +0 -3089
  363. package/src/themes/joypixels/elements/emoji.variables +3562 -5
  364. package/src/themes/material/collections/menu.overrides +1 -1
  365. package/src/themes/material/elements/button.overrides +1 -1
  366. package/src/themes/material/elements/header.overrides +1 -1
  367. package/src/themes/material/elements/icon.overrides +932 -932
  368. package/src/themes/material/globals/site.variables +0 -1
  369. package/src/themes/material/modules/dropdown.overrides +1 -1
  370. package/src/themes/material/modules/modal.overrides +1 -1
  371. package/src/themes/pulsar/elements/loader.overrides +2 -2
  372. package/src/themes/resetcss/globals/reset.overrides +3 -3
  373. package/src/themes/rtl/globals/site.overrides +1 -1
  374. package/src/themes/striped/modules/progress.overrides +1 -1
  375. package/src/themes/systemfont/globals/reset.overrides +8 -0
  376. package/src/themes/systemfont/globals/site.variables +10 -0
  377. package/src/themes/twitter/elements/emoji.overrides +0 -3091
  378. package/src/themes/twitter/elements/emoji.variables +3558 -6
  379. package/tasks/admin/distributions/create.js +1 -1
  380. package/tasks/admin/publish.js +1 -1
  381. package/tasks/admin/release.js +1 -1
  382. package/tasks/build/assets.js +1 -1
  383. package/tasks/build/css.js +9 -4
  384. package/tasks/build/javascript.js +3 -3
  385. package/tasks/check-install.js +1 -1
  386. package/tasks/clean.js +1 -1
  387. package/tasks/collections/README.md +1 -1
  388. package/tasks/collections/admin.js +1 -1
  389. package/tasks/config/admin/oauth.example.js +1 -1
  390. package/tasks/config/admin/release.js +1 -0
  391. package/tasks/config/admin/templates/composer.json +1 -1
  392. package/tasks/config/defaults.js +1 -0
  393. package/tasks/config/project/install.js +16 -13
  394. package/tasks/install.js +1 -0
  395. package/tasks/rtl/watch.js +1 -1
  396. package/tasks/version.js +1 -1
  397. package/test/fixtures/accordion.html +1 -1
  398. package/test/fixtures/checkbox.html +1 -1
  399. package/test/fixtures/dropdown.html +1 -1
  400. package/test/fixtures/modal.html +1 -1
  401. package/test/fixtures/popup.html +1 -1
  402. package/test/fixtures/rating.html +1 -1
  403. package/test/fixtures/shape.html +1 -1
  404. package/test/fixtures/sidebar.html +1 -1
  405. package/test/fixtures/tab.html +1 -1
  406. package/test/fixtures/transition.html +1 -1
  407. package/test/fixtures/video.html +1 -1
  408. package/test/helpers/jasmine-jquery.js +2 -2
  409. package/test/helpers/jasmine-sinon.js +1 -1
  410. package/test/helpers/jquery-events.js +1 -1
  411. package/test/helpers/sinon.js +3 -3
  412. package/test/meteor/fonts.js +1 -1
  413. package/test/modules/accordion.spec.js +1 -1
  414. package/test/modules/checkbox.spec.js +1 -1
  415. package/test/modules/dropdown.spec.js +1 -1
  416. package/test/modules/modal.spec.js +1 -1
  417. package/test/modules/module.spec.js +1 -1
  418. package/test/modules/popup.spec.js +1 -1
  419. package/test/modules/search.spec.js +1 -1
  420. package/test/modules/shape.spec.js +1 -1
  421. package/test/modules/sidebar.spec.js +1 -1
  422. package/test/modules/tab.spec.js +1 -1
  423. package/test/modules/transition.spec.js +1 -1
  424. package/test/modules/video.spec.js +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * # Fomantic-UI 2.9.0-beta.32 - Dropdown
2
+ * # Fomantic-UI 2.9.0-beta.321+b9608b1 - Dropdown
3
3
  * http://github.com/fomantic/Fomantic-UI/
4
4
  *
5
5
  *
@@ -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();
@@ -200,6 +195,7 @@ $.fn.dropdown = function(parameters) {
200
195
  select: function() {
201
196
  if(module.has.input() && selectObserver) {
202
197
  selectObserver.observe($module[0], {
198
+ attributes: true,
203
199
  childList : true,
204
200
  subtree : true
205
201
  });
@@ -224,7 +220,7 @@ $.fn.dropdown = function(parameters) {
224
220
 
225
221
  create: {
226
222
  id: function() {
227
- id = (Math.random().toString(16) + '000000000').substr(2, 8);
223
+ id = (Math.random().toString(16) + '000000000').slice(2, 10);
228
224
  elementNamespace = '.' + id;
229
225
  module.verbose('Creating unique id for element', id);
230
226
  },
@@ -232,7 +228,6 @@ $.fn.dropdown = function(parameters) {
232
228
  var
233
229
  $userChoices,
234
230
  $userChoice,
235
- isUserValue,
236
231
  html
237
232
  ;
238
233
  values = values || module.get.userValues();
@@ -370,11 +365,20 @@ $.fn.dropdown = function(parameters) {
370
365
  }
371
366
  if( module.is.search() && !module.has.search() ) {
372
367
  module.verbose('Adding search input');
368
+ var
369
+ labelNode = $module.prev('label')
370
+ ;
373
371
  $search = $('<input />')
374
372
  .addClass(className.search)
375
373
  .prop('autocomplete', module.is.chrome() ? 'fomantic-search' : 'off')
376
- .insertBefore($text)
377
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);
378
382
  }
379
383
  if( module.is.multiple() && module.is.searchSelection() && !module.has.sizer()) {
380
384
  module.create.sizer();
@@ -421,6 +425,9 @@ $.fn.dropdown = function(parameters) {
421
425
  module.debug('Disabling dropdown');
422
426
  $module.addClass(className.disabled);
423
427
  }
428
+ if($input.is('[required]')) {
429
+ settings.forceSelection = true;
430
+ }
424
431
  $input
425
432
  .removeAttr('required')
426
433
  .removeAttr('class')
@@ -440,7 +447,7 @@ $.fn.dropdown = function(parameters) {
440
447
  // replace module reference
441
448
  $module = $module.parent(selector.dropdown);
442
449
  instance = $module.data(moduleNamespace);
443
- element = $module.get(0);
450
+ element = $module[0];
444
451
  module.refresh();
445
452
  module.setup.returnedObject();
446
453
  },
@@ -537,9 +544,7 @@ $.fn.dropdown = function(parameters) {
537
544
  }
538
545
  if(settings.onShow.call(element) !== false) {
539
546
  module.animate.show(function() {
540
- if( module.can.click() ) {
541
- module.bind.intent();
542
- }
547
+ module.bind.intent();
543
548
  if(module.has.search() && !preventFocus) {
544
549
  module.focusSearch();
545
550
  }
@@ -566,8 +571,17 @@ $.fn.dropdown = function(parameters) {
566
571
  }
567
572
  callback.call(element);
568
573
  });
574
+ // Hide submenus explicitly. On some browsers (esp. mobile), they will not automatically receive a
575
+ // mouseleave event
576
+ var $subMenu = $module.find(selector.menu);
577
+ if($subMenu.length > 0) {
578
+ module.verbose('Hiding sub-menu', $subMenu);
579
+ $subMenu.each(function() {
580
+ module.animate.hide(false, $(this));
581
+ });
582
+ }
569
583
  }
570
- } else if( module.can.click() ) {
584
+ } else {
571
585
  module.unbind.intent();
572
586
  }
573
587
  iconClicked = false;
@@ -625,13 +639,18 @@ $.fn.dropdown = function(parameters) {
625
639
  $module
626
640
  .on('change' + eventNamespace, selector.input, module.event.change)
627
641
  ;
642
+ if(module.is.multiple() && module.is.searchSelection()) {
643
+ $module
644
+ .on('paste' + eventNamespace, selector.search, module.event.paste)
645
+ ;
646
+ }
628
647
  },
629
648
  mouseEvents: function() {
630
649
  module.verbose('Binding mouse events');
631
650
  if(module.is.multiple()) {
632
651
  $module
633
- .on(clickEvent + eventNamespace, selector.label, module.event.label.click)
634
- .on(clickEvent + eventNamespace, selector.remove, module.event.remove.click)
652
+ .on('click' + eventNamespace, selector.label, module.event.label.click)
653
+ .on('click' + eventNamespace, selector.remove, module.event.remove.click)
635
654
  ;
636
655
  }
637
656
  if( module.is.searchSelection() ) {
@@ -640,31 +659,33 @@ $.fn.dropdown = function(parameters) {
640
659
  .on('mouseup' + eventNamespace, module.event.mouseup)
641
660
  .on('mousedown' + eventNamespace, selector.menu, module.event.menu.mousedown)
642
661
  .on('mouseup' + eventNamespace, selector.menu, module.event.menu.mouseup)
643
- .on(clickEvent + eventNamespace, selector.icon, module.event.icon.click)
644
- .on(clickEvent + eventNamespace, selector.clearIcon, module.event.clearIcon.click)
662
+ .on('click' + eventNamespace, selector.icon, module.event.icon.click)
663
+ .on('click' + eventNamespace, selector.clearIcon, module.event.clearIcon.click)
645
664
  .on('focus' + eventNamespace, selector.search, module.event.search.focus)
646
- .on(clickEvent + eventNamespace, selector.search, module.event.search.focus)
665
+ .on('click' + eventNamespace, selector.search, module.event.search.focus)
647
666
  .on('blur' + eventNamespace, selector.search, module.event.search.blur)
648
- .on(clickEvent + eventNamespace, selector.text, module.event.text.focus)
667
+ .on('click' + eventNamespace, selector.text, module.event.text.focus)
649
668
  ;
650
669
  if(module.is.multiple()) {
651
670
  $module
652
- .on(clickEvent + eventNamespace, module.event.click)
653
- .on(clickEvent + eventNamespace, module.event.search.focus)
671
+ .on('click' + eventNamespace, module.event.click)
672
+ .on('click' + eventNamespace, module.event.search.focus)
654
673
  ;
655
674
  }
656
675
  }
657
676
  else {
658
677
  if(settings.on == 'click') {
659
678
  $module
660
- .on(clickEvent + eventNamespace, selector.icon, module.event.icon.click)
661
- .on(clickEvent + eventNamespace, module.event.test.toggle)
679
+ .on('click' + eventNamespace, selector.icon, module.event.icon.click)
680
+ .on('click' + eventNamespace, module.event.test.toggle)
662
681
  ;
663
682
  }
664
683
  else if(settings.on == 'hover') {
665
684
  $module
666
685
  .on('mouseenter' + eventNamespace, module.delay.show)
667
686
  .on('mouseleave' + eventNamespace, module.delay.hide)
687
+ .on('touchstart' + eventNamespace, module.event.test.toggle)
688
+ .on('touchstart' + eventNamespace, selector.icon, module.event.icon.click)
668
689
  ;
669
690
  }
670
691
  else {
@@ -676,7 +697,7 @@ $.fn.dropdown = function(parameters) {
676
697
  .on('mousedown' + eventNamespace, module.event.mousedown)
677
698
  .on('mouseup' + eventNamespace, module.event.mouseup)
678
699
  .on('focus' + eventNamespace, module.event.focus)
679
- .on(clickEvent + eventNamespace, selector.clearIcon, module.event.clearIcon.click)
700
+ .on('click' + eventNamespace, selector.clearIcon, module.event.clearIcon.click)
680
701
  ;
681
702
  if(module.has.menuSearch() ) {
682
703
  $module
@@ -690,21 +711,16 @@ $.fn.dropdown = function(parameters) {
690
711
  }
691
712
  }
692
713
  $menu
693
- .on((hasTouch ? 'touchstart' : 'mouseenter') + eventNamespace, selector.item, module.event.item.mouseenter)
714
+ .on('mouseenter' + eventNamespace, selector.item, module.event.item.mouseenter)
715
+ .on('touchstart' + eventNamespace, selector.item, module.event.item.mouseenter)
694
716
  .on('mouseleave' + eventNamespace, selector.item, module.event.item.mouseleave)
695
717
  .on('click' + eventNamespace, selector.item, module.event.item.click)
696
718
  ;
697
719
  },
698
720
  intent: function() {
699
721
  module.verbose('Binding hide intent event to document');
700
- if(hasTouch) {
701
- $document
702
- .on('touchstart' + elementNamespace, module.event.test.touch)
703
- .on('touchmove' + elementNamespace, module.event.test.touch)
704
- ;
705
- }
706
722
  $document
707
- .on(clickEvent + elementNamespace, module.event.test.hide)
723
+ .on('click' + elementNamespace, module.event.test.hide)
708
724
  ;
709
725
  }
710
726
  },
@@ -712,14 +728,8 @@ $.fn.dropdown = function(parameters) {
712
728
  unbind: {
713
729
  intent: function() {
714
730
  module.verbose('Removing hide intent event from document');
715
- if(hasTouch) {
716
- $document
717
- .off('touchstart' + elementNamespace)
718
- .off('touchmove' + elementNamespace)
719
- ;
720
- }
721
731
  $document
722
- .off(clickEvent + elementNamespace)
732
+ .off('click' + elementNamespace)
723
733
  ;
724
734
  }
725
735
  },
@@ -812,20 +822,28 @@ $.fn.dropdown = function(parameters) {
812
822
  throttle : settings.throttle,
813
823
  urlData : {
814
824
  query: query
815
- },
816
- onError: function() {
825
+ }
826
+ },
827
+ apiCallbacks = {
828
+ onError: function(errorMessage, $module, xhr) {
817
829
  module.add.message(message.serverError);
818
830
  iconClicked = false;
819
831
  focused = false;
820
832
  callback.apply(null, callbackParameters);
833
+ if(typeof settings.apiSettings.onError === 'function') {
834
+ settings.apiSettings.onError.call(this, errorMessage, $module, xhr);
835
+ }
821
836
  },
822
- onFailure: function() {
837
+ onFailure: function(response, $module, xhr) {
823
838
  module.add.message(message.serverError);
824
839
  iconClicked = false;
825
840
  focused = false;
826
841
  callback.apply(null, callbackParameters);
842
+ if(typeof settings.apiSettings.onFailure === 'function') {
843
+ settings.apiSettings.onFailure.call(this, response, $module, xhr);
844
+ }
827
845
  },
828
- onSuccess : function(response) {
846
+ onSuccess : function(response, $module, xhr) {
829
847
  var
830
848
  values = response[fields.remoteValues]
831
849
  ;
@@ -844,19 +862,22 @@ $.fn.dropdown = function(parameters) {
844
862
  var value = module.is.multiple() ? module.get.values() : module.get.value();
845
863
  if (value !== '') {
846
864
  module.verbose('Value(s) present after click icon, select value(s) in items');
847
- module.set.selected(value, null, null, true);
865
+ module.set.selected(value, null, true, true);
848
866
  }
849
867
  }
850
868
  iconClicked = false;
851
869
  focused = false;
852
870
  callback.apply(null, callbackParameters);
871
+ if(typeof settings.apiSettings.onSuccess === 'function') {
872
+ settings.apiSettings.onSuccess.call(this, response, $module, xhr);
873
+ }
853
874
  }
854
875
  }
855
876
  ;
856
877
  if( !$module.api('get request') ) {
857
878
  module.setup.api();
858
879
  }
859
- apiSettings = $.extend(true, {}, apiSettings, settings.apiSettings);
880
+ apiSettings = $.extend(true, {}, apiSettings, settings.apiSettings, apiCallbacks);
860
881
  $module
861
882
  .api('setting', apiSettings)
862
883
  .api('query')
@@ -892,30 +913,18 @@ $.fn.dropdown = function(parameters) {
892
913
  }
893
914
  if(settings.match === 'both' || settings.match === 'text') {
894
915
  text = module.remove.diacritics(String(module.get.choiceText($choice, false)));
895
- if(text.search(beginsWithRegExp) !== -1) {
896
- results.push(this);
897
- return true;
898
- }
899
- else if (settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, text)) {
900
- results.push(this);
901
- return true;
902
- }
903
- else if (settings.fullTextSearch === true && module.fuzzySearch(searchTerm, text)) {
916
+ if(text.search(beginsWithRegExp) !== -1 ||
917
+ (settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, text)) ||
918
+ (settings.fullTextSearch === true && module.fuzzySearch(searchTerm, text))) {
904
919
  results.push(this);
905
920
  return true;
906
921
  }
907
922
  }
908
923
  if(settings.match === 'both' || settings.match === 'value') {
909
924
  value = module.remove.diacritics(String(module.get.choiceValue($choice, text)));
910
- if(value.search(beginsWithRegExp) !== -1) {
911
- results.push(this);
912
- return true;
913
- }
914
- else if (settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, value)) {
915
- results.push(this);
916
- return true;
917
- }
918
- else if (settings.fullTextSearch === true && module.fuzzySearch(searchTerm, value)) {
925
+ if(value.search(beginsWithRegExp) !== -1 ||
926
+ (settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, value)) ||
927
+ (settings.fullTextSearch === true && module.fuzzySearch(searchTerm, value))) {
919
928
  results.push(this);
920
929
  return true;
921
930
  }
@@ -1044,7 +1053,7 @@ $.fn.dropdown = function(parameters) {
1044
1053
  menuConfig[fields.values] = values;
1045
1054
  module.setup.menu(menuConfig);
1046
1055
  $.each(values, function(index, item) {
1047
- if(item.selected == true) {
1056
+ if(item.selected === true) {
1048
1057
  module.debug('Setting initial selection to', item[fields.value]);
1049
1058
  module.set.selected(item[fields.value]);
1050
1059
  if(!module.is.multiple()) {
@@ -1065,7 +1074,7 @@ $.fn.dropdown = function(parameters) {
1065
1074
  settings.preserveHTML
1066
1075
  )
1067
1076
  ;
1068
- $input.append('<option value="' + value + '">' + name + '</option>');
1077
+ $input.append('<option value="' + value + '"' + (item.selected === true ? ' selected' : '') + '>' + name + '</option>');
1069
1078
  });
1070
1079
  module.observe.select();
1071
1080
  }
@@ -1073,6 +1082,15 @@ $.fn.dropdown = function(parameters) {
1073
1082
  },
1074
1083
 
1075
1084
  event: {
1085
+ paste: function(event) {
1086
+ var pasteValue = (event.originalEvent.clipboardData || window.clipboardData).getData('text'),
1087
+ tokens = pasteValue.split(settings.delimiter)
1088
+ ;
1089
+ tokens.forEach(function(value){
1090
+ module.set.selected(module.escape.htmlEntities(value.trim()), null, true, true);
1091
+ });
1092
+ event.preventDefault();
1093
+ },
1076
1094
  change: function() {
1077
1095
  if(!internalChange) {
1078
1096
  module.debug('Input changed, updating selection');
@@ -1131,7 +1149,7 @@ $.fn.dropdown = function(parameters) {
1131
1149
  if(module.is.multiple()) {
1132
1150
  module.remove.activeLabel();
1133
1151
  }
1134
- if(!focused && !module.is.active() && (settings.showOnFocus || (event.type !== 'focus' && event.type !== 'focusin'))) {
1152
+ if(!focused && !module.is.active() && (settings.showOnFocus || (event.type !== 'focus' && event.type !== 'focusin')) && event.type !== 'touchstart') {
1135
1153
  focused = true;
1136
1154
  module.search();
1137
1155
  }
@@ -1249,23 +1267,12 @@ $.fn.dropdown = function(parameters) {
1249
1267
  if (!module.is.multiple() || (module.is.multiple() && !module.is.active())) {
1250
1268
  focused = true;
1251
1269
  }
1252
- if( module.determine.eventOnElement(event, toggleBehavior) ) {
1270
+ if( module.determine.eventOnElement(event, toggleBehavior) && event.type !== 'touchstart') {
1271
+ // do not preventDefault of touchstart; so emulated mouseenter is triggered on first touch and not later
1272
+ // (when selecting an item). The double-showing of the dropdown through both events does not hurt.
1253
1273
  event.preventDefault();
1254
1274
  }
1255
1275
  },
1256
- touch: function(event) {
1257
- module.determine.eventOnElement(event, function() {
1258
- if(event.type == 'touchstart') {
1259
- module.timer = setTimeout(function() {
1260
- module.hide();
1261
- }, settings.delay.touch);
1262
- }
1263
- else if(event.type == 'touchmove') {
1264
- clearTimeout(module.timer);
1265
- }
1266
- });
1267
- event.stopPropagation();
1268
- },
1269
1276
  hide: function(event) {
1270
1277
  if(module.determine.eventInModule(event, module.hide)){
1271
1278
  if(element.id && $(event.target).attr('for') === element.id){
@@ -1285,8 +1292,8 @@ $.fn.dropdown = function(parameters) {
1285
1292
  },
1286
1293
  select: {
1287
1294
  mutation: function(mutations) {
1288
- module.debug('<select> modified, recreating menu');
1289
1295
  if(module.is.selectMutation(mutations)) {
1296
+ module.debug('<select> modified, recreating menu');
1290
1297
  module.disconnect.selectObserver();
1291
1298
  module.refresh();
1292
1299
  module.setup.select();
@@ -1349,13 +1356,15 @@ $.fn.dropdown = function(parameters) {
1349
1356
  },
1350
1357
  mouseleave: function(event) {
1351
1358
  var
1352
- $subMenu = $(this).children(selector.menu)
1359
+ $subMenu = $(this).find(selector.menu)
1353
1360
  ;
1354
1361
  if($subMenu.length > 0) {
1355
1362
  clearTimeout(module.itemTimer);
1356
1363
  module.itemTimer = setTimeout(function() {
1357
1364
  module.verbose('Hiding sub-menu', $subMenu);
1358
- module.animate.hide(false, $subMenu);
1365
+ $subMenu.each(function() {
1366
+ module.animate.hide(false, $(this));
1367
+ });
1359
1368
  }, settings.delay.hide);
1360
1369
  }
1361
1370
  },
@@ -1381,7 +1390,7 @@ $.fn.dropdown = function(parameters) {
1381
1390
  module.remove.userAddition();
1382
1391
  }
1383
1392
  module.remove.searchTerm();
1384
- if(!module.is.focusedOnSearch() && !(skipRefocus == true)) {
1393
+ if(!module.is.focusedOnSearch() && skipRefocus !== true) {
1385
1394
  module.focusSearch(true);
1386
1395
  }
1387
1396
  }
@@ -1416,8 +1425,7 @@ $.fn.dropdown = function(parameters) {
1416
1425
  isFocusedOnSearch = module.is.focusedOnSearch(),
1417
1426
  isFocused = module.is.focused(),
1418
1427
  caretAtStart = (isFocusedOnSearch && module.get.caretPosition(false) === 0),
1419
- isSelectedSearch = (caretAtStart && module.get.caretPosition(true) !== 0),
1420
- $nextLabel
1428
+ isSelectedSearch = (caretAtStart && module.get.caretPosition(true) !== 0)
1421
1429
  ;
1422
1430
  if(isSearch && !hasActiveLabel && !isFocusedOnSearch) {
1423
1431
  return;
@@ -1513,7 +1521,7 @@ $.fn.dropdown = function(parameters) {
1513
1521
  keydown: function(event) {
1514
1522
  var
1515
1523
  pressedKey = event.which,
1516
- isShortcutKey = module.is.inObject(pressedKey, keys)
1524
+ isShortcutKey = module.is.inObject(pressedKey, keys) || event.key === settings.delimiter
1517
1525
  ;
1518
1526
  if(isShortcutKey) {
1519
1527
  var
@@ -1531,11 +1539,10 @@ $.fn.dropdown = function(parameters) {
1531
1539
  hasSubMenu = ($subMenu.length> 0),
1532
1540
  hasSelectedItem = ($selectedItem.length > 0),
1533
1541
  selectedIsSelectable = ($selectedItem.not(selector.unselectable).length > 0),
1534
- delimiterPressed = (pressedKey == keys.delimiter && settings.allowAdditions && module.is.multiple()),
1542
+ delimiterPressed = (event.key === settings.delimiter && module.is.multiple()),
1535
1543
  isAdditionWithoutMenu = (settings.allowAdditions && settings.hideAdditions && (pressedKey == keys.enter || delimiterPressed) && selectedIsSelectable),
1536
1544
  $nextItem,
1537
- isSubMenuItem,
1538
- newIndex
1545
+ isSubMenuItem
1539
1546
  ;
1540
1547
  // allow selection with menu closed
1541
1548
  if(isAdditionWithoutMenu) {
@@ -1629,7 +1636,7 @@ $.fn.dropdown = function(parameters) {
1629
1636
  .addClass(className.selected)
1630
1637
  ;
1631
1638
  module.set.scrollPosition($nextItem);
1632
- if(settings.selectOnKeydown && module.is.single()) {
1639
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
1633
1640
  module.set.selectedItem($nextItem);
1634
1641
  }
1635
1642
  }
@@ -1639,7 +1646,7 @@ $.fn.dropdown = function(parameters) {
1639
1646
  // down arrow (traverse menu down)
1640
1647
  if(pressedKey == keys.downArrow) {
1641
1648
  $nextItem = (hasSelectedItem && inVisibleMenu)
1642
- ? $nextItem = $selectedItem.nextAll(selector.item + ':not(' + selector.unselectable + ')').eq(0)
1649
+ ? $selectedItem.nextAll(selector.item + ':not(' + selector.unselectable + ')').eq(0)
1643
1650
  : $item.eq(0)
1644
1651
  ;
1645
1652
  if($nextItem.length === 0) {
@@ -1656,7 +1663,7 @@ $.fn.dropdown = function(parameters) {
1656
1663
  .addClass(className.selected)
1657
1664
  ;
1658
1665
  module.set.scrollPosition($nextItem);
1659
- if(settings.selectOnKeydown && module.is.single()) {
1666
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
1660
1667
  module.set.selectedItem($nextItem);
1661
1668
  }
1662
1669
  }
@@ -1677,6 +1684,7 @@ $.fn.dropdown = function(parameters) {
1677
1684
  if(pressedKey == keys.escape) {
1678
1685
  module.verbose('Escape key pressed, closing dropdown');
1679
1686
  module.hide();
1687
+ event.stopPropagation();
1680
1688
  }
1681
1689
 
1682
1690
  }
@@ -1787,7 +1795,7 @@ $.fn.dropdown = function(parameters) {
1787
1795
  ;
1788
1796
  if( module.can.activate( $(element) ) ) {
1789
1797
  module.set.selected(value, $(element));
1790
- if(!module.is.multiple()) {
1798
+ if(!module.is.multiple() && !(!settings.collapseOnActionable && $(element).hasClass(className.actionable))) {
1791
1799
  module.hideAndClear();
1792
1800
  }
1793
1801
  }
@@ -1800,7 +1808,7 @@ $.fn.dropdown = function(parameters) {
1800
1808
  ;
1801
1809
  if( module.can.activate( $(element) ) ) {
1802
1810
  module.set.value(value, text, $(element));
1803
- if(!module.is.multiple()) {
1811
+ if(!module.is.multiple() && !(!settings.collapseOnActionable && $(element).hasClass(className.actionable))) {
1804
1812
  module.hideAndClear();
1805
1813
  }
1806
1814
  }
@@ -1851,7 +1859,7 @@ $.fn.dropdown = function(parameters) {
1851
1859
  ;
1852
1860
  $sizer.text(value);
1853
1861
  // prevent rounding issues
1854
- return Math.ceil( $sizer.width() + 1);
1862
+ return Math.ceil( $sizer.width() + (module.is.edge() ? 3 : 1));
1855
1863
  },
1856
1864
  selectionCount: function() {
1857
1865
  var
@@ -1898,7 +1906,7 @@ $.fn.dropdown = function(parameters) {
1898
1906
  },
1899
1907
  caretPosition: function(returnEndPos) {
1900
1908
  var
1901
- input = $search.get(0),
1909
+ input = $search[0],
1902
1910
  range,
1903
1911
  rangeLength
1904
1912
  ;
@@ -2320,7 +2328,7 @@ $.fn.dropdown = function(parameters) {
2320
2328
  module.error(error.noStorage);
2321
2329
  return;
2322
2330
  }
2323
- name = sessionStorage.getItem(value);
2331
+ name = sessionStorage.getItem(value + elementNamespace);
2324
2332
  return (name !== undefined)
2325
2333
  ? name
2326
2334
  : false
@@ -2364,7 +2372,7 @@ $.fn.dropdown = function(parameters) {
2364
2372
  return;
2365
2373
  }
2366
2374
  module.verbose('Saving remote data to session storage', value, name);
2367
- sessionStorage.setItem(value, name);
2375
+ sessionStorage.setItem(value + elementNamespace, name);
2368
2376
  }
2369
2377
  },
2370
2378
 
@@ -2393,7 +2401,6 @@ $.fn.dropdown = function(parameters) {
2393
2401
  currentScroll = $menu.scrollTop(),
2394
2402
  itemHeight = $item.eq(0).outerHeight(),
2395
2403
  itemsPerPage = Math.floor(menuHeight / itemHeight),
2396
- maxScroll = $menu.prop('scrollHeight'),
2397
2404
  newScroll = (direction == 'up')
2398
2405
  ? currentScroll - (itemHeight * itemsPerPage)
2399
2406
  : currentScroll + (itemHeight * itemsPerPage),
@@ -2424,7 +2431,7 @@ $.fn.dropdown = function(parameters) {
2424
2431
  $nextSelectedItem
2425
2432
  .addClass(className.selected)
2426
2433
  ;
2427
- if(settings.selectOnKeydown && module.is.single()) {
2434
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
2428
2435
  module.set.selectedItem($nextSelectedItem);
2429
2436
  }
2430
2437
  $menu
@@ -2510,7 +2517,7 @@ $.fn.dropdown = function(parameters) {
2510
2517
  var
2511
2518
  length = module.get.query().length
2512
2519
  ;
2513
- $search.val( text.substr(0, length));
2520
+ $search.val( text.slice(0, length));
2514
2521
  },
2515
2522
  scrollPosition: function($item, forceScroll) {
2516
2523
  var
@@ -2518,7 +2525,6 @@ $.fn.dropdown = function(parameters) {
2518
2525
  $menu,
2519
2526
  hasActive,
2520
2527
  offset,
2521
- itemHeight,
2522
2528
  itemOffset,
2523
2529
  menuOffset,
2524
2530
  menuScroll,
@@ -2627,13 +2633,13 @@ $.fn.dropdown = function(parameters) {
2627
2633
  module.set.scrollPosition($nextValue);
2628
2634
  $selectedItem.removeClass(className.selected);
2629
2635
  $nextValue.addClass(className.selected);
2630
- if(settings.selectOnKeydown && module.is.single()) {
2636
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
2631
2637
  module.set.selectedItem($nextValue);
2632
2638
  }
2633
2639
  }
2634
2640
  },
2635
2641
  direction: function($menu) {
2636
- if(settings.direction == 'auto') {
2642
+ if(settings.direction === 'auto') {
2637
2643
  // reset position, remove upward if it's base menu
2638
2644
  if (!$menu) {
2639
2645
  module.remove.upward();
@@ -2652,7 +2658,7 @@ $.fn.dropdown = function(parameters) {
2652
2658
  module.set.leftward($menu);
2653
2659
  }
2654
2660
  }
2655
- else if(settings.direction == 'upward') {
2661
+ else if(settings.direction === 'upward') {
2656
2662
  module.set.upward($menu);
2657
2663
  }
2658
2664
  },
@@ -2665,6 +2671,11 @@ $.fn.dropdown = function(parameters) {
2665
2671
  $element.addClass(className.leftward);
2666
2672
  },
2667
2673
  value: function(value, text, $selected, preventChangeTrigger) {
2674
+ if(typeof text === 'boolean') {
2675
+ preventChangeTrigger = text;
2676
+ $selected = undefined;
2677
+ text = undefined;
2678
+ }
2668
2679
  if(value !== undefined && value !== '' && !(Array.isArray(value) && value.length === 0)) {
2669
2680
  $input.removeClass(className.noselection);
2670
2681
  } else {
@@ -2676,8 +2687,7 @@ $.fn.dropdown = function(parameters) {
2676
2687
  currentValue = module.get.values(),
2677
2688
  stringValue = (value !== undefined)
2678
2689
  ? String(value)
2679
- : value,
2680
- newValue
2690
+ : value
2681
2691
  ;
2682
2692
  if(hasInput) {
2683
2693
  if(!settings.allowReselection && stringValue == currentValue) {
@@ -2728,12 +2738,21 @@ $.fn.dropdown = function(parameters) {
2728
2738
  visible: function() {
2729
2739
  $module.addClass(className.visible);
2730
2740
  },
2731
- exactly: function(value, $selectedItem) {
2741
+ exactly: function(value, $selectedItem, preventChangeTrigger) {
2742
+ if(typeof $selectedItem === 'boolean') {
2743
+ preventChangeTrigger = $selectedItem;
2744
+ $selectedItem = undefined;
2745
+ }
2732
2746
  module.debug('Setting selected to exact values');
2733
2747
  module.clear();
2734
- module.set.selected(value, $selectedItem);
2748
+ module.set.selected(value, $selectedItem, preventChangeTrigger);
2735
2749
  },
2736
2750
  selected: function(value, $selectedItem, preventChangeTrigger, keepSearchTerm) {
2751
+ if(typeof $selectedItem === 'boolean') {
2752
+ keepSearchTerm = preventChangeTrigger;
2753
+ preventChangeTrigger = $selectedItem;
2754
+ $selectedItem = undefined;
2755
+ }
2737
2756
  var
2738
2757
  isMultiple = module.is.multiple()
2739
2758
  ;
@@ -2765,23 +2784,30 @@ $.fn.dropdown = function(parameters) {
2765
2784
 
2766
2785
  isFiltered = $selected.hasClass(className.filtered),
2767
2786
  isActive = $selected.hasClass(className.active),
2787
+ isActionable = $selected.hasClass(className.actionable),
2768
2788
  isUserValue = $selected.hasClass(className.addition),
2769
- shouldAnimate = (isMultiple && $selectedItem.length == 1)
2789
+ shouldAnimate = (isMultiple && $selectedItem && $selectedItem.length === 1)
2770
2790
  ;
2771
- if(isMultiple) {
2791
+ if(isActionable){
2792
+ if((!isMultiple || (!isActive || isUserValue)) && settings.apiSettings && settings.saveRemoteData) {
2793
+ module.save.remoteData(selectedText, selectedValue);
2794
+ }
2795
+ settings.onActionable.call(element, selectedValue, selectedText, $selected);
2796
+ }
2797
+ else if(isMultiple) {
2772
2798
  if(!isActive || isUserValue) {
2773
2799
  if(settings.apiSettings && settings.saveRemoteData) {
2774
2800
  module.save.remoteData(selectedText, selectedValue);
2775
2801
  }
2776
2802
  if(settings.useLabels) {
2803
+ module.add.value(selectedValue, selectedText, $selected, preventChangeTrigger);
2777
2804
  module.add.label(selectedValue, selectedText, shouldAnimate);
2778
- module.add.value(selectedValue, selectedText, $selected);
2779
2805
  module.set.activeItem($selected);
2780
2806
  module.filterActive();
2781
2807
  module.select.nextAvailable($selectedItem);
2782
2808
  }
2783
2809
  else {
2784
- module.add.value(selectedValue, selectedText, $selected);
2810
+ module.add.value(selectedValue, selectedText, $selected, preventChangeTrigger);
2785
2811
  module.set.text(module.add.variables(message.count));
2786
2812
  module.set.activeItem($selected);
2787
2813
  }
@@ -2795,7 +2821,7 @@ $.fn.dropdown = function(parameters) {
2795
2821
  if(settings.apiSettings && settings.saveRemoteData) {
2796
2822
  module.save.remoteData(selectedText, selectedValue);
2797
2823
  }
2798
- if (!keepSearchTerm) {
2824
+ if (!keepSearchTerm && !$selected.hasClass(className.actionable)) {
2799
2825
  module.set.text(selectedText);
2800
2826
  }
2801
2827
  module.set.value(selectedValue, selectedText, $selected, preventChangeTrigger);
@@ -2847,6 +2873,7 @@ $.fn.dropdown = function(parameters) {
2847
2873
  animation : settings.label.transition,
2848
2874
  debug : settings.debug,
2849
2875
  verbose : settings.verbose,
2876
+ silent : settings.silent,
2850
2877
  duration : settings.label.duration
2851
2878
  })
2852
2879
  ;
@@ -2869,7 +2896,7 @@ $.fn.dropdown = function(parameters) {
2869
2896
  ;
2870
2897
  }
2871
2898
  else {
2872
- $message = $('<div/>')
2899
+ $('<div/>')
2873
2900
  .html(html)
2874
2901
  .addClass(className.message)
2875
2902
  .appendTo($menu)
@@ -2894,7 +2921,7 @@ $.fn.dropdown = function(parameters) {
2894
2921
  $('<option/>')
2895
2922
  .prop('value', escapedValue)
2896
2923
  .addClass(className.addition)
2897
- .html(value)
2924
+ .text(value)
2898
2925
  .appendTo($input)
2899
2926
  ;
2900
2927
  module.verbose('Adding user addition as an <option>', value);
@@ -2952,16 +2979,13 @@ $.fn.dropdown = function(parameters) {
2952
2979
  hasCount = (message.search('{count}') !== -1),
2953
2980
  hasMaxCount = (message.search('{maxCount}') !== -1),
2954
2981
  hasTerm = (message.search('{term}') !== -1),
2955
- count,
2956
2982
  query
2957
2983
  ;
2958
2984
  module.verbose('Adding templated variables to message', message);
2959
2985
  if(hasCount) {
2960
- count = module.get.selectionCount();
2961
- message = message.replace('{count}', count);
2986
+ message = message.replace('{count}', module.get.selectionCount());
2962
2987
  }
2963
2988
  if(hasMaxCount) {
2964
- count = module.get.selectionCount();
2965
2989
  message = message.replace('{maxCount}', settings.maxSelections);
2966
2990
  }
2967
2991
  if(hasTerm) {
@@ -2970,7 +2994,12 @@ $.fn.dropdown = function(parameters) {
2970
2994
  }
2971
2995
  return message;
2972
2996
  },
2973
- value: function(addedValue, addedText, $selectedItem) {
2997
+ value: function(addedValue, addedText, $selectedItem, preventChangeTrigger) {
2998
+ if(typeof addedText === 'boolean') {
2999
+ preventChangeTrigger = addedText;
3000
+ $selectedItem = undefined;
3001
+ addedText = undefined;
3002
+ }
2974
3003
  var
2975
3004
  currentValue = module.get.values(true),
2976
3005
  newValue
@@ -2985,7 +3014,7 @@ $.fn.dropdown = function(parameters) {
2985
3014
  }
2986
3015
  // extend current array
2987
3016
  if(Array.isArray(currentValue)) {
2988
- newValue = currentValue.concat([addedValue]);
3017
+ newValue = $selectedItem && $selectedItem.hasClass(className.actionable) ? currentValue : currentValue.concat([addedValue]);
2989
3018
  newValue = module.get.uniqueArray(newValue);
2990
3019
  }
2991
3020
  else {
@@ -3009,7 +3038,7 @@ $.fn.dropdown = function(parameters) {
3009
3038
  else {
3010
3039
  settings.onAdd.call(element, addedValue, addedText, $selectedItem);
3011
3040
  }
3012
- module.set.value(newValue, addedText, $selectedItem);
3041
+ module.set.value(newValue, addedText, $selectedItem, preventChangeTrigger);
3013
3042
  module.check.maxSelections();
3014
3043
  },
3015
3044
  },
@@ -3069,18 +3098,10 @@ $.fn.dropdown = function(parameters) {
3069
3098
  return;
3070
3099
  }
3071
3100
  // temporarily disconnect observer
3072
- if(selectObserver) {
3073
- selectObserver.disconnect();
3074
- module.verbose('Temporarily disconnecting mutation observer');
3075
- }
3101
+ module.disconnect.selectObserver();
3076
3102
  $option.remove();
3077
3103
  module.verbose('Removing user addition as an <option>', escapedValue);
3078
- if(selectObserver) {
3079
- selectObserver.observe($input[0], {
3080
- childList : true,
3081
- subtree : true
3082
- });
3083
- }
3104
+ module.observe.select();
3084
3105
  },
3085
3106
  message: function() {
3086
3107
  $menu.children(selector.message).remove();
@@ -3379,8 +3400,11 @@ $.fn.dropdown = function(parameters) {
3379
3400
  bubbledIconClick: function(event) {
3380
3401
  return $(event.target).closest($icon).length > 0;
3381
3402
  },
3403
+ edge: function() {
3404
+ return !!window.chrome && !!window.StyleMedia;
3405
+ },
3382
3406
  chrome: function() {
3383
- return !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);
3407
+ return !!window.chrome && !window.StyleMedia;
3384
3408
  },
3385
3409
  alreadySetup: function() {
3386
3410
  return ($module.is('select') && $module.parent(selector.dropdown).data(moduleNamespace) !== undefined && $module.prev().length === 0);
@@ -3408,7 +3432,7 @@ $.fn.dropdown = function(parameters) {
3408
3432
  return (document.activeElement === $search[0]);
3409
3433
  },
3410
3434
  allFiltered: function() {
3411
- return( (module.is.multiple() || module.has.search()) && !(settings.hideAdditions == false && module.has.userSuggestion()) && !module.has.message() && module.has.allResultsFiltered() );
3435
+ return( (module.is.multiple() || module.has.search()) && !(!settings.hideAdditions && module.has.userSuggestion()) && !module.has.message() && module.has.allResultsFiltered() );
3412
3436
  },
3413
3437
  hidden: function($subMenu) {
3414
3438
  return !module.is.visible($subMenu);
@@ -3445,7 +3469,7 @@ $.fn.dropdown = function(parameters) {
3445
3469
  selectChanged = false
3446
3470
  ;
3447
3471
  $.each(mutations, function(index, mutation) {
3448
- if($(mutation.target).is('select') || $(mutation.addedNodes).is('select')) {
3472
+ if($(mutation.target).is('select, option, optgroup') || $(mutation.addedNodes).is('select')) {
3449
3473
  selectChanged = true;
3450
3474
  return false;
3451
3475
  }
@@ -3476,7 +3500,7 @@ $.fn.dropdown = function(parameters) {
3476
3500
  },
3477
3501
  verticallyScrollableContext: function() {
3478
3502
  var
3479
- overflowY = ($context.get(0) !== window)
3503
+ overflowY = ($context[0] !== window)
3480
3504
  ? $context.css('overflow-y')
3481
3505
  : false
3482
3506
  ;
@@ -3484,7 +3508,7 @@ $.fn.dropdown = function(parameters) {
3484
3508
  },
3485
3509
  horizontallyScrollableContext: function() {
3486
3510
  var
3487
- overflowX = ($context.get(0) !== window)
3511
+ overflowX = ($context[0] !== window)
3488
3512
  ? $context.css('overflow-X')
3489
3513
  : false
3490
3514
  ;
@@ -3494,22 +3518,17 @@ $.fn.dropdown = function(parameters) {
3494
3518
 
3495
3519
  can: {
3496
3520
  activate: function($item) {
3497
- if(settings.useLabels) {
3498
- return true;
3499
- }
3500
- if(!module.has.maxSelections()) {
3501
- return true;
3502
- }
3503
- if(module.has.maxSelections() && $item.hasClass(className.active)) {
3504
- return true;
3505
- }
3506
- return false;
3521
+ return (
3522
+ settings.useLabels ||
3523
+ !module.has.maxSelections() ||
3524
+ (module.has.maxSelections() && $item.hasClass(className.active))
3525
+ );
3507
3526
  },
3508
3527
  openDownward: function($subMenu) {
3509
3528
  var
3510
3529
  $currentMenu = $subMenu || $menu,
3511
- canOpenDownward = true,
3512
- onScreen = {},
3530
+ canOpenDownward,
3531
+ onScreen,
3513
3532
  calculations
3514
3533
  ;
3515
3534
  $currentMenu
@@ -3517,7 +3536,7 @@ $.fn.dropdown = function(parameters) {
3517
3536
  ;
3518
3537
  calculations = {
3519
3538
  context: {
3520
- offset : ($context.get(0) === window)
3539
+ offset : ($context[0] === window)
3521
3540
  ? { top: 0, left: 0}
3522
3541
  : $context.offset(),
3523
3542
  scrollTop : $context.scrollTop(),
@@ -3565,7 +3584,7 @@ $.fn.dropdown = function(parameters) {
3565
3584
  ;
3566
3585
  calculations = {
3567
3586
  context: {
3568
- offset : ($context.get(0) === window)
3587
+ offset : ($context[0] === window)
3569
3588
  ? { top: 0, left: 0}
3570
3589
  : $context.offset(),
3571
3590
  scrollLeft : $context.scrollLeft(),
@@ -3587,9 +3606,6 @@ $.fn.dropdown = function(parameters) {
3587
3606
  $currentMenu.removeClass(className.loading);
3588
3607
  return canOpenRightward;
3589
3608
  },
3590
- click: function() {
3591
- return (hasTouch || settings.on == 'click');
3592
- },
3593
3609
  extendSelect: function() {
3594
3610
  return settings.allowAdditions || settings.apiSettings;
3595
3611
  },
@@ -3638,6 +3654,7 @@ $.fn.dropdown = function(parameters) {
3638
3654
  animation : transition + ' in',
3639
3655
  debug : settings.debug,
3640
3656
  verbose : settings.verbose,
3657
+ silent : settings.silent,
3641
3658
  duration : settings.transition.showDuration || settings.duration,
3642
3659
  queue : true,
3643
3660
  onStart : start,
@@ -3659,9 +3676,7 @@ $.fn.dropdown = function(parameters) {
3659
3676
  start = ($subMenu)
3660
3677
  ? function() {}
3661
3678
  : function() {
3662
- if( module.can.click() ) {
3663
- module.unbind.intent();
3664
- }
3679
+ module.unbind.intent();
3665
3680
  module.remove.active();
3666
3681
  },
3667
3682
  transition = settings.transition.hideMethod || module.get.transition($subMenu)
@@ -3687,6 +3702,7 @@ $.fn.dropdown = function(parameters) {
3687
3702
  duration : settings.transition.hideDuration || settings.duration,
3688
3703
  debug : settings.debug,
3689
3704
  verbose : settings.verbose,
3705
+ silent : settings.silent,
3690
3706
  queue : false,
3691
3707
  onStart : start,
3692
3708
  displayType: module.get.displayType(),
@@ -3772,7 +3788,7 @@ $.fn.dropdown = function(parameters) {
3772
3788
  }
3773
3789
  ;
3774
3790
  if(shouldEscape.test(string)) {
3775
- string = string.replace(/&(?![a-z0-9#]{1,6};)/, "&amp;");
3791
+ string = string.replace(/&(?![a-z0-9#]{1,12};)/gi, "&amp;");
3776
3792
  return string.replace(badChars, escapedChar);
3777
3793
  }
3778
3794
  return string;
@@ -3894,7 +3910,7 @@ $.fn.dropdown = function(parameters) {
3894
3910
  response
3895
3911
  ;
3896
3912
  passedArguments = passedArguments || queryArguments;
3897
- context = element || context;
3913
+ context = context || element;
3898
3914
  if(typeof query == 'string' && object !== undefined) {
3899
3915
  query = query.split(/[\. ]/);
3900
3916
  maxDepth = query.length - 1;
@@ -3990,7 +4006,7 @@ $.fn.dropdown.settings = {
3990
4006
  keepOnScreen : true, // Whether dropdown should check whether it is on screen before showing
3991
4007
 
3992
4008
  match : 'both', // what to match against with search selection (both, text, or label)
3993
- fullTextSearch : false, // search anywhere in value (set to 'exact' to require exact matches)
4009
+ fullTextSearch : 'exact', // search anywhere in value (set to 'exact' to require exact matches)
3994
4010
  ignoreDiacritics : false, // match results also if they contain diacritics of the same base character (for example searching for "a" will also match "á" or "â" or "à", etc...)
3995
4011
  hideDividers : false, // Whether to hide any divider elements (specified in selector.divider) that are sibling to any items when searched (set to true will hide all dividers, set to 'empty' will hide them when they are not followed by a visible item)
3996
4012
 
@@ -3998,7 +4014,7 @@ $.fn.dropdown.settings = {
3998
4014
  preserveHTML : true, // preserve html when selecting value
3999
4015
  sortSelect : false, // sort selection on init
4000
4016
 
4001
- forceSelection : true, // force a choice on blur with search selection
4017
+ forceSelection : false, // force a choice on blur with search selection
4002
4018
 
4003
4019
  allowAdditions : false, // whether multiple select should allow user added values
4004
4020
  ignoreCase : false, // whether to consider case sensitivity when creating labels
@@ -4009,7 +4025,7 @@ $.fn.dropdown.settings = {
4009
4025
  useLabels : true, // whether multiple select should filter currently active selections from choices
4010
4026
  delimiter : ',', // when multiselect uses normal <input> the values will be delimited with this character
4011
4027
 
4012
- showOnFocus : true, // show menu on focus
4028
+ showOnFocus : false, // show menu on focus
4013
4029
  allowReselection : false, // whether current value should trigger callbacks when reselected
4014
4030
  allowTab : true, // add tabindex to element
4015
4031
  allowCategorySelection : false, // allow elements with sub-menus to be selected
@@ -4024,6 +4040,8 @@ $.fn.dropdown.settings = {
4024
4040
 
4025
4041
  headerDivider : true, // whether option headers should have an additional divider line underneath when converted from <select> <optgroup>
4026
4042
 
4043
+ collapseOnActionable : true, // whether the dropdown should collapse upon selection of an actionable item
4044
+
4027
4045
  // label settings on multi-select
4028
4046
  label: {
4029
4047
  transition : 'scale',
@@ -4036,13 +4054,13 @@ $.fn.dropdown.settings = {
4036
4054
  hide : 300,
4037
4055
  show : 200,
4038
4056
  search : 20,
4039
- touch : 50
4040
4057
  },
4041
4058
 
4042
4059
  /* Callbacks */
4043
4060
  onChange : function(value, text, $selected){},
4044
4061
  onAdd : function(value, text, $selected){},
4045
4062
  onRemove : function(value, text, $selected){},
4063
+ onActionable : function(value, text, $selected){},
4046
4064
  onSearch : function(searchTerm){},
4047
4065
 
4048
4066
  onLabelSelect : function($selectedLabels){},
@@ -4105,12 +4123,12 @@ $.fn.dropdown.settings = {
4105
4123
  icon : 'icon', // optional icon name
4106
4124
  iconClass : 'iconClass', // optional individual class for icon (for example to use flag instead)
4107
4125
  class : 'class', // optional individual class for item/header
4108
- divider : 'divider' // optional divider append for group headers
4126
+ divider : 'divider', // optional divider append for group headers
4127
+ actionable : 'actionable' // optional actionable item
4109
4128
  },
4110
4129
 
4111
4130
  keys : {
4112
4131
  backspace : 8,
4113
- delimiter : 188, // comma
4114
4132
  deleteKey : 46,
4115
4133
  enter : 13,
4116
4134
  escape : 27,
@@ -4177,7 +4195,8 @@ $.fn.dropdown.settings = {
4177
4195
  header : 'header',
4178
4196
  divider : 'divider',
4179
4197
  groupIcon : '',
4180
- unfilterable : 'unfilterable'
4198
+ unfilterable : 'unfilterable',
4199
+ actionable : 'actionable'
4181
4200
  }
4182
4201
 
4183
4202
  };
@@ -4206,7 +4225,7 @@ $.fn.dropdown.settings.templates = {
4206
4225
  }
4207
4226
  ;
4208
4227
  if(shouldEscape.test(string)) {
4209
- string = string.replace(/&(?![a-z0-9#]{1,6};)/, "&amp;");
4228
+ string = string.replace(/&(?![a-z0-9#]{1,12};)/gi, "&amp;");
4210
4229
  return string.replace(badChars, escapedChar);
4211
4230
  }
4212
4231
  return string;
@@ -4216,7 +4235,8 @@ $.fn.dropdown.settings.templates = {
4216
4235
  var
4217
4236
  placeholder = select.placeholder || false,
4218
4237
  html = '',
4219
- escape = $.fn.dropdown.settings.templates.escape
4238
+ escape = $.fn.dropdown.settings.templates.escape,
4239
+ deQuote = $.fn.dropdown.settings.templates.deQuote
4220
4240
  ;
4221
4241
  html += '<i class="dropdown icon"></i>';
4222
4242
  if(placeholder) {
@@ -4225,7 +4245,7 @@ $.fn.dropdown.settings.templates = {
4225
4245
  else {
4226
4246
  html += '<div class="text"></div>';
4227
4247
  }
4228
- html += '<div class="'+className.menu+'">';
4248
+ html += '<div class="'+deQuote(className.menu)+'">';
4229
4249
  html += $.fn.dropdown.settings.templates.menu(select, fields, preserveHTML,className);
4230
4250
  html += '</div>';
4231
4251
  return html;
@@ -4252,6 +4272,9 @@ $.fn.dropdown.settings.templates = {
4252
4272
  maybeText = (option[fields.text])
4253
4273
  ? ' data-text="' + deQuote(option[fields.text],true) + '"'
4254
4274
  : '',
4275
+ maybeActionable = (option[fields.actionable])
4276
+ ? className.actionable+' '
4277
+ : '',
4255
4278
  maybeDisabled = (option[fields.disabled])
4256
4279
  ? className.disabled+' '
4257
4280
  : '',
@@ -4260,27 +4283,27 @@ $.fn.dropdown.settings.templates = {
4260
4283
  : '',
4261
4284
  hasDescription = (escape(option[fields.description] || '', preserveHTML) != '')
4262
4285
  ;
4263
- html += '<div class="'+ maybeDisabled + maybeDescriptionVertical + (option[fields.class] ? deQuote(option[fields.class]) : className.item)+'" data-value="' + deQuote(option[fields.value],true) + '"' + maybeText + '>';
4286
+ html += '<div class="'+ deQuote(maybeActionable + maybeDisabled + maybeDescriptionVertical + (option[fields.class] ? option[fields.class] : className.item))+'" data-value="' + deQuote(option[fields.value],true) + '"' + maybeText + '>';
4264
4287
  if (isMenu) {
4265
4288
  html += '<i class="'+ (itemType.indexOf('left') !== -1 ? 'left' : '') + ' dropdown icon"></i>';
4266
4289
  }
4267
4290
  if(option[fields.image]) {
4268
- html += '<img class="'+(option[fields.imageClass] ? deQuote(option[fields.imageClass]) : className.image)+'" src="' + deQuote(option[fields.image]) + '">';
4291
+ html += '<img class="'+deQuote(option[fields.imageClass] ? option[fields.imageClass] : className.image)+'" src="' + deQuote(option[fields.image]) + '">';
4269
4292
  }
4270
4293
  if(option[fields.icon]) {
4271
- html += '<i class="'+deQuote(option[fields.icon])+' '+(option[fields.iconClass] ? deQuote(option[fields.iconClass]) : className.icon)+'"></i>';
4294
+ html += '<i class="'+deQuote(option[fields.icon]+' '+(option[fields.iconClass] ? option[fields.iconClass] : className.icon))+'"></i>';
4272
4295
  }
4273
4296
  if(hasDescription){
4274
- html += '<span class="'+ className.description +'">'+ escape(option[fields.description] || '', preserveHTML) + '</span>';
4275
- html += (!isMenu) ? '<span class="'+ className.text + '">' : '';
4297
+ html += '<span class="'+ deQuote(className.description) +'">'+ escape(option[fields.description] || '', preserveHTML) + '</span>';
4298
+ html += (!isMenu) ? '<span class="'+ deQuote(className.text) + '">' : '';
4276
4299
  }
4277
4300
  if (isMenu) {
4278
- html += '<span class="' + className.text + '">';
4301
+ html += '<span class="' + deQuote(className.text) + '">';
4279
4302
  }
4280
4303
  html += escape(option[fields.name] || '', preserveHTML);
4281
4304
  if (isMenu) {
4282
4305
  html += '</span>';
4283
- html += '<div class="' + itemType + '">';
4306
+ html += '<div class="' + deQuote(itemType) + '">';
4284
4307
  html += $.fn.dropdown.settings.templates.menu(option, fields, preserveHTML, className);
4285
4308
  html += '</div>';
4286
4309
  } else if(hasDescription){
@@ -4289,18 +4312,18 @@ $.fn.dropdown.settings.templates = {
4289
4312
  html += '</div>';
4290
4313
  } else if (itemType === 'header') {
4291
4314
  var groupName = escape(option[fields.name] || '', preserveHTML),
4292
- groupIcon = option[fields.icon] ? deQuote(option[fields.icon]) : className.groupIcon
4315
+ groupIcon = deQuote(option[fields.icon] ? option[fields.icon] : className.groupIcon)
4293
4316
  ;
4294
4317
  if(groupName !== '' || groupIcon !== '') {
4295
- html += '<div class="' + (option[fields.class] ? deQuote(option[fields.class]) : className.header) + '">';
4318
+ html += '<div class="' + deQuote(option[fields.class] ? option[fields.class] : className.header) + '">';
4296
4319
  if (groupIcon !== '') {
4297
- html += '<i class="' + groupIcon + ' ' + (option[fields.iconClass] ? deQuote(option[fields.iconClass]) : className.icon) + '"></i>';
4320
+ html += '<i class="' + deQuote(groupIcon + ' ' + (option[fields.iconClass] ? option[fields.iconClass] : className.icon)) + '"></i>';
4298
4321
  }
4299
4322
  html += groupName;
4300
4323
  html += '</div>';
4301
4324
  }
4302
4325
  if(option[fields.divider]){
4303
- html += '<div class="'+className.divider+'"></div>';
4326
+ html += '<div class="'+deQuote(className.divider)+'"></div>';
4304
4327
  }
4305
4328
  }
4306
4329
  });
@@ -4310,8 +4333,10 @@ $.fn.dropdown.settings.templates = {
4310
4333
  // generates label for multiselect
4311
4334
  label: function(value, text, preserveHTML, className) {
4312
4335
  var
4313
- escape = $.fn.dropdown.settings.templates.escape;
4314
- return escape(text,preserveHTML) + '<i class="'+className.delete+' icon"></i>';
4336
+ escape = $.fn.dropdown.settings.templates.escape,
4337
+ deQuote = $.fn.dropdown.settings.templates.deQuote
4338
+ ;
4339
+ return escape(text,preserveHTML) + '<i class="'+deQuote(className.delete)+' icon"></i>';
4315
4340
  },
4316
4341
 
4317
4342