fomantic-ui 2.9.4-beta.10 → 2.9.4-beta.100

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 (295) hide show
  1. package/.all-contributorsrc +29 -1
  2. package/.eslintrc.js +17 -0
  3. package/.github/FUNDING.yml +1 -1
  4. package/.github/workflows/ci.yml +8 -8
  5. package/.github/workflows/depsreview.yml +14 -0
  6. package/.github/workflows/nightly.yml +1 -1
  7. package/.github/workflows/release.yml +1 -1
  8. package/CONTRIBUTORS.md +5 -0
  9. package/README.md +2 -12
  10. package/dist/components/accordion.css +1 -1
  11. package/dist/components/accordion.js +4 -2
  12. package/dist/components/accordion.min.css +1 -1
  13. package/dist/components/accordion.min.js +2 -2
  14. package/dist/components/ad.css +1 -1
  15. package/dist/components/ad.min.css +1 -1
  16. package/dist/components/api.js +7 -3
  17. package/dist/components/api.min.js +2 -2
  18. package/dist/components/breadcrumb.css +1 -1
  19. package/dist/components/breadcrumb.min.css +1 -1
  20. package/dist/components/button.css +21 -3
  21. package/dist/components/button.min.css +2 -2
  22. package/dist/components/calendar.css +1 -1
  23. package/dist/components/calendar.js +47 -12
  24. package/dist/components/calendar.min.css +1 -1
  25. package/dist/components/calendar.min.js +3 -3
  26. package/dist/components/card.css +1 -1
  27. package/dist/components/card.min.css +1 -1
  28. package/dist/components/checkbox.css +1 -1
  29. package/dist/components/checkbox.js +10 -4
  30. package/dist/components/checkbox.min.css +1 -1
  31. package/dist/components/checkbox.min.js +3 -3
  32. package/dist/components/comment.css +1 -1
  33. package/dist/components/comment.min.css +1 -1
  34. package/dist/components/container.css +1 -1
  35. package/dist/components/container.min.css +1 -1
  36. package/dist/components/dimmer.css +7 -3
  37. package/dist/components/dimmer.js +4 -2
  38. package/dist/components/dimmer.min.css +2 -2
  39. package/dist/components/dimmer.min.js +2 -2
  40. package/dist/components/divider.css +1 -1
  41. package/dist/components/divider.min.css +1 -1
  42. package/dist/components/dropdown.css +46 -38
  43. package/dist/components/dropdown.js +109 -34
  44. package/dist/components/dropdown.min.css +2 -2
  45. package/dist/components/dropdown.min.js +3 -3
  46. package/dist/components/embed.css +1 -1
  47. package/dist/components/embed.js +17 -7
  48. package/dist/components/embed.min.css +1 -1
  49. package/dist/components/embed.min.js +3 -3
  50. package/dist/components/emoji.css +4309 -3713
  51. package/dist/components/emoji.min.css +2 -2
  52. package/dist/components/feed.css +12 -1
  53. package/dist/components/feed.min.css +2 -2
  54. package/dist/components/flag.css +3 -1
  55. package/dist/components/flag.min.css +2 -2
  56. package/dist/components/flyout.css +3 -3
  57. package/dist/components/flyout.js +4 -2
  58. package/dist/components/flyout.min.css +1 -1
  59. package/dist/components/flyout.min.js +2 -2
  60. package/dist/components/form.css +15 -3
  61. package/dist/components/form.js +66 -23
  62. package/dist/components/form.min.css +2 -2
  63. package/dist/components/form.min.js +3 -3
  64. package/dist/components/grid.css +5 -5
  65. package/dist/components/grid.min.css +2 -2
  66. package/dist/components/header.css +1 -1
  67. package/dist/components/header.min.css +1 -1
  68. package/dist/components/icon.css +1 -1
  69. package/dist/components/icon.min.css +1 -1
  70. package/dist/components/image.css +1 -1
  71. package/dist/components/image.min.css +1 -1
  72. package/dist/components/input.css +1 -1
  73. package/dist/components/input.min.css +1 -1
  74. package/dist/components/item.css +1 -1
  75. package/dist/components/item.min.css +1 -1
  76. package/dist/components/label.css +7 -1
  77. package/dist/components/label.min.css +2 -2
  78. package/dist/components/list.css +1 -1
  79. package/dist/components/list.min.css +1 -1
  80. package/dist/components/loader.css +1 -1
  81. package/dist/components/loader.min.css +1 -1
  82. package/dist/components/menu.css +1 -1
  83. package/dist/components/menu.min.css +1 -1
  84. package/dist/components/message.css +2 -1
  85. package/dist/components/message.min.css +2 -2
  86. package/dist/components/modal.css +3 -3
  87. package/dist/components/modal.js +7 -3
  88. package/dist/components/modal.min.css +1 -1
  89. package/dist/components/modal.min.js +2 -2
  90. package/dist/components/nag.css +1 -1
  91. package/dist/components/nag.js +11 -5
  92. package/dist/components/nag.min.css +1 -1
  93. package/dist/components/nag.min.js +3 -3
  94. package/dist/components/placeholder.css +1 -1
  95. package/dist/components/placeholder.min.css +1 -1
  96. package/dist/components/popup.css +1 -1
  97. package/dist/components/popup.js +10 -4
  98. package/dist/components/popup.min.css +1 -1
  99. package/dist/components/popup.min.js +2 -2
  100. package/dist/components/progress.css +15 -6
  101. package/dist/components/progress.js +4 -2
  102. package/dist/components/progress.min.css +2 -2
  103. package/dist/components/progress.min.js +2 -2
  104. package/dist/components/rail.css +1 -1
  105. package/dist/components/rail.min.css +1 -1
  106. package/dist/components/rating.css +1 -1
  107. package/dist/components/rating.js +4 -2
  108. package/dist/components/rating.min.css +1 -1
  109. package/dist/components/rating.min.js +2 -2
  110. package/dist/components/reset.css +1 -1
  111. package/dist/components/reset.min.css +1 -1
  112. package/dist/components/reveal.css +1 -1
  113. package/dist/components/reveal.min.css +1 -1
  114. package/dist/components/search.css +34 -23
  115. package/dist/components/search.js +78 -14
  116. package/dist/components/search.min.css +2 -2
  117. package/dist/components/search.min.js +3 -3
  118. package/dist/components/segment.css +1 -1
  119. package/dist/components/segment.min.css +1 -1
  120. package/dist/components/shape.css +1 -1
  121. package/dist/components/shape.js +7 -5
  122. package/dist/components/shape.min.css +1 -1
  123. package/dist/components/shape.min.js +3 -3
  124. package/dist/components/sidebar.css +1 -1
  125. package/dist/components/sidebar.js +4 -2
  126. package/dist/components/sidebar.min.css +1 -1
  127. package/dist/components/sidebar.min.js +2 -2
  128. package/dist/components/site.css +14 -6
  129. package/dist/components/site.js +4 -2
  130. package/dist/components/site.min.css +2 -2
  131. package/dist/components/site.min.js +2 -2
  132. package/dist/components/slider.css +152 -2
  133. package/dist/components/slider.js +142 -44
  134. package/dist/components/slider.min.css +2 -2
  135. package/dist/components/slider.min.js +3 -3
  136. package/dist/components/state.js +4 -2
  137. package/dist/components/state.min.js +2 -2
  138. package/dist/components/statistic.css +1 -1
  139. package/dist/components/statistic.min.css +1 -1
  140. package/dist/components/step.css +992 -86
  141. package/dist/components/step.min.css +2 -2
  142. package/dist/components/sticky.css +1 -1
  143. package/dist/components/sticky.js +4 -2
  144. package/dist/components/sticky.min.css +1 -1
  145. package/dist/components/sticky.min.js +2 -2
  146. package/dist/components/tab.css +1 -1
  147. package/dist/components/tab.js +4 -2
  148. package/dist/components/tab.min.css +1 -1
  149. package/dist/components/tab.min.js +2 -2
  150. package/dist/components/table.css +32 -21
  151. package/dist/components/table.min.css +2 -2
  152. package/dist/components/text.css +1 -1
  153. package/dist/components/text.min.css +1 -1
  154. package/dist/components/toast.css +1 -1
  155. package/dist/components/toast.js +7 -3
  156. package/dist/components/toast.min.css +1 -1
  157. package/dist/components/toast.min.js +3 -3
  158. package/dist/components/transition.css +1 -1
  159. package/dist/components/transition.js +7 -3
  160. package/dist/components/transition.min.css +1 -1
  161. package/dist/components/transition.min.js +2 -2
  162. package/dist/components/visibility.js +4 -2
  163. package/dist/components/visibility.min.js +2 -2
  164. package/dist/semantic.css +6179 -3968
  165. package/dist/semantic.js +571 -188
  166. package/dist/semantic.min.css +3 -3
  167. package/dist/semantic.min.js +3 -3
  168. package/dist/themes/basic/assets/fonts/LICENSE.txt +91 -0
  169. package/dist/themes/default/assets/fonts/LICENSE_Lato.txt +94 -0
  170. package/dist/themes/default/assets/fonts/LICENSE_icons.txt +165 -0
  171. package/dist/themes/github/assets/fonts/LICENSE.txt +94 -0
  172. package/dist/themes/material/assets/fonts/LICENSE.txt +202 -0
  173. package/package.json +14 -14
  174. package/semantic.json.example +1 -1
  175. package/src/definitions/behaviors/api.js +6 -2
  176. package/src/definitions/behaviors/form.js +65 -22
  177. package/src/definitions/behaviors/state.js +3 -1
  178. package/src/definitions/behaviors/visibility.js +3 -1
  179. package/src/definitions/collections/form.less +43 -23
  180. package/src/definitions/collections/grid.less +85 -70
  181. package/src/definitions/collections/menu.less +38 -27
  182. package/src/definitions/collections/message.less +1 -0
  183. package/src/definitions/collections/table.less +183 -157
  184. package/src/definitions/elements/button.less +61 -25
  185. package/src/definitions/elements/container.less +6 -4
  186. package/src/definitions/elements/divider.less +4 -1
  187. package/src/definitions/elements/emoji.less +3 -1
  188. package/src/definitions/elements/header.less +7 -4
  189. package/src/definitions/elements/icon.less +35 -28
  190. package/src/definitions/elements/input.less +21 -13
  191. package/src/definitions/elements/label.less +19 -8
  192. package/src/definitions/elements/list.less +28 -21
  193. package/src/definitions/elements/loader.less +17 -12
  194. package/src/definitions/elements/segment.less +12 -7
  195. package/src/definitions/elements/step.less +405 -87
  196. package/src/definitions/globals/site.js +3 -1
  197. package/src/definitions/globals/site.less +17 -12
  198. package/src/definitions/modules/accordion.js +3 -1
  199. package/src/definitions/modules/accordion.less +15 -13
  200. package/src/definitions/modules/calendar.js +46 -11
  201. package/src/definitions/modules/calendar.less +6 -4
  202. package/src/definitions/modules/checkbox.js +9 -3
  203. package/src/definitions/modules/checkbox.less +12 -6
  204. package/src/definitions/modules/dimmer.js +3 -1
  205. package/src/definitions/modules/dimmer.less +16 -10
  206. package/src/definitions/modules/dropdown.js +108 -33
  207. package/src/definitions/modules/dropdown.less +109 -78
  208. package/src/definitions/modules/embed.js +16 -6
  209. package/src/definitions/modules/flyout.js +3 -1
  210. package/src/definitions/modules/flyout.less +51 -45
  211. package/src/definitions/modules/modal.js +6 -2
  212. package/src/definitions/modules/modal.less +109 -82
  213. package/src/definitions/modules/nag.js +10 -4
  214. package/src/definitions/modules/nag.less +8 -4
  215. package/src/definitions/modules/popup.js +9 -3
  216. package/src/definitions/modules/popup.less +3 -1
  217. package/src/definitions/modules/progress.js +3 -1
  218. package/src/definitions/modules/progress.less +24 -6
  219. package/src/definitions/modules/rating.js +3 -1
  220. package/src/definitions/modules/search.js +77 -13
  221. package/src/definitions/modules/search.less +41 -25
  222. package/src/definitions/modules/shape.js +6 -4
  223. package/src/definitions/modules/sidebar.js +3 -1
  224. package/src/definitions/modules/slider.js +141 -43
  225. package/src/definitions/modules/slider.less +129 -27
  226. package/src/definitions/modules/sticky.js +3 -1
  227. package/src/definitions/modules/tab.js +3 -1
  228. package/src/definitions/modules/toast.js +6 -2
  229. package/src/definitions/modules/toast.less +35 -24
  230. package/src/definitions/modules/transition.js +6 -2
  231. package/src/definitions/views/card.less +7 -5
  232. package/src/definitions/views/feed.less +14 -1
  233. package/src/definitions/views/item.less +7 -5
  234. package/src/themes/basic/assets/fonts/LICENSE.txt +91 -0
  235. package/src/themes/default/assets/fonts/LICENSE_Lato.txt +94 -0
  236. package/src/themes/default/assets/fonts/LICENSE_icons.txt +165 -0
  237. package/src/themes/default/elements/button.variables +3 -0
  238. package/src/themes/default/elements/emoji.variables +172 -23
  239. package/src/themes/default/elements/flag.variables +3 -3
  240. package/src/themes/default/elements/step.variables +33 -0
  241. package/src/themes/default/globals/site.variables +3 -0
  242. package/src/themes/default/globals/variation.variables +23 -2
  243. package/src/themes/default/modules/dropdown.variables +3 -0
  244. package/src/themes/default/modules/progress.variables +1 -1
  245. package/src/themes/default/modules/search.variables +15 -12
  246. package/src/themes/default/modules/slider.variables +10 -0
  247. package/src/themes/default/views/feed.variables +3 -0
  248. package/src/themes/github/assets/fonts/LICENSE.txt +94 -0
  249. package/src/themes/joypixels/elements/emoji.variables +183 -22
  250. package/src/themes/material/assets/fonts/LICENSE.txt +202 -0
  251. package/tasks/admin/components/create.js +4 -4
  252. package/tasks/admin/components/init.js +2 -2
  253. package/tasks/admin/components/update.js +3 -3
  254. package/tasks/admin/distributions/create.js +3 -3
  255. package/tasks/admin/distributions/init.js +2 -2
  256. package/tasks/admin/distributions/update.js +4 -4
  257. package/tasks/build/assets.js +1 -1
  258. package/tasks/build/css.js +19 -10
  259. package/tasks/build/javascript.js +12 -5
  260. package/tasks/check-install.js +1 -1
  261. package/tasks/config/defaults.js +4 -0
  262. package/tasks/config/project/release.js +19 -1
  263. package/tasks/config/tasks.js +7 -7
  264. package/tasks/docs/build.js +3 -3
  265. package/tasks/docs/metadata.js +1 -1
  266. package/tasks/docs/serve.js +3 -1
  267. package/tasks/install.js +2 -2
  268. package/tasks/watch.js +1 -1
  269. package/types/fomantic-ui-accordion.d.ts +1 -1
  270. package/types/fomantic-ui-api.d.ts +9 -3
  271. package/types/fomantic-ui-calendar.d.ts +114 -13
  272. package/types/fomantic-ui-checkbox.d.ts +14 -4
  273. package/types/fomantic-ui-dimmer.d.ts +1 -1
  274. package/types/fomantic-ui-dropdown.d.ts +82 -44
  275. package/types/fomantic-ui-embed.d.ts +19 -2
  276. package/types/fomantic-ui-flyout.d.ts +25 -11
  277. package/types/fomantic-ui-form.d.ts +123 -15
  278. package/types/fomantic-ui-modal.d.ts +101 -5
  279. package/types/fomantic-ui-nag.d.ts +4 -4
  280. package/types/fomantic-ui-popup.d.ts +38 -12
  281. package/types/fomantic-ui-progress.d.ts +12 -6
  282. package/types/fomantic-ui-rating.d.ts +1 -1
  283. package/types/fomantic-ui-search.d.ts +138 -22
  284. package/types/fomantic-ui-shape.d.ts +2 -2
  285. package/types/fomantic-ui-sidebar.d.ts +4 -4
  286. package/types/fomantic-ui-slider.d.ts +56 -4
  287. package/types/fomantic-ui-sticky.d.ts +1 -1
  288. package/types/fomantic-ui-tab.d.ts +6 -6
  289. package/types/fomantic-ui-toast.d.ts +14 -2
  290. package/types/fomantic-ui-transition.d.ts +41 -7
  291. package/types/fomantic-ui-visibility.d.ts +3 -3
  292. package/types/index.d.ts +25 -25
  293. package/types/tests.ts +188 -0
  294. package/types/tsconfig.json +1 -1
  295. package/types/fomantic-ui-tests.ts +0 -25
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fomantic-ui",
3
- "version": "2.9.4-beta.10+3564140",
3
+ "version": "2.9.4-beta.100+7f5f82a",
4
4
  "description": "Fomantic empowers designers and developers by creating a shared vocabulary for UI.",
