fomantic-ui 2.9.4-beta.1 → 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 (296) 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 -40
  43. package/dist/components/dropdown.js +110 -35
  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 +28 -7
  61. package/dist/components/form.js +74 -29
  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 +4 -1
  67. package/dist/components/header.min.css +2 -2
  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 +30 -10
  73. package/dist/components/input.min.css +2 -2
  74. package/dist/components/item.css +1 -1
  75. package/dist/components/item.min.css +1 -1
  76. package/dist/components/label.css +7 -2
  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 -2
  83. package/dist/components/menu.min.css +2 -2
  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 -2
  97. package/dist/components/popup.js +10 -4
  98. package/dist/components/popup.min.css +2 -2
  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 +6226 -3986
  165. package/dist/semantic.js +580 -195
  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 +73 -28
  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 +56 -27
  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 +12 -4
  189. package/src/definitions/elements/icon.less +35 -28
  190. package/src/definitions/elements/input.less +35 -19
  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 +109 -34
  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/collections/form.variables +1 -0
  238. package/src/themes/default/elements/button.variables +3 -0
  239. package/src/themes/default/elements/emoji.variables +172 -23
  240. package/src/themes/default/elements/flag.variables +3 -3
  241. package/src/themes/default/elements/step.variables +33 -0
  242. package/src/themes/default/globals/site.variables +3 -0
  243. package/src/themes/default/globals/variation.variables +24 -2
  244. package/src/themes/default/modules/dropdown.variables +3 -0
  245. package/src/themes/default/modules/progress.variables +1 -1
  246. package/src/themes/default/modules/search.variables +15 -12
  247. package/src/themes/default/modules/slider.variables +10 -0
  248. package/src/themes/default/views/feed.variables +3 -0
  249. package/src/themes/github/assets/fonts/LICENSE.txt +94 -0
  250. package/src/themes/joypixels/elements/emoji.variables +183 -22
  251. package/src/themes/material/assets/fonts/LICENSE.txt +202 -0
  252. package/tasks/admin/components/create.js +4 -4
  253. package/tasks/admin/components/init.js +2 -2
  254. package/tasks/admin/components/update.js +3 -3
  255. package/tasks/admin/distributions/create.js +3 -3
  256. package/tasks/admin/distributions/init.js +2 -2
  257. package/tasks/admin/distributions/update.js +4 -4
  258. package/tasks/build/assets.js +1 -1
  259. package/tasks/build/css.js +19 -10
  260. package/tasks/build/javascript.js +12 -5
  261. package/tasks/check-install.js +1 -1
  262. package/tasks/config/defaults.js +4 -0
  263. package/tasks/config/project/release.js +19 -1
  264. package/tasks/config/tasks.js +7 -7
  265. package/tasks/docs/build.js +3 -3
  266. package/tasks/docs/metadata.js +1 -1
  267. package/tasks/docs/serve.js +3 -1
  268. package/tasks/install.js +2 -2
  269. package/tasks/watch.js +1 -1
  270. package/types/fomantic-ui-accordion.d.ts +1 -1
  271. package/types/fomantic-ui-api.d.ts +9 -3
  272. package/types/fomantic-ui-calendar.d.ts +114 -13
  273. package/types/fomantic-ui-checkbox.d.ts +14 -4
  274. package/types/fomantic-ui-dimmer.d.ts +1 -1
  275. package/types/fomantic-ui-dropdown.d.ts +82 -44
  276. package/types/fomantic-ui-embed.d.ts +19 -2
  277. package/types/fomantic-ui-flyout.d.ts +25 -11
  278. package/types/fomantic-ui-form.d.ts +128 -20
  279. package/types/fomantic-ui-modal.d.ts +101 -5
  280. package/types/fomantic-ui-nag.d.ts +4 -4
  281. package/types/fomantic-ui-popup.d.ts +38 -12
  282. package/types/fomantic-ui-progress.d.ts +12 -6
  283. package/types/fomantic-ui-rating.d.ts +1 -1
  284. package/types/fomantic-ui-search.d.ts +138 -22
  285. package/types/fomantic-ui-shape.d.ts +2 -2
  286. package/types/fomantic-ui-sidebar.d.ts +4 -4
  287. package/types/fomantic-ui-slider.d.ts +56 -4
  288. package/types/fomantic-ui-sticky.d.ts +1 -1
  289. package/types/fomantic-ui-tab.d.ts +6 -6
  290. package/types/fomantic-ui-toast.d.ts +14 -2
  291. package/types/fomantic-ui-transition.d.ts +41 -7
  292. package/types/fomantic-ui-visibility.d.ts +3 -3
  293. package/types/index.d.ts +25 -25
  294. package/types/tests.ts +188 -0
  295. package/types/tsconfig.json +1 -1
  296. 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.1+44f7a51",
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 {
@@ -619,7 +628,7 @@
619
628
  // refresh selector cache
620
629
  (instance || module).refresh();
621
630
  },
