fomantic-ui 2.9.0-beta.29 → 2.9.0-beta.290

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 (407) hide show
  1. package/.all-contributorsrc +242 -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/CONTRIBUTORS.md +81 -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 +6 -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 +85 -68
  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 +17 -11
  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 +11 -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 +90 -50
  44. package/dist/components/dropdown.js +134 -110
  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 +1 -1
  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 +14 -2
  84. package/dist/components/modal.js +128 -50
  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 +11 -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 +1 -1
  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 +2 -2
  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 +7 -5
  122. package/dist/components/sidebar.js +14 -12
  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 +4 -4
  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 +1174 -32
  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 +63 -31
  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 +21 -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 +2 -2
  160. package/dist/components/visibility.min.js +3 -3
  161. package/dist/semantic.css +19655 -13134
  162. package/dist/semantic.js +734 -455
  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 +1 -1
  211. package/src/definitions/collections/form.less +225 -161
  212. package/src/definitions/collections/grid.less +723 -687
  213. package/src/definitions/collections/menu.less +224 -166
  214. package/src/definitions/collections/message.less +49 -47
  215. package/src/definitions/collections/table.less +855 -268
  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 +268 -26
  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 +174 -55
  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 +23 -2
  233. package/src/definitions/modules/accordion.js +5 -2
  234. package/src/definitions/modules/accordion.less +371 -219
  235. package/src/definitions/modules/calendar.js +84 -67
  236. package/src/definitions/modules/calendar.less +20 -0
  237. package/src/definitions/modules/checkbox.js +16 -10
  238. package/src/definitions/modules/checkbox.less +83 -227
  239. package/src/definitions/modules/dimmer.js +10 -4
  240. package/src/definitions/modules/dimmer.less +21 -8
  241. package/src/definitions/modules/dropdown.js +133 -109
  242. package/src/definitions/modules/dropdown.less +179 -128
  243. package/src/definitions/modules/embed.less +4 -4
  244. package/src/definitions/modules/modal.js +127 -49
  245. package/src/definitions/modules/modal.less +12 -0
  246. package/src/definitions/modules/nag.js +1 -1
  247. package/src/definitions/modules/nag.less +20 -19
  248. package/src/definitions/modules/popup.js +10 -10
  249. package/src/definitions/modules/popup.less +86 -90
  250. package/src/definitions/modules/progress.js +3 -0
  251. package/src/definitions/modules/progress.less +19 -18
  252. package/src/definitions/modules/rating.less +35 -34
  253. package/src/definitions/modules/search.js +1 -1
  254. package/src/definitions/modules/search.less +35 -19
  255. package/src/definitions/modules/shape.js +2 -2
  256. package/src/definitions/modules/sidebar.js +13 -11
  257. package/src/definitions/modules/sidebar.less +36 -22
  258. package/src/definitions/modules/slider.js +67 -50
  259. package/src/definitions/modules/slider.less +48 -47
  260. package/src/definitions/modules/sticky.js +3 -3
  261. package/src/definitions/modules/tab.js +23 -5
  262. package/src/definitions/modules/tab.less +4 -4
  263. package/src/definitions/modules/toast.js +62 -30
  264. package/src/definitions/modules/toast.less +51 -16
  265. package/src/definitions/modules/transition.js +20 -15
  266. package/src/definitions/views/ad.less +3 -3
  267. package/src/definitions/views/card.less +519 -374
  268. package/src/definitions/views/comment.less +93 -82
  269. package/src/definitions/views/feed.less +164 -144
  270. package/src/definitions/views/item.less +251 -198
  271. package/src/definitions/views/statistic.less +91 -89
  272. package/src/theme.less +13 -2
  273. package/src/themes/amazon/globals/site.variables +1 -0
  274. package/src/themes/basic/elements/icon.overrides +149 -149
  275. package/src/themes/basic/elements/step.overrides +2 -2
  276. package/src/themes/bookish/elements/header.overrides +1 -1
  277. package/src/themes/chubby/elements/button.overrides +1 -1
  278. package/src/themes/chubby/elements/header.overrides +1 -1
  279. package/src/themes/default/assets/fonts/Lato-Bold.woff +0 -0
  280. package/src/themes/default/assets/fonts/Lato-Bold.woff2 +0 -0
  281. package/src/themes/default/assets/fonts/Lato-BoldItalic.woff +0 -0
  282. package/src/themes/default/assets/fonts/Lato-BoldItalic.woff2 +0 -0
  283. package/src/themes/default/assets/fonts/Lato-Italic.woff +0 -0
  284. package/src/themes/default/assets/fonts/Lato-Italic.woff2 +0 -0
  285. package/src/themes/default/assets/fonts/Lato-Regular.woff +0 -0
  286. package/src/themes/default/assets/fonts/Lato-Regular.woff2 +0 -0
  287. package/src/themes/default/assets/fonts/LatoLatin-Bold.woff +0 -0
  288. package/src/themes/default/assets/fonts/LatoLatin-Bold.woff2 +0 -0
  289. package/src/themes/default/assets/fonts/LatoLatin-BoldItalic.woff +0 -0
  290. package/src/themes/default/assets/fonts/LatoLatin-BoldItalic.woff2 +0 -0
  291. package/src/themes/default/assets/fonts/LatoLatin-Italic.woff +0 -0
  292. package/src/themes/default/assets/fonts/LatoLatin-Italic.woff2 +0 -0
  293. package/src/themes/default/assets/fonts/LatoLatin-Regular.woff +0 -0
  294. package/src/themes/default/assets/fonts/LatoLatin-Regular.woff2 +0 -0
  295. package/src/themes/default/assets/fonts/brand-icons.eot +0 -0
  296. package/src/themes/default/assets/fonts/brand-icons.svg +801 -654
  297. package/src/themes/default/assets/fonts/brand-icons.ttf +0 -0
  298. package/src/themes/default/assets/fonts/brand-icons.woff +0 -0
  299. package/src/themes/default/assets/fonts/brand-icons.woff2 +0 -0
  300. package/src/themes/default/assets/fonts/icons.eot +0 -0
  301. package/src/themes/default/assets/fonts/icons.svg +1175 -1079
  302. package/src/themes/default/assets/fonts/icons.ttf +0 -0
  303. package/src/themes/default/assets/fonts/icons.woff +0 -0
  304. package/src/themes/default/assets/fonts/icons.woff2 +0 -0
  305. package/src/themes/default/assets/fonts/outline-icons.eot +0 -0
  306. package/src/themes/default/assets/fonts/outline-icons.svg +93 -95
  307. package/src/themes/default/assets/fonts/outline-icons.ttf +0 -0
  308. package/src/themes/default/assets/fonts/outline-icons.woff +0 -0
  309. package/src/themes/default/assets/fonts/outline-icons.woff2 +0 -0
  310. package/src/themes/default/collections/form.variables +4 -0
  311. package/src/themes/default/collections/menu.variables +6 -0
  312. package/src/themes/default/collections/table.variables +52 -0
  313. package/src/themes/default/elements/button.variables +7 -1
  314. package/src/themes/default/elements/container.variables +12 -0
  315. package/src/themes/default/elements/divider.overrides +7 -7
  316. package/src/themes/default/elements/emoji.overrides +0 -3090
  317. package/src/themes/default/elements/emoji.variables +3575 -1
  318. package/src/themes/default/elements/flag.overrides +0 -991
  319. package/src/themes/default/elements/flag.variables +1609 -5
  320. package/src/themes/default/elements/icon.overrides +1975 -1949
  321. package/src/themes/default/elements/icon.variables +1 -0
  322. package/src/themes/default/elements/input.variables +15 -0
  323. package/src/themes/default/elements/segment.variables +8 -0
  324. package/src/themes/default/elements/step.overrides +3 -3
  325. package/src/themes/default/globals/site.variables +109 -8
  326. package/src/themes/default/globals/variation.variables +140 -6
  327. package/src/themes/default/modules/accordion.overrides +6 -5
  328. package/src/themes/default/modules/accordion.variables +49 -2
  329. package/src/themes/default/modules/calendar.variables +3 -0
  330. package/src/themes/default/modules/checkbox.overrides +9 -9
  331. package/src/themes/default/modules/checkbox.variables +5 -5
  332. package/src/themes/default/modules/dimmer.variables +1 -1
  333. package/src/themes/default/modules/dropdown.overrides +5 -5
  334. package/src/themes/default/modules/dropdown.variables +4 -10
  335. package/src/themes/default/modules/modal.variables +13 -0
  336. package/src/themes/default/modules/popup.variables +0 -2
  337. package/src/themes/default/modules/toast.variables +3 -0
  338. package/src/themes/default/views/card.variables +8 -0
  339. package/src/themes/{default → famfamfam}/assets/images/flags.png +0 -0
  340. package/src/themes/famfamfam/elements/flag.overrides +1026 -0
  341. package/src/themes/famfamfam/elements/flag.variables +20 -0
  342. package/src/themes/github/elements/icon.overrides +206 -206
  343. package/src/themes/github/elements/step.overrides +5 -5
  344. package/src/themes/github/globals/site.variables +1 -0
  345. package/src/themes/github/modules/dropdown.overrides +6 -6
  346. package/src/themes/instagram/views/card.overrides +1 -1
  347. package/src/themes/joypixels/elements/emoji.overrides +0 -3089
  348. package/src/themes/joypixels/elements/emoji.variables +3574 -5
  349. package/src/themes/material/collections/menu.overrides +1 -1
  350. package/src/themes/material/elements/button.overrides +1 -1
  351. package/src/themes/material/elements/header.overrides +1 -1
  352. package/src/themes/material/elements/icon.overrides +932 -932
  353. package/src/themes/material/globals/site.variables +0 -1
  354. package/src/themes/material/modules/dropdown.overrides +1 -1
  355. package/src/themes/material/modules/modal.overrides +1 -1
  356. package/src/themes/pulsar/elements/loader.overrides +2 -2
  357. package/src/themes/resetcss/globals/reset.overrides +3 -3
  358. package/src/themes/rtl/globals/site.overrides +1 -1
  359. package/src/themes/striped/modules/progress.overrides +1 -1
  360. package/src/themes/systemfont/globals/reset.overrides +8 -0
  361. package/src/themes/systemfont/globals/site.variables +10 -0
  362. package/src/themes/twitter/elements/emoji.overrides +0 -3091
  363. package/src/themes/twitter/elements/emoji.variables +3570 -6
  364. package/tasks/admin/distributions/create.js +1 -1
  365. package/tasks/admin/publish.js +1 -1
  366. package/tasks/admin/release.js +1 -1
  367. package/tasks/build/assets.js +1 -1
  368. package/tasks/build/css.js +9 -4
  369. package/tasks/build/javascript.js +3 -3
  370. package/tasks/check-install.js +1 -1
  371. package/tasks/clean.js +1 -1
  372. package/tasks/collections/README.md +1 -1
  373. package/tasks/collections/admin.js +1 -1
  374. package/tasks/config/admin/oauth.example.js +1 -1
  375. package/tasks/config/admin/templates/composer.json +1 -1
  376. package/tasks/config/project/install.js +15 -13
  377. package/tasks/install.js +1 -0
  378. package/tasks/rtl/watch.js +1 -1
  379. package/tasks/version.js +1 -1
  380. package/test/fixtures/accordion.html +1 -1
  381. package/test/fixtures/checkbox.html +1 -1
  382. package/test/fixtures/dropdown.html +1 -1
  383. package/test/fixtures/modal.html +1 -1
  384. package/test/fixtures/popup.html +1 -1
  385. package/test/fixtures/rating.html +1 -1
  386. package/test/fixtures/shape.html +1 -1
  387. package/test/fixtures/sidebar.html +1 -1
  388. package/test/fixtures/tab.html +1 -1
  389. package/test/fixtures/transition.html +1 -1
  390. package/test/fixtures/video.html +1 -1
  391. package/test/helpers/jasmine-jquery.js +2 -2
  392. package/test/helpers/jasmine-sinon.js +1 -1
  393. package/test/helpers/jquery-events.js +1 -1
  394. package/test/helpers/sinon.js +3 -3
  395. package/test/meteor/fonts.js +1 -1
  396. package/test/modules/accordion.spec.js +1 -1
  397. package/test/modules/checkbox.spec.js +1 -1
  398. package/test/modules/dropdown.spec.js +1 -1
  399. package/test/modules/modal.spec.js +1 -1
  400. package/test/modules/module.spec.js +1 -1
  401. package/test/modules/popup.spec.js +1 -1
  402. package/test/modules/search.spec.js +1 -1
  403. package/test/modules/shape.spec.js +1 -1
  404. package/test/modules/sidebar.spec.js +1 -1
  405. package/test/modules/tab.spec.js +1 -1
  406. package/test/modules/transition.spec.js +1 -1
  407. package/test/modules/video.spec.js +1 -1
package/dist/semantic.js CHANGED
@@ -1,15 +1,15 @@
1
1
  /*
2
- * # Fomantic UI - 2.9.0-beta.29
2
+ * # Fomantic UI - 2.9.0-beta.290+9631798
3
3
  * https://github.com/fomantic/Fomantic-UI
4
4
  * http://fomantic-ui.com/
5
5
  *
6
- * Copyright 2021 Contributors
6
+ * Copyright 2022 Contributors
7
7
  * Released under the MIT license
8
8
  * http://opensource.org/licenses/MIT
9
9
  *
10
10
  */