5
5
  "keywords": [
6
6
  "fomantic-ui",
@@ -27,34 +27,33 @@
27
27
  "scripts": {
28
28
  "build": "gulp build",
29
29
  "changelog": "auto-changelog -p",
30
- "lint": "eslint --ext .js . && stylelint \"**/*.{css,less,overrides,variables}\"",
31
- "lint-fix": "eslint --ext .js . --fix && stylelint \"**/*.{css,less,overrides,variables}\" --fix"
30
+ "lint": "eslint --ext .js,.ts . && stylelint \"**/*.{css,less,overrides,variables}\"",
31
+ "lint-fix": "eslint --ext .js,.ts . --fix && stylelint \"**/*.{css,less,overrides,variables}\" --fix"
32
32
  },
33
33
  "dependencies": {
34
34
  "@actions/core": "^1.6.0",
35
35
  "@octokit/core": "^3.6.0",
36
36
  "@octokit/rest": "^18.12.0",
37
- "better-console": "^1.0.1",
37
+ "@fomantic/better-console": "^1.0.2",
38
38
  "browserslist": "^4.21.4",
39
39
  "del": "^6.1.1",
40
40
  "extend": "^3.0.2",
41
- "gulp": "^4.0.0",
41
+ "gulp": "^5.0.0",
42
42
  "gulp-autoprefixer": "^8.0.0",
43
- "gulp-chmod": "^2.0.0",
43
+ "gulp-chmod": "^3.0.0",
44
44
  "gulp-clean-css": "^4.3.0",
45
45
  "gulp-clone": "^2.0.1",
46
46
  "gulp-concat": "^2.6.1",
47
- "gulp-concat-css": "^3.1.0",
48
- "gulp-concat-filenames": "^1.2.0",
49
- "gulp-copy": "^4.0.0",
50
- "gulp-dedupe": "^0.0.2",
47
+ "@fomantic/gulp-concat-css": "^3.2.1",
48
+ "@fomantic/gulp-concat-filenames": "^1.2.1",
49
+ "@fomantic/gulp-dedupe": "^0.0.3",
51
50
  "gulp-flatten": "^0.4.0",
52
- "gulp-git": "^2.9.0",
53
- "gulp-header": "^2.0.5",
54
- "gulp-if": "^2.0.2",
51
+ "@fomantic/gulp-git": "^2.11.1",
52
+ "@fomantic/gulp-header": "^2.1.1",
53
+ "gulp-if": "^3.0.0",
55
54
  "gulp-json-editor": "^2.4.3",
56
55
  "gulp-less": "^5.0.0",
57
- "gulp-plumber": "^1.1.0",
56
+ "@fomantic/gulp-plumber": "^1.2.2",
58
57
  "gulp-print": "^5.0.0",
59
58
  "gulp-rename": "^1.4.0",
60
59
  "gulp-replace": "^1.0.0",
@@ -68,6 +67,7 @@
68
67
  "merge-stream": "^2.0.0",
69
68
  "mkdirp": "^1.0.4",
70
69
  "normalize-path": "^3.0.0",
70
+ "ordered-read-streams": "^1.0.1",
71
71
  "replace-ext": "^1.0.0",
72
72
  "require-dot-file": "^0.4.0",
73
73
  "wrench-sui": "^0.0.3",
@@ -16,7 +16,7 @@
16
16
  },
17
17
  "clean" : "dist/"
18
18
  },
