fomantic-ui 2.9.0-beta.28 → 2.9.0-beta.282

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 (313) hide show
  1. package/.all-contributorsrc +224 -3
  2. package/.github/workflows/ci.yml +7 -6
  3. package/.github/workflows/nightly.yml +13 -8
  4. package/.github/workflows/release.yml +31 -0
  5. package/CONTRIBUTORS.md +77 -37
  6. package/README.md +8 -8
  7. package/dist/components/accordion.css +175 -35
  8. package/dist/components/accordion.js +6 -3
  9. package/dist/components/accordion.min.css +2 -2
  10. package/dist/components/accordion.min.js +3 -3
  11. package/dist/components/ad.css +4 -4
  12. package/dist/components/ad.min.css +2 -2
  13. package/dist/components/api.js +88 -29
  14. package/dist/components/api.min.js +3 -3
  15. package/dist/components/breadcrumb.css +1 -1
  16. package/dist/components/breadcrumb.min.css +1 -1
  17. package/dist/components/button.css +195 -148
  18. package/dist/components/button.min.css +2 -2
  19. package/dist/components/calendar.css +18 -1
  20. package/dist/components/calendar.js +84 -67
  21. package/dist/components/calendar.min.css +2 -2
  22. package/dist/components/calendar.min.js +3 -3
  23. package/dist/components/card.css +753 -116
  24. package/dist/components/card.min.css +2 -2
  25. package/dist/components/checkbox.css +92 -91
  26. package/dist/components/checkbox.js +17 -11
  27. package/dist/components/checkbox.min.css +2 -2
  28. package/dist/components/checkbox.min.js +3 -3
  29. package/dist/components/comment.css +12 -12
  30. package/dist/components/comment.min.css +2 -2
  31. package/dist/components/container.css +97 -3
  32. package/dist/components/container.min.css +2 -2
  33. package/dist/components/dimmer.css +29 -14
  34. package/dist/components/dimmer.js +11 -5
  35. package/dist/components/dimmer.min.css +2 -2
  36. package/dist/components/dimmer.min.js +3 -3
  37. package/dist/components/divider.css +31 -31
  38. package/dist/components/divider.min.css +2 -2
  39. package/dist/components/dropdown.css +89 -49
  40. package/dist/components/dropdown.js +95 -49
  41. package/dist/components/dropdown.min.css +2 -2
  42. package/dist/components/dropdown.min.js +3 -3
  43. package/dist/components/embed.css +5 -5
  44. package/dist/components/embed.js +1 -1
  45. package/dist/components/embed.min.css +2 -2
  46. package/dist/components/embed.min.js +3 -3
  47. package/dist/components/emoji.css +10840 -8832
  48. package/dist/components/emoji.min.css +1 -1
  49. package/dist/components/feed.css +29 -29
  50. package/dist/components/feed.min.css +2 -2
  51. package/dist/components/flag.css +1001 -892
  52. package/dist/components/flag.min.css +2 -2
  53. package/dist/components/form.css +158 -81
  54. package/dist/components/form.js +38 -29
  55. package/dist/components/form.min.css +2 -2
  56. package/dist/components/form.min.js +3 -3
  57. package/dist/components/grid.css +25 -21
  58. package/dist/components/grid.min.css +2 -2
  59. package/dist/components/header.css +5 -3
  60. package/dist/components/header.min.css +2 -2
  61. package/dist/components/icon.css +2063 -1984
  62. package/dist/components/icon.min.css +2 -2
  63. package/dist/components/image.css +1 -1
  64. package/dist/components/image.min.css +1 -1
  65. package/dist/components/input.css +758 -21
  66. package/dist/components/input.min.css +2 -2
  67. package/dist/components/item.css +16 -16
  68. package/dist/components/item.min.css +2 -2
  69. package/dist/components/label.css +64 -64
  70. package/dist/components/label.min.css +2 -2
  71. package/dist/components/list.css +30 -30
  72. package/dist/components/list.min.css +2 -2
  73. package/dist/components/loader.css +352 -352
  74. package/dist/components/loader.min.css +2 -2
  75. package/dist/components/menu.css +107 -75
  76. package/dist/components/menu.min.css +1 -1
  77. package/dist/components/message.css +42 -42
  78. package/dist/components/message.min.css +2 -2
  79. package/dist/components/modal.css +13 -1
  80. package/dist/components/modal.js +127 -49
  81. package/dist/components/modal.min.css +2 -2
  82. package/dist/components/modal.min.js +3 -3
  83. package/dist/components/nag.css +1 -1
  84. package/dist/components/nag.js +1 -1
  85. package/dist/components/nag.min.css +1 -1
  86. package/dist/components/nag.min.js +3 -3
  87. package/dist/components/placeholder.css +33 -33
  88. package/dist/components/placeholder.min.css +2 -2
  89. package/dist/components/popup.css +99 -103
  90. package/dist/components/popup.js +2 -2
  91. package/dist/components/popup.min.css +2 -2
  92. package/dist/components/popup.min.js +3 -3
  93. package/dist/components/progress.css +1 -1
  94. package/dist/components/progress.js +4 -1
  95. package/dist/components/progress.min.css +1 -1
  96. package/dist/components/progress.min.js +3 -3
  97. package/dist/components/rail.css +1 -1
  98. package/dist/components/rail.min.css +1 -1
  99. package/dist/components/rating.css +1 -1
  100. package/dist/components/rating.js +1 -1
  101. package/dist/components/rating.min.css +1 -1
  102. package/dist/components/rating.min.js +3 -3
  103. package/dist/components/reset.css +5 -4
  104. package/dist/components/reset.min.css +2 -2
  105. package/dist/components/reveal.css +1 -1
  106. package/dist/components/reveal.min.css +1 -1
  107. package/dist/components/search.css +3 -3
  108. package/dist/components/search.js +2 -2
  109. package/dist/components/search.min.css +2 -2
  110. package/dist/components/search.min.js +3 -3
  111. package/dist/components/segment.css +118 -34
  112. package/dist/components/segment.min.css +2 -2
  113. package/dist/components/shape.css +1 -1
  114. package/dist/components/shape.js +3 -3
  115. package/dist/components/shape.min.css +1 -1
  116. package/dist/components/shape.min.js +3 -3
  117. package/dist/components/sidebar.css +7 -5
  118. package/dist/components/sidebar.js +12 -10
  119. package/dist/components/sidebar.min.css +2 -2
  120. package/dist/components/sidebar.min.js +3 -3
  121. package/dist/components/site.css +65 -39
  122. package/dist/components/site.js +1 -1
  123. package/dist/components/site.min.css +2 -2
  124. package/dist/components/site.min.js +3 -3
  125. package/dist/components/slider.css +17 -17
  126. package/dist/components/slider.js +68 -51
  127. package/dist/components/slider.min.css +1 -1
  128. package/dist/components/slider.min.js +3 -3
  129. package/dist/components/state.js +1 -1
  130. package/dist/components/state.min.js +3 -3
  131. package/dist/components/statistic.css +2 -2
  132. package/dist/components/statistic.min.css +2 -2
  133. package/dist/components/step.css +30 -30
  134. package/dist/components/step.min.css +2 -2
  135. package/dist/components/sticky.css +1 -1
  136. package/dist/components/sticky.js +1 -1
  137. package/dist/components/sticky.min.css +1 -1
  138. package/dist/components/sticky.min.js +3 -3
  139. package/dist/components/tab.css +5 -5
  140. package/dist/components/tab.js +23 -5
  141. package/dist/components/tab.min.css +2 -2
  142. package/dist/components/tab.min.js +3 -3
  143. package/dist/components/table.css +1174 -32
  144. package/dist/components/table.min.css +2 -2
  145. package/dist/components/text.css +1 -1
  146. package/dist/components/text.min.css +1 -1
  147. package/dist/components/toast.css +39 -1
  148. package/dist/components/toast.js +56 -28
  149. package/dist/components/toast.min.css +2 -2
  150. package/dist/components/toast.min.js +3 -3
  151. package/dist/components/transition.css +1 -1
  152. package/dist/components/transition.js +21 -16
  153. package/dist/components/transition.min.css +1 -1
  154. package/dist/components/transition.min.js +3 -3
  155. package/dist/components/visibility.js +1 -1
  156. package/dist/components/visibility.min.js +3 -3
  157. package/dist/semantic.css +19523 -13089
  158. package/dist/semantic.js +666 -369
  159. package/dist/semantic.min.css +3 -3
  160. package/dist/semantic.min.js +3 -3
  161. package/dist/themes/default/assets/fonts/brand-icons.eot +0 -0
  162. package/dist/themes/default/assets/fonts/brand-icons.svg +801 -654
  163. package/dist/themes/default/assets/fonts/brand-icons.ttf +0 -0
  164. package/dist/themes/default/assets/fonts/brand-icons.woff +0 -0
  165. package/dist/themes/default/assets/fonts/brand-icons.woff2 +0 -0
  166. package/dist/themes/default/assets/fonts/icons.eot +0 -0
  167. package/dist/themes/default/assets/fonts/icons.svg +1175 -1079
  168. package/dist/themes/default/assets/fonts/icons.ttf +0 -0
  169. package/dist/themes/default/assets/fonts/icons.woff +0 -0
  170. package/dist/themes/default/assets/fonts/icons.woff2 +0 -0
  171. package/dist/themes/default/assets/fonts/outline-icons.eot +0 -0
  172. package/dist/themes/default/assets/fonts/outline-icons.svg +93 -95
  173. package/dist/themes/default/assets/fonts/outline-icons.ttf +0 -0
  174. package/dist/themes/default/assets/fonts/outline-icons.woff +0 -0
  175. package/dist/themes/default/assets/fonts/outline-icons.woff2 +0 -0
  176. package/examples/assets/library/iframe-content.js +8 -8
  177. package/examples/assets/library/iframe.js +3 -3
  178. package/package.json +18 -16
  179. package/scripts/nightly-version.js +47 -38
  180. package/src/definitions/behaviors/api.js +87 -28
  181. package/src/definitions/behaviors/form.js +37 -28
  182. package/src/definitions/collections/form.less +225 -161
  183. package/src/definitions/collections/grid.less +723 -687
  184. package/src/definitions/collections/menu.less +224 -166
  185. package/src/definitions/collections/message.less +49 -47
  186. package/src/definitions/collections/table.less +855 -268
  187. package/src/definitions/elements/button.less +611 -469
  188. package/src/definitions/elements/container.less +145 -8
  189. package/src/definitions/elements/divider.less +24 -24
  190. package/src/definitions/elements/emoji.less +16 -10
  191. package/src/definitions/elements/flag.less +8 -18
  192. package/src/definitions/elements/header.less +46 -37
  193. package/src/definitions/elements/icon.less +39 -32
  194. package/src/definitions/elements/input.less +268 -26
  195. package/src/definitions/elements/label.less +125 -124
  196. package/src/definitions/elements/list.less +84 -75
  197. package/src/definitions/elements/loader.less +99 -98
  198. package/src/definitions/elements/placeholder.less +32 -32
  199. package/src/definitions/elements/segment.less +174 -55
  200. package/src/definitions/elements/step.less +76 -72
  201. package/src/definitions/elements/text.less +17 -15
  202. package/src/definitions/globals/reset.less +2 -2
  203. package/src/definitions/globals/site.less +23 -2
  204. package/src/definitions/modules/accordion.js +5 -2
  205. package/src/definitions/modules/accordion.less +181 -29
  206. package/src/definitions/modules/calendar.js +83 -66
  207. package/src/definitions/modules/calendar.less +20 -0
  208. package/src/definitions/modules/checkbox.js +16 -10
  209. package/src/definitions/modules/checkbox.less +83 -227
  210. package/src/definitions/modules/dimmer.js +10 -4
  211. package/src/definitions/modules/dimmer.less +21 -8
  212. package/src/definitions/modules/dropdown.js +94 -48
  213. package/src/definitions/modules/dropdown.less +178 -127
  214. package/src/definitions/modules/embed.less +4 -4
  215. package/src/definitions/modules/modal.js +126 -48
  216. package/src/definitions/modules/modal.less +12 -0
  217. package/src/definitions/modules/nag.less +20 -19
  218. package/src/definitions/modules/popup.js +1 -1
  219. package/src/definitions/modules/popup.less +86 -90
  220. package/src/definitions/modules/progress.js +3 -0
  221. package/src/definitions/modules/progress.less +19 -18
  222. package/src/definitions/modules/rating.less +35 -34
  223. package/src/definitions/modules/search.js +1 -1
  224. package/src/definitions/modules/search.less +35 -19
  225. package/src/definitions/modules/shape.js +2 -2
  226. package/src/definitions/modules/sidebar.js +11 -9
  227. package/src/definitions/modules/sidebar.less +36 -22
  228. package/src/definitions/modules/slider.js +67 -50
  229. package/src/definitions/modules/slider.less +48 -47
  230. package/src/definitions/modules/tab.js +22 -4
  231. package/src/definitions/modules/tab.less +4 -4
  232. package/src/definitions/modules/toast.js +55 -27
  233. package/src/definitions/modules/toast.less +48 -16
  234. package/src/definitions/modules/transition.js +20 -15
  235. package/src/definitions/views/ad.less +3 -3
  236. package/src/definitions/views/card.less +519 -374
  237. package/src/definitions/views/comment.less +93 -82
  238. package/src/definitions/views/feed.less +164 -144
  239. package/src/definitions/views/item.less +251 -198
  240. package/src/definitions/views/statistic.less +91 -89
  241. package/src/themes/basic/elements/icon.overrides +149 -149
  242. package/src/themes/basic/elements/step.overrides +2 -2
  243. package/src/themes/bookish/elements/header.overrides +1 -1
  244. package/src/themes/chubby/elements/button.overrides +1 -1
  245. package/src/themes/chubby/elements/header.overrides +1 -1
  246. package/src/themes/default/assets/fonts/brand-icons.eot +0 -0
  247. package/src/themes/default/assets/fonts/brand-icons.svg +801 -654
  248. package/src/themes/default/assets/fonts/brand-icons.ttf +0 -0
  249. package/src/themes/default/assets/fonts/brand-icons.woff +0 -0
  250. package/src/themes/default/assets/fonts/brand-icons.woff2 +0 -0
  251. package/src/themes/default/assets/fonts/icons.eot +0 -0
  252. package/src/themes/default/assets/fonts/icons.svg +1175 -1079
  253. package/src/themes/default/assets/fonts/icons.ttf +0 -0
  254. package/src/themes/default/assets/fonts/icons.woff +0 -0
  255. package/src/themes/default/assets/fonts/icons.woff2 +0 -0
  256. package/src/themes/default/assets/fonts/outline-icons.eot +0 -0
  257. package/src/themes/default/assets/fonts/outline-icons.svg +93 -95
  258. package/src/themes/default/assets/fonts/outline-icons.ttf +0 -0
  259. package/src/themes/default/assets/fonts/outline-icons.woff +0 -0
  260. package/src/themes/default/assets/fonts/outline-icons.woff2 +0 -0
  261. package/src/themes/default/collections/form.variables +4 -0
  262. package/src/themes/default/collections/menu.variables +6 -0
  263. package/src/themes/default/collections/table.variables +52 -0
  264. package/src/themes/default/elements/button.variables +7 -1
  265. package/src/themes/default/elements/container.variables +12 -0
  266. package/src/themes/default/elements/divider.overrides +7 -7
  267. package/src/themes/default/elements/emoji.overrides +1737 -1235
  268. package/src/themes/default/elements/emoji.variables +1 -1
  269. package/src/themes/default/elements/flag.overrides +1641 -986
  270. package/src/themes/default/elements/flag.variables +7 -5
  271. package/src/themes/default/elements/icon.overrides +1975 -1949
  272. package/src/themes/default/elements/icon.variables +1 -0
  273. package/src/themes/default/elements/input.variables +15 -0
  274. package/src/themes/default/elements/segment.variables +8 -0
  275. package/src/themes/default/elements/step.overrides +3 -3
  276. package/src/themes/default/globals/site.variables +6 -0
  277. package/src/themes/default/globals/variation.variables +140 -6
  278. package/src/themes/default/modules/accordion.overrides +6 -5
  279. package/src/themes/default/modules/accordion.variables +49 -2
  280. package/src/themes/default/modules/calendar.variables +3 -0
  281. package/src/themes/default/modules/checkbox.overrides +9 -9
  282. package/src/themes/default/modules/checkbox.variables +5 -5
  283. package/src/themes/default/modules/dimmer.variables +1 -1
  284. package/src/themes/default/modules/dropdown.overrides +5 -5
  285. package/src/themes/default/modules/dropdown.variables +4 -10
  286. package/src/themes/default/modules/modal.variables +13 -0
  287. package/src/themes/default/modules/popup.variables +0 -2
  288. package/src/themes/default/modules/toast.variables +3 -0
  289. package/src/themes/default/views/card.variables +8 -0
  290. package/src/themes/famfamfam/elements/flag.overrides +1026 -0
  291. package/src/themes/famfamfam/elements/flag.variables +13 -0
  292. package/src/themes/github/elements/icon.overrides +206 -206
  293. package/src/themes/github/elements/step.overrides +5 -5
  294. package/src/themes/github/modules/dropdown.overrides +6 -6
  295. package/src/themes/instagram/views/card.overrides +1 -1
  296. package/src/themes/joypixels/elements/emoji.overrides +1762 -1260
  297. package/src/themes/joypixels/elements/emoji.variables +1 -1
  298. package/src/themes/material/collections/menu.overrides +1 -1
  299. package/src/themes/material/elements/button.overrides +1 -1
  300. package/src/themes/material/elements/header.overrides +1 -1
  301. package/src/themes/material/elements/icon.overrides +932 -932
  302. package/src/themes/material/globals/site.variables +0 -1
  303. package/src/themes/material/modules/dropdown.overrides +1 -1
  304. package/src/themes/material/modules/modal.overrides +1 -1
  305. package/src/themes/pulsar/elements/loader.overrides +2 -2
  306. package/src/themes/resetcss/globals/reset.overrides +3 -3
  307. package/src/themes/rtl/globals/site.overrides +1 -1
  308. package/src/themes/striped/modules/progress.overrides +1 -1
  309. package/src/themes/twitter/elements/emoji.overrides +1737 -1235
  310. package/tasks/build/css.js +6 -1
  311. package/tasks/config/project/install.js +15 -13
  312. package/tasks/install.js +1 -0
  313. package/test/helpers/sinon.js +2 -2