622
- field: function (identifier, strict) {
631
+ field: function (identifier, strict, ignoreMissing) {
623
632
  module.verbose('Finding field with identifier', identifier);
624
633
  identifier = module.escape.string(identifier);
625
634
  var t;
@@ -639,7 +648,9 @@
639
648
  if (t.length > 0) {
640
649
  return t;
641
650
  }
642
- module.error(error.noField.replace('{identifier}', identifier));
651
+ if (!ignoreMissing) {
652
+ module.error(error.noField.replace('{identifier}', identifier));
653
+ }
643
654
 
644
655
  return strict ? $() : $('<input/>');
645
656
  },
@@ -709,7 +720,7 @@
709
720
  var
710
721
  $field = $(field),
711
722
  $calendar = $field.closest(selector.uiCalendar),
712
- name = $field.prop('name'),
723
+ name = $field.prop('name') || $field.prop('id'),
713
724
  value = $field.val(),
714
725
  isCheckbox = $field.is(selector.checkbox),
715
726
  isRadio = $field.is(selector.radio),
@@ -817,10 +828,10 @@
817
828
 
818
829
  has: {
819
830
 
820
- field: function (identifier) {
831
+ field: function (identifier, ignoreMissing) {
821
832
  module.verbose('Checking for existence of a field with identifier', identifier);
822
833
 
823
- return module.get.field(identifier, true).length > 0;
834
+ return module.get.field(identifier, true, ignoreMissing).length > 0;
824
835
  },
825
836
 
826
837
  },
@@ -938,7 +949,7 @@
938
949
  $prompt.css('display', 'none');
939
950
  }
940
951
  $prompt
941
- .appendTo($fieldGroup)
952
+ .appendTo($fieldGroup.filter('.' + className.error))
942
953
  ;
943
954
  }
944
955
  $prompt
@@ -1020,7 +1031,7 @@
1020
1031
  }