19
-
19
+ "fileName" : "semantic",
20
20
  "permission" : false,
21
21
  "autoInstall": false,
22
22
  "rtl": false
@@ -647,7 +647,9 @@
647
647
  module.debug('Adding error state');
648
648
  module.set.error();
649
649
  if (module.should.removeError()) {
650
- setTimeout(function () { module.remove.error(); }, settings.errorDuration);
650
+ setTimeout(function () {
651
+ module.remove.error();
652
+ }, settings.errorDuration);
651
653
  }
652
654
  }
653
655
  module.debug('API Request failed', errorMessage, xhr);
@@ -971,7 +973,9 @@
971
973
  });
972
974
  }
973
975
  clearTimeout(module.performance.timer);
974
- module.performance.timer = setTimeout(function () { module.performance.display(); }, 500);
976
+ module.performance.timer = setTimeout(function () {
977
+ module.performance.display();
978
+ }, 500);
975
979
  },
976
980
  display: function () {
977
981
  var
@@ -38,6 +38,7 @@
38
38
  element = this,
39
39
 
40
40
  formErrors = [],
41
+ formErrorsTracker = {},
41
42
  keyHeldDown = false,
42
43
 
43
44
  // set at run-time
@@ -538,6 +539,13 @@
538
539
  fullFields[name].rules.push({ type: rule });
539
540
  });