11
11
  /*!
12
- * # Fomantic-UI 2.9.0-beta.29 - Site
12
+ * # Fomantic-UI 2.9.0-beta.290+9631798 - Site
13
13
  * http://github.com/fomantic/Fomantic-UI/
14
14
  *
15
15
  *
@@ -503,7 +503,7 @@ $.extend($.expr[ ":" ], {
503
503
  })( jQuery, window, document );
504
504
 
505
505
  /*!
506
- * # Fomantic-UI 2.9.0-beta.29 - Form Validation
506
+ * # Fomantic-UI 2.9.0-beta.290+9631798 - Form Validation
507
507
  * http://github.com/fomantic/Fomantic-UI/
508
508
  *
509
509
  *
@@ -635,6 +635,11 @@ $.fn.form = function(parameters) {
635
635
  $reset = $module.find(selector.reset);
636
636
  },
637
637
 
638
+ refreshEvents: function() {
639
+ module.removeEvents();
640
+ module.bindEvents();
641
+ },
642
+
638
643
  submit: function() {
639
644
  module.verbose('Submitting form', $module);
640
645
  submitting = true;
@@ -895,7 +900,6 @@ $.fn.form = function(parameters) {
895
900
  $module.off(eventNamespace);
896
901
  $field.off(eventNamespace);
897
902
  $submit.off(eventNamespace);
898
- $field.off(eventNamespace);
899
903
  },
900
904
 
901
905
  event: {
@@ -923,6 +927,7 @@ $.fn.form = function(parameters) {
923
927
  $field.one('keyup' + eventNamespace, module.event.field.keyup);
924
928
  module.submit();
925
929
  module.debug('Enter pressed on input submitting form');
930
+ event.preventDefault();
926
931
  }
927
932
  keyHeldDown = true;
928
933
  }
@@ -1047,7 +1052,7 @@ $.fn.form = function(parameters) {
1047
1052
  parts,
1048
1053
  suffixPrompt
1049
1054
  ;
1050
- if(ancillary && ancillary.indexOf('..') >= 0) {
1055
+ if(ancillary && ['integer', 'decimal', 'number'].indexOf(ruleName) >= 0 && ancillary.indexOf('..') >= 0) {
1051
1056
  parts = ancillary.split('..', 2);
1052
1057
  if(!rule.prompt) {
1053
1058
  suffixPrompt = (
@@ -1089,7 +1094,7 @@ $.fn.form = function(parameters) {
1089
1094
  if(isLegacySettings) {
1090
1095
  // 1.x (ducktyped)
1091
1096
  settings = $.extend(true, {}, $.fn.form.settings, legacyParameters);
1092
- validation = $.extend({}, $.fn.form.settings.defaults, parameters);
1097
+ validation = $.extend(true, {}, $.fn.form.settings.defaults, parameters);
1093
1098
  module.error(settings.error.oldSyntax, element);
1094
1099
  module.verbose('Extending settings from legacy parameters', validation, settings);
1095
1100
  }
@@ -1099,13 +1104,13 @@ $.fn.form = function(parameters) {
1099
1104
  parameters.fields = module.get.fieldsFromShorthand(parameters.fields);
1100
1105
  }
1101
1106
  settings = $.extend(true, {}, $.fn.form.settings, parameters);
1102
- validation = $.extend({}, $.fn.form.settings.defaults, settings.fields);
1107
+ validation = $.extend(true, {}, $.fn.form.settings.defaults, settings.fields);
1103
1108
  module.verbose('Extending settings', validation, settings);
1104
1109
  }
1105
1110
  }
1106
1111
  else {
1107
- settings = $.fn.form.settings;
1108
- validation = $.fn.form.settings.defaults;
1112
+ settings = $.extend(true, {}, $.fn.form.settings);
1113
+ validation = $.extend(true, {}, $.fn.form.settings.defaults);
1109
1114
  module.verbose('Using default form validation', validation, settings);
1110
1115
  }
1111
1116
 
@@ -1367,9 +1372,11 @@ $.fn.form = function(parameters) {
1367
1372
  }
1368
1373
  });
1369
1374
  module.debug('Adding rules', newValidation.rules, validation);
1375
+ module.refreshEvents();
1370
1376
  },
1371
1377
  fields: function(fields) {
1372
- validation = $.extend({}, validation, module.get.fieldsFromShorthand(fields));
1378
+ validation = $.extend(true, {}, validation, module.get.fieldsFromShorthand(fields));
1379
+ module.refreshEvents();
1373
1380
  },
1374
1381
  prompt: function(identifier, errors, internal) {
1375
1382
  var
@@ -1390,13 +1397,13 @@ $.fn.form = function(parameters) {
1390
1397
  }
1391
1398
  if(settings.inline) {
1392
1399
  if(!promptExists) {
1393
- $prompt = settings.templates.prompt(errors, className.label);
1400
+ $prompt = $('<div/>').addClass(className.label);
1394
1401
  $prompt
1395
1402
  .appendTo($fieldGroup)
1396
1403
  ;
1397
1404
  }
1398
1405
  $prompt
1399
- .html(errors[0])
1406
+ .html(settings.templates.prompt(errors))
1400
1407
  ;
1401
1408
  if(!promptExists) {
1402
1409
  if(settings.transition && module.can.useElement('transition') && $module.transition('is supported')) {
@@ -1466,6 +1473,7 @@ $.fn.form = function(parameters) {
1466
1473
  $.each(fields, function(index, field) {
1467
1474
  module.remove.rule(field);
1468
1475
  });
1476
+ module.refreshEvents();
1469
1477
  },
1470
1478
  // alias
1471
1479
  rules: function(field, rules) {
@@ -1589,12 +1597,15 @@ $.fn.form = function(parameters) {
1589
1597
  }
1590
1598
  else if(isCheckbox) {
1591
1599
  module.verbose('Setting checkbox value', value, $element);
1592
- if(value === true || value === 1) {
1600
+ if(value === true || value === 1 || value === 'on') {
1593
1601
  $element.checkbox('check');
1594
1602
  }
1595
1603
  else {
1596
1604
  $element.checkbox('uncheck');
1597
1605
  }
1606
+ if(typeof value === 'string') {
1607
+ $field.val(value);
1608
+ }
1598
1609
  }
1599
1610
  else if(isDropdown) {
1600
1611
  module.verbose('Setting dropdown value', value, $element);
@@ -1707,10 +1718,10 @@ $.fn.form = function(parameters) {
1707
1718
  if(event && $module.data('moduleApi') !== undefined) {
1708
1719
  event.stopImmediatePropagation();
1709
1720
  }
1710
- if(settings.errorFocus) {
1721
+ if(settings.errorFocus && ignoreCallbacks !== true) {
1711
1722
  var focusElement, hasTabIndex = true;
1712
1723
  if (typeof settings.errorFocus === 'string') {
1713
- focusElement = $(settings.errorFocus);
1724
+ focusElement = $(document).find(settings.errorFocus);
1714
1725
  hasTabIndex = focusElement.is('[tabindex]');
1715
1726
  // to be able to focus/scroll into non input elements we need a tabindex
1716
1727
  if (!hasTabIndex) {
@@ -2030,7 +2041,7 @@ $.fn.form.settings = {
2030
2041
 
2031
2042
  autoCheckRequired : false,
2032
2043
  preventLeaving : false,
2033
- errorFocus : false,
2044
+ errorFocus : true,
2034
2045
  dateHandling : 'date', // 'date', 'input', 'formatter'
2035
2046
 
2036
2047
  onValid : function() {},
@@ -2086,7 +2097,6 @@ $.fn.form.settings = {
2086
2097
  doesntContain : '{name} cannot contain "{ruleValue}"',
2087
2098
  doesntContainExactly : '{name} cannot contain exactly "{ruleValue}"',
2088
2099
  minLength : '{name} must be at least {ruleValue} characters',
2089
- length : '{name} must be at least {ruleValue} characters',
2090
2100
  exactLength : '{name} must be exactly {ruleValue} characters',
2091
2101
  maxLength : '{name} cannot be longer than {ruleValue} characters',
2092
2102
  match : '{name} must match {ruleValue} field',
@@ -2100,7 +2110,7 @@ $.fn.form.settings = {
2100
2110
  selector : {
2101
2111
  checkbox : 'input[type="checkbox"], input[type="radio"]',
2102
2112
  clear : '.clear',
2103
- field : 'input:not(.search):not([type="file"]), textarea, select',
2113
+ field : 'input:not(.search):not([type="file"]):not([type="reset"]):not([type="button"]):not([type="submit"]), textarea, select',
2104
2114
  group : '.field',
2105
2115
  input : 'input:not([type="file"])',
2106
2116
  message : '.error.message',
@@ -2141,15 +2151,22 @@ $.fn.form.settings = {
2141
2151
  html += '<li>' + value + '</li>';
2142
2152
  });
2143
2153
  html += '</ul>';
2144
- return $(html);
2154
+ return html;
2145
2155
  },
2146
2156
 
2147
- // template that produces label
2148
- prompt: function(errors, labelClasses) {
2149
- return $('<div/>')
2150
- .addClass(labelClasses)
2151
- .html(errors[0])
2157
+ // template that produces label content
2158
+ prompt: function(errors) {
2159
+ if(errors.length === 1){
2160
+ return errors[0];
2161
+ }
2162
+ var
2163
+ html = '<ul class="ui list">'
2152
2164
  ;
2165
+ $.each(errors, function(index, value) {
2166
+ html += '<li>' + value + '</li>';
2167
+ });
2168
+ html += '</ul>';
2169
+ return html;
2153
2170
  }
2154
2171
  },
2155
2172
 
@@ -2359,14 +2376,6 @@ $.fn.form.settings = {
2359
2376
  ;
2360
2377
  },
2361
2378
 
2362
- // see rls notes for 2.0.6 (this is a duplicate of minLength)
2363
- length: function(value, requiredLength) {
2364
- return (value !== undefined)
2365
- ? (value.length >= requiredLength)
2366
- : false
2367
- ;
2368
- },
2369
-
2370
2379
  // is exactly length
2371
2380
  exactLength: function(value, requiredLength) {
2372
2381
  return (value !== undefined)
@@ -2575,7 +2584,7 @@ $.fn.form.settings = {
2575
2584
  })( jQuery, window, document );
2576
2585
 
2577
2586
  /*!
2578
- * # Fomantic-UI 2.9.0-beta.29 - Accordion
2587
+ * # Fomantic-UI 2.9.0-beta.290+9631798 - Accordion
2579
2588
  * http://github.com/fomantic/Fomantic-UI/
2580
2589
  *
2581
2590
  *
@@ -2693,8 +2702,10 @@ $.fn.accordion = function(parameters) {
2693
2702
  },
2694
2703
 
2695
2704
  event: {
2696
- click: function() {
2697
- module.toggle.call(this);
2705
+ click: function(event) {
2706
+ if($(event.target).closest(selector.ignore).length === 0) {
2707
+ module.toggle.call(this);
2708
+ }
2698
2709
  }
2699
2710
  },
2700
2711
 
@@ -3178,6 +3189,7 @@ $.fn.accordion.settings = {
3178
3189
  accordion : '.accordion',
3179
3190
  title : '.title',
3180
3191
  trigger : '.title',
3192
+ ignore : '.ui.dropdown',
3181
3193
  content : '.content'
3182
3194
  }
3183
3195
 
@@ -3194,7 +3206,7 @@ $.extend( $.easing, {
3194
3206
 
3195
3207
 
3196
3208
  /*!
3197
- * # Fomantic-UI 2.9.0-beta.29 - Calendar
3209
+ * # Fomantic-UI 2.9.0-beta.290+9631798 - Calendar
3198
3210
  * http://github.com/fomantic/Fomantic-UI/
3199
3211
  *
3200
3212
  *
@@ -3317,7 +3329,7 @@ $.fn.calendar = function(parameters) {
3317
3329
  module.set.maxDate($module.data(metadata.maxDate));
3318
3330
  }
3319
3331
  module.setting('type', module.get.type());
3320
- module.setting('on', settings.on || ($input.length ? 'focus' : 'click'));
3332
+ module.setting('on', settings.on || 'click');
3321
3333
  },
3322
3334
  popup: function () {
3323
3335
  if (settings.inline) {
@@ -3517,7 +3529,7 @@ $.fn.calendar = function(parameters) {
3517
3529
  var headerDate = isYear || isMonth ? new Date(year, 0, 1) :
3518
3530
  isDay ? new Date(year, month, 1) : new Date(year, month, day, hour, minute);
3519
3531
  var headerText = $('<span/>').addClass(className.link).appendTo(cell);
3520
- headerText.text(formatter.header(headerDate, mode, settings));
3532
+ headerText.text(module.helper.dateFormat(formatter[mode+'Header'], headerDate));
3521
3533
  var newMode = isMonth ? (settings.disableYear ? 'day' : 'year') :
3522
3534
  isDay ? (settings.disableMonth ? 'year' : 'month') : 'day';
3523
3535
  headerText.data(metadata.mode, newMode);
@@ -3565,7 +3577,7 @@ $.fn.calendar = function(parameters) {
3565
3577
  isHour ? new Date(year, month, day, i) : new Date(year, month, day, hour, i * settings.minTimeGap);
3566
3578
  var cellText = isYear ? i :
3567
3579
  isMonth ? settings.text.monthsShort[i] : isDay ? cellDate.getDate() :
3568
- formatter.time(cellDate, settings, true);
3580
+ module.helper.dateFormat(formatter.cellTime,cellDate);
3569
3581
  cell = $('<td/>').addClass(className.cell).appendTo(row);
3570
3582
  cell.text(cellText);
3571
3583
  cell.data(metadata.date, cellDate);
@@ -3697,7 +3709,7 @@ $.fn.calendar = function(parameters) {
3697
3709
  var winWidth = $(window).width();
3698
3710
  $container.find('td[data-position]').each(function () {
3699
3711
  var cell = $(this);
3700
- var tooltipWidth = window.getComputedStyle(cell[0], ':after').width.replace(/[^0-9\.]/g,'');
3712
+ var tooltipWidth = window.getComputedStyle(cell[0], '::after').width.replace(/[^0-9\.]/g,'');
3701
3713
  var tooltipPosition = cell.attr('data-position');
3702
3714
  // use a fallback width of 250 (calendar width) for IE/Edge (which return "auto")
3703
3715
  var calcPosition = (winWidth - cell.width() - (parseInt(tooltipWidth,10) || 250)) > cell.offset().left ? 'right' : 'left';
@@ -3846,7 +3858,7 @@ $.fn.calendar = function(parameters) {
3846
3858
  $container.removeClass(className.active);
3847
3859
  if (settings.formatInput) {
3848
3860
  var date = module.get.date();
3849
- var text = formatter.datetime(date, settings);
3861
+ var text = module.helper.dateFormat(formatter[settings.type], date);
3850
3862
  $input.val(text);
3851
3863
  }
3852
3864
  if(selectionComplete){
@@ -3917,6 +3929,9 @@ $.fn.calendar = function(parameters) {
3917
3929
  return AWN - Math.floor(Date.UTC(Wyr, 0, 7) / ms7d) + 1;
3918
3930
  }();
3919
3931
  },
3932
+ formattedDate: function(format, date) {
3933
+ return module.helper.dateFormat(format || formatter[settings.type], date || module.get.date());
3934
+ },
3920
3935
  date: function () {
3921
3936
  return module.helper.sanitiseDate($module.data(metadata.date)) || null;
3922
3937
  },
@@ -3941,7 +3956,7 @@ $.fn.calendar = function(parameters) {
3941
3956
  return $module.data(metadata.maxDate) || null;
3942
3957
  },
3943
3958
  monthOffset: function () {
3944
- return $module.data(metadata.monthOffset) || 0;
3959
+ return $module.data(metadata.monthOffset) || settings.monthOffset || 0;
3945
3960
  },
3946
3961
  mode: function () {
3947
3962
  //only returns valid modes for the current settings
@@ -3995,7 +4010,7 @@ $.fn.calendar = function(parameters) {
3995
4010
  return null;
3996
4011
  }
3997
4012
  if (!(selector instanceof $)) {
3998
- selector = $(selector).first();
4013
+ selector = $(document).find(selector).first();
3999
4014
  }
4000
4015
  //assume range related calendars are using the same namespace
4001
4016
  return selector.data(moduleNamespace);
@@ -4010,7 +4025,7 @@ $.fn.calendar = function(parameters) {
4010
4025
  date = module.helper.dateInRange(date);
4011
4026
 
4012
4027
  var mode = module.get.mode();
4013
- var text = formatter.datetime(date, settings);
4028
+ var text = module.helper.dateFormat(formatter[settings.type],date);
4014
4029
 
4015
4030
  if (fireChange && settings.onBeforeChange.call(element, date, text, mode) === false) {
4016
4031
  return false;
@@ -4181,6 +4196,60 @@ $.fn.calendar = function(parameters) {
4181
4196
  },
4182
4197
 
4183
4198
  helper: {
4199
+ dateFormat: function(format,date) {
4200
+ if (!(date instanceof Date)) {
4201
+ return '';
4202
+ }
4203
+ if(typeof format === 'function') {
4204
+ return format.call(module, date, settings);
4205
+ }
4206
+
4207
+ var D = date.getDate(),
4208
+ M = date.getMonth(),
4209
+ Y = date.getFullYear(),
4210
+ d = date.getDay(),
4211
+ H = date.getHours(),
4212
+ m = date.getMinutes(),
4213
+ s = date.getSeconds(),
4214
+ w = module.get.weekOfYear(Y,M,D+1-settings.firstDayOfWeek),
4215
+ h = H % 12 || 12,
4216
+ a = H < 12 ? settings.text.am.toLowerCase() : settings.text.pm.toLowerCase(),
4217
+ tokens = {
4218
+ D: D,
4219
+ DD: ('0'+D).slice(-2),
4220
+ M: M + 1,
4221
+ MM: ('0'+(M+1)).slice(-2),
4222
+ MMM: settings.text.monthsShort[M],
4223
+ MMMM: settings.text.months[M],
4224
+ Y: Y,
4225
+ YY: String(Y).slice(2),
4226
+ YYYY: Y,
4227
+ d: d,
4228
+ dd: settings.text.dayNamesShort[d].slice(0,2),
4229
+ ddd: settings.text.dayNamesShort[d],
4230
+ dddd: settings.text.dayNames[d],
4231
+ h: h,
4232
+ hh: ('0'+h).slice(-2),
4233
+ H: H,
4234
+ HH: ('0'+H).slice(-2),
4235
+ m: m,
4236
+ mm: ('0'+m).slice(-2),
4237
+ s: s,
4238
+ ss: ('0'+s).slice(-2),
4239
+ a: a,
4240
+ A: a.toUpperCase(),
4241
+ S: ['th', 'st', 'nd', 'rd'][D % 10 > 3 ? 0 : (D % 100 - D % 10 !== 10) * D % 10],
4242
+ w: w,
4243
+ ww: ('0'+w).slice(-2)
4244
+ }
4245
+ ;
4246
+ return format.replace(settings.regExp.token, function (match) {
4247
+ if (match in tokens) {
4248
+ return tokens[match];
4249
+ }
4250
+ return match.slice(1, match.length - 1);
4251
+ });
4252
+ },
4184
4253
  isDisabled: function(date, mode) {
4185
4254
  return (mode === 'day' || mode === 'month' || mode === 'year' || mode === 'hour') && (((mode === 'day' && settings.disabledDaysOfWeek.indexOf(date.getDay()) !== -1) || settings.disabledDates.some(function(d){
4186
4255
  if(typeof d === 'string') {
@@ -4631,7 +4700,7 @@ $.fn.calendar.settings = {
4631
4700
  constantHeight : true, // add rows to shorter months to keep day calendar height consistent (6 rows)
4632
4701
  today : false, // show a 'today/now' button at the bottom of the calendar
4633
4702
  closable : true, // close the popup after selecting a date/time
4634
- monthFirst : true, // month before day when parsing/converting date from/to text
4703
+ monthFirst : true, // month before day when parsing date from text
4635
4704
  touchReadonly : true, // set input to readonly on touch devices
4636
4705
  inline : false, // create the calendar inline instead of inside a popup
4637
4706
  on : null, // when to show the popup (defaults to 'focus' for input, 'click' for others)
@@ -4639,7 +4708,6 @@ $.fn.calendar.settings = {
4639
4708
  startMode : false, // display mode to start in, can be 'year', 'month', 'day', 'hour', 'minute' (false = 'day')
4640
4709
  minDate : null, // minimum date/time that can be selected, dates/times before are disabled
4641
4710
  maxDate : null, // maximum date/time that can be selected, dates/times after are disabled
4642
- ampm : true, // show am/pm in time mode
4643
4711
  disableYear : false, // disable year selection mode
4644
4712
  disableMonth : false, // disable month selection mode
4645
4713
  disableMinute : false, // disable minute selection mode
@@ -4647,8 +4715,9 @@ $.fn.calendar.settings = {
4647
4715
  startCalendar : null, // jquery object or selector for another calendar that represents the start date of a date range
4648
4716
  endCalendar : null, // jquery object or selector for another calendar that represents the end date of a date range
4649
4717
  multiMonth : 1, // show multiple months when in 'day' mode
4718
+ monthOffset : 0, // position current month by offset when multimonth > 1
4650
4719
  minTimeGap : 5,
4651
- showWeekNumbers : null, // show Number of Week at the very first column of a dayView
4720
+ showWeekNumbers : false, // show Number of Week at the very first column of a dayView
4652
4721
  disabledHours : [], // specific hour(s) which won't be selectable and contain additional information.
4653
4722
  disabledDates : [], // specific day(s) which won't be selectable and contain additional information.
4654
4723
  disabledDaysOfWeek : [], // day(s) which won't be selectable(s) (0 = Sunday)
@@ -4662,11 +4731,14 @@ $.fn.calendar.settings = {
4662
4731
  position: 'bottom left',
4663
4732
  lastResort: 'bottom left',
4664
4733
  prefer: 'opposite',
4734
+ observeChanges: false,
4665
4735
  hideOnScroll: false
4666
4736
  },
4667
4737
 
4668
4738
  text: {
4669
4739
  days: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
4740
+ dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
4741
+ dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
4670
4742
  months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
4671
4743
  monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
4672
4744
  today: 'Today',
@@ -4677,67 +4749,23 @@ $.fn.calendar.settings = {
4677
4749
  },
4678
4750
 
4679
4751
  formatter: {
4680
- header: function (date, mode, settings) {
4681
- return mode === 'year' ? settings.formatter.yearHeader(date, settings) :
4682
- mode === 'month' ? settings.formatter.monthHeader(date, settings) :
4683
- mode === 'day' ? settings.formatter.dayHeader(date, settings) :
4684
- mode === 'hour' ? settings.formatter.hourHeader(date, settings) :
4685
- settings.formatter.minuteHeader(date, settings);
4686
- },
4687
4752
  yearHeader: function (date, settings) {
4688
4753
  var decadeYear = Math.ceil(date.getFullYear() / 10) * 10;
4689
4754
  return (decadeYear - 9) + ' - ' + (decadeYear + 2);
4690
4755
  },
4691
- monthHeader: function (date, settings) {
4692
- return date.getFullYear();
4693
- },
4694
- dayHeader: function (date, settings) {
4695
- var month = settings.text.months[date.getMonth()];
4696
- var year = date.getFullYear();
4697
- return month + ' ' + year;
4698
- },
4699
- hourHeader: function (date, settings) {
4700
- return settings.formatter.date(date, settings);
4701
- },
4702
- minuteHeader: function (date, settings) {
4703
- return settings.formatter.date(date, settings);
4704
- },
4756
+ monthHeader: 'YYYY',
4757
+ dayHeader: 'MMMM YYYY',
4758
+ hourHeader: 'MMMM D, YYYY',
4759
+ minuteHeader: 'MMMM D, YYYY',
4705
4760
  dayColumnHeader: function (day, settings) {
4706
4761
  return settings.text.days[day];
4707
4762
  },
4708
- datetime: function (date, settings) {
4709
- if (!date) {
4710
- return '';
4711
- }
4712
- var day = settings.type === 'time' ? '' : settings.formatter.date(date, settings);
4713
- var time = settings.type.indexOf('time') < 0 ? '' : settings.formatter.time(date, settings, false);
4714
- var separator = settings.type === 'datetime' ? ' ' : '';
4715
- return day + separator + time;
4716
- },
4717
- date: function (date, settings) {
4718
- if (!date) {
4719
- return '';
4720
- }
4721
- var day = date.getDate();
4722
- var month = settings.text.months[date.getMonth()];
4723
- var year = date.getFullYear();
4724
- return settings.type === 'year' ? year :
4725
- settings.type === 'month' ? month + ' ' + year :
4726
- (settings.monthFirst ? month + ' ' + day : day + ' ' + month) + ', ' + year;
4727
- },
4728
- time: function (date, settings, forCalendar) {
4729
- if (!date) {
4730
- return '';
4731
- }
4732
- var hour = date.getHours();
4733
- var minute = date.getMinutes();
4734
- var ampm = '';
4735
- if (settings.ampm) {
4736
- ampm = ' ' + (hour < 12 ? settings.text.am : settings.text.pm);
4737
- hour = hour === 0 ? 12 : hour > 12 ? hour - 12 : hour;
4738
- }
4739
- return hour + ':' + (minute < 10 ? '0' : '') + minute + ampm;
4740
- },
4763
+ datetime: 'MMMM D, YYYY h:mm A',
4764
+ date: 'MMMM D, YYYY',
4765
+ time: 'h:mm A',
4766
+ cellTime: 'h:mm A',
4767
+ month: 'MMMM YYYY',
4768
+ year: 'YYYY',
4741
4769
  today: function (settings) {
4742
4770
  return settings.type === 'date' ? settings.text.today : settings.text.now;
4743
4771
  },
@@ -4753,7 +4781,7 @@ $.fn.calendar.settings = {
4753
4781
  if (!text) {
4754
4782
  return null;
4755
4783
  }
4756
- text = String(text).trim();
4784
+ text = String(text).trim().replace(/([.:\/\-])\s+/g,'$1').replace(/\s+([.:\/-])/g,'$1').replace(/\s+/g,' ');
4757
4785
  if (text.length === 0) {
4758
4786
  return null;
4759
4787
  }
@@ -5006,7 +5034,8 @@ $.fn.calendar.settings = {
5006
5034
 
5007
5035
  regExp: {
5008
5036
  dateWords: /[^A-Za-z\u00C0-\u024F]+/g,
5009
- dateNumbers: /[^\d:]+/g
5037
+ dateNumbers: /[^\d:]+/g,
5038
+ token: /d{1,4}|D{1,2}|M{1,4}|YY(?:YY)?|([Hhmsw])\1?|[SAaY]|"[^"]*"|'[^']*'/g
5010
5039
  },
5011
5040
 
5012
5041
  error: {
@@ -5066,7 +5095,7 @@ $.fn.calendar.settings = {
5066
5095
  })(jQuery, window, document);
5067
5096
 
5068
5097
  /*!
5069
- * # Fomantic-UI 2.9.0-beta.29 - Checkbox
5098
+ * # Fomantic-UI 2.9.0-beta.290+9631798 - Checkbox
5070
5099
  * http://github.com/fomantic/Fomantic-UI/
5071
5100
  *
5072
5101
  *
@@ -5306,18 +5335,26 @@ $.fn.checkbox = function(parameters) {
5306
5335
  }
5307
5336
  }
5308
5337
 
5338
+ shortcutPressed = false;
5309
5339
  if(key == keyCode.escape) {
5310
5340
  module.verbose('Escape key pressed blurring field');
5311
5341
  $input.blur();
5312
5342
  shortcutPressed = true;
5313
5343
  }
5314
- else if(!event.ctrlKey && ( key == keyCode.space || (key == keyCode.enter && settings.enableEnterKey)) ) {
5315
- module.verbose('Enter/space key pressed, toggling checkbox');
5316
- module.toggle();
5317
- shortcutPressed = true;
5318
- }
5319
- else {
5320
- shortcutPressed = false;
5344
+ else if(!event.ctrlKey && module.can.change()) {
5345
+ if( key == keyCode.space || (key == keyCode.enter && settings.enableEnterKey) ) {
5346
+ module.verbose('Enter/space key pressed, toggling checkbox');
5347
+ module.toggle();
5348
+ shortcutPressed = true;
5349
+ } else if($module.is('.toggle, .slider') && !module.is.radio()) {
5350
+ if(key == keyCode.left && module.is.checked()) {
5351
+ module.uncheck();
5352
+ shortcutPressed = true;
5353
+ } else if(key == keyCode.right && module.is.unchecked()) {
5354
+ module.check();
5355
+ shortcutPressed = true;
5356
+ }
5357
+ }
5321
5358
  }
5322
5359
  },
5323
5360
  keyup: function(event) {
@@ -5390,7 +5427,6 @@ $.fn.checkbox = function(parameters) {
5390
5427
  settings.onEnable.call(input);
5391
5428
  // preserve legacy callbacks
5392
5429
  settings.onEnabled.call(input);
5393
- module.trigger.change();
5394
5430
  }
5395
5431
  },
5396
5432
 
@@ -5405,7 +5441,6 @@ $.fn.checkbox = function(parameters) {
5405
5441
  settings.onDisable.call(input);
5406
5442
  // preserve legacy callbacks
5407
5443
  settings.onDisabled.call(input);
5408
- module.trigger.change();
5409
5444
  }
5410
5445
  },
5411
5446
 
@@ -5933,7 +5968,7 @@ $.fn.checkbox.settings = {
5933
5968
 
5934
5969
  selector : {
5935
5970
  checkbox : '.ui.checkbox',
5936
- label : 'label, .box',
5971
+ label : 'label',
5937
5972
  input : 'input[type="checkbox"], input[type="radio"]',
5938
5973
  link : 'a[href]'
5939
5974
  }
@@ -5943,7 +5978,7 @@ $.fn.checkbox.settings = {
5943
5978
  })( jQuery, window, document );
5944
5979
 
5945
5980
  /*!
5946
- * # Fomantic-UI 2.9.0-beta.29 - Dimmer
5981
+ * # Fomantic-UI 2.9.0-beta.290+9631798 - Dimmer
5947
5982
  * http://github.com/fomantic/Fomantic-UI/
5948
5983
  *
5949
5984
  *
@@ -6136,11 +6171,14 @@ $.fn.dimmer = function(parameters) {
6136
6171
  ? callback
6137
6172
  : function(){}
6138
6173
  ;
6139
- module.debug('Showing dimmer', $dimmer, settings);
6140
- module.set.variation();
6141
6174
  if( (!module.is.dimmed() || module.is.animating()) && module.is.enabled() ) {
6175
+ if(settings.onShow.call(element) === false) {
6176
+ module.verbose('Show callback returned false cancelling dimmer show');
6177
+ return;
6178
+ }
6179
+ module.debug('Showing dimmer', $dimmer, settings);
6180
+ module.set.variation();
6142
6181
  module.animate.show(callback);
6143
- settings.onShow.call(element);
6144
6182
  settings.onChange.call(element);
6145
6183
  }
6146
6184
  else {
@@ -6154,9 +6192,12 @@ $.fn.dimmer = function(parameters) {
6154
6192
  : function(){}
6155
6193
  ;
6156
6194
  if( module.is.dimmed() || module.is.animating() ) {
6195
+ if(settings.onHide.call(element) === false) {
6196
+ module.verbose('Hide callback returned false cancelling dimmer hide');
6197
+ return;
6198
+ }
6157
6199
  module.debug('Hiding dimmer', $dimmer);
6158
6200
  module.animate.hide(callback);
6159
- settings.onHide.call(element);
6160
6201
  settings.onChange.call(element);
6161
6202
  }
6162
6203
  else {
@@ -6700,7 +6741,7 @@ $.fn.dimmer.settings = {
6700
6741
  })( jQuery, window, document );
6701
6742
 
6702
6743
  /*!
6703
- * # Fomantic-UI 2.9.0-beta.29 - Dropdown
6744
+ * # Fomantic-UI 2.9.0-beta.290+9631798 - Dropdown
6704
6745
  * http://github.com/fomantic/Fomantic-UI/
6705
6746
  *
6706
6747
  *
@@ -6731,11 +6772,6 @@ $.fn.dropdown = function(parameters) {
6731
6772
 
6732
6773
  moduleSelector = $allModules.selector || '',
6733
6774
 
6734
- hasTouch = ('ontouchstart' in document.documentElement),
6735
- clickEvent = hasTouch
6736
- ? 'touchstart'
6737
- : 'click',
6738
-
6739
6775
  time = new Date().getTime(),
6740
6776
  performance = [],
6741
6777
 
@@ -6767,7 +6803,7 @@ $.fn.dropdown = function(parameters) {
6767
6803
  moduleNamespace = 'module-' + namespace,
6768
6804
 
6769
6805
  $module = $(this),
6770
- $context = $(settings.context),
6806
+ $context = [window,document].indexOf(settings.context) < 0 ? $(document).find(settings.context) : $(settings.context),
6771
6807
  $text = $module.find(selector.text),
6772
6808
  $search = $module.find(selector.search),
6773
6809
  $sizer = $module.find(selector.sizer),
@@ -6901,6 +6937,7 @@ $.fn.dropdown = function(parameters) {
6901
6937
  select: function() {
6902
6938
  if(module.has.input() && selectObserver) {
6903
6939
  selectObserver.observe($module[0], {
6940
+ attributes: true,
6904
6941
  childList : true,
6905
6942
  subtree : true
6906
6943
  });
@@ -6925,7 +6962,7 @@ $.fn.dropdown = function(parameters) {
6925
6962
 
6926
6963
  create: {
6927
6964
  id: function() {
6928
- id = (Math.random().toString(16) + '000000000').substr(2, 8);
6965
+ id = (Math.random().toString(16) + '000000000').slice(2, 10);
6929
6966
  elementNamespace = '.' + id;
6930
6967
  module.verbose('Creating unique id for element', id);
6931
6968
  },
@@ -7122,6 +7159,9 @@ $.fn.dropdown = function(parameters) {
7122
7159
  module.debug('Disabling dropdown');
7123
7160
  $module.addClass(className.disabled);
7124
7161
  }
7162
+ if($input.is('[required]')) {
7163
+ settings.forceSelection = true;
7164
+ }
7125
7165
  $input
7126
7166
  .removeAttr('required')
7127
7167
  .removeAttr('class')
@@ -7238,9 +7278,7 @@ $.fn.dropdown = function(parameters) {
7238
7278
  }
7239
7279
  if(settings.onShow.call(element) !== false) {
7240
7280
  module.animate.show(function() {
7241
- if( module.can.click() ) {
7242
- module.bind.intent();
7243
- }
7281
+ module.bind.intent();
7244
7282
  if(module.has.search() && !preventFocus) {
7245
7283
  module.focusSearch();
7246
7284
  }
@@ -7267,8 +7305,17 @@ $.fn.dropdown = function(parameters) {
7267
7305
  }
7268
7306
  callback.call(element);
7269
7307
  });
7308
+ // Hide submenus explicitly. On some browsers (esp. mobile), they will not automatically receive a
7309
+ // mouseleave event
7310
+ var $subMenu = $module.find(selector.menu);
7311
+ if($subMenu.length > 0) {
7312
+ module.verbose('Hiding sub-menu', $subMenu);
7313
+ $subMenu.each(function() {
7314
+ module.animate.hide(false, $(this));
7315
+ });
7316
+ }
7270
7317
  }
7271
- } else if( module.can.click() ) {
7318
+ } else {
7272
7319
  module.unbind.intent();
7273
7320
  }
7274
7321
  iconClicked = false;
@@ -7326,13 +7373,18 @@ $.fn.dropdown = function(parameters) {
7326
7373
  $module
7327
7374
  .on('change' + eventNamespace, selector.input, module.event.change)
7328
7375
  ;
7376
+ if(module.is.multiple() && module.is.searchSelection()) {
7377
+ $module
7378
+ .on('paste' + eventNamespace, selector.search, module.event.paste)
7379
+ ;
7380
+ }
7329
7381
  },
7330
7382
  mouseEvents: function() {
7331
7383
  module.verbose('Binding mouse events');
7332
7384
  if(module.is.multiple()) {
7333
7385
  $module
7334
- .on(clickEvent + eventNamespace, selector.label, module.event.label.click)
7335
- .on(clickEvent + eventNamespace, selector.remove, module.event.remove.click)
7386
+ .on('click' + eventNamespace, selector.label, module.event.label.click)
7387
+ .on('click' + eventNamespace, selector.remove, module.event.remove.click)
7336
7388
  ;
7337
7389
  }
7338
7390
  if( module.is.searchSelection() ) {
@@ -7341,31 +7393,33 @@ $.fn.dropdown = function(parameters) {
7341
7393
  .on('mouseup' + eventNamespace, module.event.mouseup)
7342
7394
  .on('mousedown' + eventNamespace, selector.menu, module.event.menu.mousedown)
7343
7395
  .on('mouseup' + eventNamespace, selector.menu, module.event.menu.mouseup)
7344
- .on(clickEvent + eventNamespace, selector.icon, module.event.icon.click)
7345
- .on(clickEvent + eventNamespace, selector.clearIcon, module.event.clearIcon.click)
7396
+ .on('click' + eventNamespace, selector.icon, module.event.icon.click)
7397
+ .on('click' + eventNamespace, selector.clearIcon, module.event.clearIcon.click)
7346
7398
  .on('focus' + eventNamespace, selector.search, module.event.search.focus)
7347
- .on(clickEvent + eventNamespace, selector.search, module.event.search.focus)
7399
+ .on('click' + eventNamespace, selector.search, module.event.search.focus)
7348
7400
  .on('blur' + eventNamespace, selector.search, module.event.search.blur)
7349
- .on(clickEvent + eventNamespace, selector.text, module.event.text.focus)
7401
+ .on('click' + eventNamespace, selector.text, module.event.text.focus)
7350
7402
  ;
7351
7403
  if(module.is.multiple()) {
7352
7404
  $module
7353
- .on(clickEvent + eventNamespace, module.event.click)
7354
- .on(clickEvent + eventNamespace, module.event.search.focus)
7405
+ .on('click' + eventNamespace, module.event.click)
7406
+ .on('click' + eventNamespace, module.event.search.focus)
7355
7407
  ;
7356
7408
  }
7357
7409
  }
7358
7410
  else {
7359
7411
  if(settings.on == 'click') {
7360
7412
  $module
7361
- .on(clickEvent + eventNamespace, selector.icon, module.event.icon.click)
7362
- .on(clickEvent + eventNamespace, module.event.test.toggle)
7413
+ .on('click' + eventNamespace, selector.icon, module.event.icon.click)
7414
+ .on('click' + eventNamespace, module.event.test.toggle)
7363
7415
  ;
7364
7416
  }
7365
7417
  else if(settings.on == 'hover') {
7366
7418
  $module
7367
7419
  .on('mouseenter' + eventNamespace, module.delay.show)
7368
7420
  .on('mouseleave' + eventNamespace, module.delay.hide)
7421
+ .on('touchstart' + eventNamespace, module.event.test.toggle)
7422
+ .on('touchstart' + eventNamespace, selector.icon, module.event.icon.click)
7369
7423
  ;
7370
7424
  }
7371
7425
  else {
@@ -7377,7 +7431,7 @@ $.fn.dropdown = function(parameters) {
7377
7431
  .on('mousedown' + eventNamespace, module.event.mousedown)
7378
7432
  .on('mouseup' + eventNamespace, module.event.mouseup)
7379
7433
  .on('focus' + eventNamespace, module.event.focus)
7380
- .on(clickEvent + eventNamespace, selector.clearIcon, module.event.clearIcon.click)
7434
+ .on('click' + eventNamespace, selector.clearIcon, module.event.clearIcon.click)
7381
7435
  ;
7382
7436
  if(module.has.menuSearch() ) {
7383
7437
  $module
@@ -7391,21 +7445,16 @@ $.fn.dropdown = function(parameters) {
7391
7445
  }
7392
7446
  }
7393
7447
  $menu
7394
- .on((hasTouch ? 'touchstart' : 'mouseenter') + eventNamespace, selector.item, module.event.item.mouseenter)
7448
+ .on('mouseenter' + eventNamespace, selector.item, module.event.item.mouseenter)
7449
+ .on('touchstart' + eventNamespace, selector.item, module.event.item.mouseenter)
7395
7450
  .on('mouseleave' + eventNamespace, selector.item, module.event.item.mouseleave)
7396
7451
  .on('click' + eventNamespace, selector.item, module.event.item.click)
7397
7452
  ;
7398
7453
  },
7399
7454
  intent: function() {
7400
7455
  module.verbose('Binding hide intent event to document');
7401
- if(hasTouch) {
7402
- $document
7403
- .on('touchstart' + elementNamespace, module.event.test.touch)
7404
- .on('touchmove' + elementNamespace, module.event.test.touch)
7405
- ;
7406
- }
7407
7456
  $document
7408
- .on(clickEvent + elementNamespace, module.event.test.hide)
7457
+ .on('click' + elementNamespace, module.event.test.hide)
7409
7458
  ;
7410
7459
  }
7411
7460
  },
@@ -7413,14 +7462,8 @@ $.fn.dropdown = function(parameters) {
7413
7462
  unbind: {
7414
7463
  intent: function() {
7415
7464
  module.verbose('Removing hide intent event from document');
7416
- if(hasTouch) {
7417
- $document
7418
- .off('touchstart' + elementNamespace)
7419
- .off('touchmove' + elementNamespace)
7420
- ;
7421
- }
7422
7465
  $document
7423
- .off(clickEvent + elementNamespace)
7466
+ .off('click' + elementNamespace)
7424
7467
  ;
7425
7468
  }
7426
7469
  },
@@ -7545,7 +7588,7 @@ $.fn.dropdown = function(parameters) {
7545
7588
  var value = module.is.multiple() ? module.get.values() : module.get.value();
7546
7589
  if (value !== '') {
7547
7590
  module.verbose('Value(s) present after click icon, select value(s) in items');
7548
- module.set.selected(value, null, null, true);
7591
+ module.set.selected(value, null, true, true);
7549
7592
  }
7550
7593
  }
7551
7594
  iconClicked = false;
@@ -7745,7 +7788,7 @@ $.fn.dropdown = function(parameters) {
7745
7788
  menuConfig[fields.values] = values;
7746
7789
  module.setup.menu(menuConfig);
7747
7790
  $.each(values, function(index, item) {
7748
- if(item.selected == true) {
7791
+ if(item.selected === true) {
7749
7792
  module.debug('Setting initial selection to', item[fields.value]);
7750
7793
  module.set.selected(item[fields.value]);
7751
7794
  if(!module.is.multiple()) {
@@ -7766,7 +7809,7 @@ $.fn.dropdown = function(parameters) {
7766
7809
  settings.preserveHTML
7767
7810
  )
7768
7811
  ;
7769
- $input.append('<option value="' + value + '">' + name + '</option>');
7812
+ $input.append('<option value="' + value + '"' + (item.selected === true ? ' selected' : '') + '>' + name + '</option>');
7770
7813
  });
7771
7814
  module.observe.select();
7772
7815
  }
@@ -7774,6 +7817,15 @@ $.fn.dropdown = function(parameters) {
7774
7817
  },
7775
7818
 
7776
7819
  event: {
7820
+ paste: function(event) {
7821
+ var pasteValue = (event.originalEvent.clipboardData || window.clipboardData).getData('text'),
7822
+ tokens = pasteValue.split(settings.delimiter)
7823
+ ;
7824
+ tokens.forEach(function(value){
7825
+ module.set.selected(module.escape.htmlEntities(value.trim()), null, true, true);
7826
+ });
7827
+ event.preventDefault();
7828
+ },
7777
7829
  change: function() {
7778
7830
  if(!internalChange) {
7779
7831
  module.debug('Input changed, updating selection');
@@ -7950,23 +8002,12 @@ $.fn.dropdown = function(parameters) {
7950
8002
  if (!module.is.multiple() || (module.is.multiple() && !module.is.active())) {
7951
8003
  focused = true;
7952
8004
  }
7953
- if( module.determine.eventOnElement(event, toggleBehavior) ) {
8005
+ if( module.determine.eventOnElement(event, toggleBehavior) && event.type !== 'touchstart') {
8006
+ // do not preventDefault of touchstart; so emulated mouseenter is triggered on first touch and not later
8007
+ // (when selecting an item). The double-showing of the dropdown through both events does not hurt.
7954
8008
  event.preventDefault();
7955
8009
  }
7956
8010
  },
7957
- touch: function(event) {
7958
- module.determine.eventOnElement(event, function() {
7959
- if(event.type == 'touchstart') {
7960
- module.timer = setTimeout(function() {
7961
- module.hide();
7962
- }, settings.delay.touch);
7963
- }
7964
- else if(event.type == 'touchmove') {
7965
- clearTimeout(module.timer);
7966
- }
7967
- });
7968
- event.stopPropagation();
7969
- },
7970
8011
  hide: function(event) {
7971
8012
  if(module.determine.eventInModule(event, module.hide)){
7972
8013
  if(element.id && $(event.target).attr('for') === element.id){
@@ -7986,8 +8027,8 @@ $.fn.dropdown = function(parameters) {
7986
8027
  },
7987
8028
  select: {
7988
8029
  mutation: function(mutations) {
7989
- module.debug('<select> modified, recreating menu');
7990
8030
  if(module.is.selectMutation(mutations)) {
8031
+ module.debug('<select> modified, recreating menu');
7991
8032
  module.disconnect.selectObserver();
7992
8033
  module.refresh();
7993
8034
  module.setup.select();
@@ -8050,13 +8091,15 @@ $.fn.dropdown = function(parameters) {
8050
8091
  },
8051
8092
  mouseleave: function(event) {
8052
8093
  var
8053
- $subMenu = $(this).children(selector.menu)
8094
+ $subMenu = $(this).find(selector.menu)
8054
8095
  ;
8055
8096
  if($subMenu.length > 0) {
8056
8097
  clearTimeout(module.itemTimer);
8057
8098
  module.itemTimer = setTimeout(function() {
8058
8099
  module.verbose('Hiding sub-menu', $subMenu);
8059
- module.animate.hide(false, $subMenu);
8100
+ $subMenu.each(function() {
8101
+ module.animate.hide(false, $(this));
8102
+ });
8060
8103
  }, settings.delay.hide);
8061
8104
  }
8062
8105
  },
@@ -8082,7 +8125,7 @@ $.fn.dropdown = function(parameters) {
8082
8125
  module.remove.userAddition();
8083
8126
  }
8084
8127
  module.remove.searchTerm();
8085
- if(!module.is.focusedOnSearch() && !(skipRefocus == true)) {
8128
+ if(!module.is.focusedOnSearch() && skipRefocus !== true) {
8086
8129
  module.focusSearch(true);
8087
8130
  }
8088
8131
  }
@@ -8214,7 +8257,7 @@ $.fn.dropdown = function(parameters) {
8214
8257
  keydown: function(event) {
8215
8258
  var
8216
8259
  pressedKey = event.which,
8217
- isShortcutKey = module.is.inObject(pressedKey, keys)
8260
+ isShortcutKey = module.is.inObject(pressedKey, keys) || event.key === settings.delimiter
8218
8261
  ;
8219
8262
  if(isShortcutKey) {
8220
8263
  var
@@ -8232,7 +8275,7 @@ $.fn.dropdown = function(parameters) {
8232
8275
  hasSubMenu = ($subMenu.length> 0),
8233
8276
  hasSelectedItem = ($selectedItem.length > 0),
8234
8277
  selectedIsSelectable = ($selectedItem.not(selector.unselectable).length > 0),
8235
- delimiterPressed = (pressedKey == keys.delimiter && settings.allowAdditions && module.is.multiple()),
8278
+ delimiterPressed = (event.key === settings.delimiter && module.is.multiple()),
8236
8279
  isAdditionWithoutMenu = (settings.allowAdditions && settings.hideAdditions && (pressedKey == keys.enter || delimiterPressed) && selectedIsSelectable),
8237
8280
  $nextItem,
8238
8281
  isSubMenuItem,
@@ -8330,7 +8373,7 @@ $.fn.dropdown = function(parameters) {
8330
8373
  .addClass(className.selected)
8331
8374
  ;
8332
8375
  module.set.scrollPosition($nextItem);
8333
- if(settings.selectOnKeydown && module.is.single()) {
8376
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
8334
8377
  module.set.selectedItem($nextItem);
8335
8378
  }
8336
8379
  }
@@ -8357,7 +8400,7 @@ $.fn.dropdown = function(parameters) {
8357
8400
  .addClass(className.selected)
8358
8401
  ;
8359
8402
  module.set.scrollPosition($nextItem);
8360
- if(settings.selectOnKeydown && module.is.single()) {
8403
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
8361
8404
  module.set.selectedItem($nextItem);
8362
8405
  }
8363
8406
  }
@@ -8488,7 +8531,7 @@ $.fn.dropdown = function(parameters) {
8488
8531
  ;
8489
8532
  if( module.can.activate( $(element) ) ) {
8490
8533
  module.set.selected(value, $(element));
8491
- if(!module.is.multiple()) {
8534
+ if(!module.is.multiple() && !(!settings.collapseOnActionable && $(element).hasClass(className.actionable))) {
8492
8535
  module.hideAndClear();
8493
8536
  }
8494
8537
  }
@@ -8501,7 +8544,7 @@ $.fn.dropdown = function(parameters) {
8501
8544
  ;
8502
8545
  if( module.can.activate( $(element) ) ) {
8503
8546
  module.set.value(value, text, $(element));
8504
- if(!module.is.multiple()) {
8547
+ if(!module.is.multiple() && !(!settings.collapseOnActionable && $(element).hasClass(className.actionable))) {
8505
8548
  module.hideAndClear();
8506
8549
  }
8507
8550
  }
@@ -8552,7 +8595,7 @@ $.fn.dropdown = function(parameters) {
8552
8595
  ;
8553
8596
  $sizer.text(value);
8554
8597
  // prevent rounding issues
8555
- return Math.ceil( $sizer.width() + 1);
8598
+ return Math.ceil( $sizer.width() + (module.is.edge() ? 3 : 1));
8556
8599
  },
8557
8600
  selectionCount: function() {
8558
8601
  var
@@ -9021,7 +9064,7 @@ $.fn.dropdown = function(parameters) {
9021
9064
  module.error(error.noStorage);
9022
9065
  return;
9023
9066
  }
9024
- name = sessionStorage.getItem(value);
9067
+ name = sessionStorage.getItem(value + elementNamespace);
9025
9068
  return (name !== undefined)
9026
9069
  ? name
9027
9070
  : false
@@ -9065,7 +9108,7 @@ $.fn.dropdown = function(parameters) {
9065
9108
  return;
9066
9109
  }
9067
9110
  module.verbose('Saving remote data to session storage', value, name);
9068
- sessionStorage.setItem(value, name);
9111
+ sessionStorage.setItem(value + elementNamespace, name);
9069
9112
  }
9070
9113
  },
9071
9114
 
@@ -9125,7 +9168,7 @@ $.fn.dropdown = function(parameters) {
9125
9168
  $nextSelectedItem
9126
9169
  .addClass(className.selected)
9127
9170
  ;
9128
- if(settings.selectOnKeydown && module.is.single()) {
9171
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
9129
9172
  module.set.selectedItem($nextSelectedItem);
9130
9173
  }
9131
9174
  $menu
@@ -9211,7 +9254,7 @@ $.fn.dropdown = function(parameters) {
9211
9254
  var
9212
9255
  length = module.get.query().length
9213
9256
  ;
9214
- $search.val( text.substr(0, length));
9257
+ $search.val( text.slice(0, length));
9215
9258
  },
9216
9259
  scrollPosition: function($item, forceScroll) {
9217
9260
  var
@@ -9328,13 +9371,13 @@ $.fn.dropdown = function(parameters) {
9328
9371
  module.set.scrollPosition($nextValue);
9329
9372
  $selectedItem.removeClass(className.selected);
9330
9373
  $nextValue.addClass(className.selected);
9331
- if(settings.selectOnKeydown && module.is.single()) {
9374
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
9332
9375
  module.set.selectedItem($nextValue);
9333
9376
  }
9334
9377
  }
9335
9378
  },
9336
9379
  direction: function($menu) {
9337
- if(settings.direction == 'auto') {
9380
+ if(settings.direction === 'auto') {
9338
9381
  // reset position, remove upward if it's base menu
9339
9382
  if (!$menu) {
9340
9383
  module.remove.upward();
@@ -9353,7 +9396,7 @@ $.fn.dropdown = function(parameters) {
9353
9396
  module.set.leftward($menu);
9354
9397
  }
9355
9398
  }
9356
- else if(settings.direction == 'upward') {
9399
+ else if(settings.direction === 'upward') {
9357
9400
  module.set.upward($menu);
9358
9401
  }
9359
9402
  },
@@ -9366,6 +9409,11 @@ $.fn.dropdown = function(parameters) {
9366
9409
  $element.addClass(className.leftward);
9367
9410
  },
9368
9411
  value: function(value, text, $selected, preventChangeTrigger) {
9412
+ if(typeof text === 'boolean') {
9413
+ preventChangeTrigger = text;
9414
+ $selected = undefined;
9415
+ text = undefined;
9416
+ }
9369
9417
  if(value !== undefined && value !== '' && !(Array.isArray(value) && value.length === 0)) {
9370
9418
  $input.removeClass(className.noselection);
9371
9419
  } else {
@@ -9429,12 +9477,21 @@ $.fn.dropdown = function(parameters) {
9429
9477
  visible: function() {
9430
9478
  $module.addClass(className.visible);
9431
9479
  },
9432
- exactly: function(value, $selectedItem) {
9480
+ exactly: function(value, $selectedItem, preventChangeTrigger) {
9481
+ if(typeof $selectedItem === 'boolean') {
9482
+ preventChangeTrigger = $selectedItem;
9483
+ $selectedItem = undefined;
9484
+ }
9433
9485
  module.debug('Setting selected to exact values');
9434
9486
  module.clear();
9435
- module.set.selected(value, $selectedItem);
9487
+ module.set.selected(value, $selectedItem, preventChangeTrigger);
9436
9488
  },
9437
9489
  selected: function(value, $selectedItem, preventChangeTrigger, keepSearchTerm) {
9490
+ if(typeof $selectedItem === 'boolean') {
9491
+ keepSearchTerm = preventChangeTrigger;
9492
+ preventChangeTrigger = $selectedItem;
9493
+ $selectedItem = undefined;
9494
+ }
9438
9495
  var
9439
9496
  isMultiple = module.is.multiple()
9440
9497
  ;
@@ -9466,23 +9523,30 @@ $.fn.dropdown = function(parameters) {
9466
9523
 
9467
9524
  isFiltered = $selected.hasClass(className.filtered),
9468
9525
  isActive = $selected.hasClass(className.active),
9526
+ isActionable = $selected.hasClass(className.actionable),
9469
9527
  isUserValue = $selected.hasClass(className.addition),
9470
- shouldAnimate = (isMultiple && $selectedItem.length == 1)
9528
+ shouldAnimate = (isMultiple && $selectedItem && $selectedItem.length === 1)
9471
9529
  ;
9472
- if(isMultiple) {
9530
+ if(isActionable){
9531
+ if((!isMultiple || (!isActive || isUserValue)) && settings.apiSettings && settings.saveRemoteData) {
9532
+ module.save.remoteData(selectedText, selectedValue);
9533
+ }
9534
+ settings.onActionable.call(element, selectedValue, selectedText, $selected);
9535
+ }
9536
+ else if(isMultiple) {
9473
9537
  if(!isActive || isUserValue) {
9474
9538
  if(settings.apiSettings && settings.saveRemoteData) {
9475
9539
  module.save.remoteData(selectedText, selectedValue);
9476
9540
  }
9477
9541
  if(settings.useLabels) {
9542
+ module.add.value(selectedValue, selectedText, $selected, preventChangeTrigger);
9478
9543
  module.add.label(selectedValue, selectedText, shouldAnimate);
9479
- module.add.value(selectedValue, selectedText, $selected);
9480
9544
  module.set.activeItem($selected);
9481
9545
  module.filterActive();
9482
9546
  module.select.nextAvailable($selectedItem);
9483
9547
  }
9484
9548
  else {
9485
- module.add.value(selectedValue, selectedText, $selected);
9549
+ module.add.value(selectedValue, selectedText, $selected, preventChangeTrigger);
9486
9550
  module.set.text(module.add.variables(message.count));
9487
9551
  module.set.activeItem($selected);
9488
9552
  }
@@ -9496,7 +9560,7 @@ $.fn.dropdown = function(parameters) {
9496
9560
  if(settings.apiSettings && settings.saveRemoteData) {
9497
9561
  module.save.remoteData(selectedText, selectedValue);
9498
9562
  }
9499
- if (!keepSearchTerm) {
9563
+ if (!keepSearchTerm && !$selected.hasClass(className.actionable)) {
9500
9564
  module.set.text(selectedText);
9501
9565
  }
9502
9566
  module.set.value(selectedValue, selectedText, $selected, preventChangeTrigger);
@@ -9595,7 +9659,7 @@ $.fn.dropdown = function(parameters) {
9595
9659
  $('<option/>')
9596
9660
  .prop('value', escapedValue)
9597
9661
  .addClass(className.addition)
9598
- .html(value)
9662
+ .text(value)
9599
9663
  .appendTo($input)
9600
9664
  ;
9601
9665
  module.verbose('Adding user addition as an <option>', value);
@@ -9671,7 +9735,12 @@ $.fn.dropdown = function(parameters) {
9671
9735
  }
9672
9736
  return message;
9673
9737
  },
9674
- value: function(addedValue, addedText, $selectedItem) {
9738
+ value: function(addedValue, addedText, $selectedItem, preventChangeTrigger) {
9739
+ if(typeof addedText === 'boolean') {
9740
+ preventChangeTrigger = addedText;
9741
+ $selectedItem = undefined;
9742
+ addedText = undefined;
9743
+ }
9675
9744
  var
9676
9745
  currentValue = module.get.values(true),
9677
9746
  newValue
@@ -9686,7 +9755,7 @@ $.fn.dropdown = function(parameters) {
9686
9755
  }
9687
9756
  // extend current array
9688
9757
  if(Array.isArray(currentValue)) {
9689
- newValue = currentValue.concat([addedValue]);
9758
+ newValue = $selectedItem && $selectedItem.hasClass(className.actionable) ? currentValue : currentValue.concat([addedValue]);
9690
9759
  newValue = module.get.uniqueArray(newValue);
9691
9760
  }
9692
9761
  else {
@@ -9710,7 +9779,7 @@ $.fn.dropdown = function(parameters) {
9710
9779
  else {
9711
9780
  settings.onAdd.call(element, addedValue, addedText, $selectedItem);
9712
9781
  }
9713
- module.set.value(newValue, addedText, $selectedItem);
9782
+ module.set.value(newValue, addedText, $selectedItem, preventChangeTrigger);
9714
9783
  module.check.maxSelections();
9715
9784
  },
9716
9785
  },
@@ -9770,18 +9839,10 @@ $.fn.dropdown = function(parameters) {
9770
9839
  return;
9771
9840
  }
9772
9841
  // temporarily disconnect observer
9773
- if(selectObserver) {
9774
- selectObserver.disconnect();
9775
- module.verbose('Temporarily disconnecting mutation observer');
9776
- }
9842
+ module.disconnect.selectObserver();
9777
9843
  $option.remove();
9778
9844
  module.verbose('Removing user addition as an <option>', escapedValue);
9779
- if(selectObserver) {
9780
- selectObserver.observe($input[0], {
9781
- childList : true,
9782
- subtree : true
9783
- });
9784
- }
9845
+ module.observe.select();
9785
9846
  },
9786
9847
  message: function() {
9787
9848
  $menu.children(selector.message).remove();
@@ -10080,8 +10141,11 @@ $.fn.dropdown = function(parameters) {
10080
10141
  bubbledIconClick: function(event) {
10081
10142
  return $(event.target).closest($icon).length > 0;
10082
10143
  },
10144
+ edge: function() {
10145
+ return !!window.chrome && !!window.StyleMedia;
10146
+ },
10083
10147
  chrome: function() {
10084
- return !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);
10148
+ return !!window.chrome && !window.StyleMedia;
10085
10149
  },
10086
10150
  alreadySetup: function() {
10087
10151
  return ($module.is('select') && $module.parent(selector.dropdown).data(moduleNamespace) !== undefined && $module.prev().length === 0);
@@ -10146,7 +10210,7 @@ $.fn.dropdown = function(parameters) {
10146
10210
  selectChanged = false
10147
10211
  ;
10148
10212
  $.each(mutations, function(index, mutation) {
10149
- if($(mutation.target).is('select') || $(mutation.addedNodes).is('select')) {
10213
+ if($(mutation.target).is('select, option, optgroup') || $(mutation.addedNodes).is('select')) {
10150
10214
  selectChanged = true;
10151
10215
  return false;
10152
10216
  }
@@ -10288,9 +10352,6 @@ $.fn.dropdown = function(parameters) {
10288
10352
  $currentMenu.removeClass(className.loading);
10289
10353
  return canOpenRightward;
10290
10354
  },
10291
- click: function() {
10292
- return (hasTouch || settings.on == 'click');
10293
- },
10294
10355
  extendSelect: function() {
10295
10356
  return settings.allowAdditions || settings.apiSettings;
10296
10357
  },
@@ -10360,9 +10421,7 @@ $.fn.dropdown = function(parameters) {
10360
10421
  start = ($subMenu)
10361
10422
  ? function() {}
10362
10423
  : function() {
10363
- if( module.can.click() ) {
10364
- module.unbind.intent();
10365
- }
10424
+ module.unbind.intent();
10366
10425
  module.remove.active();
10367
10426
  },
10368
10427
  transition = settings.transition.hideMethod || module.get.transition($subMenu)
@@ -10691,7 +10750,7 @@ $.fn.dropdown.settings = {
10691
10750
  keepOnScreen : true, // Whether dropdown should check whether it is on screen before showing
10692
10751
 
10693
10752
  match : 'both', // what to match against with search selection (both, text, or label)
10694
- fullTextSearch : false, // search anywhere in value (set to 'exact' to require exact matches)
10753
+ fullTextSearch : 'exact', // search anywhere in value (set to 'exact' to require exact matches)
10695
10754
  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...)
10696
10755
  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)
10697
10756
 
@@ -10699,7 +10758,7 @@ $.fn.dropdown.settings = {
10699
10758
  preserveHTML : true, // preserve html when selecting value
10700
10759
  sortSelect : false, // sort selection on init
10701
10760
 
10702
- forceSelection : true, // force a choice on blur with search selection
10761
+ forceSelection : false, // force a choice on blur with search selection
10703
10762
 
10704
10763
  allowAdditions : false, // whether multiple select should allow user added values
10705
10764
  ignoreCase : false, // whether to consider case sensitivity when creating labels
@@ -10710,7 +10769,7 @@ $.fn.dropdown.settings = {
10710
10769
  useLabels : true, // whether multiple select should filter currently active selections from choices
10711
10770
  delimiter : ',', // when multiselect uses normal <input> the values will be delimited with this character
10712
10771
 
10713
- showOnFocus : true, // show menu on focus
10772
+ showOnFocus : false, // show menu on focus
10714
10773
  allowReselection : false, // whether current value should trigger callbacks when reselected
10715
10774
  allowTab : true, // add tabindex to element
10716
10775
  allowCategorySelection : false, // allow elements with sub-menus to be selected
@@ -10725,6 +10784,8 @@ $.fn.dropdown.settings = {
10725
10784
 
10726
10785
  headerDivider : true, // whether option headers should have an additional divider line underneath when converted from <select> <optgroup>
10727
10786
 
10787
+ collapseOnActionable : true, // whether the dropdown should collapse upon selection of an actionable item
10788
+
10728
10789
  // label settings on multi-select
10729
10790
  label: {
10730
10791
  transition : 'scale',
@@ -10737,13 +10798,13 @@ $.fn.dropdown.settings = {
10737
10798
  hide : 300,
10738
10799
  show : 200,
10739
10800
  search : 20,
10740
- touch : 50
10741
10801
  },
10742
10802
 
10743
10803
  /* Callbacks */
