fomantic-ui 2.9.0-beta.3 → 2.9.0-beta.301

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 (411) hide show
  1. package/.all-contributorsrc +251 -3
  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/CONTRIBUTING.md +1 -1
  9. package/CONTRIBUTORS.md +82 -37
  10. package/FAQ.md +38 -38
  11. package/README.md +8 -8
  12. package/dist/components/accordion.css +176 -36
  13. package/dist/components/accordion.js +6 -3
  14. package/dist/components/accordion.min.css +2 -2
  15. package/dist/components/accordion.min.js +3 -3
  16. package/dist/components/ad.css +4 -4
  17. package/dist/components/ad.min.css +2 -2
  18. package/dist/components/api.js +90 -31
  19. package/dist/components/api.min.js +3 -3
  20. package/dist/components/breadcrumb.css +1 -1
  21. package/dist/components/breadcrumb.min.css +1 -1
  22. package/dist/components/button.css +204 -157
  23. package/dist/components/button.min.css +2 -2
  24. package/dist/components/calendar.css +18 -1
  25. package/dist/components/calendar.js +189 -76
  26. package/dist/components/calendar.min.css +2 -2
  27. package/dist/components/calendar.min.js +3 -3
  28. package/dist/components/card.css +754 -117
  29. package/dist/components/card.min.css +2 -2
  30. package/dist/components/checkbox.css +92 -91
  31. package/dist/components/checkbox.js +17 -11
  32. package/dist/components/checkbox.min.css +2 -2
  33. package/dist/components/checkbox.min.js +3 -3
  34. package/dist/components/comment.css +12 -12
  35. package/dist/components/comment.min.css +2 -2
  36. package/dist/components/container.css +98 -4
  37. package/dist/components/container.min.css +2 -2
  38. package/dist/components/dimmer.css +29 -14
  39. package/dist/components/dimmer.js +11 -5
  40. package/dist/components/dimmer.min.css +2 -2
  41. package/dist/components/dimmer.min.js +3 -3
  42. package/dist/components/divider.css +31 -31
  43. package/dist/components/divider.min.css +2 -2
  44. package/dist/components/dropdown.css +90 -50
  45. package/dist/components/dropdown.js +152 -117
  46. package/dist/components/dropdown.min.css +2 -2
  47. package/dist/components/dropdown.min.js +3 -3
  48. package/dist/components/embed.css +5 -5
  49. package/dist/components/embed.js +1 -1
  50. package/dist/components/embed.min.css +2 -2
  51. package/dist/components/embed.min.js +3 -3
  52. package/dist/components/emoji.css +10847 -8841
  53. package/dist/components/emoji.min.css +1 -1
  54. package/dist/components/feed.css +29 -29
  55. package/dist/components/feed.min.css +2 -2
  56. package/dist/components/flag.css +1011 -902
  57. package/dist/components/flag.min.css +2 -2
  58. package/dist/components/form.css +160 -83
  59. package/dist/components/form.js +39 -30
  60. package/dist/components/form.min.css +2 -2
  61. package/dist/components/form.min.js +3 -3
  62. package/dist/components/grid.css +25 -21
  63. package/dist/components/grid.min.css +2 -2
  64. package/dist/components/header.css +6 -4
  65. package/dist/components/header.min.css +2 -2
  66. package/dist/components/icon.css +2063 -1984
  67. package/dist/components/icon.min.css +2 -2
  68. package/dist/components/image.css +1 -1
  69. package/dist/components/image.min.css +1 -1
  70. package/dist/components/input.css +759 -22
  71. package/dist/components/input.min.css +2 -2
  72. package/dist/components/item.css +17 -17
  73. package/dist/components/item.min.css +2 -2
  74. package/dist/components/label.css +72 -68
  75. package/dist/components/label.min.css +2 -2
  76. package/dist/components/list.css +31 -31
  77. package/dist/components/list.min.css +2 -2
  78. package/dist/components/loader.css +352 -352
  79. package/dist/components/loader.min.css +2 -2
  80. package/dist/components/menu.css +110 -78
  81. package/dist/components/menu.min.css +1 -1
  82. package/dist/components/message.css +43 -43
  83. package/dist/components/message.min.css +2 -2
  84. package/dist/components/modal.css +29 -4
  85. package/dist/components/modal.js +128 -50
  86. package/dist/components/modal.min.css +2 -2
  87. package/dist/components/modal.min.js +3 -3
  88. package/dist/components/nag.css +1 -1
  89. package/dist/components/nag.js +2 -2
  90. package/dist/components/nag.min.css +1 -1
  91. package/dist/components/nag.min.js +3 -3
  92. package/dist/components/placeholder.css +33 -33
  93. package/dist/components/placeholder.min.css +2 -2
  94. package/dist/components/popup.css +103 -105
  95. package/dist/components/popup.js +11 -11
  96. package/dist/components/popup.min.css +2 -2
  97. package/dist/components/popup.min.js +3 -3
  98. package/dist/components/progress.css +1 -1
  99. package/dist/components/progress.js +6 -3
  100. package/dist/components/progress.min.css +1 -1
  101. package/dist/components/progress.min.js +3 -3
  102. package/dist/components/rail.css +1 -1
  103. package/dist/components/rail.min.css +1 -1
  104. package/dist/components/rating.css +7 -46
  105. package/dist/components/rating.js +1 -1
  106. package/dist/components/rating.min.css +2 -2
  107. package/dist/components/rating.min.js +3 -3
  108. package/dist/components/reset.css +5 -4
  109. package/dist/components/reset.min.css +2 -2
  110. package/dist/components/reveal.css +1 -1
  111. package/dist/components/reveal.min.css +1 -1
  112. package/dist/components/search.css +6 -6
  113. package/dist/components/search.js +23 -7
  114. package/dist/components/search.min.css +2 -2
  115. package/dist/components/search.min.js +3 -3
  116. package/dist/components/segment.css +118 -34
  117. package/dist/components/segment.min.css +2 -2
  118. package/dist/components/shape.css +1 -1
  119. package/dist/components/shape.js +3 -3
  120. package/dist/components/shape.min.css +1 -1
  121. package/dist/components/shape.min.js +3 -3
  122. package/dist/components/sidebar.css +7 -5
  123. package/dist/components/sidebar.js +14 -12
  124. package/dist/components/sidebar.min.css +2 -2
  125. package/dist/components/sidebar.min.js +3 -3
  126. package/dist/components/site.css +139 -42
  127. package/dist/components/site.js +1 -1
  128. package/dist/components/site.min.css +2 -2
  129. package/dist/components/site.min.js +3 -3
  130. package/dist/components/slider.css +17 -17
  131. package/dist/components/slider.js +68 -51
  132. package/dist/components/slider.min.css +1 -1
  133. package/dist/components/slider.min.js +3 -3
  134. package/dist/components/state.js +2 -2
  135. package/dist/components/state.min.js +3 -3
  136. package/dist/components/statistic.css +4 -4
  137. package/dist/components/statistic.min.css +2 -2
  138. package/dist/components/step.css +32 -32
  139. package/dist/components/step.min.css +2 -2
  140. package/dist/components/sticky.css +1 -1
  141. package/dist/components/sticky.js +5 -5
  142. package/dist/components/sticky.min.css +1 -1
  143. package/dist/components/sticky.min.js +3 -3
  144. package/dist/components/tab.css +5 -5
  145. package/dist/components/tab.js +24 -6
  146. package/dist/components/tab.min.css +2 -2
  147. package/dist/components/tab.min.js +3 -3
  148. package/dist/components/table.css +1684 -272
  149. package/dist/components/table.min.css +2 -2
  150. package/dist/components/text.css +1 -1
  151. package/dist/components/text.min.css +1 -1
  152. package/dist/components/toast.css +48 -1
  153. package/dist/components/toast.js +63 -31
  154. package/dist/components/toast.min.css +2 -2
  155. package/dist/components/toast.min.js +3 -3
  156. package/dist/components/transition.css +1 -1
  157. package/dist/components/transition.js +22 -17
  158. package/dist/components/transition.min.css +1 -1
  159. package/dist/components/transition.min.js +3 -3
  160. package/dist/components/visibility.js +3 -3
  161. package/dist/components/visibility.min.js +3 -3
  162. package/dist/semantic.css +20204 -13425
  163. package/dist/semantic.js +883 -481
  164. package/dist/semantic.min.css +3 -3
  165. package/dist/semantic.min.js +3 -3
  166. package/dist/themes/default/assets/fonts/Lato-Bold.woff +0 -0
  167. package/dist/themes/default/assets/fonts/Lato-Bold.woff2 +0 -0
  168. package/dist/themes/default/assets/fonts/Lato-BoldItalic.woff +0 -0
  169. package/dist/themes/default/assets/fonts/Lato-BoldItalic.woff2 +0 -0
  170. package/dist/themes/default/assets/fonts/Lato-Italic.woff +0 -0
  171. package/dist/themes/default/assets/fonts/Lato-Italic.woff2 +0 -0
  172. package/dist/themes/default/assets/fonts/Lato-Regular.woff +0 -0
  173. package/dist/themes/default/assets/fonts/Lato-Regular.woff2 +0 -0
  174. package/dist/themes/default/assets/fonts/LatoLatin-Bold.woff +0 -0
  175. package/dist/themes/default/assets/fonts/LatoLatin-Bold.woff2 +0 -0
  176. package/dist/themes/default/assets/fonts/LatoLatin-BoldItalic.woff +0 -0
  177. package/dist/themes/default/assets/fonts/LatoLatin-BoldItalic.woff2 +0 -0
  178. package/dist/themes/default/assets/fonts/LatoLatin-Italic.woff +0 -0
  179. package/dist/themes/default/assets/fonts/LatoLatin-Italic.woff2 +0 -0
  180. package/dist/themes/default/assets/fonts/LatoLatin-Regular.woff +0 -0
  181. package/dist/themes/default/assets/fonts/LatoLatin-Regular.woff2 +0 -0
  182. package/dist/themes/default/assets/fonts/brand-icons.eot +0 -0
  183. package/dist/themes/default/assets/fonts/brand-icons.svg +801 -654
  184. package/dist/themes/default/assets/fonts/brand-icons.ttf +0 -0
  185. package/dist/themes/default/assets/fonts/brand-icons.woff +0 -0
  186. package/dist/themes/default/assets/fonts/brand-icons.woff2 +0 -0
  187. package/dist/themes/default/assets/fonts/icons.eot +0 -0
  188. package/dist/themes/default/assets/fonts/icons.svg +1175 -1079
  189. package/dist/themes/default/assets/fonts/icons.ttf +0 -0
  190. package/dist/themes/default/assets/fonts/icons.woff +0 -0
  191. package/dist/themes/default/assets/fonts/icons.woff2 +0 -0
  192. package/dist/themes/default/assets/fonts/outline-icons.eot +0 -0
  193. package/dist/themes/default/assets/fonts/outline-icons.svg +93 -95
  194. package/dist/themes/default/assets/fonts/outline-icons.ttf +0 -0
  195. package/dist/themes/default/assets/fonts/outline-icons.woff +0 -0
  196. package/dist/themes/default/assets/fonts/outline-icons.woff2 +0 -0
  197. package/dist/themes/{default → famfamfam}/assets/images/flags.png +0 -0
  198. package/examples/assets/library/iframe-content.js +11 -11
  199. package/examples/assets/library/iframe.js +6 -6
  200. package/examples/components/button.html +1 -1
  201. package/examples/components/card.html +1 -1
  202. package/examples/components/input.html +1 -1
  203. package/examples/components/menu.html +1 -1
  204. package/examples/components/site.html +1 -1
  205. package/examples/components/table.html +1 -1
  206. package/package.json +18 -16
  207. package/scripts/nightly-version.js +47 -38
  208. package/src/definitions/behaviors/api.js +89 -30
  209. package/src/definitions/behaviors/form.js +38 -29
  210. package/src/definitions/behaviors/state.js +1 -1
  211. package/src/definitions/behaviors/visibility.js +2 -2
  212. package/src/definitions/collections/form.less +229 -165
  213. package/src/definitions/collections/grid.less +723 -687
  214. package/src/definitions/collections/menu.less +233 -171
  215. package/src/definitions/collections/message.less +49 -47
  216. package/src/definitions/collections/table.less +882 -272
  217. package/src/definitions/elements/button.less +611 -469
  218. package/src/definitions/elements/container.less +145 -8
  219. package/src/definitions/elements/divider.less +24 -24
  220. package/src/definitions/elements/emoji.less +39 -10
  221. package/src/definitions/elements/flag.less +53 -18
  222. package/src/definitions/elements/header.less +46 -37
  223. package/src/definitions/elements/icon.less +39 -32
  224. package/src/definitions/elements/input.less +281 -33
  225. package/src/definitions/elements/label.less +132 -128
  226. package/src/definitions/elements/list.less +84 -75
  227. package/src/definitions/elements/loader.less +99 -98
  228. package/src/definitions/elements/placeholder.less +32 -32
  229. package/src/definitions/elements/segment.less +177 -56
  230. package/src/definitions/elements/step.less +76 -72
  231. package/src/definitions/elements/text.less +17 -15
  232. package/src/definitions/globals/reset.less +2 -2
  233. package/src/definitions/globals/site.less +25 -2
  234. package/src/definitions/modules/accordion.js +5 -2
  235. package/src/definitions/modules/accordion.less +371 -219
  236. package/src/definitions/modules/calendar.js +188 -75
  237. package/src/definitions/modules/calendar.less +20 -0
  238. package/src/definitions/modules/checkbox.js +16 -10
  239. package/src/definitions/modules/checkbox.less +83 -227
  240. package/src/definitions/modules/dimmer.js +10 -4
  241. package/src/definitions/modules/dimmer.less +22 -8
  242. package/src/definitions/modules/dropdown.js +151 -116
  243. package/src/definitions/modules/dropdown.less +191 -136
  244. package/src/definitions/modules/embed.less +4 -4
  245. package/src/definitions/modules/modal.js +127 -49
  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 +10 -10
  250. package/src/definitions/modules/popup.less +90 -90
  251. package/src/definitions/modules/progress.js +5 -2
  252. package/src/definitions/modules/progress.less +19 -18
  253. package/src/definitions/modules/rating.less +49 -42
  254. package/src/definitions/modules/search.js +22 -6
  255. package/src/definitions/modules/search.less +35 -19
  256. package/src/definitions/modules/shape.js +2 -2
  257. package/src/definitions/modules/sidebar.js +13 -11
  258. package/src/definitions/modules/sidebar.less +36 -22
  259. package/src/definitions/modules/slider.js +67 -50
  260. package/src/definitions/modules/slider.less +48 -47
  261. package/src/definitions/modules/sticky.js +4 -4
  262. package/src/definitions/modules/sticky.less +3 -1
  263. package/src/definitions/modules/tab.js +23 -5
  264. package/src/definitions/modules/tab.less +4 -4
  265. package/src/definitions/modules/toast.js +62 -30
  266. package/src/definitions/modules/toast.less +56 -16
  267. package/src/definitions/modules/transition.js +21 -16
  268. package/src/definitions/views/ad.less +3 -3
  269. package/src/definitions/views/card.less +522 -375
  270. package/src/definitions/views/comment.less +93 -82
  271. package/src/definitions/views/feed.less +164 -144
  272. package/src/definitions/views/item.less +251 -198
  273. package/src/definitions/views/statistic.less +91 -89
  274. package/src/theme.less +13 -2
  275. package/src/themes/amazon/globals/site.variables +1 -0
  276. package/src/themes/basic/elements/icon.overrides +149 -149
  277. package/src/themes/basic/elements/step.overrides +2 -2
  278. package/src/themes/bookish/elements/header.overrides +1 -1
  279. package/src/themes/chubby/elements/button.overrides +1 -1
  280. package/src/themes/chubby/elements/header.overrides +1 -1
  281. package/src/themes/default/assets/fonts/Lato-Bold.woff +0 -0
  282. package/src/themes/default/assets/fonts/Lato-Bold.woff2 +0 -0
  283. package/src/themes/default/assets/fonts/Lato-BoldItalic.woff +0 -0
  284. package/src/themes/default/assets/fonts/Lato-BoldItalic.woff2 +0 -0
  285. package/src/themes/default/assets/fonts/Lato-Italic.woff +0 -0
  286. package/src/themes/default/assets/fonts/Lato-Italic.woff2 +0 -0
  287. package/src/themes/default/assets/fonts/Lato-Regular.woff +0 -0
  288. package/src/themes/default/assets/fonts/Lato-Regular.woff2 +0 -0
  289. package/src/themes/default/assets/fonts/LatoLatin-Bold.woff +0 -0
  290. package/src/themes/default/assets/fonts/LatoLatin-Bold.woff2 +0 -0
  291. package/src/themes/default/assets/fonts/LatoLatin-BoldItalic.woff +0 -0
  292. package/src/themes/default/assets/fonts/LatoLatin-BoldItalic.woff2 +0 -0
  293. package/src/themes/default/assets/fonts/LatoLatin-Italic.woff +0 -0
  294. package/src/themes/default/assets/fonts/LatoLatin-Italic.woff2 +0 -0
  295. package/src/themes/default/assets/fonts/LatoLatin-Regular.woff +0 -0
  296. package/src/themes/default/assets/fonts/LatoLatin-Regular.woff2 +0 -0
  297. package/src/themes/default/assets/fonts/brand-icons.eot +0 -0
  298. package/src/themes/default/assets/fonts/brand-icons.svg +801 -654
  299. package/src/themes/default/assets/fonts/brand-icons.ttf +0 -0
  300. package/src/themes/default/assets/fonts/brand-icons.woff +0 -0
  301. package/src/themes/default/assets/fonts/brand-icons.woff2 +0 -0
  302. package/src/themes/default/assets/fonts/icons.eot +0 -0
  303. package/src/themes/default/assets/fonts/icons.svg +1175 -1079
  304. package/src/themes/default/assets/fonts/icons.ttf +0 -0
  305. package/src/themes/default/assets/fonts/icons.woff +0 -0
  306. package/src/themes/default/assets/fonts/icons.woff2 +0 -0
  307. package/src/themes/default/assets/fonts/outline-icons.eot +0 -0
  308. package/src/themes/default/assets/fonts/outline-icons.svg +93 -95
  309. package/src/themes/default/assets/fonts/outline-icons.ttf +0 -0
  310. package/src/themes/default/assets/fonts/outline-icons.woff +0 -0
  311. package/src/themes/default/assets/fonts/outline-icons.woff2 +0 -0
  312. package/src/themes/default/collections/form.variables +4 -0
  313. package/src/themes/default/collections/menu.variables +6 -0
  314. package/src/themes/default/collections/table.variables +52 -0
  315. package/src/themes/default/elements/button.variables +7 -1
  316. package/src/themes/default/elements/container.variables +12 -0
  317. package/src/themes/default/elements/divider.overrides +7 -7
  318. package/src/themes/default/elements/emoji.overrides +0 -3090
  319. package/src/themes/default/elements/emoji.variables +3575 -1
  320. package/src/themes/default/elements/flag.overrides +0 -991
  321. package/src/themes/default/elements/flag.variables +1609 -5
  322. package/src/themes/default/elements/icon.overrides +1975 -1949
  323. package/src/themes/default/elements/icon.variables +1 -0
  324. package/src/themes/default/elements/input.variables +15 -0
  325. package/src/themes/default/elements/segment.variables +8 -0
  326. package/src/themes/default/elements/step.overrides +4 -4
  327. package/src/themes/default/globals/site.variables +109 -8
  328. package/src/themes/default/globals/variation.variables +145 -6
  329. package/src/themes/default/modules/accordion.overrides +6 -5
  330. package/src/themes/default/modules/accordion.variables +49 -2
  331. package/src/themes/default/modules/calendar.variables +3 -0
  332. package/src/themes/default/modules/checkbox.overrides +9 -9
  333. package/src/themes/default/modules/checkbox.variables +5 -5
  334. package/src/themes/default/modules/dimmer.variables +1 -1
  335. package/src/themes/default/modules/dropdown.overrides +5 -5
  336. package/src/themes/default/modules/dropdown.variables +4 -10
  337. package/src/themes/default/modules/modal.variables +14 -0
  338. package/src/themes/default/modules/popup.variables +0 -2
  339. package/src/themes/default/modules/toast.variables +3 -0
  340. package/src/themes/default/views/card.variables +8 -0
  341. package/src/themes/{default → famfamfam}/assets/images/flags.png +0 -0
  342. package/src/themes/famfamfam/elements/flag.overrides +1026 -0
  343. package/src/themes/famfamfam/elements/flag.variables +20 -0
  344. package/src/themes/github/elements/icon.overrides +206 -206
  345. package/src/themes/github/elements/step.overrides +5 -5
  346. package/src/themes/github/globals/site.variables +1 -0
  347. package/src/themes/github/modules/dropdown.overrides +6 -6
  348. package/src/themes/instagram/views/card.overrides +1 -1
  349. package/src/themes/joypixels/elements/emoji.overrides +0 -3089
  350. package/src/themes/joypixels/elements/emoji.variables +3574 -5
  351. package/src/themes/material/collections/menu.overrides +1 -1
  352. package/src/themes/material/elements/button.overrides +1 -1
  353. package/src/themes/material/elements/header.overrides +1 -1
  354. package/src/themes/material/elements/icon.overrides +932 -932
  355. package/src/themes/material/globals/site.variables +0 -1
  356. package/src/themes/material/modules/dropdown.overrides +1 -1
  357. package/src/themes/material/modules/modal.overrides +1 -1
  358. package/src/themes/pulsar/elements/loader.overrides +2 -2
  359. package/src/themes/resetcss/globals/reset.overrides +3 -3
  360. package/src/themes/rtl/globals/site.overrides +1 -1
  361. package/src/themes/striped/modules/progress.overrides +1 -1
  362. package/src/themes/systemfont/globals/reset.overrides +8 -0
  363. package/src/themes/systemfont/globals/site.variables +10 -0
  364. package/src/themes/twitter/elements/emoji.overrides +0 -3091
  365. package/src/themes/twitter/elements/emoji.variables +3570 -6
  366. package/tasks/admin/components/init.js +2 -2
  367. package/tasks/admin/distributions/create.js +1 -1
  368. package/tasks/admin/distributions/init.js +2 -2
  369. package/tasks/admin/publish.js +1 -1
  370. package/tasks/admin/release.js +1 -1
  371. package/tasks/build/assets.js +1 -1
  372. package/tasks/build/css.js +9 -4
  373. package/tasks/build/javascript.js +3 -3
  374. package/tasks/check-install.js +1 -1
  375. package/tasks/clean.js +1 -1
  376. package/tasks/collections/README.md +1 -1
  377. package/tasks/collections/admin.js +1 -1
  378. package/tasks/config/admin/oauth.example.js +1 -1
  379. package/tasks/config/admin/templates/composer.json +1 -1
  380. package/tasks/config/project/install.js +15 -13
  381. package/tasks/install.js +1 -0
  382. package/tasks/rtl/watch.js +1 -1
  383. package/tasks/version.js +1 -1
  384. package/test/fixtures/accordion.html +1 -1
  385. package/test/fixtures/checkbox.html +1 -1
  386. package/test/fixtures/dropdown.html +1 -1
  387. package/test/fixtures/modal.html +1 -1
  388. package/test/fixtures/popup.html +1 -1
  389. package/test/fixtures/rating.html +1 -1
  390. package/test/fixtures/shape.html +1 -1
  391. package/test/fixtures/sidebar.html +1 -1
  392. package/test/fixtures/tab.html +1 -1
  393. package/test/fixtures/transition.html +1 -1
  394. package/test/fixtures/video.html +1 -1
  395. package/test/helpers/jasmine-jquery.js +2 -2
  396. package/test/helpers/jasmine-sinon.js +1 -1
  397. package/test/helpers/jquery-events.js +1 -1
  398. package/test/helpers/sinon.js +3 -3
  399. package/test/meteor/fonts.js +1 -1
  400. package/test/modules/accordion.spec.js +1 -1
  401. package/test/modules/checkbox.spec.js +1 -1
  402. package/test/modules/dropdown.spec.js +1 -1
  403. package/test/modules/modal.spec.js +1 -1
  404. package/test/modules/module.spec.js +1 -1
  405. package/test/modules/popup.spec.js +1 -1
  406. package/test/modules/search.spec.js +1 -1
  407. package/test/modules/shape.spec.js +1 -1
  408. package/test/modules/sidebar.spec.js +1 -1
  409. package/test/modules/tab.spec.js +1 -1
  410. package/test/modules/transition.spec.js +1 -1
  411. package/test/modules/video.spec.js +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * # Fomantic-UI 2.9.0-beta.3 - Dropdown