540
541
  }
542
+
543
+ $.each(fullFields[name].rules, function (index, rule) {
544
+ var ruleName = module.get.ruleName(rule);
545
+ if (ruleName === 'empty') {
546
+ module.warn('*** DEPRECATED *** : Rule "empty" for field "' + name + '" will be removed in a future version. -> Use "notEmpty" rule instead.');
547
+ }
548
+ });
541
549
  });
542
550
 
543
551
  return fullFields;
@@ -551,9 +559,10 @@
551
559
  ancillary = module.get.ancillaryValue(rule),
552
560
  $field = module.get.field(field.identifier),
553
561
  value = $field.val(),
554
- prompt = isFunction(rule.prompt)
555
- ? rule.prompt(value)
556
- : rule.prompt || settings.prompt[ruleName] || settings.text.unspecifiedRule,
562
+ promptCheck = rule.prompt || settings.prompt[ruleName] || settings.text.unspecifiedRule,
563
+ prompt = String(isFunction(promptCheck)
564
+ ? promptCheck.call($field[0], value)
565
+ : promptCheck),
557
566
  requiresValue = prompt.search('{value}') !== -1,
558
567
  requiresName = prompt.search('{name}') !== -1,
559
568
  parts,
@@ -591,10 +600,10 @@
591
600
  },