10744
10804
  onChange : function(value, text, $selected){},
10745
10805
  onAdd : function(value, text, $selected){},
10746
10806
  onRemove : function(value, text, $selected){},
10807
+ onActionable : function(value, text, $selected){},
10747
10808
  onSearch : function(searchTerm){},
10748
10809
 
10749
10810
  onLabelSelect : function($selectedLabels){},
@@ -10806,12 +10867,12 @@ $.fn.dropdown.settings = {
10806
10867
  icon : 'icon', // optional icon name
10807
10868
  iconClass : 'iconClass', // optional individual class for icon (for example to use flag instead)
10808
10869
  class : 'class', // optional individual class for item/header
10809
- divider : 'divider' // optional divider append for group headers
10870
+ divider : 'divider', // optional divider append for group headers
10871
+ actionable : 'actionable' // optional actionable item
10810
10872
  },
10811
10873
 
10812
10874
  keys : {
10813
10875
  backspace : 8,
10814
- delimiter : 188, // comma
10815
10876
  deleteKey : 46,
10816
10877
  enter : 13,
10817
10878
  escape : 27,
@@ -10878,7 +10939,8 @@ $.fn.dropdown.settings = {
10878
10939
  header : 'header',
10879
10940
  divider : 'divider',
10880
10941
  groupIcon : '',
10881
- unfilterable : 'unfilterable'
10942
+ unfilterable : 'unfilterable',
10943
+ actionable : 'actionable'
10882
10944
  }
10883
10945
 
10884
10946
  };