package/dist/semantic.js CHANGED
@@ -1,15 +1,15 @@
1
1
  /*
2
- * # Fomantic UI - 2.9.0-beta.28
2
+ * # Fomantic UI - 2.9.0-beta.282+54be6de
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.28 - Site
12
+ * # Fomantic-UI 2.9.0-beta.282+54be6de - 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.28 - Form Validation
506
+ * # Fomantic-UI 2.9.0-beta.282+54be6de - 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,7 +1718,7 @@ $.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
1724
  focusElement = $(settings.errorFocus);
@@ -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.28 - Accordion
2587
+ * # Fomantic-UI 2.9.0-beta.282+54be6de - 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.28 - Calendar
3209
+ * # Fomantic-UI 2.9.0-beta.282+54be6de - 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
@@ -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.28 - Checkbox
5098
+ * # Fomantic-UI 2.9.0-beta.282+54be6de - 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.28 - Dimmer
5981
+ * # Fomantic-UI 2.9.0-beta.282+54be6de - 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.28 - Dropdown
6744
+ * # Fomantic-UI 2.9.0-beta.282+54be6de - Dropdown
6704
6745
  * http://github.com/fomantic/Fomantic-UI/
6705
6746
  *
6706
6747
  *
@@ -6901,6 +6942,7 @@ $.fn.dropdown = function(parameters) {
6901
6942
  select: function() {
6902
6943
  if(module.has.input() && selectObserver) {
6903
6944
  selectObserver.observe($module[0], {
6945
+ attributes: true,
6904
6946
  childList : true,
6905
6947
  subtree : true
6906
6948
  });
@@ -6925,7 +6967,7 @@ $.fn.dropdown = function(parameters) {
6925
6967
 
6926
6968
  create: {
6927
6969
  id: function() {
6928
- id = (Math.random().toString(16) + '000000000').substr(2, 8);
6970
+ id = (Math.random().toString(16) + '000000000').slice(2, 10);
6929
6971
  elementNamespace = '.' + id;
6930
6972
  module.verbose('Creating unique id for element', id);
6931
6973
  },
@@ -7122,6 +7164,9 @@ $.fn.dropdown = function(parameters) {
7122
7164
  module.debug('Disabling dropdown');
7123
7165
  $module.addClass(className.disabled);
7124
7166
  }
7167
+ if($input.is('[required]')) {
7168
+ settings.forceSelection = true;
7169
+ }
7125
7170
  $input
7126
7171
  .removeAttr('required')
7127
7172
  .removeAttr('class')
@@ -7326,6 +7371,11 @@ $.fn.dropdown = function(parameters) {
7326
7371
  $module
7327
7372
  .on('change' + eventNamespace, selector.input, module.event.change)
7328
7373
  ;
7374
+ if(module.is.multiple() && module.is.searchSelection()) {
7375
+ $module
7376
+ .on('paste' + eventNamespace, selector.search, module.event.paste)
7377
+ ;
7378
+ }
7329
7379
  },
7330
7380
  mouseEvents: function() {
7331
7381
  module.verbose('Binding mouse events');
@@ -7545,7 +7595,7 @@ $.fn.dropdown = function(parameters) {
7545
7595
  var value = module.is.multiple() ? module.get.values() : module.get.value();
7546
7596
  if (value !== '') {
7547
7597
  module.verbose('Value(s) present after click icon, select value(s) in items');
7548
- module.set.selected(value, null, null, true);
7598
+ module.set.selected(value, null, true, true);
7549
7599
  }
7550
7600
  }
7551
7601
  iconClicked = false;
@@ -7745,7 +7795,7 @@ $.fn.dropdown = function(parameters) {
7745
7795
  menuConfig[fields.values] = values;
7746
7796
  module.setup.menu(menuConfig);
7747
7797
  $.each(values, function(index, item) {
7748
- if(item.selected == true) {
7798
+ if(item.selected === true) {
7749
7799
  module.debug('Setting initial selection to', item[fields.value]);
7750
7800
  module.set.selected(item[fields.value]);
7751
7801
  if(!module.is.multiple()) {
@@ -7774,6 +7824,15 @@ $.fn.dropdown = function(parameters) {
7774
7824
  },
7775
7825
 
7776
7826
  event: {
7827
+ paste: function(event) {
7828
+ var pasteValue = (event.originalEvent.clipboardData || window.clipboardData).getData('text'),
7829
+ tokens = pasteValue.split(settings.delimiter)
7830
+ ;
7831
+ tokens.forEach(function(value){
7832
+ module.set.selected(module.escape.htmlEntities(value.trim()), null, true, true);
7833
+ });
7834
+ event.preventDefault();
7835
+ },
7777
7836
  change: function() {
7778
7837
  if(!internalChange) {
7779
7838
  module.debug('Input changed, updating selection');
@@ -7986,8 +8045,8 @@ $.fn.dropdown = function(parameters) {
7986
8045
  },
7987
8046
  select: {
7988
8047
  mutation: function(mutations) {
7989
- module.debug('<select> modified, recreating menu');
7990
8048
  if(module.is.selectMutation(mutations)) {
8049
+ module.debug('<select> modified, recreating menu');
7991
8050
  module.disconnect.selectObserver();
7992
8051
  module.refresh();
7993
8052
  module.setup.select();
@@ -8082,7 +8141,7 @@ $.fn.dropdown = function(parameters) {
8082
8141
  module.remove.userAddition();
8083
8142
  }
8084
8143
  module.remove.searchTerm();
8085
- if(!module.is.focusedOnSearch() && !(skipRefocus == true)) {
8144
+ if(!module.is.focusedOnSearch() && skipRefocus !== true) {
8086
8145
  module.focusSearch(true);
8087
8146
  }
8088
8147
  }
@@ -8214,7 +8273,7 @@ $.fn.dropdown = function(parameters) {
8214
8273
  keydown: function(event) {
8215
8274
  var
8216
8275
  pressedKey = event.which,
8217
- isShortcutKey = module.is.inObject(pressedKey, keys)
8276
+ isShortcutKey = module.is.inObject(pressedKey, keys) || event.key === settings.delimiter
8218
8277
  ;
8219
8278
  if(isShortcutKey) {
8220
8279
  var
@@ -8232,7 +8291,7 @@ $.fn.dropdown = function(parameters) {
8232
8291
  hasSubMenu = ($subMenu.length> 0),
8233
8292
  hasSelectedItem = ($selectedItem.length > 0),
8234
8293
  selectedIsSelectable = ($selectedItem.not(selector.unselectable).length > 0),
8235
- delimiterPressed = (pressedKey == keys.delimiter && settings.allowAdditions && module.is.multiple()),
8294
+ delimiterPressed = (event.key === settings.delimiter && module.is.multiple()),
8236
8295
  isAdditionWithoutMenu = (settings.allowAdditions && settings.hideAdditions && (pressedKey == keys.enter || delimiterPressed) && selectedIsSelectable),
8237
8296
  $nextItem,
8238
8297
  isSubMenuItem,
@@ -8330,7 +8389,7 @@ $.fn.dropdown = function(parameters) {
8330
8389
  .addClass(className.selected)
8331
8390
  ;
8332
8391
  module.set.scrollPosition($nextItem);
8333
- if(settings.selectOnKeydown && module.is.single()) {
8392
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
8334
8393
  module.set.selectedItem($nextItem);
8335
8394
  }
8336
8395
  }
@@ -8357,7 +8416,7 @@ $.fn.dropdown = function(parameters) {
8357
8416
  .addClass(className.selected)
8358
8417
  ;
8359
8418
  module.set.scrollPosition($nextItem);
8360
- if(settings.selectOnKeydown && module.is.single()) {
8419
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
8361
8420
  module.set.selectedItem($nextItem);
8362
8421
  }
8363
8422
  }
@@ -8488,7 +8547,7 @@ $.fn.dropdown = function(parameters) {
8488
8547
  ;
8489
8548
  if( module.can.activate( $(element) ) ) {
8490
8549
  module.set.selected(value, $(element));
8491
- if(!module.is.multiple()) {
8550
+ if(!module.is.multiple() && !(!settings.collapseOnActionable && $(element).hasClass(className.actionable))) {
8492
8551
  module.hideAndClear();
8493
8552
  }
8494
8553
  }
@@ -8501,7 +8560,7 @@ $.fn.dropdown = function(parameters) {
8501
8560
  ;
8502
8561
  if( module.can.activate( $(element) ) ) {
8503
8562
  module.set.value(value, text, $(element));
8504
- if(!module.is.multiple()) {
8563
+ if(!module.is.multiple() && !(!settings.collapseOnActionable && $(element).hasClass(className.actionable))) {
8505
8564
  module.hideAndClear();
8506
8565
  }
8507
8566
  }
@@ -8552,7 +8611,7 @@ $.fn.dropdown = function(parameters) {
8552
8611
  ;
8553
8612
  $sizer.text(value);
8554
8613
  // prevent rounding issues
8555
- return Math.ceil( $sizer.width() + 1);
8614
+ return Math.ceil( $sizer.width() + (module.is.edge() ? 3 : 1));
8556
8615
  },
8557
8616
  selectionCount: function() {
8558
8617
  var
@@ -9021,7 +9080,7 @@ $.fn.dropdown = function(parameters) {
9021
9080
  module.error(error.noStorage);
9022
9081
  return;
9023
9082
  }
9024
- name = sessionStorage.getItem(value);
9083
+ name = sessionStorage.getItem(value + elementNamespace);
9025
9084
  return (name !== undefined)
9026
9085
  ? name
9027
9086
  : false
@@ -9065,7 +9124,7 @@ $.fn.dropdown = function(parameters) {
9065
9124
  return;
9066
9125
  }
9067
9126
  module.verbose('Saving remote data to session storage', value, name);
9068
- sessionStorage.setItem(value, name);
9127
+ sessionStorage.setItem(value + elementNamespace, name);
9069
9128
  }
9070
9129
  },
9071
9130
 
@@ -9125,7 +9184,7 @@ $.fn.dropdown = function(parameters) {
9125
9184
  $nextSelectedItem
9126
9185
  .addClass(className.selected)
9127
9186
  ;
9128
- if(settings.selectOnKeydown && module.is.single()) {
9187
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
9129
9188
  module.set.selectedItem($nextSelectedItem);
9130
9189
  }
9131
9190
  $menu
@@ -9211,7 +9270,7 @@ $.fn.dropdown = function(parameters) {
9211
9270
  var
9212
9271
  length = module.get.query().length
9213
9272
  ;
9214
- $search.val( text.substr(0, length));
9273
+ $search.val( text.slice(0, length));
9215
9274
  },
9216
9275
  scrollPosition: function($item, forceScroll) {
9217
9276
  var
@@ -9328,13 +9387,13 @@ $.fn.dropdown = function(parameters) {
9328
9387
  module.set.scrollPosition($nextValue);
9329
9388
  $selectedItem.removeClass(className.selected);
9330
9389
  $nextValue.addClass(className.selected);
9331
- if(settings.selectOnKeydown && module.is.single()) {
9390
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
9332
9391
  module.set.selectedItem($nextValue);
9333
9392
  }
9334
9393
  }
9335
9394
  },
9336
9395
  direction: function($menu) {
9337
- if(settings.direction == 'auto') {
9396
+ if(settings.direction === 'auto') {
9338
9397
  // reset position, remove upward if it's base menu
9339
9398
  if (!$menu) {
9340
9399
  module.remove.upward();
@@ -9353,7 +9412,7 @@ $.fn.dropdown = function(parameters) {
9353
9412
  module.set.leftward($menu);
9354
9413
  }
9355
9414
  }
9356
- else if(settings.direction == 'upward') {
9415
+ else if(settings.direction === 'upward') {
9357
9416
  module.set.upward($menu);
9358
9417
  }
9359
9418
  },
@@ -9366,6 +9425,11 @@ $.fn.dropdown = function(parameters) {
9366
9425
  $element.addClass(className.leftward);
9367
9426
  },
9368
9427
  value: function(value, text, $selected, preventChangeTrigger) {
9428
+ if(typeof text === 'boolean') {
9429
+ preventChangeTrigger = text;
9430
+ $selected = undefined;
9431
+ text = undefined;
9432
+ }
9369
9433
  if(value !== undefined && value !== '' && !(Array.isArray(value) && value.length === 0)) {
9370
9434
  $input.removeClass(className.noselection);
9371
9435
  } else {
@@ -9429,12 +9493,21 @@ $.fn.dropdown = function(parameters) {
9429
9493
  visible: function() {
9430
9494
  $module.addClass(className.visible);
9431
9495
  },
9432
- exactly: function(value, $selectedItem) {
9496
+ exactly: function(value, $selectedItem, preventChangeTrigger) {
9497
+ if(typeof $selectedItem === 'boolean') {
9498
+ preventChangeTrigger = $selectedItem;
9499
+ $selectedItem = undefined;
9500
+ }
9433
9501
  module.debug('Setting selected to exact values');
9434
9502
  module.clear();
9435
- module.set.selected(value, $selectedItem);
9503
+ module.set.selected(value, $selectedItem, preventChangeTrigger);
9436
9504
  },
9437
9505
  selected: function(value, $selectedItem, preventChangeTrigger, keepSearchTerm) {
9506
+ if(typeof $selectedItem === 'boolean') {
9507
+ keepSearchTerm = preventChangeTrigger;
9508
+ preventChangeTrigger = $selectedItem;
9509
+ $selectedItem = undefined;
9510
+ }
9438
9511
  var
9439
9512
  isMultiple = module.is.multiple()
9440
9513
  ;
@@ -9466,23 +9539,30 @@ $.fn.dropdown = function(parameters) {
9466
9539
 
9467
9540
  isFiltered = $selected.hasClass(className.filtered),
9468
9541
  isActive = $selected.hasClass(className.active),
9542
+ isActionable = $selected.hasClass(className.actionable),
9469
9543
  isUserValue = $selected.hasClass(className.addition),
9470
- shouldAnimate = (isMultiple && $selectedItem.length == 1)
9544
+ shouldAnimate = (isMultiple && $selectedItem && $selectedItem.length === 1)
9471
9545
  ;
9472
- if(isMultiple) {
9546
+ if(isActionable){
9547
+ if((!isMultiple || (!isActive || isUserValue)) && settings.apiSettings && settings.saveRemoteData) {
9548
+ module.save.remoteData(selectedText, selectedValue);
9549
+ }
9550
+ settings.onActionable.call(element, selectedValue, selectedText, $selected);
9551
+ }
9552
+ else if(isMultiple) {
9473
9553
  if(!isActive || isUserValue) {
9474
9554
  if(settings.apiSettings && settings.saveRemoteData) {
9475
9555
  module.save.remoteData(selectedText, selectedValue);
9476
9556
  }
9477
9557
  if(settings.useLabels) {
9558
+ module.add.value(selectedValue, selectedText, $selected, preventChangeTrigger);
9478
9559
  module.add.label(selectedValue, selectedText, shouldAnimate);
9479
- module.add.value(selectedValue, selectedText, $selected);
9480
9560
  module.set.activeItem($selected);
9481
9561
  module.filterActive();
9482
9562
  module.select.nextAvailable($selectedItem);
9483
9563
  }
9484
9564
  else {
9485
- module.add.value(selectedValue, selectedText, $selected);
9565
+ module.add.value(selectedValue, selectedText, $selected, preventChangeTrigger);
9486
9566
  module.set.text(module.add.variables(message.count));
9487
9567
  module.set.activeItem($selected);
9488
9568
  }
@@ -9496,7 +9576,7 @@ $.fn.dropdown = function(parameters) {
9496
9576
  if(settings.apiSettings && settings.saveRemoteData) {
9497
9577
  module.save.remoteData(selectedText, selectedValue);
9498
9578
  }
9499
- if (!keepSearchTerm) {
9579
+ if (!keepSearchTerm && !$selected.hasClass(className.actionable)) {
9500
9580
  module.set.text(selectedText);
9501
9581
  }
9502
9582
  module.set.value(selectedValue, selectedText, $selected, preventChangeTrigger);
@@ -9671,7 +9751,12 @@ $.fn.dropdown = function(parameters) {
9671
9751
  }
9672
9752
  return message;
9673
9753
  },
9674
- value: function(addedValue, addedText, $selectedItem) {
9754
+ value: function(addedValue, addedText, $selectedItem, preventChangeTrigger) {
9755
+ if(typeof addedText === 'boolean') {
9756
+ preventChangeTrigger = addedText;
9757
+ $selectedItem = undefined;
9758
+ addedText = undefined;
9759
+ }
9675
9760
  var
9676
9761
  currentValue = module.get.values(true),
9677
9762
  newValue
@@ -9686,7 +9771,7 @@ $.fn.dropdown = function(parameters) {
9686
9771
  }
9687
9772
  // extend current array
9688
9773
  if(Array.isArray(currentValue)) {
9689
- newValue = currentValue.concat([addedValue]);
9774
+ newValue = $selectedItem && $selectedItem.hasClass(className.actionable) ? currentValue : currentValue.concat([addedValue]);
9690
9775
  newValue = module.get.uniqueArray(newValue);
9691
9776
  }
9692
9777
  else {
@@ -9710,7 +9795,7 @@ $.fn.dropdown = function(parameters) {
9710
9795
  else {
9711
9796
  settings.onAdd.call(element, addedValue, addedText, $selectedItem);
9712
9797
  }
9713
- module.set.value(newValue, addedText, $selectedItem);
9798
+ module.set.value(newValue, addedText, $selectedItem, preventChangeTrigger);
9714
9799
  module.check.maxSelections();
9715
9800
  },
9716
9801
  },
@@ -9770,18 +9855,10 @@ $.fn.dropdown = function(parameters) {
9770
9855
  return;
9771
9856
  }
9772
9857
  // temporarily disconnect observer
9773
- if(selectObserver) {
9774
- selectObserver.disconnect();
9775
- module.verbose('Temporarily disconnecting mutation observer');
9776
- }
9858
+ module.disconnect.selectObserver();
9777
9859
  $option.remove();
9778
9860
  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
- }
9861
+ module.observe.select();
9785
9862
  },
9786
9863
  message: function() {
9787
9864
  $menu.children(selector.message).remove();
@@ -10080,8 +10157,11 @@ $.fn.dropdown = function(parameters) {
10080
10157
  bubbledIconClick: function(event) {
10081
10158
  return $(event.target).closest($icon).length > 0;
10082
10159
  },
10160
+ edge: function() {
10161
+ return !!window.chrome && !!window.StyleMedia;
10162
+ },
10083
10163
  chrome: function() {
10084
- return !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);
10164
+ return !!window.chrome && !window.StyleMedia;
10085
10165
  },
10086
10166
  alreadySetup: function() {
10087
10167
  return ($module.is('select') && $module.parent(selector.dropdown).data(moduleNamespace) !== undefined && $module.prev().length === 0);
@@ -10146,7 +10226,7 @@ $.fn.dropdown = function(parameters) {
10146
10226
  selectChanged = false
10147
10227
  ;
10148
10228
  $.each(mutations, function(index, mutation) {
10149
- if($(mutation.target).is('select') || $(mutation.addedNodes).is('select')) {
10229
+ if($(mutation.target).is('select, option, optgroup') || $(mutation.addedNodes).is('select')) {
10150
10230
  selectChanged = true;
10151
10231
  return false;
10152
10232
  }
@@ -10691,7 +10771,7 @@ $.fn.dropdown.settings = {
10691
10771
  keepOnScreen : true, // Whether dropdown should check whether it is on screen before showing
10692
10772
 
10693
10773
  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)
10774
+ fullTextSearch : 'exact', // search anywhere in value (set to 'exact' to require exact matches)
10695
10775
  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
10776
  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
10777
 
@@ -10699,7 +10779,7 @@ $.fn.dropdown.settings = {
10699
10779
  preserveHTML : true, // preserve html when selecting value
10700
10780
  sortSelect : false, // sort selection on init
10701
10781
 
10702
- forceSelection : true, // force a choice on blur with search selection
10782
+ forceSelection : false, // force a choice on blur with search selection
10703
10783
 
10704
10784
  allowAdditions : false, // whether multiple select should allow user added values
10705
10785
  ignoreCase : false, // whether to consider case sensitivity when creating labels
@@ -10710,7 +10790,7 @@ $.fn.dropdown.settings = {
10710
10790
  useLabels : true, // whether multiple select should filter currently active selections from choices
10711
10791
  delimiter : ',', // when multiselect uses normal <input> the values will be delimited with this character
10712
10792
 
10713
- showOnFocus : true, // show menu on focus
10793
+ showOnFocus : false, // show menu on focus
10714
10794
  allowReselection : false, // whether current value should trigger callbacks when reselected
10715
10795
  allowTab : true, // add tabindex to element
10716
10796
  allowCategorySelection : false, // allow elements with sub-menus to be selected
@@ -10725,6 +10805,8 @@ $.fn.dropdown.settings = {
10725
10805
 
10726
10806
  headerDivider : true, // whether option headers should have an additional divider line underneath when converted from <select> <optgroup>
10727
10807
 
10808
+ collapseOnActionable : true, // whether the dropdown should collapse upon selection of an actionable item
10809
+
10728
10810
  // label settings on multi-select
10729
10811
  label: {
10730
10812
  transition : 'scale',
@@ -10744,6 +10826,7 @@ $.fn.dropdown.settings = {
10744
10826
  onChange : function(value, text, $selected){},
10745
10827
  onAdd : function(value, text, $selected){},
10746
10828
  onRemove : function(value, text, $selected){},
10829
+ onActionable : function(value, text, $selected){},
10747
10830
  onSearch : function(searchTerm){},
10748
10831
 
10749
10832
  onLabelSelect : function($selectedLabels){},
@@ -10806,12 +10889,12 @@ $.fn.dropdown.settings = {
10806
10889
  icon : 'icon', // optional icon name
10807
10890
  iconClass : 'iconClass', // optional individual class for icon (for example to use flag instead)
10808
10891
  class : 'class', // optional individual class for item/header
10809
- divider : 'divider' // optional divider append for group headers
10892
+ divider : 'divider', // optional divider append for group headers
10893
+ actionable : 'actionable' // optional actionable item
10810
10894
  },
10811
10895
 
10812
10896
  keys : {
10813
10897
  backspace : 8,
10814
- delimiter : 188, // comma
10815
10898
  deleteKey : 46,
10816
10899
  enter : 13,
10817
10900
  escape : 27,
@@ -10878,7 +10961,8 @@ $.fn.dropdown.settings = {
10878
10961
  header : 'header',
10879
10962
  divider : 'divider',
10880
10963
  groupIcon : '',
10881
- unfilterable : 'unfilterable'
10964
+ unfilterable : 'unfilterable',
10965
+ actionable : 'actionable'
10882
10966
  }
10883
10967
 
10884
10968
  };
@@ -10953,6 +11037,9 @@ $.fn.dropdown.settings.templates = {
10953
11037
  maybeText = (option[fields.text])
10954
11038
  ? ' data-text="' + deQuote(option[fields.text],true) + '"'
10955
11039
  : '',
11040
+ maybeActionable = (option[fields.actionable])
11041
+ ? className.actionable+' '
11042
+ : '',
10956
11043
  maybeDisabled = (option[fields.disabled])
10957
11044
  ? className.disabled+' '
10958
11045
  : '',
@@ -10961,7 +11048,7 @@ $.fn.dropdown.settings.templates = {
10961
11048
  : '',
10962
11049
  hasDescription = (escape(option[fields.description] || '', preserveHTML) != '')
10963
11050
  ;
10964
- html += '<div class="'+ maybeDisabled + maybeDescriptionVertical + (option[fields.class] ? deQuote(option[fields.class]) : className.item)+'" data-value="' + deQuote(option[fields.value],true) + '"' + maybeText + '>';
11051
+ html += '<div class="'+ maybeActionable + maybeDisabled + maybeDescriptionVertical + (option[fields.class] ? deQuote(option[fields.class]) : className.item)+'" data-value="' + deQuote(option[fields.value],true) + '"' + maybeText + '>';
10965
11052
  if (isMenu) {
10966
11053
  html += '<i class="'+ (itemType.indexOf('left') !== -1 ? 'left' : '') + ' dropdown icon"></i>';
10967
11054
  }
@@ -11031,7 +11118,7 @@ $.fn.dropdown.settings.templates = {
11031
11118
  })( jQuery, window, document );
11032
11119
 
11033
11120
  /*!
11034
- * # Fomantic-UI 2.9.0-beta.28 - Embed
11121
+ * # Fomantic-UI 2.9.0-beta.282+54be6de - Embed
11035
11122
  * http://github.com/fomantic/Fomantic-UI/
11036
11123
  *
11037
11124
  *
@@ -11741,7 +11828,7 @@ $.fn.embed.settings = {
11741
11828
  })( jQuery, window, document );
11742
11829
 
11743
11830
  /*!
11744
- * # Fomantic-UI 2.9.0-beta.28 - Modal
11831
+ * # Fomantic-UI 2.9.0-beta.282+54be6de - Modal
11745
11832
  * http://github.com/fomantic/Fomantic-UI/
11746
11833
  *
11747
11834
  *
@@ -11808,7 +11895,8 @@ $.fn.modal = function(parameters) {
11808
11895
 
11809
11896
  $module = $(this),
11810
11897
  $context = $(settings.context),
11811
- $close = $module.find(selector.close),
11898
+ $closeIcon = $module.find(selector.closeIcon),
11899
+ $inputs,
11812
11900
 
11813
11901
  $allModals,
11814
11902
  $otherModals,
@@ -11834,6 +11922,7 @@ $.fn.modal = function(parameters) {
11834
11922
  module = {
11835
11923
 
11836
11924
  initialize: function() {
11925
+ module.create.id();
11837
11926
  if(!$module.hasClass('modal')) {
11838
11927
  module.create.modal();
11839
11928
  if(!$.isFunction(settings.onHidden)) {
@@ -11858,15 +11947,17 @@ $.fn.modal = function(parameters) {
11858
11947
  $actions.empty();
11859
11948
  }
11860
11949
  settings.actions.forEach(function (el) {
11861
- var icon = el[fields.icon] ? '<i class="' + module.helpers.deQuote(el[fields.icon]) + ' icon"></i>' : '',
11950
+ var icon = el[fields.icon] ? '<i '+(el[fields.text] ? 'aria-hidden="true"' : '')+' class="' + module.helpers.deQuote(el[fields.icon]) + ' icon"></i>' : '',
11862
11951
  text = module.helpers.escape(el[fields.text] || '', settings.preserveHTML),
11863
11952
  cls = module.helpers.deQuote(el[fields.class] || ''),
11864
11953
  click = el[fields.click] && $.isFunction(el[fields.click]) ? el[fields.click] : function () {};
11865
11954
  $actions.append($('<button/>', {
11866
11955
  html: icon + text,
11956
+ 'aria-label': $('<div>'+(el[fields.text] || el[fields.icon] || '')+'</div>').text(),
11867
11957
  class: className.button + ' ' + cls,
11868
11958
  click: function () {
11869
- if (click.call(element, $module) === false) {
11959
+ var button = $(this);
11960
+ if (button.is(selector.approve) || button.is(selector.deny) || click.call(element, $module) === false) {
11870
11961
  return;
11871
11962
  }
11872
11963
  module.hide();
@@ -11877,7 +11968,6 @@ $.fn.modal = function(parameters) {
11877
11968
  module.cache = {};
11878
11969
  module.verbose('Initializing dimmer', $context);
11879
11970
 
11880
- module.create.id();
11881
11971
  module.create.dimmer();
11882
11972
 
11883
11973
  if ( settings.allowMultiple ) {
@@ -11887,11 +11977,9 @@ $.fn.modal = function(parameters) {
11887
11977
  $module.addClass('top aligned');
11888
11978
  }
11889
11979
  module.refreshModals();
11890
-
11980
+ module.refreshInputs();
11891
11981
  module.bind.events();
11892
- if(settings.observeChanges) {
11893
- module.observeChanges();
11894
- }
11982
+ module.observeChanges();
11895
11983
  module.instantiate();
11896
11984
  if(settings.autoShow){
11897
11985
  module.show();
@@ -11908,16 +11996,20 @@ $.fn.modal = function(parameters) {
11908
11996
 
11909
11997
  create: {
11910
11998
  modal: function() {
11911
- $module = $('<div/>', {class: className.modal});
11999
+ $module = $('<div/>', {class: className.modal, role: 'dialog', 'aria-modal': true});
11912
12000
  if (settings.closeIcon) {
11913
- $close = $('<i/>', {class: className.close})
11914
- $module.append($close);
12001
+ $closeIcon = $('<i/>', {class: className.close, role: 'button', tabindex: 0, 'aria-label': settings.text.close})
12002
+ $module.append($closeIcon);
11915
12003
  }
11916
12004
  if (settings.title !== '') {
11917
- $('<div/>', {class: className.title}).appendTo($module);
12005
+ var titleId = '_' + module.get.id() + 'title';
12006
+ $module.attr('aria-labelledby', titleId);
12007
+ $('<div/>', {class: className.title, id: titleId}).appendTo($module);
11918
12008
  }
11919
12009
  if (settings.content !== '') {
11920
- $('<div/>', {class: className.content}).appendTo($module);
12010
+ var descId = '_' + module.get.id() + 'desc';
12011
+ $module.attr('aria-describedby', descId);
12012
+ $('<div/>', {class: className.content, id: descId}).appendTo($module);
11921
12013
  }
11922
12014
  if (module.has.configActions()) {
11923
12015
  $('<div/>', {class: className.actions}).appendTo($module);
@@ -11948,13 +12040,13 @@ $.fn.modal = function(parameters) {
11948
12040
  $dimmer = $dimmable.dimmer('get dimmer');
11949
12041
  },
11950
12042
  id: function() {
11951
- id = (Math.random().toString(16) + '000000000').substr(2, 8);
12043
+ id = (Math.random().toString(16) + '000000000').slice(2, 10);
11952
12044
  elementEventNamespace = '.' + id;
11953
12045
  module.verbose('Creating unique id for element', id);
11954
12046
  },
11955
12047
  innerDimmer: function() {
11956
- if ( $module.find(selector.dimmer).length == 0 ) {
11957
- $module.prepend('<div class="ui inverted dimmer"></div>');
12048
+ if ( $module.find(selector.dimmer).length === 0 ) {
12049
+ $('<div/>', {class: className.innerDimmer}).prependTo($module);
11958
12050
  }
11959
12051
  }
11960
12052
  },
@@ -11970,15 +12062,21 @@ $.fn.modal = function(parameters) {
11970
12062
  ;
11971
12063
  $window.off(elementEventNamespace);
11972
12064
  $dimmer.off(elementEventNamespace);
11973
- $close.off(eventNamespace);
12065
+ $closeIcon.off(elementEventNamespace);
12066
+ if($inputs) {
12067
+ $inputs.off(elementEventNamespace);
12068
+ }
11974
12069
  $context.dimmer('destroy');
11975
12070
  },
11976
12071
 
11977
12072
  observeChanges: function() {
11978
12073
  if('MutationObserver' in window) {
11979
12074
  observer = new MutationObserver(function(mutations) {
11980
- module.debug('DOM tree modified, refreshing');
11981
- module.refresh();
12075
+ if(settings.observeChanges) {
12076
+ module.debug('DOM tree modified, refreshing');
12077
+ module.refresh();
12078
+ }
12079
+ module.refreshInputs();
11982
12080
  });
11983
12081
  observer.observe(element, {
11984
12082
  childList : true,
@@ -12003,6 +12101,23 @@ $.fn.modal = function(parameters) {
12003
12101
  $allModals = $otherModals.add($module);
12004
12102
  },
12005
12103
 
12104
+ refreshInputs: function(){
12105
+ if($inputs){
12106
+ $inputs
12107
+ .off('keydown' + elementEventNamespace)
12108
+ ;
12109
+ }
12110
+ $inputs = $module.find('[tabindex], :input').filter(':visible').filter(function() {
12111
+ return $(this).closest('.disabled').length === 0;
12112
+ });
12113
+ $inputs.first()
12114
+ .on('keydown' + elementEventNamespace, module.event.inputKeyDown.first)
12115
+ ;
12116
+ $inputs.last()
12117
+ .on('keydown' + elementEventNamespace, module.event.inputKeyDown.last)
12118
+ ;
12119
+ },
12120
+
12006
12121
  attachEvents: function(selector, event) {
12007
12122
  var
12008
12123
  $toggle = $(selector)
@@ -12031,6 +12146,9 @@ $.fn.modal = function(parameters) {
12031
12146
  .on('click' + eventNamespace, selector.approve, module.event.approve)
12032
12147
  .on('click' + eventNamespace, selector.deny, module.event.deny)
12033
12148
  ;
12149
+ $closeIcon
12150
+ .on('keyup' + elementEventNamespace, module.event.closeKeyUp)
12151
+ ;
12034
12152
  $window
12035
12153
  .on('resize' + elementEventNamespace, module.event.resize)
12036
12154
  ;
@@ -12049,7 +12167,7 @@ $.fn.modal = function(parameters) {
12049
12167
 
12050
12168
  get: {
12051
12169
  id: function() {
12052
- return (Math.random().toString(16) + '000000000').substr(2, 8);
12170
+ return id;
12053
12171
  },
12054
12172
  element: function() {
12055
12173
  return $module;
@@ -12088,10 +12206,38 @@ $.fn.modal = function(parameters) {
12088
12206
  close: function() {
12089
12207
  module.hide();
12090
12208
  },
12209
+ closeKeyUp: function(event){
12210
+ var
12211
+ keyCode = event.which
12212
+ ;
12213
+ if ((keyCode === settings.keys.enter || keyCode === settings.keys.space) && $module.hasClass(className.front)) {
12214
+ module.hide();
12215
+ }
12216
+ },
12217
+ inputKeyDown: {
12218
+ first: function(event) {
12219
+ var
12220
+ keyCode = event.which
12221
+ ;
12222
+ if (keyCode === settings.keys.tab && event.shiftKey) {
12223
+ $inputs.last().focus();
12224
+ event.preventDefault();
12225
+ }
12226
+ },
12227
+ last: function(event) {
12228
+ var
12229
+ keyCode = event.which
12230
+ ;
12231
+ if (keyCode === settings.keys.tab && !event.shiftKey) {
12232
+ $inputs.first().focus();
12233
+ event.preventDefault();
12234
+ }
12235
+ }
12236
+ },
12091
12237
  mousedown: function(event) {
12092
12238
  var
12093
12239
  $target = $(event.target),
12094
- isRtl = module.is.rtl();
12240
+ isRtl = module.is.rtl()
12095
12241
  ;
12096
12242
  initialMouseDownInModal = ($target.closest(selector.modal).length > 0);
12097
12243
  if(initialMouseDownInModal) {
@@ -12139,10 +12285,9 @@ $.fn.modal = function(parameters) {
12139
12285
  },
12140
12286
  keyboard: function(event) {
12141
12287
  var
12142
- keyCode = event.which,
12143
- escapeKey = 27
12288
+ keyCode = event.which
12144
12289
  ;
12145
- if(keyCode == escapeKey) {
12290
+ if(keyCode === settings.keys.escape) {
12146
12291
  if(settings.closable) {
12147
12292
  module.debug('Escape key pressed hiding modal');
12148
12293
  if ( $module.hasClass(className.front) ) {
@@ -12198,6 +12343,10 @@ $.fn.modal = function(parameters) {
12198
12343
  : function(){}
12199
12344
  ;
12200
12345
  if( module.is.animating() || !module.is.active() ) {
12346
+ if(settings.onShow.call(element) === false) {
12347
+ module.verbose('Show callback returned false cancelling show');
12348
+ return;
12349
+ }
12201
12350
  module.showDimmer();
12202
12351
  module.cacheSizes();
12203
12352
  module.set.bodyMargin();
@@ -12227,7 +12376,6 @@ $.fn.modal = function(parameters) {
12227
12376
  $module.detach().appendTo($dimmer);
12228
12377
  }
12229
12378
  }
12230
- settings.onShow.call(element);
12231
12379
  if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
12232
12380
  module.debug('Showing modal with css animations');
12233
12381
  $module
@@ -12270,7 +12418,6 @@ $.fn.modal = function(parameters) {
12270
12418
  ? callback
12271
12419
  : function(){}
12272
12420
  ;
12273
- module.debug('Hiding modal');
12274
12421
  if(settings.onHide.call(element, $(this)) === false) {
12275
12422
  module.verbose('Hide callback returned false cancelling hide');
12276
12423
  ignoreRepeatedEvents = false;
@@ -12278,6 +12425,7 @@ $.fn.modal = function(parameters) {
12278
12425
  }
12279
12426
 
12280
12427
  if( module.is.animating() || module.is.active() ) {
12428
+ module.debug('Hiding modal');
12281
12429
  if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
12282
12430
  module.remove.active();
12283
12431
  $module
@@ -12457,7 +12605,7 @@ $.fn.modal = function(parameters) {
12457
12605
  $module
12458
12606
  .off('mousedown' + elementEventNamespace)
12459
12607
  ;
12460
- }
12608
+ }
12461
12609
  $dimmer
12462
12610
  .off('mousedown' + elementEventNamespace)
12463
12611
  ;
@@ -12642,13 +12790,10 @@ $.fn.modal = function(parameters) {
12642
12790
  set: {
12643
12791
  autofocus: function() {
12644
12792
  var
12645
- $inputs = $module.find('[tabindex], :input').filter(':visible').filter(function() {
12646
- return $(this).closest('.disabled').length === 0;
12647
- }),
12648
12793
  $autofocus = $inputs.filter('[autofocus]'),
12649
12794
  $input = ($autofocus.length > 0)
12650
12795
  ? $autofocus.first()
12651
- : $inputs.first()
12796
+ : ($inputs.length > 1 ? $inputs.filter(':not(i.close)') : $inputs).first()
12652
12797
  ;
12653
12798
  if($input.length > 0) {
12654
12799
  $input.focus();
@@ -12730,7 +12875,7 @@ $.fn.modal = function(parameters) {
12730
12875
  ? $(document).scrollTop() + settings.padding
12731
12876
  : $(document).scrollTop() + (module.cache.contextHeight - module.cache.height - settings.padding),
12732
12877
  marginLeft: -(module.cache.width / 2)
12733
- })
12878
+ })
12734
12879
  ;
12735
12880
  } else {
12736
12881
  $module
@@ -12739,7 +12884,7 @@ $.fn.modal = function(parameters) {
12739
12884
  ? -(module.cache.height / 2)
12740
12885
  : settings.padding / 2,
12741
12886
  marginLeft: -(module.cache.width / 2)
12742
- })
12887
+ })
12743
12888
  ;
12744
12889
  }
12745
12890
  module.verbose('Setting modal offset for legacy mode');
@@ -13065,11 +13210,19 @@ $.fn.modal.settings = {
13065
13210
  // called after deny selector match
13066
13211
  onDeny : function(){ return true; },
13067
13212
 
13213
+ keys : {
13214
+ space : 32,
13215
+ enter : 13,
13216
+ escape : 27,
13217
+ tab : 9,
13218
+ },
13219
+
13068
13220
  selector : {
13069
13221
  title : '> .header',
13070
13222
  content : '> .content',
13071
13223
  actions : '> .actions',
13072
13224
  close : '> .close',
13225
+ closeIcon: '> .close',
13073
13226
  approve : '.actions .positive, .actions .approve, .actions .ok',
13074
13227
  deny : '.actions .negative, .actions .deny, .actions .cancel',
13075
13228
  modal : '.ui.modal',
@@ -13101,11 +13254,13 @@ $.fn.modal.settings = {
13101
13254
  template : 'ui tiny modal',
13102
13255
  ok : 'positive',
13103
13256
  cancel : 'negative',
13104
- prompt : 'ui fluid input'
13257
+ prompt : 'ui fluid input',
13258
+ innerDimmer: 'ui inverted dimmer'
13105
13259
  },
13106
13260
  text: {
13107
13261
  ok : 'Ok',
13108
- cancel: 'Cancel'
13262
+ cancel: 'Cancel',
13263
+ close : 'Close'
13109
13264
  }
13110
13265
  };
13111
13266
 
@@ -13131,33 +13286,39 @@ $.fn.modal.settings.templates = {
13131
13286
  },
13132
13287
  alert: function () {
13133
13288
  var settings = this.get.settings(),
13134
- args = settings.templates.getArguments(arguments)
13289
+ args = settings.templates.getArguments(arguments),
13290
+ approveFn = args.handler
13135
13291
  ;
13136
13292
  return {
13137
13293
  title : args.title,
13138
13294
  content: args.content,
13295
+ onApprove: approveFn,
13139
13296
  actions: [{
13140
13297
  text : settings.text.ok,
13141
13298
  class: settings.className.ok,
13142
- click: args.handler
13299
+ click: approveFn
13143
13300
  }]
13144
13301
  }
13145
13302
  },
13146
13303
  confirm: function () {
13147
13304
  var settings = this.get.settings(),
13148
- args = settings.templates.getArguments(arguments)
13305
+ args = settings.templates.getArguments(arguments),
13306
+ approveFn = function(){args.handler(true)},
13307
+ denyFn = function(){args.handler(false)}
13149
13308
  ;
13150
13309
  return {
13151
13310
  title : args.title,
13152
13311
  content: args.content,
13312
+ onApprove: approveFn,
13313
+ onDeny: denyFn,
13153
13314
  actions: [{
13154
13315
  text : settings.text.ok,
13155
13316
  class: settings.className.ok,
13156
- click: function(){args.handler(true)}
13317
+ click: approveFn
13157
13318
  },{
13158
13319
  text: settings.text.cancel,
13159
13320
  class: settings.className.cancel,
13160
- click: function(){args.handler(false)}
13321
+ click: denyFn
13161
13322
  }]
13162
13323
  }
13163
13324
  },
@@ -13165,7 +13326,14 @@ $.fn.modal.settings.templates = {
13165
13326
  var $this = this,
13166
13327
  settings = this.get.settings(),
13167
13328
  args = settings.templates.getArguments(arguments),
13168
- input = $($.parseHTML(args.content)).filter('.ui.input')
13329
+ input = $($.parseHTML(args.content)).filter('.ui.input'),
13330
+ approveFn = function(){
13331
+ var settings = $this.get.settings(),
13332
+ inputField = $this.get.element().find(settings.selector.prompt)[0]
13333
+ ;
13334
+ args.handler($(inputField).val());
13335
+ },
13336
+ denyFn = function(){args.handler(null)}
13169
13337
  ;
13170
13338
  if (input.length === 0) {
13171
13339
  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 +13341,16 @@ $.fn.modal.settings.templates = {
13173
13341
  return {
13174
13342
  title : args.title,
13175
13343
  content: args.content,
13344
+ onApprove: approveFn,
13345
+ onDeny: denyFn,
13176
13346
  actions: [{
13177
13347
  text: settings.text.ok,
13178
13348
  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
- }
13349
+ click: approveFn
13185
13350
  },{
13186
13351
  text: settings.text.cancel,
13187
13352
  class: settings.className.cancel,
13188
- click: function(){args.handler(null)}
13353
+ click: denyFn
13189
13354
  }]
13190
13355
  }
13191
13356
  }
@@ -13194,7 +13359,7 @@ $.fn.modal.settings.templates = {
13194
13359
  })( jQuery, window, document );
13195
13360
 
13196
13361
  /*!
13197
- * # Fomantic-UI 2.9.0-beta.28 - Nag
13362
+ * # Fomantic-UI 2.9.0-beta.282+54be6de - Nag
13198
13363
  * http://github.com/fomantic/Fomantic-UI/
13199
13364
  *
13200
13365
  *
@@ -13753,7 +13918,7 @@ $.extend( $.easing, {
13753
13918
  })( jQuery, window, document );
13754
13919
 
13755
13920
  /*!
13756
- * # Fomantic-UI 2.9.0-beta.28 - Popup
13921
+ * # Fomantic-UI 2.9.0-beta.282+54be6de - Popup
13757
13922
  * http://github.com/fomantic/Fomantic-UI/
13758
13923
  *
13759
13924
  *
@@ -14063,7 +14228,7 @@ $.fn.popup = function(parameters) {
14063
14228
  },
14064
14229
 
14065
14230
  createID: function() {
14066
- id = (Math.random().toString(16) + '000000000').substr(2, 8);
14231
+ id = (Math.random().toString(16) + '000000000').slice(2, 10);
14067
14232
  elementNamespace = '.' + id;
14068
14233
  module.verbose('Creating unique id for element', id);
14069
14234
  },
@@ -15295,7 +15460,7 @@ $.fn.popup.settings = {
15295
15460
  })( jQuery, window, document );
15296
15461
 
15297
15462
  /*!
15298
- * # Fomantic-UI 2.9.0-beta.28 - Progress
15463
+ * # Fomantic-UI 2.9.0-beta.282+54be6de - Progress
15299
15464
  * http://github.com/fomantic/Fomantic-UI/
15300
15465
  *
15301
15466
  *
@@ -15903,6 +16068,9 @@ $.fn.progress = function(parameters) {
15903
16068
  }
15904
16069
  else {
15905
16070
  module.remove.active();
16071
+ module.remove.warning();
16072
+ module.remove.error();
16073
+ module.remove.success();
15906
16074
  module.set.label(settings.text.active);
15907
16075
  }
15908
16076
  },
@@ -16329,7 +16497,7 @@ $.fn.progress.settings = {
16329
16497
  })( jQuery, window, document );
16330
16498
 
16331
16499
  /*!
16332
- * # Fomantic-UI 2.9.0-beta.28 - Slider
16500
+ * # Fomantic-UI 2.9.0-beta.282+54be6de - Slider
16333
16501
  * http://github.com/fomantic/Fomantic-UI/
16334
16502
  *
16335
16503
  *
@@ -16400,6 +16568,7 @@ $.fn.slider = function(parameters) {
16400
16568
 
16401
16569
  $module = $(this),
16402
16570
  $currThumb,
16571
+ touchIdentifier,
16403
16572
  $thumb,
16404
16573
  $secondThumb,
16405
16574
  $track,
@@ -16416,7 +16585,6 @@ $.fn.slider = function(parameters) {
16416
16585
  secondPos,
16417
16586
  offset,
16418
16587
  precision,
16419
- isTouch,
16420
16588
  gapRatio = 1,
16421
16589
  previousValue,
16422
16590
 
@@ -16434,7 +16602,6 @@ $.fn.slider = function(parameters) {
16434
16602
  currentRange += 1;
16435
16603
  documentEventID = currentRange;
16436
16604
 
16437
- isTouch = module.setup.testOutTouch();
16438
16605
  module.setup.layout();
16439
16606
  module.setup.labels();
16440
16607
 
@@ -16505,14 +16672,6 @@ $.fn.slider = function(parameters) {
16505
16672
  }
16506
16673
  }
16507
16674
  },
16508
- testOutTouch: function() {
16509
- try {
16510
- document.createEvent('TouchEvent');
16511
- return true;
16512
- } catch (e) {
16513
- return false;
16514
- }
16515
- },
16516
16675
  customLabel: function() {
16517
16676
  var
16518
16677
  $children = $labels.find('.label'),
@@ -16566,9 +16725,6 @@ $.fn.slider = function(parameters) {
16566
16725
  module.bind.globalKeyboardEvents();
16567
16726
  module.bind.keyboardEvents();
16568
16727
  module.bind.mouseEvents();
16569
- if(module.is.touch()) {
16570
- module.bind.touchEvents();
16571
- }
16572
16728
  if (settings.autoAdjustLabels) {
16573
16729
  module.bind.windowEvents();
16574
16730
  }
@@ -16581,7 +16737,7 @@ $.fn.slider = function(parameters) {
16581
16737
  $(document).on('keydown' + eventNamespace + documentEventID, module.event.activateFocus);
16582
16738
  },
16583
16739
  mouseEvents: function() {
16584
- module.verbose('Binding mouse events');
16740
+ module.verbose('Binding mouse and touch events');
16585
16741
  $module.find('.track, .thumb, .inner').on('mousedown' + eventNamespace, function(event) {
16586
16742
  event.stopImmediatePropagation();
16587
16743
  event.preventDefault();
@@ -16594,27 +16750,20 @@ $.fn.slider = function(parameters) {
16594
16750
  $module.on('mouseleave' + eventNamespace, function(event) {
16595
16751
  isHover = false;
16596
16752
  });
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);
16753
+ // All touch events are invoked on the element where the touch *started*. Thus, we can bind them all
16754
+ // on the thumb(s) and don't need to worry about interference with other components, i.e. no dynamic binding
16755
+ // and unbinding required.
16756
+ $module.find('.thumb')
16757
+ .on('touchstart' + eventNamespace, module.event.touchDown)
16758
+ .on('touchmove' + eventNamespace, module.event.move)
16759
+ .on('touchend' + eventNamespace, module.event.up)
16760
+ .on('touchcancel' + eventNamespace, module.event.touchCancel);
16606
16761
  },
16607
16762
  slidingEvents: function() {
16608
16763
  // these don't need the identifier because we only ever want one of them to be registered with document
16609
16764
  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
- }
16765
+ $(document).on('mousemove' + eventNamespace, module.event.move);
16766
+ $(document).on('mouseup' + eventNamespace, module.event.up);
16618
16767
  },
16619
16768
  windowEvents: function() {
16620
16769
  $window.on('resize' + eventNamespace, module.event.resize);
@@ -16624,24 +16773,22 @@ $.fn.slider = function(parameters) {
16624
16773
  unbind: {
16625
16774
  events: function() {
16626
16775
  $module.find('.track, .thumb, .inner').off('mousedown' + eventNamespace);
16627
- $module.find('.track, .thumb, .inner').off('touchstart' + eventNamespace);
16628
16776
  $module.off('mousedown' + eventNamespace);
16629
16777
  $module.off('mouseenter' + eventNamespace);
16630
16778
  $module.off('mouseleave' + eventNamespace);
16631
- $module.off('touchstart' + eventNamespace);
16779
+ $module.find('.thumb')
16780
+ .off('touchstart' + eventNamespace)
16781
+ .off('touchmove' + eventNamespace)
16782
+ .off('touchend' + eventNamespace)
16783
+ .off('touchcancel' + eventNamespace);
16632
16784
  $module.off('keydown' + eventNamespace);
16633
16785
  $module.off('focusout' + eventNamespace);
16634
16786
  $(document).off('keydown' + eventNamespace + documentEventID, module.event.activateFocus);
16635
16787
  $window.off('resize' + eventNamespace);
16636
16788
  },
16637
16789
  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
- }
16790
+ $(document).off('mousemove' + eventNamespace);
16791
+ $(document).off('mouseup' + eventNamespace);
16645
16792
  },
16646
16793
  },
16647
16794
 
@@ -16671,10 +16818,31 @@ $.fn.slider = function(parameters) {
16671
16818
  module.bind.slidingEvents();
16672
16819
  }
16673
16820
  },
16821
+ touchDown: function(event) {
16822
+ event.preventDefault(); // disable mouse emulation and touch-scrolling
16823
+ event.stopImmediatePropagation();
16824
+ if(touchIdentifier !== undefined) {
16825
+ // ignore multiple touches on the same slider --
16826
+ // we cannot handle changing both thumbs at once due to shared state
16827
+ return;
16828
+ }
16829
+ $currThumb = $(event.target);
16830
+ var touchEvent = event.touches ? event : event.originalEvent;
16831
+ touchIdentifier = touchEvent.targetTouches[0].identifier;
16832
+ if(previousValue === undefined) {
16833
+ previousValue = module.get.currentThumbValue();
16834
+ }
16835
+ },
16674
16836
  move: function(event) {
16675
- event.preventDefault();
16837
+ if(event.type == 'mousemove') {
16838
+ event.preventDefault(); // prevent text selection etc.
16839
+ }
16840
+ if(module.is.disabled()) {
16841
+ // touch events are always bound, so we need to prevent touch-sliding on disabled sliders here
16842
+ return;
16843
+ }
16676
16844
  var value = module.determine.valueFromEvent(event);
16677
- if($currThumb === undefined) {
16845
+ if(event.type == 'mousemove' && $currThumb === undefined) {
16678
16846
  var
16679
16847
  eventPos = module.determine.eventPos(event),
16680
16848
  newPos = module.determine.pos(eventPos)
@@ -16711,10 +16879,23 @@ $.fn.slider = function(parameters) {
16711
16879
  },
16712
16880
  up: function(event) {
16713
16881
  event.preventDefault();
16882
+ if(module.is.disabled()) {
16883
+ // touch events are always bound, so we need to prevent touch-sliding on disabled sliders here
16884
+ return;
16885
+ }
16714
16886
  var value = module.determine.valueFromEvent(event);
16715
16887
  module.set.value(value);
16716
16888
  module.unbind.slidingEvents();
16889
+ touchIdentifier = undefined;
16890
+ if (previousValue !== undefined) {
16891
+ previousValue = undefined;
16892
+ }
16893
+ },
16894
+ touchCancel: function(event) {
16895
+ event.preventDefault();
16896
+ touchIdentifier = undefined;
16717
16897
  if (previousValue !== undefined) {
16898
+ module.update.value(previousValue);
16718
16899
  previousValue = undefined;
16719
16900
  }
16720
16901
  },
@@ -16830,9 +17011,6 @@ $.fn.slider = function(parameters) {
16830
17011
  },
16831
17012
  smooth: function() {
16832
17013
  return settings.smooth || $module.hasClass(settings.className.smooth);
16833
- },
16834
- touch: function() {
16835
- return isTouch;
16836
17014
  }
16837
17015
  },
16838
17016
 
@@ -17096,12 +17274,19 @@ $.fn.slider = function(parameters) {
17096
17274
  return value;
17097
17275
  },
17098
17276
  eventPos: function(event) {
17099
- if(module.is.touch()) {
17277
+ if(event.type === "touchmove" || event.type === "touchend") {
17278
+ var
17279
+ touchEvent = event.touches ? event : event.originalEvent,
17280
+ touch = touchEvent.changedTouches[0]; // fall back to first touch if correct touch not found
17281
+ for(var i=0; i < touchEvent.touches.length; i++) {
17282
+ if(touchEvent.touches[i].identifier === touchIdentifier) {
17283
+ touch = touchEvent.touches[i];
17284
+ break;
17285
+ }
17286
+ }
17100
17287
  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
17288
+ touchY = touch.pageY,
17289
+ touchX = touch.pageX
17105
17290
  ;
17106
17291
  return module.is.vertical() ? touchY : touchX;
17107
17292
  }
@@ -17668,7 +17853,7 @@ $.fn.slider.settings = {
17668
17853
  })( jQuery, window, document );
17669
17854
 
17670
17855
  /*!
17671
- * # Fomantic-UI 2.9.0-beta.28 - Rating
17856
+ * # Fomantic-UI 2.9.0-beta.282+54be6de - Rating
17672
17857
  * http://github.com/fomantic/Fomantic-UI/
17673
17858
  *
17674
17859
  *
@@ -18223,7 +18408,7 @@ $.fn.rating.settings = {
18223
18408
  })( jQuery, window, document );
18224
18409
 
18225
18410
  /*!
18226
- * # Fomantic-UI 2.9.0-beta.28 - Search
18411
+ * # Fomantic-UI 2.9.0-beta.282+54be6de - Search
18227
18412
  * http://github.com/fomantic/Fomantic-UI/
18228
18413
  *
18229
18414
  *
@@ -18627,7 +18812,7 @@ $.fn.search = function(parameters) {
18627
18812
  return $results.hasClass(className.animating);
18628
18813
  },
18629
18814
  chrome: function() {
18630
- return !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);
18815
+ return !!window.chrome && !window.StyleMedia;
18631
18816
  },
18632
18817
  hidden: function() {
18633
18818
  return $results.hasClass(className.hidden);
@@ -19791,7 +19976,7 @@ $.fn.search.settings = {
19791
19976
  })( jQuery, window, document );
19792
19977
 
19793
19978
  /*!
19794
- * # Fomantic-UI 2.9.0-beta.28 - Shape
19979
+ * # Fomantic-UI 2.9.0-beta.282+54be6de - Shape
19795
19980
  * http://github.com/fomantic/Fomantic-UI/
19796
19981
  *
19797
19982
  *
@@ -19918,7 +20103,7 @@ $.fn.shape = function(parameters) {
19918
20103
  module.reset();
19919
20104
  module.set.active();
19920
20105
  };
19921
- settings.beforeChange.call($nextSide[0]);
20106
+ settings.onBeforeChange.call($nextSide[0]);
19922
20107
  if(module.get.transitionEvent()) {
19923
20108
  module.verbose('Starting CSS animation');
19924
20109
  $module
@@ -20605,7 +20790,7 @@ $.fn.shape.settings = {
20605
20790
  height: 'initial',
20606
20791
 
20607
20792
  // callback occurs on side change
20608
- beforeChange : function() {},
20793
+ onBeforeChange : function() {},
20609
20794
  onChange : function() {},
20610
20795
 
20611
20796
  // allow animation to same side
@@ -20640,7 +20825,7 @@ $.fn.shape.settings = {
20640
20825
  })( jQuery, window, document );
20641
20826
 
20642
20827
  /*!
20643
- * # Fomantic-UI 2.9.0-beta.28 - Sidebar
20828
+ * # Fomantic-UI 2.9.0-beta.282+54be6de - Sidebar
20644
20829
  * http://github.com/fomantic/Fomantic-UI/
20645
20830
  *
20646
20831
  *
@@ -20759,7 +20944,7 @@ $.fn.sidebar = function(parameters) {
20759
20944
 
20760
20945
  create: {
20761
20946
  id: function() {
20762
- id = (Math.random().toString(16) + '000000000').substr(2,8);
20947
+ id = (Math.random().toString(16) + '000000000').slice(2, 10);
20763
20948
  elementNamespace = '.' + id;
20764
20949
  module.verbose('Creating unique id for element', id);
20765
20950
  }
@@ -20902,7 +21087,7 @@ $.fn.sidebar = function(parameters) {
20902
21087
  if(direction === 'left' || direction === 'right') {
20903
21088
  module.debug('Adding CSS rules for animation distance', width);
20904
21089
  style += ''
20905
- + ' body.pushable > .ui.visible.' + direction + '.sidebar ~ .pusher:after {'
21090
+ + ' body.pushable > .ui.visible.' + direction + '.sidebar ~ .pusher::after {'
20906
21091
  + ' -webkit-transform: translate3d('+ distance[direction] + 'px, 0, 0);'
20907
21092
  + ' transform: translate3d('+ distance[direction] + 'px, 0, 0);'
20908
21093
  + ' }'
@@ -20910,7 +21095,7 @@ $.fn.sidebar = function(parameters) {
20910
21095
  }
20911
21096
  else if(direction === 'top' || direction == 'bottom') {
20912
21097
  style += ''
20913
- + ' body.pushable > .ui.visible.' + direction + '.sidebar ~ .pusher:after {'
21098
+ + ' body.pushable > .ui.visible.' + direction + '.sidebar ~ .pusher::after {'
20914
21099
  + ' -webkit-transform: translate3d(0, ' + distance[direction] + 'px, 0);'
20915
21100
  + ' transform: translate3d(0, ' + distance[direction] + 'px, 0);'
20916
21101
  + ' }'
@@ -20918,8 +21103,8 @@ $.fn.sidebar = function(parameters) {
20918
21103
  }
20919
21104
  /* opposite sides visible forces content overlay */