592
601
  settings: function () {
593
602
  if ($.isPlainObject(parameters)) {
594
- if (parameters.fields) {
595
- parameters.fields = module.get.fieldsFromShorthand(parameters.fields);
596
- }
597
603
  settings = $.extend(true, {}, $.fn.form.settings, parameters);
604
+ if (settings.fields) {
605
+ settings.fields = module.get.fieldsFromShorthand(settings.fields);
606
+ }
598
607
  validation = $.extend(true, {}, $.fn.form.settings.defaults, settings.fields);
599
608
  module.verbose('Extending settings', validation, settings);
600
609
  } else {
@@ -711,7 +720,7 @@
711
720
  var
712
721
  $field = $(field),
713
722
  $calendar = $field.closest(selector.uiCalendar),
714
- name = $field.prop('name'),
723
+ name = $field.prop('name') || $field.prop('id'),
715
724
  value = $field.val(),
716
725
  isCheckbox = $field.is(selector.checkbox),
717
726
  isRadio = $field.is(selector.radio),
@@ -940,7 +949,7 @@
940
949
  $prompt.css('display', 'none');
941
950
  }
942
951
  $prompt
943
- .appendTo($fieldGroup)
952
+ .appendTo($fieldGroup.filter('.' + className.error))
944
953
  ;
945
954
  }
946
955
  $prompt
@@ -1237,20 +1246,20 @@
1237
1246
  isRequired = $el.prop('required') || $elGroup.hasClass(className.required) || $elGroup.parent().hasClass(className.required),
1238
1247
  isDisabled = $el.is(':disabled') || $elGroup.hasClass(className.disabled) || $elGroup.parent().hasClass(className.disabled),
1239
1248
  validation = module.get.validation($el),
1240
- hasEmptyRule = validation
1249
+ hasNotEmptyRule = validation
1241
1250
  ? $.grep(validation.rules, function (rule) {
1242
- return rule.type === 'empty';
1243
- }) !== 0
1251
+ return ['notEmpty', 'checked', 'empty'].indexOf(rule.type) >= 0;
1252
+ }).length > 0
1244
1253
  : false,
1245
1254
  identifier = module.get.identifier(validation, $el)
1246
1255
  ;
1247
- if (isRequired && !isDisabled && !hasEmptyRule && identifier !== undefined) {
1256
+ if (isRequired && !isDisabled && !hasNotEmptyRule && identifier !== undefined) {
1248
1257
  if (isCheckbox) {
1249
1258
  module.verbose("Adding 'checked' rule on field", identifier);
1250
1259
  module.add.rule(identifier, 'checked');
1251
1260
  } else {
1252
- module.verbose("Adding 'empty' rule on field", identifier);
1253
- module.add.rule(identifier, 'empty');
1261
+ module.verbose("Adding 'notEmpty' rule on field", identifier);
1262
+ module.add.rule(identifier, 'notEmpty');
1254
1263
  }
1255
1264
  }
1256
1265
  });
@@ -1277,6 +1286,7 @@
1277
1286
  $module.removeClass(className.initial);
1278
1287
  // reset errors
1279
1288
  formErrors = [];