@@ -10953,6 +11015,9 @@ $.fn.dropdown.settings.templates = {
10953
11015
  maybeText = (option[fields.text])
10954
11016
  ? ' data-text="' + deQuote(option[fields.text],true) + '"'
10955
11017
  : '',
11018
+ maybeActionable = (option[fields.actionable])
11019
+ ? className.actionable+' '
11020
+ : '',
10956
11021
  maybeDisabled = (option[fields.disabled])
10957
11022
  ? className.disabled+' '
10958
11023
  : '',
@@ -10961,7 +11026,7 @@ $.fn.dropdown.settings.templates = {
10961
11026
  : '',
10962
11027
  hasDescription = (escape(option[fields.description] || '', preserveHTML) != '')
10963
11028
  ;
10964
- html += '<div class="'+ maybeDisabled + maybeDescriptionVertical + (option[fields.class] ? deQuote(option[fields.class]) : className.item)+'" data-value="' + deQuote(option[fields.value],true) + '"' + maybeText + '>';
11029
+ html += '<div class="'+ maybeActionable + maybeDisabled + maybeDescriptionVertical + (option[fields.class] ? deQuote(option[fields.class]) : className.item)+'" data-value="' + deQuote(option[fields.value],true) + '"' + maybeText + '>';
10965
11030
  if (isMenu) {
10966
11031
  html += '<i class="'+ (itemType.indexOf('left') !== -1 ? 'left' : '') + ' dropdown icon"></i>';
10967
11032
  }
@@ -11031,7 +11096,7 @@ $.fn.dropdown.settings.templates = {
11031
11096
  })( jQuery, window, document );
11032
11097
 
11033
11098
  /*!
11034
- * # Fomantic-UI 2.9.0-beta.29 - Embed
11099
+ * # Fomantic-UI 2.9.0-beta.290+9631798 - Embed
11035
11100
  * http://github.com/fomantic/Fomantic-UI/
11036
11101
  *
11037
11102
  *
@@ -11741,7 +11806,7 @@ $.fn.embed.settings = {
11741
11806
  })( jQuery, window, document );
11742
11807
 
11743
11808
  /*!
11744
- * # Fomantic-UI 2.9.0-beta.29 - Modal
11809
+ * # Fomantic-UI 2.9.0-beta.290+9631798 - Modal
11745
11810
  * http://github.com/fomantic/Fomantic-UI/
11746
11811
  *
11747
11812
  *
@@ -11807,8 +11872,9 @@ $.fn.modal = function(parameters) {
11807
11872
  moduleNamespace = 'module-' + namespace,
11808
11873
 
11809
11874
  $module = $(this),
11810
- $context = $(settings.context),
11811
- $close = $module.find(selector.close),
11875
+ $context = [window,document].indexOf(settings.context) < 0 ? $(document).find(settings.context) : $(settings.context),
11876
+ $closeIcon = $module.find(selector.closeIcon),
11877
+ $inputs,
11812
11878
 
11813
11879
  $allModals,
11814
11880
  $otherModals,
@@ -11834,6 +11900,7 @@ $.fn.modal = function(parameters) {
11834
11900
  module = {
11835
11901
 
11836
11902
  initialize: function() {
11903
+ module.create.id();
11837
11904
  if(!$module.hasClass('modal')) {
11838
11905
  module.create.modal();
11839
11906
  if(!$.isFunction(settings.onHidden)) {
@@ -11858,15 +11925,17 @@ $.fn.modal = function(parameters) {
11858
11925
  $actions.empty();
11859
11926
  }
11860
11927
  settings.actions.forEach(function (el) {
11861
- var icon = el[fields.icon] ? '<i class="' + module.helpers.deQuote(el[fields.icon]) + ' icon"></i>' : '',
11928
+ var icon = el[fields.icon] ? '<i '+(el[fields.text] ? 'aria-hidden="true"' : '')+' class="' + module.helpers.deQuote(el[fields.icon]) + ' icon"></i>' : '',
11862
11929
  text = module.helpers.escape(el[fields.text] || '', settings.preserveHTML),
11863
11930
  cls = module.helpers.deQuote(el[fields.class] || ''),
11864
11931
  click = el[fields.click] && $.isFunction(el[fields.click]) ? el[fields.click] : function () {};
11865
11932
  $actions.append($('<button/>', {
11866
11933
  html: icon + text,
11934
+ 'aria-label': (el[fields.text] || el[fields.icon] || '').replace(/<[^>]+(>|$)/g,''),
11867
11935
  class: className.button + ' ' + cls,
11868
11936
  click: function () {
11869
- if (click.call(element, $module) === false) {
11937
+ var button = $(this);
11938
+ if (button.is(selector.approve) || button.is(selector.deny) || click.call(element, $module) === false) {
11870
11939
  return;
11871
11940
  }
11872
11941
  module.hide();
@@ -11877,7 +11946,6 @@ $.fn.modal = function(parameters) {
11877
11946
  module.cache = {};
11878
11947
  module.verbose('Initializing dimmer', $context);
11879
11948
 
11880
- module.create.id();
11881
11949
  module.create.dimmer();
11882
11950
 
11883
11951
  if ( settings.allowMultiple ) {
@@ -11887,11 +11955,9 @@ $.fn.modal = function(parameters) {
11887
11955
  $module.addClass('top aligned');
11888
11956
  }
11889
11957
  module.refreshModals();
11890
-
11958
+ module.refreshInputs();
11891
11959
  module.bind.events();
11892
- if(settings.observeChanges) {
11893
- module.observeChanges();
11894
- }
11960
+ module.observeChanges();
11895
11961
  module.instantiate();
11896
11962
  if(settings.autoShow){
11897
11963
  module.show();
@@ -11908,16 +11974,20 @@ $.fn.modal = function(parameters) {
11908
11974
 
11909
11975
  create: {
11910
11976
  modal: function() {
11911
- $module = $('<div/>', {class: className.modal});
11977
+ $module = $('<div/>', {class: className.modal, role: 'dialog', 'aria-modal': true});
11912
11978
  if (settings.closeIcon) {
11913
- $close = $('<i/>', {class: className.close})
11914
- $module.append($close);
11979
+ $closeIcon = $('<i/>', {class: className.close, role: 'button', tabindex: 0, 'aria-label': settings.text.close})
11980
+ $module.append($closeIcon);
11915
11981
  }
11916
11982
  if (settings.title !== '') {
11917
- $('<div/>', {class: className.title}).appendTo($module);
11983
+ var titleId = '_' + module.get.id() + 'title';
11984
+ $module.attr('aria-labelledby', titleId);
11985
+ $('<div/>', {class: className.title, id: titleId}).appendTo($module);
11918
11986
  }
11919
11987
  if (settings.content !== '') {
11920
- $('<div/>', {class: className.content}).appendTo($module);
11988
+ var descId = '_' + module.get.id() + 'desc';
11989
+ $module.attr('aria-describedby', descId);
11990
+ $('<div/>', {class: className.content, id: descId}).appendTo($module);
11921
11991
  }
11922
11992
  if (module.has.configActions()) {
11923
11993
  $('<div/>', {class: className.actions}).appendTo($module);
@@ -11948,13 +12018,13 @@ $.fn.modal = function(parameters) {
11948
12018
  $dimmer = $dimmable.dimmer('get dimmer');
11949
12019
  },
11950
12020
  id: function() {
11951
- id = (Math.random().toString(16) + '000000000').substr(2, 8);
12021
+ id = (Math.random().toString(16) + '000000000').slice(2, 10);
11952
12022
  elementEventNamespace = '.' + id;
11953
12023
  module.verbose('Creating unique id for element', id);
11954
12024
  },
11955
12025
  innerDimmer: function() {
11956
- if ( $module.find(selector.dimmer).length == 0 ) {
11957
- $module.prepend('<div class="ui inverted dimmer"></div>');
12026
+ if ( $module.find(selector.dimmer).length === 0 ) {
12027
+ $('<div/>', {class: className.innerDimmer}).prependTo($module);
11958
12028
  }
11959
12029
  }
11960
12030
  },
@@ -11970,15 +12040,21 @@ $.fn.modal = function(parameters) {
11970
12040
  ;
11971
12041
  $window.off(elementEventNamespace);
11972
12042
  $dimmer.off(elementEventNamespace);
11973
- $close.off(eventNamespace);
12043
+ $closeIcon.off(elementEventNamespace);
12044
+ if($inputs) {
12045
+ $inputs.off(elementEventNamespace);
12046
+ }
11974
12047
  $context.dimmer('destroy');
11975
12048
  },
11976
12049
 
11977
12050
  observeChanges: function() {
11978
12051
  if('MutationObserver' in window) {
11979
12052
  observer = new MutationObserver(function(mutations) {
11980
- module.debug('DOM tree modified, refreshing');
11981
- module.refresh();
12053
+ if(settings.observeChanges) {
12054
+ module.debug('DOM tree modified, refreshing');
12055
+ module.refresh();
12056
+ }
12057
+ module.refreshInputs();
11982
12058
  });
11983
12059
  observer.observe(element, {
11984
12060
  childList : true,
@@ -12003,6 +12079,23 @@ $.fn.modal = function(parameters) {
12003
12079
  $allModals = $otherModals.add($module);
12004
12080
  },
12005
12081
 
12082
+ refreshInputs: function(){
12083
+ if($inputs){
12084
+ $inputs
12085
+ .off('keydown' + elementEventNamespace)
12086
+ ;
12087
+ }
12088
+ $inputs = $module.find('[tabindex], :input').filter(':visible').filter(function() {
12089
+ return $(this).closest('.disabled').length === 0;
12090
+ });
12091
+ $inputs.first()
12092
+ .on('keydown' + elementEventNamespace, module.event.inputKeyDown.first)
12093
+ ;
12094
+ $inputs.last()
12095
+ .on('keydown' + elementEventNamespace, module.event.inputKeyDown.last)
12096
+ ;
12097
+ },
12098
+
12006
12099
  attachEvents: function(selector, event) {
12007
12100
  var
12008
12101
  $toggle = $(selector)
@@ -12031,6 +12124,9 @@ $.fn.modal = function(parameters) {
12031
12124
  .on('click' + eventNamespace, selector.approve, module.event.approve)
12032
12125
  .on('click' + eventNamespace, selector.deny, module.event.deny)
12033
12126
  ;
12127
+ $closeIcon
12128
+ .on('keyup' + elementEventNamespace, module.event.closeKeyUp)
12129
+ ;
12034
12130
  $window
12035
12131
  .on('resize' + elementEventNamespace, module.event.resize)
12036
12132
  ;
@@ -12049,7 +12145,7 @@ $.fn.modal = function(parameters) {
12049
12145
 
12050
12146
  get: {
12051
12147
  id: function() {
12052
- return (Math.random().toString(16) + '000000000').substr(2, 8);
12148
+ return id;
12053
12149
  },
12054
12150
  element: function() {
12055
12151
  return $module;
@@ -12088,10 +12184,38 @@ $.fn.modal = function(parameters) {
12088
12184
  close: function() {
12089
12185
  module.hide();
12090
12186
  },
12187
+ closeKeyUp: function(event){
12188
+ var
12189
+ keyCode = event.which
12190
+ ;
12191
+ if ((keyCode === settings.keys.enter || keyCode === settings.keys.space) && $module.hasClass(className.front)) {
12192
+ module.hide();
12193
+ }
12194
+ },
12195
+ inputKeyDown: {
12196
+ first: function(event) {
12197
+ var
12198
+ keyCode = event.which
12199
+ ;
12200
+ if (keyCode === settings.keys.tab && event.shiftKey) {
12201
+ $inputs.last().focus();
12202
+ event.preventDefault();
12203
+ }
12204
+ },
12205
+ last: function(event) {
12206
+ var
12207
+ keyCode = event.which
12208
+ ;
12209
+ if (keyCode === settings.keys.tab && !event.shiftKey) {
12210
+ $inputs.first().focus();
12211
+ event.preventDefault();
12212
+ }
12213
+ }
12214
+ },
12091
12215
  mousedown: function(event) {
12092
12216
  var
12093
12217
  $target = $(event.target),
12094
- isRtl = module.is.rtl();
12218
+ isRtl = module.is.rtl()
12095
12219
  ;
12096
12220
  initialMouseDownInModal = ($target.closest(selector.modal).length > 0);
12097
12221
  if(initialMouseDownInModal) {
@@ -12139,10 +12263,9 @@ $.fn.modal = function(parameters) {
12139
12263
  },
12140
12264
  keyboard: function(event) {
12141
12265
  var
12142
- keyCode = event.which,
12143
- escapeKey = 27
12266
+ keyCode = event.which
12144
12267
  ;
12145
- if(keyCode == escapeKey) {
12268
+ if(keyCode === settings.keys.escape) {
12146
12269
  if(settings.closable) {
12147
12270
  module.debug('Escape key pressed hiding modal');
12148
12271
  if ( $module.hasClass(className.front) ) {
@@ -12198,6 +12321,10 @@ $.fn.modal = function(parameters) {
12198
12321
  : function(){}
12199
12322
  ;
12200
12323
  if( module.is.animating() || !module.is.active() ) {
12324
+ if(settings.onShow.call(element) === false) {
12325
+ module.verbose('Show callback returned false cancelling show');
12326
+ return;
12327
+ }
12201
12328
  module.showDimmer();
12202
12329
  module.cacheSizes();
12203
12330
  module.set.bodyMargin();
@@ -12227,7 +12354,6 @@ $.fn.modal = function(parameters) {
12227
12354
  $module.detach().appendTo($dimmer);
12228
12355
  }
12229
12356
  }
12230
- settings.onShow.call(element);
12231
12357
  if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
12232
12358
  module.debug('Showing modal with css animations');
12233
12359
  $module
@@ -12270,7 +12396,6 @@ $.fn.modal = function(parameters) {
12270
12396
  ? callback
12271
12397
  : function(){}
12272
12398
  ;
12273
- module.debug('Hiding modal');
12274
12399
  if(settings.onHide.call(element, $(this)) === false) {
12275
12400
  module.verbose('Hide callback returned false cancelling hide');
12276
12401
  ignoreRepeatedEvents = false;
@@ -12278,6 +12403,7 @@ $.fn.modal = function(parameters) {
12278
12403
  }
12279
12404
 
12280
12405
  if( module.is.animating() || module.is.active() ) {
12406
+ module.debug('Hiding modal');
12281
12407
  if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
12282
12408
  module.remove.active();
12283
12409
  $module
@@ -12457,7 +12583,7 @@ $.fn.modal = function(parameters) {
12457
12583
  $module
12458
12584
  .off('mousedown' + elementEventNamespace)
12459
12585
  ;
12460
- }
12586
+ }
12461
12587
  $dimmer
12462
12588
  .off('mousedown' + elementEventNamespace)
12463
12589
  ;
@@ -12642,13 +12768,10 @@ $.fn.modal = function(parameters) {
12642
12768
  set: {
12643
12769
  autofocus: function() {
12644
12770
  var
12645
- $inputs = $module.find('[tabindex], :input').filter(':visible').filter(function() {
12646
- return $(this).closest('.disabled').length === 0;
12647
- }),
12648
12771
  $autofocus = $inputs.filter('[autofocus]'),
12649
12772
  $input = ($autofocus.length > 0)
12650
12773
  ? $autofocus.first()
12651
- : $inputs.first()
12774
+ : ($inputs.length > 1 ? $inputs.filter(':not(i.close)') : $inputs).first()
12652
12775
  ;
12653
12776
  if($input.length > 0) {
12654
12777
  $input.focus();
@@ -12730,7 +12853,7 @@ $.fn.modal = function(parameters) {
12730
12853
  ? $(document).scrollTop() + settings.padding
12731
12854
  : $(document).scrollTop() + (module.cache.contextHeight - module.cache.height - settings.padding),
12732
12855
  marginLeft: -(module.cache.width / 2)
12733
- })
12856
+ })
12734
12857
  ;
12735
12858
  } else {
12736
12859
  $module
@@ -12739,7 +12862,7 @@ $.fn.modal = function(parameters) {
12739
12862
  ? -(module.cache.height / 2)
12740
12863
  : settings.padding / 2,
12741
12864
  marginLeft: -(module.cache.width / 2)
12742
- })
12865
+ })
12743
12866
  ;
12744
12867
  }
12745
12868
  module.verbose('Setting modal offset for legacy mode');
@@ -13065,11 +13188,19 @@ $.fn.modal.settings = {
13065
13188
  // called after deny selector match
13066
13189
  onDeny : function(){ return true; },
13067
13190
 
13191
+ keys : {
13192
+ space : 32,
13193
+ enter : 13,
13194
+ escape : 27,
13195
+ tab : 9,
13196
+ },
13197
+
13068
13198
  selector : {
13069
13199
  title : '> .header',
13070
13200
  content : '> .content',
13071
13201
  actions : '> .actions',
13072
13202
  close : '> .close',
13203
+ closeIcon: '> .close',
13073
13204
  approve : '.actions .positive, .actions .approve, .actions .ok',
13074
13205
  deny : '.actions .negative, .actions .deny, .actions .cancel',
13075
13206
  modal : '.ui.modal',
@@ -13101,11 +13232,13 @@ $.fn.modal.settings = {
13101
13232
  template : 'ui tiny modal',
13102
13233
  ok : 'positive',
13103
13234
  cancel : 'negative',
13104
- prompt : 'ui fluid input'
13235
+ prompt : 'ui fluid input',
13236
+ innerDimmer: 'ui inverted dimmer'
13105
13237
  },
13106
13238
  text: {
13107
13239
  ok : 'Ok',
13108
- cancel: 'Cancel'
13240
+ cancel: 'Cancel',
13241
+ close : 'Close'
13109
13242
  }
13110
13243
  };
13111
13244
 
@@ -13131,33 +13264,39 @@ $.fn.modal.settings.templates = {
13131
13264
  },
13132
13265
  alert: function () {
13133
13266
  var settings = this.get.settings(),
13134
- args = settings.templates.getArguments(arguments)
13267
+ args = settings.templates.getArguments(arguments),
13268
+ approveFn = args.handler
13135
13269
  ;
13136
13270
  return {
13137
13271
  title : args.title,
13138
13272
  content: args.content,
13273
+ onApprove: approveFn,
13139
13274
  actions: [{
13140
13275
  text : settings.text.ok,
13141
13276
  class: settings.className.ok,
13142
- click: args.handler
13277
+ click: approveFn
13143
13278
  }]
13144
13279
  }
13145
13280
  },
13146
13281
  confirm: function () {
13147
13282
  var settings = this.get.settings(),
13148
- args = settings.templates.getArguments(arguments)
13283
+ args = settings.templates.getArguments(arguments),
13284
+ approveFn = function(){args.handler(true)},
13285
+ denyFn = function(){args.handler(false)}
13149
13286
  ;
13150
13287
  return {
13151
13288
  title : args.title,
13152
13289
  content: args.content,
13290
+ onApprove: approveFn,
13291
+ onDeny: denyFn,
13153
13292
  actions: [{
13154
13293
  text : settings.text.ok,
13155
13294
  class: settings.className.ok,
13156
- click: function(){args.handler(true)}
13295
+ click: approveFn
13157
13296
  },{
13158
13297
  text: settings.text.cancel,
13159
13298
  class: settings.className.cancel,
13160
- click: function(){args.handler(false)}
13299
+ click: denyFn
13161
13300
  }]
13162
13301
  }
13163
13302
  },
@@ -13165,7 +13304,14 @@ $.fn.modal.settings.templates = {
13165
13304
  var $this = this,
13166
13305
  settings = this.get.settings(),
13167
13306
  args = settings.templates.getArguments(arguments),
13168
- input = $($.parseHTML(args.content)).filter('.ui.input')
13307
+ input = $($.parseHTML(args.content)).filter('.ui.input'),
13308
+ approveFn = function(){
13309
+ var settings = $this.get.settings(),
13310
+ inputField = $this.get.element().find(settings.selector.prompt)[0]
13311
+ ;
13312
+ args.handler($(inputField).val());
13313
+ },
13314
+ denyFn = function(){args.handler(null)}
13169
13315
  ;
13170
13316
  if (input.length === 0) {
13171
13317
  args.content += '<p><div class="'+settings.className.prompt+'"><input placeholder="'+this.helpers.deQuote(args.placeholder || '')+'" type="text" value="'+this.helpers.deQuote(args.defaultValue || '')+'"></div></p>';
@@ -13173,19 +13319,16 @@ $.fn.modal.settings.templates = {
13173
13319
  return {
13174
13320
  title : args.title,
13175
13321
  content: args.content,
13322
+ onApprove: approveFn,
13323
+ onDeny: denyFn,
13176
13324
  actions: [{
13177
13325
  text: settings.text.ok,
13178
13326
  class: settings.className.ok,
13179
- click: function(){
13180
- var settings = $this.get.settings(),
13181
- inputField = $this.get.element().find(settings.selector.prompt)[0]
13182
- ;
13183
- args.handler($(inputField).val());
13184
- }
13327
+ click: approveFn
13185
13328
  },{
13186
13329
  text: settings.text.cancel,
13187
13330
  class: settings.className.cancel,
13188
- click: function(){args.handler(null)}
13331
+ click: denyFn
13189
13332
  }]
13190
13333
  }
13191
13334
  }
@@ -13194,7 +13337,7 @@ $.fn.modal.settings.templates = {
13194
13337
  })( jQuery, window, document );
13195
13338
 
13196
13339
  /*!
13197
- * # Fomantic-UI 2.9.0-beta.29 - Nag
13340
+ * # Fomantic-UI 2.9.0-beta.290+9631798 - Nag
13198
13341
  * http://github.com/fomantic/Fomantic-UI/
13199
13342
  *
13200
13343
  *
@@ -13248,7 +13391,7 @@ $.fn.nag = function(parameters) {
13248
13391
  $module = $(this),
13249
13392
 
13250
13393
  $context = (settings.context)
13251
- ? $(settings.context)
13394
+ ? ([window,document].indexOf(settings.context) < 0 ? $(document).find(settings.context) : $(settings.context))
13252
13395
  : $('body'),
13253
13396
 
13254
13397
  element = this,
@@ -13753,7 +13896,7 @@ $.extend( $.easing, {
13753
13896
  })( jQuery, window, document );
13754
13897
 
13755
13898
  /*!
13756
- * # Fomantic-UI 2.9.0-beta.29 - Popup
13899
+ * # Fomantic-UI 2.9.0-beta.290+9631798 - Popup
13757
13900
  * http://github.com/fomantic/Fomantic-UI/
13758
13901
  *
13759
13902
  *
@@ -13816,11 +13959,11 @@ $.fn.popup = function(parameters) {
13816
13959
  moduleNamespace = 'module-' + namespace,
13817
13960
 
13818
13961
  $module = $(this),
13819
- $context = $(settings.context),
13820
- $scrollContext = $(settings.scrollContext),
13821
- $boundary = $(settings.boundary),
13962
+ $context = [window,document].indexOf(settings.context) < 0 ? $(document).find(settings.context) : $(settings.context),
13963
+ $scrollContext = [window,document].indexOf(settings.scrollContext) < 0 ? $(document).find(settings.scrollContext) : $(settings.scrollContext),
13964
+ $boundary = [window,document].indexOf(settings.boundary) < 0 ? $(document).find(settings.boundary) : $(settings.boundary),
13822
13965
  $target = (settings.target)
13823
- ? $(settings.target)
13966
+ ? ([window,document].indexOf(settings.target) < 0 ? $(document).find(settings.target) : $(settings.target))
13824
13967
  : $module,
13825
13968
 
13826
13969
  $popup,
@@ -13875,8 +14018,8 @@ $.fn.popup = function(parameters) {
13875
14018
  },
13876
14019
 
13877
14020
  refresh: function() {
13878
- if(settings.popup) {
13879
- $popup = $(settings.popup).eq(0);
14021
+ if(settings.popup && typeof settings.popup === 'string') {
14022
+ $popup = $(document).find(settings.popup).eq(0);
13880
14023
  }
13881
14024
  else {
13882
14025
  if(settings.inline) {
@@ -14040,8 +14183,8 @@ $.fn.popup = function(parameters) {
14040
14183
  }
14041
14184
  settings.onCreate.call($popup, element);
14042
14185
  }
14043
- else if(settings.popup) {
14044
- $(settings.popup).data(metadata.activator, $module);
14186
+ else if(settings.popup && typeof settings.popup === 'string') {
14187
+ $(document).find(settings.popup).data(metadata.activator, $module);
14045
14188
  module.verbose('Used popup specified in settings');
14046
14189
  module.refresh();
14047
14190
  if(settings.hoverable) {
@@ -14063,7 +14206,7 @@ $.fn.popup = function(parameters) {
14063
14206
  },
14064
14207
 
14065
14208
  createID: function() {
14066
- id = (Math.random().toString(16) + '000000000').substr(2, 8);
14209
+ id = (Math.random().toString(16) + '000000000').slice(2, 10);
14067
14210
  elementNamespace = '.' + id;
14068
14211
  module.verbose('Creating unique id for element', id);
14069
14212
  },
@@ -14122,7 +14265,7 @@ $.fn.popup = function(parameters) {
14122
14265
  },
14123
14266
 
14124
14267
  hideAll: function() {
14125
- $(selector.popup)
14268
+ $(document).find(selector.popup)
14126
14269
  .filter('.' + className.popupVisible)
14127
14270
  .each(function() {
14128
14271
  $(this)
@@ -15295,7 +15438,7 @@ $.fn.popup.settings = {
15295
15438
  })( jQuery, window, document );
15296
15439
 
15297
15440
  /*!
15298
- * # Fomantic-UI 2.9.0-beta.29 - Progress
15441
+ * # Fomantic-UI 2.9.0-beta.290+9631798 - Progress
15299
15442
  * http://github.com/fomantic/Fomantic-UI/
15300
15443
  *
15301
15444
  *
@@ -15903,6 +16046,9 @@ $.fn.progress = function(parameters) {
15903
16046
  }
15904
16047
  else {
15905
16048
  module.remove.active();
16049
+ module.remove.warning();
16050
+ module.remove.error();
16051
+ module.remove.success();
15906
16052
  module.set.label(settings.text.active);
15907
16053
  }
15908
16054
  },
@@ -16329,7 +16475,7 @@ $.fn.progress.settings = {
16329
16475
  })( jQuery, window, document );
16330
16476
 
16331
16477
  /*!
16332
- * # Fomantic-UI 2.9.0-beta.29 - Slider
16478
+ * # Fomantic-UI 2.9.0-beta.290+9631798 - Slider
16333
16479
  * http://github.com/fomantic/Fomantic-UI/
16334
16480
  *
16335
16481
  *
@@ -16400,6 +16546,7 @@ $.fn.slider = function(parameters) {
16400
16546
 
16401
16547
  $module = $(this),
16402
16548
  $currThumb,
16549
+ touchIdentifier,
16403
16550
  $thumb,
16404
16551
  $secondThumb,
16405
16552
  $track,
@@ -16416,7 +16563,6 @@ $.fn.slider = function(parameters) {
16416
16563
  secondPos,
16417
16564
  offset,
16418
16565
  precision,
16419
- isTouch,
16420
16566
  gapRatio = 1,
16421
16567
  previousValue,
16422
16568
 
@@ -16434,7 +16580,6 @@ $.fn.slider = function(parameters) {
16434
16580
  currentRange += 1;
16435
16581
  documentEventID = currentRange;
16436
16582
 
16437
- isTouch = module.setup.testOutTouch();
16438
16583
  module.setup.layout();
16439
16584
  module.setup.labels();
16440
16585
 
@@ -16505,14 +16650,6 @@ $.fn.slider = function(parameters) {
16505
16650
  }
16506
16651
  }
16507
16652
  },
16508
- testOutTouch: function() {
16509
- try {
16510
- document.createEvent('TouchEvent');
16511
- return true;
16512
- } catch (e) {
16513
- return false;
16514
- }
16515
- },
16516
16653
  customLabel: function() {
16517
16654
  var
16518
16655
  $children = $labels.find('.label'),
@@ -16566,9 +16703,6 @@ $.fn.slider = function(parameters) {
16566
16703
  module.bind.globalKeyboardEvents();
16567
16704
  module.bind.keyboardEvents();
16568
16705
  module.bind.mouseEvents();
16569
- if(module.is.touch()) {
16570
- module.bind.touchEvents();
16571
- }
16572
16706
  if (settings.autoAdjustLabels) {
16573
16707
  module.bind.windowEvents();
16574
16708
  }
@@ -16581,7 +16715,7 @@ $.fn.slider = function(parameters) {
16581
16715
  $(document).on('keydown' + eventNamespace + documentEventID, module.event.activateFocus);
16582
16716
  },
16583
16717
  mouseEvents: function() {
16584
- module.verbose('Binding mouse events');
16718
+ module.verbose('Binding mouse and touch events');
16585
16719
  $module.find('.track, .thumb, .inner').on('mousedown' + eventNamespace, function(event) {
16586
16720
  event.stopImmediatePropagation();
16587
16721
  event.preventDefault();
@@ -16594,27 +16728,20 @@ $.fn.slider = function(parameters) {
16594
16728
  $module.on('mouseleave' + eventNamespace, function(event) {
16595
16729
  isHover = false;
16596
16730
  });
16597
- },
16598
- touchEvents: function() {
16599
- module.verbose('Binding touch events');
16600
- $module.find('.track, .thumb, .inner').on('touchstart' + eventNamespace, function(event) {
16601
- event.stopImmediatePropagation();
16602
- event.preventDefault();
16603
- module.event.down(event);
16604
- });
16605
- $module.on('touchstart' + eventNamespace, module.event.down);
16731
+ // All touch events are invoked on the element where the touch *started*. Thus, we can bind them all
16732
+ // on the thumb(s) and don't need to worry about interference with other components, i.e. no dynamic binding
16733
+ // and unbinding required.
16734
+ $module.find('.thumb')
16735
+ .on('touchstart' + eventNamespace, module.event.touchDown)
16736
+ .on('touchmove' + eventNamespace, module.event.move)
16737
+ .on('touchend' + eventNamespace, module.event.up)
16738
+ .on('touchcancel' + eventNamespace, module.event.touchCancel);
16606
16739
  },
16607
16740
  slidingEvents: function() {
16608
16741
  // these don't need the identifier because we only ever want one of them to be registered with document
16609
16742
  module.verbose('Binding page wide events while handle is being draged');
16610
- if(module.is.touch()) {
16611
- $(document).on('touchmove' + eventNamespace, module.event.move);
16612
- $(document).on('touchend' + eventNamespace, module.event.up);
16613
- }
16614
- else {
16615
- $(document).on('mousemove' + eventNamespace, module.event.move);
16616
- $(document).on('mouseup' + eventNamespace, module.event.up);
16617
- }
16743
+ $(document).on('mousemove' + eventNamespace, module.event.move);
16744
+ $(document).on('mouseup' + eventNamespace, module.event.up);
16618
16745
  },
16619
16746
  windowEvents: function() {
16620
16747
  $window.on('resize' + eventNamespace, module.event.resize);
@@ -16624,24 +16751,22 @@ $.fn.slider = function(parameters) {
16624
16751
  unbind: {
16625
16752
  events: function() {
16626
16753
  $module.find('.track, .thumb, .inner').off('mousedown' + eventNamespace);
16627
- $module.find('.track, .thumb, .inner').off('touchstart' + eventNamespace);
16628
16754
  $module.off('mousedown' + eventNamespace);
16629
16755
  $module.off('mouseenter' + eventNamespace);
16630
16756
  $module.off('mouseleave' + eventNamespace);
16631
- $module.off('touchstart' + eventNamespace);
16757
+ $module.find('.thumb')
16758
+ .off('touchstart' + eventNamespace)
16759
+ .off('touchmove' + eventNamespace)
16760
+ .off('touchend' + eventNamespace)
16761
+ .off('touchcancel' + eventNamespace);
16632
16762
  $module.off('keydown' + eventNamespace);
16633
16763
  $module.off('focusout' + eventNamespace);
16634
16764
  $(document).off('keydown' + eventNamespace + documentEventID, module.event.activateFocus);
16635
16765
  $window.off('resize' + eventNamespace);
16636
16766
  },
16637
16767
  slidingEvents: function() {
16638
- if(module.is.touch()) {
16639
- $(document).off('touchmove' + eventNamespace);
16640
- $(document).off('touchend' + eventNamespace);
16641
- } else {
16642
- $(document).off('mousemove' + eventNamespace);
16643
- $(document).off('mouseup' + eventNamespace);
16644
- }
16768
+ $(document).off('mousemove' + eventNamespace);
16769
+ $(document).off('mouseup' + eventNamespace);
16645
16770
  },
16646
16771
  },
16647
16772
 
@@ -16671,10 +16796,31 @@ $.fn.slider = function(parameters) {
16671
16796
  module.bind.slidingEvents();
16672
16797
  }
16673
16798
  },
16799
+ touchDown: function(event) {
16800
+ event.preventDefault(); // disable mouse emulation and touch-scrolling
16801
+ event.stopImmediatePropagation();
16802
+ if(touchIdentifier !== undefined) {
16803
+ // ignore multiple touches on the same slider --
16804
+ // we cannot handle changing both thumbs at once due to shared state
16805
+ return;
16806
+ }
16807
+ $currThumb = $(event.target);
16808
+ var touchEvent = event.touches ? event : event.originalEvent;
16809
+ touchIdentifier = touchEvent.targetTouches[0].identifier;
16810
+ if(previousValue === undefined) {
16811
+ previousValue = module.get.currentThumbValue();
16812
+ }
16813
+ },
16674
16814
  move: function(event) {
16675
- event.preventDefault();
16815
+ if(event.type == 'mousemove') {
16816
+ event.preventDefault(); // prevent text selection etc.
16817
+ }
16818
+ if(module.is.disabled()) {
16819
+ // touch events are always bound, so we need to prevent touch-sliding on disabled sliders here
16820
+ return;
16821
+ }
16676
16822
  var value = module.determine.valueFromEvent(event);
16677
- if($currThumb === undefined) {
16823
+ if(event.type == 'mousemove' && $currThumb === undefined) {
16678
16824
  var
16679
16825
  eventPos = module.determine.eventPos(event),
16680
16826
  newPos = module.determine.pos(eventPos)
@@ -16711,13 +16857,26 @@ $.fn.slider = function(parameters) {
16711
16857
  },
16712
16858
  up: function(event) {
16713
16859
  event.preventDefault();
16860
+ if(module.is.disabled()) {
16861
+ // touch events are always bound, so we need to prevent touch-sliding on disabled sliders here
16862
+ return;
16863
+ }
16714
16864
  var value = module.determine.valueFromEvent(event);
16715
16865
  module.set.value(value);
16716
16866
  module.unbind.slidingEvents();
16867
+ touchIdentifier = undefined;
16717
16868
  if (previousValue !== undefined) {
16718
16869
  previousValue = undefined;
16719
16870
  }
16720
16871
  },
16872
+ touchCancel: function(event) {
16873
+ event.preventDefault();
16874
+ touchIdentifier = undefined;
16875
+ if (previousValue !== undefined) {
16876
+ module.update.value(previousValue);
16877
+ previousValue = undefined;
16878
+ }
16879
+ },
16721
16880
  keydown: function(event, first) {
16722
16881
  if(settings.preventCrossover && module.is.range() && module.thumbVal === module.secondThumbVal) {
16723
16882
  $currThumb = undefined;
@@ -16830,9 +16989,6 @@ $.fn.slider = function(parameters) {
16830
16989
  },
16831
16990
  smooth: function() {
16832
16991
  return settings.smooth || $module.hasClass(settings.className.smooth);
16833
- },
16834
- touch: function() {
16835
- return isTouch;
16836
16992
  }
16837
16993
  },
16838
16994
 
@@ -17096,12 +17252,19 @@ $.fn.slider = function(parameters) {
17096
17252
  return value;
17097
17253
  },
17098
17254
  eventPos: function(event) {
17099
- if(module.is.touch()) {
17255
+ if(event.type === "touchmove" || event.type === "touchend") {
17100
17256
  var
17101
- touchEvent = event.changedTouches ? event : event.originalEvent,
17102
- touches = touchEvent.changedTouches[0] ? touchEvent.changedTouches : touchEvent.touches,
17103
- touchY = touches[0].pageY,
17104
- touchX = touches[0].pageX
17257
+ touchEvent = event.touches ? event : event.originalEvent,
17258
+ touch = touchEvent.changedTouches[0]; // fall back to first touch if correct touch not found
17259
+ for(var i=0; i < touchEvent.touches.length; i++) {
17260
+ if(touchEvent.touches[i].identifier === touchIdentifier) {
17261
+ touch = touchEvent.touches[i];
17262
+ break;
17263
+ }
17264
+ }
17265
+ var
17266
+ touchY = touch.pageY,
17267
+ touchX = touch.pageX
17105
17268
  ;
17106
17269
  return module.is.vertical() ? touchY : touchX;
17107
17270
  }
@@ -17668,7 +17831,7 @@ $.fn.slider.settings = {
17668
17831
  })( jQuery, window, document );
17669
17832
 
17670
17833
  /*!
17671
- * # Fomantic-UI 2.9.0-beta.29 - Rating
17834
+ * # Fomantic-UI 2.9.0-beta.290+9631798 - Rating
17672
17835
  * http://github.com/fomantic/Fomantic-UI/
17673
17836
  *
17674
17837
  *
@@ -18223,7 +18386,7 @@ $.fn.rating.settings = {
18223
18386
  })( jQuery, window, document );
18224
18387
 
18225
18388
  /*!
18226
- * # Fomantic-UI 2.9.0-beta.29 - Search
18389
+ * # Fomantic-UI 2.9.0-beta.290+9631798 - Search
18227
18390
  * http://github.com/fomantic/Fomantic-UI/
18228
18391
  *
18229
18392
  *
@@ -18627,7 +18790,7 @@ $.fn.search = function(parameters) {
18627
18790
  return $results.hasClass(className.animating);
18628
18791
  },
18629
18792
  chrome: function() {
18630
- return !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);
18793
+ return !!window.chrome && !window.StyleMedia;
18631
18794
  },
18632
18795
  hidden: function() {
18633
18796
  return $results.hasClass(className.hidden);
@@ -19791,7 +19954,7 @@ $.fn.search.settings = {
19791
19954
  })( jQuery, window, document );
19792
19955
 
19793
19956
  /*!
19794
- * # Fomantic-UI 2.9.0-beta.29 - Shape
19957
+ * # Fomantic-UI 2.9.0-beta.290+9631798 - Shape
19795
19958
  * http://github.com/fomantic/Fomantic-UI/
19796
19959
  *
19797
19960
  *
@@ -19918,7 +20081,7 @@ $.fn.shape = function(parameters) {
19918
20081
  module.reset();
19919
20082
  module.set.active();
19920
20083
  };
19921
- settings.beforeChange.call($nextSide[0]);
20084
+ settings.onBeforeChange.call($nextSide[0]);
19922
20085
  if(module.get.transitionEvent()) {
19923
20086
  module.verbose('Starting CSS animation');
19924
20087
  $module
@@ -20605,7 +20768,7 @@ $.fn.shape.settings = {
20605
20768
  height: 'initial',
20606
20769
 
20607
20770
  // callback occurs on side change
20608
- beforeChange : function() {},
20771
+ onBeforeChange : function() {},
20609
20772
  onChange : function() {},
20610
20773
 
20611
20774
  // allow animation to same side
@@ -20640,7 +20803,7 @@ $.fn.shape.settings = {
20640
20803
  })( jQuery, window, document );
20641
20804
 
20642
20805
  /*!
20643
- * # Fomantic-UI 2.9.0-beta.29 - Sidebar
20806
+ * # Fomantic-UI 2.9.0-beta.290+9631798 - Sidebar
20644
20807
  * http://github.com/fomantic/Fomantic-UI/
20645
20808
  *
20646
20809
  *
@@ -20707,7 +20870,7 @@ $.fn.sidebar = function(parameters) {
20707
20870
  moduleNamespace = 'module-' + namespace,
20708
20871
 
20709
20872
  $module = $(this),
20710
- $context = $(settings.context),
20873
+ $context = [window,document].indexOf(settings.context) < 0 ? $(document).find(settings.context) : $(settings.context),
20711
20874
 
20712
20875
  $sidebars = $module.children(selector.sidebar),
20713
20876
  $fixed = $context.children(selector.fixed),
@@ -20759,7 +20922,7 @@ $.fn.sidebar = function(parameters) {
20759
20922
 
20760
20923
  create: {
20761
20924
  id: function() {
20762
- id = (Math.random().toString(16) + '000000000').substr(2,8);
20925
+ id = (Math.random().toString(16) + '000000000').slice(2, 10);
20763
20926
  elementNamespace = '.' + id;
20764
20927
  module.verbose('Creating unique id for element', id);
20765
20928
  }
@@ -20902,7 +21065,7 @@ $.fn.sidebar = function(parameters) {
20902
21065
  if(direction === 'left' || direction === 'right') {
20903
21066
  module.debug('Adding CSS rules for animation distance', width);
20904
21067
  style += ''
20905
- + ' body.pushable > .ui.visible.' + direction + '.sidebar ~ .pusher:after {'
21068
+ + ' body.pushable > .ui.visible.' + direction + '.sidebar ~ .pusher::after {'
20906
21069
  + ' -webkit-transform: translate3d('+ distance[direction] + 'px, 0, 0);'
20907
21070
  + ' transform: translate3d('+ distance[direction] + 'px, 0, 0);'
20908
21071
  + ' }'
@@ -20910,7 +21073,7 @@ $.fn.sidebar = function(parameters) {
20910
21073
  }
20911
21074
  else if(direction === 'top' || direction == 'bottom') {
20912
21075
  style += ''
20913
- + ' body.pushable > .ui.visible.' + direction + '.sidebar ~ .pusher:after {'
21076
+ + ' body.pushable > .ui.visible.' + direction + '.sidebar ~ .pusher::after {'
20914
21077
  + ' -webkit-transform: translate3d(0, ' + distance[direction] + 'px, 0);'
20915
21078
  + ' transform: translate3d(0, ' + distance[direction] + 'px, 0);'
20916
21079
  + ' }'
@@ -20918,8 +21081,8 @@ $.fn.sidebar = function(parameters) {
20918
21081
  }
20919
21082
  /* opposite sides visible forces content overlay */
20920
21083
  style += ''
20921
- + ' body.pushable > .ui.visible.left.sidebar ~ .ui.visible.right.sidebar ~ .pusher:after,'
20922
- + ' body.pushable > .ui.visible.right.sidebar ~ .ui.visible.left.sidebar ~ .pusher:after {'
21084
+ + ' body.pushable > .ui.visible.left.sidebar ~ .ui.visible.right.sidebar ~ .pusher::after,'
21085
+ + ' body.pushable > .ui.visible.right.sidebar ~ .ui.visible.left.sidebar ~ .pusher::after {'
20923
21086
  + ' -webkit-transform: translate3d(0, 0, 0);'
20924
21087
  + ' transform: translate3d(0, 0, 0);'
20925
21088
  + ' }'
@@ -20935,7 +21098,7 @@ $.fn.sidebar = function(parameters) {
20935
21098
 
20936
21099
  refresh: function() {
20937
21100
  module.verbose('Refreshing selector cache');
20938
- $context = $(settings.context);
21101
+ $context = [window,document].indexOf(settings.context) < 0 ? $(document).find(settings.context) : $(settings.context);
20939
21102
  $sidebars = $context.children(selector.sidebar);
20940
21103
  $pusher = $context.children(selector.pusher);
20941
21104
  $fixed = $context.children(selector.fixed);
@@ -21012,6 +21175,10 @@ $.fn.sidebar = function(parameters) {
21012
21175
  : function(){}
21013
21176
  ;
21014
21177
  if(module.is.hidden()) {
21178
+ if(settings.onShow.call(element) === false) {
21179
+ module.verbose('Show callback returned false cancelling show');
21180
+ return;
21181
+ }
21015
21182
  module.refreshSidebars();
21016
21183
  if(settings.overlay) {
21017
21184
  module.error(error.overlay);
@@ -21036,10 +21203,9 @@ $.fn.sidebar = function(parameters) {
21036
21203
  }
21037
21204
  module.pushPage(function() {
21038
21205
  callback.call(element);
21039
- settings.onShow.call(element);
21206
+ settings.onVisible.call(element);
21040
21207
  });
21041
21208
  settings.onChange.call(element);
21042
- settings.onVisible.call(element);
21043
21209
  }
21044
21210
  else {
21045
21211
  module.debug('Sidebar is already visible');
@@ -21051,7 +21217,7 @@ $.fn.sidebar = function(parameters) {
21051
21217
  ? callback
21052
21218
  : function(){}
21053
21219
  ;
21054
- if(module.is.visible() || module.is.animating()) {
21220
+ if((module.is.visible() || module.is.animating()) && settings.onHide.call(element) !== false) {
21055
21221
  module.debug('Hiding sidebar', callback);
21056
21222
  module.refreshSidebars();
21057
21223
  module.pullPage(function() {
@@ -21059,7 +21225,6 @@ $.fn.sidebar = function(parameters) {
21059
21225
  settings.onHidden.call(element);
21060
21226
  });
21061
21227
  settings.onChange.call(element);
21062
- settings.onHide.call(element);
21063
21228
  }
21064
21229
  },
21065
21230
 
@@ -21677,7 +21842,7 @@ $.fn.sidebar.settings = {
21677
21842
  })( jQuery, window, document );
21678
21843
 
21679
21844
  /*!
21680
- * # Fomantic-UI 2.9.0-beta.29 - Sticky
21845
+ * # Fomantic-UI 2.9.0-beta.290+9631798 - Sticky
21681
21846
  * http://github.com/fomantic/Fomantic-UI/
21682
21847
  *
21683
21848
  *
@@ -21731,7 +21896,7 @@ $.fn.sticky = function(parameters) {
21731
21896
 
21732
21897
  $module = $(this),
21733
21898
  $window = $(window),
21734
- $scroll = $(settings.scrollContext),
21899
+ $scroll = [window,document].indexOf(settings.scrollContext) < 0 ? $(document).find(settings.scrollContext) : $(settings.scrollContext),
21735
21900
  $container,
21736
21901
  $context,
21737
21902
 
@@ -21817,7 +21982,7 @@ $.fn.sticky = function(parameters) {
21817
21982
 
21818
21983
  determineContainer: function() {
21819
21984
  if(settings.container) {
21820
- $container = $(settings.container);
21985
+ $container = [window,document].indexOf(settings.container) < 0 ? $(document).find(settings.container) : $(settings.container);
21821
21986
  }
21822
21987
  else {
21823
21988
  $container = $module.offsetParent();
@@ -21826,7 +21991,7 @@ $.fn.sticky = function(parameters) {
21826
21991
 
21827
21992
  determineContext: function() {
21828
21993
  if(settings.context) {
21829
- $context = $(settings.context);
21994
+ $context = [window,document].indexOf(settings.context) < 0 ? $(document).find(settings.context) : $(settings.context);
21830
21995
  }
21831
21996
  else {
21832
21997
  $context = $container;
@@ -22635,7 +22800,7 @@ $.fn.sticky.settings = {
22635
22800
  })( jQuery, window, document );
22636
22801
 
22637
22802
  /*!
22638
- * # Fomantic-UI 2.9.0-beta.29 - Tab
22803
+ * # Fomantic-UI 2.9.0-beta.290+9631798 - Tab
22639
22804
  * http://github.com/fomantic/Fomantic-UI/
22640
22805
  *
22641
22806
  *
@@ -22736,10 +22901,18 @@ $.fn.tab = function(parameters) {
22736
22901
  initializedHistory = true;
22737
22902
  }
22738
22903
 
22739
- if(settings.autoTabActivation && instance === undefined && module.determine.activeTab() == null) {
22740
- module.debug('No active tab detected, setting first tab active', module.get.initialPath());
22741
- module.changeTab(settings.autoTabActivation === true ? module.get.initialPath() : settings.autoTabActivation);
22742
- };
22904
+ var activeTab = module.determine.activeTab();
22905
+ if(settings.autoTabActivation && instance === undefined && activeTab == null) {
22906
+ activeTab = settings.autoTabActivation === true ? module.get.initialPath() : settings.autoTabActivation;
22907
+ module.debug('No active tab detected, setting tab active', activeTab);
22908
+ module.changeTab(activeTab);
22909
+ }
22910
+ if(activeTab != null && settings.history) {
22911
+ var autoUpdate = $.address.autoUpdate();
22912
+ $.address.autoUpdate(false);
22913
+ $.address.value(activeTab);
22914
+ $.address.autoUpdate(autoUpdate);
22915
+ }
22743
22916
 
22744
22917
  module.instantiate();
22745
22918
  },
@@ -22790,7 +22963,7 @@ $.fn.tab = function(parameters) {
22790
22963
  module.verbose('Determined parent element for creating context', $context);
22791
22964
  }
22792
22965
  else if(settings.context) {
22793
- $context = $(settings.context);
22966
+ $context = [window,document].indexOf(settings.context) < 0 ? $(document).find(settings.context) : $(settings.context);
22794
22967
  module.verbose('Using selector for tab context', settings.context, $context);
22795
22968
  }
22796
22969
  else {
@@ -22839,6 +23012,7 @@ $.fn.tab = function(parameters) {
22839
23012
  .history(true)
22840
23013
  .state(settings.path)
22841
23014
  ;
23015
+ $(window).trigger('popstate');
22842
23016
  }
22843
23017
  else {
22844
23018
  module.error(error.path);
@@ -23006,6 +23180,10 @@ $.fn.tab = function(parameters) {
23006
23180
  module.verbose('Tab parameters found', nextPathArray);
23007
23181
  }
23008
23182
  }
23183
+ if (settings.onBeforeChange.call(element, currentPath) === false) {
23184
+ module.debug('onBeforeChange returned false, cancelling tab change', $tab);
23185
+ return false;
23186
+ }
23009
23187
  if(isLastTab && remoteContent) {
23010
23188
  if(!shouldIgnoreLoad) {
23011
23189
  module.activate.navigation(currentPath);
@@ -23042,6 +23220,10 @@ $.fn.tab = function(parameters) {
23042
23220
  // if anchor exists use parent tab
23043
23221
  if($anchor && $anchor.length > 0 && currentPath) {
23044
23222
  module.debug('Anchor link used, opening parent tab', $tab, $anchor);
23223
+ if (settings.onBeforeChange.call(element, currentPath) === false) {
23224
+ module.debug('onBeforeChange returned false, cancelling tab change', $tab);
23225
+ return false;
23226
+ }
23045
23227
  if( !$tab.hasClass(className.active) ) {
23046
23228
  setTimeout(function() {
23047
23229
  module.scrollTo($anchor);
@@ -23595,6 +23777,7 @@ $.fn.tab.settings = {
23595
23777
  onLoad : function(tabPath, parameterArray, historyEvent) {}, // called on every load
23596
23778
  onVisible : function(tabPath, parameterArray, historyEvent) {}, // called every time tab visible
23597
23779
  onRequest : function(tabPath, parameterArray, historyEvent) {}, // called ever time a tab beings loading remote content
23780
+ onBeforeChange: function(tabPath) {}, // called before a tab is about to be changed. Returning false will cancel the tab change
23598
23781
 
23599
23782
  templates : {
23600
23783
  determineTitle: function(tabArray) {} // returns page title for path
@@ -23637,7 +23820,7 @@ $.fn.tab.settings = {
23637
23820
  })( jQuery, window, document );
23638
23821
 
23639
23822
  /*!
23640
- * # Fomantic-UI 2.9.0-beta.29 - Toast
23823
+ * # Fomantic-UI 2.9.0-beta.290+9631798 - Toast
23641
23824
  * http://github.com/fomantic/Fomantic-UI/
23642
23825
  *
23643
23826
  *
@@ -23699,7 +23882,7 @@ $.fn.toast = function(parameters) {
23699
23882
  $animationObject,
23700
23883
  $close,
23701
23884
  $context = (settings.context)
23702
- ? $(settings.context)
23885
+ ? ([window,document].indexOf(settings.context) < 0 ? $(document).find(settings.context) : $(settings.context))
23703
23886
  : $('body'),
23704
23887
 
23705
23888
  isToastComponent = $module.hasClass('toast') || $module.hasClass('message') || $module.hasClass('card'),
@@ -23707,12 +23890,14 @@ $.fn.toast = function(parameters) {
23707
23890
  element = this,
23708
23891
  instance = isToastComponent ? $module.data(moduleNamespace) : undefined,
23709
23892
 
23893
+ id,
23710
23894
  module
23711
23895
  ;
23712
23896
  module = {
23713
23897
 
23714
23898
  initialize: function() {
23715
23899
  module.verbose('Initializing element');
23900
+ module.create.id();
23716
23901
  if (!module.has.container()) {
23717
23902
  module.create.container();
23718
23903
  }
@@ -23762,17 +23947,22 @@ $.fn.toast = function(parameters) {
23762
23947
  },
23763
23948
 
23764
23949
  show: function(callback) {
23765
- callback = callback || function(){};
23766
- module.debug('Showing toast');
23767
23950
  if(settings.onShow.call($toastBox, element) === false) {
23768
23951
  module.debug('onShow callback returned false, cancelling toast animation');
23769
23952
  return;
23770
23953
  }
23954
+ callback = callback || function(){};
23955
+ module.debug('Showing toast');
23771
23956
  module.animate.show(callback);
23772
23957
  },
23773
23958
 
23774
23959
  close: function(callback) {
23960
+ if(settings.onHide.call($toastBox, element) === false) {
23961
+ module.debug('onHide callback returned false, cancelling toast animation');
23962
+ return;
23963
+ }
23775
23964
  callback = callback || function(){};
23965
+ module.debug('Closing toast');
23776
23966
  module.remove.visible();
23777
23967
  module.unbind.events();
23778
23968
  module.animate.close(callback);
@@ -23782,14 +23972,18 @@ $.fn.toast = function(parameters) {
23782
23972
  create: {
23783
23973
  container: function() {
23784
23974
  module.verbose('Creating container');
23785
- $context.append($('<div/>',{class: settings.position + ' ' + className.container + ' ' +(settings.horizontal ? className.horizontal : '')}));
23975
+ $context.append($('<div/>',{class: settings.position + ' ' + className.container + ' ' +(settings.horizontal ? className.horizontal : '') + ' ' + (settings.context && settings.context !== 'body' ? className.absolute : '')}));
23976
+ },
23977
+ id: function() {
23978
+ id = (Math.random().toString(16) + '000000000').slice(2, 10);
23979
+ module.verbose('Creating unique id for element', id);
23786
23980
  },
23787
23981
  toast: function() {
23788
23982
  $toastBox = $('<div/>', {class: className.box});
23789
23983
  var iconClass = module.get.iconClass();
23790
23984
  if (!isToastComponent) {
23791
23985
  module.verbose('Creating toast');
23792
- $toast = $('<div/>');
23986
+ $toast = $('<div/>', {role: 'alert'});
23793
23987
  var $content = $('<div/>', {class: className.content});
23794
23988
  if (iconClass !== '') {
23795
23989
  $toast.append($('<i/>', {class: iconClass + ' ' + className.icon}));
@@ -23802,13 +23996,21 @@ $.fn.toast = function(parameters) {
23802
23996
  }));
23803
23997
  }
23804
23998
  if (settings.title !== '') {
23999
+ var titleId = '_' + module.get.id() + 'title';
24000
+ $toast.attr('aria-labelledby', titleId);
23805
24001
  $content.append($('<div/>', {
23806
24002
  class: className.title,
23807
- text: settings.title
24003
+ id: titleId,
24004
+ html: module.helpers.escape(settings.title, settings.preserveHTML)
23808
24005
  }));
23809
24006
  }
23810
-
23811
- $content.append($('<div/>', {class: className.message, html: module.helpers.escape(settings.message, settings.preserveHTML)}));
24007
+ var descId = '_' + module.get.id() + 'desc';
24008
+ $toast.attr('aria-describedby', descId);
24009
+ $content.append($('<div/>', {
24010
+ class: className.message,
24011
+ id: descId,
24012
+ html: module.helpers.escape(settings.message, settings.preserveHTML)
24013
+ }));
23812
24014
 
23813
24015
  $toast
23814
24016
  .addClass(settings.class + ' ' + className.toast)
@@ -23816,7 +24018,7 @@ $.fn.toast = function(parameters) {
23816
24018
  ;
23817
24019
  $toast.css('opacity', settings.opacity);
23818
24020
  if (settings.closeIcon) {
23819
- $close = $('<i/>', {class: className.close + ' ' + (typeof settings.closeIcon === 'string' ? settings.closeIcon : '')});
24021
+ $close = $('<i/>', {class: className.close + ' ' + (typeof settings.closeIcon === 'string' ? settings.closeIcon : ''), role: 'button', tabindex: 0, 'aria-label': settings.text.close});
23820
24022
  if($close.hasClass(className.left)) {
23821
24023
  $toast.prepend($close);
23822
24024
  } else {
@@ -23859,15 +24061,17 @@ $.fn.toast = function(parameters) {
23859
24061
  }
23860
24062
  }
23861
24063
  settings.actions.forEach(function (el) {
23862
- var icon = el[fields.icon] ? '<i class="' + module.helpers.deQuote(el[fields.icon]) + ' icon"></i>' : '',
24064
+ var icon = el[fields.icon] ? '<i '+(el[fields.text] ? 'aria-hidden="true"' : '')+' class="' + module.helpers.deQuote(el[fields.icon]) + ' icon"></i>' : '',
23863
24065
  text = module.helpers.escape(el[fields.text] || '', settings.preserveHTML),
23864
24066
  cls = module.helpers.deQuote(el[fields.class] || ''),
23865
24067
  click = el[fields.click] && $.isFunction(el[fields.click]) ? el[fields.click] : function () {};
23866
24068
  $actions.append($('<button/>', {
23867
24069
  html: icon + text,
24070
+ 'aria-label': (el[fields.text] || el[fields.icon] || '').replace(/<[^>]+(>|$)/g,''),
23868
24071
  class: className.button + ' ' + cls,
23869
24072
  click: function () {
23870
- if (click.call(element, $module) === false) {
24073
+ var button = $(this);
24074
+ if (button.is(selector.approve) || button.is(selector.deny) || click.call(element, $module) === false) {
23871
24075
  return;
23872
24076
  }
23873
24077
  module.close();
@@ -23967,13 +24171,12 @@ $.fn.toast = function(parameters) {
23967
24171
  bind: {
23968
24172
  events: function() {
23969
24173
  module.debug('Binding events to toast');
23970
- if(settings.closeOnClick || settings.closeIcon) {
23971
- (settings.closeIcon ? $close : $toast)
23972
- .on('click' + eventNamespace, module.event.click)
23973
- ;
24174
+ if(settings.closeIcon) {
24175
+ $close.on('click' + eventNamespace, module.event.close);
23974
24176
  }
24177
+ $toast.on('click' + eventNamespace, module.event.click);
23975
24178
  if($animationObject) {
23976
- $animationObject.on('animationend' + eventNamespace, module.close);
24179
+ $animationObject.on('animationend' + eventNamespace, module.event.close);
23977
24180
  }
23978
24181
  $toastBox
23979
24182
  .on('click' + eventNamespace, selector.approve, module.event.approve)
@@ -23985,11 +24188,10 @@ $.fn.toast = function(parameters) {
23985
24188
  unbind: {
23986
24189
  events: function() {
23987
24190
  module.debug('Unbinding events to toast');
23988
- if(settings.closeOnClick || settings.closeIcon) {
23989
- (settings.closeIcon ? $close : $toast)
23990
- .off('click' + eventNamespace)
23991
- ;
24191
+ if(settings.closeIcon) {
24192
+ $close.off('click' + eventNamespace);
23992
24193
  }
24194
+ $toast.off('click' + eventNamespace);
23993
24195
  if($animationObject) {
23994
24196
  $animationObject.off('animationend' + eventNamespace);
23995
24197
  }
@@ -24021,11 +24223,6 @@ $.fn.toast = function(parameters) {
24021
24223
  },
24022
24224
  close: function(callback) {
24023
24225
  callback = $.isFunction(callback) ? callback : function(){};
24024
- module.debug('Closing toast');
24025
- if(settings.onHide.call($toastBox, element) === false) {
24026
- module.debug('onHide callback returned false, cancelling toast animation');
24027
- return;
24028
- }
24029
24226
  if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
24030
24227
  $toastBox
24031
24228
  .transition({
@@ -24081,7 +24278,7 @@ $.fn.toast = function(parameters) {
24081
24278
  has: {
24082
24279
  container: function() {
24083
24280
  module.verbose('Determining if there is already a container');
24084
- return ($context.find(module.helpers.toClass(settings.position) + selector.container + (settings.horizontal ? module.helpers.toClass(className.horizontal) : '')).length > 0);
24281
+ return module.get.containers().length > 0;
24085
24282
  },
24086
24283
  toast: function(){
24087
24284
  return !!module.get.toast();
@@ -24095,8 +24292,14 @@ $.fn.toast = function(parameters) {
24095
24292
  },
24096
24293
 
24097
24294
  get: {
24295
+ id: function() {
24296
+ return id;
24297
+ },
24298
+ containers: function() {
24299
+ return $context.children(module.helpers.toClass(settings.position) + selector.container + (settings.horizontal ? module.helpers.toClass(className.horizontal) : ':not('+module.helpers.toClass(className.horizontal)+')') + (settings.context && settings.context !== 'body' ? module.helpers.toClass(className.absolute) : ':not('+module.helpers.toClass(className.absolute)+')'));
24300
+ },
24098
24301
  container: function() {
24099
- return ($context.find(module.helpers.toClass(settings.position) + selector.container)[0]);
24302
+ return module.get.containers()[0];
24100
24303
  },
24101
24304
  toastBox: function() {
24102
24305
  return $toastBox || null;
@@ -24128,9 +24331,15 @@ $.fn.toast = function(parameters) {
24128
24331
  },
24129
24332
 
24130
24333
  event: {
24334
+ close: function(){
24335
+ module.close();
24336
+ },
24131
24337
  click: function(event) {
24132
- if($(event.target).closest('a').length === 0) {
24133
- settings.onClick.call($toastBox, element);
24338
+ if($(event.target).closest(selector.clickable).length === 0) {
24339
+ if(settings.onClick.call($toastBox, element) === false || !settings.closeOnClick) {
24340
+ module.verbose('Click callback returned false or close denied by setting cancelling close');
24341
+ return;
24342
+ }
24134
24343
  module.close();
24135
24344
  }
24136
24345
  },
@@ -24153,7 +24362,7 @@ $.fn.toast = function(parameters) {
24153
24362
  helpers: {
24154
24363
  toClass: function(selector) {
24155
24364
  var
24156
- classes = selector.split(' '),
24365
+ classes = selector.trim().split(/\s+/),
24157
24366
  result = ''
24158
24367
  ;
24159
24368
 
@@ -24443,6 +24652,7 @@ $.fn.toast.settings = {
24443
24652
 
24444
24653
  className : {
24445
24654
  container : 'ui toast-container',
24655
+ absolute : 'absolute',
24446
24656
  box : 'floating toast-box',
24447
24657
  progress : 'ui attached active progress',
24448
24658
  toast : 'ui toast',
@@ -24471,6 +24681,10 @@ $.fn.toast.settings = {
24471
24681
  unclickable : 'unclickable'
24472
24682
  },
24473
24683
 
24684
+ text: {
24685
+ close : 'Close'
24686
+ },
24687
+
24474
24688
  icons : {
24475
24689
  info : 'info',
24476
24690
  success : 'checkmark',
@@ -24487,6 +24701,7 @@ $.fn.toast.settings = {
24487
24701
  image : '> img.image, > .image > img',
24488
24702
  icon : '> i.icon',
24489
24703
  input : 'input:not([type="hidden"]), textarea, select, button, .ui.button, ui.dropdown',
24704
+ clickable : 'a, details, .ui.accordion',
24490
24705
  approve : '.actions .positive, .actions .approve, .actions .ok',
24491
24706
  deny : '.actions .negative, .actions .deny, .actions .cancel'
24492
24707
  },
@@ -24530,7 +24745,7 @@ $.extend( $.easing, {
24530
24745
  })( jQuery, window, document );
24531
24746
 
24532
24747
  /*!
24533
- * # Fomantic-UI 2.9.0-beta.29 - Transition
24748
+ * # Fomantic-UI 2.9.0-beta.290+9631798 - Transition
24534
24749
  * http://github.com/fomantic/Fomantic-UI/
24535
24750
  *
24536
24751
  *
@@ -25302,6 +25517,10 @@ $.fn.transition = function() {
25302
25517
  },
25303
25518
 
25304
25519
  hide: function() {
25520
+ if(settings.onHide.call(element) === false) {
25521
+ module.verbose('Hide callback returned false cancelling hide');
25522
+ return false;
25523
+ }
25305
25524
  module.verbose('Hiding element');
25306
25525
  if( module.is.animating() ) {
25307
25526
  module.reset();
@@ -25309,35 +25528,32 @@ $.fn.transition = function() {
25309
25528
  element.blur(); // IE will trigger focus change if element is not blurred before hiding
25310
25529
  module.remove.display();
25311
25530
  module.remove.visible();
25312
- if($.isFunction(settings.onBeforeHide)){
25313
- settings.onBeforeHide.call(element,function(){
25314
- module.hideNow();
25315
- });
25316
- } else {
25317
- module.hideNow();
25318
- }
25319
-
25531
+ settings.onBeforeHide.call(element, module.hideNow);
25320
25532
  },
25321
25533
 
25322
25534
  hideNow: function() {
25323
25535
  module.set.hidden();
25324
25536
  module.force.hidden();
25325
- settings.onHide.call(element);
25537
+ settings.onHidden.call(element);
25326
25538
  settings.onComplete.call(element);
25327
25539
  // module.repaint();
25328
25540
  },
25329
25541
 
25330
25542
  show: function(display) {
25331
- module.verbose('Showing element', display);
25332
- if(module.force.visible()) {
25543
+ if(module.force.visible() && settings.onShow.call(element) !== false) {
25544
+ module.verbose('Showing element', display);
25333
25545
  module.remove.hidden();
25334
- module.set.visible();
25335
- settings.onShow.call(element);
25336
- settings.onComplete.call(element);
25337
- // module.repaint();
25546
+ settings.onBeforeShow.call(element, module.showNow);
25338
25547
  }
25339
25548
  },
25340
25549
 
25550
+ showNow: function(){
25551
+ module.set.visible();
25552
+ settings.onVisible.call(element);
25553
+ settings.onComplete.call(element);
25554
+ // module.repaint();
25555
+ },
25556
+
25341
25557
  toggle: function() {
25342
25558
  if( module.is.visible() ) {
25343
25559
  module.hide();
@@ -25586,7 +25802,11 @@ $.fn.transition.settings = {
25586
25802
  onStart : function() {},
25587
25803
  onComplete : function() {},
25588
25804
  onShow : function() {},
25805
+ onBeforeShow : function(callback) {callback.call(this)},
25806
+ onVisible : function() {},
25589
25807
  onHide : function() {},
25808
+ onHidden : function() {},
25809
+ onBeforeHide : function(callback) {callback.call(this)},
25590
25810
 
25591
25811
  // whether timeout should be used to ensure callback fires in cases animationend does not
25592
25812
  useFailSafe : true,
@@ -25640,7 +25860,7 @@ $.fn.transition.settings = {
25640
25860
  })( jQuery, window, document );
25641
25861
 
25642
25862
  /*!
25643
- * # Fomantic-UI 2.9.0-beta.29 - API
25863
+ * # Fomantic-UI 2.9.0-beta.290+9631798 - API
25644
25864
  * http://github.com/fomantic/Fomantic-UI/
25645
25865
  *
25646
25866
  *
@@ -25706,7 +25926,7 @@ $.api = $.fn.api = function(parameters) {
25706
25926
 
25707
25927
  // context used for state
25708
25928
  $context = (settings.stateContext)
25709
- ? $(settings.stateContext)
25929
+ ? ([window,document].indexOf(settings.stateContext) < 0 ? $(document).find(settings.stateContext) : $(settings.stateContext))
25710
25930
  : $module,
25711
25931
 
25712
25932
  // request details
@@ -25715,6 +25935,7 @@ $.api = $.fn.api = function(parameters) {
25715
25935
  url,
25716
25936
  data,
25717
25937
  requestStartTime,
25938
+ originalData,
25718
25939
 
25719
25940
  // standard module
25720
25941
  element = this,
@@ -25727,6 +25948,7 @@ $.api = $.fn.api = function(parameters) {
25727
25948
 
25728
25949
  initialize: function() {
25729
25950
  if(!methodInvoked) {
25951
+ originalData = settings.data;
25730
25952
  module.bind.events();
25731
25953
  }
25732
25954
  module.instantiate();
@@ -25789,8 +26011,8 @@ $.api = $.fn.api = function(parameters) {
25789
26011
  module.error(error.noStorage);
25790
26012
  return;
25791
26013
  }
25792
- response = sessionStorage.getItem(url);
25793
- module.debug('Using cached response', url, response);
26014
+ response = sessionStorage.getItem(url + module.get.normalizedData());
26015
+ module.debug('Using cached response', url, settings.data, response);
25794
26016
  response = module.decode.json(response);
25795
26017
  return response;
25796
26018
  }
@@ -25808,8 +26030,8 @@ $.api = $.fn.api = function(parameters) {
25808
26030
  if( $.isPlainObject(response) ) {
25809
26031
  response = JSON.stringify(response);
25810
26032
  }
25811
- sessionStorage.setItem(url, response);
25812
- module.verbose('Storing cached response for url', url, response);
26033
+ sessionStorage.setItem(url + module.get.normalizedData(), response);
26034
+ module.verbose('Storing cached response for url', url, settings.data, response);
25813
26035
  }
25814
26036
  },
25815
26037
 
@@ -25838,7 +26060,7 @@ $.api = $.fn.api = function(parameters) {
25838
26060
 
25839
26061
  // Add form content
25840
26062
  if(settings.serializeForm) {
25841
- settings.data = module.add.formData(settings.data);
26063
+ settings.data = module.add.formData(originalData || settings.data);
25842
26064
  }
25843
26065
 
25844
26066
  // call beforesend and get any settings changes
@@ -25975,10 +26197,6 @@ $.api = $.fn.api = function(parameters) {
25975
26197
  cancelled: function() {
25976
26198
  return (module.cancelled || false);
25977
26199
  },
25978
- succesful: function() {
25979
- module.verbose('This behavior will be deleted due to typo. Use "was successful" instead.');
25980
- return module.was.successful();
25981
- },
25982
26200
  successful: function() {
25983
26201
  return (module.request && module.request.state() == 'resolved');
25984
26202
  },
@@ -26006,8 +26224,8 @@ $.api = $.fn.api = function(parameters) {
26006
26224
  var
26007
26225
  // allow legacy {$var} style
26008
26226
  variable = (templatedString.indexOf('$') !== -1)
26009
- ? templatedString.substr(2, templatedString.length - 3)
26010
- : templatedString.substr(1, templatedString.length - 2),
26227
+ ? templatedString.slice(2, -1)
26228
+ : templatedString.slice(1, -1),
26011
26229
  value = ($.isPlainObject(urlData) && urlData[variable] !== undefined)
26012
26230
  ? urlData[variable]
26013
26231
  : ($module.data(variable) !== undefined)
@@ -26038,8 +26256,8 @@ $.api = $.fn.api = function(parameters) {
26038
26256
  var
26039
26257
  // allow legacy {/$var} style
26040
26258
  variable = (templatedString.indexOf('$') !== -1)
26041
- ? templatedString.substr(3, templatedString.length - 4)
26042
- : templatedString.substr(2, templatedString.length - 3),
26259
+ ? templatedString.slice(3, -1)
26260
+ : templatedString.slice(2, -1),
26043
26261
  value = ($.isPlainObject(urlData) && urlData[variable] !== undefined)
26044
26262
  ? urlData[variable]
26045
26263
  : ($module.data(variable) !== undefined)
@@ -26070,24 +26288,76 @@ $.api = $.fn.api = function(parameters) {
26070
26288
  },
26071
26289
  formData: function(data) {
26072
26290
  var
26073
- canSerialize = ($.fn.serializeObject !== undefined),
26074
- formData = (canSerialize)
26075
- ? $form.serializeObject()
26076
- : $form.serialize(),
26077
- hasOtherData
26291
+ formData = {},
26292
+ hasOtherData,
26293
+ useFormDataApi = settings.serializeForm === 'formdata'
26078
26294
  ;
26079
- data = data || settings.data;
26295
+ data = data || originalData || settings.data;
26080
26296
  hasOtherData = $.isPlainObject(data);
26081
26297
 
26298
+ if (useFormDataApi) {
26299
+ formData = new FormData($form[0]);
26300
+ settings.processData = typeof settings.processData !== 'undefined' ? settings.processData : false;
26301
+ settings.contentType = typeof settings.contentType !== 'undefined' ? settings.contentType : false;
26302
+ } else {
26303
+ var formArray = $form.serializeArray(),
26304
+ pushes = {},
26305
+ pushValues= {},
26306
+ build = function(base, key, value) {
26307
+ base[key] = value;
26308
+ return base;
26309
+ }
26310
+ ;
26311
+ // add files
26312
+ $.each($('input[type="file"]',$form), function(i, tag) {
26313
+ $.each($(tag)[0].files, function(j, file) {
26314
+ formArray.push({name:tag.name, value: file});
26315
+ });
26316
+ });
26317
+ $.each(formArray, function(i, el) {
26318
+ if (!settings.regExp.validate.test(el.name)) return;
26319
+ var isCheckbox = $('[name="' + el.name + '"]', $form).attr('type') === 'checkbox',
26320
+ floatValue = parseFloat(el.value),
26321
+ value = (isCheckbox && el.value === 'on') || el.value === 'true' || (String(floatValue) === el.value ? floatValue : (el.value === 'false' ? false : el.value)),
26322
+ nameKeys = el.name.match(settings.regExp.key) || [], k, pushKey= el.name.replace(/\[\]$/,'')
26323
+ ;
26324
+ if(!(pushKey in pushes)) {
26325
+ pushes[pushKey] = 0;
26326
+ pushValues[pushKey] = value;
26327
+ } else if (Array.isArray(pushValues[pushKey])) {
26328
+ pushValues[pushKey].push(value);
26329
+ } else {
26330
+ pushValues[pushKey] = [pushValues[pushKey] , value];
26331
+ }
26332
+ value = pushValues[pushKey];
26333
+
26334
+ while ((k = nameKeys.pop()) !== undefined) {
26335
+ // foo[]
26336
+ if (k == '' && !Array.isArray(value)){
26337
+ value = build([], pushes[pushKey]++, value);
26338
+ }
26339
+ // foo[n]
26340
+ else if (settings.regExp.fixed.test(k)) {
26341
+ value = build([], k, value);
26342
+ }
26343
+ // foo; foo[bar]
26344
+ else if (settings.regExp.named.test(k)) {
26345
+ value = build({}, k, value);
26346
+ }
26347
+ }
26348
+ formData = $.extend(true, formData, value);
26349
+ });
26350
+ }
26351
+
26082
26352
  if(hasOtherData) {
26083
- if(canSerialize) {
26084
- module.debug('Extending existing data with form data', data, formData);
26085
- data = $.extend(true, {}, data, formData);
26086
- }
26087
- else {
26088
- module.error(error.missingSerialize);
26089
- module.debug('Cant extend data. Replacing data with form data', data, formData);
26353
+ module.debug('Extending existing data with form data', data, formData);
26354
+ if(useFormDataApi) {
26355
+ $.each(Object.keys(data),function(i, el){
26356
+ formData.append(el, data[el]);
26357
+ });
26090
26358
  data = formData;
26359
+ } else {
26360
+ data = $.extend(true, {}, data, formData);
26091
26361
  }
26092
26362
  }
26093
26363
  else {
@@ -26339,6 +26609,9 @@ $.api = $.fn.api = function(parameters) {
26339
26609
  },
26340
26610
 
26341
26611
  get: {
26612
+ normalizedData: function(){
26613
+ return typeof settings.data === "string" ? settings.data : JSON.stringify(settings.data, Object.keys(settings.data).sort());
26614
+ },
26342
26615
  responseFromXHR: function(xhr) {
26343
26616
  return $.isPlainObject(xhr)
26344
26617
  ? (module.is.expectingJSON())
@@ -26724,6 +26997,8 @@ $.api.settings = {
26724
26997
  defaultData : true,
26725
26998
 
26726
26999
  // whether to serialize closest form
27000
+ // use true to convert complex named keys like a[b][1][c][] into a nested object
27001
+ // use 'formdata' for formdata web api
26727
27002
  serializeForm : false,
26728
27003
 
26729
27004
  // how long to wait before request should occur
@@ -26746,7 +27021,7 @@ $.api.settings = {
26746
27021
  responseAsync : false,
26747
27022
 
26748
27023
  // whether onResponse should work with response value without force converting into an object
26749
- rawResponse : false,
27024
+ rawResponse : true,
26750
27025
 
26751
27026
  // callbacks before request
26752
27027
  beforeSend : function(settings) { return settings; },
@@ -26782,7 +27057,6 @@ $.api.settings = {
26782
27057
  legacyParameters : 'You are using legacy API success callback names',
26783
27058
  method : 'The method you called is not defined',
26784
27059
  missingAction : 'API action used but no url was defined',
26785
- missingSerialize : 'jquery-serialize-object is required to add form data to an existing data object',
26786
27060
  missingURL : 'No URL specified for api event',
26787
27061
  noReturnedValue : 'The beforeSend callback must return a settings object, beforeSend ignored.',
26788
27062
  noStorage : 'Caching responses locally requires session storage',
@@ -26795,6 +27069,11 @@ $.api.settings = {
26795
27069
  regExp : {
26796
27070
  required : /\{\$*[A-z0-9]+\}/g,
26797
27071
  optional : /\{\/\$*[A-z0-9]+\}/g,
27072
+ validate: /^[a-z_][a-z0-9_-]*(?:\[[a-z0-9_-]*\])*$/i,
27073
+ key: /[a-z0-9_-]+|(?=\[\])/gi,
27074
+ push: /^$/,
27075
+ fixed: /^\d+$/,
27076
+ named: /^[a-z0-9_-]+$/i
26798
27077
  },
26799
27078
 
26800
27079
  className: {
@@ -26818,7 +27097,7 @@ $.api.settings = {
26818
27097
  })( jQuery, window, document );
26819
27098
 
26820
27099
  /*!
26821
- * # Fomantic-UI 2.9.0-beta.29 - State
27100
+ * # Fomantic-UI 2.9.0-beta.290+9631798 - State
26822
27101
  * http://github.com/fomantic/Fomantic-UI/
26823
27102
  *
26824
27103
  *
@@ -26893,7 +27172,7 @@ $.fn.state = function(parameters) {
26893
27172
 
26894
27173
  // bind events with delegated events
26895
27174
  if(settings.context && moduleSelector !== '') {
26896
- $(settings.context)
27175
+ ([window,document].indexOf(settings.context) < 0 ? $(document).find(settings.context) : $(settings.context))
26897
27176
  .on(moduleSelector, 'mouseenter' + eventNamespace, module.change.text)
26898
27177
  .on(moduleSelector, 'mouseleave' + eventNamespace, module.reset.text)
26899
27178
  .on(moduleSelector, 'click' + eventNamespace, module.toggle.state)
@@ -27530,7 +27809,7 @@ $.fn.state.settings = {
27530
27809
  })( jQuery, window, document );
27531
27810
 
27532
27811
  /*!
27533
- * # Fomantic-UI 2.9.0-beta.29 - Visibility
27812
+ * # Fomantic-UI 2.9.0-beta.290+9631798 - Visibility
27534
27813
  * http://github.com/fomantic/Fomantic-UI/
27535
27814
  *
27536
27815
  *
@@ -27589,7 +27868,7 @@ $.fn.visibility = function(parameters) {
27589
27868
  $window = $(window),
27590
27869
 
27591
27870
  $module = $(this),
27592
- $context = $(settings.context),
27871
+ $context = [window,document].indexOf(settings.context) < 0 ? $(document).find(settings.context) : $(settings.context),
27593
27872
 
27594
27873
  $placeholder,
27595
27874