1021
1032
  if (rule === undefined) {
1022
1033
  module.debug('Removed all rules');
1023
- if (module.has.field(field)) {
1034
+ if (module.has.field(field, true)) {
1024
1035
  validation[field].rules = [];
1025
1036
  } else {
1026
1037
  delete validation[field];
@@ -1221,7 +1232,7 @@
1221
1232
  module.debug('Enabling auto check on required fields');
1222
1233
  if (validation) {
1223
1234
  $.each(validation, function (fieldName) {
1224
- if (!module.has.field(fieldName)) {
1235
+ if (!module.has.field(fieldName, true)) {
1225
1236
  module.verbose('Field not found, removing from validation', fieldName);
1226
1237
  module.remove.field(fieldName);
1227
1238
  }
@@ -1235,20 +1246,20 @@
1235
1246
  isRequired = $el.prop('required') || $elGroup.hasClass(className.required) || $elGroup.parent().hasClass(className.required),
1236
1247
  isDisabled = $el.is(':disabled') || $elGroup.hasClass(className.disabled) || $elGroup.parent().hasClass(className.disabled),
1237
1248
  validation = module.get.validation($el),
1238
- hasEmptyRule = validation
1249
+ hasNotEmptyRule = validation
1239
1250
  ? $.grep(validation.rules, function (rule) {
1240
- return rule.type === 'empty';
1241
- }) !== 0
1251
+ return ['notEmpty', 'checked', 'empty'].indexOf(rule.type) >= 0;
1252
+ }).length > 0
1242
1253
  : false,
1243
1254
  identifier = module.get.identifier(validation, $el)
1244
1255
  ;
1245
- if (isRequired && !isDisabled && !hasEmptyRule && identifier !== undefined) {
1256
+ if (isRequired && !isDisabled && !hasNotEmptyRule && identifier !== undefined) {
1246
1257
  if (isCheckbox) {
1247
1258
  module.verbose("Adding 'checked' rule on field", identifier);
1248
1259
  module.add.rule(identifier, 'checked');
1249
1260
  } else {
1250
- module.verbose("Adding 'empty' rule on field", identifier);
1251
- module.add.rule(identifier, 'empty');
1261
+ module.verbose("Adding 'notEmpty' rule on field", identifier);
1262
+ module.add.rule(identifier, 'notEmpty');
1252
1263
  }
1253
1264
  }
1254
1265
  });
@@ -1275,6 +1286,7 @@
1275
1286
  $module.removeClass(className.initial);
1276
1287
  // reset errors
1277
1288
  formErrors = [];
1289
+ formErrorsTracker = {};
1278
1290
  if (module.determine.isValid()) {
1279
1291
  module.debug('Form has no validation errors, submitting');
1280
1292
  module.set.success();
@@ -1340,28 +1352,30 @@
1340
1352
  var
1341
1353
  identifier = field.identifier || fieldName,
1342
1354
  $field = module.get.field(identifier),
1355
+ $fieldGroup = $field.closest($group),
1343
1356
  $dependsField = field.depends
1344
1357
  ? module.get.field(field.depends)
1345
1358
  : false,
1346
1359
  fieldValid = true,
1347
1360
  fieldErrors = [],
1348
- isDisabled = $field.filter(':not(:disabled)').length === 0,
1361
+ isDisabled = $field.filter(':not(:disabled)').length === 0 || $fieldGroup.hasClass(className.disabled) || $fieldGroup.parent().hasClass(className.disabled),
1349
1362
  validationMessage = $field[0].validationMessage,
1363
+ noNativeValidation = field.noNativeValidation || settings.noNativeValidation || $field.filter('[formnovalidate],[novalidate]').length > 0 || $module.filter('[novalidate]').length > 0,
1350
1364
  errorLimit
1351
1365
  ;
1352
1366
  if (!field.identifier) {
1353
1367
  module.debug('Using field name as identifier', identifier);
1354
1368
  field.identifier = identifier;
1355
1369
  }
1356
- if (validationMessage) {
1370
+ if (validationMessage && !noNativeValidation && !isDisabled) {
1357
1371
  module.debug('Field is natively invalid', identifier);
1358
1372
  fieldErrors.push(validationMessage);
1359
1373
  fieldValid = false;
1360
1374
  if (showErrors) {
1361
- $field.closest($group).addClass(className.error);
1375
+ $fieldGroup.addClass(className.error);
1362
1376
  }
1363
1377
  } else if (showErrors) {
1364
- $field.closest($group).removeClass(className.error);
1378
+ $fieldGroup.removeClass(className.error);
1365
1379
  }
1366
1380
  if (isDisabled) {
1367
1381
  module.debug('Field is disabled. Skipping', identifier);
@@ -1376,7 +1390,22 @@
1376
1390
  var invalidFields = module.validate.rule(field, rule, true) || [];
1377
1391
  if (invalidFields.length > 0) {
1378
1392
  module.debug('Field is invalid', identifier, rule.type);
1379
- 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
+ }
1380
1409
  fieldValid = false;
1381
1410
  if (showErrors) {
1382
1411
  $(invalidFields).closest($group).addClass(className.error);
@@ -1391,7 +1420,7 @@
1391
1420
  settings.onValid.call($field);
1392
1421
  }
1393
1422
  } else {
1394
- if (showErrors) {
1423
+ if (showErrors && fieldErrors.length > 0) {
1395
1424
  formErrors = formErrors.concat(fieldErrors);
1396
1425
  module.add.prompt(identifier, fieldErrors, true);
1397
1426
  settings.onInvalid.call($field, fieldErrors);
@@ -1489,6 +1518,12 @@
1489
1518
  module.error.apply(console, arguments);
1490
1519
  }
1491
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
+ },
1492
1527
  performance: {
1493
1528
  log: function (message) {
1494
1529
  var
@@ -1509,7 +1544,9 @@
1509
1544
  });
1510
1545
  }
1511
1546
  clearTimeout(module.performance.timer);
1512
- module.performance.timer = setTimeout(function () { module.performance.display(); }, 500);
1547
+ module.performance.timer = setTimeout(function () {
1548
+ module.performance.display();
1549
+ }, 500);
1513
1550
  },
1514
1551
  display: function () {
1515
1552
  var
@@ -1603,6 +1640,7 @@
1603
1640
  name: 'Form',
1604
1641
  namespace: 'form',
1605
1642
 
1643
+ silent: false,
1606
1644
  debug: false,
1607
1645
  verbose: false,
1608
1646
  performance: true,
@@ -1625,6 +1663,7 @@
1625
1663
  errorFocus: true,
1626
1664
  dateHandling: 'date', // 'date', 'input', 'formatter'
1627
1665
  errorLimit: 0,
1666
+ noNativeValidation: false,
1628
1667
 
1629
1668
  onValid: function () {},
1630
1669
  onInvalid: function () {},
@@ -1667,6 +1706,7 @@
1667
1706
  maxValue: '{name} must have a maximum value of {ruleValue}',
1668
1707
  minValue: '{name} must have a minimum value of {ruleValue}',
1669
1708
  empty: '{name} must have a value',
1709
+ notEmpty: '{name} must have a value',
1670
1710
  checked: '{name} must be checked',
1671
1711
  email: '{name} must be a valid e-mail',
1672
1712
  url: '{name} must be a valid url',
@@ -1799,10 +1839,15 @@
1799
1839
  rules: {
1800
1840
 
1801
1841
  // is not empty or blank string
1802
- empty: function (value) {
1842
+ notEmpty: function (value) {
1803
1843
  return !(value === undefined || value === '' || (Array.isArray(value) && value.length === 0));
1804
1844
  },
1805
1845
 
1846
+ /* Deprecated */
1847
+ empty: function (value) {
1848
+ return $.fn.form.settings.rules.notEmpty(value);
1849
+ },
1850
+
1806
1851
  // checkbox checked
1807
1852
  checked: function () {
1808
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
 
@@ -162,6 +175,11 @@
162
175
  font-family: @inputFont;
163
176
  line-height: @textAreaLineHeight;
164
177
  resize: @textAreaResize;
178
+ min-height: @actionTextareaMinHeight;
179
+ }
180
+ .ui.input > textarea {
181
+ flex: 1 1 auto;
182
+ max-width: 100%;
165
183
  }
166
184
  .ui.form textarea:not([rows]) {
167
185
  height: @textAreaHeight;
@@ -178,16 +196,16 @@
178
196
  Checkbox margin
179
197
  --------------------- */
180
198
 
181
- .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 {
182
200
  margin-top: @checkboxLabelFieldTopMargin;
183
201
  }
184
- .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 {
185
203
  margin-top: @inputLineHeight + @checkboxFieldTopMargin;
186
204
  }
187
- .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 {
188
206
  margin-top: @inputLineHeight + @checkboxToggleFieldTopMargin;
189
207
  }
190
- .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 {
191
209
  margin-top: @inputLineHeight + @checkboxSliderFieldTopMargin;
192
210
  }
193
211
  .ui.ui.form .field .fields .field:not(:only-child) .ui.checkbox {
@@ -205,7 +223,7 @@
205
223
  Transparent
206
224
  --------------------- */
207
225
 
208
- .ui.form .field .transparent.input:not(.icon) input,
226
+ .ui.form .field .transparent.input@{notIcon} input,
209
227
  .ui.form .field input.transparent,
210
228
  .ui.form .field textarea.transparent {
211
229
  padding: @transparentPadding;
@@ -249,7 +267,7 @@
249
267
  --------------------- */
250
268
 
251
269
  /* Block */
252
- .ui.form .field > .selection.dropdown:not(.compact) {
270
+ .ui.form .field > .selection.dropdown@{notCompact} {
253
271
  min-width: auto;
254
272
  width: 100%;
255
273
  }
@@ -282,8 +300,8 @@
282
300
 
283
301
  & when (@variationFormInline) {
284
302
  /* Inline */
285
- .ui.form .inline.fields .field:not(.wide) .ui.input,
286
- .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 {
287
305
  width: auto;
288
306
  vertical-align: middle;
289
307
  }
@@ -291,8 +309,10 @@
291
309
 
292
310
  /* Auto Input */
293
311
  .ui.form .fields .field .ui.input input,
294
- .ui.form .field .ui.input input {
295
- width: auto;
312
+ .ui.form .fields .field .ui.input textarea,
313
+ .ui.form .field .ui.input input,
314
+ .ui.form .field .ui.input textarea {
315
+ width: 100%;
296
316
  }
297
317
 
298
318
  & when (@variationFormEqualWidth) or (@variationFormWide) {
@@ -441,7 +461,8 @@
441
461
  input[type="text"]:focus,
442
462
  input[type="file"]:focus,
443
463
  input[type="url"]:focus,
444
- input[type="week"]:focus {
464
+ input[type="week"]:focus,
465
+ textarea:focus {
445
466
  border-top-right-radius: 0;
446
467
  border-bottom-right-radius: 0;
447
468
  }
@@ -462,7 +483,8 @@
462
483
  input[type="text"],
463
484
  input[type="file"],
464
485
  input[type="url"],
465
- input[type="week"] {
486
+ input[type="week"],
487
+ textarea {
466
488
  border-bottom-left-radius: 0;
467
489
  border-top-left-radius: 0;
468
490
  }
@@ -519,9 +541,9 @@
519
541
  }
520
542
 
521
543
  .ui.ui.form .fields.@{state} .field label,
522
- .ui.ui.form .fields.@{state} .field .ui.label:not(.corner),
544
+ .ui.ui.form .fields.@{state} .field .ui.label@{notCorner},
523
545
  .ui.ui.form .field.@{state} label,
524
- .ui.ui.form .field.@{state} .ui.label:not(.corner),
546
+ .ui.ui.form .field.@{state} .ui.label@{notCorner},
525
547
  .ui.ui.form .fields.@{state} .field .input,
526
548
  .ui.ui.form .field.@{state} .input {
527
549
  color: @c;
@@ -644,6 +666,7 @@
644
666
  }
645
667
 
646
668
  /* Placeholder */
669
+ .ui.form .@{state} .ui.dropdown > .default.text,
647
670
  .ui.form .@{state} ::placeholder {
648
671
  color: @formStates[@@state][inputPlaceholderColor];
649
672
  }
@@ -651,6 +674,7 @@
651
674
  color: @formStates[@@state][inputPlaceholderColor] !important;
652
675
  }
653
676
 
677
+ .ui.form .@{state} .ui.dropdown > input:focus ~ .default.text,
654
678
  .ui.form .@{state} :focus::placeholder {
655
679
  color: @formStates[@@state][inputPlaceholderFocusColor];
656
680
  }
@@ -709,12 +733,12 @@
709
733
  /*--------------------
710
734
  Checkbox State
711
735
  ---------------------*/
712
- .ui.form .fields.@{state} .field .checkbox:not(.toggle):not(.slider) label,
713
- .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 {
714
738
  color: @c;
715
739
  }
716
- .ui.form .fields.@{state} .field .checkbox:not(.toggle):not(.slider) label::before,
717
- .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 {
718
742
  background: @bg;
719
743
  border-color: @bdc;
720
744
  }
@@ -809,11 +833,11 @@
809
833
  Required Field
810
834
  --------------------- */
811
835
 
812
- .ui.form .required.fields:not(.grouped):not(.inline) > .field > label::after,
836
+ .ui.form .required.fields@{notGrouped}@{notInline} > .field > label::after,
813
837
  .ui.form .required.fields.inline > label::after,
814
838
  .ui.form .required.fields.grouped > label::after,
815
839
  .ui.form .required.field > label::after,
816
- .ui.form .required.fields:not(.grouped):not(.inline) > .field > .checkbox::after,
840
+ .ui.form .required.fields@{notGrouped}@{notInline} > .field > .checkbox::after,
817
841
  .ui.form .required.field > .checkbox::after,
818
842
  .ui.form label.required::after {
819
843
  margin: @requiredMargin;
@@ -821,7 +845,7 @@
821
845
  color: @requiredColor;
822
846
  }
823
847
 
824
- .ui.form .required.fields:not(.grouped):not(.inline) > .field > label::after,
848
+ .ui.form .required.fields@{notGrouped}@{notInline} > .field > label::after,
825
849
  .ui.form .required.fields.inline > label::after,
826
850
  .ui.form .required.fields.grouped > label::after,
827
851
  .ui.form .required.field > label::after,
@@ -830,7 +854,7 @@
830
854
  vertical-align: top;
831
855
  }
832
856
 
833
- .ui.form .required.fields:not(.grouped):not(.inline) > .field > .checkbox::after,
857
+ .ui.form .required.fields@{notGrouped}@{notInline} > .field > .checkbox::after,
834
858
  .ui.form .required.field > .checkbox::after {
835
859
  position: absolute;
836
860
  top: 0;
@@ -838,12 +862,16 @@
838
862
  }
839
863
  }
840
864
 
841
- .ui.ui.ui.ui.form .fields > label:empty::after,
842
- .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 {
843
867
  content: " ";
844
868
  display: inline-block;
845
869
  }
846
870
 
871
+ .ui.ui.ui.ui.form .inline.fields .field@{notRequired} > label:empty {
872
+ display: none;
873
+ }
874
+
847
875
  /*******************************
848
876
  Variations
849
877
  *******************************/
@@ -857,6 +885,7 @@
857
885
  .ui.form .inverted.segment label,
858
886
  .ui.form .inverted.segment .ui.checkbox label,
859
887
  .ui.inverted.form .ui.checkbox label,
888
+ .ui.inverted.form .grouped.fields > label,
860
889
  .ui.inverted.form .inline.fields > label,
861
890
  .ui.inverted.form .inline.fields .field > label,
862
891
  .ui.inverted.form .inline.fields .field > p,
@@ -996,8 +1025,8 @@
996
1025
  margin-bottom: 0;
997
1026
  }
998
1027
 
999
- .ui.form:not(.unstackable) .fields:not(.unstackable) > .fields,
1000
- .ui.form:not(.unstackable) .fields:not(.unstackable) > .field {
1028
+ .ui.form@{notUnstackable} .fields@{notUnstackable} > .fields,
1029
+ .ui.form@{notUnstackable} .fields@{notUnstackable} > .field {
1001
1030
  width: @oneColumn;
1002
1031
  margin: 0 0 @rowDistance;
1003
1032
  }