1289
+ formErrorsTracker = {};
1280
1290
  if (module.determine.isValid()) {
1281
1291
  module.debug('Form has no validation errors, submitting');
1282
1292
  module.set.success();
@@ -1342,28 +1352,30 @@
1342
1352
  var
1343
1353
  identifier = field.identifier || fieldName,
1344
1354
  $field = module.get.field(identifier),
1355
+ $fieldGroup = $field.closest($group),
1345
1356
  $dependsField = field.depends
1346
1357
  ? module.get.field(field.depends)
1347
1358
  : false,
1348
1359
  fieldValid = true,
1349
1360
  fieldErrors = [],
1350
- isDisabled = $field.filter(':not(:disabled)').length === 0,
1361
+ isDisabled = $field.filter(':not(:disabled)').length === 0 || $fieldGroup.hasClass(className.disabled) || $fieldGroup.parent().hasClass(className.disabled),
1351
1362
  validationMessage = $field[0].validationMessage,
1363
+ noNativeValidation = field.noNativeValidation || settings.noNativeValidation || $field.filter('[formnovalidate],[novalidate]').length > 0 || $module.filter('[novalidate]').length > 0,
1352
1364
  errorLimit
1353
1365
  ;
1354
1366
  if (!field.identifier) {
1355
1367
  module.debug('Using field name as identifier', identifier);
1356
1368
  field.identifier = identifier;
1357
1369
  }
1358
- if (validationMessage) {
1370
+ if (validationMessage && !noNativeValidation && !isDisabled) {
1359
1371
  module.debug('Field is natively invalid', identifier);
1360
1372
  fieldErrors.push(validationMessage);
1361
1373
  fieldValid = false;
1362
1374
  if (showErrors) {
1363
- $field.closest($group).addClass(className.error);
1375
+ $fieldGroup.addClass(className.error);
1364
1376
  }
1365
1377
  } else if (showErrors) {
1366
- $field.closest($group).removeClass(className.error);
1378
+ $fieldGroup.removeClass(className.error);
1367
1379
  }
1368
1380
  if (isDisabled) {
1369
1381
  module.debug('Field is disabled. Skipping', identifier);
@@ -1378,7 +1390,22 @@
1378
1390
  var invalidFields = module.validate.rule(field, rule, true) || [];
1379
1391
  if (invalidFields.length > 0) {
1380
1392
  module.debug('Field is invalid', identifier, rule.type);
1381
- fieldErrors.push(module.get.prompt(rule, field));
1393
+ var fieldError = module.get.prompt(rule, field);
1394
+ if (!settings.inline) {
1395
+ if (
1396
+ // Always allow the first error prompt for new field identifiers
1397
+ (!(identifier in formErrorsTracker)
1398
+ // Also allow multiple error prompts per field identifier but make sure each prompt is unique
1399
+ || formErrorsTracker[identifier].indexOf(fieldError) === -1)
1400
+ // Limit the number of unique error prompts for every field identifier if specified
1401
+ && (!errorLimit || (formErrorsTracker[identifier] || []).length < errorLimit)
1402
+ ) {
1403
+ fieldErrors.push(fieldError);
1404
+ (formErrorsTracker[identifier] = formErrorsTracker[identifier] || []).push(fieldError);
1405
+ }
1406
+ } else {
1407
+ fieldErrors.push(fieldError);
1408
+ }
1382
1409
  fieldValid = false;
1383
1410
  if (showErrors) {
1384
1411
  $(invalidFields).closest($group).addClass(className.error);
@@ -1393,7 +1420,7 @@
1393
1420
  settings.onValid.call($field);
1394
1421
  }
1395
1422
  } else {
1396
- if (showErrors) {
1423
+ if (showErrors && fieldErrors.length > 0) {
1397
1424
  formErrors = formErrors.concat(fieldErrors);
1398
1425
  module.add.prompt(identifier, fieldErrors, true);
1399
1426
  settings.onInvalid.call($field, fieldErrors);
@@ -1491,6 +1518,12 @@
1491
1518
  module.error.apply(console, arguments);
1492
1519
  }
1493
1520
  },
1521
+ warn: function () {
1522
+ if (!settings.silent) {
1523
+ module.warn = Function.prototype.bind.call(console.warn, console, settings.name + ':');
1524
+ module.warn.apply(console, arguments);
1525
+ }
1526
+ },
1494
1527
  performance: {
1495
1528
  log: function (message) {
1496
1529
  var
@@ -1511,7 +1544,9 @@
1511
1544
  });
1512
1545
  }
1513
1546
  clearTimeout(module.performance.timer);
1514
- module.performance.timer = setTimeout(function () { module.performance.display(); }, 500);
1547
+ module.performance.timer = setTimeout(function () {
1548
+ module.performance.display();
1549
+ }, 500);
1515
1550
  },
1516
1551
  display: function () {
1517
1552
  var
@@ -1605,6 +1640,7 @@
1605
1640
  name: 'Form',
1606
1641
  namespace: 'form',
1607
1642
 
1643
+ silent: false,
1608
1644
  debug: false,
1609
1645
  verbose: false,
1610
1646
  performance: true,
@@ -1627,6 +1663,7 @@
1627
1663
  errorFocus: true,
1628
1664
  dateHandling: 'date', // 'date', 'input', 'formatter'
1629
1665
  errorLimit: 0,
1666
+ noNativeValidation: false,
1630
1667
 
1631
1668
  onValid: function () {},
1632
1669
  onInvalid: function () {},
@@ -1669,6 +1706,7 @@
1669
1706
  maxValue: '{name} must have a maximum value of {ruleValue}',
1670
1707
  minValue: '{name} must have a minimum value of {ruleValue}',
1671
1708
  empty: '{name} must have a value',
1709
+ notEmpty: '{name} must have a value',
1672
1710
  checked: '{name} must be checked',
1673
1711
  email: '{name} must be a valid e-mail',
1674
1712
  url: '{name} must be a valid url',
@@ -1801,10 +1839,15 @@
1801
1839
  rules: {
1802
1840
 
1803
1841
  // is not empty or blank string
1804
- empty: function (value) {
1842
+ notEmpty: function (value) {
1805
1843
  return !(value === undefined || value === '' || (Array.isArray(value) && value.length === 0));
1806
1844
  },
1807
1845
 
1846
+ /* Deprecated */
1847
+ empty: function (value) {
1848
+ return $.fn.form.settings.rules.notEmpty(value);
1849
+ },
1850
+
1808
1851
  // checkbox checked
1809
1852
  checked: function () {
1810
1853
  return $(this).filter(':checked').length > 0;
@@ -482,7 +482,9 @@
482
482
  });
483
483
  }
484
484
  clearTimeout(module.performance.timer);
485
- module.performance.timer = setTimeout(function () { module.performance.display(); }, 500);
485
+ module.performance.timer = setTimeout(function () {
486
+ module.performance.display();
487
+ }, 500);
486
488
  },
487
489
  display: function () {
488
490
  var
@@ -1088,7 +1088,9 @@
1088
1088
  });
1089
1089
  }