20920
21105
  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 {'
21106
+ + ' body.pushable > .ui.visible.left.sidebar ~ .ui.visible.right.sidebar ~ .pusher::after,'
21107
+ + ' body.pushable > .ui.visible.right.sidebar ~ .ui.visible.left.sidebar ~ .pusher::after {'
20923
21108
  + ' -webkit-transform: translate3d(0, 0, 0);'
20924
21109
  + ' transform: translate3d(0, 0, 0);'
20925
21110
  + ' }'
@@ -21012,6 +21197,10 @@ $.fn.sidebar = function(parameters) {
21012
21197
  : function(){}
21013
21198
  ;
21014
21199
  if(module.is.hidden()) {
21200
+ if(settings.onShow.call(element) === false) {
21201
+ module.verbose('Show callback returned false cancelling show');
21202
+ return;
21203
+ }
21015
21204
  module.refreshSidebars();
21016
21205
  if(settings.overlay) {
21017
21206
  module.error(error.overlay);
@@ -21036,10 +21225,9 @@ $.fn.sidebar = function(parameters) {
21036
21225
  }
21037
21226
  module.pushPage(function() {
21038
21227
  callback.call(element);
21039
- settings.onShow.call(element);
21228
+ settings.onVisible.call(element);
21040
21229
  });
21041
21230
  settings.onChange.call(element);
21042
- settings.onVisible.call(element);
21043
21231
  }
21044
21232
  else {
21045
21233
  module.debug('Sidebar is already visible');
@@ -21051,7 +21239,7 @@ $.fn.sidebar = function(parameters) {
21051
21239
  ? callback
21052
21240
  : function(){}
21053
21241
  ;
21054
- if(module.is.visible() || module.is.animating()) {
21242
+ if((module.is.visible() || module.is.animating()) && settings.onHide.call(element) !== false) {
21055
21243
  module.debug('Hiding sidebar', callback);
21056
21244
  module.refreshSidebars();
21057
21245
  module.pullPage(function() {
@@ -21059,7 +21247,6 @@ $.fn.sidebar = function(parameters) {
21059
21247
  settings.onHidden.call(element);
21060
21248
  });
21061
21249
  settings.onChange.call(element);
21062
- settings.onHide.call(element);
21063
21250
  }
21064
21251
  },
21065
21252
 
@@ -21677,7 +21864,7 @@ $.fn.sidebar.settings = {
21677
21864
  })( jQuery, window, document );
21678
21865
 
21679
21866
  /*!
21680
- * # Fomantic-UI 2.9.0-beta.28 - Sticky
21867
+ * # Fomantic-UI 2.9.0-beta.282+54be6de - Sticky
21681
21868
  * http://github.com/fomantic/Fomantic-UI/
21682
21869
  *
21683
21870
  *
@@ -22635,7 +22822,7 @@ $.fn.sticky.settings = {
22635
22822
  })( jQuery, window, document );
22636
22823
 
22637
22824
  /*!
22638
- * # Fomantic-UI 2.9.0-beta.28 - Tab
22825
+ * # Fomantic-UI 2.9.0-beta.282+54be6de - Tab
22639
22826
  * http://github.com/fomantic/Fomantic-UI/
22640
22827
  *
22641
22828
  *
@@ -22736,10 +22923,18 @@ $.fn.tab = function(parameters) {
22736
22923
  initializedHistory = true;
22737
22924
  }
22738
22925
 
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
- };
22926
+ var activeTab = module.determine.activeTab();
22927
+ if(settings.autoTabActivation && instance === undefined && activeTab == null) {
22928
+ activeTab = settings.autoTabActivation === true ? module.get.initialPath() : settings.autoTabActivation;
22929
+ module.debug('No active tab detected, setting tab active', activeTab);
22930
+ module.changeTab(activeTab);
22931
+ }
22932
+ if(activeTab != null && settings.history) {
22933
+ var autoUpdate = $.address.autoUpdate();
22934
+ $.address.autoUpdate(false);
22935
+ $.address.value(activeTab);
22936
+ $.address.autoUpdate(autoUpdate);
22937
+ }
22743
22938
 
22744
22939
  module.instantiate();
22745
22940
  },
@@ -22839,6 +23034,7 @@ $.fn.tab = function(parameters) {
22839
23034
  .history(true)
22840
23035
  .state(settings.path)
22841
23036
  ;
23037
+ $(window).trigger('popstate');
22842
23038
  }
22843
23039
  else {
22844
23040
  module.error(error.path);
@@ -23006,6 +23202,10 @@ $.fn.tab = function(parameters) {
23006
23202
  module.verbose('Tab parameters found', nextPathArray);
23007
23203
  }
23008
23204
  }
23205
+ if (settings.onBeforeChange.call(element, currentPath) === false) {
23206
+ module.debug('onBeforeChange returned false, cancelling tab change', $tab);
23207
+ return false;
23208
+ }
23009
23209
  if(isLastTab && remoteContent) {
23010
23210
  if(!shouldIgnoreLoad) {
23011
23211
  module.activate.navigation(currentPath);
@@ -23042,6 +23242,10 @@ $.fn.tab = function(parameters) {
23042
23242
  // if anchor exists use parent tab
23043
23243
  if($anchor && $anchor.length > 0 && currentPath) {
23044
23244
  module.debug('Anchor link used, opening parent tab', $tab, $anchor);
23245
+ if (settings.onBeforeChange.call(element, currentPath) === false) {
23246
+ module.debug('onBeforeChange returned false, cancelling tab change', $tab);
23247
+ return false;
23248
+ }
23045
23249
  if( !$tab.hasClass(className.active) ) {
23046
23250
  setTimeout(function() {
23047
23251
  module.scrollTo($anchor);
@@ -23595,6 +23799,7 @@ $.fn.tab.settings = {
23595
23799
  onLoad : function(tabPath, parameterArray, historyEvent) {}, // called on every load
23596
23800
  onVisible : function(tabPath, parameterArray, historyEvent) {}, // called every time tab visible
23597
23801
  onRequest : function(tabPath, parameterArray, historyEvent) {}, // called ever time a tab beings loading remote content
23802
+ onBeforeChange: function(tabPath) {}, // called before a tab is about to be changed. Returning false will cancel the tab change
23598
23803
 
23599
23804
  templates : {
23600
23805
  determineTitle: function(tabArray) {} // returns page title for path
@@ -23637,7 +23842,7 @@ $.fn.tab.settings = {
23637
23842
  })( jQuery, window, document );
23638
23843
 
23639
23844
  /*!
23640
- * # Fomantic-UI 2.9.0-beta.28 - Toast
23845
+ * # Fomantic-UI 2.9.0-beta.282+54be6de - Toast
23641
23846
  * http://github.com/fomantic/Fomantic-UI/
23642
23847
  *
23643
23848
  *
@@ -23707,12 +23912,14 @@ $.fn.toast = function(parameters) {
23707
23912
  element = this,
23708
23913
  instance = isToastComponent ? $module.data(moduleNamespace) : undefined,
23709
23914
 
23915
+ id,
23710
23916
  module
23711
23917
  ;
23712
23918
  module = {
23713
23919
 
23714
23920
  initialize: function() {
23715
23921
  module.verbose('Initializing element');
23922
+ module.create.id();
23716
23923
  if (!module.has.container()) {
23717
23924
  module.create.container();
23718
23925
  }
@@ -23762,17 +23969,22 @@ $.fn.toast = function(parameters) {
23762
23969
  },
23763
23970
 
23764
23971
  show: function(callback) {
23765
- callback = callback || function(){};
23766
- module.debug('Showing toast');
23767
23972
  if(settings.onShow.call($toastBox, element) === false) {
23768
23973
  module.debug('onShow callback returned false, cancelling toast animation');
23769
23974
  return;
23770
23975
  }
23976
+ callback = callback || function(){};
23977
+ module.debug('Showing toast');
23771
23978
  module.animate.show(callback);
23772
23979
  },
23773
23980
 
23774
23981
  close: function(callback) {
23982
+ if(settings.onHide.call($toastBox, element) === false) {
23983
+ module.debug('onHide callback returned false, cancelling toast animation');
23984
+ return;
23985
+ }
23775
23986
  callback = callback || function(){};
23987
+ module.debug('Closing toast');
23776
23988
  module.remove.visible();
23777
23989
  module.unbind.events();
23778
23990
  module.animate.close(callback);
@@ -23784,12 +23996,16 @@ $.fn.toast = function(parameters) {
23784
23996
  module.verbose('Creating container');
23785
23997
  $context.append($('<div/>',{class: settings.position + ' ' + className.container + ' ' +(settings.horizontal ? className.horizontal : '')}));
23786
23998
  },
23999
+ id: function() {
24000
+ id = (Math.random().toString(16) + '000000000').slice(2, 10);
24001
+ module.verbose('Creating unique id for element', id);
24002
+ },
23787
24003
  toast: function() {
23788
24004
  $toastBox = $('<div/>', {class: className.box});
23789
24005
  var iconClass = module.get.iconClass();
23790
24006
  if (!isToastComponent) {
23791
24007
  module.verbose('Creating toast');
23792
- $toast = $('<div/>');
24008
+ $toast = $('<div/>', {role: 'alert'});
23793
24009
  var $content = $('<div/>', {class: className.content});
23794
24010
  if (iconClass !== '') {
23795
24011
  $toast.append($('<i/>', {class: iconClass + ' ' + className.icon}));
@@ -23802,13 +24018,21 @@ $.fn.toast = function(parameters) {
23802
24018
  }));
23803
24019
  }
23804
24020
  if (settings.title !== '') {
24021
+ var titleId = '_' + module.get.id() + 'title';
24022
+ $toast.attr('aria-labelledby', titleId);
23805
24023
  $content.append($('<div/>', {
23806
24024
  class: className.title,
23807
- text: settings.title
24025
+ id: titleId,
24026
+ html: module.helpers.escape(settings.title, settings.preserveHTML)
23808
24027
  }));
23809
24028
  }
23810
-
23811
- $content.append($('<div/>', {class: className.message, html: module.helpers.escape(settings.message, settings.preserveHTML)}));
24029
+ var descId = '_' + module.get.id() + 'desc';
24030
+ $toast.attr('aria-describedby', descId);
24031
+ $content.append($('<div/>', {
24032
+ class: className.message,
24033
+ id: descId,
24034
+ html: module.helpers.escape(settings.message, settings.preserveHTML)
24035
+ }));
23812
24036
 
23813
24037
  $toast
23814
24038
  .addClass(settings.class + ' ' + className.toast)
@@ -23816,7 +24040,7 @@ $.fn.toast = function(parameters) {
23816
24040
  ;
23817
24041
  $toast.css('opacity', settings.opacity);
23818
24042
  if (settings.closeIcon) {
23819
- $close = $('<i/>', {class: className.close + ' ' + (typeof settings.closeIcon === 'string' ? settings.closeIcon : '')});
24043
+ $close = $('<i/>', {class: className.close + ' ' + (typeof settings.closeIcon === 'string' ? settings.closeIcon : ''), role: 'button', tabindex: 0, 'aria-label': settings.text.close});
23820
24044
  if($close.hasClass(className.left)) {
23821
24045
  $toast.prepend($close);
23822
24046
  } else {
@@ -23859,15 +24083,17 @@ $.fn.toast = function(parameters) {
23859
24083
  }
23860
24084
  }
23861
24085
  settings.actions.forEach(function (el) {
23862
- var icon = el[fields.icon] ? '<i class="' + module.helpers.deQuote(el[fields.icon]) + ' icon"></i>' : '',
24086
+ var icon = el[fields.icon] ? '<i '+(el[fields.text] ? 'aria-hidden="true"' : '')+' class="' + module.helpers.deQuote(el[fields.icon]) + ' icon"></i>' : '',
23863
24087
  text = module.helpers.escape(el[fields.text] || '', settings.preserveHTML),
23864
24088
  cls = module.helpers.deQuote(el[fields.class] || ''),
23865
24089
  click = el[fields.click] && $.isFunction(el[fields.click]) ? el[fields.click] : function () {};
23866
24090
  $actions.append($('<button/>', {
23867
24091
  html: icon + text,
24092
+ 'aria-label': $('<div>'+(el[fields.text] || el[fields.icon] || '')+'</div>').text(),
23868
24093
  class: className.button + ' ' + cls,
23869
24094
  click: function () {
23870
- if (click.call(element, $module) === false) {
24095
+ var button = $(this);
24096
+ if (button.is(selector.approve) || button.is(selector.deny) || click.call(element, $module) === false) {
23871
24097
  return;
23872
24098
  }
23873
24099
  module.close();
@@ -23967,13 +24193,12 @@ $.fn.toast = function(parameters) {
23967
24193
  bind: {
23968
24194
  events: function() {
23969
24195
  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
- ;
24196
+ if(settings.closeIcon) {
24197
+ $close.on('click' + eventNamespace, module.event.close);
23974
24198
  }
24199
+ $toast.on('click' + eventNamespace, module.event.click);
23975
24200
  if($animationObject) {
23976
- $animationObject.on('animationend' + eventNamespace, module.close);
24201
+ $animationObject.on('animationend' + eventNamespace, module.event.close);
23977
24202
  }
23978
24203
  $toastBox
23979
24204
  .on('click' + eventNamespace, selector.approve, module.event.approve)
@@ -23985,11 +24210,10 @@ $.fn.toast = function(parameters) {
23985
24210
  unbind: {
23986
24211
  events: function() {
23987
24212
  module.debug('Unbinding events to toast');
23988
- if(settings.closeOnClick || settings.closeIcon) {
23989
- (settings.closeIcon ? $close : $toast)
23990
- .off('click' + eventNamespace)
23991
- ;
24213
+ if(settings.closeIcon) {
24214
+ $close.off('click' + eventNamespace);
23992
24215
  }
24216
+ $toast.off('click' + eventNamespace);
23993
24217
  if($animationObject) {
23994
24218
  $animationObject.off('animationend' + eventNamespace);
23995
24219
  }
@@ -24021,11 +24245,6 @@ $.fn.toast = function(parameters) {
24021
24245
  },
24022
24246
  close: function(callback) {
24023
24247
  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
24248
  if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
24030
24249
  $toastBox
24031
24250
  .transition({
@@ -24081,7 +24300,7 @@ $.fn.toast = function(parameters) {
24081
24300
  has: {
24082
24301
  container: function() {
24083
24302
  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);
24303
+ return ($context.find(module.helpers.toClass(settings.position) + selector.container + (settings.horizontal ? module.helpers.toClass(className.horizontal) : ':not('+module.helpers.toClass(className.horizontal)+')')).length > 0);
24085
24304
  },
24086
24305
  toast: function(){
24087
24306
  return !!module.get.toast();
@@ -24095,8 +24314,11 @@ $.fn.toast = function(parameters) {
24095
24314
  },
24096
24315
 
24097
24316
  get: {
24317
+ id: function() {
24318
+ return id;
24319
+ },
24098
24320
  container: function() {
24099
- return ($context.find(module.helpers.toClass(settings.position) + selector.container)[0]);
24321
+ return ($context.find(module.helpers.toClass(settings.position) + selector.container + (settings.horizontal ? module.helpers.toClass(className.horizontal) : ':not('+module.helpers.toClass(className.horizontal)+')'))[0]);
24100
24322
  },
24101
24323
  toastBox: function() {
24102
24324
  return $toastBox || null;
@@ -24128,9 +24350,15 @@ $.fn.toast = function(parameters) {
24128
24350
  },
24129
24351
 
24130
24352
  event: {
24353
+ close: function(){
24354
+ module.close();
24355
+ },
24131
24356
  click: function(event) {
24132
- if($(event.target).closest('a').length === 0) {
24133
- settings.onClick.call($toastBox, element);
24357
+ if($(event.target).closest(selector.clickable).length === 0) {
24358
+ if(settings.onClick.call($toastBox, element) === false || !settings.closeOnClick) {
24359
+ module.verbose('Click callback returned false or close denied by setting cancelling close');
24360
+ return;
24361
+ }
24134
24362
  module.close();
24135
24363
  }
24136
24364
  },
@@ -24471,6 +24699,10 @@ $.fn.toast.settings = {
24471
24699
  unclickable : 'unclickable'
24472
24700
  },
24473
24701
 
24702
+ text: {
24703
+ close : 'Close'
24704
+ },
24705
+
24474
24706
  icons : {
24475
24707
  info : 'info',
24476
24708
  success : 'checkmark',
@@ -24487,6 +24719,7 @@ $.fn.toast.settings = {
24487
24719
  image : '> img.image, > .image > img',
24488
24720
  icon : '> i.icon',
24489
24721
  input : 'input:not([type="hidden"]), textarea, select, button, .ui.button, ui.dropdown',
24722
+ clickable : 'a, details, .ui.accordion',
24490
24723
  approve : '.actions .positive, .actions .approve, .actions .ok',
24491
24724
  deny : '.actions .negative, .actions .deny, .actions .cancel'
24492
24725
  },
@@ -24530,7 +24763,7 @@ $.extend( $.easing, {
24530
24763
  })( jQuery, window, document );
24531
24764
 
24532
24765
  /*!
24533
- * # Fomantic-UI 2.9.0-beta.28 - Transition
24766
+ * # Fomantic-UI 2.9.0-beta.282+54be6de - Transition
24534
24767
  * http://github.com/fomantic/Fomantic-UI/
24535
24768
  *
24536
24769
  *
@@ -25302,6 +25535,10 @@ $.fn.transition = function() {
25302
25535
  },
25303
25536
 
25304
25537
  hide: function() {
25538
+ if(settings.onHide.call(element) === false) {
25539
+ module.verbose('Hide callback returned false cancelling hide');
25540
+ return false;
25541
+ }
25305
25542
  module.verbose('Hiding element');
25306
25543
  if( module.is.animating() ) {
25307
25544
  module.reset();
@@ -25309,35 +25546,32 @@ $.fn.transition = function() {
25309
25546
  element.blur(); // IE will trigger focus change if element is not blurred before hiding
25310
25547
  module.remove.display();
25311
25548
  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
-
25549
+ settings.onBeforeHide.call(element, module.hideNow);
25320
25550
  },
25321
25551
 
25322
25552
  hideNow: function() {
25323
25553
  module.set.hidden();
25324
25554
  module.force.hidden();
25325
- settings.onHide.call(element);
25555
+ settings.onHidden.call(element);
25326
25556
  settings.onComplete.call(element);
25327
25557
  // module.repaint();
25328
25558
  },
25329
25559
 
25330
25560
  show: function(display) {
25331
- module.verbose('Showing element', display);
25332
- if(module.force.visible()) {
25561
+ if(module.force.visible() && settings.onShow.call(element) !== false) {
25562
+ module.verbose('Showing element', display);
25333
25563
  module.remove.hidden();
25334
- module.set.visible();
25335
- settings.onShow.call(element);
25336
- settings.onComplete.call(element);
25337
- // module.repaint();
25564
+ settings.onBeforeShow.call(element, module.showNow);
25338
25565
  }
25339
25566
  },
25340
25567
 
25568
+ showNow: function(){
25569
+ module.set.visible();
25570
+ settings.onVisible.call(element);
25571
+ settings.onComplete.call(element);
25572
+ // module.repaint();
25573
+ },
25574
+
25341
25575
  toggle: function() {
25342
25576
  if( module.is.visible() ) {
25343
25577
  module.hide();
@@ -25586,7 +25820,11 @@ $.fn.transition.settings = {
25586
25820
  onStart : function() {},
25587
25821
  onComplete : function() {},
25588
25822
  onShow : function() {},
25823
+ onBeforeShow : function(callback) {callback.call(this)},
25824
+ onVisible : function() {},
25589
25825
  onHide : function() {},
25826
+ onHidden : function() {},
25827
+ onBeforeHide : function(callback) {callback.call(this)},
25590
25828
 
25591
25829
  // whether timeout should be used to ensure callback fires in cases animationend does not
25592
25830
  useFailSafe : true,
@@ -25640,7 +25878,7 @@ $.fn.transition.settings = {
25640
25878
  })( jQuery, window, document );
25641
25879
 
25642
25880
  /*!
25643
- * # Fomantic-UI 2.9.0-beta.28 - API
25881
+ * # Fomantic-UI 2.9.0-beta.282+54be6de - API
25644
25882
  * http://github.com/fomantic/Fomantic-UI/
25645
25883
  *
25646
25884
  *
@@ -25715,6 +25953,7 @@ $.api = $.fn.api = function(parameters) {
25715
25953
  url,
25716
25954
  data,
25717
25955
  requestStartTime,
25956
+ originalData,
25718
25957
 
25719
25958
  // standard module
25720
25959
  element = this,
@@ -25727,6 +25966,7 @@ $.api = $.fn.api = function(parameters) {
25727
25966
 
25728
25967
  initialize: function() {
25729
25968
  if(!methodInvoked) {
25969
+ originalData = settings.data;
25730
25970
  module.bind.events();
25731
25971
  }
25732
25972
  module.instantiate();
@@ -25789,8 +26029,8 @@ $.api = $.fn.api = function(parameters) {
25789
26029
  module.error(error.noStorage);
25790
26030
  return;
25791
26031
  }
25792
- response = sessionStorage.getItem(url);
25793
- module.debug('Using cached response', url, response);
26032
+ response = sessionStorage.getItem(url + module.get.normalizedData());
26033
+ module.debug('Using cached response', url, settings.data, response);
25794
26034
  response = module.decode.json(response);
25795
26035
  return response;
25796
26036
  }
@@ -25808,8 +26048,8 @@ $.api = $.fn.api = function(parameters) {
25808
26048
  if( $.isPlainObject(response) ) {
25809
26049
  response = JSON.stringify(response);
25810
26050
  }
25811
- sessionStorage.setItem(url, response);
25812
- module.verbose('Storing cached response for url', url, response);
26051
+ sessionStorage.setItem(url + module.get.normalizedData(), response);
26052
+ module.verbose('Storing cached response for url', url, settings.data, response);
25813
26053
  }
25814
26054
  },
25815
26055
 
@@ -25838,7 +26078,7 @@ $.api = $.fn.api = function(parameters) {
25838
26078
 
25839
26079
  // Add form content
25840
26080
  if(settings.serializeForm) {
25841
- settings.data = module.add.formData(settings.data);
26081
+ settings.data = module.add.formData(originalData || settings.data);
25842
26082
  }
25843
26083
 
25844
26084
  // call beforesend and get any settings changes
@@ -25975,10 +26215,6 @@ $.api = $.fn.api = function(parameters) {
25975
26215
  cancelled: function() {
25976
26216
  return (module.cancelled || false);
25977
26217
  },
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
26218
  successful: function() {
25983
26219
  return (module.request && module.request.state() == 'resolved');
25984
26220
  },
@@ -26006,8 +26242,8 @@ $.api = $.fn.api = function(parameters) {
26006
26242
  var
26007
26243
  // allow legacy {$var} style
26008
26244
  variable = (templatedString.indexOf('$') !== -1)
26009
- ? templatedString.substr(2, templatedString.length - 3)
26010
- : templatedString.substr(1, templatedString.length - 2),
26245
+ ? templatedString.slice(2, -1)
26246
+ : templatedString.slice(1, -1),
26011
26247
  value = ($.isPlainObject(urlData) && urlData[variable] !== undefined)
26012
26248
  ? urlData[variable]
26013
26249
  : ($module.data(variable) !== undefined)
@@ -26038,8 +26274,8 @@ $.api = $.fn.api = function(parameters) {
26038
26274
  var
26039
26275
  // allow legacy {/$var} style
26040
26276
  variable = (templatedString.indexOf('$') !== -1)
26041
- ? templatedString.substr(3, templatedString.length - 4)
26042
- : templatedString.substr(2, templatedString.length - 3),
26277
+ ? templatedString.slice(3, -1)
26278
+ : templatedString.slice(2, -1),
26043
26279
  value = ($.isPlainObject(urlData) && urlData[variable] !== undefined)
26044
26280
  ? urlData[variable]
26045
26281
  : ($module.data(variable) !== undefined)
@@ -26070,24 +26306,76 @@ $.api = $.fn.api = function(parameters) {
26070
26306
  },
26071
26307
  formData: function(data) {
26072
26308
  var
26073
- canSerialize = ($.fn.serializeObject !== undefined),
26074
- formData = (canSerialize)
26075
- ? $form.serializeObject()
26076
- : $form.serialize(),
26077
- hasOtherData
26309
+ formData = {},
26310
+ hasOtherData,
26311
+ useFormDataApi = settings.serializeForm === 'formdata'
26078
26312
  ;
26079
- data = data || settings.data;
26313
+ data = data || originalData || settings.data;
26080
26314
  hasOtherData = $.isPlainObject(data);
26081
26315
 
26316
+ if (useFormDataApi) {
26317
+ formData = new FormData($form[0]);
26318
+ settings.processData = typeof settings.processData !== 'undefined' ? settings.processData : false;
26319
+ settings.contentType = typeof settings.contentType !== 'undefined' ? settings.contentType : false;
26320
+ } else {
26321
+ var formArray = $form.serializeArray(),
26322
+ pushes = {},
26323
+ pushValues= {},
26324
+ build = function(base, key, value) {
26325
+ base[key] = value;
26326
+ return base;
26327
+ }
26328
+ ;
26329
+ // add files
26330
+ $.each($('input[type="file"]',$form), function(i, tag) {
26331
+ $.each($(tag)[0].files, function(j, file) {
26332
+ formArray.push({name:tag.name, value: file});
26333
+ });
26334
+ });
26335
+ $.each(formArray, function(i, el) {
26336
+ if (!settings.regExp.validate.test(el.name)) return;
26337
+ var isCheckbox = $('[name="' + el.name + '"]', $form).attr('type') === 'checkbox',
26338
+ floatValue = parseFloat(el.value),
26339
+ value = (isCheckbox && el.value === 'on') || el.value === 'true' || (String(floatValue) === el.value ? floatValue : (el.value === 'false' ? false : el.value)),
26340
+ nameKeys = el.name.match(settings.regExp.key) || [], k, pushKey= el.name.replace(/\[\]$/,'')
26341
+ ;
26342
+ if(!(pushKey in pushes)) {
26343
+ pushes[pushKey] = 0;
26344
+ pushValues[pushKey] = value;
26345
+ } else if (Array.isArray(pushValues[pushKey])) {
26346
+ pushValues[pushKey].push(value);
26347
+ } else {
26348
+ pushValues[pushKey] = [pushValues[pushKey] , value];
26349
+ }
26350
+ value = pushValues[pushKey];
26351
+
26352
+ while ((k = nameKeys.pop()) !== undefined) {
26353
+ // foo[]
26354
+ if (k == '' && !Array.isArray(value)){
26355
+ value = build([], pushes[pushKey]++, value);
26356
+ }
26357
+ // foo[n]
26358
+ else if (settings.regExp.fixed.test(k)) {
26359
+ value = build([], k, value);
26360
+ }
26361
+ // foo; foo[bar]
26362
+ else if (settings.regExp.named.test(k)) {
26363
+ value = build({}, k, value);
26364
+ }
26365
+ }
26366
+ formData = $.extend(true, formData, value);
26367
+ });
26368
+ }
26369
+
26082
26370
  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);
26371
+ module.debug('Extending existing data with form data', data, formData);
26372
+ if(useFormDataApi) {
26373
+ $.each(Object.keys(data),function(i, el){
26374
+ formData.append(el, data[el]);
26375
+ });
26090
26376
  data = formData;
26377
+ } else {
26378
+ data = $.extend(true, {}, data, formData);
26091
26379
  }
26092
26380
  }
26093
26381
  else {
@@ -26339,6 +26627,9 @@ $.api = $.fn.api = function(parameters) {
26339
26627
  },
26340
26628
 
26341
26629
  get: {
26630
+ normalizedData: function(){
26631
+ return typeof settings.data === "string" ? settings.data : JSON.stringify(settings.data, Object.keys(settings.data).sort());
26632
+ },
26342
26633
  responseFromXHR: function(xhr) {
26343
26634
  return $.isPlainObject(xhr)
26344
26635
  ? (module.is.expectingJSON())
@@ -26724,6 +27015,8 @@ $.api.settings = {
26724
27015
  defaultData : true,
26725
27016
 
26726
27017
  // whether to serialize closest form
27018
+ // use true to convert complex named keys like a[b][1][c][] into a nested object
27019
+ // use 'formdata' for formdata web api
26727
27020
  serializeForm : false,
26728
27021
 
26729
27022
  // how long to wait before request should occur
@@ -26746,7 +27039,7 @@ $.api.settings = {
26746
27039
  responseAsync : false,
26747
27040
 
26748
27041
  // whether onResponse should work with response value without force converting into an object
26749
- rawResponse : false,
27042
+ rawResponse : true,
26750
27043
 
26751
27044
  // callbacks before request
26752
27045
  beforeSend : function(settings) { return settings; },
@@ -26782,7 +27075,6 @@ $.api.settings = {
26782
27075
  legacyParameters : 'You are using legacy API success callback names',
26783
27076
  method : 'The method you called is not defined',
26784
27077
  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
27078
  missingURL : 'No URL specified for api event',
26787
27079
  noReturnedValue : 'The beforeSend callback must return a settings object, beforeSend ignored.',
26788
27080
  noStorage : 'Caching responses locally requires session storage',
@@ -26795,6 +27087,11 @@ $.api.settings = {
26795
27087
  regExp : {
26796
27088
  required : /\{\$*[A-z0-9]+\}/g,
26797
27089
  optional : /\{\/\$*[A-z0-9]+\}/g,
27090
+ validate: /^[a-z_][a-z0-9_-]*(?:\[(?:\d*|[a-z0-9_-]+)\])*$/i,
27091
+ key: /[a-z0-9_-]+|(?=\[\])/gi,
27092
+ push: /^$/,
27093
+ fixed: /^\d+$/,
27094
+ named: /^[a-z0-9_-]+$/i
26798
27095
  },
26799
27096
 
26800
27097
  className: {
@@ -26818,7 +27115,7 @@ $.api.settings = {
26818
27115
  })( jQuery, window, document );
26819
27116
 
26820
27117
  /*!
26821
- * # Fomantic-UI 2.9.0-beta.28 - State
27118
+ * # Fomantic-UI 2.9.0-beta.282+54be6de - State
26822
27119
  * http://github.com/fomantic/Fomantic-UI/
26823
27120
  *
26824
27121
  *
@@ -27530,7 +27827,7 @@ $.fn.state.settings = {
27530
27827
  })( jQuery, window, document );
27531
27828
 
27532
27829
  /*!
27533
- * # Fomantic-UI 2.9.0-beta.28 - Visibility
27830
+ * # Fomantic-UI 2.9.0-beta.282+54be6de - Visibility
27534
27831
  * http://github.com/fomantic/Fomantic-UI/
27535
27832
  *
27536
27833
  *