2
+ * # Fomantic-UI 2.9.0-beta.301+42e68bc - 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),
@@ -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
  },
@@ -421,6 +417,9 @@ $.fn.dropdown = function(parameters) {
421
417
  module.debug('Disabling dropdown');
422
418
  $module.addClass(className.disabled);
423
419
  }
420
+ if($input.is('[required]')) {
421
+ settings.forceSelection = true;
422
+ }
424
423
  $input
425
424
  .removeAttr('required')
426
425
  .removeAttr('class')
@@ -537,9 +536,7 @@ $.fn.dropdown = function(parameters) {
537
536
  }
538
537
  if(settings.onShow.call(element) !== false) {
539
538
  module.animate.show(function() {
540
- if( module.can.click() ) {
541
- module.bind.intent();
542
- }
539
+ module.bind.intent();
543
540
  if(module.has.search() && !preventFocus) {
544
541
  module.focusSearch();
545
542
  }
@@ -560,14 +557,23 @@ $.fn.dropdown = function(parameters) {
560
557
  if(settings.onHide.call(element) !== false) {
561
558
  module.animate.hide(function() {
562
559
  module.remove.visible();
563
- // hidding search focus
560
+ // hiding search focus
564
561
  if ( module.is.focusedOnSearch() && preventBlur !== true ) {
565
562
  $search.blur();
566
563
  }
567
564
  callback.call(element);
568
565
  });
566
+ // Hide submenus explicitly. On some browsers (esp. mobile), they will not automatically receive a
567
+ // mouseleave event
568
+ var $subMenu = $module.find(selector.menu);
569
+ if($subMenu.length > 0) {
570
+ module.verbose('Hiding sub-menu', $subMenu);
571
+ $subMenu.each(function() {
572
+ module.animate.hide(false, $(this));
573
+ });
574
+ }
569
575
  }
570
- } else if( module.can.click() ) {
576
+ } else {
571
577
  module.unbind.intent();
572
578
  }
573
579
  iconClicked = false;
@@ -625,13 +631,18 @@ $.fn.dropdown = function(parameters) {
625
631
  $module
626
632
  .on('change' + eventNamespace, selector.input, module.event.change)
627
633
  ;
634
+ if(module.is.multiple() && module.is.searchSelection()) {
635
+ $module
636
+ .on('paste' + eventNamespace, selector.search, module.event.paste)
637
+ ;
638
+ }
628
639
  },
629
640
  mouseEvents: function() {
630
641
  module.verbose('Binding mouse events');
631
642
  if(module.is.multiple()) {
632
643
  $module
633
- .on(clickEvent + eventNamespace, selector.label, module.event.label.click)
634
- .on(clickEvent + eventNamespace, selector.remove, module.event.remove.click)
644
+ .on('click' + eventNamespace, selector.label, module.event.label.click)
645
+ .on('click' + eventNamespace, selector.remove, module.event.remove.click)
635
646
  ;
636
647
  }
637
648
  if( module.is.searchSelection() ) {
@@ -640,31 +651,33 @@ $.fn.dropdown = function(parameters) {
640
651
  .on('mouseup' + eventNamespace, module.event.mouseup)
641
652
  .on('mousedown' + eventNamespace, selector.menu, module.event.menu.mousedown)
642
653
  .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)
654
+ .on('click' + eventNamespace, selector.icon, module.event.icon.click)
655
+ .on('click' + eventNamespace, selector.clearIcon, module.event.clearIcon.click)
645
656
  .on('focus' + eventNamespace, selector.search, module.event.search.focus)
646
- .on(clickEvent + eventNamespace, selector.search, module.event.search.focus)
657
+ .on('click' + eventNamespace, selector.search, module.event.search.focus)
647
658
  .on('blur' + eventNamespace, selector.search, module.event.search.blur)
648
- .on(clickEvent + eventNamespace, selector.text, module.event.text.focus)
659
+ .on('click' + eventNamespace, selector.text, module.event.text.focus)
649
660
  ;
650
661
  if(module.is.multiple()) {
651
662
  $module
652
- .on(clickEvent + eventNamespace, module.event.click)
653
- .on(clickEvent + eventNamespace, module.event.search.focus)
663
+ .on('click' + eventNamespace, module.event.click)
664
+ .on('click' + eventNamespace, module.event.search.focus)
654
665
  ;
655
666
  }
656
667
  }
657
668
  else {
658
669
  if(settings.on == 'click') {
659
670
  $module
660
- .on(clickEvent + eventNamespace, selector.icon, module.event.icon.click)
661
- .on(clickEvent + eventNamespace, module.event.test.toggle)
671
+ .on('click' + eventNamespace, selector.icon, module.event.icon.click)
672
+ .on('click' + eventNamespace, module.event.test.toggle)
662
673
  ;
663
674
  }
664
675
  else if(settings.on == 'hover') {
665
676
  $module
666
677
  .on('mouseenter' + eventNamespace, module.delay.show)
667
678
  .on('mouseleave' + eventNamespace, module.delay.hide)
679
+ .on('touchstart' + eventNamespace, module.event.test.toggle)
680
+ .on('touchstart' + eventNamespace, selector.icon, module.event.icon.click)
668
681
  ;
669
682
  }
670
683
  else {
@@ -676,7 +689,7 @@ $.fn.dropdown = function(parameters) {
676
689
  .on('mousedown' + eventNamespace, module.event.mousedown)
677
690
  .on('mouseup' + eventNamespace, module.event.mouseup)
678
691
  .on('focus' + eventNamespace, module.event.focus)
679
- .on(clickEvent + eventNamespace, selector.clearIcon, module.event.clearIcon.click)
692
+ .on('click' + eventNamespace, selector.clearIcon, module.event.clearIcon.click)
680
693
  ;
681
694
  if(module.has.menuSearch() ) {
682
695
  $module
@@ -690,21 +703,16 @@ $.fn.dropdown = function(parameters) {
690
703
  }
691
704
  }
692
705
  $menu
693
- .on((hasTouch ? 'touchstart' : 'mouseenter') + eventNamespace, selector.item, module.event.item.mouseenter)
706
+ .on('mouseenter' + eventNamespace, selector.item, module.event.item.mouseenter)
707
+ .on('touchstart' + eventNamespace, selector.item, module.event.item.mouseenter)
694
708
  .on('mouseleave' + eventNamespace, selector.item, module.event.item.mouseleave)
695
709
  .on('click' + eventNamespace, selector.item, module.event.item.click)
696
710
  ;
697
711
  },
698
712
  intent: function() {
699
713
  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
714
  $document
707
- .on(clickEvent + elementNamespace, module.event.test.hide)
715
+ .on('click' + elementNamespace, module.event.test.hide)
708
716
  ;
709
717
  }
710
718
  },
@@ -712,14 +720,8 @@ $.fn.dropdown = function(parameters) {
712
720
  unbind: {
713
721
  intent: function() {
714
722
  module.verbose('Removing hide intent event from document');
715
- if(hasTouch) {
716
- $document
717
- .off('touchstart' + elementNamespace)
718
- .off('touchmove' + elementNamespace)
719
- ;
720
- }
721
723
  $document
722
- .off(clickEvent + elementNamespace)
724
+ .off('click' + elementNamespace)
723
725
  ;
724
726
  }
725
727
  },
@@ -812,20 +814,28 @@ $.fn.dropdown = function(parameters) {
812
814
  throttle : settings.throttle,
813
815
  urlData : {
814
816
  query: query
815
- },
816
- onError: function() {
817
+ }
818
+ },
819
+ apiCallbacks = {
820
+ onError: function(errorMessage, $module, xhr) {
817
821
  module.add.message(message.serverError);
818
822
  iconClicked = false;
819
823
  focused = false;
820
824
  callback.apply(null, callbackParameters);
825
+ if(typeof settings.apiSettings.onError === 'function') {
826
+ settings.apiSettings.onError.call(this, errorMessage, $module, xhr);
827
+ }
821
828
  },
822
- onFailure: function() {
829
+ onFailure: function(response, $module, xhr) {
823
830
  module.add.message(message.serverError);
824
831
  iconClicked = false;
825
832
  focused = false;
826
833
  callback.apply(null, callbackParameters);
834
+ if(typeof settings.apiSettings.onFailure === 'function') {
835
+ settings.apiSettings.onFailure.call(this, response, $module, xhr);
836
+ }
827
837
  },
828
- onSuccess : function(response) {
838
+ onSuccess : function(response, $module, xhr) {
829
839
  var
830
840
  values = response[fields.remoteValues]
831
841
  ;
@@ -844,19 +854,22 @@ $.fn.dropdown = function(parameters) {
844
854
  var value = module.is.multiple() ? module.get.values() : module.get.value();
845
855
  if (value !== '') {
846
856
  module.verbose('Value(s) present after click icon, select value(s) in items');
847
- module.set.selected(value, null, null, true);
857
+ module.set.selected(value, null, true, true);
848
858
  }
849
859
  }
850
860
  iconClicked = false;
851
861
  focused = false;
852
862
  callback.apply(null, callbackParameters);
863
+ if(typeof settings.apiSettings.onSuccess === 'function') {
864
+ settings.apiSettings.onSuccess.call(this, response, $module, xhr);
865
+ }
853
866
  }
854
867
  }
855
868
  ;
856
869
  if( !$module.api('get request') ) {
857
870
  module.setup.api();
858
871
  }
859
- apiSettings = $.extend(true, {}, apiSettings, settings.apiSettings);
872
+ apiSettings = $.extend(true, {}, apiSettings, settings.apiSettings, apiCallbacks);
860
873
  $module
861
874
  .api('setting', apiSettings)
862
875
  .api('query')
@@ -1044,7 +1057,7 @@ $.fn.dropdown = function(parameters) {
1044
1057
  menuConfig[fields.values] = values;
1045
1058
  module.setup.menu(menuConfig);
1046
1059
  $.each(values, function(index, item) {
1047
- if(item.selected == true) {
1060
+ if(item.selected === true) {
1048
1061
  module.debug('Setting initial selection to', item[fields.value]);
1049
1062
  module.set.selected(item[fields.value]);
1050
1063
  if(!module.is.multiple()) {
@@ -1065,7 +1078,7 @@ $.fn.dropdown = function(parameters) {
1065
1078
  settings.preserveHTML
1066
1079
  )
1067
1080
  ;
1068
- $input.append('<option value="' + value + '">' + name + '</option>');
1081
+ $input.append('<option value="' + value + '"' + (item.selected === true ? ' selected' : '') + '>' + name + '</option>');
1069
1082
  });
1070
1083
  module.observe.select();
1071
1084
  }
@@ -1073,6 +1086,15 @@ $.fn.dropdown = function(parameters) {
1073
1086
  },
1074
1087
 
1075
1088
  event: {
1089
+ paste: function(event) {
1090
+ var pasteValue = (event.originalEvent.clipboardData || window.clipboardData).getData('text'),
1091
+ tokens = pasteValue.split(settings.delimiter)
1092
+ ;
1093
+ tokens.forEach(function(value){
1094
+ module.set.selected(module.escape.htmlEntities(value.trim()), null, true, true);
1095
+ });
1096
+ event.preventDefault();
1097
+ },
1076
1098
  change: function() {
1077
1099
  if(!internalChange) {
1078
1100
  module.debug('Input changed, updating selection');
@@ -1131,7 +1153,7 @@ $.fn.dropdown = function(parameters) {
1131
1153
  if(module.is.multiple()) {
1132
1154
  module.remove.activeLabel();
1133
1155
  }
1134
- if(!focused && !module.is.active() && (settings.showOnFocus || (event.type !== 'focus' && event.type !== 'focusin'))) {
1156
+ if(!focused && !module.is.active() && (settings.showOnFocus || (event.type !== 'focus' && event.type !== 'focusin')) && event.type !== 'touchstart') {
1135
1157
  focused = true;
1136
1158
  module.search();
1137
1159
  }
@@ -1249,23 +1271,12 @@ $.fn.dropdown = function(parameters) {
1249
1271
  if (!module.is.multiple() || (module.is.multiple() && !module.is.active())) {
1250
1272
  focused = true;
1251
1273
  }
1252
- if( module.determine.eventOnElement(event, toggleBehavior) ) {
1274
+ if( module.determine.eventOnElement(event, toggleBehavior) && event.type !== 'touchstart') {
1275
+ // do not preventDefault of touchstart; so emulated mouseenter is triggered on first touch and not later
1276
+ // (when selecting an item). The double-showing of the dropdown through both events does not hurt.
1253
1277
  event.preventDefault();
1254
1278
  }
1255
1279
  },
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
1280
  hide: function(event) {
1270
1281
  if(module.determine.eventInModule(event, module.hide)){
1271
1282
  if(element.id && $(event.target).attr('for') === element.id){
@@ -1285,8 +1296,8 @@ $.fn.dropdown = function(parameters) {
1285
1296
  },
1286
1297
  select: {
1287
1298
  mutation: function(mutations) {
1288
- module.debug('<select> modified, recreating menu');
1289
1299
  if(module.is.selectMutation(mutations)) {
1300
+ module.debug('<select> modified, recreating menu');
1290
1301
  module.disconnect.selectObserver();
1291
1302
  module.refresh();
1292
1303
  module.setup.select();
@@ -1349,13 +1360,15 @@ $.fn.dropdown = function(parameters) {
1349
1360
  },
1350
1361
  mouseleave: function(event) {
1351
1362
  var
1352
- $subMenu = $(this).children(selector.menu)
1363
+ $subMenu = $(this).find(selector.menu)
1353
1364
  ;
1354
1365
  if($subMenu.length > 0) {
1355
1366
  clearTimeout(module.itemTimer);
1356
1367
  module.itemTimer = setTimeout(function() {
1357
1368
  module.verbose('Hiding sub-menu', $subMenu);
1358
- module.animate.hide(false, $subMenu);
1369
+ $subMenu.each(function() {
1370
+ module.animate.hide(false, $(this));
1371
+ });
1359
1372
  }, settings.delay.hide);
1360
1373
  }
1361
1374
  },
@@ -1381,7 +1394,7 @@ $.fn.dropdown = function(parameters) {
1381
1394
  module.remove.userAddition();
1382
1395
  }
1383
1396
  module.remove.searchTerm();
1384
- if(!module.is.focusedOnSearch() && !(skipRefocus == true)) {
1397
+ if(!module.is.focusedOnSearch() && skipRefocus !== true) {
1385
1398
  module.focusSearch(true);
1386
1399
  }
1387
1400
  }
@@ -1513,7 +1526,7 @@ $.fn.dropdown = function(parameters) {
1513
1526
  keydown: function(event) {
1514
1527
  var
1515
1528
  pressedKey = event.which,
1516
- isShortcutKey = module.is.inObject(pressedKey, keys)
1529
+ isShortcutKey = module.is.inObject(pressedKey, keys) || event.key === settings.delimiter
1517
1530
  ;
1518
1531
  if(isShortcutKey) {
1519
1532
  var
@@ -1531,7 +1544,7 @@ $.fn.dropdown = function(parameters) {
1531
1544
  hasSubMenu = ($subMenu.length> 0),
1532
1545
  hasSelectedItem = ($selectedItem.length > 0),
1533
1546
  selectedIsSelectable = ($selectedItem.not(selector.unselectable).length > 0),
1534
- delimiterPressed = (pressedKey == keys.delimiter && settings.allowAdditions && module.is.multiple()),
1547
+ delimiterPressed = (event.key === settings.delimiter && module.is.multiple()),
1535
1548
  isAdditionWithoutMenu = (settings.allowAdditions && settings.hideAdditions && (pressedKey == keys.enter || delimiterPressed) && selectedIsSelectable),
1536
1549
  $nextItem,
1537
1550
  isSubMenuItem,
@@ -1629,7 +1642,7 @@ $.fn.dropdown = function(parameters) {
1629
1642
  .addClass(className.selected)
1630
1643
  ;
1631
1644
  module.set.scrollPosition($nextItem);
1632
- if(settings.selectOnKeydown && module.is.single()) {
1645
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
1633
1646
  module.set.selectedItem($nextItem);
1634
1647
  }
1635
1648
  }
@@ -1656,7 +1669,7 @@ $.fn.dropdown = function(parameters) {
1656
1669
  .addClass(className.selected)
1657
1670
  ;
1658
1671
  module.set.scrollPosition($nextItem);
1659
- if(settings.selectOnKeydown && module.is.single()) {
1672
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
1660
1673
  module.set.selectedItem($nextItem);
1661
1674
  }
1662
1675
  }
@@ -1787,7 +1800,7 @@ $.fn.dropdown = function(parameters) {
1787
1800
  ;
1788
1801
  if( module.can.activate( $(element) ) ) {
1789
1802
  module.set.selected(value, $(element));
1790
- if(!module.is.multiple()) {
1803
+ if(!module.is.multiple() && !(!settings.collapseOnActionable && $(element).hasClass(className.actionable))) {
1791
1804
  module.hideAndClear();
1792
1805
  }
1793
1806
  }
@@ -1800,7 +1813,7 @@ $.fn.dropdown = function(parameters) {
1800
1813
  ;
1801
1814
  if( module.can.activate( $(element) ) ) {
1802
1815
  module.set.value(value, text, $(element));
1803
- if(!module.is.multiple()) {
1816
+ if(!module.is.multiple() && !(!settings.collapseOnActionable && $(element).hasClass(className.actionable))) {
1804
1817
  module.hideAndClear();
1805
1818
  }
1806
1819
  }
@@ -1851,7 +1864,7 @@ $.fn.dropdown = function(parameters) {
1851
1864
  ;
1852
1865
  $sizer.text(value);
1853
1866
  // prevent rounding issues
1854
- return Math.ceil( $sizer.width() + 1);
1867
+ return Math.ceil( $sizer.width() + (module.is.edge() ? 3 : 1));
1855
1868
  },
1856
1869
  selectionCount: function() {
1857
1870
  var
@@ -2320,7 +2333,7 @@ $.fn.dropdown = function(parameters) {
2320
2333
  module.error(error.noStorage);
2321
2334
  return;
2322
2335
  }
2323
- name = sessionStorage.getItem(value);
2336
+ name = sessionStorage.getItem(value + elementNamespace);
2324
2337
  return (name !== undefined)
2325
2338
  ? name
2326
2339
  : false
@@ -2364,7 +2377,7 @@ $.fn.dropdown = function(parameters) {
2364
2377
  return;
2365
2378
  }
2366
2379
  module.verbose('Saving remote data to session storage', value, name);
2367
- sessionStorage.setItem(value, name);
2380
+ sessionStorage.setItem(value + elementNamespace, name);
2368
2381
  }
2369
2382
  },
2370
2383
 
@@ -2424,7 +2437,7 @@ $.fn.dropdown = function(parameters) {
2424
2437
  $nextSelectedItem
2425
2438
  .addClass(className.selected)
2426
2439
  ;
2427
- if(settings.selectOnKeydown && module.is.single()) {
2440
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
2428
2441
  module.set.selectedItem($nextSelectedItem);
2429
2442
  }
2430
2443
  $menu
@@ -2510,7 +2523,7 @@ $.fn.dropdown = function(parameters) {
2510
2523
  var
2511
2524
  length = module.get.query().length
2512
2525
  ;
2513
- $search.val( text.substr(0, length));
2526
+ $search.val( text.slice(0, length));
2514
2527
  },
2515
2528
  scrollPosition: function($item, forceScroll) {
2516
2529
  var
@@ -2627,13 +2640,13 @@ $.fn.dropdown = function(parameters) {
2627
2640
  module.set.scrollPosition($nextValue);
2628
2641
  $selectedItem.removeClass(className.selected);
2629
2642
  $nextValue.addClass(className.selected);
2630
- if(settings.selectOnKeydown && module.is.single()) {
2643
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
2631
2644
  module.set.selectedItem($nextValue);
2632
2645
  }
2633
2646
  }
2634
2647
  },
2635
2648
  direction: function($menu) {
2636
- if(settings.direction == 'auto') {
2649
+ if(settings.direction === 'auto') {
2637
2650
  // reset position, remove upward if it's base menu
2638
2651
  if (!$menu) {
2639
2652
  module.remove.upward();
@@ -2652,7 +2665,7 @@ $.fn.dropdown = function(parameters) {
2652
2665
  module.set.leftward($menu);
2653
2666
  }
2654
2667
  }
2655
- else if(settings.direction == 'upward') {
2668
+ else if(settings.direction === 'upward') {
2656
2669
  module.set.upward($menu);
2657
2670
  }
2658
2671
  },
@@ -2665,6 +2678,11 @@ $.fn.dropdown = function(parameters) {
2665
2678
  $element.addClass(className.leftward);
2666
2679
  },
2667
2680
  value: function(value, text, $selected, preventChangeTrigger) {
2681
+ if(typeof text === 'boolean') {
2682
+ preventChangeTrigger = text;
2683
+ $selected = undefined;
2684
+ text = undefined;
2685
+ }
2668
2686
  if(value !== undefined && value !== '' && !(Array.isArray(value) && value.length === 0)) {
2669
2687
  $input.removeClass(className.noselection);
2670
2688
  } else {
@@ -2728,12 +2746,21 @@ $.fn.dropdown = function(parameters) {
2728
2746
  visible: function() {
2729
2747
  $module.addClass(className.visible);
2730
2748
  },
2731
- exactly: function(value, $selectedItem) {
2749
+ exactly: function(value, $selectedItem, preventChangeTrigger) {
2750
+ if(typeof $selectedItem === 'boolean') {
2751
+ preventChangeTrigger = $selectedItem;
2752
+ $selectedItem = undefined;
2753
+ }
2732
2754
  module.debug('Setting selected to exact values');
2733
2755
  module.clear();
2734
- module.set.selected(value, $selectedItem);
2756
+ module.set.selected(value, $selectedItem, preventChangeTrigger);
2735
2757
  },
2736
2758
  selected: function(value, $selectedItem, preventChangeTrigger, keepSearchTerm) {
2759
+ if(typeof $selectedItem === 'boolean') {
2760
+ keepSearchTerm = preventChangeTrigger;
2761
+ preventChangeTrigger = $selectedItem;
2762
+ $selectedItem = undefined;
2763
+ }
2737
2764
  var
2738
2765
  isMultiple = module.is.multiple()
2739
2766
  ;
@@ -2765,23 +2792,30 @@ $.fn.dropdown = function(parameters) {
2765
2792
 
2766
2793
  isFiltered = $selected.hasClass(className.filtered),
2767
2794
  isActive = $selected.hasClass(className.active),
2795
+ isActionable = $selected.hasClass(className.actionable),
2768
2796
  isUserValue = $selected.hasClass(className.addition),
2769
- shouldAnimate = (isMultiple && $selectedItem.length == 1)
2797
+ shouldAnimate = (isMultiple && $selectedItem && $selectedItem.length === 1)
2770
2798
  ;
2771
- if(isMultiple) {
2799
+ if(isActionable){
2800
+ if((!isMultiple || (!isActive || isUserValue)) && settings.apiSettings && settings.saveRemoteData) {
2801
+ module.save.remoteData(selectedText, selectedValue);
2802
+ }
2803
+ settings.onActionable.call(element, selectedValue, selectedText, $selected);
2804
+ }
2805
+ else if(isMultiple) {
2772
2806
  if(!isActive || isUserValue) {
2773
2807
  if(settings.apiSettings && settings.saveRemoteData) {
2774
2808
  module.save.remoteData(selectedText, selectedValue);
2775
2809
  }
2776
2810
  if(settings.useLabels) {
2811
+ module.add.value(selectedValue, selectedText, $selected, preventChangeTrigger);
2777
2812
  module.add.label(selectedValue, selectedText, shouldAnimate);
2778
- module.add.value(selectedValue, selectedText, $selected);
2779
2813
  module.set.activeItem($selected);
2780
2814
  module.filterActive();
2781
2815
  module.select.nextAvailable($selectedItem);
2782
2816
  }
2783
2817
  else {
2784
- module.add.value(selectedValue, selectedText, $selected);
2818
+ module.add.value(selectedValue, selectedText, $selected, preventChangeTrigger);
2785
2819
  module.set.text(module.add.variables(message.count));
2786
2820
  module.set.activeItem($selected);
2787
2821
  }
@@ -2795,7 +2829,7 @@ $.fn.dropdown = function(parameters) {
2795
2829
  if(settings.apiSettings && settings.saveRemoteData) {
2796
2830
  module.save.remoteData(selectedText, selectedValue);
2797
2831
  }
2798
- if (!keepSearchTerm) {
2832
+ if (!keepSearchTerm && !$selected.hasClass(className.actionable)) {
2799
2833
  module.set.text(selectedText);
2800
2834
  }
2801
2835
  module.set.value(selectedValue, selectedText, $selected, preventChangeTrigger);
@@ -2894,7 +2928,7 @@ $.fn.dropdown = function(parameters) {
2894
2928
  $('<option/>')
2895
2929
  .prop('value', escapedValue)
2896
2930
  .addClass(className.addition)
2897
- .html(value)
2931
+ .text(value)
2898
2932
  .appendTo($input)
2899
2933
  ;
2900
2934
  module.verbose('Adding user addition as an <option>', value);
@@ -2970,7 +3004,12 @@ $.fn.dropdown = function(parameters) {
2970
3004
  }
2971
3005
  return message;
2972
3006
  },
2973
- value: function(addedValue, addedText, $selectedItem) {
3007
+ value: function(addedValue, addedText, $selectedItem, preventChangeTrigger) {
3008
+ if(typeof addedText === 'boolean') {
3009
+ preventChangeTrigger = addedText;
3010
+ $selectedItem = undefined;
3011
+ addedText = undefined;
3012
+ }
2974
3013
  var
2975
3014
  currentValue = module.get.values(true),
2976
3015
  newValue
@@ -2985,7 +3024,7 @@ $.fn.dropdown = function(parameters) {
2985
3024
  }
2986
3025
  // extend current array
2987
3026
  if(Array.isArray(currentValue)) {
2988
- newValue = currentValue.concat([addedValue]);
3027
+ newValue = $selectedItem && $selectedItem.hasClass(className.actionable) ? currentValue : currentValue.concat([addedValue]);
2989
3028
  newValue = module.get.uniqueArray(newValue);
2990
3029
  }
2991
3030
  else {
@@ -3009,7 +3048,7 @@ $.fn.dropdown = function(parameters) {
3009
3048
  else {
3010
3049
  settings.onAdd.call(element, addedValue, addedText, $selectedItem);
3011
3050
  }
3012
- module.set.value(newValue, addedText, $selectedItem);
3051
+ module.set.value(newValue, addedText, $selectedItem, preventChangeTrigger);
3013
3052
  module.check.maxSelections();
3014
3053
  },
3015
3054
  },
@@ -3069,18 +3108,10 @@ $.fn.dropdown = function(parameters) {
3069
3108
  return;
3070
3109
  }
3071
3110
  // temporarily disconnect observer
3072
- if(selectObserver) {
3073
- selectObserver.disconnect();
3074
- module.verbose('Temporarily disconnecting mutation observer');
3075
- }
3111
+ module.disconnect.selectObserver();
3076
3112
  $option.remove();
3077
3113
  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
- }
3114
+ module.observe.select();
3084
3115
  },
3085
3116
  message: function() {
3086
3117
  $menu.children(selector.message).remove();
@@ -3379,8 +3410,11 @@ $.fn.dropdown = function(parameters) {
3379
3410
  bubbledIconClick: function(event) {
3380
3411
  return $(event.target).closest($icon).length > 0;
3381
3412
  },
3413
+ edge: function() {
3414
+ return !!window.chrome && !!window.StyleMedia;
3415
+ },
3382
3416
  chrome: function() {
3383
- return !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);
3417
+ return !!window.chrome && !window.StyleMedia;
3384
3418
  },
3385
3419
  alreadySetup: function() {
3386
3420
  return ($module.is('select') && $module.parent(selector.dropdown).data(moduleNamespace) !== undefined && $module.prev().length === 0);
@@ -3445,7 +3479,7 @@ $.fn.dropdown = function(parameters) {
3445
3479
  selectChanged = false
3446
3480
  ;
3447
3481
  $.each(mutations, function(index, mutation) {
3448
- if($(mutation.target).is('select') || $(mutation.addedNodes).is('select')) {
3482
+ if($(mutation.target).is('select, option, optgroup') || $(mutation.addedNodes).is('select')) {
3449
3483
  selectChanged = true;
3450
3484
  return false;
3451
3485
  }
@@ -3587,9 +3621,6 @@ $.fn.dropdown = function(parameters) {
3587
3621
  $currentMenu.removeClass(className.loading);
3588
3622
  return canOpenRightward;
3589
3623
  },
3590
- click: function() {
3591
- return (hasTouch || settings.on == 'click');
3592
- },
3593
3624
  extendSelect: function() {
3594
3625
  return settings.allowAdditions || settings.apiSettings;
3595
3626
  },
@@ -3659,9 +3690,7 @@ $.fn.dropdown = function(parameters) {
3659
3690
  start = ($subMenu)
3660
3691
  ? function() {}
3661
3692
  : function() {
3662
- if( module.can.click() ) {
3663
- module.unbind.intent();
3664
- }
3693
+ module.unbind.intent();
3665
3694
  module.remove.active();
3666
3695
  },
3667
3696
  transition = settings.transition.hideMethod || module.get.transition($subMenu)
@@ -3990,7 +4019,7 @@ $.fn.dropdown.settings = {
3990
4019
  keepOnScreen : true, // Whether dropdown should check whether it is on screen before showing
3991
4020
 
3992
4021
  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)
4022
+ fullTextSearch : 'exact', // search anywhere in value (set to 'exact' to require exact matches)
3994
4023
  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
4024
  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
4025
 
@@ -3998,7 +4027,7 @@ $.fn.dropdown.settings = {
3998
4027
  preserveHTML : true, // preserve html when selecting value
3999
4028
  sortSelect : false, // sort selection on init
4000
4029
 
4001
- forceSelection : true, // force a choice on blur with search selection
4030
+ forceSelection : false, // force a choice on blur with search selection
4002
4031
 
4003
4032
  allowAdditions : false, // whether multiple select should allow user added values
4004
4033
  ignoreCase : false, // whether to consider case sensitivity when creating labels
@@ -4009,7 +4038,7 @@ $.fn.dropdown.settings = {
4009
4038
  useLabels : true, // whether multiple select should filter currently active selections from choices
4010
4039
  delimiter : ',', // when multiselect uses normal <input> the values will be delimited with this character
4011
4040
 
4012
- showOnFocus : true, // show menu on focus
4041
+ showOnFocus : false, // show menu on focus
4013
4042
  allowReselection : false, // whether current value should trigger callbacks when reselected
4014
4043
  allowTab : true, // add tabindex to element
4015
4044
  allowCategorySelection : false, // allow elements with sub-menus to be selected
@@ -4024,6 +4053,8 @@ $.fn.dropdown.settings = {
4024
4053
 
4025
4054
  headerDivider : true, // whether option headers should have an additional divider line underneath when converted from <select> <optgroup>
4026
4055
 
4056
+ collapseOnActionable : true, // whether the dropdown should collapse upon selection of an actionable item
4057
+
4027
4058
  // label settings on multi-select
4028
4059
  label: {
4029
4060
  transition : 'scale',
@@ -4036,13 +4067,13 @@ $.fn.dropdown.settings = {
4036
4067
  hide : 300,
4037
4068
  show : 200,
4038
4069
  search : 20,
4039
- touch : 50
4040
4070
  },
4041
4071
 
4042
4072
  /* Callbacks */
4043
4073
  onChange : function(value, text, $selected){},
4044
4074
  onAdd : function(value, text, $selected){},
4045
4075
  onRemove : function(value, text, $selected){},
4076
+ onActionable : function(value, text, $selected){},
4046
4077
  onSearch : function(searchTerm){},
4047
4078
 
4048
4079
  onLabelSelect : function($selectedLabels){},
@@ -4105,12 +4136,12 @@ $.fn.dropdown.settings = {
4105
4136
  icon : 'icon', // optional icon name
4106
4137
  iconClass : 'iconClass', // optional individual class for icon (for example to use flag instead)
4107
4138
  class : 'class', // optional individual class for item/header
4108
- divider : 'divider' // optional divider append for group headers
4139
+ divider : 'divider', // optional divider append for group headers
4140
+ actionable : 'actionable' // optional actionable item
4109
4141
  },
4110
4142
 
4111
4143
  keys : {
4112
4144
  backspace : 8,
4113
- delimiter : 188, // comma
4114
4145
  deleteKey : 46,
4115
4146
  enter : 13,
4116
4147
  escape : 27,
@@ -4177,7 +4208,8 @@ $.fn.dropdown.settings = {
4177
4208
  header : 'header',
4178
4209
  divider : 'divider',
4179
4210
  groupIcon : '',
4180
- unfilterable : 'unfilterable'
4211
+ unfilterable : 'unfilterable',
4212
+ actionable : 'actionable'
4181
4213
  }
4182
4214
 
4183
4215
  };
@@ -4252,6 +4284,9 @@ $.fn.dropdown.settings.templates = {
4252
4284
  maybeText = (option[fields.text])
4253
4285
  ? ' data-text="' + deQuote(option[fields.text],true) + '"'
4254
4286
  : '',
4287
+ maybeActionable = (option[fields.actionable])
4288
+ ? className.actionable+' '
4289
+ : '',
4255
4290
  maybeDisabled = (option[fields.disabled])
4256
4291
  ? className.disabled+' '
4257
4292
  : '',
@@ -4260,7 +4295,7 @@ $.fn.dropdown.settings.templates = {
4260
4295
  : '',
4261
4296
  hasDescription = (escape(option[fields.description] || '', preserveHTML) != '')
4262
4297
  ;
4263
- html += '<div class="'+ maybeDisabled + maybeDescriptionVertical + (option[fields.class] ? deQuote(option[fields.class]) : className.item)+'" data-value="' + deQuote(option[fields.value],true) + '"' + maybeText + '>';
4298
+ html += '<div class="'+ maybeActionable + maybeDisabled + maybeDescriptionVertical + (option[fields.class] ? deQuote(option[fields.class]) : className.item)+'" data-value="' + deQuote(option[fields.value],true) + '"' + maybeText + '>';
4264
4299
  if (isMenu) {
4265
4300
  html += '<i class="'+ (itemType.indexOf('left') !== -1 ? 'left' : '') + ' dropdown icon"></i>';
4266
4301
  }