1090
1090
  clearTimeout(module.performance.timer);
1091
- module.performance.timer = setTimeout(function () { module.performance.display(); }, 500);
1091
+ module.performance.timer = setTimeout(function () {
1092
+ module.performance.display();
1093
+ }, 500);
1092
1094
  },
1093
1095
  display: function () {
1094
1096
  var
@@ -17,6 +17,19 @@
17
17
 
18
18
  @import (multiple) "../../theme.config";
19
19
 
20
+ @notInline: if(@variationFormInline, e(":not(.inline)"));
21
+ @notInverted: if(@variationFormInverted, e(":not(.inverted)"));
22
+ @notWide: if(@variationFormWide, e(":not(.wide)"));
23
+ @notGrouped: if(@variationFormGrouped, e(":not(.grouped)"));
24
+ @notRequired: if(@variationFormRequired, e(":not(.required)"));
25
+ @notUnstackable: if(@variationFormUnstackable, e(":not(.unstackable)"));
26
+
27
+ @notToggle: if(@variationCheckboxToggle, e(":not(.toggle)"));
28
+ @notSlider: if(@variationCheckboxSlider, e(":not(.slider)"));
29
+ @notCompact: if(@variationDropdownCompact, e(":not(.compact)"));
30
+ @notIcon: if(@variationInputIcon, e(":not(.icon)"));
31
+ @notCorner: if(@variationLabelCorner, e(":not(.corner)"));
32
+
20
33
  /*******************************
21
34
  Elements
22
35
  *******************************/
@@ -69,7 +82,7 @@
69
82
  font-weight: @labelFontWeight;
70
83
  text-transform: @labelTextTransform;
71
84
  }
