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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (411) hide show
  1. package/.all-contributorsrc +251 -3
  2. package/.github/codeql/codeql-config.yml +4 -0
  3. package/.github/dependabot.yml +10 -0
  4. package/.github/workflows/ci.yml +10 -6
  5. package/.github/workflows/codeql.yml +68 -0
  6. package/.github/workflows/nightly.yml +16 -8
  7. package/.github/workflows/release.yml +34 -0
  8. package/CONTRIBUTING.md +1 -1
  9. package/CONTRIBUTORS.md +82 -37
  10. package/FAQ.md +38 -38
  11. package/README.md +8 -8
  12. package/dist/components/accordion.css +176 -36
  13. package/dist/components/accordion.js +6 -3
  14. package/dist/components/accordion.min.css +2 -2
  15. package/dist/components/accordion.min.js +3 -3
  16. package/dist/components/ad.css +4 -4
  17. package/dist/components/ad.min.css +2 -2
  18. package/dist/components/api.js +90 -31
  19. package/dist/components/api.min.js +3 -3
  20. package/dist/components/breadcrumb.css +1 -1
  21. package/dist/components/breadcrumb.min.css +1 -1
  22. package/dist/components/button.css +204 -157
  23. package/dist/components/button.min.css +2 -2
  24. package/dist/components/calendar.css +18 -1
  25. package/dist/components/calendar.js +189 -76
  26. package/dist/components/calendar.min.css +2 -2
  27. package/dist/components/calendar.min.js +3 -3
  28. package/dist/components/card.css +754 -117
  29. package/dist/components/card.min.css +2 -2
  30. package/dist/components/checkbox.css +92 -91
  31. package/dist/components/checkbox.js +17 -11
  32. package/dist/components/checkbox.min.css +2 -2
  33. package/dist/components/checkbox.min.js +3 -3
  34. package/dist/components/comment.css +12 -12
  35. package/dist/components/comment.min.css +2 -2
  36. package/dist/components/container.css +98 -4
  37. package/dist/components/container.min.css +2 -2
  38. package/dist/components/dimmer.css +29 -14
  39. package/dist/components/dimmer.js +11 -5
  40. package/dist/components/dimmer.min.css +2 -2
  41. package/dist/components/dimmer.min.js +3 -3
  42. package/dist/components/divider.css +31 -31
  43. package/dist/components/divider.min.css +2 -2
  44. package/dist/components/dropdown.css +90 -50
  45. package/dist/components/dropdown.js +152 -117
  46. package/dist/components/dropdown.min.css +2 -2
  47. package/dist/components/dropdown.min.js +3 -3
  48. package/dist/components/embed.css +5 -5
  49. package/dist/components/embed.js +1 -1
  50. package/dist/components/embed.min.css +2 -2
  51. package/dist/components/embed.min.js +3 -3
  52. package/dist/components/emoji.css +10847 -8841
  53. package/dist/components/emoji.min.css +1 -1
  54. package/dist/components/feed.css +29 -29
  55. package/dist/components/feed.min.css +2 -2
  56. package/dist/components/flag.css +1011 -902
  57. package/dist/components/flag.min.css +2 -2
  58. package/dist/components/form.css +160 -83
  59. package/dist/components/form.js +39 -30
  60. package/dist/components/form.min.css +2 -2
  61. package/dist/components/form.min.js +3 -3
  62. package/dist/components/grid.css +25 -21
  63. package/dist/components/grid.min.css +2 -2
  64. package/dist/components/header.css +6 -4
  65. package/dist/components/header.min.css +2 -2
  66. package/dist/components/icon.css +2063 -1984
  67. package/dist/components/icon.min.css +2 -2
  68. package/dist/components/image.css +1 -1
  69. package/dist/components/image.min.css +1 -1
  70. package/dist/components/input.css +759 -22
  71. package/dist/components/input.min.css +2 -2
  72. package/dist/components/item.css +17 -17
  73. package/dist/components/item.min.css +2 -2
  74. package/dist/components/label.css +72 -68
  75. package/dist/components/label.min.css +2 -2
  76. package/dist/components/list.css +31 -31
  77. package/dist/components/list.min.css +2 -2
  78. package/dist/components/loader.css +352 -352
  79. package/dist/components/loader.min.css +2 -2
  80. package/dist/components/menu.css +110 -78
  81. package/dist/components/menu.min.css +1 -1
  82. package/dist/components/message.css +43 -43
  83. package/dist/components/message.min.css +2 -2
  84. package/dist/components/modal.css +29 -4
  85. package/dist/components/modal.js +128 -50
  86. package/dist/components/modal.min.css +2 -2
  87. package/dist/components/modal.min.js +3 -3
  88. package/dist/components/nag.css +1 -1
  89. package/dist/components/nag.js +2 -2
  90. package/dist/components/nag.min.css +1 -1
  91. package/dist/components/nag.min.js +3 -3
  92. package/dist/components/placeholder.css +33 -33
  93. package/dist/components/placeholder.min.css +2 -2
  94. package/dist/components/popup.css +103 -105
  95. package/dist/components/popup.js +11 -11
  96. package/dist/components/popup.min.css +2 -2
  97. package/dist/components/popup.min.js +3 -3
  98. package/dist/components/progress.css +1 -1
  99. package/dist/components/progress.js +6 -3
  100. package/dist/components/progress.min.css +1 -1
  101. package/dist/components/progress.min.js +3 -3
  102. package/dist/components/rail.css +1 -1
  103. package/dist/components/rail.min.css +1 -1
  104. package/dist/components/rating.css +7 -46
  105. package/dist/components/rating.js +1 -1
  106. package/dist/components/rating.min.css +2 -2
  107. package/dist/components/rating.min.js +3 -3
  108. package/dist/components/reset.css +5 -4
  109. package/dist/components/reset.min.css +2 -2
  110. package/dist/components/reveal.css +1 -1
  111. package/dist/components/reveal.min.css +1 -1
  112. package/dist/components/search.css +6 -6
  113. package/dist/components/search.js +23 -7
  114. package/dist/components/search.min.css +2 -2
  115. package/dist/components/search.min.js +3 -3
  116. package/dist/components/segment.css +118 -34
  117. package/dist/components/segment.min.css +2 -2
  118. package/dist/components/shape.css +1 -1
  119. package/dist/components/shape.js +3 -3
  120. package/dist/components/shape.min.css +1 -1
  121. package/dist/components/shape.min.js +3 -3
  122. package/dist/components/sidebar.css +7 -5
  123. package/dist/components/sidebar.js +14 -12
  124. package/dist/components/sidebar.min.css +2 -2
  125. package/dist/components/sidebar.min.js +3 -3
  126. package/dist/components/site.css +139 -42
  127. package/dist/components/site.js +1 -1
  128. package/dist/components/site.min.css +2 -2
  129. package/dist/components/site.min.js +3 -3
  130. package/dist/components/slider.css +17 -17
  131. package/dist/components/slider.js +68 -51
  132. package/dist/components/slider.min.css +1 -1
  133. package/dist/components/slider.min.js +3 -3
  134. package/dist/components/state.js +2 -2
  135. package/dist/components/state.min.js +3 -3
  136. package/dist/components/statistic.css +4 -4
  137. package/dist/components/statistic.min.css +2 -2
  138. package/dist/components/step.css +32 -32
  139. package/dist/components/step.min.css +2 -2
  140. package/dist/components/sticky.css +1 -1
  141. package/dist/components/sticky.js +5 -5
  142. package/dist/components/sticky.min.css +1 -1
  143. package/dist/components/sticky.min.js +3 -3
  144. package/dist/components/tab.css +5 -5
  145. package/dist/components/tab.js +24 -6
  146. package/dist/components/tab.min.css +2 -2
  147. package/dist/components/tab.min.js +3 -3
  148. package/dist/components/table.css +1684 -272
  149. package/dist/components/table.min.css +2 -2
  150. package/dist/components/text.css +1 -1
  151. package/dist/components/text.min.css +1 -1
  152. package/dist/components/toast.css +48 -1
  153. package/dist/components/toast.js +63 -31
  154. package/dist/components/toast.min.css +2 -2
  155. package/dist/components/toast.min.js +3 -3
  156. package/dist/components/transition.css +1 -1
  157. package/dist/components/transition.js +22 -17
  158. package/dist/components/transition.min.css +1 -1
  159. package/dist/components/transition.min.js +3 -3
  160. package/dist/components/visibility.js +3 -3
  161. package/dist/components/visibility.min.js +3 -3
  162. package/dist/semantic.css +20204 -13425
  163. package/dist/semantic.js +883 -481
  164. package/dist/semantic.min.css +3 -3
  165. package/dist/semantic.min.js +3 -3
  166. package/dist/themes/default/assets/fonts/Lato-Bold.woff +0 -0
  167. package/dist/themes/default/assets/fonts/Lato-Bold.woff2 +0 -0
  168. package/dist/themes/default/assets/fonts/Lato-BoldItalic.woff +0 -0
  169. package/dist/themes/default/assets/fonts/Lato-BoldItalic.woff2 +0 -0
  170. package/dist/themes/default/assets/fonts/Lato-Italic.woff +0 -0
  171. package/dist/themes/default/assets/fonts/Lato-Italic.woff2 +0 -0
  172. package/dist/themes/default/assets/fonts/Lato-Regular.woff +0 -0
  173. package/dist/themes/default/assets/fonts/Lato-Regular.woff2 +0 -0
  174. package/dist/themes/default/assets/fonts/LatoLatin-Bold.woff +0 -0
  175. package/dist/themes/default/assets/fonts/LatoLatin-Bold.woff2 +0 -0
  176. package/dist/themes/default/assets/fonts/LatoLatin-BoldItalic.woff +0 -0
  177. package/dist/themes/default/assets/fonts/LatoLatin-BoldItalic.woff2 +0 -0
  178. package/dist/themes/default/assets/fonts/LatoLatin-Italic.woff +0 -0
  179. package/dist/themes/default/assets/fonts/LatoLatin-Italic.woff2 +0 -0
  180. package/dist/themes/default/assets/fonts/LatoLatin-Regular.woff +0 -0
  181. package/dist/themes/default/assets/fonts/LatoLatin-Regular.woff2 +0 -0
  182. package/dist/themes/default/assets/fonts/brand-icons.eot +0 -0
  183. package/dist/themes/default/assets/fonts/brand-icons.svg +801 -654
  184. package/dist/themes/default/assets/fonts/brand-icons.ttf +0 -0
  185. package/dist/themes/default/assets/fonts/brand-icons.woff +0 -0
  186. package/dist/themes/default/assets/fonts/brand-icons.woff2 +0 -0
  187. package/dist/themes/default/assets/fonts/icons.eot +0 -0
  188. package/dist/themes/default/assets/fonts/icons.svg +1175 -1079
  189. package/dist/themes/default/assets/fonts/icons.ttf +0 -0
  190. package/dist/themes/default/assets/fonts/icons.woff +0 -0
  191. package/dist/themes/default/assets/fonts/icons.woff2 +0 -0
  192. package/dist/themes/default/assets/fonts/outline-icons.eot +0 -0
  193. package/dist/themes/default/assets/fonts/outline-icons.svg +93 -95
  194. package/dist/themes/default/assets/fonts/outline-icons.ttf +0 -0
  195. package/dist/themes/default/assets/fonts/outline-icons.woff +0 -0
  196. package/dist/themes/default/assets/fonts/outline-icons.woff2 +0 -0
  197. package/dist/themes/{default → famfamfam}/assets/images/flags.png +0 -0
  198. package/examples/assets/library/iframe-content.js +11 -11
  199. package/examples/assets/library/iframe.js +6 -6
  200. package/examples/components/button.html +1 -1
  201. package/examples/components/card.html +1 -1
  202. package/examples/components/input.html +1 -1
  203. package/examples/components/menu.html +1 -1
  204. package/examples/components/site.html +1 -1
  205. package/examples/components/table.html +1 -1
  206. package/package.json +18 -16
  207. package/scripts/nightly-version.js +47 -38
  208. package/src/definitions/behaviors/api.js +89 -30
  209. package/src/definitions/behaviors/form.js +38 -29
  210. package/src/definitions/behaviors/state.js +1 -1
  211. package/src/definitions/behaviors/visibility.js +2 -2
  212. package/src/definitions/collections/form.less +229 -165
  213. package/src/definitions/collections/grid.less +723 -687
  214. package/src/definitions/collections/menu.less +233 -171
  215. package/src/definitions/collections/message.less +49 -47
  216. package/src/definitions/collections/table.less +882 -272
  217. package/src/definitions/elements/button.less +611 -469
  218. package/src/definitions/elements/container.less +145 -8
  219. package/src/definitions/elements/divider.less +24 -24
  220. package/src/definitions/elements/emoji.less +39 -10
  221. package/src/definitions/elements/flag.less +53 -18
  222. package/src/definitions/elements/header.less +46 -37
  223. package/src/definitions/elements/icon.less +39 -32
  224. package/src/definitions/elements/input.less +281 -33
  225. package/src/definitions/elements/label.less +132 -128
  226. package/src/definitions/elements/list.less +84 -75
  227. package/src/definitions/elements/loader.less +99 -98
  228. package/src/definitions/elements/placeholder.less +32 -32
  229. package/src/definitions/elements/segment.less +177 -56
  230. package/src/definitions/elements/step.less +76 -72
  231. package/src/definitions/elements/text.less +17 -15
  232. package/src/definitions/globals/reset.less +2 -2
  233. package/src/definitions/globals/site.less +25 -2
  234. package/src/definitions/modules/accordion.js +5 -2
  235. package/src/definitions/modules/accordion.less +371 -219
  236. package/src/definitions/modules/calendar.js +188 -75
  237. package/src/definitions/modules/calendar.less +20 -0
  238. package/src/definitions/modules/checkbox.js +16 -10
  239. package/src/definitions/modules/checkbox.less +83 -227
  240. package/src/definitions/modules/dimmer.js +10 -4
  241. package/src/definitions/modules/dimmer.less +22 -8
  242. package/src/definitions/modules/dropdown.js +151 -116
  243. package/src/definitions/modules/dropdown.less +191 -136
  244. package/src/definitions/modules/embed.less +4 -4
  245. package/src/definitions/modules/modal.js +127 -49
  246. package/src/definitions/modules/modal.less +66 -33
  247. package/src/definitions/modules/nag.js +1 -1
  248. package/src/definitions/modules/nag.less +20 -19
  249. package/src/definitions/modules/popup.js +10 -10
  250. package/src/definitions/modules/popup.less +90 -90
  251. package/src/definitions/modules/progress.js +5 -2
  252. package/src/definitions/modules/progress.less +19 -18
  253. package/src/definitions/modules/rating.less +49 -42
  254. package/src/definitions/modules/search.js +22 -6
  255. package/src/definitions/modules/search.less +35 -19
  256. package/src/definitions/modules/shape.js +2 -2
  257. package/src/definitions/modules/sidebar.js +13 -11
  258. package/src/definitions/modules/sidebar.less +36 -22
  259. package/src/definitions/modules/slider.js +67 -50
  260. package/src/definitions/modules/slider.less +48 -47
  261. package/src/definitions/modules/sticky.js +4 -4
  262. package/src/definitions/modules/sticky.less +3 -1
  263. package/src/definitions/modules/tab.js +23 -5
  264. package/src/definitions/modules/tab.less +4 -4
  265. package/src/definitions/modules/toast.js +62 -30
  266. package/src/definitions/modules/toast.less +56 -16
  267. package/src/definitions/modules/transition.js +21 -16
  268. package/src/definitions/views/ad.less +3 -3
  269. package/src/definitions/views/card.less +522 -375
  270. package/src/definitions/views/comment.less +93 -82
  271. package/src/definitions/views/feed.less +164 -144
  272. package/src/definitions/views/item.less +251 -198
  273. package/src/definitions/views/statistic.less +91 -89
  274. package/src/theme.less +13 -2
  275. package/src/themes/amazon/globals/site.variables +1 -0
  276. package/src/themes/basic/elements/icon.overrides +149 -149
  277. package/src/themes/basic/elements/step.overrides +2 -2
  278. package/src/themes/bookish/elements/header.overrides +1 -1
  279. package/src/themes/chubby/elements/button.overrides +1 -1
  280. package/src/themes/chubby/elements/header.overrides +1 -1
  281. package/src/themes/default/assets/fonts/Lato-Bold.woff +0 -0
  282. package/src/themes/default/assets/fonts/Lato-Bold.woff2 +0 -0
  283. package/src/themes/default/assets/fonts/Lato-BoldItalic.woff +0 -0
  284. package/src/themes/default/assets/fonts/Lato-BoldItalic.woff2 +0 -0
  285. package/src/themes/default/assets/fonts/Lato-Italic.woff +0 -0
  286. package/src/themes/default/assets/fonts/Lato-Italic.woff2 +0 -0
  287. package/src/themes/default/assets/fonts/Lato-Regular.woff +0 -0
  288. package/src/themes/default/assets/fonts/Lato-Regular.woff2 +0 -0
  289. package/src/themes/default/assets/fonts/LatoLatin-Bold.woff +0 -0
  290. package/src/themes/default/assets/fonts/LatoLatin-Bold.woff2 +0 -0
  291. package/src/themes/default/assets/fonts/LatoLatin-BoldItalic.woff +0 -0
  292. package/src/themes/default/assets/fonts/LatoLatin-BoldItalic.woff2 +0 -0
  293. package/src/themes/default/assets/fonts/LatoLatin-Italic.woff +0 -0
  294. package/src/themes/default/assets/fonts/LatoLatin-Italic.woff2 +0 -0
  295. package/src/themes/default/assets/fonts/LatoLatin-Regular.woff +0 -0
  296. package/src/themes/default/assets/fonts/LatoLatin-Regular.woff2 +0 -0
  297. package/src/themes/default/assets/fonts/brand-icons.eot +0 -0
  298. package/src/themes/default/assets/fonts/brand-icons.svg +801 -654
  299. package/src/themes/default/assets/fonts/brand-icons.ttf +0 -0
  300. package/src/themes/default/assets/fonts/brand-icons.woff +0 -0
  301. package/src/themes/default/assets/fonts/brand-icons.woff2 +0 -0
  302. package/src/themes/default/assets/fonts/icons.eot +0 -0
  303. package/src/themes/default/assets/fonts/icons.svg +1175 -1079
  304. package/src/themes/default/assets/fonts/icons.ttf +0 -0
  305. package/src/themes/default/assets/fonts/icons.woff +0 -0
  306. package/src/themes/default/assets/fonts/icons.woff2 +0 -0
  307. package/src/themes/default/assets/fonts/outline-icons.eot +0 -0
  308. package/src/themes/default/assets/fonts/outline-icons.svg +93 -95
  309. package/src/themes/default/assets/fonts/outline-icons.ttf +0 -0
  310. package/src/themes/default/assets/fonts/outline-icons.woff +0 -0
  311. package/src/themes/default/assets/fonts/outline-icons.woff2 +0 -0
  312. package/src/themes/default/collections/form.variables +4 -0
  313. package/src/themes/default/collections/menu.variables +6 -0
  314. package/src/themes/default/collections/table.variables +52 -0
  315. package/src/themes/default/elements/button.variables +7 -1
  316. package/src/themes/default/elements/container.variables +12 -0
  317. package/src/themes/default/elements/divider.overrides +7 -7
  318. package/src/themes/default/elements/emoji.overrides +0 -3090
  319. package/src/themes/default/elements/emoji.variables +3575 -1
  320. package/src/themes/default/elements/flag.overrides +0 -991
  321. package/src/themes/default/elements/flag.variables +1609 -5
  322. package/src/themes/default/elements/icon.overrides +1975 -1949
  323. package/src/themes/default/elements/icon.variables +1 -0
  324. package/src/themes/default/elements/input.variables +15 -0
  325. package/src/themes/default/elements/segment.variables +8 -0
  326. package/src/themes/default/elements/step.overrides +4 -4
  327. package/src/themes/default/globals/site.variables +109 -8
  328. package/src/themes/default/globals/variation.variables +145 -6
  329. package/src/themes/default/modules/accordion.overrides +6 -5
  330. package/src/themes/default/modules/accordion.variables +49 -2
  331. package/src/themes/default/modules/calendar.variables +3 -0
  332. package/src/themes/default/modules/checkbox.overrides +9 -9
  333. package/src/themes/default/modules/checkbox.variables +5 -5
  334. package/src/themes/default/modules/dimmer.variables +1 -1
  335. package/src/themes/default/modules/dropdown.overrides +5 -5
  336. package/src/themes/default/modules/dropdown.variables +4 -10
  337. package/src/themes/default/modules/modal.variables +14 -0
  338. package/src/themes/default/modules/popup.variables +0 -2
  339. package/src/themes/default/modules/toast.variables +3 -0
  340. package/src/themes/default/views/card.variables +8 -0
  341. package/src/themes/{default → famfamfam}/assets/images/flags.png +0 -0
  342. package/src/themes/famfamfam/elements/flag.overrides +1026 -0
  343. package/src/themes/famfamfam/elements/flag.variables +20 -0
  344. package/src/themes/github/elements/icon.overrides +206 -206
  345. package/src/themes/github/elements/step.overrides +5 -5
  346. package/src/themes/github/globals/site.variables +1 -0
  347. package/src/themes/github/modules/dropdown.overrides +6 -6
  348. package/src/themes/instagram/views/card.overrides +1 -1
  349. package/src/themes/joypixels/elements/emoji.overrides +0 -3089
  350. package/src/themes/joypixels/elements/emoji.variables +3574 -5
  351. package/src/themes/material/collections/menu.overrides +1 -1
  352. package/src/themes/material/elements/button.overrides +1 -1
  353. package/src/themes/material/elements/header.overrides +1 -1
  354. package/src/themes/material/elements/icon.overrides +932 -932
  355. package/src/themes/material/globals/site.variables +0 -1
  356. package/src/themes/material/modules/dropdown.overrides +1 -1
  357. package/src/themes/material/modules/modal.overrides +1 -1
  358. package/src/themes/pulsar/elements/loader.overrides +2 -2
  359. package/src/themes/resetcss/globals/reset.overrides +3 -3
  360. package/src/themes/rtl/globals/site.overrides +1 -1
  361. package/src/themes/striped/modules/progress.overrides +1 -1
  362. package/src/themes/systemfont/globals/reset.overrides +8 -0
  363. package/src/themes/systemfont/globals/site.variables +10 -0
  364. package/src/themes/twitter/elements/emoji.overrides +0 -3091
  365. package/src/themes/twitter/elements/emoji.variables +3570 -6
  366. package/tasks/admin/components/init.js +2 -2
  367. package/tasks/admin/distributions/create.js +1 -1
  368. package/tasks/admin/distributions/init.js +2 -2
  369. package/tasks/admin/publish.js +1 -1
  370. package/tasks/admin/release.js +1 -1
  371. package/tasks/build/assets.js +1 -1
  372. package/tasks/build/css.js +9 -4
  373. package/tasks/build/javascript.js +3 -3
  374. package/tasks/check-install.js +1 -1
  375. package/tasks/clean.js +1 -1
  376. package/tasks/collections/README.md +1 -1
  377. package/tasks/collections/admin.js +1 -1
  378. package/tasks/config/admin/oauth.example.js +1 -1
  379. package/tasks/config/admin/templates/composer.json +1 -1
  380. package/tasks/config/project/install.js +15 -13
  381. package/tasks/install.js +1 -0
  382. package/tasks/rtl/watch.js +1 -1
  383. package/tasks/version.js +1 -1
  384. package/test/fixtures/accordion.html +1 -1
  385. package/test/fixtures/checkbox.html +1 -1
  386. package/test/fixtures/dropdown.html +1 -1
  387. package/test/fixtures/modal.html +1 -1
  388. package/test/fixtures/popup.html +1 -1
  389. package/test/fixtures/rating.html +1 -1
  390. package/test/fixtures/shape.html +1 -1
  391. package/test/fixtures/sidebar.html +1 -1
  392. package/test/fixtures/tab.html +1 -1
  393. package/test/fixtures/transition.html +1 -1
  394. package/test/fixtures/video.html +1 -1
  395. package/test/helpers/jasmine-jquery.js +2 -2
  396. package/test/helpers/jasmine-sinon.js +1 -1
  397. package/test/helpers/jquery-events.js +1 -1
  398. package/test/helpers/sinon.js +3 -3
  399. package/test/meteor/fonts.js +1 -1
  400. package/test/modules/accordion.spec.js +1 -1
  401. package/test/modules/checkbox.spec.js +1 -1
  402. package/test/modules/dropdown.spec.js +1 -1
  403. package/test/modules/modal.spec.js +1 -1
  404. package/test/modules/module.spec.js +1 -1
  405. package/test/modules/popup.spec.js +1 -1
  406. package/test/modules/search.spec.js +1 -1
  407. package/test/modules/shape.spec.js +1 -1
  408. package/test/modules/sidebar.spec.js +1 -1
  409. package/test/modules/tab.spec.js +1 -1
  410. package/test/modules/transition.spec.js +1 -1
  411. package/test/modules/video.spec.js +1 -1
