fomantic-ui 2.9.0-beta.31 → 2.9.0-beta.312

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 (410) 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 +9 -3
  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 +89 -30
  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 +91 -71
  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 +20 -13
  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 +29 -14
  38. package/dist/components/dimmer.js +17 -5
  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 +189 -138
  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 +12 -6
  49. package/dist/components/embed.min.css +2 -2
  50. package/dist/components/embed.min.js +3 -3
  51. package/dist/components/emoji.css +10847 -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 +1011 -902
  56. package/dist/components/flag.min.css +2 -2
  57. package/dist/components/form.css +160 -83
  58. package/dist/components/form.js +39 -30
  59. package/dist/components/form.min.css +2 -2
  60. package/dist/components/form.min.js +3 -3
  61. package/dist/components/grid.css +25 -21
  62. package/dist/components/grid.min.css +2 -2
  63. package/dist/components/header.css +6 -4
  64. package/dist/components/header.min.css +2 -2
  65. package/dist/components/icon.css +2063 -1984
  66. package/dist/components/icon.min.css +2 -2
  67. package/dist/components/image.css +1 -1
  68. package/dist/components/image.min.css +1 -1
  69. package/dist/components/input.css +759 -22
  70. package/dist/components/input.min.css +2 -2
  71. package/dist/components/item.css +17 -17
  72. package/dist/components/item.min.css +2 -2
  73. package/dist/components/label.css +72 -68
  74. package/dist/components/label.min.css +2 -2
  75. package/dist/components/list.css +31 -31
  76. package/dist/components/list.min.css +2 -2
  77. package/dist/components/loader.css +352 -352
  78. package/dist/components/loader.min.css +2 -2
  79. package/dist/components/menu.css +108 -76
  80. package/dist/components/menu.min.css +1 -1
  81. package/dist/components/message.css +43 -43
  82. package/dist/components/message.min.css +2 -2
  83. package/dist/components/modal.css +29 -4
  84. package/dist/components/modal.js +140 -56
  85. package/dist/components/modal.min.css +2 -2
  86. package/dist/components/modal.min.js +3 -3
  87. package/dist/components/nag.css +1 -1
  88. package/dist/components/nag.js +2 -2
  89. package/dist/components/nag.min.css +1 -1
  90. package/dist/components/nag.min.js +3 -3
  91. package/dist/components/placeholder.css +33 -33
  92. package/dist/components/placeholder.min.css +2 -2
  93. package/dist/components/popup.css +100 -104
  94. package/dist/components/popup.js +13 -11
  95. package/dist/components/popup.min.css +2 -2
  96. package/dist/components/popup.min.js +3 -3
  97. package/dist/components/progress.css +1 -1
  98. package/dist/components/progress.js +4 -1
  99. package/dist/components/progress.min.css +1 -1
  100. package/dist/components/progress.min.js +3 -3
  101. package/dist/components/rail.css +1 -1
  102. package/dist/components/rail.min.css +1 -1
  103. package/dist/components/rating.css +1 -1
  104. package/dist/components/rating.js +7 -3
  105. package/dist/components/rating.min.css +1 -1
  106. package/dist/components/rating.min.js +3 -3
  107. package/dist/components/reset.css +5 -4
  108. package/dist/components/reset.min.css +2 -2
  109. package/dist/components/reveal.css +1 -1
  110. package/dist/components/reveal.min.css +1 -1
  111. package/dist/components/search.css +6 -6
  112. package/dist/components/search.js +44 -14
  113. package/dist/components/search.min.css +2 -2
  114. package/dist/components/search.min.js +3 -3
  115. package/dist/components/segment.css +118 -34
  116. package/dist/components/segment.min.css +2 -2
  117. package/dist/components/shape.css +1 -1
  118. package/dist/components/shape.js +3 -3
  119. package/dist/components/shape.min.css +1 -1
  120. package/dist/components/shape.min.js +3 -3
  121. package/dist/components/sidebar.css +13 -7
  122. package/dist/components/sidebar.js +116 -37
  123. package/dist/components/sidebar.min.css +2 -2
  124. package/dist/components/sidebar.min.js +3 -3
  125. package/dist/components/site.css +139 -42
  126. package/dist/components/site.js +1 -1
  127. package/dist/components/site.min.css +2 -2
  128. package/dist/components/site.min.js +3 -3
  129. package/dist/components/slider.css +17 -17
  130. package/dist/components/slider.js +68 -51
  131. package/dist/components/slider.min.css +1 -1
  132. package/dist/components/slider.min.js +3 -3
  133. package/dist/components/state.js +2 -2
  134. package/dist/components/state.min.js +3 -3
  135. package/dist/components/statistic.css +4 -4
  136. package/dist/components/statistic.min.css +2 -2
  137. package/dist/components/step.css +31 -31
  138. package/dist/components/step.min.css +2 -2
  139. package/dist/components/sticky.css +1 -1
  140. package/dist/components/sticky.js +6 -6
  141. package/dist/components/sticky.min.css +1 -1
  142. package/dist/components/sticky.min.js +3 -3
  143. package/dist/components/tab.css +5 -5
  144. package/dist/components/tab.js +24 -6
  145. package/dist/components/tab.min.css +2 -2
  146. package/dist/components/tab.min.js +3 -3
  147. package/dist/components/table.css +1684 -272
  148. package/dist/components/table.min.css +2 -2
  149. package/dist/components/text.css +1 -1
  150. package/dist/components/text.min.css +1 -1
  151. package/dist/components/toast.css +42 -1
  152. package/dist/components/toast.js +66 -32
  153. package/dist/components/toast.min.css +2 -2
  154. package/dist/components/toast.min.js +3 -3
  155. package/dist/components/transition.css +1 -1
  156. package/dist/components/transition.js +23 -16
  157. package/dist/components/transition.min.css +1 -1
  158. package/dist/components/transition.min.js +3 -3
  159. package/dist/components/visibility.js +4 -4
  160. package/dist/components/visibility.min.js +3 -3
  161. package/dist/semantic.css +20201 -13378
  162. package/dist/semantic.js +990 -542
  163. package/dist/semantic.min.css +3 -3
  164. package/dist/semantic.min.js +3 -3
  165. package/dist/themes/default/assets/fonts/Lato-Bold.woff +0 -0
  166. package/dist/themes/default/assets/fonts/Lato-Bold.woff2 +0 -0
  167. package/dist/themes/default/assets/fonts/Lato-BoldItalic.woff +0 -0
  168. package/dist/themes/default/assets/fonts/Lato-BoldItalic.woff2 +0 -0
  169. package/dist/themes/default/assets/fonts/Lato-Italic.woff +0 -0
  170. package/dist/themes/default/assets/fonts/Lato-Italic.woff2 +0 -0
  171. package/dist/themes/default/assets/fonts/Lato-Regular.woff +0 -0
  172. package/dist/themes/default/assets/fonts/Lato-Regular.woff2 +0 -0
  173. package/dist/themes/default/assets/fonts/LatoLatin-Bold.woff +0 -0
  174. package/dist/themes/default/assets/fonts/LatoLatin-Bold.woff2 +0 -0
  175. package/dist/themes/default/assets/fonts/LatoLatin-BoldItalic.woff +0 -0
  176. package/dist/themes/default/assets/fonts/LatoLatin-BoldItalic.woff2 +0 -0
  177. package/dist/themes/default/assets/fonts/LatoLatin-Italic.woff +0 -0
  178. package/dist/themes/default/assets/fonts/LatoLatin-Italic.woff2 +0 -0
  179. package/dist/themes/default/assets/fonts/LatoLatin-Regular.woff +0 -0
  180. package/dist/themes/default/assets/fonts/LatoLatin-Regular.woff2 +0 -0
  181. package/dist/themes/default/assets/fonts/brand-icons.eot +0 -0
  182. package/dist/themes/default/assets/fonts/brand-icons.svg +801 -654
  183. package/dist/themes/default/assets/fonts/brand-icons.ttf +0 -0
  184. package/dist/themes/default/assets/fonts/brand-icons.woff +0 -0
  185. package/dist/themes/default/assets/fonts/brand-icons.woff2 +0 -0
  186. package/dist/themes/default/assets/fonts/icons.eot +0 -0
  187. package/dist/themes/default/assets/fonts/icons.svg +1175 -1079
  188. package/dist/themes/default/assets/fonts/icons.ttf +0 -0
  189. package/dist/themes/default/assets/fonts/icons.woff +0 -0
  190. package/dist/themes/default/assets/fonts/icons.woff2 +0 -0
  191. package/dist/themes/default/assets/fonts/outline-icons.eot +0 -0
  192. package/dist/themes/default/assets/fonts/outline-icons.svg +93 -95
  193. package/dist/themes/default/assets/fonts/outline-icons.ttf +0 -0
  194. package/dist/themes/default/assets/fonts/outline-icons.woff +0 -0
  195. package/dist/themes/default/assets/fonts/outline-icons.woff2 +0 -0
  196. package/dist/themes/{default → famfamfam}/assets/images/flags.png +0 -0
  197. package/examples/assets/library/iframe-content.js +8 -8
  198. package/examples/assets/library/iframe.js +3 -3
  199. package/examples/components/button.html +1 -1
  200. package/examples/components/card.html +1 -1
  201. package/examples/components/input.html +1 -1
  202. package/examples/components/menu.html +1 -1
  203. package/examples/components/site.html +1 -1
  204. package/examples/components/table.html +1 -1
  205. package/package.json +18 -16
  206. package/scripts/nightly-version.js +47 -38
  207. package/src/definitions/behaviors/api.js +88 -29
  208. package/src/definitions/behaviors/form.js +38 -29
  209. package/src/definitions/behaviors/state.js +1 -1
  210. package/src/definitions/behaviors/visibility.js +3 -3
  211. package/src/definitions/collections/form.less +229 -166
  212. package/src/definitions/collections/grid.less +723 -687
  213. package/src/definitions/collections/menu.less +232 -170
  214. package/src/definitions/collections/message.less +49 -47
  215. package/src/definitions/collections/table.less +882 -272
  216. package/src/definitions/elements/button.less +611 -469
  217. package/src/definitions/elements/container.less +145 -8
  218. package/src/definitions/elements/divider.less +24 -24
  219. package/src/definitions/elements/emoji.less +39 -10
  220. package/src/definitions/elements/flag.less +53 -18
  221. package/src/definitions/elements/header.less +46 -37
  222. package/src/definitions/elements/icon.less +39 -32
  223. package/src/definitions/elements/input.less +281 -33
  224. package/src/definitions/elements/label.less +132 -128
  225. package/src/definitions/elements/list.less +84 -75
  226. package/src/definitions/elements/loader.less +99 -98
  227. package/src/definitions/elements/placeholder.less +32 -32
  228. package/src/definitions/elements/segment.less +177 -56
  229. package/src/definitions/elements/step.less +76 -72
  230. package/src/definitions/elements/text.less +17 -15
  231. package/src/definitions/globals/reset.less +2 -2
  232. package/src/definitions/globals/site.less +25 -2
  233. package/src/definitions/modules/accordion.js +8 -2
  234. package/src/definitions/modules/accordion.less +371 -219
  235. package/src/definitions/modules/calendar.js +90 -70
  236. package/src/definitions/modules/calendar.less +20 -0
  237. package/src/definitions/modules/checkbox.js +19 -12
  238. package/src/definitions/modules/checkbox.less +83 -227
  239. package/src/definitions/modules/dimmer.js +16 -4
  240. package/src/definitions/modules/dimmer.less +22 -8
  241. package/src/definitions/modules/dropdown.js +188 -137
  242. package/src/definitions/modules/dropdown.less +201 -136
  243. package/src/definitions/modules/embed.js +11 -5
  244. package/src/definitions/modules/embed.less +4 -4
  245. package/src/definitions/modules/modal.js +139 -55
  246. package/src/definitions/modules/modal.less +66 -33
  247. package/src/definitions/modules/nag.js +1 -1
  248. package/src/definitions/modules/nag.less +20 -19
  249. package/src/definitions/modules/popup.js +12 -10
  250. package/src/definitions/modules/popup.less +86 -90
  251. package/src/definitions/modules/progress.js +3 -0
  252. package/src/definitions/modules/progress.less +19 -18
  253. package/src/definitions/modules/rating.js +6 -2
  254. package/src/definitions/modules/rating.less +35 -34
  255. package/src/definitions/modules/search.js +43 -13
  256. package/src/definitions/modules/search.less +35 -19
  257. package/src/definitions/modules/shape.js +2 -2
  258. package/src/definitions/modules/sidebar.js +115 -36
  259. package/src/definitions/modules/sidebar.less +42 -24
  260. package/src/definitions/modules/slider.js +67 -50
  261. package/src/definitions/modules/slider.less +48 -47
  262. package/src/definitions/modules/sticky.js +5 -5
  263. package/src/definitions/modules/sticky.less +3 -1
  264. package/src/definitions/modules/tab.js +23 -5
  265. package/src/definitions/modules/tab.less +4 -4
  266. package/src/definitions/modules/toast.js +65 -31
  267. package/src/definitions/modules/toast.less +51 -16
  268. package/src/definitions/modules/transition.js +22 -15
  269. package/src/definitions/views/ad.less +3 -3
  270. package/src/definitions/views/card.less +522 -375
  271. package/src/definitions/views/comment.less +93 -82
  272. package/src/definitions/views/feed.less +164 -144
  273. package/src/definitions/views/item.less +251 -198
  274. package/src/definitions/views/statistic.less +91 -89
  275. package/src/theme.less +13 -2
  276. package/src/themes/amazon/globals/site.variables +1 -0
  277. package/src/themes/basic/elements/icon.overrides +149 -149
  278. package/src/themes/basic/elements/step.overrides +2 -2
  279. package/src/themes/bookish/elements/header.overrides +1 -1
  280. package/src/themes/chubby/elements/button.overrides +1 -1
  281. package/src/themes/chubby/elements/header.overrides +1 -1
  282. package/src/themes/default/assets/fonts/Lato-Bold.woff +0 -0
  283. package/src/themes/default/assets/fonts/Lato-Bold.woff2 +0 -0
  284. package/src/themes/default/assets/fonts/Lato-BoldItalic.woff +0 -0
  285. package/src/themes/default/assets/fonts/Lato-BoldItalic.woff2 +0 -0
  286. package/src/themes/default/assets/fonts/Lato-Italic.woff +0 -0
  287. package/src/themes/default/assets/fonts/Lato-Italic.woff2 +0 -0
  288. package/src/themes/default/assets/fonts/Lato-Regular.woff +0 -0
  289. package/src/themes/default/assets/fonts/Lato-Regular.woff2 +0 -0
  290. package/src/themes/default/assets/fonts/LatoLatin-Bold.woff +0 -0
  291. package/src/themes/default/assets/fonts/LatoLatin-Bold.woff2 +0 -0
  292. package/src/themes/default/assets/fonts/LatoLatin-BoldItalic.woff +0 -0
  293. package/src/themes/default/assets/fonts/LatoLatin-BoldItalic.woff2 +0 -0
  294. package/src/themes/default/assets/fonts/LatoLatin-Italic.woff +0 -0
  295. package/src/themes/default/assets/fonts/LatoLatin-Italic.woff2 +0 -0
  296. package/src/themes/default/assets/fonts/LatoLatin-Regular.woff +0 -0
  297. package/src/themes/default/assets/fonts/LatoLatin-Regular.woff2 +0 -0
  298. package/src/themes/default/assets/fonts/brand-icons.eot +0 -0
  299. package/src/themes/default/assets/fonts/brand-icons.svg +801 -654
  300. package/src/themes/default/assets/fonts/brand-icons.ttf +0 -0
  301. package/src/themes/default/assets/fonts/brand-icons.woff +0 -0
  302. package/src/themes/default/assets/fonts/brand-icons.woff2 +0 -0
  303. package/src/themes/default/assets/fonts/icons.eot +0 -0
  304. package/src/themes/default/assets/fonts/icons.svg +1175 -1079
  305. package/src/themes/default/assets/fonts/icons.ttf +0 -0
  306. package/src/themes/default/assets/fonts/icons.woff +0 -0
  307. package/src/themes/default/assets/fonts/icons.woff2 +0 -0
  308. package/src/themes/default/assets/fonts/outline-icons.eot +0 -0
  309. package/src/themes/default/assets/fonts/outline-icons.svg +93 -95
  310. package/src/themes/default/assets/fonts/outline-icons.ttf +0 -0
  311. package/src/themes/default/assets/fonts/outline-icons.woff +0 -0
  312. package/src/themes/default/assets/fonts/outline-icons.woff2 +0 -0
  313. package/src/themes/default/collections/form.variables +4 -0
  314. package/src/themes/default/collections/menu.variables +6 -0
  315. package/src/themes/default/collections/table.variables +52 -0
  316. package/src/themes/default/elements/button.variables +7 -1
  317. package/src/themes/default/elements/container.variables +12 -0
  318. package/src/themes/default/elements/divider.overrides +7 -7
  319. package/src/themes/default/elements/emoji.overrides +0 -3090
  320. package/src/themes/default/elements/emoji.variables +3575 -1
  321. package/src/themes/default/elements/flag.overrides +0 -991
  322. package/src/themes/default/elements/flag.variables +1609 -5
  323. package/src/themes/default/elements/icon.overrides +1975 -1949
  324. package/src/themes/default/elements/icon.variables +1 -0
  325. package/src/themes/default/elements/input.variables +15 -0
  326. package/src/themes/default/elements/segment.variables +8 -0
  327. package/src/themes/default/elements/step.overrides +3 -3
  328. package/src/themes/default/globals/site.variables +109 -8
  329. package/src/themes/default/globals/variation.variables +143 -6
  330. package/src/themes/default/modules/accordion.overrides +6 -5
  331. package/src/themes/default/modules/accordion.variables +49 -2
  332. package/src/themes/default/modules/calendar.variables +3 -0
  333. package/src/themes/default/modules/checkbox.overrides +9 -9
  334. package/src/themes/default/modules/checkbox.variables +5 -5
  335. package/src/themes/default/modules/dimmer.variables +1 -1
  336. package/src/themes/default/modules/dropdown.overrides +5 -5
  337. package/src/themes/default/modules/dropdown.variables +7 -10
  338. package/src/themes/default/modules/modal.variables +14 -0
  339. package/src/themes/default/modules/popup.variables +0 -2
  340. package/src/themes/default/modules/toast.variables +3 -0
  341. package/src/themes/default/views/card.variables +8 -0
  342. package/src/themes/{default → famfamfam}/assets/images/flags.png +0 -0
  343. package/src/themes/famfamfam/elements/flag.overrides +1026 -0
  344. package/src/themes/famfamfam/elements/flag.variables +20 -0
  345. package/src/themes/github/elements/icon.overrides +206 -206
  346. package/src/themes/github/elements/step.overrides +5 -5
  347. package/src/themes/github/globals/site.variables +1 -0
  348. package/src/themes/github/modules/dropdown.overrides +6 -6
  349. package/src/themes/instagram/views/card.overrides +1 -1
  350. package/src/themes/joypixels/elements/emoji.overrides +0 -3089
  351. package/src/themes/joypixels/elements/emoji.variables +3574 -5
  352. package/src/themes/material/collections/menu.overrides +1 -1
  353. package/src/themes/material/elements/button.overrides +1 -1
  354. package/src/themes/material/elements/header.overrides +1 -1
  355. package/src/themes/material/elements/icon.overrides +932 -932
  356. package/src/themes/material/globals/site.variables +0 -1
  357. package/src/themes/material/modules/dropdown.overrides +1 -1
  358. package/src/themes/material/modules/modal.overrides +1 -1
  359. package/src/themes/pulsar/elements/loader.overrides +2 -2
  360. package/src/themes/resetcss/globals/reset.overrides +3 -3
  361. package/src/themes/rtl/globals/site.overrides +1 -1
  362. package/src/themes/striped/modules/progress.overrides +1 -1
  363. package/src/themes/systemfont/globals/reset.overrides +8 -0
  364. package/src/themes/systemfont/globals/site.variables +10 -0
  365. package/src/themes/twitter/elements/emoji.overrides +0 -3091
  366. package/src/themes/twitter/elements/emoji.variables +3570 -6
  367. package/tasks/admin/distributions/create.js +1 -1
  368. package/tasks/admin/publish.js +1 -1
  369. package/tasks/admin/release.js +1 -1
  370. package/tasks/build/assets.js +1 -1
  371. package/tasks/build/css.js +9 -4
  372. package/tasks/build/javascript.js +3 -3
  373. package/tasks/check-install.js +1 -1
  374. package/tasks/clean.js +1 -1
  375. package/tasks/collections/README.md +1 -1
  376. package/tasks/collections/admin.js +1 -1
  377. package/tasks/config/admin/oauth.example.js +1 -1
  378. package/tasks/config/admin/templates/composer.json +1 -1
  379. package/tasks/config/project/install.js +15 -13
  380. package/tasks/install.js +1 -0
  381. package/tasks/rtl/watch.js +1 -1
  382. package/tasks/version.js +1 -1
  383. package/test/fixtures/accordion.html +1 -1
  384. package/test/fixtures/checkbox.html +1 -1
  385. package/test/fixtures/dropdown.html +1 -1
  386. package/test/fixtures/modal.html +1 -1
  387. package/test/fixtures/popup.html +1 -1
  388. package/test/fixtures/rating.html +1 -1
  389. package/test/fixtures/shape.html +1 -1
  390. package/test/fixtures/sidebar.html +1 -1
  391. package/test/fixtures/tab.html +1 -1
  392. package/test/fixtures/transition.html +1 -1
  393. package/test/fixtures/video.html +1 -1
  394. package/test/helpers/jasmine-jquery.js +2 -2
  395. package/test/helpers/jasmine-sinon.js +1 -1
  396. package/test/helpers/jquery-events.js +1 -1
  397. package/test/helpers/sinon.js +3 -3
  398. package/test/meteor/fonts.js +1 -1
  399. package/test/modules/accordion.spec.js +1 -1
  400. package/test/modules/checkbox.spec.js +1 -1
  401. package/test/modules/dropdown.spec.js +1 -1
  402. package/test/modules/modal.spec.js +1 -1
  403. package/test/modules/module.spec.js +1 -1
  404. package/test/modules/popup.spec.js +1 -1
  405. package/test/modules/search.spec.js +1 -1
  406. package/test/modules/shape.spec.js +1 -1
  407. package/test/modules/sidebar.spec.js +1 -1
  408. package/test/modules/tab.spec.js +1 -1
  409. package/test/modules/transition.spec.js +1 -1
  410. package/test/modules/video.spec.js +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * # Fomantic-UI 2.9.0-beta.31 - Dropdown