72
- .ui.form:not(.inverted) .field > label:not(.button) {
85
+ .ui.form@{notInverted} .field > label:not(.button) {
73
86
  color: @labelColor;
74
87
  }
75
88
 
@@ -183,16 +196,16 @@
183
196
  Checkbox margin
184
197
  --------------------- */
185
198
 
186
- .ui.form .fields:not(.grouped):not(.inline) .field:not(:only-child) label + .ui.ui.checkbox {
199
+ .ui.form .fields@{notGrouped}@{notInline} .field:not(:only-child) label + .ui.ui.checkbox {
187
200
  margin-top: @checkboxLabelFieldTopMargin;
188
201
  }
189
- .ui.form .fields:not(.grouped):not(.inline) .field:not(:only-child) .ui.checkbox {
202
+ .ui.form .fields@{notGrouped}@{notInline} .field:not(:only-child) .ui.checkbox {
190
203
  margin-top: @inputLineHeight + @checkboxFieldTopMargin;
191
204
  }
192
- .ui.form .fields:not(.grouped):not(.inline) .field:not(:only-child) .ui.toggle.checkbox {
205
+ .ui.form .fields@{notGrouped}@{notInline} .field:not(:only-child) .ui.toggle.checkbox {
193
206
  margin-top: @inputLineHeight + @checkboxToggleFieldTopMargin;
194
207
  }
195
- .ui.form .fields:not(.grouped):not(.inline) .field:not(:only-child) .ui.slider.checkbox {
208
+ .ui.form .fields@{notGrouped}@{notInline} .field:not(:only-child) .ui.slider.checkbox {
196
209
  margin-top: @inputLineHeight + @checkboxSliderFieldTopMargin;
197
210
  }
198
211
  .ui.ui.form .field .fields .field:not(:only-child) .ui.checkbox {
@@ -210,7 +223,7 @@
210
223
  Transparent
211
224
  --------------------- */
212
225
 
213
- .ui.form .field .transparent.input:not(.icon) input,
226
+ .ui.form .field .transparent.input@{notIcon} input,
214
227
  .ui.form .field input.transparent,
215
228
  .ui.form .field textarea.transparent {
216
229
  padding: @transparentPadding;
@@ -254,7 +267,7 @@
254
267
  --------------------- */
255
268
 
256
269
  /* Block */
257
- .ui.form .field > .selection.dropdown:not(.compact) {
270
+ .ui.form .field > .selection.dropdown@{notCompact} {
258
271
  min-width: auto;
259
272
  width: 100%;
260
273
  }
@@ -287,8 +300,8 @@
287
300
 
288
301
  & when (@variationFormInline) {
289
302
  /* Inline */
290
- .ui.form .inline.fields .field:not(.wide) .ui.input,
291
- .ui.form .inline.field:not(.wide) .ui.input {
303
+ .ui.form .inline.fields .field@{notWide} .ui.input,
304
+ .ui.form .inline.field@{notWide} .ui.input {
292
305
  width: auto;
293
306
  vertical-align: middle;
294
307
  }
@@ -528,9 +541,9 @@
528
541
  }
529
542
 
530
543
  .ui.ui.form .fields.@{state} .field label,
531
- .ui.ui.form .fields.@{state} .field .ui.label:not(.corner),
544
+ .ui.ui.form .fields.@{state} .field .ui.label@{notCorner},
532
545
  .ui.ui.form .field.@{state} label,
533
- .ui.ui.form .field.@{state} .ui.label:not(.corner),
546
+ .ui.ui.form .field.@{state} .ui.label@{notCorner},
534
547
  .ui.ui.form .fields.@{state} .field .input,
535
548
  .ui.ui.form .field.@{state} .input {
536
549
  color: @c;
@@ -653,6 +666,7 @@
653
666
  }
654
667
 
655
668
  /* Placeholder */
669
+ .ui.form .@{state} .ui.dropdown > .default.text,
656
670
  .ui.form .@{state} ::placeholder {
657
671
  color: @formStates[@@state][inputPlaceholderColor];
658
672
  }
@@ -660,6 +674,7 @@
660
674
  color: @formStates[@@state][inputPlaceholderColor] !important;
661
675
  }
662
676
 
677
+ .ui.form .@{state} .ui.dropdown > input:focus ~ .default.text,
663
678
  .ui.form .@{state} :focus::placeholder {
664
679
  color: @formStates[@@state][inputPlaceholderFocusColor];
665
680
  }
@@ -718,12 +733,12 @@
718
733
  /*--------------------
719
734
  Checkbox State
720
735
  ---------------------*/
721
- .ui.form .fields.@{state} .field .checkbox:not(.toggle):not(.slider) label,
722
- .ui.form .field.@{state} .checkbox:not(.toggle):not(.slider) label {
736
+ .ui.form .fields.@{state} .field .checkbox@{notToggle}@{notSlider} label,
737
+ .ui.form .field.@{state} .checkbox@{notToggle}@{notSlider} label {
723
738
  color: @c;
724
739
  }
725
- .ui.form .fields.@{state} .field .checkbox:not(.toggle):not(.slider) label::before,
726
- .ui.form .field.@{state} .checkbox:not(.toggle):not(.slider) label::before {
740
+ .ui.form .fields.@{state} .field .checkbox@{notToggle}@{notSlider} label::before,
741
+ .ui.form .field.@{state} .checkbox@{notToggle}@{notSlider} label::before {
727
742
  background: @bg;
728
743
  border-color: @bdc;
729
744
  }
@@ -818,11 +833,11 @@
818
833
  Required Field
819
834
  --------------------- */
820
835
 
821
- .ui.form .required.fields:not(.grouped):not(.inline) > .field > label::after,
836
+ .ui.form .required.fields@{notGrouped}@{notInline} > .field > label::after,
822
837
  .ui.form .required.fields.inline > label::after,
823
838
  .ui.form .required.fields.grouped > label::after,
824
839
  .ui.form .required.field > label::after,
825
- .ui.form .required.fields:not(.grouped):not(.inline) > .field > .checkbox::after,
840
+ .ui.form .required.fields@{notGrouped}@{notInline} > .field > .checkbox::after,
826
841
  .ui.form .required.field > .checkbox::after,
827
842
  .ui.form label.required::after {
828
843
  margin: @requiredMargin;
@@ -830,7 +845,7 @@
830
845
  color: @requiredColor;
831
846
  }
832
847
 
833
- .ui.form .required.fields:not(.grouped):not(.inline) > .field > label::after,
848
+ .ui.form .required.fields@{notGrouped}@{notInline} > .field > label::after,
834
849
  .ui.form .required.fields.inline > label::after,
835
850
  .ui.form .required.fields.grouped > label::after,
836
851
  .ui.form .required.field > label::after,
@@ -839,7 +854,7 @@
839
854
  vertical-align: top;
840
855
  }
841
856
 
842
- .ui.form .required.fields:not(.grouped):not(.inline) > .field > .checkbox::after,
857
+ .ui.form .required.fields@{notGrouped}@{notInline} > .field > .checkbox::after,
843
858
  .ui.form .required.field > .checkbox::after {
844
859
  position: absolute;
845
860
  top: 0;
@@ -847,12 +862,16 @@
847
862
  }
848
863
  }
849
864
 
850
- .ui.ui.ui.ui.form .fields > label:empty::after,
851
- .ui.ui.ui.ui.form .field > label:empty::after {
865
+ .ui.ui.ui.ui.form .fields@{notRequired} > label:empty::after,
866
+ .ui.ui.ui.ui.form .fields@{notGrouped}@{notInline} > .field@{notRequired} > label:empty::after {
852
867
  content: " ";
853
868
  display: inline-block;
854
869
  }
855
870
 
871
+ .ui.ui.ui.ui.form .inline.fields .field@{notRequired} > label:empty {
872
+ display: none;
873
+ }
874
+
856
875
  /*******************************
857
876
  Variations
858
877
  *******************************/
@@ -866,6 +885,7 @@
866
885
  .ui.form .inverted.segment label,
867
886
  .ui.form .inverted.segment .ui.checkbox label,
868
887
  .ui.inverted.form .ui.checkbox label,
888
+ .ui.inverted.form .grouped.fields > label,
869
889
  .ui.inverted.form .inline.fields > label,
870
890
  .ui.inverted.form .inline.fields .field > label,
871
891
  .ui.inverted.form .inline.fields .field > p,
@@ -1005,8 +1025,8 @@
1005
1025
  margin-bottom: 0;
1006
1026
  }
1007
1027
 
1008
- .ui.form:not(.unstackable) .fields:not(.unstackable) > .fields,
1009
- .ui.form:not(.unstackable) .fields:not(.unstackable) > .field {
1028
+ .ui.form@{notUnstackable} .fields@{notUnstackable} > .fields,
1029
+ .ui.form@{notUnstackable} .fields@{notUnstackable} > .field {
1010
1030
  width: @oneColumn;
1011
1031
  margin: 0 0 @rowDistance;
1012
1032
  }