package/dist/semantic.js CHANGED
@@ -1,15 +1,15 @@
1
1
  /*
2
- * # Fomantic UI - 2.9.0-beta.3
2
+ * # Fomantic UI - 2.9.0-beta.301+42e68bc
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.3 - Site
12
+ * # Fomantic-UI 2.9.0-beta.301+42e68bc - 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.3 - Form Validation
506
+ * # Fomantic-UI 2.9.0-beta.301+42e68bc - Form Validation
507
507
  * http://github.com/fomantic/Fomantic-UI/
508
508
  *
509
509
  *
@@ -635,6 +635,11 @@ $.fn.form = function(parameters) {
635
635
  $reset = $module.find(selector.reset);
636
636
  },
637
637
 
638
+ refreshEvents: function() {
639
+ module.removeEvents();
640
+ module.bindEvents();
641
+ },
642
+
638
643
  submit: function() {
639
644
  module.verbose('Submitting form', $module);
640
645
  submitting = true;
@@ -895,7 +900,6 @@ $.fn.form = function(parameters) {
895
900
  $module.off(eventNamespace);
896
901
  $field.off(eventNamespace);
897
902
  $submit.off(eventNamespace);
898
- $field.off(eventNamespace);
899
903
  },
900
904
 
901
905
  event: {
@@ -923,6 +927,7 @@ $.fn.form = function(parameters) {
923
927
  $field.one('keyup' + eventNamespace, module.event.field.keyup);
924
928
  module.submit();
925
929
  module.debug('Enter pressed on input submitting form');
930
+ event.preventDefault();
926
931
  }
927
932
  keyHeldDown = true;
928
933
  }
@@ -1047,7 +1052,7 @@ $.fn.form = function(parameters) {
1047
1052
  parts,
1048
1053
  suffixPrompt
1049
1054
  ;
1050
- if(ancillary && ancillary.indexOf('..') >= 0) {
1055
+ if(ancillary && ['integer', 'decimal', 'number'].indexOf(ruleName) >= 0 && ancillary.indexOf('..') >= 0) {
1051
1056
  parts = ancillary.split('..', 2);
1052
1057
  if(!rule.prompt) {
1053
1058
  suffixPrompt = (
@@ -1089,7 +1094,7 @@ $.fn.form = function(parameters) {
1089
1094
  if(isLegacySettings) {
1090
1095
  // 1.x (ducktyped)
1091
1096
  settings = $.extend(true, {}, $.fn.form.settings, legacyParameters);
1092
- validation = $.extend({}, $.fn.form.settings.defaults, parameters);
1097
+ validation = $.extend(true, {}, $.fn.form.settings.defaults, parameters);
1093
1098
  module.error(settings.error.oldSyntax, element);
1094
1099
  module.verbose('Extending settings from legacy parameters', validation, settings);
1095
1100
  }
@@ -1099,13 +1104,13 @@ $.fn.form = function(parameters) {
1099
1104
  parameters.fields = module.get.fieldsFromShorthand(parameters.fields);
1100
1105
  }
1101
1106
  settings = $.extend(true, {}, $.fn.form.settings, parameters);
1102
- validation = $.extend({}, $.fn.form.settings.defaults, settings.fields);
1107
+ validation = $.extend(true, {}, $.fn.form.settings.defaults, settings.fields);
1103
1108
  module.verbose('Extending settings', validation, settings);
1104
1109
  }
1105
1110
  }
1106
1111
  else {
1107
- settings = $.fn.form.settings;
1108
- validation = $.fn.form.settings.defaults;
1112
+ settings = $.extend(true, {}, $.fn.form.settings);
1113
+ validation = $.extend(true, {}, $.fn.form.settings.defaults);
1109
1114
  module.verbose('Using default form validation', validation, settings);
1110
1115
  }
1111
1116
 
@@ -1367,9 +1372,11 @@ $.fn.form = function(parameters) {
1367
1372
  }
1368
1373
  });
1369
1374
  module.debug('Adding rules', newValidation.rules, validation);
1375
+ module.refreshEvents();
1370
1376
  },
1371
1377
  fields: function(fields) {
1372
- validation = $.extend({}, validation, module.get.fieldsFromShorthand(fields));
1378
+ validation = $.extend(true, {}, validation, module.get.fieldsFromShorthand(fields));
1379
+ module.refreshEvents();
1373
1380
  },
1374
1381
  prompt: function(identifier, errors, internal) {
1375
1382
  var
@@ -1390,13 +1397,13 @@ $.fn.form = function(parameters) {
1390
1397
  }
1391
1398
  if(settings.inline) {
1392
1399
  if(!promptExists) {
1393
- $prompt = settings.templates.prompt(errors, className.label);
1400
+ $prompt = $('<div/>').addClass(className.label);
1394
1401
  $prompt
1395
1402
  .appendTo($fieldGroup)
1396
1403
  ;
1397
1404
  }
1398
1405
  $prompt
1399
- .html(errors[0])
1406
+ .html(settings.templates.prompt(errors))
1400
1407
  ;
1401
1408
  if(!promptExists) {
1402
1409
  if(settings.transition && module.can.useElement('transition') && $module.transition('is supported')) {
@@ -1466,6 +1473,7 @@ $.fn.form = function(parameters) {
1466
1473
  $.each(fields, function(index, field) {
1467
1474
  module.remove.rule(field);
1468
1475
  });
1476
+ module.refreshEvents();
1469
1477
  },
1470
1478
  // alias
1471
1479
  rules: function(field, rules) {
@@ -1589,12 +1597,15 @@ $.fn.form = function(parameters) {
1589
1597
  }
1590
1598
  else if(isCheckbox) {
1591
1599
  module.verbose('Setting checkbox value', value, $element);
1592
- if(value === true || value === 1) {
1600
+ if(value === true || value === 1 || value === 'on') {
1593
1601
  $element.checkbox('check');
1594
1602
  }
1595
1603
  else {
1596
1604
  $element.checkbox('uncheck');
1597
1605
  }
1606
+ if(typeof value === 'string') {
1607
+ $field.val(value);
1608
+ }
1598
1609
  }
1599
1610
  else if(isDropdown) {
1600
1611
  module.verbose('Setting dropdown value', value, $element);
@@ -1707,10 +1718,10 @@ $.fn.form = function(parameters) {
1707
1718
  if(event && $module.data('moduleApi') !== undefined) {
1708
1719
  event.stopImmediatePropagation();
1709
1720
  }
1710
- if(settings.errorFocus) {
1721
+ if(settings.errorFocus && ignoreCallbacks !== true) {
1711
1722
  var focusElement, hasTabIndex = true;
1712
1723
  if (typeof settings.errorFocus === 'string') {
1713
- focusElement = $(settings.errorFocus);
1724
+ focusElement = $(document).find(settings.errorFocus);
1714
1725
  hasTabIndex = focusElement.is('[tabindex]');
1715
1726
  // to be able to focus/scroll into non input elements we need a tabindex
1716
1727
  if (!hasTabIndex) {
@@ -2030,7 +2041,7 @@ $.fn.form.settings = {
2030
2041
 
2031
2042
  autoCheckRequired : false,
2032
2043
  preventLeaving : false,
2033
- errorFocus : false,
2044
+ errorFocus : true,
2034
2045
  dateHandling : 'date', // 'date', 'input', 'formatter'
2035
2046
 
2036
2047
  onValid : function() {},
@@ -2086,7 +2097,6 @@ $.fn.form.settings = {
2086
2097
  doesntContain : '{name} cannot contain "{ruleValue}"',
2087
2098
  doesntContainExactly : '{name} cannot contain exactly "{ruleValue}"',
2088
2099
  minLength : '{name} must be at least {ruleValue} characters',
2089
- length : '{name} must be at least {ruleValue} characters',
2090
2100
  exactLength : '{name} must be exactly {ruleValue} characters',
2091
2101
  maxLength : '{name} cannot be longer than {ruleValue} characters',
2092
2102
  match : '{name} must match {ruleValue} field',
@@ -2100,7 +2110,7 @@ $.fn.form.settings = {
2100
2110
  selector : {
2101
2111
  checkbox : 'input[type="checkbox"], input[type="radio"]',
2102
2112
  clear : '.clear',
2103
- field : 'input:not(.search):not([type="file"]), textarea, select',
2113
+ field : 'input:not(.search):not([type="file"]):not([type="reset"]):not([type="button"]):not([type="submit"]), textarea, select',
2104
2114
  group : '.field',
2105
2115
  input : 'input:not([type="file"])',
2106
2116
  message : '.error.message',
@@ -2141,15 +2151,22 @@ $.fn.form.settings = {
2141
2151
  html += '<li>' + value + '</li>';
2142
2152
  });
2143
2153
  html += '</ul>';
2144
- return $(html);
2154
+ return html;
2145
2155
  },
2146
2156
 
2147
- // template that produces label
2148
- prompt: function(errors, labelClasses) {
2149
- return $('<div/>')
2150
- .addClass(labelClasses)
2151
- .html(errors[0])
2157
+ // template that produces label content
2158
+ prompt: function(errors) {
2159
+ if(errors.length === 1){
2160
+ return errors[0];
2161
+ }
2162
+ var
2163
+ html = '<ul class="ui list">'
2152
2164
  ;
2165
+ $.each(errors, function(index, value) {
2166
+ html += '<li>' + value + '</li>';
2167
+ });
2168
+ html += '</ul>';
2169
+ return html;
2153
2170
  }
2154
2171
  },
2155
2172
 
@@ -2359,14 +2376,6 @@ $.fn.form.settings = {
2359
2376
  ;
2360
2377
  },
2361
2378
 
2362
- // see rls notes for 2.0.6 (this is a duplicate of minLength)
2363
- length: function(value, requiredLength) {
2364
- return (value !== undefined)
2365
- ? (value.length >= requiredLength)
2366
- : false
2367
- ;
2368
- },
2369
-
2370
2379
  // is exactly length
2371
2380
  exactLength: function(value, requiredLength) {
2372
2381
  return (value !== undefined)
@@ -2575,7 +2584,7 @@ $.fn.form.settings = {
2575
2584
  })( jQuery, window, document );
2576
2585
 
2577
2586
  /*!
2578
- * # Fomantic-UI 2.9.0-beta.3 - Accordion
2587
+ * # Fomantic-UI 2.9.0-beta.301+42e68bc - 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.3 - Calendar
3209
+ * # Fomantic-UI 2.9.0-beta.301+42e68bc - 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) {
@@ -3348,7 +3360,10 @@ $.fn.calendar = function(parameters) {
3348
3360
  module.refreshTooltips();
3349
3361
  return settings.onVisible.apply($container, arguments);
3350
3362
  };
3351
- var onHidden = settings.onHidden;
3363
+ var onHidden = function () {
3364
+ module.blur();
3365
+ return settings.onHidden.apply($container, arguments)
3366
+ }
3352
3367
  if (!$input.length) {
3353
3368
  //no input, $container has to handle focus/blur
3354
3369
  $container.attr('tabindex', '0');
@@ -3357,10 +3372,6 @@ $.fn.calendar = function(parameters) {
3357
3372
  module.focus();
3358
3373
  return settings.onVisible.apply($container, arguments);
3359
3374
  };
3360
- onHidden = function () {
3361
- module.blur();
3362
- return settings.onHidden.apply($container, arguments);
3363
- };
3364
3375
  }
3365
3376
  var onShow = function () {
3366
3377
  //reset the focus date onShow
@@ -3518,7 +3529,7 @@ $.fn.calendar = function(parameters) {
3518
3529
  var headerDate = isYear || isMonth ? new Date(year, 0, 1) :
3519
3530
  isDay ? new Date(year, month, 1) : new Date(year, month, day, hour, minute);
3520
3531
  var headerText = $('<span/>').addClass(className.link).appendTo(cell);
3521
- headerText.text(formatter.header(headerDate, mode, settings));
3532
+ headerText.text(module.helper.dateFormat(formatter[mode+'Header'], headerDate));
3522
3533
  var newMode = isMonth ? (settings.disableYear ? 'day' : 'year') :
3523
3534
  isDay ? (settings.disableMonth ? 'year' : 'month') : 'day';
3524
3535
  headerText.data(metadata.mode, newMode);
@@ -3566,7 +3577,7 @@ $.fn.calendar = function(parameters) {
3566
3577
  isHour ? new Date(year, month, day, i) : new Date(year, month, day, hour, i * settings.minTimeGap);
3567
3578
  var cellText = isYear ? i :
3568
3579
  isMonth ? settings.text.monthsShort[i] : isDay ? cellDate.getDate() :
3569
- formatter.time(cellDate, settings, true);
3580
+ module.helper.dateFormat(formatter.cellTime,cellDate);
3570
3581
  cell = $('<td/>').addClass(className.cell).appendTo(row);
3571
3582
  cell.text(cellText);
3572
3583
  cell.data(metadata.date, cellDate);
@@ -3585,6 +3596,19 @@ $.fn.calendar = function(parameters) {
3585
3596
  cell.attr("data-variation", disabledDate[metadata.variation]);
3586
3597
  }
3587
3598
  }
3599
+ if (mode === 'hour') {
3600
+ var disabledHour = module.helper.findHourAsObject(cellDate, mode, settings.disabledHours);
3601
+ if (disabledHour !== null && disabledHour[metadata.message]) {
3602
+ cell.attr("data-tooltip", disabledHour[metadata.message]);
3603
+ cell.attr("data-position", disabledHour[metadata.position] || tooltipPosition);
3604
+ if(disabledHour[metadata.inverted] || (isInverted && disabledHour[metadata.inverted] === undefined)) {
3605
+ cell.attr("data-inverted", '');
3606
+ }
3607
+ if(disabledHour[metadata.variation]) {
3608
+ cell.attr("data-variation", disabledHour[metadata.variation]);
3609
+ }
3610
+ }
3611
+ }
3588
3612
  } else {
3589
3613
  eventDate = module.helper.findDayAsObject(cellDate, mode, settings.eventDates);
3590
3614
  if (eventDate !== null) {
@@ -3685,7 +3709,7 @@ $.fn.calendar = function(parameters) {
3685
3709
  var winWidth = $(window).width();
3686
3710
  $container.find('td[data-position]').each(function () {
3687
3711
  var cell = $(this);
3688
- 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,'');
3689
3713
  var tooltipPosition = cell.attr('data-position');
3690
3714
  // use a fallback width of 250 (calendar width) for IE/Edge (which return "auto")
3691
3715
  var calcPosition = (winWidth - cell.width() - (parseInt(tooltipWidth,10) || 250)) > cell.offset().left ? 'right' : 'left';
@@ -3834,7 +3858,7 @@ $.fn.calendar = function(parameters) {
3834
3858
  $container.removeClass(className.active);
3835
3859
  if (settings.formatInput) {
3836
3860
  var date = module.get.date();
3837
- var text = formatter.datetime(date, settings);
3861
+ var text = module.helper.dateFormat(formatter[settings.type], date);
3838
3862
  $input.val(text);
3839
3863
  }
3840
3864
  if(selectionComplete){
@@ -3905,6 +3929,9 @@ $.fn.calendar = function(parameters) {
3905
3929
  return AWN - Math.floor(Date.UTC(Wyr, 0, 7) / ms7d) + 1;
3906
3930
  }();
3907
3931
  },
3932
+ formattedDate: function(format, date) {
3933
+ return module.helper.dateFormat(format || formatter[settings.type], date || module.get.date());
3934
+ },
3908
3935
  date: function () {
3909
3936
  return module.helper.sanitiseDate($module.data(metadata.date)) || null;
3910
3937
  },
@@ -3929,7 +3956,7 @@ $.fn.calendar = function(parameters) {
3929
3956
  return $module.data(metadata.maxDate) || null;
3930
3957
  },
3931
3958
  monthOffset: function () {
3932
- return $module.data(metadata.monthOffset) || 0;
3959
+ return $module.data(metadata.monthOffset) || settings.monthOffset || 0;
3933
3960
  },
3934
3961
  mode: function () {
3935
3962
  //only returns valid modes for the current settings
@@ -3983,7 +4010,7 @@ $.fn.calendar = function(parameters) {
3983
4010
  return null;
3984
4011
  }
3985
4012
  if (!(selector instanceof $)) {
3986
- selector = $(selector).first();
4013
+ selector = $(document).find(selector).first();
3987
4014
  }
3988
4015
  //assume range related calendars are using the same namespace
3989
4016
  return selector.data(moduleNamespace);
@@ -3998,7 +4025,7 @@ $.fn.calendar = function(parameters) {
3998
4025
  date = module.helper.dateInRange(date);
3999
4026
 
4000
4027
  var mode = module.get.mode();
4001
- var text = formatter.datetime(date, settings);
4028
+ var text = module.helper.dateFormat(formatter[settings.type],date);
4002
4029
 
4003
4030
  if (fireChange && settings.onBeforeChange.call(element, date, text, mode) === false) {
4004
4031
  return false;
@@ -4169,8 +4196,62 @@ $.fn.calendar = function(parameters) {
4169
4196
  },
4170
4197
 
4171
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
+ },
4172
4253
  isDisabled: function(date, mode) {
4173
- return (mode === 'day' || mode === 'month' || mode === 'year') && ((mode === 'day' && settings.disabledDaysOfWeek.indexOf(date.getDay()) !== -1) || settings.disabledDates.some(function(d){
4254
+ return (mode === 'day' || mode === 'month' || mode === 'year' || mode === 'hour') && (((mode === 'day' && settings.disabledDaysOfWeek.indexOf(date.getDay()) !== -1) || settings.disabledDates.some(function(d){
4174
4255
  if(typeof d === 'string') {
4175
4256
  d = module.helper.sanitiseDate(d);
4176
4257
  }
@@ -4203,7 +4284,45 @@ $.fn.calendar = function(parameters) {
4203
4284
  }
4204
4285
  }
4205
4286
  }
4206
- }));
4287
+ })) || (mode === 'hour' && settings.disabledHours.some(function(d){
4288
+ if (typeof d === 'string') {
4289
+ d = module.helper.sanitiseDate(d);
4290
+ }
4291
+ if (d instanceof Date) {
4292
+ return module.helper.dateEqual(date, d, mode);
4293
+ } else if (typeof d === 'number') {
4294
+ return date.getHours() === d;
4295
+ }
4296
+ if (d !== null && typeof d === 'object') {
4297
+ var blocked = true;
4298
+
4299
+ if (d[metadata.date]) {
4300
+ if (d[metadata.date] instanceof Date) {
4301
+ blocked = module.helper.dateEqual(date, module.helper.sanitiseDate(d[metadata.date]));
4302
+ } else if (Array.isArray(d[metadata.date])) {
4303
+ return d[metadata.date].some(function(idate) {
4304
+ blocked = module.helper.dateEqual(date, idate, mode);
4305
+ });
4306
+ }
4307
+ }
4308
+
4309
+ if (d[metadata.days]) {
4310
+ if (typeof d[metadata.days] === 'number') {
4311
+ blocked = date.getDay() == d[metadata.days];
4312
+ } else if (Array.isArray(d[metadata.days])) {
4313
+ blocked = d[metadata.days].indexOf(date.getDay()) > -1;
4314
+ }
4315
+ }
4316
+
4317
+ if (d[metadata.hours]) {
4318
+ if (typeof d[metadata.hours] === 'number') {
4319
+ return blocked && date.getHours() == d[metadata.hours];
4320
+ } else if (Array.isArray(d[metadata.hours])) {
4321
+ return blocked && d[metadata.hours].indexOf(date.getHours()) > -1;
4322
+ }
4323
+ }
4324
+ }
4325
+ })));
4207
4326
  },
4208
4327
  isEnabled: function(date, mode) {
4209
4328
  if (mode === 'day') {
@@ -4271,6 +4390,49 @@ $.fn.calendar = function(parameters) {
4271
4390
  }
4272
4391
  return null;
4273
4392
  },
4393
+ findHourAsObject: function(date, mode, hours) {
4394
+ if (mode === 'hour') {
4395
+ var d;
4396
+ var hourCheck = function(date, d) {
4397
+ if (d[metadata.hours]) {
4398
+ if (typeof d[metadata.hours] === 'number' && date.getHours() == d[metadata.hours]) {
4399
+ return d;
4400
+ } else if (Array.isArray(d[metadata.hours])) {
4401
+ if (d[metadata.hours].indexOf(date.getHours()) > -1) {
4402
+ return d;
4403
+ }
4404
+ }
4405
+ }
4406
+ }
4407
+ for (var i = 0; i < hours.length; i++) {
4408
+ d = hours[i];
4409
+ if (typeof d === 'number' && date.getHours() == d) {
4410
+ return null;
4411
+ } else if (d !== null && typeof d === 'object') {
4412
+ if (d[metadata.days] && hourCheck(date,d)) {
4413
+ if (typeof d[metadata.days] === 'number' && date.getDay() == d[metadata.days]) {
4414
+ return d;
4415
+ } else if (Array.isArray(d[metadata.days])) {
4416
+ if (d[metadata.days].indexOf(date.getDay()) > -1) {
4417
+ return d;
4418
+ }
4419
+ }
4420
+ } else if (d[metadata.date] && hourCheck(date,d)) {
4421
+ if (d[metadata.date] instanceof Date && module.helper.dateEqual(date, module.helper.sanitiseDate(d[metadata.date]))) {
4422
+ return d;
4423
+ } else if (Array.isArray(d[metadata.date])) {
4424
+ if (d[metadata.date].some(function(idate) { return module.helper.dateEqual(date, idate, mode); })) {
4425
+ return d;
4426
+ }
4427
+ }
4428
+ } else if (hourCheck(date,d)) {
4429
+ return d;
4430
+ }
4431
+ }
4432
+ }
4433
+ }
4434
+ return null;
4435
+ },
4274
4436
  sanitiseDate: function (date) {
4275
4437
  if (!(date instanceof Date)) {
4276
4438
  date = parser.date('' + date, settings);
@@ -4538,7 +4700,7 @@ $.fn.calendar.settings = {
4538
4700
  constantHeight : true, // add rows to shorter months to keep day calendar height consistent (6 rows)
4539
4701
  today : false, // show a 'today/now' button at the bottom of the calendar
4540
4702
  closable : true, // close the popup after selecting a date/time
4541
- monthFirst : true, // month before day when parsing/converting date from/to text
4703
+ monthFirst : true, // month before day when parsing date from text
4542
4704
  touchReadonly : true, // set input to readonly on touch devices
4543
4705
  inline : false, // create the calendar inline instead of inside a popup
4544
4706
  on : null, // when to show the popup (defaults to 'focus' for input, 'click' for others)
@@ -4546,7 +4708,6 @@ $.fn.calendar.settings = {
4546
4708
  startMode : false, // display mode to start in, can be 'year', 'month', 'day', 'hour', 'minute' (false = 'day')
4547
4709
  minDate : null, // minimum date/time that can be selected, dates/times before are disabled
4548
4710
  maxDate : null, // maximum date/time that can be selected, dates/times after are disabled
4549
- ampm : true, // show am/pm in time mode
4550
4711
  disableYear : false, // disable year selection mode
4551
4712
  disableMonth : false, // disable month selection mode
4552
4713
  disableMinute : false, // disable minute selection mode
@@ -4554,8 +4715,10 @@ $.fn.calendar.settings = {
4554
4715
  startCalendar : null, // jquery object or selector for another calendar that represents the start date of a date range
4555
4716
  endCalendar : null, // jquery object or selector for another calendar that represents the end date of a date range
4556
4717
  multiMonth : 1, // show multiple months when in 'day' mode
4718
+ monthOffset : 0, // position current month by offset when multimonth > 1
4557
4719
  minTimeGap : 5,
4558
- 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
4721
+ disabledHours : [], // specific hour(s) which won't be selectable and contain additional information.
4559
4722
  disabledDates : [], // specific day(s) which won't be selectable and contain additional information.
4560
4723
  disabledDaysOfWeek : [], // day(s) which won't be selectable(s) (0 = Sunday)
4561
4724
  enabledDates : [], // specific day(s) which will be selectable, all other days will be disabled
@@ -4568,11 +4731,14 @@ $.fn.calendar.settings = {
4568
4731
  position: 'bottom left',
4569
4732
  lastResort: 'bottom left',
4570
4733
  prefer: 'opposite',
4734
+ observeChanges: false,
4571
4735
  hideOnScroll: false
4572
4736
  },
4573
4737
 
4574
4738
  text: {
4575
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'],
4576
4742
  months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
4577
4743
  monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
4578
4744
  today: 'Today',
@@ -4583,67 +4749,23 @@ $.fn.calendar.settings = {
4583
4749
  },
4584
4750
 
4585
4751
  formatter: {
4586
- header: function (date, mode, settings) {
4587
- return mode === 'year' ? settings.formatter.yearHeader(date, settings) :
4588
- mode === 'month' ? settings.formatter.monthHeader(date, settings) :
4589
- mode === 'day' ? settings.formatter.dayHeader(date, settings) :
4590
- mode === 'hour' ? settings.formatter.hourHeader(date, settings) :
4591
- settings.formatter.minuteHeader(date, settings);
4592
- },
4593
4752
  yearHeader: function (date, settings) {
4594
4753
  var decadeYear = Math.ceil(date.getFullYear() / 10) * 10;
4595
4754
  return (decadeYear - 9) + ' - ' + (decadeYear + 2);
4596
4755
  },
4597
- monthHeader: function (date, settings) {
4598
- return date.getFullYear();
4599
- },
4600
- dayHeader: function (date, settings) {
4601
- var month = settings.text.months[date.getMonth()];
4602
- var year = date.getFullYear();
4603
- return month + ' ' + year;
4604
- },
4605
- hourHeader: function (date, settings) {
4606
- return settings.formatter.date(date, settings);
4607
- },
4608
- minuteHeader: function (date, settings) {
4609
- return settings.formatter.date(date, settings);
4610
- },
4756
+ monthHeader: 'YYYY',
4757
+ dayHeader: 'MMMM YYYY',
4758
+ hourHeader: 'MMMM D, YYYY',
4759
+ minuteHeader: 'MMMM D, YYYY',
4611
4760
  dayColumnHeader: function (day, settings) {
4612
4761
  return settings.text.days[day];
4613
4762
  },
4614
- datetime: function (date, settings) {
4615
- if (!date) {
4616
- return '';
4617
- }
4618
- var day = settings.type === 'time' ? '' : settings.formatter.date(date, settings);
4619
- var time = settings.type.indexOf('time') < 0 ? '' : settings.formatter.time(date, settings, false);
4620
- var separator = settings.type === 'datetime' ? ' ' : '';
4621
- return day + separator + time;
4622
- },
4623
- date: function (date, settings) {
4624
- if (!date) {
4625
- return '';
4626
- }
4627
- var day = date.getDate();
4628
- var month = settings.text.months[date.getMonth()];
4629
- var year = date.getFullYear();
4630
- return settings.type === 'year' ? year :
4631
- settings.type === 'month' ? month + ' ' + year :
4632
- (settings.monthFirst ? month + ' ' + day : day + ' ' + month) + ', ' + year;
4633
- },
4634
- time: function (date, settings, forCalendar) {
4635
- if (!date) {
4636
- return '';
4637
- }
4638
- var hour = date.getHours();
4639
- var minute = date.getMinutes();
4640
- var ampm = '';
4641
- if (settings.ampm) {
4642
- ampm = ' ' + (hour < 12 ? settings.text.am : settings.text.pm);
4643
- hour = hour === 0 ? 12 : hour > 12 ? hour - 12 : hour;
4644
- }
4645
- return hour + ':' + (minute < 10 ? '0' : '') + minute + ampm;
4646
- },
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',
4647
4769
  today: function (settings) {
4648
4770
  return settings.type === 'date' ? settings.text.today : settings.text.now;
4649
4771
  },
@@ -4659,7 +4781,7 @@ $.fn.calendar.settings = {
4659
4781
  if (!text) {
4660
4782
  return null;
4661
4783
  }
4662
- text = String(text).trim();
4784
+ text = String(text).trim().replace(/([.:\/\-])\s+/g,'$1').replace(/\s+([.:\/-])/g,'$1').replace(/\s+/g,' ');
4663
4785
  if (text.length === 0) {
4664
4786
  return null;
4665
4787
  }
@@ -4912,7 +5034,8 @@ $.fn.calendar.settings = {
4912
5034
 
4913
5035
  regExp: {
4914
5036
  dateWords: /[^A-Za-z\u00C0-\u024F]+/g,
4915
- dateNumbers: /[^\d:]+/g
5037
+ dateNumbers: /[^\d:]+/g,
5038
+ token: /d{1,4}|D{1,2}|M{1,4}|YY(?:YY)?|([Hhmsw])\1?|[SAaY]|"[^"]*"|'[^']*'/g
4916
5039
  },
4917
5040
 
4918
5041
  error: {
@@ -4961,7 +5084,9 @@ $.fn.calendar.settings = {
4961
5084
  variation: 'variation',
4962
5085
  position: 'position',
4963
5086
  month: 'month',
4964
- year: 'year'
5087
+ year: 'year',
5088
+ hours: 'hours',
5089
+ days: 'days'
4965
5090
  },
4966
5091
 
4967
5092
  eventClass: 'blue'
@@ -4970,7 +5095,7 @@ $.fn.calendar.settings = {
4970
5095
  })(jQuery, window, document);
4971
5096
 
4972
5097
  /*!
4973
- * # Fomantic-UI 2.9.0-beta.3 - Checkbox
5098
+ * # Fomantic-UI 2.9.0-beta.301+42e68bc - Checkbox
4974
5099
  * http://github.com/fomantic/Fomantic-UI/
4975
5100
  *
4976
5101
  *
@@ -5210,18 +5335,26 @@ $.fn.checkbox = function(parameters) {
5210
5335
  }
5211
5336
  }
5212
5337
 
5338
+ shortcutPressed = false;
5213
5339
  if(key == keyCode.escape) {
5214
5340
  module.verbose('Escape key pressed blurring field');
5215
5341
  $input.blur();
5216
5342
  shortcutPressed = true;
5217
5343
  }
5218
- else if(!event.ctrlKey && ( key == keyCode.space || (key == keyCode.enter && settings.enableEnterKey)) ) {
5219
- module.verbose('Enter/space key pressed, toggling checkbox');
5220
- module.toggle();
5221
- shortcutPressed = true;
5222
- }
5223
- else {
5224
- 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
+ }
5225
5358
  }
5226
5359
  },
5227
5360
  keyup: function(event) {
@@ -5294,7 +5427,6 @@ $.fn.checkbox = function(parameters) {
5294
5427
  settings.onEnable.call(input);
5295
5428
  // preserve legacy callbacks
5296
5429
  settings.onEnabled.call(input);
5297
- module.trigger.change();
5298
5430
  }
5299
5431
  },
5300
5432
 
@@ -5309,7 +5441,6 @@ $.fn.checkbox = function(parameters) {
5309
5441
  settings.onDisable.call(input);
5310
5442
  // preserve legacy callbacks
5311
5443
  settings.onDisabled.call(input);
5312
- module.trigger.change();
5313
5444
  }
5314
5445
  },
5315
5446
 
@@ -5837,7 +5968,7 @@ $.fn.checkbox.settings = {
5837
5968
 
5838
5969
  selector : {
5839
5970
  checkbox : '.ui.checkbox',
5840
- label : 'label, .box',
5971
+ label : 'label',
5841
5972
  input : 'input[type="checkbox"], input[type="radio"]',
5842
5973
  link : 'a[href]'
5843
5974
  }
@@ -5847,7 +5978,7 @@ $.fn.checkbox.settings = {
5847
5978
  })( jQuery, window, document );
5848
5979
 
5849
5980
  /*!
5850
- * # Fomantic-UI 2.9.0-beta.3 - Dimmer
5981
+ * # Fomantic-UI 2.9.0-beta.301+42e68bc - Dimmer
5851
5982
  * http://github.com/fomantic/Fomantic-UI/
5852
5983
  *
5853
5984
  *
@@ -6040,11 +6171,14 @@ $.fn.dimmer = function(parameters) {
6040
6171
  ? callback
6041
6172
  : function(){}
6042
6173
  ;
6043
- module.debug('Showing dimmer', $dimmer, settings);
6044
- module.set.variation();
6045
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();
6046
6181
  module.animate.show(callback);
6047
- settings.onShow.call(element);
6048
6182
  settings.onChange.call(element);
6049
6183
  }
6050
6184
  else {
@@ -6058,9 +6192,12 @@ $.fn.dimmer = function(parameters) {
6058
6192
  : function(){}
6059
6193
  ;
6060
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
+ }
6061
6199
  module.debug('Hiding dimmer', $dimmer);
6062
6200
  module.animate.hide(callback);
6063
- settings.onHide.call(element);
6064
6201
  settings.onChange.call(element);
6065
6202
  }
6066
6203
  else {
@@ -6604,7 +6741,7 @@ $.fn.dimmer.settings = {
6604
6741
  })( jQuery, window, document );
6605
6742
 
6606
6743
  /*!
6607
- * # Fomantic-UI 2.9.0-beta.3 - Dropdown
6744
+ * # Fomantic-UI 2.9.0-beta.301+42e68bc - Dropdown
6608
6745
  * http://github.com/fomantic/Fomantic-UI/
6609
6746
  *
6610
6747
  *
@@ -6635,11 +6772,6 @@ $.fn.dropdown = function(parameters) {
6635
6772
 
6636
6773
  moduleSelector = $allModules.selector || '',
6637
6774
 
6638
- hasTouch = ('ontouchstart' in document.documentElement),
6639
- clickEvent = hasTouch
6640
- ? 'touchstart'
6641
- : 'click',
6642
-
6643
6775
  time = new Date().getTime(),
6644
6776
  performance = [],
6645
6777
 
@@ -6671,7 +6803,7 @@ $.fn.dropdown = function(parameters) {
6671
6803
  moduleNamespace = 'module-' + namespace,
6672
6804
 
6673
6805
  $module = $(this),
6674
- $context = $(settings.context),
6806
+ $context = [window,document].indexOf(settings.context) < 0 ? $(document).find(settings.context) : $(settings.context),
6675
6807
  $text = $module.find(selector.text),
6676
6808
  $search = $module.find(selector.search),
6677
6809
  $sizer = $module.find(selector.sizer),
@@ -6805,6 +6937,7 @@ $.fn.dropdown = function(parameters) {
6805
6937
  select: function() {
6806
6938
  if(module.has.input() && selectObserver) {
6807
6939
  selectObserver.observe($module[0], {
6940
+ attributes: true,
6808
6941
  childList : true,
6809
6942
  subtree : true
6810
6943
  });
@@ -6829,7 +6962,7 @@ $.fn.dropdown = function(parameters) {
6829
6962
 
6830
6963
  create: {
6831
6964
  id: function() {
6832
- id = (Math.random().toString(16) + '000000000').substr(2, 8);
6965
+ id = (Math.random().toString(16) + '000000000').slice(2, 10);
6833
6966
  elementNamespace = '.' + id;
6834
6967
  module.verbose('Creating unique id for element', id);
6835
6968
  },
@@ -7026,6 +7159,9 @@ $.fn.dropdown = function(parameters) {
7026
7159
  module.debug('Disabling dropdown');
7027
7160
  $module.addClass(className.disabled);
7028
7161
  }
7162
+ if($input.is('[required]')) {
7163
+ settings.forceSelection = true;
7164
+ }
7029
7165
  $input
7030
7166
  .removeAttr('required')
7031
7167
  .removeAttr('class')
@@ -7142,9 +7278,7 @@ $.fn.dropdown = function(parameters) {
7142
7278
  }
7143
7279
  if(settings.onShow.call(element) !== false) {
7144
7280
  module.animate.show(function() {
7145
- if( module.can.click() ) {
7146
- module.bind.intent();
7147
- }
7281
+ module.bind.intent();
7148
7282
  if(module.has.search() && !preventFocus) {
7149
7283
  module.focusSearch();
7150
7284
  }
@@ -7165,14 +7299,23 @@ $.fn.dropdown = function(parameters) {
7165
7299
  if(settings.onHide.call(element) !== false) {
7166
7300
  module.animate.hide(function() {
7167
7301
  module.remove.visible();
7168
- // hidding search focus
7302
+ // hiding search focus
7169
7303
  if ( module.is.focusedOnSearch() && preventBlur !== true ) {
7170
7304
  $search.blur();
7171
7305
  }
7172
7306
  callback.call(element);
7173
7307
  });
7308
+ // Hide submenus explicitly. On some browsers (esp. mobile), they will not automatically receive a
7309
+ // mouseleave event
7310
+ var $subMenu = $module.find(selector.menu);
7311
+ if($subMenu.length > 0) {
7312
+ module.verbose('Hiding sub-menu', $subMenu);
7313
+ $subMenu.each(function() {
7314
+ module.animate.hide(false, $(this));
7315
+ });
7316
+ }
7174
7317
  }
7175
- } else if( module.can.click() ) {
7318
+ } else {
7176
7319
  module.unbind.intent();
7177
7320
  }
7178
7321
  iconClicked = false;
@@ -7230,13 +7373,18 @@ $.fn.dropdown = function(parameters) {
7230
7373
  $module
7231
7374
  .on('change' + eventNamespace, selector.input, module.event.change)
7232
7375
  ;
7376
+ if(module.is.multiple() && module.is.searchSelection()) {
7377
+ $module
7378
+ .on('paste' + eventNamespace, selector.search, module.event.paste)
7379
+ ;
7380
+ }
7233
7381
  },
7234
7382
  mouseEvents: function() {
7235
7383
  module.verbose('Binding mouse events');
7236
7384
  if(module.is.multiple()) {
7237
7385
  $module
7238
- .on(clickEvent + eventNamespace, selector.label, module.event.label.click)
7239
- .on(clickEvent + eventNamespace, selector.remove, module.event.remove.click)
7386
+ .on('click' + eventNamespace, selector.label, module.event.label.click)
7387
+ .on('click' + eventNamespace, selector.remove, module.event.remove.click)
7240
7388
  ;
7241
7389
  }
7242
7390
  if( module.is.searchSelection() ) {
@@ -7245,31 +7393,33 @@ $.fn.dropdown = function(parameters) {
7245
7393
  .on('mouseup' + eventNamespace, module.event.mouseup)
7246
7394
  .on('mousedown' + eventNamespace, selector.menu, module.event.menu.mousedown)
7247
7395
  .on('mouseup' + eventNamespace, selector.menu, module.event.menu.mouseup)
7248
- .on(clickEvent + eventNamespace, selector.icon, module.event.icon.click)
7249
- .on(clickEvent + eventNamespace, selector.clearIcon, module.event.clearIcon.click)
7396
+ .on('click' + eventNamespace, selector.icon, module.event.icon.click)
7397
+ .on('click' + eventNamespace, selector.clearIcon, module.event.clearIcon.click)
7250
7398
  .on('focus' + eventNamespace, selector.search, module.event.search.focus)
7251
- .on(clickEvent + eventNamespace, selector.search, module.event.search.focus)
7399
+ .on('click' + eventNamespace, selector.search, module.event.search.focus)
7252
7400
  .on('blur' + eventNamespace, selector.search, module.event.search.blur)
7253
- .on(clickEvent + eventNamespace, selector.text, module.event.text.focus)
7401
+ .on('click' + eventNamespace, selector.text, module.event.text.focus)
7254
7402
  ;
7255
7403
  if(module.is.multiple()) {
7256
7404
  $module
7257
- .on(clickEvent + eventNamespace, module.event.click)
7258
- .on(clickEvent + eventNamespace, module.event.search.focus)
7405
+ .on('click' + eventNamespace, module.event.click)
7406
+ .on('click' + eventNamespace, module.event.search.focus)
7259
7407
  ;
7260
7408
  }
7261
7409
  }
7262
7410
  else {
7263
7411
  if(settings.on == 'click') {
7264
7412
  $module
7265
- .on(clickEvent + eventNamespace, selector.icon, module.event.icon.click)
7266
- .on(clickEvent + eventNamespace, module.event.test.toggle)
7413
+ .on('click' + eventNamespace, selector.icon, module.event.icon.click)
7414
+ .on('click' + eventNamespace, module.event.test.toggle)
7267
7415
  ;
7268
7416
  }
7269
7417
  else if(settings.on == 'hover') {
7270
7418
  $module
7271
7419
  .on('mouseenter' + eventNamespace, module.delay.show)
7272
7420
  .on('mouseleave' + eventNamespace, module.delay.hide)
7421
+ .on('touchstart' + eventNamespace, module.event.test.toggle)
7422
+ .on('touchstart' + eventNamespace, selector.icon, module.event.icon.click)
7273
7423
  ;
7274
7424
  }
7275
7425
  else {
@@ -7281,7 +7431,7 @@ $.fn.dropdown = function(parameters) {
7281
7431
  .on('mousedown' + eventNamespace, module.event.mousedown)
7282
7432
  .on('mouseup' + eventNamespace, module.event.mouseup)
7283
7433
  .on('focus' + eventNamespace, module.event.focus)
7284
- .on(clickEvent + eventNamespace, selector.clearIcon, module.event.clearIcon.click)
7434
+ .on('click' + eventNamespace, selector.clearIcon, module.event.clearIcon.click)
7285
7435
  ;
7286
7436
  if(module.has.menuSearch() ) {
7287
7437
  $module
@@ -7295,21 +7445,16 @@ $.fn.dropdown = function(parameters) {
7295
7445
  }
7296
7446
  }
7297
7447
  $menu
7298
- .on((hasTouch ? 'touchstart' : 'mouseenter') + eventNamespace, selector.item, module.event.item.mouseenter)
7448
+ .on('mouseenter' + eventNamespace, selector.item, module.event.item.mouseenter)
7449
+ .on('touchstart' + eventNamespace, selector.item, module.event.item.mouseenter)
7299
7450
  .on('mouseleave' + eventNamespace, selector.item, module.event.item.mouseleave)
7300
7451
  .on('click' + eventNamespace, selector.item, module.event.item.click)
7301
7452
  ;
7302
7453
  },
7303
7454
  intent: function() {
7304
7455
  module.verbose('Binding hide intent event to document');
7305
- if(hasTouch) {
7306
- $document
7307
- .on('touchstart' + elementNamespace, module.event.test.touch)
7308
- .on('touchmove' + elementNamespace, module.event.test.touch)
7309
- ;
7310
- }
7311
7456
  $document
7312
- .on(clickEvent + elementNamespace, module.event.test.hide)
7457
+ .on('click' + elementNamespace, module.event.test.hide)
7313
7458
  ;
7314
7459
  }
7315
7460
  },
@@ -7317,14 +7462,8 @@ $.fn.dropdown = function(parameters) {
7317
7462
  unbind: {
7318
7463
  intent: function() {
7319
7464
  module.verbose('Removing hide intent event from document');
7320
- if(hasTouch) {
7321
- $document
7322
- .off('touchstart' + elementNamespace)
7323
- .off('touchmove' + elementNamespace)
7324
- ;
7325
- }
7326
7465
  $document
7327
- .off(clickEvent + elementNamespace)
7466
+ .off('click' + elementNamespace)
7328
7467
  ;
7329
7468
  }
7330
7469
  },
@@ -7417,20 +7556,28 @@ $.fn.dropdown = function(parameters) {
7417
7556
  throttle : settings.throttle,
7418
7557
  urlData : {
7419
7558
  query: query
7420
- },
7421
- onError: function() {
7559
+ }
7560
+ },
7561
+ apiCallbacks = {
7562
+ onError: function(errorMessage, $module, xhr) {
7422
7563
  module.add.message(message.serverError);
7423
7564
  iconClicked = false;
7424
7565
  focused = false;
7425
7566
  callback.apply(null, callbackParameters);
7567
+ if(typeof settings.apiSettings.onError === 'function') {
7568
+ settings.apiSettings.onError.call(this, errorMessage, $module, xhr);
7569
+ }
7426
7570
  },
7427
- onFailure: function() {
7571
+ onFailure: function(response, $module, xhr) {
7428
7572
  module.add.message(message.serverError);
7429
7573
  iconClicked = false;
7430
7574
  focused = false;
7431
7575
  callback.apply(null, callbackParameters);
7576
+ if(typeof settings.apiSettings.onFailure === 'function') {
7577
+ settings.apiSettings.onFailure.call(this, response, $module, xhr);
7578
+ }
7432
7579
  },
7433
- onSuccess : function(response) {
7580
+ onSuccess : function(response, $module, xhr) {
7434
7581
  var
7435
7582
  values = response[fields.remoteValues]
7436
7583
  ;
@@ -7449,19 +7596,22 @@ $.fn.dropdown = function(parameters) {
7449
7596
  var value = module.is.multiple() ? module.get.values() : module.get.value();
7450
7597
  if (value !== '') {
7451
7598
  module.verbose('Value(s) present after click icon, select value(s) in items');
7452
- module.set.selected(value, null, null, true);
7599
+ module.set.selected(value, null, true, true);
7453
7600
  }
7454
7601
  }
7455
7602
  iconClicked = false;
7456
7603
  focused = false;
7457
7604
  callback.apply(null, callbackParameters);
7605
+ if(typeof settings.apiSettings.onSuccess === 'function') {
7606
+ settings.apiSettings.onSuccess.call(this, response, $module, xhr);
7607
+ }
7458
7608
  }
7459
7609
  }
7460
7610
  ;
7461
7611
  if( !$module.api('get request') ) {
7462
7612
  module.setup.api();
7463
7613
  }
7464
- apiSettings = $.extend(true, {}, apiSettings, settings.apiSettings);
7614
+ apiSettings = $.extend(true, {}, apiSettings, settings.apiSettings, apiCallbacks);
7465
7615
  $module
7466
7616
  .api('setting', apiSettings)
7467
7617
  .api('query')
@@ -7649,7 +7799,7 @@ $.fn.dropdown = function(parameters) {
7649
7799
  menuConfig[fields.values] = values;
7650
7800
  module.setup.menu(menuConfig);
7651
7801
  $.each(values, function(index, item) {
7652
- if(item.selected == true) {
7802
+ if(item.selected === true) {
7653
7803
  module.debug('Setting initial selection to', item[fields.value]);
7654
7804
  module.set.selected(item[fields.value]);
7655
7805
  if(!module.is.multiple()) {
@@ -7670,7 +7820,7 @@ $.fn.dropdown = function(parameters) {
7670
7820
  settings.preserveHTML
7671
7821
  )
7672
7822
  ;
7673
- $input.append('<option value="' + value + '">' + name + '</option>');
7823
+ $input.append('<option value="' + value + '"' + (item.selected === true ? ' selected' : '') + '>' + name + '</option>');
7674
7824
  });
7675
7825
  module.observe.select();
7676
7826
  }
@@ -7678,6 +7828,15 @@ $.fn.dropdown = function(parameters) {
7678
7828
  },
7679
7829
 
7680
7830
  event: {
7831
+ paste: function(event) {
7832
+ var pasteValue = (event.originalEvent.clipboardData || window.clipboardData).getData('text'),
7833
+ tokens = pasteValue.split(settings.delimiter)
7834
+ ;
7835
+ tokens.forEach(function(value){
7836
+ module.set.selected(module.escape.htmlEntities(value.trim()), null, true, true);
7837
+ });
7838
+ event.preventDefault();
7839
+ },
7681
7840
  change: function() {
7682
7841
  if(!internalChange) {
7683
7842
  module.debug('Input changed, updating selection');
@@ -7736,7 +7895,7 @@ $.fn.dropdown = function(parameters) {
7736
7895
  if(module.is.multiple()) {
7737
7896
  module.remove.activeLabel();
7738
7897
  }
7739
- if(!focused && !module.is.active() && (settings.showOnFocus || (event.type !== 'focus' && event.type !== 'focusin'))) {
7898
+ if(!focused && !module.is.active() && (settings.showOnFocus || (event.type !== 'focus' && event.type !== 'focusin')) && event.type !== 'touchstart') {
7740
7899
  focused = true;
7741
7900
  module.search();
7742
7901
  }
@@ -7854,23 +8013,12 @@ $.fn.dropdown = function(parameters) {
7854
8013
  if (!module.is.multiple() || (module.is.multiple() && !module.is.active())) {
7855
8014
  focused = true;
7856
8015
  }
7857
- if( module.determine.eventOnElement(event, toggleBehavior) ) {
8016
+ if( module.determine.eventOnElement(event, toggleBehavior) && event.type !== 'touchstart') {
8017
+ // do not preventDefault of touchstart; so emulated mouseenter is triggered on first touch and not later
8018
+ // (when selecting an item). The double-showing of the dropdown through both events does not hurt.
7858
8019
  event.preventDefault();
7859
8020
  }
7860
8021
  },
7861
- touch: function(event) {
7862
- module.determine.eventOnElement(event, function() {
7863
- if(event.type == 'touchstart') {
7864
- module.timer = setTimeout(function() {
7865
- module.hide();
7866
- }, settings.delay.touch);
7867
- }
7868
- else if(event.type == 'touchmove') {
7869
- clearTimeout(module.timer);
7870
- }
7871
- });
7872
- event.stopPropagation();
7873
- },
7874
8022
  hide: function(event) {
7875
8023
  if(module.determine.eventInModule(event, module.hide)){
7876
8024
  if(element.id && $(event.target).attr('for') === element.id){
@@ -7890,8 +8038,8 @@ $.fn.dropdown = function(parameters) {
7890
8038
  },
7891
8039
  select: {
7892
8040
  mutation: function(mutations) {
7893
- module.debug('<select> modified, recreating menu');
7894
8041
  if(module.is.selectMutation(mutations)) {
8042
+ module.debug('<select> modified, recreating menu');
7895
8043
  module.disconnect.selectObserver();
7896
8044
  module.refresh();
7897
8045
  module.setup.select();
@@ -7954,13 +8102,15 @@ $.fn.dropdown = function(parameters) {
7954
8102
  },
7955
8103
  mouseleave: function(event) {
7956
8104
  var
7957
- $subMenu = $(this).children(selector.menu)
8105
+ $subMenu = $(this).find(selector.menu)
7958
8106
  ;
7959
8107
  if($subMenu.length > 0) {
7960
8108
  clearTimeout(module.itemTimer);
7961
8109
  module.itemTimer = setTimeout(function() {
7962
8110
  module.verbose('Hiding sub-menu', $subMenu);
7963
- module.animate.hide(false, $subMenu);
8111
+ $subMenu.each(function() {
8112
+ module.animate.hide(false, $(this));
8113
+ });
7964
8114
  }, settings.delay.hide);
7965
8115
  }
7966
8116
  },
@@ -7986,7 +8136,7 @@ $.fn.dropdown = function(parameters) {
7986
8136
  module.remove.userAddition();
7987
8137
  }
7988
8138
  module.remove.searchTerm();
7989
- if(!module.is.focusedOnSearch() && !(skipRefocus == true)) {
8139
+ if(!module.is.focusedOnSearch() && skipRefocus !== true) {
7990
8140
  module.focusSearch(true);
7991
8141
  }
7992
8142
  }
@@ -8118,7 +8268,7 @@ $.fn.dropdown = function(parameters) {
8118
8268
  keydown: function(event) {
8119
8269
  var
8120
8270
  pressedKey = event.which,
8121
- isShortcutKey = module.is.inObject(pressedKey, keys)
8271
+ isShortcutKey = module.is.inObject(pressedKey, keys) || event.key === settings.delimiter
8122
8272
  ;
8123
8273
  if(isShortcutKey) {
8124
8274
  var
@@ -8136,7 +8286,7 @@ $.fn.dropdown = function(parameters) {
8136
8286
  hasSubMenu = ($subMenu.length> 0),
8137
8287
  hasSelectedItem = ($selectedItem.length > 0),
8138
8288
  selectedIsSelectable = ($selectedItem.not(selector.unselectable).length > 0),
8139
- delimiterPressed = (pressedKey == keys.delimiter && settings.allowAdditions && module.is.multiple()),
8289
+ delimiterPressed = (event.key === settings.delimiter && module.is.multiple()),
8140
8290
  isAdditionWithoutMenu = (settings.allowAdditions && settings.hideAdditions && (pressedKey == keys.enter || delimiterPressed) && selectedIsSelectable),
8141
8291
  $nextItem,
8142
8292
  isSubMenuItem,
@@ -8234,7 +8384,7 @@ $.fn.dropdown = function(parameters) {
8234
8384
  .addClass(className.selected)
8235
8385
  ;
8236
8386
  module.set.scrollPosition($nextItem);
8237
- if(settings.selectOnKeydown && module.is.single()) {
8387
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
8238
8388
  module.set.selectedItem($nextItem);
8239
8389
  }
8240
8390
  }
@@ -8261,7 +8411,7 @@ $.fn.dropdown = function(parameters) {
8261
8411
  .addClass(className.selected)
8262
8412
  ;
8263
8413
  module.set.scrollPosition($nextItem);
8264
- if(settings.selectOnKeydown && module.is.single()) {
8414
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
8265
8415
  module.set.selectedItem($nextItem);
8266
8416
  }
8267
8417
  }
@@ -8392,7 +8542,7 @@ $.fn.dropdown = function(parameters) {
8392
8542
  ;
8393
8543
  if( module.can.activate( $(element) ) ) {
8394
8544
  module.set.selected(value, $(element));
8395
- if(!module.is.multiple()) {
8545
+ if(!module.is.multiple() && !(!settings.collapseOnActionable && $(element).hasClass(className.actionable))) {
8396
8546
  module.hideAndClear();
8397
8547
  }
8398
8548
  }
@@ -8405,7 +8555,7 @@ $.fn.dropdown = function(parameters) {
8405
8555
  ;
8406
8556
  if( module.can.activate( $(element) ) ) {
8407
8557
  module.set.value(value, text, $(element));
8408
- if(!module.is.multiple()) {
8558
+ if(!module.is.multiple() && !(!settings.collapseOnActionable && $(element).hasClass(className.actionable))) {
8409
8559
  module.hideAndClear();
8410
8560
  }
8411
8561
  }
@@ -8456,7 +8606,7 @@ $.fn.dropdown = function(parameters) {
8456
8606
  ;
8457
8607
  $sizer.text(value);
8458
8608
  // prevent rounding issues
8459
- return Math.ceil( $sizer.width() + 1);
8609
+ return Math.ceil( $sizer.width() + (module.is.edge() ? 3 : 1));
8460
8610
  },
8461
8611
  selectionCount: function() {
8462
8612
  var
@@ -8925,7 +9075,7 @@ $.fn.dropdown = function(parameters) {
8925
9075
  module.error(error.noStorage);
8926
9076
  return;
8927
9077
  }
8928
- name = sessionStorage.getItem(value);
9078
+ name = sessionStorage.getItem(value + elementNamespace);
8929
9079
  return (name !== undefined)
8930
9080
  ? name
8931
9081
  : false
@@ -8969,7 +9119,7 @@ $.fn.dropdown = function(parameters) {
8969
9119
  return;
8970
9120
  }
8971
9121
  module.verbose('Saving remote data to session storage', value, name);
8972
- sessionStorage.setItem(value, name);
9122
+ sessionStorage.setItem(value + elementNamespace, name);
8973
9123
  }
8974
9124
  },
8975
9125
 
@@ -9029,7 +9179,7 @@ $.fn.dropdown = function(parameters) {
9029
9179
  $nextSelectedItem
9030
9180
  .addClass(className.selected)
9031
9181
  ;
9032
- if(settings.selectOnKeydown && module.is.single()) {
9182
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
9033
9183
  module.set.selectedItem($nextSelectedItem);
9034
9184
  }
9035
9185
  $menu
@@ -9115,7 +9265,7 @@ $.fn.dropdown = function(parameters) {
9115
9265
  var
9116
9266
  length = module.get.query().length
9117
9267
  ;
9118
- $search.val( text.substr(0, length));
9268
+ $search.val( text.slice(0, length));
9119
9269
  },
9120
9270
  scrollPosition: function($item, forceScroll) {
9121
9271
  var
@@ -9232,13 +9382,13 @@ $.fn.dropdown = function(parameters) {
9232
9382
  module.set.scrollPosition($nextValue);
9233
9383
  $selectedItem.removeClass(className.selected);
9234
9384
  $nextValue.addClass(className.selected);
9235
- if(settings.selectOnKeydown && module.is.single()) {
9385
+ if(settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
9236
9386
  module.set.selectedItem($nextValue);
9237
9387
  }
9238
9388
  }
9239
9389
  },
9240
9390
  direction: function($menu) {
9241
- if(settings.direction == 'auto') {
9391
+ if(settings.direction === 'auto') {
9242
9392
  // reset position, remove upward if it's base menu
9243
9393
  if (!$menu) {
9244
9394
  module.remove.upward();
@@ -9257,7 +9407,7 @@ $.fn.dropdown = function(parameters) {
9257
9407
  module.set.leftward($menu);
9258
9408
  }
9259
9409
  }
9260
- else if(settings.direction == 'upward') {
9410
+ else if(settings.direction === 'upward') {
9261
9411
  module.set.upward($menu);
9262
9412
  }
9263
9413
  },
@@ -9270,6 +9420,11 @@ $.fn.dropdown = function(parameters) {
9270
9420
  $element.addClass(className.leftward);
9271
9421
  },
9272
9422
  value: function(value, text, $selected, preventChangeTrigger) {
9423
+ if(typeof text === 'boolean') {
9424
+ preventChangeTrigger = text;
9425
+ $selected = undefined;
9426
+ text = undefined;
9427
+ }
9273
9428
  if(value !== undefined && value !== '' && !(Array.isArray(value) && value.length === 0)) {
9274
9429
  $input.removeClass(className.noselection);
9275
9430
  } else {
@@ -9333,12 +9488,21 @@ $.fn.dropdown = function(parameters) {
9333
9488
  visible: function() {
9334
9489
  $module.addClass(className.visible);
9335
9490
  },
9336
- exactly: function(value, $selectedItem) {
9491
+ exactly: function(value, $selectedItem, preventChangeTrigger) {
9492
+ if(typeof $selectedItem === 'boolean') {
9493
+ preventChangeTrigger = $selectedItem;
9494
+ $selectedItem = undefined;
9495
+ }
9337
9496
  module.debug('Setting selected to exact values');
9338
9497
  module.clear();
9339
- module.set.selected(value, $selectedItem);
9498
+ module.set.selected(value, $selectedItem, preventChangeTrigger);
9340
9499
  },
9341
9500
  selected: function(value, $selectedItem, preventChangeTrigger, keepSearchTerm) {
9501
+ if(typeof $selectedItem === 'boolean') {
9502
+ keepSearchTerm = preventChangeTrigger;
9503
+ preventChangeTrigger = $selectedItem;
9504
+ $selectedItem = undefined;
9505
+ }
9342
9506
  var
9343
9507
  isMultiple = module.is.multiple()
9344
9508
  ;
@@ -9370,23 +9534,30 @@ $.fn.dropdown = function(parameters) {
9370
9534
 
9371
9535
  isFiltered = $selected.hasClass(className.filtered),
9372
9536
  isActive = $selected.hasClass(className.active),
9537
+ isActionable = $selected.hasClass(className.actionable),
9373
9538
  isUserValue = $selected.hasClass(className.addition),
9374
- shouldAnimate = (isMultiple && $selectedItem.length == 1)
9539
+ shouldAnimate = (isMultiple && $selectedItem && $selectedItem.length === 1)
9375
9540
  ;
9376
- if(isMultiple) {
9541
+ if(isActionable){
9542
+ if((!isMultiple || (!isActive || isUserValue)) && settings.apiSettings && settings.saveRemoteData) {
9543
+ module.save.remoteData(selectedText, selectedValue);
9544
+ }
9545
+ settings.onActionable.call(element, selectedValue, selectedText, $selected);
9546
+ }
9547
+ else if(isMultiple) {
9377
9548
  if(!isActive || isUserValue) {
9378
9549
  if(settings.apiSettings && settings.saveRemoteData) {
9379
9550
  module.save.remoteData(selectedText, selectedValue);
9380
9551
  }
9381
9552
  if(settings.useLabels) {
9553
+ module.add.value(selectedValue, selectedText, $selected, preventChangeTrigger);
9382
9554
  module.add.label(selectedValue, selectedText, shouldAnimate);
9383
- module.add.value(selectedValue, selectedText, $selected);
9384
9555
  module.set.activeItem($selected);
9385
9556
  module.filterActive();
9386
9557
  module.select.nextAvailable($selectedItem);
9387
9558
  }
9388
9559
  else {
9389
- module.add.value(selectedValue, selectedText, $selected);
9560
+ module.add.value(selectedValue, selectedText, $selected, preventChangeTrigger);
9390
9561
  module.set.text(module.add.variables(message.count));
9391
9562
  module.set.activeItem($selected);
9392
9563
  }
@@ -9400,7 +9571,7 @@ $.fn.dropdown = function(parameters) {
9400
9571
  if(settings.apiSettings && settings.saveRemoteData) {
9401
9572
  module.save.remoteData(selectedText, selectedValue);
9402
9573
  }
9403
- if (!keepSearchTerm) {
9574
+ if (!keepSearchTerm && !$selected.hasClass(className.actionable)) {
9404
9575
  module.set.text(selectedText);
9405
9576
  }
9406
9577
  module.set.value(selectedValue, selectedText, $selected, preventChangeTrigger);
@@ -9499,7 +9670,7 @@ $.fn.dropdown = function(parameters) {
9499
9670
  $('<option/>')
9500
9671
  .prop('value', escapedValue)
9501
9672
  .addClass(className.addition)
9502
- .html(value)
9673
+ .text(value)
9503
9674
  .appendTo($input)
9504
9675
  ;
9505
9676
  module.verbose('Adding user addition as an <option>', value);
@@ -9575,7 +9746,12 @@ $.fn.dropdown = function(parameters) {
9575
9746
  }
9576
9747
  return message;
9577
9748
  },
9578
- value: function(addedValue, addedText, $selectedItem) {
9749
+ value: function(addedValue, addedText, $selectedItem, preventChangeTrigger) {
9750
+ if(typeof addedText === 'boolean') {
9751
+ preventChangeTrigger = addedText;
9752
+ $selectedItem = undefined;
9753
+ addedText = undefined;
9754
+ }
9579
9755
  var
9580
9756
  currentValue = module.get.values(true),
9581
9757
  newValue
@@ -9590,7 +9766,7 @@ $.fn.dropdown = function(parameters) {
9590
9766
  }
9591
9767
  // extend current array
9592
9768
  if(Array.isArray(currentValue)) {
9593
- newValue = currentValue.concat([addedValue]);
9769
+ newValue = $selectedItem && $selectedItem.hasClass(className.actionable) ? currentValue : currentValue.concat([addedValue]);
9594
9770
  newValue = module.get.uniqueArray(newValue);
9595
9771
  }
9596
9772
  else {
@@ -9614,7 +9790,7 @@ $.fn.dropdown = function(parameters) {
9614
9790
  else {
9615
9791
  settings.onAdd.call(element, addedValue, addedText, $selectedItem);
9616
9792
  }
9617
- module.set.value(newValue, addedText, $selectedItem);
9793
+ module.set.value(newValue, addedText, $selectedItem, preventChangeTrigger);
9618
9794
  module.check.maxSelections();
9619
9795
  },
9620
9796
  },
@@ -9674,18 +9850,10 @@ $.fn.dropdown = function(parameters) {
9674
9850
  return;
9675
9851
  }
9676
9852
  // temporarily disconnect observer
9677
- if(selectObserver) {
9678
- selectObserver.disconnect();
9679
- module.verbose('Temporarily disconnecting mutation observer');
9680
- }
9853
+ module.disconnect.selectObserver();
9681
9854
  $option.remove();
9682
9855
  module.verbose('Removing user addition as an <option>', escapedValue);
9683
- if(selectObserver) {
9684
- selectObserver.observe($input[0], {
9685
- childList : true,
9686
- subtree : true
9687
- });
9688
- }
9856
+ module.observe.select();
9689
9857
  },
9690
9858
  message: function() {
9691
9859
  $menu.children(selector.message).remove();
@@ -9984,8 +10152,11 @@ $.fn.dropdown = function(parameters) {
9984
10152
  bubbledIconClick: function(event) {
9985
10153
  return $(event.target).closest($icon).length > 0;
9986
10154
  },
10155
+ edge: function() {
10156
+ return !!window.chrome && !!window.StyleMedia;
10157
+ },
9987
10158
  chrome: function() {
9988
- return !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);
10159
+ return !!window.chrome && !window.StyleMedia;
9989
10160
  },
9990
10161
  alreadySetup: function() {
9991
10162
  return ($module.is('select') && $module.parent(selector.dropdown).data(moduleNamespace) !== undefined && $module.prev().length === 0);
@@ -10050,7 +10221,7 @@ $.fn.dropdown = function(parameters) {
10050
10221
  selectChanged = false
10051
10222
  ;
10052
10223
  $.each(mutations, function(index, mutation) {
10053
- if($(mutation.target).is('select') || $(mutation.addedNodes).is('select')) {
10224
+ if($(mutation.target).is('select, option, optgroup') || $(mutation.addedNodes).is('select')) {
10054
10225
  selectChanged = true;
10055
10226
  return false;
10056
10227
  }
@@ -10192,9 +10363,6 @@ $.fn.dropdown = function(parameters) {
10192
10363
  $currentMenu.removeClass(className.loading);
10193
10364
  return canOpenRightward;
10194
10365
  },
10195
- click: function() {
10196
- return (hasTouch || settings.on == 'click');
10197
- },
10198
10366
  extendSelect: function() {
10199
10367
  return settings.allowAdditions || settings.apiSettings;
10200
10368
  },
@@ -10264,9 +10432,7 @@ $.fn.dropdown = function(parameters) {
10264
10432
  start = ($subMenu)
10265
10433
  ? function() {}
10266
10434
  : function() {
10267
- if( module.can.click() ) {
10268
- module.unbind.intent();
10269
- }
10435
+ module.unbind.intent();
10270
10436
  module.remove.active();
10271
10437
  },
10272
10438
  transition = settings.transition.hideMethod || module.get.transition($subMenu)
@@ -10595,7 +10761,7 @@ $.fn.dropdown.settings = {
10595
10761
  keepOnScreen : true, // Whether dropdown should check whether it is on screen before showing
10596
10762
 
10597
10763
  match : 'both', // what to match against with search selection (both, text, or label)
10598
- fullTextSearch : false, // search anywhere in value (set to 'exact' to require exact matches)
10764
+ fullTextSearch : 'exact', // search anywhere in value (set to 'exact' to require exact matches)
10599
10765
  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...)
10600
10766
  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)
10601
10767
 
@@ -10603,7 +10769,7 @@ $.fn.dropdown.settings = {
10603
10769
  preserveHTML : true, // preserve html when selecting value
10604
10770
  sortSelect : false, // sort selection on init
10605
10771
 
10606
- forceSelection : true, // force a choice on blur with search selection
10772
+ forceSelection : false, // force a choice on blur with search selection
10607
10773
 
10608
10774
  allowAdditions : false, // whether multiple select should allow user added values
10609
10775
  ignoreCase : false, // whether to consider case sensitivity when creating labels
@@ -10614,7 +10780,7 @@ $.fn.dropdown.settings = {
10614
10780
  useLabels : true, // whether multiple select should filter currently active selections from choices
10615
10781
  delimiter : ',', // when multiselect uses normal <input> the values will be delimited with this character
10616
10782
 
10617
- showOnFocus : true, // show menu on focus
10783
+ showOnFocus : false, // show menu on focus
10618
10784
  allowReselection : false, // whether current value should trigger callbacks when reselected
10619
10785
  allowTab : true, // add tabindex to element
10620
10786
  allowCategorySelection : false, // allow elements with sub-menus to be selected
@@ -10629,6 +10795,8 @@ $.fn.dropdown.settings = {
10629
10795
 
10630
10796
  headerDivider : true, // whether option headers should have an additional divider line underneath when converted from <select> <optgroup>
10631
10797
 
10798
+ collapseOnActionable : true, // whether the dropdown should collapse upon selection of an actionable item
10799
+
10632
10800
  // label settings on multi-select
10633
10801
  label: {
10634
10802
  transition : 'scale',
@@ -10641,13 +10809,13 @@ $.fn.dropdown.settings = {
10641
10809
  hide : 300,
10642
10810
  show : 200,
10643
10811
  search : 20,
10644
- touch : 50
10645
10812
  },
10646
10813
 
10647
10814
  /* Callbacks */