2
+ * # Fomantic-UI 2.9.0-beta.312+86121ef - 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
  },
@@ -370,11 +366,20 @@ $.fn.dropdown = function(parameters) {
370
366
  }
371
367
  if( module.is.search() && !module.has.search() ) {
372
368
  module.verbose('Adding search input');
369
+ var
370
+ labelNode = $module.prev('label')
371
+ ;
373
372
  $search = $('<input />')
374
373
  .addClass(className.search)
375
374
  .prop('autocomplete', module.is.chrome() ? 'fomantic-search' : 'off')
376
- .insertBefore($text)
377
375
  ;
376
+ if (labelNode.length) {
377
+ if (!labelNode.attr('id')) {
378
+ labelNode.attr('id', module.get.id() + '_formLabel');
379
+ }
380
+ $search.attr('aria-labelledby', labelNode.attr('id'));
381
+ }
382
+ $search.insertBefore($text);
378
383
  }
379
384
  if( module.is.multiple() && module.is.searchSelection() && !module.has.sizer()) {
380
385
  module.create.sizer();
@@ -421,6 +426,9 @@ $.fn.dropdown = function(parameters) {
421
426
  module.debug('Disabling dropdown');
422
427
  $module.addClass(className.disabled);
423
428
  }
429
+ if($input.is('[required]')) {
430
+ settings.forceSelection = true;
431
+ }
424
432
  $input
425
433
  .removeAttr('required')
426
434
  .removeAttr('class')
@@ -440,7 +448,7 @@ $.fn.dropdown = function(parameters) {
440
448
  // replace module reference
441
449
  $module = $module.parent(selector.dropdown);
442
450
  instance = $module.data(moduleNamespace);
443
- element = $module.get(0);
451
+ element = $module[0];
444
452
  module.refresh();
445
453
  module.setup.returnedObject();
446
454
  },
@@ -537,9 +545,7 @@ $.fn.dropdown = function(parameters) {
537
545
  }
538
546
  if(settings.onShow.call(element) !== false) {
539
547
  module.animate.show(function() {
540
- if( module.can.click() ) {
541
- module.bind.intent();
542
- }
548
+ module.bind.intent();
543
549
  if(module.has.search() && !preventFocus) {
544
550
  module.focusSearch();
545
551
  }
@@ -566,8 +572,17 @@ $.fn.dropdown = function(parameters) {
566
572
  }
567
573
  callback.call(element);
568
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
+ }
569
584
  }
570
- } else if( module.can.click() ) {
585
+ } else {
571
586
  module.unbind.intent();
572
587
  }
573
588
  iconClicked = false;
@@ -625,13 +640,18 @@ $.fn.dropdown = function(parameters) {
625
640
  $module
626
641
  .on('change' + eventNamespace, selector.input, module.event.change)
627
642
  ;
643
+ if(module.is.multiple() && module.is.searchSelection()) {
644
+ $module
645
+ .on('paste' + eventNamespace, selector.search, module.event.paste)
646
+ ;
647
+ }
628
648
  },
629
649
  mouseEvents: function() {
630
650
  module.verbose('Binding mouse events');
631
651
  if(module.is.multiple()) {
632
652
  $module
633
- .on(clickEvent + eventNamespace, selector.label, module.event.label.click)
634
- .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)
635
655
  ;
636
656
  }
637
657
  if( module.is.searchSelection() ) {
@@ -640,31 +660,33 @@ $.fn.dropdown = function(parameters) {
640
660
  .on('mouseup' + eventNamespace, module.event.mouseup)
641
661
  .on('mousedown' + eventNamespace, selector.menu, module.event.menu.mousedown)
642
662
  .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)
663
+ .on('click' + eventNamespace, selector.icon, module.event.icon.click)
664
+ .on('click' + eventNamespace, selector.clearIcon, module.event.clearIcon.click)
645
665
  .on('focus' + eventNamespace, selector.search, module.event.search.focus)
646
- .on(clickEvent + eventNamespace, selector.search, module.event.search.focus)
666
+ .on('click' + eventNamespace, selector.search, module.event.search.focus)
647
667
  .on('blur' + eventNamespace, selector.search, module.event.search.blur)
648
- .on(clickEvent + eventNamespace, selector.text, module.event.text.focus)
668
+ .on('click' + eventNamespace, selector.text, module.event.text.focus)
649
669
  ;
650
670
  if(module.is.multiple()) {
651
671
  $module
652
- .on(clickEvent + eventNamespace, module.event.click)
653
- .on(clickEvent + eventNamespace, module.event.search.focus)
672
+ .on('click' + eventNamespace, module.event.click)
673
+ .on('click' + eventNamespace, module.event.search.focus)
654
674
  ;
655
675
  }
656
676
  }
657
677
  else {
658
678
  if(settings.on == 'click') {
659
679
  $module
660
- .on(clickEvent + eventNamespace, selector.icon, module.event.icon.click)
661
- .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)
662
682
  ;
663
683
  }
664
684
  else if(settings.on == 'hover') {
665
685
  $module
666
686
  .on('mouseenter' + eventNamespace, module.delay.show)
667
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)
668
690
  ;
669
691
  }
670
692
  else {
@@ -676,7 +698,7 @@ $.fn.dropdown = function(parameters) {
676
698
  .on('mousedown' + eventNamespace, module.event.mousedown)
677
699
  .on('mouseup' + eventNamespace, module.event.mouseup)
678
700
  .on('focus' + eventNamespace, module.event.focus)
679
- .on(clickEvent + eventNamespace, selector.clearIcon, module.event.clearIcon.click)
701
+ .on('click' + eventNamespace, selector.clearIcon, module.event.clearIcon.click)
680
702
  ;
681
703
  if(module.has.menuSearch() ) {
682
704
  $module
@@ -690,21 +712,16 @@ $.fn.dropdown = function(parameters) {
690
712
  }
691
713
  }
692
714
  $menu
693
- .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)
694
717
  .on('mouseleave' + eventNamespace, selector.item, module.event.item.mouseleave)
695
718
  .on('click' + eventNamespace, selector.item, module.event.item.click)
696
719
  ;
697
720
  },
698
721
  intent: function() {
699
722
  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
723
  $document
707
- .on(clickEvent + elementNamespace, module.event.test.hide)
724
+ .on('click' + elementNamespace, module.event.test.hide)
708
725
  ;
709
726
  }
710
727
  },
@@ -712,14 +729,8 @@ $.fn.dropdown = function(parameters) {
712
729
  unbind: {
713
730
  intent: function() {
714
731
  module.verbose('Removing hide intent event from document');
715
- if(hasTouch) {
716
- $document
717
- .off('touchstart' + elementNamespace)
718
- .off('touchmove' + elementNamespace)
719
- ;
720
- }
721
732
  $document
722
- .off(clickEvent + elementNamespace)
733
+ .off('click' + elementNamespace)
723
734
  ;
724
735
  }
725
736
  },
@@ -812,20 +823,28 @@ $.fn.dropdown = function(parameters) {
812
823
  throttle : settings.throttle,
813
824
  urlData : {
814
825
  query: query
815
- },
816
- onError: function() {
826
+ }
827
+ },
828
+ apiCallbacks = {
829
+ onError: function(errorMessage, $module, xhr) {
817
830
  module.add.message(message.serverError);
818
831
  iconClicked = false;
819
832
  focused = false;
820
833
  callback.apply(null, callbackParameters);
834
+ if(typeof settings.apiSettings.onError === 'function') {
835
+ settings.apiSettings.onError.call(this, errorMessage, $module, xhr);
836
+ }
821
837
  },
822
- onFailure: function() {
838
+ onFailure: function(response, $module, xhr) {
823
839
  module.add.message(message.serverError);
824
840
  iconClicked = false;
825
841
  focused = false;
826
842
  callback.apply(null, callbackParameters);
843
+ if(typeof settings.apiSettings.onFailure === 'function') {
844
+ settings.apiSettings.onFailure.call(this, response, $module, xhr);
845
+ }
827
846
  },
828
- onSuccess : function(response) {
847
+ onSuccess : function(response, $module, xhr) {
829
848
  var
830
849
  values = response[fields.remoteValues]
831
850
  ;
@@ -844,19 +863,22 @@ $.fn.dropdown = function(parameters) {
844
863
  var value = module.is.multiple() ? module.get.values() : module.get.value();
845
864
  if (value !== '') {
846
865
  module.verbose('Value(s) present after click icon, select value(s) in items');
847
- module.set.selected(value, null, null, true);
866
+ module.set.selected(value, null, true, true);
848
867
  }
849
868
  }
850
869
  iconClicked = false;
851
870
  focused = false;
852
871
  callback.apply(null, callbackParameters);
872
+ if(typeof settings.apiSettings.onSuccess === 'function') {
873
+ settings.apiSettings.onSuccess.call(this, response, $module, xhr);
874
+ }
853
875
  }
854
876
  }
855
877
  ;
856
878
  if( !$module.api('get request') ) {
857
879
  module.setup.api();
858
880
  }
859
- apiSettings = $.extend(true, {}, apiSettings, settings.apiSettings);
881
+ apiSettings = $.extend(true, {}, apiSettings, settings.apiSettings, apiCallbacks);
860
882
  $module
861
883
  .api('setting', apiSettings)
862
884
  .api('query')
@@ -1044,7 +1066,7 @@ $.fn.dropdown = function(parameters) {
1044
1066
  menuConfig[fields.values] = values;
1045
1067
  module.setup.menu(menuConfig);
1046
1068
  $.each(values, function(index, item) {
1047
- if(item.selected == true) {
1069
+ if(item.selected === true) {
1048
1070
  module.debug('Setting initial selection to', item[fields.value]);
1049
1071
  module.set.selected(item[fields.value]);
1050
1072
  if(!module.is.multiple()) {
@@ -1065,7 +1087,7 @@ $.fn.dropdown = function(parameters) {
1065
1087
  settings.preserveHTML
1066
1088
  )
1067
1089
  ;
1068
- $input.append('<option value="' + value + '">' + name + '</option>');
1090
+ $input.append('<option value="' + value + '"' + (item.selected === true ? ' selected' : '') + '>' + name + '</option>');
1069
1091
  });
1070
1092
  module.observe.select();
1071
1093
  }
@@ -1073,6 +1095,15 @@ $.fn.dropdown = function(parameters) {
1073
1095
  },
1074
1096
 
1075
1097
  event: {
1098
+ paste: function(event) {
1099
+ var pasteValue = (event.originalEvent.clipboardData || window.clipboardData).getData('text'),
1100
+ tokens = pasteValue.split(settings.delimiter)
1101
+ ;
1102
+ tokens.forEach(function(value){
1103
+ module.set.selected(module.escape.htmlEntities(value.trim()), null, true, true);
1104
+ });
1105
+ event.preventDefault();
1106
+ },
1076
1107
  change: function() {
1077
1108
  if(!internalChange) {
1078
1109
  module.debug('Input changed, updating selection');
@@ -1131,7 +1162,7 @@ $.fn.dropdown = function(parameters) {
1131
1162
  if(module.is.multiple()) {
1132
1163
  module.remove.activeLabel();
1133
1164
  }
1134
- if(!focused && !module.is.active() && (settings.showOnFocus || (event.type !== 'focus' && event.type !== 'focusin'))) {
1165
+ if(!focused && !module.is.active() && (settings.showOnFocus || (event.type !== 'focus' && event.type !== 'focusin')) && event.type !== 'touchstart') {
1135
1166
  focused = true;
1136
1167
  module.search();
1137
1168
  }
@@ -1249,23 +1280,12 @@ $.fn.dropdown = function(parameters) {
1249
1280
  if (!module.is.multiple() || (module.is.multiple() && !module.is.active())) {
1250
1281
  focused = true;
1251
1282
  }
1252
- if( module.determine.eventOnElement(event, toggleBehavior) ) {
1283
+ if( module.determine.eventOnElement(event, toggleBehavior) && event.type !== 'touchstart') {
1284
+ // do not preventDefault of touchstart; so emulated mouseenter is triggered on first touch and not later
1285
+ // (when selecting an item). The double-showing of the dropdown through both events does not hurt.
1253
1286
  event.preventDefault();
1254
1287
  }
1255
1288
  },
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
1289
  hide: function(event) {
1270
1290
  if(module.determine.eventInModule(event, module.hide)){
1271
1291
  if(element.id && $(event.target).attr('for') === element.id){
@@ -1285,8 +1305,8 @@ $.fn.dropdown = function(parameters) {
1285
1305
  },
1286
1306
  select: {
1287
1307
  mutation: function(mutations) {
1288
- module.debug('<select> modified, recreating menu');
1289
1308
  if(module.is.selectMutation(mutations)) {
1309
+ module.debug('<select> modified, recreating menu');
1290
1310
  module.disconnect.selectObserver();
1291
1311
  module.refresh();
1292
1312
  module.setup.select();
@@ -1349,13 +1369,15 @@ $.fn.dropdown = function(parameters) {
1349
1369
  },
1350
1370
  mouseleave: function(event) {
1351
1371
  var
1352
- $subMenu = $(this).children(selector.menu)
1372
+ $subMenu = $(this).find(selector.menu)
1353
1373
  ;
1354
1374
  if($subMenu.length > 0) {
1355
1375
  clearTimeout(module.itemTimer);
1356
1376
  module.itemTimer = setTimeout(function() {
1357
1377
  module.verbose('Hiding sub-menu', $subMenu);
1358
- module.animate.hide(false, $subMenu);
1378
+ $subMenu.each(function() {
1379
+ module.animate.hide(false, $(this));
1380
+ });
1359
1381
  }, settings.delay.hide);
1360
1382
  }
1361
1383
  },
@@ -1381,7 +1403,7 @@ $.fn.dropdown = function(parameters) {
1381
1403
  module.remove.userAddition();
1382
1404
  }
1383
1405
  module.remove.searchTerm();
1384
- if(!module.is.focusedOnSearch() && !(skipRefocus == true)) {
1406
+ if(!module.is.focusedOnSearch() && skipRefocus !== true) {
1385
1407
  module.focusSearch(true);
1386
1408
  }
1387
1409
  }
@@ -1513,7 +1535,7 @@ $.fn.dropdown = function(parameters) {
1513
1535
  keydown: function(event) {
1514
1536
  var
1515
1537
  pressedKey = event.which,
1516
- isShortcutKey = module.is.inObject(pressedKey, keys)
1538
+ isShortcutKey = module.is.inObject(pressedKey, keys) || event.key === settings.delimiter
1517
1539
  ;
1518
1540
  if(isShortcutKey) {
1519
1541
  var
@@ -1531,7 +1553,7 @@ $.fn.dropdown = function(parameters) {
1531
1553
  hasSubMenu = ($subMenu.length> 0),
1532
1554
  hasSelectedItem = ($selectedItem.length > 0),
1533
1555
  selectedIsSelectable = ($selectedItem.not(selector.unselectable).length > 0),
1534
- delimiterPressed = (pressedKey == keys.delimiter && settings.allowAdditions && module.is.multiple()),
1556
+ delimiterPressed = (event.key === settings.delimiter && module.is.multiple()),
1535
1557
  isAdditionWithoutMenu = (settings.allowAdditions && settings.hideAdditions && (pressedKey == keys.enter || delimiterPressed) && selectedIsSelectable),
1536
1558
  $nextItem,
1537
1559
  isSubMenuItem,
@@ -1629,7 +1651,7 @@ $.fn.dropdown = function(parameters) {
1629
1651
  .addClass(className.selected)
1630
1652
  ;
1631
1653
  module.set.scrollPosition($nextItem);
1632
- if(settings.selectOnKeydown && module.is.single()) {
1654
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
1633
1655
  module.set.selectedItem($nextItem);
1634
1656
  }
1635
1657
  }
@@ -1656,7 +1678,7 @@ $.fn.dropdown = function(parameters) {
1656
1678
  .addClass(className.selected)
1657
1679
  ;
1658
1680
  module.set.scrollPosition($nextItem);
1659
- if(settings.selectOnKeydown && module.is.single()) {
1681
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
1660
1682
  module.set.selectedItem($nextItem);
1661
1683
  }
1662
1684
  }
@@ -1677,6 +1699,7 @@ $.fn.dropdown = function(parameters) {
1677
1699
  if(pressedKey == keys.escape) {
1678
1700
  module.verbose('Escape key pressed, closing dropdown');
1679
1701
  module.hide();
1702
+ event.stopPropagation();
1680
1703
  }
1681
1704
 
1682
1705
  }
@@ -1787,7 +1810,7 @@ $.fn.dropdown = function(parameters) {
1787
1810
  ;
1788
1811
  if( module.can.activate( $(element) ) ) {
1789
1812
  module.set.selected(value, $(element));
1790
- if(!module.is.multiple()) {
1813
+ if(!module.is.multiple() && !(!settings.collapseOnActionable && $(element).hasClass(className.actionable))) {
1791
1814
  module.hideAndClear();
1792
1815
  }
1793
1816
  }
@@ -1800,7 +1823,7 @@ $.fn.dropdown = function(parameters) {
1800
1823
  ;
1801
1824
  if( module.can.activate( $(element) ) ) {
1802
1825
  module.set.value(value, text, $(element));
1803
- if(!module.is.multiple()) {
1826
+ if(!module.is.multiple() && !(!settings.collapseOnActionable && $(element).hasClass(className.actionable))) {
1804
1827
  module.hideAndClear();
1805
1828
  }
1806
1829
  }
@@ -1851,7 +1874,7 @@ $.fn.dropdown = function(parameters) {
1851
1874
  ;
1852
1875
  $sizer.text(value);
1853
1876
  // prevent rounding issues
1854
- return Math.ceil( $sizer.width() + 1);
1877
+ return Math.ceil( $sizer.width() + (module.is.edge() ? 3 : 1));
1855
1878
  },
1856
1879
  selectionCount: function() {
1857
1880
  var
@@ -1898,7 +1921,7 @@ $.fn.dropdown = function(parameters) {
1898
1921
  },
1899
1922
  caretPosition: function(returnEndPos) {
1900
1923
  var
1901
- input = $search.get(0),
1924
+ input = $search[0],
1902
1925
  range,
1903
1926
  rangeLength
1904
1927
  ;
@@ -2320,7 +2343,7 @@ $.fn.dropdown = function(parameters) {
2320
2343
  module.error(error.noStorage);
2321
2344
  return;
2322
2345
  }
2323
- name = sessionStorage.getItem(value);
2346
+ name = sessionStorage.getItem(value + elementNamespace);
2324
2347
  return (name !== undefined)
2325
2348
  ? name
2326
2349
  : false
@@ -2364,7 +2387,7 @@ $.fn.dropdown = function(parameters) {
2364
2387
  return;
2365
2388
  }
2366
2389
  module.verbose('Saving remote data to session storage', value, name);
2367
- sessionStorage.setItem(value, name);
2390
+ sessionStorage.setItem(value + elementNamespace, name);
2368
2391
  }
2369
2392
  },
2370
2393
 
@@ -2424,7 +2447,7 @@ $.fn.dropdown = function(parameters) {
2424
2447
  $nextSelectedItem
2425
2448
  .addClass(className.selected)
2426
2449
  ;
2427
- if(settings.selectOnKeydown && module.is.single()) {
2450
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
2428
2451
  module.set.selectedItem($nextSelectedItem);
2429
2452
  }
2430
2453
  $menu
@@ -2510,7 +2533,7 @@ $.fn.dropdown = function(parameters) {
2510
2533
  var
2511
2534
  length = module.get.query().length
2512
2535
  ;
2513
- $search.val( text.substr(0, length));
2536
+ $search.val( text.slice(0, length));
2514
2537
  },
2515
2538
  scrollPosition: function($item, forceScroll) {
2516
2539
  var
@@ -2627,13 +2650,13 @@ $.fn.dropdown = function(parameters) {
2627
2650
  module.set.scrollPosition($nextValue);
2628
2651
  $selectedItem.removeClass(className.selected);
2629
2652
  $nextValue.addClass(className.selected);
2630
- if(settings.selectOnKeydown && module.is.single()) {
2653
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
2631
2654
  module.set.selectedItem($nextValue);
2632
2655
  }
2633
2656
  }
2634
2657
  },
2635
2658
  direction: function($menu) {
2636
- if(settings.direction == 'auto') {
2659
+ if(settings.direction === 'auto') {
2637
2660
  // reset position, remove upward if it's base menu
2638
2661
  if (!$menu) {
2639
2662
  module.remove.upward();
@@ -2652,7 +2675,7 @@ $.fn.dropdown = function(parameters) {
2652
2675
  module.set.leftward($menu);
2653
2676
  }
2654
2677
  }
2655
- else if(settings.direction == 'upward') {
2678
+ else if(settings.direction === 'upward') {
2656
2679
  module.set.upward($menu);
2657
2680
  }
2658
2681
  },
@@ -2665,6 +2688,11 @@ $.fn.dropdown = function(parameters) {
2665
2688
  $element.addClass(className.leftward);
2666
2689
  },
2667
2690
  value: function(value, text, $selected, preventChangeTrigger) {
2691
+ if(typeof text === 'boolean') {
2692
+ preventChangeTrigger = text;
2693
+ $selected = undefined;
2694
+ text = undefined;
2695
+ }
2668
2696
  if(value !== undefined && value !== '' && !(Array.isArray(value) && value.length === 0)) {
2669
2697
  $input.removeClass(className.noselection);
2670
2698
  } else {
@@ -2728,12 +2756,21 @@ $.fn.dropdown = function(parameters) {
2728
2756
  visible: function() {
2729
2757
  $module.addClass(className.visible);
2730
2758
  },
2731
- exactly: function(value, $selectedItem) {
2759
+ exactly: function(value, $selectedItem, preventChangeTrigger) {
2760
+ if(typeof $selectedItem === 'boolean') {
2761
+ preventChangeTrigger = $selectedItem;
2762
+ $selectedItem = undefined;
2763
+ }
2732
2764
  module.debug('Setting selected to exact values');
2733
2765
  module.clear();
2734
- module.set.selected(value, $selectedItem);
2766
+ module.set.selected(value, $selectedItem, preventChangeTrigger);
2735
2767
  },
2736
2768
  selected: function(value, $selectedItem, preventChangeTrigger, keepSearchTerm) {
2769
+ if(typeof $selectedItem === 'boolean') {
2770
+ keepSearchTerm = preventChangeTrigger;
2771
+ preventChangeTrigger = $selectedItem;
2772
+ $selectedItem = undefined;
2773
+ }
2737
2774
  var
2738
2775
  isMultiple = module.is.multiple()
2739
2776
  ;
@@ -2765,23 +2802,30 @@ $.fn.dropdown = function(parameters) {
2765
2802
 
2766
2803
  isFiltered = $selected.hasClass(className.filtered),
2767
2804
  isActive = $selected.hasClass(className.active),
2805
+ isActionable = $selected.hasClass(className.actionable),
2768
2806
  isUserValue = $selected.hasClass(className.addition),
2769
- shouldAnimate = (isMultiple && $selectedItem.length == 1)
2807
+ shouldAnimate = (isMultiple && $selectedItem && $selectedItem.length === 1)
2770
2808
  ;
2771
- if(isMultiple) {
2809
+ if(isActionable){
2810
+ if((!isMultiple || (!isActive || isUserValue)) && settings.apiSettings && settings.saveRemoteData) {
2811
+ module.save.remoteData(selectedText, selectedValue);
2812
+ }
2813
+ settings.onActionable.call(element, selectedValue, selectedText, $selected);
2814
+ }
2815
+ else if(isMultiple) {
2772
2816
  if(!isActive || isUserValue) {
2773
2817
  if(settings.apiSettings && settings.saveRemoteData) {
2774
2818
  module.save.remoteData(selectedText, selectedValue);
2775
2819
  }
2776
2820
  if(settings.useLabels) {
2821
+ module.add.value(selectedValue, selectedText, $selected, preventChangeTrigger);
2777
2822
  module.add.label(selectedValue, selectedText, shouldAnimate);
2778
- module.add.value(selectedValue, selectedText, $selected);
2779
2823
  module.set.activeItem($selected);
2780
2824
  module.filterActive();
2781
2825
  module.select.nextAvailable($selectedItem);
2782
2826
  }
2783
2827
  else {
2784
- module.add.value(selectedValue, selectedText, $selected);
2828
+ module.add.value(selectedValue, selectedText, $selected, preventChangeTrigger);
2785
2829
  module.set.text(module.add.variables(message.count));
2786
2830
  module.set.activeItem($selected);
2787
2831
  }
@@ -2795,7 +2839,7 @@ $.fn.dropdown = function(parameters) {
2795
2839
  if(settings.apiSettings && settings.saveRemoteData) {
2796
2840
  module.save.remoteData(selectedText, selectedValue);
2797
2841
  }
2798
- if (!keepSearchTerm) {
2842
+ if (!keepSearchTerm && !$selected.hasClass(className.actionable)) {
2799
2843
  module.set.text(selectedText);
2800
2844
  }
2801
2845
  module.set.value(selectedValue, selectedText, $selected, preventChangeTrigger);
@@ -2847,6 +2891,7 @@ $.fn.dropdown = function(parameters) {
2847
2891
  animation : settings.label.transition,
2848
2892
  debug : settings.debug,
2849
2893
  verbose : settings.verbose,
2894
+ silent : settings.silent,
2850
2895
  duration : settings.label.duration
2851
2896
  })
2852
2897
  ;
@@ -2894,7 +2939,7 @@ $.fn.dropdown = function(parameters) {
2894
2939
  $('<option/>')
2895
2940
  .prop('value', escapedValue)
2896
2941
  .addClass(className.addition)
2897
- .html(value)
2942
+ .text(value)
2898
2943
  .appendTo($input)
2899
2944
  ;
2900
2945
  module.verbose('Adding user addition as an <option>', value);
@@ -2970,7 +3015,12 @@ $.fn.dropdown = function(parameters) {
2970
3015
  }
2971
3016
  return message;
2972
3017
  },
2973
- value: function(addedValue, addedText, $selectedItem) {
3018
+ value: function(addedValue, addedText, $selectedItem, preventChangeTrigger) {
3019
+ if(typeof addedText === 'boolean') {
3020
+ preventChangeTrigger = addedText;
3021
+ $selectedItem = undefined;
3022
+ addedText = undefined;
3023
+ }
2974
3024
  var
2975
3025
  currentValue = module.get.values(true),
2976
3026
  newValue
@@ -2985,7 +3035,7 @@ $.fn.dropdown = function(parameters) {
2985
3035
  }
2986
3036
  // extend current array
2987
3037
  if(Array.isArray(currentValue)) {
2988
- newValue = currentValue.concat([addedValue]);
3038
+ newValue = $selectedItem && $selectedItem.hasClass(className.actionable) ? currentValue : currentValue.concat([addedValue]);
2989
3039
  newValue = module.get.uniqueArray(newValue);
2990
3040
  }
2991
3041
  else {
@@ -3009,7 +3059,7 @@ $.fn.dropdown = function(parameters) {
3009
3059
  else {
3010
3060
  settings.onAdd.call(element, addedValue, addedText, $selectedItem);
3011
3061
  }
3012
- module.set.value(newValue, addedText, $selectedItem);
3062
+ module.set.value(newValue, addedText, $selectedItem, preventChangeTrigger);
3013
3063
  module.check.maxSelections();
3014
3064
  },
3015
3065
  },
@@ -3069,18 +3119,10 @@ $.fn.dropdown = function(parameters) {
3069
3119
  return;
3070
3120
  }
3071
3121
  // temporarily disconnect observer
3072
- if(selectObserver) {
3073
- selectObserver.disconnect();
3074
- module.verbose('Temporarily disconnecting mutation observer');
3075
- }
3122
+ module.disconnect.selectObserver();
3076
3123
  $option.remove();
3077
3124
  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
- }
3125
+ module.observe.select();
3084
3126
  },
3085
3127
  message: function() {
3086
3128
  $menu.children(selector.message).remove();
@@ -3379,8 +3421,11 @@ $.fn.dropdown = function(parameters) {
3379
3421
  bubbledIconClick: function(event) {
3380
3422
  return $(event.target).closest($icon).length > 0;
3381
3423
  },
3424
+ edge: function() {
3425
+ return !!window.chrome && !!window.StyleMedia;
3426
+ },
3382
3427
  chrome: function() {
3383
- return !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);
3428
+ return !!window.chrome && !window.StyleMedia;
3384
3429
  },
3385
3430
  alreadySetup: function() {
3386
3431
  return ($module.is('select') && $module.parent(selector.dropdown).data(moduleNamespace) !== undefined && $module.prev().length === 0);
@@ -3445,7 +3490,7 @@ $.fn.dropdown = function(parameters) {
3445
3490
  selectChanged = false
3446
3491
  ;
3447
3492
  $.each(mutations, function(index, mutation) {
3448
- if($(mutation.target).is('select') || $(mutation.addedNodes).is('select')) {
3493
+ if($(mutation.target).is('select, option, optgroup') || $(mutation.addedNodes).is('select')) {
3449
3494
  selectChanged = true;
3450
3495
  return false;
3451
3496
  }
@@ -3476,7 +3521,7 @@ $.fn.dropdown = function(parameters) {
3476
3521
  },
3477
3522
  verticallyScrollableContext: function() {
3478
3523
  var
3479
- overflowY = ($context.get(0) !== window)
3524
+ overflowY = ($context[0] !== window)
3480
3525
  ? $context.css('overflow-y')
3481
3526
  : false
3482
3527
  ;
@@ -3484,7 +3529,7 @@ $.fn.dropdown = function(parameters) {
3484
3529
  },
3485
3530
  horizontallyScrollableContext: function() {
3486
3531
  var
3487
- overflowX = ($context.get(0) !== window)
3532
+ overflowX = ($context[0] !== window)
3488
3533
  ? $context.css('overflow-X')
3489
3534
  : false
3490
3535
  ;
@@ -3517,7 +3562,7 @@ $.fn.dropdown = function(parameters) {
3517
3562
  ;
3518
3563
  calculations = {
3519
3564
  context: {
3520
- offset : ($context.get(0) === window)
3565
+ offset : ($context[0] === window)
3521
3566
  ? { top: 0, left: 0}
3522
3567
  : $context.offset(),
3523
3568
  scrollTop : $context.scrollTop(),
@@ -3565,7 +3610,7 @@ $.fn.dropdown = function(parameters) {
3565
3610
  ;
3566
3611
  calculations = {
3567
3612
  context: {
3568
- offset : ($context.get(0) === window)
3613
+ offset : ($context[0] === window)
3569
3614
  ? { top: 0, left: 0}
3570
3615
  : $context.offset(),
3571
3616
  scrollLeft : $context.scrollLeft(),
@@ -3587,9 +3632,6 @@ $.fn.dropdown = function(parameters) {
3587
3632
  $currentMenu.removeClass(className.loading);
3588
3633
  return canOpenRightward;
3589
3634
  },
3590
- click: function() {
3591
- return (hasTouch || settings.on == 'click');
3592
- },
3593
3635
  extendSelect: function() {
3594
3636
  return settings.allowAdditions || settings.apiSettings;
3595
3637
  },
@@ -3638,6 +3680,7 @@ $.fn.dropdown = function(parameters) {
3638
3680
  animation : transition + ' in',
3639
3681
  debug : settings.debug,
3640
3682
  verbose : settings.verbose,
3683
+ silent : settings.silent,
3641
3684
  duration : settings.transition.showDuration || settings.duration,
3642
3685
  queue : true,
3643
3686
  onStart : start,
@@ -3659,9 +3702,7 @@ $.fn.dropdown = function(parameters) {
3659
3702
  start = ($subMenu)
3660
3703
  ? function() {}
3661
3704
  : function() {
3662
- if( module.can.click() ) {
3663
- module.unbind.intent();
3664
- }
3705
+ module.unbind.intent();
3665
3706
  module.remove.active();
3666
3707
  },
3667
3708
  transition = settings.transition.hideMethod || module.get.transition($subMenu)
@@ -3687,6 +3728,7 @@ $.fn.dropdown = function(parameters) {
3687
3728
  duration : settings.transition.hideDuration || settings.duration,
3688
3729
  debug : settings.debug,
3689
3730
  verbose : settings.verbose,
3731
+ silent : settings.silent,
3690
3732
  queue : false,
3691
3733
  onStart : start,
3692
3734
  displayType: module.get.displayType(),
@@ -3990,7 +4032,7 @@ $.fn.dropdown.settings = {
3990
4032
  keepOnScreen : true, // Whether dropdown should check whether it is on screen before showing
3991
4033
 
3992
4034
  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)
4035
+ fullTextSearch : 'exact', // search anywhere in value (set to 'exact' to require exact matches)
3994
4036
  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
4037
  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
4038
 
@@ -3998,7 +4040,7 @@ $.fn.dropdown.settings = {
3998
4040
  preserveHTML : true, // preserve html when selecting value
3999
4041
  sortSelect : false, // sort selection on init
4000
4042
 
4001
- forceSelection : true, // force a choice on blur with search selection
4043
+ forceSelection : false, // force a choice on blur with search selection
4002
4044
 
4003
4045
  allowAdditions : false, // whether multiple select should allow user added values
4004
4046
  ignoreCase : false, // whether to consider case sensitivity when creating labels
@@ -4009,7 +4051,7 @@ $.fn.dropdown.settings = {
4009
4051
  useLabels : true, // whether multiple select should filter currently active selections from choices
4010
4052
  delimiter : ',', // when multiselect uses normal <input> the values will be delimited with this character
4011
4053
 
4012
- showOnFocus : true, // show menu on focus
4054
+ showOnFocus : false, // show menu on focus
4013
4055
  allowReselection : false, // whether current value should trigger callbacks when reselected
4014
4056
  allowTab : true, // add tabindex to element
4015
4057
  allowCategorySelection : false, // allow elements with sub-menus to be selected
@@ -4024,6 +4066,8 @@ $.fn.dropdown.settings = {
4024
4066
 
4025
4067
  headerDivider : true, // whether option headers should have an additional divider line underneath when converted from <select> <optgroup>
4026
4068
 
4069
+ collapseOnActionable : true, // whether the dropdown should collapse upon selection of an actionable item
4070
+
4027
4071
  // label settings on multi-select
4028
4072
  label: {
4029
4073
  transition : 'scale',
@@ -4036,13 +4080,13 @@ $.fn.dropdown.settings = {
4036
4080
  hide : 300,
4037
4081
  show : 200,
4038
4082
  search : 20,
4039
- touch : 50
4040
4083
  },
4041
4084
 
4042
4085
  /* Callbacks */
4043
4086
  onChange : function(value, text, $selected){},
4044
4087
  onAdd : function(value, text, $selected){},
4045
4088
  onRemove : function(value, text, $selected){},
4089
+ onActionable : function(value, text, $selected){},
4046
4090
  onSearch : function(searchTerm){},
4047
4091
 
4048
4092
  onLabelSelect : function($selectedLabels){},
@@ -4105,12 +4149,12 @@ $.fn.dropdown.settings = {
4105
4149
  icon : 'icon', // optional icon name
4106
4150
  iconClass : 'iconClass', // optional individual class for icon (for example to use flag instead)
4107
4151
  class : 'class', // optional individual class for item/header
4108
- divider : 'divider' // optional divider append for group headers
4152
+ divider : 'divider', // optional divider append for group headers
4153
+ actionable : 'actionable' // optional actionable item
4109
4154
  },
4110
4155
 
4111
4156
  keys : {
4112
4157
  backspace : 8,
4113
- delimiter : 188, // comma
4114
4158
  deleteKey : 46,
4115
4159
  enter : 13,
4116
4160
  escape : 27,
@@ -4177,7 +4221,8 @@ $.fn.dropdown.settings = {
4177
4221
  header : 'header',
4178
4222
  divider : 'divider',
4179
4223
  groupIcon : '',
4180
- unfilterable : 'unfilterable'
4224
+ unfilterable : 'unfilterable',
4225
+ actionable : 'actionable'
4181
4226
  }
4182
4227
 
4183
4228
  };
@@ -4216,7 +4261,8 @@ $.fn.dropdown.settings.templates = {
4216
4261
  var
4217
4262
  placeholder = select.placeholder || false,
4218
4263
  html = '',
4219
- escape = $.fn.dropdown.settings.templates.escape
4264
+ escape = $.fn.dropdown.settings.templates.escape,
4265
+ deQuote = $.fn.dropdown.settings.templates.deQuote
4220
4266
  ;
4221
4267
  html += '<i class="dropdown icon"></i>';
4222
4268
  if(placeholder) {
@@ -4225,7 +4271,7 @@ $.fn.dropdown.settings.templates = {
4225
4271
  else {
4226
4272
  html += '<div class="text"></div>';
4227
4273
  }
4228
- html += '<div class="'+className.menu+'">';
4274
+ html += '<div class="'+deQuote(className.menu)+'">';
4229
4275
  html += $.fn.dropdown.settings.templates.menu(select, fields, preserveHTML,className);
4230
4276
  html += '</div>';
4231
4277
  return html;
@@ -4252,6 +4298,9 @@ $.fn.dropdown.settings.templates = {
4252
4298
  maybeText = (option[fields.text])
4253
4299
  ? ' data-text="' + deQuote(option[fields.text],true) + '"'
4254
4300
  : '',
4301
+ maybeActionable = (option[fields.actionable])
4302
+ ? className.actionable+' '
4303
+ : '',
4255
4304
  maybeDisabled = (option[fields.disabled])
4256
4305
  ? className.disabled+' '
4257
4306
  : '',
@@ -4260,27 +4309,27 @@ $.fn.dropdown.settings.templates = {
4260
4309
  : '',
4261
4310
  hasDescription = (escape(option[fields.description] || '', preserveHTML) != '')
4262
4311
  ;
4263
- html += '<div class="'+ maybeDisabled + maybeDescriptionVertical + (option[fields.class] ? deQuote(option[fields.class]) : className.item)+'" data-value="' + deQuote(option[fields.value],true) + '"' + maybeText + '>';
4312
+ html += '<div class="'+ deQuote(maybeActionable + maybeDisabled + maybeDescriptionVertical + (option[fields.class] ? option[fields.class] : className.item))+'" data-value="' + deQuote(option[fields.value],true) + '"' + maybeText + '>';
4264
4313
  if (isMenu) {
4265
4314
  html += '<i class="'+ (itemType.indexOf('left') !== -1 ? 'left' : '') + ' dropdown icon"></i>';
4266
4315
  }
4267
4316
  if(option[fields.image]) {
4268
- html += '<img class="'+(option[fields.imageClass] ? deQuote(option[fields.imageClass]) : className.image)+'" src="' + deQuote(option[fields.image]) + '">';
4317
+ html += '<img class="'+deQuote(option[fields.imageClass] ? option[fields.imageClass] : className.image)+'" src="' + deQuote(option[fields.image]) + '">';
4269
4318
  }
4270
4319
  if(option[fields.icon]) {
4271
- html += '<i class="'+deQuote(option[fields.icon])+' '+(option[fields.iconClass] ? deQuote(option[fields.iconClass]) : className.icon)+'"></i>';
4320
+ html += '<i class="'+deQuote(option[fields.icon]+' '+(option[fields.iconClass] ? option[fields.iconClass] : className.icon))+'"></i>';
4272
4321
  }
4273
4322
  if(hasDescription){
4274
- html += '<span class="'+ className.description +'">'+ escape(option[fields.description] || '', preserveHTML) + '</span>';
4275
- html += (!isMenu) ? '<span class="'+ className.text + '">' : '';
4323
+ html += '<span class="'+ deQuote(className.description) +'">'+ escape(option[fields.description] || '', preserveHTML) + '</span>';
4324
+ html += (!isMenu) ? '<span class="'+ deQuote(className.text) + '">' : '';
4276
4325
  }
4277
4326
  if (isMenu) {
4278
- html += '<span class="' + className.text + '">';
4327
+ html += '<span class="' + deQuote(className.text) + '">';
4279
4328
  }
4280
4329
  html += escape(option[fields.name] || '', preserveHTML);
4281
4330
  if (isMenu) {
4282
4331
  html += '</span>';
4283
- html += '<div class="' + itemType + '">';
4332
+ html += '<div class="' + deQuote(itemType) + '">';
4284
4333
  html += $.fn.dropdown.settings.templates.menu(option, fields, preserveHTML, className);
4285
4334
  html += '</div>';
4286
4335
  } else if(hasDescription){
@@ -4289,18 +4338,18 @@ $.fn.dropdown.settings.templates = {
4289
4338
  html += '</div>';
4290
4339
  } else if (itemType === 'header') {
4291
4340
  var groupName = escape(option[fields.name] || '', preserveHTML),
4292
- groupIcon = option[fields.icon] ? deQuote(option[fields.icon]) : className.groupIcon
4341
+ groupIcon = deQuote(option[fields.icon] ? option[fields.icon] : className.groupIcon)
4293
4342
  ;
4294
4343
  if(groupName !== '' || groupIcon !== '') {
4295
- html += '<div class="' + (option[fields.class] ? deQuote(option[fields.class]) : className.header) + '">';
4344
+ html += '<div class="' + deQuote(option[fields.class] ? option[fields.class] : className.header) + '">';
4296
4345
  if (groupIcon !== '') {
4297
- html += '<i class="' + groupIcon + ' ' + (option[fields.iconClass] ? deQuote(option[fields.iconClass]) : className.icon) + '"></i>';
4346
+ html += '<i class="' + deQuote(groupIcon + ' ' + (option[fields.iconClass] ? option[fields.iconClass] : className.icon)) + '"></i>';
4298
4347
  }
4299
4348
  html += groupName;
4300
4349
  html += '</div>';
4301
4350
  }
4302
4351
  if(option[fields.divider]){
4303
- html += '<div class="'+className.divider+'"></div>';
4352
+ html += '<div class="'+deQuote(className.divider)+'"></div>';
4304
4353
  }
4305
4354
  }
4306
4355
  });
@@ -4310,8 +4359,10 @@ $.fn.dropdown.settings.templates = {
4310
4359
  // generates label for multiselect
4311
4360
  label: function(value, text, preserveHTML, className) {
4312
4361
  var
4313
- escape = $.fn.dropdown.settings.templates.escape;
4314
- return escape(text,preserveHTML) + '<i class="'+className.delete+' icon"></i>';
4362
+ escape = $.fn.dropdown.settings.templates.escape,
4363
+ deQuote = $.fn.dropdown.settings.templates.deQuote
4364
+ ;
4365
+ return escape(text,preserveHTML) + '<i class="'+deQuote(className.delete)+' icon"></i>';
4315
4366
  },
4316
4367
 
4317
4368