10648
10815
  onChange : function(value, text, $selected){},
10649
10816
  onAdd : function(value, text, $selected){},
10650
10817
  onRemove : function(value, text, $selected){},
10818
+ onActionable : function(value, text, $selected){},
10651
10819
  onSearch : function(searchTerm){},
10652
10820
 
10653
10821
  onLabelSelect : function($selectedLabels){},
@@ -10710,12 +10878,12 @@ $.fn.dropdown.settings = {
10710
10878
  icon : 'icon', // optional icon name
10711
10879
  iconClass : 'iconClass', // optional individual class for icon (for example to use flag instead)
10712
10880
  class : 'class', // optional individual class for item/header
10713
- divider : 'divider' // optional divider append for group headers
10881
+ divider : 'divider', // optional divider append for group headers
10882
+ actionable : 'actionable' // optional actionable item
10714
10883
  },
10715
10884
 
10716
10885
  keys : {
10717
10886
  backspace : 8,
10718
- delimiter : 188, // comma
10719
10887
  deleteKey : 46,
10720
10888
  enter : 13,
10721
10889
  escape : 27,
@@ -10782,7 +10950,8 @@ $.fn.dropdown.settings = {
10782
10950
  header : 'header',
10783
10951
  divider : 'divider',
10784
10952
  groupIcon : '',
10785
- unfilterable : 'unfilterable'
10953
+ unfilterable : 'unfilterable',
10954
+ actionable : 'actionable'
10786
10955
  }
10787
10956
 
10788
10957
  };
@@ -10857,6 +11026,9 @@ $.fn.dropdown.settings.templates = {
10857
11026
  maybeText = (option[fields.text])
10858
11027
  ? ' data-text="' + deQuote(option[fields.text],true) + '"'
10859
11028
  : '',
11029
+ maybeActionable = (option[fields.actionable])
11030
+ ? className.actionable+' '
11031
+ : '',
10860
11032
  maybeDisabled = (option[fields.disabled])
10861
11033
  ? className.disabled+' '
10862
11034
  : '',
@@ -10865,7 +11037,7 @@ $.fn.dropdown.settings.templates = {
10865
11037
  : '',
10866
11038
  hasDescription = (escape(option[fields.description] || '', preserveHTML) != '')
10867
11039
  ;
10868
- html += '<div class="'+ maybeDisabled + maybeDescriptionVertical + (option[fields.class] ? deQuote(option[fields.class]) : className.item)+'" data-value="' + deQuote(option[fields.value],true) + '"' + maybeText + '>';
11040
+ html += '<div class="'+ maybeActionable + maybeDisabled + maybeDescriptionVertical + (option[fields.class] ? deQuote(option[fields.class]) : className.item)+'" data-value="' + deQuote(option[fields.value],true) + '"' + maybeText + '>';
10869
11041
  if (isMenu) {
10870
11042
  html += '<i class="'+ (itemType.indexOf('left') !== -1 ? 'left' : '') + ' dropdown icon"></i>';
10871
11043
  }
@@ -10935,7 +11107,7 @@ $.fn.dropdown.settings.templates = {
10935
11107
  })( jQuery, window, document );
10936
11108
 
10937
11109
  /*!
10938
- * # Fomantic-UI 2.9.0-beta.3 - Embed
11110
+ * # Fomantic-UI 2.9.0-beta.301+42e68bc - Embed
10939
11111
  * http://github.com/fomantic/Fomantic-UI/
10940
11112
  *
10941
11113
  *
@@ -11645,7 +11817,7 @@ $.fn.embed.settings = {
11645
11817
  })( jQuery, window, document );
11646
11818
 
11647
11819
  /*!
11648
- * # Fomantic-UI 2.9.0-beta.3 - Modal
11820
+ * # Fomantic-UI 2.9.0-beta.301+42e68bc - Modal
11649
11821
  * http://github.com/fomantic/Fomantic-UI/
11650
11822
  *
11651
11823
  *
@@ -11711,8 +11883,9 @@ $.fn.modal = function(parameters) {
11711
11883
  moduleNamespace = 'module-' + namespace,
11712
11884
 
11713
11885
  $module = $(this),
11714
- $context = $(settings.context),
11715
- $close = $module.find(selector.close),
11886
+ $context = [window,document].indexOf(settings.context) < 0 ? $(document).find(settings.context) : $(settings.context),
11887
+ $closeIcon = $module.find(selector.closeIcon),
11888
+ $inputs,
11716
11889
 
11717
11890
  $allModals,
11718
11891
  $otherModals,
@@ -11738,6 +11911,7 @@ $.fn.modal = function(parameters) {
11738
11911
  module = {
11739
11912
 
11740
11913
  initialize: function() {
11914
+ module.create.id();
11741
11915
  if(!$module.hasClass('modal')) {
11742
11916
  module.create.modal();
11743
11917
  if(!$.isFunction(settings.onHidden)) {
@@ -11762,15 +11936,17 @@ $.fn.modal = function(parameters) {
11762
11936
  $actions.empty();
11763
11937
  }
11764
11938
  settings.actions.forEach(function (el) {
11765
- var icon = el[fields.icon] ? '<i class="' + module.helpers.deQuote(el[fields.icon]) + ' icon"></i>' : '',
11939
+ var icon = el[fields.icon] ? '<i '+(el[fields.text] ? 'aria-hidden="true"' : '')+' class="' + module.helpers.deQuote(el[fields.icon]) + ' icon"></i>' : '',
11766
11940
  text = module.helpers.escape(el[fields.text] || '', settings.preserveHTML),
11767
11941
  cls = module.helpers.deQuote(el[fields.class] || ''),
11768
11942
  click = el[fields.click] && $.isFunction(el[fields.click]) ? el[fields.click] : function () {};
11769
11943
  $actions.append($('<button/>', {
11770
11944
  html: icon + text,
11945
+ 'aria-label': (el[fields.text] || el[fields.icon] || '').replace(/<[^>]+(>|$)/g,''),
11771
11946
  class: className.button + ' ' + cls,
11772
11947
  click: function () {
11773
- if (click.call(element, $module) === false) {
11948
+ var button = $(this);
11949
+ if (button.is(selector.approve) || button.is(selector.deny) || click.call(element, $module) === false) {
11774
11950
  return;
11775
11951
  }
11776
11952
  module.hide();
@@ -11781,7 +11957,6 @@ $.fn.modal = function(parameters) {
11781
11957
  module.cache = {};
11782
11958
  module.verbose('Initializing dimmer', $context);
11783
11959
 
11784
- module.create.id();
11785
11960
  module.create.dimmer();
11786
11961
 
11787
11962
  if ( settings.allowMultiple ) {
@@ -11791,11 +11966,9 @@ $.fn.modal = function(parameters) {
11791
11966
  $module.addClass('top aligned');
11792
11967
  }
11793
11968
  module.refreshModals();
11794
-
11969
+ module.refreshInputs();
11795
11970
  module.bind.events();
11796
- if(settings.observeChanges) {
11797
- module.observeChanges();
11798
- }
11971
+ module.observeChanges();
11799
11972
  module.instantiate();
11800
11973
  if(settings.autoShow){
11801
11974
  module.show();
@@ -11812,16 +11985,20 @@ $.fn.modal = function(parameters) {
11812
11985
 
11813
11986
  create: {
11814
11987
  modal: function() {
11815
- $module = $('<div/>', {class: className.modal});
11988
+ $module = $('<div/>', {class: className.modal, role: 'dialog', 'aria-modal': true});
11816
11989
  if (settings.closeIcon) {
11817
- $close = $('<i/>', {class: className.close})
11818
- $module.append($close);
11990
+ $closeIcon = $('<i/>', {class: className.close, role: 'button', tabindex: 0, 'aria-label': settings.text.close})
11991
+ $module.append($closeIcon);
11819
11992
  }
11820
11993
  if (settings.title !== '') {
11821
- $('<div/>', {class: className.title}).appendTo($module);
11994
+ var titleId = '_' + module.get.id() + 'title';
11995
+ $module.attr('aria-labelledby', titleId);
11996
+ $('<div/>', {class: className.title, id: titleId}).appendTo($module);
11822
11997
  }
11823
11998
  if (settings.content !== '') {
11824
- $('<div/>', {class: className.content}).appendTo($module);
11999
+ var descId = '_' + module.get.id() + 'desc';
12000
+ $module.attr('aria-describedby', descId);
12001
+ $('<div/>', {class: className.content, id: descId}).appendTo($module);
11825
12002
  }
11826
12003
  if (module.has.configActions()) {
11827
12004
  $('<div/>', {class: className.actions}).appendTo($module);
@@ -11852,13 +12029,13 @@ $.fn.modal = function(parameters) {
11852
12029
  $dimmer = $dimmable.dimmer('get dimmer');
11853
12030
  },
11854
12031
  id: function() {
11855
- id = (Math.random().toString(16) + '000000000').substr(2, 8);
12032
+ id = (Math.random().toString(16) + '000000000').slice(2, 10);
11856
12033
  elementEventNamespace = '.' + id;
11857
12034
  module.verbose('Creating unique id for element', id);
11858
12035
  },
11859
12036
  innerDimmer: function() {
11860
- if ( $module.find(selector.dimmer).length == 0 ) {
11861
- $module.prepend('<div class="ui inverted dimmer"></div>');
12037
+ if ( $module.find(selector.dimmer).length === 0 ) {
12038
+ $('<div/>', {class: className.innerDimmer}).prependTo($module);
11862
12039
  }
11863
12040
  }
11864
12041
  },
@@ -11874,15 +12051,21 @@ $.fn.modal = function(parameters) {
11874
12051
  ;
11875
12052
  $window.off(elementEventNamespace);
11876
12053
  $dimmer.off(elementEventNamespace);
11877
- $close.off(eventNamespace);
12054
+ $closeIcon.off(elementEventNamespace);
12055
+ if($inputs) {
12056
+ $inputs.off(elementEventNamespace);
12057
+ }
11878
12058
  $context.dimmer('destroy');
11879
12059
  },
11880
12060
 
11881
12061
  observeChanges: function() {
11882
12062
  if('MutationObserver' in window) {
11883
12063
  observer = new MutationObserver(function(mutations) {
11884
- module.debug('DOM tree modified, refreshing');
11885
- module.refresh();
12064
+ if(settings.observeChanges) {
12065
+ module.debug('DOM tree modified, refreshing');
12066
+ module.refresh();
12067
+ }
12068
+ module.refreshInputs();
11886
12069
  });
11887
12070
  observer.observe(element, {
11888
12071
  childList : true,
@@ -11907,6 +12090,23 @@ $.fn.modal = function(parameters) {
11907
12090
  $allModals = $otherModals.add($module);
11908
12091
  },
11909
12092
 
12093
+ refreshInputs: function(){
12094
+ if($inputs){
12095
+ $inputs
12096
+ .off('keydown' + elementEventNamespace)
12097
+ ;
12098
+ }
12099
+ $inputs = $module.find('[tabindex], :input').filter(':visible').filter(function() {
12100
+ return $(this).closest('.disabled').length === 0;
12101
+ });
12102
+ $inputs.first()
12103
+ .on('keydown' + elementEventNamespace, module.event.inputKeyDown.first)
12104
+ ;
12105
+ $inputs.last()
12106
+ .on('keydown' + elementEventNamespace, module.event.inputKeyDown.last)
12107
+ ;
12108
+ },
12109
+
11910
12110
  attachEvents: function(selector, event) {
11911
12111
  var
11912
12112
  $toggle = $(selector)
@@ -11935,6 +12135,9 @@ $.fn.modal = function(parameters) {
11935
12135
  .on('click' + eventNamespace, selector.approve, module.event.approve)
11936
12136
  .on('click' + eventNamespace, selector.deny, module.event.deny)
11937
12137
  ;
12138
+ $closeIcon
12139
+ .on('keyup' + elementEventNamespace, module.event.closeKeyUp)
12140
+ ;
11938
12141
  $window
11939
12142
  .on('resize' + elementEventNamespace, module.event.resize)
11940
12143
  ;
@@ -11953,7 +12156,7 @@ $.fn.modal = function(parameters) {
11953
12156
 
11954
12157
  get: {
11955
12158
  id: function() {
11956
- return (Math.random().toString(16) + '000000000').substr(2, 8);
12159
+ return id;
11957
12160
  },
11958
12161
  element: function() {
11959
12162
  return $module;
@@ -11992,10 +12195,38 @@ $.fn.modal = function(parameters) {
11992
12195
  close: function() {
11993
12196
  module.hide();
11994
12197
  },
12198
+ closeKeyUp: function(event){
12199
+ var
12200
+ keyCode = event.which
12201
+ ;
12202
+ if ((keyCode === settings.keys.enter || keyCode === settings.keys.space) && $module.hasClass(className.front)) {
12203
+ module.hide();
12204
+ }
12205
+ },
12206
+ inputKeyDown: {
12207
+ first: function(event) {
12208
+ var
12209
+ keyCode = event.which
12210
+ ;
12211
+ if (keyCode === settings.keys.tab && event.shiftKey) {
12212
+ $inputs.last().focus();
12213
+ event.preventDefault();
12214
+ }
12215
+ },
12216
+ last: function(event) {
12217
+ var
12218
+ keyCode = event.which
12219
+ ;
12220
+ if (keyCode === settings.keys.tab && !event.shiftKey) {
12221
+ $inputs.first().focus();
12222
+ event.preventDefault();
12223
+ }
12224
+ }
12225
+ },
11995
12226
  mousedown: function(event) {
11996
12227
  var
11997
12228
  $target = $(event.target),
11998
- isRtl = module.is.rtl();
12229
+ isRtl = module.is.rtl()
11999
12230
  ;
12000
12231
  initialMouseDownInModal = ($target.closest(selector.modal).length > 0);
12001
12232
  if(initialMouseDownInModal) {
@@ -12043,10 +12274,9 @@ $.fn.modal = function(parameters) {
12043
12274
  },
12044
12275
  keyboard: function(event) {
12045
12276
  var
12046
- keyCode = event.which,
12047
- escapeKey = 27
12277
+ keyCode = event.which
12048
12278
  ;
12049
- if(keyCode == escapeKey) {
12279
+ if(keyCode === settings.keys.escape) {
12050
12280
  if(settings.closable) {
12051
12281
  module.debug('Escape key pressed hiding modal');
12052
12282
  if ( $module.hasClass(className.front) ) {
@@ -12102,6 +12332,10 @@ $.fn.modal = function(parameters) {
12102
12332
  : function(){}
12103
12333
  ;
12104
12334
  if( module.is.animating() || !module.is.active() ) {
12335
+ if(settings.onShow.call(element) === false) {
12336
+ module.verbose('Show callback returned false cancelling show');
12337
+ return;
12338
+ }
12105
12339
  module.showDimmer();
12106
12340
  module.cacheSizes();
12107
12341
  module.set.bodyMargin();
@@ -12131,7 +12365,6 @@ $.fn.modal = function(parameters) {
12131
12365
  $module.detach().appendTo($dimmer);
12132
12366
  }
12133
12367
  }
12134
- settings.onShow.call(element);
12135
12368
  if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
12136
12369
  module.debug('Showing modal with css animations');
12137
12370
  $module
@@ -12174,7 +12407,6 @@ $.fn.modal = function(parameters) {
12174
12407
  ? callback
12175
12408
  : function(){}
12176
12409
  ;
12177
- module.debug('Hiding modal');
12178
12410
  if(settings.onHide.call(element, $(this)) === false) {
12179
12411
  module.verbose('Hide callback returned false cancelling hide');
12180
12412
  ignoreRepeatedEvents = false;
@@ -12182,6 +12414,7 @@ $.fn.modal = function(parameters) {
12182
12414
  }
12183
12415
 
12184
12416
  if( module.is.animating() || module.is.active() ) {
12417
+ module.debug('Hiding modal');
12185
12418
  if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
12186
12419
  module.remove.active();
12187
12420
  $module
@@ -12361,7 +12594,7 @@ $.fn.modal = function(parameters) {
12361
12594
  $module
12362
12595
  .off('mousedown' + elementEventNamespace)
12363
12596
  ;
12364
- }
12597
+ }
12365
12598
  $dimmer
12366
12599
  .off('mousedown' + elementEventNamespace)
12367
12600
  ;
@@ -12546,13 +12779,10 @@ $.fn.modal = function(parameters) {
12546
12779
  set: {
12547
12780
  autofocus: function() {
12548
12781
  var
12549
- $inputs = $module.find('[tabindex], :input').filter(':visible').filter(function() {
12550
- return $(this).closest('.disabled').length === 0;
12551
- }),
12552
12782
  $autofocus = $inputs.filter('[autofocus]'),
12553
12783
  $input = ($autofocus.length > 0)
12554
12784
  ? $autofocus.first()
12555
- : $inputs.first()
12785
+ : ($inputs.length > 1 ? $inputs.filter(':not(i.close)') : $inputs).first()
12556
12786
  ;
12557
12787
  if($input.length > 0) {
12558
12788
  $input.focus();
@@ -12634,7 +12864,7 @@ $.fn.modal = function(parameters) {
12634
12864
  ? $(document).scrollTop() + settings.padding
12635
12865
  : $(document).scrollTop() + (module.cache.contextHeight - module.cache.height - settings.padding),
12636
12866
  marginLeft: -(module.cache.width / 2)
12637
- })
12867
+ })
12638
12868
  ;
12639
12869
  } else {
12640
12870
  $module
@@ -12643,7 +12873,7 @@ $.fn.modal = function(parameters) {
12643
12873
  ? -(module.cache.height / 2)
12644
12874
  : settings.padding / 2,
12645
12875
  marginLeft: -(module.cache.width / 2)
12646
- })
12876
+ })
12647
12877
  ;
12648
12878
  }
12649
12879
  module.verbose('Setting modal offset for legacy mode');
@@ -12969,11 +13199,19 @@ $.fn.modal.settings = {
12969
13199
  // called after deny selector match
12970
13200
  onDeny : function(){ return true; },
12971
13201
 
13202
+ keys : {
13203
+ space : 32,
13204
+ enter : 13,
13205
+ escape : 27,
13206
+ tab : 9,
13207
+ },
13208
+
12972
13209
  selector : {
12973
13210
  title : '> .header',
12974
13211
  content : '> .content',
12975
13212
  actions : '> .actions',
12976
13213
  close : '> .close',
13214
+ closeIcon: '> .close',
12977
13215
  approve : '.actions .positive, .actions .approve, .actions .ok',
12978
13216
  deny : '.actions .negative, .actions .deny, .actions .cancel',
12979
13217
  modal : '.ui.modal',
@@ -13005,11 +13243,13 @@ $.fn.modal.settings = {
13005
13243
  template : 'ui tiny modal',
13006
13244
  ok : 'positive',
13007
13245
  cancel : 'negative',
13008
- prompt : 'ui fluid input'
13246
+ prompt : 'ui fluid input',
13247
+ innerDimmer: 'ui inverted dimmer'
13009
13248
  },
13010
13249
  text: {
13011
13250
  ok : 'Ok',
13012
- cancel: 'Cancel'
13251
+ cancel: 'Cancel',
13252
+ close : 'Close'
13013
13253
  }
13014
13254
  };
13015
13255
 
@@ -13035,33 +13275,39 @@ $.fn.modal.settings.templates = {
13035
13275
  },
13036
13276
  alert: function () {
13037
13277
  var settings = this.get.settings(),
13038
- args = settings.templates.getArguments(arguments)
13278
+ args = settings.templates.getArguments(arguments),
13279
+ approveFn = args.handler
13039
13280
  ;
13040
13281
  return {
13041
13282
  title : args.title,
13042
13283
  content: args.content,
13284
+ onApprove: approveFn,
13043
13285
  actions: [{
13044
13286
  text : settings.text.ok,
13045
13287
  class: settings.className.ok,
13046
- click: args.handler
13288
+ click: approveFn
13047
13289
  }]
13048
13290
  }
13049
13291
  },
13050
13292
  confirm: function () {
13051
13293
  var settings = this.get.settings(),
13052
- args = settings.templates.getArguments(arguments)
13294
+ args = settings.templates.getArguments(arguments),
13295
+ approveFn = function(){args.handler(true)},
13296
+ denyFn = function(){args.handler(false)}
13053
13297
  ;
13054
13298
  return {
13055
13299
  title : args.title,
13056
13300
  content: args.content,
13301
+ onApprove: approveFn,
13302
+ onDeny: denyFn,
13057
13303
  actions: [{
13058
13304
  text : settings.text.ok,
13059
13305
  class: settings.className.ok,
13060
- click: function(){args.handler(true)}
13306
+ click: approveFn
13061
13307
  },{
13062
13308
  text: settings.text.cancel,
13063
13309
  class: settings.className.cancel,
13064
- click: function(){args.handler(false)}
13310
+ click: denyFn
13065
13311
  }]
13066
13312
  }
13067
13313
  },
@@ -13069,7 +13315,14 @@ $.fn.modal.settings.templates = {
13069
13315
  var $this = this,
13070
13316
  settings = this.get.settings(),
13071
13317
  args = settings.templates.getArguments(arguments),
13072
- input = $($.parseHTML(args.content)).filter('.ui.input')
13318
+ input = $($.parseHTML(args.content)).filter('.ui.input'),
13319
+ approveFn = function(){
13320
+ var settings = $this.get.settings(),
13321
+ inputField = $this.get.element().find(settings.selector.prompt)[0]
13322
+ ;
13323
+ args.handler($(inputField).val());
13324
+ },
13325
+ denyFn = function(){args.handler(null)}
13073
13326
  ;
13074
13327
  if (input.length === 0) {
13075
13328
  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>';
@@ -13077,19 +13330,16 @@ $.fn.modal.settings.templates = {
13077
13330
  return {
13078
13331
  title : args.title,
13079
13332
  content: args.content,
13333
+ onApprove: approveFn,
13334
+ onDeny: denyFn,
13080
13335
  actions: [{
13081
13336
  text: settings.text.ok,
13082
13337
  class: settings.className.ok,
13083
- click: function(){
13084
- var settings = $this.get.settings(),
13085
- inputField = $this.get.element().find(settings.selector.prompt)[0]
13086
- ;
13087
- args.handler($(inputField).val());
13088
- }
13338
+ click: approveFn
13089
13339
  },{
13090
13340
  text: settings.text.cancel,
13091
13341
  class: settings.className.cancel,
13092
- click: function(){args.handler(null)}
13342
+ click: denyFn
13093
13343
  }]
13094
13344
  }
13095
13345
  }
@@ -13098,7 +13348,7 @@ $.fn.modal.settings.templates = {
13098
13348
  })( jQuery, window, document );
13099
13349
 
13100
13350
  /*!
13101
- * # Fomantic-UI 2.9.0-beta.3 - Nag
13351
+ * # Fomantic-UI 2.9.0-beta.301+42e68bc - Nag
13102
13352
  * http://github.com/fomantic/Fomantic-UI/
13103
13353
  *
13104
13354
  *
@@ -13152,7 +13402,7 @@ $.fn.nag = function(parameters) {
13152
13402
  $module = $(this),
13153
13403
 
13154
13404
  $context = (settings.context)
13155
- ? $(settings.context)
13405
+ ? ([window,document].indexOf(settings.context) < 0 ? $(document).find(settings.context) : $(settings.context))
13156
13406
  : $('body'),
13157
13407
 
13158
13408
  element = this,
@@ -13657,7 +13907,7 @@ $.extend( $.easing, {
13657
13907
  })( jQuery, window, document );
13658
13908
 
13659
13909
  /*!
13660
- * # Fomantic-UI 2.9.0-beta.3 - Popup
13910
+ * # Fomantic-UI 2.9.0-beta.301+42e68bc - Popup
13661
13911
  * http://github.com/fomantic/Fomantic-UI/
13662
13912
  *
13663
13913
  *
@@ -13720,11 +13970,11 @@ $.fn.popup = function(parameters) {
13720
13970
  moduleNamespace = 'module-' + namespace,
13721
13971
 
13722
13972
  $module = $(this),
13723
- $context = $(settings.context),
13724
- $scrollContext = $(settings.scrollContext),
13725
- $boundary = $(settings.boundary),
13973
+ $context = [window,document].indexOf(settings.context) < 0 ? $(document).find(settings.context) : $(settings.context),
13974
+ $scrollContext = [window,document].indexOf(settings.scrollContext) < 0 ? $(document).find(settings.scrollContext) : $(settings.scrollContext),
13975
+ $boundary = [window,document].indexOf(settings.boundary) < 0 ? $(document).find(settings.boundary) : $(settings.boundary),
13726
13976
  $target = (settings.target)
13727
- ? $(settings.target)
13977
+ ? ([window,document].indexOf(settings.target) < 0 ? $(document).find(settings.target) : $(settings.target))
13728
13978
  : $module,
13729
13979
 
13730
13980
  $popup,
@@ -13779,8 +14029,8 @@ $.fn.popup = function(parameters) {
13779
14029
  },
13780
14030
 
13781
14031
  refresh: function() {
13782
- if(settings.popup) {
13783
- $popup = $(settings.popup).eq(0);
14032
+ if(settings.popup && typeof settings.popup === 'string') {
14033
+ $popup = $(document).find(settings.popup).eq(0);
13784
14034
  }
13785
14035
  else {
13786
14036
  if(settings.inline) {
@@ -13944,8 +14194,8 @@ $.fn.popup = function(parameters) {
13944
14194
  }
13945
14195
  settings.onCreate.call($popup, element);
13946
14196
  }
13947
- else if(settings.popup) {
13948
- $(settings.popup).data(metadata.activator, $module);
14197
+ else if(settings.popup && typeof settings.popup === 'string') {
14198
+ $(document).find(settings.popup).data(metadata.activator, $module);
13949
14199
  module.verbose('Used popup specified in settings');
13950
14200
  module.refresh();
13951
14201
  if(settings.hoverable) {
@@ -13967,7 +14217,7 @@ $.fn.popup = function(parameters) {
13967
14217
  },
13968
14218
 
13969
14219
  createID: function() {
13970
- id = (Math.random().toString(16) + '000000000').substr(2, 8);
14220
+ id = (Math.random().toString(16) + '000000000').slice(2, 10);
13971
14221
  elementNamespace = '.' + id;
13972
14222
  module.verbose('Creating unique id for element', id);
13973
14223
  },
@@ -14026,7 +14276,7 @@ $.fn.popup = function(parameters) {
14026
14276
  },
14027
14277
 
14028
14278
  hideAll: function() {
14029
- $(selector.popup)
14279
+ $(document).find(selector.popup)
14030
14280
  .filter('.' + className.popupVisible)
14031
14281
  .each(function() {
14032
14282
  $(this)
@@ -15199,7 +15449,7 @@ $.fn.popup.settings = {
15199
15449
  })( jQuery, window, document );
15200
15450
 
15201
15451
  /*!
15202
- * # Fomantic-UI 2.9.0-beta.3 - Progress
15452
+ * # Fomantic-UI 2.9.0-beta.301+42e68bc - Progress
15203
15453
  * http://github.com/fomantic/Fomantic-UI/
15204
15454
  *
15205
15455
  *
@@ -15293,7 +15543,7 @@ $.fn.progress = function(parameters) {
15293
15543
  *
15294
15544
  * @param min A minimum value within multiple values
15295
15545
  * @param total A total amount of multiple values
15296
- * @returns {number} A precison. Could be 1, 10, 100, ... 1e+10.
15546
+ * @returns {number} A precision. Could be 1, 10, 100, ... 1e+10.
15297
15547
  */
15298
15548
  derivePrecision: function(min, total) {
15299
15549
  var precisionPower = 0
@@ -15807,6 +16057,9 @@ $.fn.progress = function(parameters) {
15807
16057
  }
15808
16058
  else {
15809
16059
  module.remove.active();
16060
+ module.remove.warning();
16061
+ module.remove.error();
16062
+ module.remove.success();
15810
16063
  module.set.label(settings.text.active);
15811
16064
  }
15812
16065
  },
@@ -16191,7 +16444,7 @@ $.fn.progress.settings = {
16191
16444
  nonNumeric : 'Progress value is non numeric',
16192
16445
  tooHigh : 'Value specified is above 100%',
16193
16446
  tooLow : 'Value specified is below 0%',
16194
- sumExceedsTotal : 'Sum of multple values exceed total',
16447
+ sumExceedsTotal : 'Sum of multiple values exceed total',
16195
16448
  },
16196
16449
 
16197
16450
  regExp: {
@@ -16233,7 +16486,7 @@ $.fn.progress.settings = {
16233
16486
  })( jQuery, window, document );
16234
16487
 
16235
16488
  /*!
16236
- * # Fomantic-UI 2.9.0-beta.3 - Slider
16489
+ * # Fomantic-UI 2.9.0-beta.301+42e68bc - Slider
16237
16490
  * http://github.com/fomantic/Fomantic-UI/
16238
16491
  *
16239
16492
  *
@@ -16304,6 +16557,7 @@ $.fn.slider = function(parameters) {
16304
16557
 
16305
16558
  $module = $(this),
16306
16559
  $currThumb,
16560
+ touchIdentifier,
16307
16561
  $thumb,
16308
16562
  $secondThumb,
16309
16563
  $track,
@@ -16320,7 +16574,6 @@ $.fn.slider = function(parameters) {
16320
16574
  secondPos,
16321
16575
  offset,
16322
16576
  precision,
16323
- isTouch,
16324
16577
  gapRatio = 1,
16325
16578
  previousValue,
16326
16579
 
@@ -16338,7 +16591,6 @@ $.fn.slider = function(parameters) {
16338
16591
  currentRange += 1;
16339
16592
  documentEventID = currentRange;
16340
16593
 
16341
- isTouch = module.setup.testOutTouch();
16342
16594
  module.setup.layout();
16343
16595
  module.setup.labels();
16344
16596
 
@@ -16409,14 +16661,6 @@ $.fn.slider = function(parameters) {
16409
16661
  }
16410
16662
  }
16411
16663
  },
16412
- testOutTouch: function() {
16413
- try {
16414
- document.createEvent('TouchEvent');
16415
- return true;
16416
- } catch (e) {
16417
- return false;
16418
- }
16419
- },
16420
16664
  customLabel: function() {
16421
16665
  var
16422
16666
  $children = $labels.find('.label'),
@@ -16470,9 +16714,6 @@ $.fn.slider = function(parameters) {
16470
16714
  module.bind.globalKeyboardEvents();
16471
16715
  module.bind.keyboardEvents();
16472
16716
  module.bind.mouseEvents();
16473
- if(module.is.touch()) {
16474
- module.bind.touchEvents();
16475
- }
16476
16717
  if (settings.autoAdjustLabels) {
16477
16718
  module.bind.windowEvents();
16478
16719
  }
@@ -16485,7 +16726,7 @@ $.fn.slider = function(parameters) {
16485
16726
  $(document).on('keydown' + eventNamespace + documentEventID, module.event.activateFocus);
16486
16727
  },
16487
16728
  mouseEvents: function() {
16488
- module.verbose('Binding mouse events');
16729
+ module.verbose('Binding mouse and touch events');
16489
16730
  $module.find('.track, .thumb, .inner').on('mousedown' + eventNamespace, function(event) {
16490
16731
  event.stopImmediatePropagation();
16491
16732
  event.preventDefault();
@@ -16498,27 +16739,20 @@ $.fn.slider = function(parameters) {
16498
16739
  $module.on('mouseleave' + eventNamespace, function(event) {
16499
16740
  isHover = false;
16500
16741
  });
16501
- },
16502
- touchEvents: function() {
16503
- module.verbose('Binding touch events');
16504
- $module.find('.track, .thumb, .inner').on('touchstart' + eventNamespace, function(event) {
16505
- event.stopImmediatePropagation();
16506
- event.preventDefault();
16507
- module.event.down(event);
16508
- });
16509
- $module.on('touchstart' + eventNamespace, module.event.down);
16742
+ // All touch events are invoked on the element where the touch *started*. Thus, we can bind them all
16743
+ // on the thumb(s) and don't need to worry about interference with other components, i.e. no dynamic binding
16744
+ // and unbinding required.
16745
+ $module.find('.thumb')
16746
+ .on('touchstart' + eventNamespace, module.event.touchDown)
16747
+ .on('touchmove' + eventNamespace, module.event.move)
16748
+ .on('touchend' + eventNamespace, module.event.up)
16749
+ .on('touchcancel' + eventNamespace, module.event.touchCancel);
16510
16750
  },
16511
16751
  slidingEvents: function() {
16512
16752
  // these don't need the identifier because we only ever want one of them to be registered with document
16513
16753
  module.verbose('Binding page wide events while handle is being draged');
16514
- if(module.is.touch()) {
16515
- $(document).on('touchmove' + eventNamespace, module.event.move);
16516
- $(document).on('touchend' + eventNamespace, module.event.up);
16517
- }
16518
- else {
16519
- $(document).on('mousemove' + eventNamespace, module.event.move);
16520
- $(document).on('mouseup' + eventNamespace, module.event.up);
16521
- }
16754
+ $(document).on('mousemove' + eventNamespace, module.event.move);
16755
+ $(document).on('mouseup' + eventNamespace, module.event.up);
16522
16756
  },
16523
16757
  windowEvents: function() {
16524
16758
  $window.on('resize' + eventNamespace, module.event.resize);
@@ -16528,24 +16762,22 @@ $.fn.slider = function(parameters) {
16528
16762
  unbind: {
16529
16763
  events: function() {
16530
16764
  $module.find('.track, .thumb, .inner').off('mousedown' + eventNamespace);
16531
- $module.find('.track, .thumb, .inner').off('touchstart' + eventNamespace);
16532
16765
  $module.off('mousedown' + eventNamespace);
16533
16766
  $module.off('mouseenter' + eventNamespace);
16534
16767
  $module.off('mouseleave' + eventNamespace);
16535
- $module.off('touchstart' + eventNamespace);
16768
+ $module.find('.thumb')
16769
+ .off('touchstart' + eventNamespace)
16770
+ .off('touchmove' + eventNamespace)
16771
+ .off('touchend' + eventNamespace)
16772
+ .off('touchcancel' + eventNamespace);
16536
16773
  $module.off('keydown' + eventNamespace);
16537
16774
  $module.off('focusout' + eventNamespace);
16538
16775
  $(document).off('keydown' + eventNamespace + documentEventID, module.event.activateFocus);
16539
16776
  $window.off('resize' + eventNamespace);
16540
16777
  },
16541
16778
  slidingEvents: function() {
16542
- if(module.is.touch()) {
16543
- $(document).off('touchmove' + eventNamespace);
16544
- $(document).off('touchend' + eventNamespace);
16545
- } else {
16546
- $(document).off('mousemove' + eventNamespace);
16547
- $(document).off('mouseup' + eventNamespace);
16548
- }
16779
+ $(document).off('mousemove' + eventNamespace);
16780
+ $(document).off('mouseup' + eventNamespace);
16549
16781
  },
16550
16782
  },
16551
16783
 
@@ -16575,10 +16807,31 @@ $.fn.slider = function(parameters) {
16575
16807
  module.bind.slidingEvents();
16576
16808
  }
16577
16809
  },
16810
+ touchDown: function(event) {
16811
+ event.preventDefault(); // disable mouse emulation and touch-scrolling
16812
+ event.stopImmediatePropagation();
16813
+ if(touchIdentifier !== undefined) {
16814
+ // ignore multiple touches on the same slider --
16815
+ // we cannot handle changing both thumbs at once due to shared state
16816
+ return;
16817
+ }
16818
+ $currThumb = $(event.target);
16819
+ var touchEvent = event.touches ? event : event.originalEvent;
16820
+ touchIdentifier = touchEvent.targetTouches[0].identifier;
16821
+ if(previousValue === undefined) {
16822
+ previousValue = module.get.currentThumbValue();
16823
+ }
16824
+ },
16578
16825
  move: function(event) {
16579
- event.preventDefault();
16826
+ if(event.type == 'mousemove') {
16827
+ event.preventDefault(); // prevent text selection etc.
16828
+ }
16829
+ if(module.is.disabled()) {
16830
+ // touch events are always bound, so we need to prevent touch-sliding on disabled sliders here
16831
+ return;
16832
+ }
16580
16833
  var value = module.determine.valueFromEvent(event);
16581
- if($currThumb === undefined) {
16834
+ if(event.type == 'mousemove' && $currThumb === undefined) {
16582
16835
  var
16583
16836
  eventPos = module.determine.eventPos(event),
16584
16837
  newPos = module.determine.pos(eventPos)
@@ -16615,10 +16868,23 @@ $.fn.slider = function(parameters) {
16615
16868
  },
16616
16869
  up: function(event) {
16617
16870
  event.preventDefault();
16871
+ if(module.is.disabled()) {
16872
+ // touch events are always bound, so we need to prevent touch-sliding on disabled sliders here
16873
+ return;
16874
+ }
16618
16875
  var value = module.determine.valueFromEvent(event);
16619
16876
  module.set.value(value);
16620
16877
  module.unbind.slidingEvents();
16878
+ touchIdentifier = undefined;
16879
+ if (previousValue !== undefined) {
16880
+ previousValue = undefined;
16881
+ }
16882
+ },
16883
+ touchCancel: function(event) {
16884
+ event.preventDefault();
16885
+ touchIdentifier = undefined;
16621
16886
  if (previousValue !== undefined) {
16887
+ module.update.value(previousValue);
16622
16888
  previousValue = undefined;
16623
16889
  }
16624
16890
  },
@@ -16734,9 +17000,6 @@ $.fn.slider = function(parameters) {
16734
17000
  },
16735
17001
  smooth: function() {
16736
17002
  return settings.smooth || $module.hasClass(settings.className.smooth);
16737
- },
16738
- touch: function() {
16739
- return isTouch;
16740
17003
  }
16741
17004
  },
16742
17005
 
@@ -17000,12 +17263,19 @@ $.fn.slider = function(parameters) {
17000
17263
  return value;
17001
17264
  },
17002
17265
  eventPos: function(event) {
17003
- if(module.is.touch()) {
17266
+ if(event.type === "touchmove" || event.type === "touchend") {
17267
+ var
17268
+ touchEvent = event.touches ? event : event.originalEvent,
17269
+ touch = touchEvent.changedTouches[0]; // fall back to first touch if correct touch not found
17270
+ for(var i=0; i < touchEvent.touches.length; i++) {
17271
+ if(touchEvent.touches[i].identifier === touchIdentifier) {
17272
+ touch = touchEvent.touches[i];
17273
+ break;
17274
+ }
17275
+ }
17004
17276
  var
17005
- touchEvent = event.changedTouches ? event : event.originalEvent,
17006
- touches = touchEvent.changedTouches[0] ? touchEvent.changedTouches : touchEvent.touches,
17007
- touchY = touches[0].pageY,
17008
- touchX = touches[0].pageX
17277
+ touchY = touch.pageY,
17278
+ touchX = touch.pageX
17009
17279
  ;
17010
17280
  return module.is.vertical() ? touchY : touchX;
17011
17281
  }
@@ -17572,7 +17842,7 @@ $.fn.slider.settings = {
17572
17842
  })( jQuery, window, document );
17573
17843
 
17574
17844
  /*!
17575
- * # Fomantic-UI 2.9.0-beta.3 - Rating
17845
+ * # Fomantic-UI 2.9.0-beta.301+42e68bc - Rating
17576
17846
  * http://github.com/fomantic/Fomantic-UI/
17577
17847
  *
17578
17848
  *
@@ -18127,7 +18397,7 @@ $.fn.rating.settings = {
18127
18397
  })( jQuery, window, document );
18128
18398
 
18129
18399
  /*!
18130
- * # Fomantic-UI 2.9.0-beta.3 - Search
18400
+ * # Fomantic-UI 2.9.0-beta.301+42e68bc - Search
18131
18401
  * http://github.com/fomantic/Fomantic-UI/
18132
18402
  *
18133
18403
  *
@@ -18495,20 +18765,36 @@ $.fn.search = function(parameters) {
18495
18765
  urlData : {
18496
18766
  query : searchTerm
18497
18767
  },
18498
- onSuccess : function(response) {
18768
+ },
18769
+ apiCallbacks = {
18770
+ onSuccess : function(response, $module, xhr) {
18499
18771
  module.parse.response.call(element, response, searchTerm);
18500
18772
  callback();
18773
+ if(settings.apiSettings && typeof settings.apiSettings.onSuccess === 'function') {
18774
+ settings.apiSettings.onSuccess.call(this, response, $module, xhr);
18775
+ }
18501
18776
  },
18502
- onFailure : function() {
18777
+ onFailure : function(response, $module, xhr) {
18503
18778
  module.displayMessage(error.serverError);
18504
18779
  callback();
18780
+ if(settings.apiSettings && typeof settings.apiSettings.onFailure === 'function') {
18781
+ settings.apiSettings.onFailure.call(this, response, $module, xhr);
18782
+ }
18505
18783
  },
18506
- onAbort : function(response) {
18784
+ onAbort : function(status, $module, xhr) {
18785
+ if(settings.apiSettings && typeof settings.apiSettings.onAbort === 'function') {
18786
+ settings.apiSettings.onAbort.call(this, status, $module, xhr);
18787
+ }
18507
18788
  },
18508
- onError : module.error
18789
+ onError : function(errorMessage, $module, xhr){
18790
+ module.error();
18791
+ if(settings.apiSettings && typeof settings.apiSettings.onError === 'function') {
18792
+ settings.apiSettings.onError.call(this, errorMessage, $module, xhr);
18793
+ }
18794
+ }
18509
18795
  }
18510
18796
  ;
18511
- $.extend(true, apiSettings, settings.apiSettings);
18797
+ $.extend(true, apiSettings, settings.apiSettings, apiCallbacks);
18512
18798
  module.verbose('Setting up API request', apiSettings);
18513
18799
  $module.api(apiSettings);
18514
18800
  }
@@ -18531,7 +18817,7 @@ $.fn.search = function(parameters) {
18531
18817
  return $results.hasClass(className.animating);
18532
18818
  },
18533
18819
  chrome: function() {
18534
- return !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);
18820
+ return !!window.chrome && !window.StyleMedia;
18535
18821
  },
18536
18822
  hidden: function() {
18537
18823
  return $results.hasClass(className.hidden);
@@ -19695,7 +19981,7 @@ $.fn.search.settings = {
19695
19981
  })( jQuery, window, document );
19696
19982
 
19697
19983
  /*!
19698
- * # Fomantic-UI 2.9.0-beta.3 - Shape
19984
+ * # Fomantic-UI 2.9.0-beta.301+42e68bc - Shape
19699
19985
  * http://github.com/fomantic/Fomantic-UI/
19700
19986
  *
19701
19987
  *
@@ -19822,7 +20108,7 @@ $.fn.shape = function(parameters) {
19822
20108
  module.reset();
19823
20109
  module.set.active();
19824
20110
  };
19825
- settings.beforeChange.call($nextSide[0]);
20111
+ settings.onBeforeChange.call($nextSide[0]);
19826
20112
  if(module.get.transitionEvent()) {
19827
20113
  module.verbose('Starting CSS animation');
19828
20114
  $module
@@ -20509,7 +20795,7 @@ $.fn.shape.settings = {
20509
20795
  height: 'initial',
20510
20796
 
20511
20797
  // callback occurs on side change
20512
- beforeChange : function() {},
20798
+ onBeforeChange : function() {},
20513
20799
  onChange : function() {},
20514
20800
 
20515
20801
  // allow animation to same side
@@ -20544,7 +20830,7 @@ $.fn.shape.settings = {
20544
20830
  })( jQuery, window, document );
20545
20831
 
20546
20832
  /*!
20547
- * # Fomantic-UI 2.9.0-beta.3 - Sidebar
20833
+ * # Fomantic-UI 2.9.0-beta.301+42e68bc - Sidebar
20548
20834
  * http://github.com/fomantic/Fomantic-UI/
20549
20835
  *
20550
20836
  *
@@ -20611,7 +20897,7 @@ $.fn.sidebar = function(parameters) {
20611
20897
  moduleNamespace = 'module-' + namespace,
20612
20898
 
20613
20899
  $module = $(this),
20614
- $context = $(settings.context),
20900
+ $context = [window,document].indexOf(settings.context) < 0 ? $(document).find(settings.context) : $(settings.context),
20615
20901
 
20616
20902
  $sidebars = $module.children(selector.sidebar),
20617
20903
  $fixed = $context.children(selector.fixed),
@@ -20663,7 +20949,7 @@ $.fn.sidebar = function(parameters) {
20663
20949
 
20664
20950
  create: {
20665
20951
  id: function() {
20666
- id = (Math.random().toString(16) + '000000000').substr(2,8);
20952
+ id = (Math.random().toString(16) + '000000000').slice(2, 10);
20667
20953
  elementNamespace = '.' + id;
20668
20954
  module.verbose('Creating unique id for element', id);
20669
20955
  }
@@ -20806,7 +21092,7 @@ $.fn.sidebar = function(parameters) {
20806
21092
  if(direction === 'left' || direction === 'right') {
20807
21093
  module.debug('Adding CSS rules for animation distance', width);
20808
21094
  style += ''
20809
- + ' body.pushable > .ui.visible.' + direction + '.sidebar ~ .pusher:after {'
21095
+ + ' body.pushable > .ui.visible.' + direction + '.sidebar ~ .pusher::after {'
20810
21096
  + ' -webkit-transform: translate3d('+ distance[direction] + 'px, 0, 0);'
20811
21097
  + ' transform: translate3d('+ distance[direction] + 'px, 0, 0);'
20812
21098
  + ' }'
@@ -20814,7 +21100,7 @@ $.fn.sidebar = function(parameters) {
20814
21100
  }
20815
21101
  else if(direction === 'top' || direction == 'bottom') {
20816
21102
  style += ''
20817
- + ' body.pushable > .ui.visible.' + direction + '.sidebar ~ .pusher:after {'
21103
+ + ' body.pushable > .ui.visible.' + direction + '.sidebar ~ .pusher::after {'
20818
21104
  + ' -webkit-transform: translate3d(0, ' + distance[direction] + 'px, 0);'
20819
21105
  + ' transform: translate3d(0, ' + distance[direction] + 'px, 0);'
20820
21106
  + ' }'
@@ -20822,8 +21108,8 @@ $.fn.sidebar = function(parameters) {
20822
21108
  }
20823
21109
  /* opposite sides visible forces content overlay */
20824
21110
  style += ''
20825
- + ' body.pushable > .ui.visible.left.sidebar ~ .ui.visible.right.sidebar ~ .pusher:after,'
20826
- + ' body.pushable > .ui.visible.right.sidebar ~ .ui.visible.left.sidebar ~ .pusher:after {'
21111
+ + ' body.pushable > .ui.visible.left.sidebar ~ .ui.visible.right.sidebar ~ .pusher::after,'
21112
+ + ' body.pushable > .ui.visible.right.sidebar ~ .ui.visible.left.sidebar ~ .pusher::after {'
20827
21113
  + ' -webkit-transform: translate3d(0, 0, 0);'
20828
21114
  + ' transform: translate3d(0, 0, 0);'
20829
21115
  + ' }'
@@ -20839,7 +21125,7 @@ $.fn.sidebar = function(parameters) {
20839
21125
 
20840
21126
  refresh: function() {
20841
21127
  module.verbose('Refreshing selector cache');
20842
- $context = $(settings.context);
21128
+ $context = [window,document].indexOf(settings.context) < 0 ? $(document).find(settings.context) : $(settings.context);
20843
21129
  $sidebars = $context.children(selector.sidebar);
20844
21130
  $pusher = $context.children(selector.pusher);
20845
21131
  $fixed = $context.children(selector.fixed);
@@ -20916,6 +21202,10 @@ $.fn.sidebar = function(parameters) {
20916
21202
  : function(){}
20917
21203
  ;
20918
21204
  if(module.is.hidden()) {
21205
+ if(settings.onShow.call(element) === false) {
21206
+ module.verbose('Show callback returned false cancelling show');
21207
+ return;
21208
+ }
20919
21209
  module.refreshSidebars();
20920
21210
  if(settings.overlay) {
20921
21211
  module.error(error.overlay);
@@ -20940,10 +21230,9 @@ $.fn.sidebar = function(parameters) {
20940
21230
  }
20941
21231
  module.pushPage(function() {
20942
21232
  callback.call(element);
20943
- settings.onShow.call(element);
21233
+ settings.onVisible.call(element);
20944
21234
  });
20945
21235
  settings.onChange.call(element);
20946
- settings.onVisible.call(element);
20947
21236
  }
20948
21237
  else {
20949
21238
  module.debug('Sidebar is already visible');
@@ -20955,7 +21244,7 @@ $.fn.sidebar = function(parameters) {
20955
21244
  ? callback
20956
21245
  : function(){}
20957
21246
  ;
20958
- if(module.is.visible() || module.is.animating()) {
21247
+ if((module.is.visible() || module.is.animating()) && settings.onHide.call(element) !== false) {
20959
21248
  module.debug('Hiding sidebar', callback);
20960
21249
  module.refreshSidebars();
20961
21250
  module.pullPage(function() {
@@ -20963,7 +21252,6 @@ $.fn.sidebar = function(parameters) {
20963
21252
  settings.onHidden.call(element);
20964
21253
  });
20965
21254
  settings.onChange.call(element);
20966
- settings.onHide.call(element);
20967
21255
  }
20968
21256
  },
20969
21257
 
@@ -21581,7 +21869,7 @@ $.fn.sidebar.settings = {
21581
21869
  })( jQuery, window, document );
21582
21870
 
21583
21871
  /*!
21584
- * # Fomantic-UI 2.9.0-beta.3 - Sticky
21872
+ * # Fomantic-UI 2.9.0-beta.301+42e68bc - Sticky
21585
21873
  * http://github.com/fomantic/Fomantic-UI/
21586
21874
  *
21587
21875
  *
@@ -21635,7 +21923,7 @@ $.fn.sticky = function(parameters) {
21635
21923
 
21636
21924
  $module = $(this),
21637
21925
  $window = $(window),
21638
- $scroll = $(settings.scrollContext),
21926
+ $scroll = [window,document].indexOf(settings.scrollContext) < 0 ? $(document).find(settings.scrollContext) : $(settings.scrollContext),
21639
21927
  $container,
21640
21928
  $context,
21641
21929
 
@@ -21721,7 +22009,7 @@ $.fn.sticky = function(parameters) {
21721
22009
 
21722
22010
  determineContainer: function() {
21723
22011
  if(settings.container) {
21724
- $container = $(settings.container);
22012
+ $container = [window,document].indexOf(settings.container) < 0 ? $(document).find(settings.container) : $(settings.container);
21725
22013
  }
21726
22014
  else {
21727
22015
  $container = $module.offsetParent();
@@ -21730,7 +22018,7 @@ $.fn.sticky = function(parameters) {
21730
22018
 
21731
22019
  determineContext: function() {
21732
22020
  if(settings.context) {
21733
- $context = $(settings.context);
22021
+ $context = [window,document].indexOf(settings.context) < 0 ? $(document).find(settings.context) : $(settings.context);
21734
22022
  }
21735
22023
  else {
21736
22024
  $context = $container;
@@ -22520,7 +22808,7 @@ $.fn.sticky.settings = {
22520
22808
 
22521
22809
  error : {
22522
22810
  container : 'Sticky element must be inside a relative container',
22523
- visible : 'Element is hidden, you must call refresh after element becomes visible. Use silent setting to surpress this warning in production.',
22811
+ visible : 'Element is hidden, you must call refresh after element becomes visible. Use silent setting to suppress this warning in production.',
22524
22812
  method : 'The method you called is not defined.',
22525
22813
  invalidContext : 'Context specified does not exist',
22526
22814
  elementSize : 'Sticky element is larger than its container, cannot create sticky.'
@@ -22539,7 +22827,7 @@ $.fn.sticky.settings = {
22539
22827
  })( jQuery, window, document );
22540
22828
 
22541
22829
  /*!
22542
- * # Fomantic-UI 2.9.0-beta.3 - Tab
22830
+ * # Fomantic-UI 2.9.0-beta.301+42e68bc - Tab
22543
22831
  * http://github.com/fomantic/Fomantic-UI/
22544
22832
  *
22545
22833
  *
@@ -22640,10 +22928,18 @@ $.fn.tab = function(parameters) {
22640
22928
  initializedHistory = true;
22641
22929
  }
22642
22930
 
22643
- if(settings.autoTabActivation && instance === undefined && module.determine.activeTab() == null) {
22644
- module.debug('No active tab detected, setting first tab active', module.get.initialPath());
22645
- module.changeTab(settings.autoTabActivation === true ? module.get.initialPath() : settings.autoTabActivation);
22646
- };
22931
+ var activeTab = module.determine.activeTab();
22932
+ if(settings.autoTabActivation && instance === undefined && activeTab == null) {
22933
+ activeTab = settings.autoTabActivation === true ? module.get.initialPath() : settings.autoTabActivation;
22934
+ module.debug('No active tab detected, setting tab active', activeTab);
22935
+ module.changeTab(activeTab);
22936
+ }
22937
+ if(activeTab != null && settings.history) {
22938
+ var autoUpdate = $.address.autoUpdate();
22939
+ $.address.autoUpdate(false);
22940
+ $.address.value(activeTab);
22941
+ $.address.autoUpdate(autoUpdate);
22942
+ }
22647
22943
 
22648
22944
  module.instantiate();
22649
22945
  },
@@ -22694,7 +22990,7 @@ $.fn.tab = function(parameters) {
22694
22990
  module.verbose('Determined parent element for creating context', $context);
22695
22991
  }
22696
22992
  else if(settings.context) {
22697
- $context = $(settings.context);
22993
+ $context = [window,document].indexOf(settings.context) < 0 ? $(document).find(settings.context) : $(settings.context);
22698
22994
  module.verbose('Using selector for tab context', settings.context, $context);
22699
22995
  }
22700
22996
  else {
@@ -22743,6 +23039,7 @@ $.fn.tab = function(parameters) {
22743
23039
  .history(true)
22744
23040
  .state(settings.path)
22745
23041
  ;
23042
+ $(window).trigger('popstate');
22746
23043
  }
22747
23044
  else {
22748
23045
  module.error(error.path);
@@ -22910,6 +23207,10 @@ $.fn.tab = function(parameters) {
22910
23207
  module.verbose('Tab parameters found', nextPathArray);
22911
23208
  }
22912
23209
  }
23210
+ if (settings.onBeforeChange.call(element, currentPath) === false) {
23211
+ module.debug('onBeforeChange returned false, cancelling tab change', $tab);
23212
+ return false;
23213
+ }
22913
23214
  if(isLastTab && remoteContent) {
22914
23215
  if(!shouldIgnoreLoad) {
22915
23216
  module.activate.navigation(currentPath);
@@ -22946,6 +23247,10 @@ $.fn.tab = function(parameters) {
22946
23247
  // if anchor exists use parent tab
22947
23248
  if($anchor && $anchor.length > 0 && currentPath) {
22948
23249
  module.debug('Anchor link used, opening parent tab', $tab, $anchor);
23250
+ if (settings.onBeforeChange.call(element, currentPath) === false) {
23251
+ module.debug('onBeforeChange returned false, cancelling tab change', $tab);
23252
+ return false;
23253
+ }
22949
23254
  if( !$tab.hasClass(className.active) ) {
22950
23255
  setTimeout(function() {
22951
23256
  module.scrollTo($anchor);
@@ -23499,6 +23804,7 @@ $.fn.tab.settings = {
23499
23804
  onLoad : function(tabPath, parameterArray, historyEvent) {}, // called on every load
23500
23805
  onVisible : function(tabPath, parameterArray, historyEvent) {}, // called every time tab visible
23501
23806
  onRequest : function(tabPath, parameterArray, historyEvent) {}, // called ever time a tab beings loading remote content
23807
+ onBeforeChange: function(tabPath) {}, // called before a tab is about to be changed. Returning false will cancel the tab change
23502
23808
 
23503
23809
  templates : {
23504
23810
  determineTitle: function(tabArray) {} // returns page title for path
@@ -23541,7 +23847,7 @@ $.fn.tab.settings = {
23541
23847
  })( jQuery, window, document );
23542
23848
 
23543
23849
  /*!
23544
- * # Fomantic-UI 2.9.0-beta.3 - Toast
23850
+ * # Fomantic-UI 2.9.0-beta.301+42e68bc - Toast
23545
23851
  * http://github.com/fomantic/Fomantic-UI/
23546
23852
  *
23547
23853
  *
@@ -23603,7 +23909,7 @@ $.fn.toast = function(parameters) {
23603
23909
  $animationObject,
23604
23910
  $close,
23605
23911
  $context = (settings.context)
23606
- ? $(settings.context)
23912
+ ? ([window,document].indexOf(settings.context) < 0 ? $(document).find(settings.context) : $(settings.context))
23607
23913
  : $('body'),
23608
23914
 
23609
23915
  isToastComponent = $module.hasClass('toast') || $module.hasClass('message') || $module.hasClass('card'),
@@ -23611,12 +23917,14 @@ $.fn.toast = function(parameters) {
23611
23917
  element = this,
23612
23918
  instance = isToastComponent ? $module.data(moduleNamespace) : undefined,
23613
23919
 
23920
+ id,
23614
23921
  module
23615
23922
  ;
23616
23923
  module = {
23617
23924
 
23618
23925
  initialize: function() {
23619
23926
  module.verbose('Initializing element');
23927
+ module.create.id();
23620
23928
  if (!module.has.container()) {
23621
23929
  module.create.container();
23622
23930
  }
@@ -23666,17 +23974,22 @@ $.fn.toast = function(parameters) {
23666
23974
  },
23667
23975
 
23668
23976
  show: function(callback) {
23669
- callback = callback || function(){};
23670
- module.debug('Showing toast');
23671
23977
  if(settings.onShow.call($toastBox, element) === false) {
23672
23978
  module.debug('onShow callback returned false, cancelling toast animation');
23673
23979
  return;
23674
23980
  }
23981
+ callback = callback || function(){};
23982
+ module.debug('Showing toast');
23675
23983
  module.animate.show(callback);
23676
23984
  },
23677
23985
 
23678
23986
  close: function(callback) {
23987
+ if(settings.onHide.call($toastBox, element) === false) {
23988
+ module.debug('onHide callback returned false, cancelling toast animation');
23989
+ return;
23990
+ }
23679
23991
  callback = callback || function(){};
23992
+ module.debug('Closing toast');
23680
23993
  module.remove.visible();
23681
23994
  module.unbind.events();
23682
23995
  module.animate.close(callback);
@@ -23686,14 +23999,18 @@ $.fn.toast = function(parameters) {
23686
23999
  create: {
23687
24000
  container: function() {
23688
24001
  module.verbose('Creating container');
23689
- $context.append($('<div/>',{class: settings.position + ' ' + className.container + ' ' +(settings.horizontal ? className.horizontal : '')}));
24002
+ $context.append($('<div/>',{class: settings.position + ' ' + className.container + ' ' +(settings.horizontal ? className.horizontal : '') + ' ' + (settings.context && settings.context !== 'body' ? className.absolute : '')}));
24003
+ },
24004
+ id: function() {
24005
+ id = (Math.random().toString(16) + '000000000').slice(2, 10);
24006
+ module.verbose('Creating unique id for element', id);
23690
24007
  },
23691
24008
  toast: function() {
23692
24009
  $toastBox = $('<div/>', {class: className.box});
23693
24010
  var iconClass = module.get.iconClass();
23694
24011
  if (!isToastComponent) {
23695
24012
  module.verbose('Creating toast');
23696
- $toast = $('<div/>');
24013
+ $toast = $('<div/>', {role: 'alert'});
23697
24014
  var $content = $('<div/>', {class: className.content});
23698
24015
  if (iconClass !== '') {
23699
24016
  $toast.append($('<i/>', {class: iconClass + ' ' + className.icon}));
@@ -23706,13 +24023,21 @@ $.fn.toast = function(parameters) {
23706
24023
  }));
23707
24024
  }
23708
24025
  if (settings.title !== '') {
24026
+ var titleId = '_' + module.get.id() + 'title';
24027
+ $toast.attr('aria-labelledby', titleId);
23709
24028
  $content.append($('<div/>', {
23710
24029
  class: className.title,
23711
- text: settings.title
24030
+ id: titleId,
24031
+ html: module.helpers.escape(settings.title, settings.preserveHTML)
23712
24032
  }));
23713
24033
  }
23714
-
23715
- $content.append($('<div/>', {class: className.message, html: module.helpers.escape(settings.message, settings.preserveHTML)}));
24034
+ var descId = '_' + module.get.id() + 'desc';
24035
+ $toast.attr('aria-describedby', descId);
24036
+ $content.append($('<div/>', {
24037
+ class: className.message,
24038
+ id: descId,
24039
+ html: module.helpers.escape(settings.message, settings.preserveHTML)
24040
+ }));
23716
24041
 
23717
24042
  $toast
23718
24043
  .addClass(settings.class + ' ' + className.toast)
@@ -23720,7 +24045,7 @@ $.fn.toast = function(parameters) {
23720
24045
  ;
23721
24046
  $toast.css('opacity', settings.opacity);
23722
24047
  if (settings.closeIcon) {
23723
- $close = $('<i/>', {class: className.close + ' ' + (typeof settings.closeIcon === 'string' ? settings.closeIcon : '')});
24048
+ $close = $('<i/>', {class: className.close + ' ' + (typeof settings.closeIcon === 'string' ? settings.closeIcon : ''), role: 'button', tabindex: 0, 'aria-label': settings.text.close});
23724
24049
  if($close.hasClass(className.left)) {
23725
24050
  $toast.prepend($close);
23726
24051
  } else {
@@ -23763,15 +24088,17 @@ $.fn.toast = function(parameters) {
23763
24088
  }
23764
24089
  }
23765
24090
  settings.actions.forEach(function (el) {
23766
- var icon = el[fields.icon] ? '<i class="' + module.helpers.deQuote(el[fields.icon]) + ' icon"></i>' : '',
24091
+ var icon = el[fields.icon] ? '<i '+(el[fields.text] ? 'aria-hidden="true"' : '')+' class="' + module.helpers.deQuote(el[fields.icon]) + ' icon"></i>' : '',
23767
24092
  text = module.helpers.escape(el[fields.text] || '', settings.preserveHTML),
23768
24093
  cls = module.helpers.deQuote(el[fields.class] || ''),
23769
24094
  click = el[fields.click] && $.isFunction(el[fields.click]) ? el[fields.click] : function () {};
23770
24095
  $actions.append($('<button/>', {
23771
24096
  html: icon + text,
24097
+ 'aria-label': (el[fields.text] || el[fields.icon] || '').replace(/<[^>]+(>|$)/g,''),
23772
24098
  class: className.button + ' ' + cls,
23773
24099
  click: function () {
23774
- if (click.call(element, $module) === false) {
24100
+ var button = $(this);
24101
+ if (button.is(selector.approve) || button.is(selector.deny) || click.call(element, $module) === false) {
23775
24102
  return;
23776
24103
  }
23777
24104
  module.close();
@@ -23871,13 +24198,12 @@ $.fn.toast = function(parameters) {
23871
24198
  bind: {
23872
24199
  events: function() {
23873
24200
  module.debug('Binding events to toast');
23874
- if(settings.closeOnClick || settings.closeIcon) {
23875
- (settings.closeIcon ? $close : $toast)
23876
- .on('click' + eventNamespace, module.event.click)
23877
- ;
24201
+ if(settings.closeIcon) {
24202
+ $close.on('click' + eventNamespace, module.event.close);
23878
24203
  }
24204
+ $toast.on('click' + eventNamespace, module.event.click);
23879
24205
  if($animationObject) {
23880
- $animationObject.on('animationend' + eventNamespace, module.close);
24206
+ $animationObject.on('animationend' + eventNamespace, module.event.close);
23881
24207
  }
23882
24208
  $toastBox
23883
24209
  .on('click' + eventNamespace, selector.approve, module.event.approve)
@@ -23889,11 +24215,10 @@ $.fn.toast = function(parameters) {
23889
24215
  unbind: {
23890
24216
  events: function() {
23891
24217
  module.debug('Unbinding events to toast');
23892
- if(settings.closeOnClick || settings.closeIcon) {
23893
- (settings.closeIcon ? $close : $toast)
23894
- .off('click' + eventNamespace)
23895
- ;
24218
+ if(settings.closeIcon) {
24219
+ $close.off('click' + eventNamespace);
23896
24220
  }
24221
+ $toast.off('click' + eventNamespace);
23897
24222
  if($animationObject) {
23898
24223
  $animationObject.off('animationend' + eventNamespace);
23899
24224
  }
@@ -23925,11 +24250,6 @@ $.fn.toast = function(parameters) {
23925
24250
  },
23926
24251
  close: function(callback) {
23927
24252
  callback = $.isFunction(callback) ? callback : function(){};
23928
- module.debug('Closing toast');
23929
- if(settings.onHide.call($toastBox, element) === false) {
23930
- module.debug('onHide callback returned false, cancelling toast animation');
23931
- return;
23932
- }
23933
24253
  if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
23934
24254
  $toastBox
23935
24255
  .transition({
@@ -23985,7 +24305,7 @@ $.fn.toast = function(parameters) {
23985
24305
  has: {
23986
24306
  container: function() {
23987
24307
  module.verbose('Determining if there is already a container');
23988
- return ($context.find(module.helpers.toClass(settings.position) + selector.container + (settings.horizontal ? module.helpers.toClass(className.horizontal) : '')).length > 0);
24308
+ return module.get.containers().length > 0;
23989
24309
  },
23990
24310
  toast: function(){
23991
24311
  return !!module.get.toast();
@@ -23999,8 +24319,14 @@ $.fn.toast = function(parameters) {
23999
24319
  },
24000
24320
 
24001
24321
  get: {
24322
+ id: function() {
24323
+ return id;
24324
+ },
24325
+ containers: function() {
24326
+ return $context.children(module.helpers.toClass(settings.position) + selector.container + (settings.horizontal ? module.helpers.toClass(className.horizontal) : ':not('+module.helpers.toClass(className.horizontal)+')') + (settings.context && settings.context !== 'body' ? module.helpers.toClass(className.absolute) : ':not('+module.helpers.toClass(className.absolute)+')'));
24327
+ },
24002
24328
  container: function() {
24003
- return ($context.find(module.helpers.toClass(settings.position) + selector.container)[0]);
24329
+ return module.get.containers()[0];
24004
24330
  },
24005
24331
  toastBox: function() {
24006
24332
  return $toastBox || null;
@@ -24032,9 +24358,15 @@ $.fn.toast = function(parameters) {
24032
24358
  },
24033
24359
 
24034
24360
  event: {
24361
+ close: function(){
24362
+ module.close();
24363
+ },
24035
24364
  click: function(event) {
24036
- if($(event.target).closest('a').length === 0) {
24037
- settings.onClick.call($toastBox, element);
24365
+ if($(event.target).closest(selector.clickable).length === 0) {
24366
+ if(settings.onClick.call($toastBox, element) === false || !settings.closeOnClick) {
24367
+ module.verbose('Click callback returned false or close denied by setting cancelling close');
24368
+ return;
24369
+ }
24038
24370
  module.close();
24039
24371
  }
24040
24372
  },
@@ -24057,7 +24389,7 @@ $.fn.toast = function(parameters) {
24057
24389
  helpers: {
24058
24390
  toClass: function(selector) {
24059
24391
  var
24060
- classes = selector.split(' '),
24392
+ classes = selector.trim().split(/\s+/),
24061
24393
  result = ''
24062
24394
  ;
24063
24395
 
@@ -24347,6 +24679,7 @@ $.fn.toast.settings = {
24347
24679
 
24348
24680
  className : {
24349
24681
  container : 'ui toast-container',
24682
+ absolute : 'absolute',
24350
24683
  box : 'floating toast-box',
24351
24684
  progress : 'ui attached active progress',
24352
24685
  toast : 'ui toast',
@@ -24375,6 +24708,10 @@ $.fn.toast.settings = {
24375
24708
  unclickable : 'unclickable'
24376
24709
  },
24377
24710
 
24711
+ text: {
24712
+ close : 'Close'
24713
+ },
24714
+
24378
24715
  icons : {
24379
24716
  info : 'info',
24380
24717
  success : 'checkmark',
@@ -24391,6 +24728,7 @@ $.fn.toast.settings = {
24391
24728
  image : '> img.image, > .image > img',
24392
24729
  icon : '> i.icon',
24393
24730
  input : 'input:not([type="hidden"]), textarea, select, button, .ui.button, ui.dropdown',
24731
+ clickable : 'a, details, .ui.accordion',
24394
24732
  approve : '.actions .positive, .actions .approve, .actions .ok',
24395
24733
  deny : '.actions .negative, .actions .deny, .actions .cancel'
24396
24734
  },
@@ -24434,7 +24772,7 @@ $.extend( $.easing, {
24434
24772
  })( jQuery, window, document );
24435
24773
 
24436
24774
  /*!
24437
- * # Fomantic-UI 2.9.0-beta.3 - Transition
24775
+ * # Fomantic-UI 2.9.0-beta.301+42e68bc - Transition
24438
24776
  * http://github.com/fomantic/Fomantic-UI/
24439
24777
  *
24440
24778
  *
@@ -25206,6 +25544,10 @@ $.fn.transition = function() {
25206
25544
  },
25207
25545
 
25208
25546
  hide: function() {
25547
+ if(settings.onHide.call(element) === false) {
25548
+ module.verbose('Hide callback returned false cancelling hide');
25549
+ return false;
25550
+ }
25209
25551
  module.verbose('Hiding element');
25210
25552
  if( module.is.animating() ) {
25211
25553
  module.reset();
@@ -25213,35 +25555,32 @@ $.fn.transition = function() {
25213
25555
  element.blur(); // IE will trigger focus change if element is not blurred before hiding
25214
25556
  module.remove.display();
25215
25557
  module.remove.visible();
25216
- if($.isFunction(settings.onBeforeHide)){
25217
- settings.onBeforeHide.call(element,function(){
25218
- module.hideNow();
25219
- });
25220
- } else {
25221
- module.hideNow();
25222
- }
25223
-
25558
+ settings.onBeforeHide.call(element, module.hideNow);
25224
25559
  },
25225
25560
 
25226
25561
  hideNow: function() {
25227
25562
  module.set.hidden();
25228
25563
  module.force.hidden();
25229
- settings.onHide.call(element);
25564
+ settings.onHidden.call(element);
25230
25565
  settings.onComplete.call(element);
25231
25566
  // module.repaint();
25232
25567
  },
25233
25568
 
25234
25569
  show: function(display) {
25235
- module.verbose('Showing element', display);
25236
- if(module.force.visible()) {
25570
+ if(module.force.visible() && settings.onShow.call(element) !== false) {
25571
+ module.verbose('Showing element', display);
25237
25572
  module.remove.hidden();
25238
- module.set.visible();
25239
- settings.onShow.call(element);
25240
- settings.onComplete.call(element);
25241
- // module.repaint();
25573
+ settings.onBeforeShow.call(element, module.showNow);
25242
25574
  }
25243
25575
  },
25244
25576
 
25577
+ showNow: function(){
25578
+ module.set.visible();
25579
+ settings.onVisible.call(element);
25580
+ settings.onComplete.call(element);
25581
+ // module.repaint();
25582
+ },
25583
+
25245
25584
  toggle: function() {
25246
25585
  if( module.is.visible() ) {
25247
25586
  module.hide();
@@ -25490,7 +25829,11 @@ $.fn.transition.settings = {
25490
25829
  onStart : function() {},
25491
25830
  onComplete : function() {},
25492
25831
  onShow : function() {},
25832
+ onBeforeShow : function(callback) {callback.call(this)},
25833
+ onVisible : function() {},
25493
25834
  onHide : function() {},
25835
+ onHidden : function() {},
25836
+ onBeforeHide : function(callback) {callback.call(this)},
25494
25837
 
25495
25838
  // whether timeout should be used to ensure callback fires in cases animationend does not
25496
25839
  useFailSafe : true,
@@ -25532,7 +25875,7 @@ $.fn.transition.settings = {
25532
25875
 
25533
25876
  // possible errors
25534
25877
  error: {
25535
- noAnimation : 'Element is no longer attached to DOM. Unable to animate. Use silent setting to surpress this warning in production.',
25878
+ noAnimation : 'Element is no longer attached to DOM. Unable to animate. Use silent setting to suppress this warning in production.',
25536
25879
  repeated : 'That animation is already occurring, cancelling repeated animation',
25537
25880
  method : 'The method you called is not defined',
25538
25881
  support : 'This browser does not support CSS animations'
@@ -25544,7 +25887,7 @@ $.fn.transition.settings = {
25544
25887
  })( jQuery, window, document );
25545
25888
 
25546
25889
  /*!
25547
- * # Fomantic-UI 2.9.0-beta.3 - API
25890
+ * # Fomantic-UI 2.9.0-beta.301+42e68bc - API
25548
25891
  * http://github.com/fomantic/Fomantic-UI/
25549
25892
  *
25550
25893
  *
@@ -25610,7 +25953,7 @@ $.api = $.fn.api = function(parameters) {
25610
25953
 
25611
25954
  // context used for state
25612
25955
  $context = (settings.stateContext)
25613
- ? $(settings.stateContext)
25956
+ ? ([window,document].indexOf(settings.stateContext) < 0 ? $(document).find(settings.stateContext) : $(settings.stateContext))
25614
25957
  : $module,
25615
25958
 
25616
25959
  // request details
@@ -25619,6 +25962,7 @@ $.api = $.fn.api = function(parameters) {
25619
25962
  url,
25620
25963
  data,
25621
25964
  requestStartTime,
25965
+ originalData,
25622
25966
 
25623
25967
  // standard module
25624
25968
  element = this,
@@ -25631,6 +25975,7 @@ $.api = $.fn.api = function(parameters) {
25631
25975
 
25632
25976
  initialize: function() {
25633
25977
  if(!methodInvoked) {
25978
+ originalData = settings.data;
25634
25979
  module.bind.events();
25635
25980
  }
25636
25981
  module.instantiate();
@@ -25677,7 +26022,7 @@ $.api = $.fn.api = function(parameters) {
25677
26022
  response = JSON.parse(response);
25678
26023
  }
25679
26024
  catch(e) {
25680
- // isnt json string
26025
+ // isn't json string
25681
26026
  }
25682
26027
  }
25683
26028
  return response;
@@ -25693,8 +26038,8 @@ $.api = $.fn.api = function(parameters) {
25693
26038
  module.error(error.noStorage);
25694
26039
  return;
25695
26040
  }
25696
- response = sessionStorage.getItem(url);
25697
- module.debug('Using cached response', url, response);
26041
+ response = sessionStorage.getItem(url + module.get.normalizedData());
26042
+ module.debug('Using cached response', url, settings.data, response);
25698
26043
  response = module.decode.json(response);
25699
26044
  return response;
25700
26045
  }
@@ -25712,8 +26057,8 @@ $.api = $.fn.api = function(parameters) {
25712
26057
  if( $.isPlainObject(response) ) {
25713
26058
  response = JSON.stringify(response);
25714
26059
  }
25715
- sessionStorage.setItem(url, response);
25716
- module.verbose('Storing cached response for url', url, response);
26060
+ sessionStorage.setItem(url + module.get.normalizedData(), response);
26061
+ module.verbose('Storing cached response for url', url, settings.data, response);
25717
26062
  }
25718
26063
  },
25719
26064
 
@@ -25742,7 +26087,7 @@ $.api = $.fn.api = function(parameters) {
25742
26087
 
25743
26088
  // Add form content
25744
26089
  if(settings.serializeForm) {
25745
- settings.data = module.add.formData(settings.data);
26090
+ settings.data = module.add.formData(originalData || settings.data);
25746
26091
  }
25747
26092
 
25748
26093
  // call beforesend and get any settings changes
@@ -25879,10 +26224,6 @@ $.api = $.fn.api = function(parameters) {
25879
26224
  cancelled: function() {
25880
26225
  return (module.cancelled || false);
25881
26226
  },
25882
- succesful: function() {
25883
- module.verbose('This behavior will be deleted due to typo. Use "was successful" instead.');
25884
- return module.was.successful();
25885
- },
25886
26227
  successful: function() {
25887
26228
  return (module.request && module.request.state() == 'resolved');
25888
26229
  },
@@ -25910,8 +26251,8 @@ $.api = $.fn.api = function(parameters) {
25910
26251
  var
25911
26252
  // allow legacy {$var} style
25912
26253
  variable = (templatedString.indexOf('$') !== -1)
25913
- ? templatedString.substr(2, templatedString.length - 3)
25914
- : templatedString.substr(1, templatedString.length - 2),
26254
+ ? templatedString.slice(2, -1)
26255
+ : templatedString.slice(1, -1),
25915
26256
  value = ($.isPlainObject(urlData) && urlData[variable] !== undefined)
25916
26257
  ? urlData[variable]
25917
26258
  : ($module.data(variable) !== undefined)
@@ -25942,8 +26283,8 @@ $.api = $.fn.api = function(parameters) {
25942
26283
  var
25943
26284
  // allow legacy {/$var} style
25944
26285
  variable = (templatedString.indexOf('$') !== -1)
25945
- ? templatedString.substr(3, templatedString.length - 4)
25946
- : templatedString.substr(2, templatedString.length - 3),
26286
+ ? templatedString.slice(3, -1)
26287
+ : templatedString.slice(2, -1),
25947
26288
  value = ($.isPlainObject(urlData) && urlData[variable] !== undefined)
25948
26289
  ? urlData[variable]
25949
26290
  : ($module.data(variable) !== undefined)
@@ -25974,24 +26315,76 @@ $.api = $.fn.api = function(parameters) {
25974
26315
  },
25975
26316
  formData: function(data) {
25976
26317
  var
25977
- canSerialize = ($.fn.serializeObject !== undefined),
25978
- formData = (canSerialize)
25979
- ? $form.serializeObject()
25980
- : $form.serialize(),
25981
- hasOtherData
26318
+ formData = {},
26319
+ hasOtherData,
26320
+ useFormDataApi = settings.serializeForm === 'formdata'
25982
26321
  ;
25983
- data = data || settings.data;
26322
+ data = data || originalData || settings.data;
25984
26323
  hasOtherData = $.isPlainObject(data);
25985
26324
 
26325
+ if (useFormDataApi) {
26326
+ formData = new FormData($form[0]);
26327
+ settings.processData = typeof settings.processData !== 'undefined' ? settings.processData : false;
26328
+ settings.contentType = typeof settings.contentType !== 'undefined' ? settings.contentType : false;
26329
+ } else {
26330
+ var formArray = $form.serializeArray(),
26331
+ pushes = {},
26332
+ pushValues= {},
26333
+ build = function(base, key, value) {
26334
+ base[key] = value;
26335
+ return base;
26336
+ }
26337
+ ;
26338
+ // add files
26339
+ $.each($('input[type="file"]',$form), function(i, tag) {
26340
+ $.each($(tag)[0].files, function(j, file) {
26341
+ formArray.push({name:tag.name, value: file});
26342
+ });
26343
+ });
26344
+ $.each(formArray, function(i, el) {
26345
+ if (!settings.regExp.validate.test(el.name)) return;
26346
+ var isCheckbox = $('[name="' + el.name + '"]', $form).attr('type') === 'checkbox',
26347
+ floatValue = parseFloat(el.value),
26348
+ value = (isCheckbox && el.value === 'on') || el.value === 'true' || (String(floatValue) === el.value ? floatValue : (el.value === 'false' ? false : el.value)),
26349
+ nameKeys = el.name.match(settings.regExp.key) || [], k, pushKey= el.name.replace(/\[\]$/,'')
26350
+ ;
26351
+ if(!(pushKey in pushes)) {
26352
+ pushes[pushKey] = 0;
26353
+ pushValues[pushKey] = value;
26354
+ } else if (Array.isArray(pushValues[pushKey])) {
26355
+ pushValues[pushKey].push(value);
26356
+ } else {
26357
+ pushValues[pushKey] = [pushValues[pushKey] , value];
26358
+ }
26359
+ value = pushValues[pushKey];
26360
+
26361
+ while ((k = nameKeys.pop()) !== undefined) {
26362
+ // foo[]
26363
+ if (k == '' && !Array.isArray(value)){
26364
+ value = build([], pushes[pushKey]++, value);
26365
+ }
26366
+ // foo[n]
26367
+ else if (settings.regExp.fixed.test(k)) {
26368
+ value = build([], k, value);
26369
+ }
26370
+ // foo; foo[bar]
26371
+ else if (settings.regExp.named.test(k)) {
26372
+ value = build({}, k, value);
26373
+ }
26374
+ }
26375
+ formData = $.extend(true, formData, value);
26376
+ });
26377
+ }
26378
+
25986
26379
  if(hasOtherData) {
25987
- if(canSerialize) {
25988
- module.debug('Extending existing data with form data', data, formData);
25989
- data = $.extend(true, {}, data, formData);
25990
- }
25991
- else {
25992
- module.error(error.missingSerialize);
25993
- module.debug('Cant extend data. Replacing data with form data', data, formData);
26380
+ module.debug('Extending existing data with form data', data, formData);
26381
+ if(useFormDataApi) {
26382
+ $.each(Object.keys(data),function(i, el){
26383
+ formData.append(el, data[el]);
26384
+ });
25994
26385
  data = formData;
26386
+ } else {
26387
+ data = $.extend(true, {}, data, formData);
25995
26388
  }
25996
26389
  }
25997
26390
  else {
@@ -26243,6 +26636,9 @@ $.api = $.fn.api = function(parameters) {
26243
26636
  },
26244
26637
 
26245
26638
  get: {
26639
+ normalizedData: function(){
26640
+ return typeof settings.data === "string" ? settings.data : JSON.stringify(settings.data, Object.keys(settings.data).sort());
26641
+ },
26246
26642
  responseFromXHR: function(xhr) {
26247
26643
  return $.isPlainObject(xhr)
26248
26644
  ? (module.is.expectingJSON())
@@ -26628,6 +27024,8 @@ $.api.settings = {
26628
27024
  defaultData : true,
26629
27025
 
26630
27026
  // whether to serialize closest form
27027
+ // use true to convert complex named keys like a[b][1][c][] into a nested object
27028
+ // use 'formdata' for formdata web api
26631
27029
  serializeForm : false,
26632
27030
 
26633
27031
  // how long to wait before request should occur
@@ -26650,7 +27048,7 @@ $.api.settings = {
26650
27048
  responseAsync : false,
26651
27049
 
26652
27050
  // whether onResponse should work with response value without force converting into an object
26653
- rawResponse : false,
27051
+ rawResponse : true,
26654
27052
 
26655
27053
  // callbacks before request
26656
27054
  beforeSend : function(settings) { return settings; },
@@ -26686,7 +27084,6 @@ $.api.settings = {
26686
27084
  legacyParameters : 'You are using legacy API success callback names',
26687
27085
  method : 'The method you called is not defined',
26688
27086
  missingAction : 'API action used but no url was defined',
26689
- missingSerialize : 'jquery-serialize-object is required to add form data to an existing data object',
26690
27087
  missingURL : 'No URL specified for api event',
26691
27088
  noReturnedValue : 'The beforeSend callback must return a settings object, beforeSend ignored.',
26692
27089
  noStorage : 'Caching responses locally requires session storage',
@@ -26699,6 +27096,11 @@ $.api.settings = {
26699
27096
  regExp : {
26700
27097
  required : /\{\$*[A-z0-9]+\}/g,
26701
27098
  optional : /\{\/\$*[A-z0-9]+\}/g,
27099
+ validate: /^[a-z_][a-z0-9_-]*(?:\[[a-z0-9_-]*\])*$/i,
27100
+ key: /[a-z0-9_-]+|(?=\[\])/gi,
27101
+ push: /^$/,
27102
+ fixed: /^\d+$/,
27103
+ named: /^[a-z0-9_-]+$/i
26702
27104
  },
26703
27105
 
26704
27106
  className: {
@@ -26722,7 +27124,7 @@ $.api.settings = {
26722
27124
  })( jQuery, window, document );
26723
27125
 
26724
27126
  /*!
26725
- * # Fomantic-UI 2.9.0-beta.3 - State
27127
+ * # Fomantic-UI 2.9.0-beta.301+42e68bc - State
26726
27128
  * http://github.com/fomantic/Fomantic-UI/
26727
27129
  *
26728
27130
  *
@@ -26797,7 +27199,7 @@ $.fn.state = function(parameters) {
26797
27199
 
26798
27200
  // bind events with delegated events
26799
27201
  if(settings.context && moduleSelector !== '') {
26800
- $(settings.context)
27202
+ ([window,document].indexOf(settings.context) < 0 ? $(document).find(settings.context) : $(settings.context))
26801
27203
  .on(moduleSelector, 'mouseenter' + eventNamespace, module.change.text)
26802
27204
  .on(moduleSelector, 'mouseleave' + eventNamespace, module.reset.text)
26803
27205
  .on(moduleSelector, 'click' + eventNamespace, module.toggle.state)
@@ -27434,7 +27836,7 @@ $.fn.state.settings = {
27434
27836
  })( jQuery, window, document );
27435
27837
 
27436
27838
  /*!
27437
- * # Fomantic-UI 2.9.0-beta.3 - Visibility
27839
+ * # Fomantic-UI 2.9.0-beta.301+42e68bc - Visibility
27438
27840
  * http://github.com/fomantic/Fomantic-UI/
27439
27841
  *
27440
27842
  *
@@ -27493,7 +27895,7 @@ $.fn.visibility = function(parameters) {
27493
27895
  $window = $(window),
27494
27896
 
27495
27897
  $module = $(this),
27496
- $context = $(settings.context),
27898
+ $context = [window,document].indexOf(settings.context) < 0 ? $(document).find(settings.context) : $(settings.context),
27497
27899
 
27498
27900
  $placeholder,
27499
27901
 
@@ -28672,7 +29074,7 @@ $.fn.visibility.settings = {
28672
29074
  // callback should only occur one time
28673
29075
  once : true,
28674
29076
 
28675
- // callback should fire continuously whe evaluates to true
29077
+ // callback should fire continuously when evaluates to true
28676
29078
  continuous : false,
28677
29079
 
28678
29080
  // offset to use with scroll top