fomantic-ui 2.9.3-beta.2 → 2.9.3-beta.20

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 (246) hide show
  1. package/.github/workflows/ci.yml +1 -1
  2. package/dist/components/accordion.css +1 -1
  3. package/dist/components/accordion.js +1 -1
  4. package/dist/components/accordion.min.css +1 -1
  5. package/dist/components/accordion.min.js +1 -1
  6. package/dist/components/ad.css +1 -1
  7. package/dist/components/ad.min.css +1 -1
  8. package/dist/components/api.js +1 -1
  9. package/dist/components/api.min.js +1 -1
  10. package/dist/components/breadcrumb.css +1 -1
  11. package/dist/components/breadcrumb.min.css +1 -1
  12. package/dist/components/button.css +2 -2
  13. package/dist/components/button.min.css +2 -2
  14. package/dist/components/calendar.css +6 -6
  15. package/dist/components/calendar.js +1 -1
  16. package/dist/components/calendar.min.css +2 -2
  17. package/dist/components/calendar.min.js +1 -1
  18. package/dist/components/card.css +1 -1
  19. package/dist/components/card.min.css +1 -1
  20. package/dist/components/checkbox.css +1 -1
  21. package/dist/components/checkbox.js +1 -1
  22. package/dist/components/checkbox.min.css +1 -1
  23. package/dist/components/checkbox.min.js +1 -1
  24. package/dist/components/comment.css +1 -1
  25. package/dist/components/comment.min.css +1 -1
  26. package/dist/components/container.css +62 -1
  27. package/dist/components/container.min.css +2 -2
  28. package/dist/components/dimmer.css +3 -3
  29. package/dist/components/dimmer.js +1 -1
  30. package/dist/components/dimmer.min.css +2 -2
  31. package/dist/components/dimmer.min.js +1 -1
  32. package/dist/components/divider.css +1 -1
  33. package/dist/components/divider.min.css +1 -1
  34. package/dist/components/dropdown.css +42 -4
  35. package/dist/components/dropdown.js +22 -12
  36. package/dist/components/dropdown.min.css +2 -2
  37. package/dist/components/dropdown.min.js +2 -2
  38. package/dist/components/embed.css +1 -1
  39. package/dist/components/embed.js +1 -1
  40. package/dist/components/embed.min.css +1 -1
  41. package/dist/components/embed.min.js +1 -1
  42. package/dist/components/emoji.css +1 -1
  43. package/dist/components/emoji.min.css +1 -1
  44. package/dist/components/feed.css +1 -1
  45. package/dist/components/feed.min.css +1 -1
  46. package/dist/components/flag.css +3 -2
  47. package/dist/components/flag.min.css +2 -2
  48. package/dist/components/flyout.css +1 -1
  49. package/dist/components/flyout.js +26 -20
  50. package/dist/components/flyout.min.css +1 -1
  51. package/dist/components/flyout.min.js +2 -2
  52. package/dist/components/form.css +53 -20
  53. package/dist/components/form.js +74 -43
  54. package/dist/components/form.min.css +2 -2
  55. package/dist/components/form.min.js +2 -2
  56. package/dist/components/grid.css +107 -107
  57. package/dist/components/grid.min.css +2 -2
  58. package/dist/components/header.css +1 -1
  59. package/dist/components/header.min.css +1 -1
  60. package/dist/components/icon.css +1 -1
  61. package/dist/components/icon.min.css +1 -1
  62. package/dist/components/image.css +1 -1
  63. package/dist/components/image.min.css +1 -1
  64. package/dist/components/input.css +3 -27
  65. package/dist/components/input.min.css +2 -2
  66. package/dist/components/item.css +1 -1
  67. package/dist/components/item.min.css +1 -1
  68. package/dist/components/label.css +21 -2
  69. package/dist/components/label.min.css +2 -2
  70. package/dist/components/list.css +13 -13
  71. package/dist/components/list.min.css +2 -2
  72. package/dist/components/loader.css +282 -282
  73. package/dist/components/loader.min.css +2 -2
  74. package/dist/components/menu.css +9 -3
  75. package/dist/components/menu.min.css +2 -2
  76. package/dist/components/message.css +1 -1
  77. package/dist/components/message.min.css +1 -1
  78. package/dist/components/modal.css +10 -3
  79. package/dist/components/modal.js +31 -26
  80. package/dist/components/modal.min.css +2 -2
  81. package/dist/components/modal.min.js +2 -2
  82. package/dist/components/nag.css +1 -1
  83. package/dist/components/nag.js +1 -1
  84. package/dist/components/nag.min.css +1 -1
  85. package/dist/components/nag.min.js +1 -1
  86. package/dist/components/placeholder.css +1 -1
  87. package/dist/components/placeholder.min.css +1 -1
  88. package/dist/components/popup.css +41 -40
  89. package/dist/components/popup.js +8 -6
  90. package/dist/components/popup.min.css +2 -2
  91. package/dist/components/popup.min.js +2 -2
  92. package/dist/components/progress.css +1 -1
  93. package/dist/components/progress.js +1 -1
  94. package/dist/components/progress.min.css +1 -1
  95. package/dist/components/progress.min.js +1 -1
  96. package/dist/components/rail.css +1 -1
  97. package/dist/components/rail.min.css +1 -1
  98. package/dist/components/rating.css +1 -1
  99. package/dist/components/rating.js +1 -1
  100. package/dist/components/rating.min.css +1 -1
  101. package/dist/components/rating.min.js +1 -1
  102. package/dist/components/reset.css +1 -1
  103. package/dist/components/reset.min.css +1 -1
  104. package/dist/components/reveal.css +1 -1
  105. package/dist/components/reveal.min.css +1 -1
  106. package/dist/components/search.css +17 -1
  107. package/dist/components/search.js +3 -2
  108. package/dist/components/search.min.css +2 -2
  109. package/dist/components/search.min.js +2 -2
  110. package/dist/components/segment.css +159 -33
  111. package/dist/components/segment.min.css +2 -2
  112. package/dist/components/shape.css +1 -1
  113. package/dist/components/shape.js +1 -1
  114. package/dist/components/shape.min.css +1 -1
  115. package/dist/components/shape.min.js +1 -1
  116. package/dist/components/sidebar.css +1 -1
  117. package/dist/components/sidebar.js +1 -1
  118. package/dist/components/sidebar.min.css +1 -1
  119. package/dist/components/sidebar.min.js +1 -1
  120. package/dist/components/site.css +1 -1
  121. package/dist/components/site.js +1 -1
  122. package/dist/components/site.min.css +1 -1
  123. package/dist/components/site.min.js +1 -1
  124. package/dist/components/slider.css +1 -1
  125. package/dist/components/slider.js +122 -26
  126. package/dist/components/slider.min.css +1 -1
  127. package/dist/components/slider.min.js +2 -2
  128. package/dist/components/state.js +1 -1
  129. package/dist/components/state.min.js +1 -1
  130. package/dist/components/statistic.css +1 -1
  131. package/dist/components/statistic.min.css +1 -1
  132. package/dist/components/step.css +1 -1
  133. package/dist/components/step.min.css +1 -1
  134. package/dist/components/sticky.css +1 -1
  135. package/dist/components/sticky.js +1 -1
  136. package/dist/components/sticky.min.css +1 -1
  137. package/dist/components/sticky.min.js +1 -1
  138. package/dist/components/tab.css +1 -1
  139. package/dist/components/tab.js +1 -1
  140. package/dist/components/tab.min.css +1 -1
  141. package/dist/components/tab.min.js +1 -1
  142. package/dist/components/table.css +65 -1
  143. package/dist/components/table.min.css +2 -2
  144. package/dist/components/text.css +1 -1
  145. package/dist/components/text.min.css +1 -1
  146. package/dist/components/toast.css +6 -1
  147. package/dist/components/toast.js +2 -2
  148. package/dist/components/toast.min.css +2 -2
  149. package/dist/components/toast.min.js +2 -2
  150. package/dist/components/transition.css +1 -1
  151. package/dist/components/transition.js +1 -1
  152. package/dist/components/transition.min.css +1 -1
  153. package/dist/components/transition.min.js +1 -1
  154. package/dist/components/visibility.js +1 -1
  155. package/dist/components/visibility.min.js +1 -1
  156. package/dist/semantic.css +1055 -593
  157. package/dist/semantic.js +306 -155
  158. package/dist/semantic.min.css +2 -2
  159. package/dist/semantic.min.js +2 -2
  160. package/package.json +1 -1
  161. package/src/definitions/behaviors/form.js +73 -42
  162. package/src/definitions/collections/breadcrumb.less +2 -1
  163. package/src/definitions/collections/form.less +27 -13
  164. package/src/definitions/collections/grid.less +108 -107
  165. package/src/definitions/collections/menu.less +29 -21
  166. package/src/definitions/collections/message.less +2 -1
  167. package/src/definitions/collections/table.less +68 -1
  168. package/src/definitions/elements/button.less +4 -2
  169. package/src/definitions/elements/container.less +65 -1
  170. package/src/definitions/elements/divider.less +2 -1
  171. package/src/definitions/elements/emoji.less +2 -1
  172. package/src/definitions/elements/flag.less +2 -1
  173. package/src/definitions/elements/header.less +2 -1
  174. package/src/definitions/elements/icon.less +2 -1
  175. package/src/definitions/elements/image.less +2 -1
  176. package/src/definitions/elements/input.less +4 -3
  177. package/src/definitions/elements/label.less +23 -2
  178. package/src/definitions/elements/list.less +14 -13
  179. package/src/definitions/elements/loader.less +73 -72
  180. package/src/definitions/elements/placeholder.less +2 -1
  181. package/src/definitions/elements/rail.less +2 -1
  182. package/src/definitions/elements/reveal.less +2 -1
  183. package/src/definitions/elements/segment.less +112 -14
  184. package/src/definitions/elements/step.less +2 -1
  185. package/src/definitions/elements/text.less +2 -1
  186. package/src/definitions/globals/reset.less +2 -1
  187. package/src/definitions/globals/site.less +2 -1
  188. package/src/definitions/modules/accordion.less +2 -1
  189. package/src/definitions/modules/calendar.less +3 -2
  190. package/src/definitions/modules/checkbox.less +2 -1
  191. package/src/definitions/modules/dimmer.less +4 -3
  192. package/src/definitions/modules/dropdown.js +21 -11
  193. package/src/definitions/modules/dropdown.less +55 -4
  194. package/src/definitions/modules/embed.less +2 -1
  195. package/src/definitions/modules/flyout.js +25 -19
  196. package/src/definitions/modules/flyout.less +2 -1
  197. package/src/definitions/modules/modal.js +30 -25
  198. package/src/definitions/modules/modal.less +13 -3
  199. package/src/definitions/modules/nag.less +3 -1
  200. package/src/definitions/modules/popup.js +7 -5
  201. package/src/definitions/modules/popup.less +42 -39
  202. package/src/definitions/modules/progress.less +2 -1
  203. package/src/definitions/modules/rating.less +2 -1
  204. package/src/definitions/modules/search.js +2 -1
  205. package/src/definitions/modules/search.less +20 -1
  206. package/src/definitions/modules/shape.less +2 -1
  207. package/src/definitions/modules/sidebar.less +2 -1
  208. package/src/definitions/modules/slider.js +121 -25
  209. package/src/definitions/modules/slider.less +2 -1
  210. package/src/definitions/modules/sticky.less +2 -1
  211. package/src/definitions/modules/tab.less +2 -1
  212. package/src/definitions/modules/toast.js +1 -1
  213. package/src/definitions/modules/toast.less +9 -1
  214. package/src/definitions/modules/transition.less +2 -1
  215. package/src/definitions/views/ad.less +2 -1
  216. package/src/definitions/views/card.less +2 -1
  217. package/src/definitions/views/comment.less +2 -1
  218. package/src/definitions/views/feed.less +2 -1
  219. package/src/definitions/views/item.less +2 -1
  220. package/src/definitions/views/statistic.less +2 -1
  221. package/src/overrides.less +7 -0
  222. package/src/theme.less +7 -6
  223. package/src/themes/amazon/elements/button.variables +5 -1
  224. package/src/themes/bootstrap3/elements/button.variables +5 -1
  225. package/src/themes/chubby/elements/header.variables +6 -1
  226. package/src/themes/default/collections/message.variables +3 -9
  227. package/src/themes/default/collections/table.variables +3 -0
  228. package/src/themes/default/elements/button.variables +1 -3
  229. package/src/themes/default/elements/container.variables +3 -0
  230. package/src/themes/default/elements/flag.variables +1 -1
  231. package/src/themes/default/elements/label.variables +5 -0
  232. package/src/themes/default/elements/segment.variables +8 -0
  233. package/src/themes/default/globals/site.variables +20 -1
  234. package/src/themes/default/globals/variation.variables +7 -1
  235. package/src/themes/default/modules/dropdown.variables +6 -0
  236. package/src/themes/default/modules/modal.variables +4 -0
  237. package/src/themes/default/modules/popup.variables +3 -1
  238. package/src/themes/default/modules/search.variables +3 -0
  239. package/src/themes/default/modules/toast.variables +1 -0
  240. package/src/themes/default/views/card.variables +4 -12
  241. package/src/themes/github/elements/button.variables +5 -1
  242. package/src/themes/twitter/elements/button.variables +5 -1
  243. package/tasks/admin/distributions/create.js +8 -3
  244. package/tasks/config/project/install.js +3 -0
  245. package/tasks/config/tasks.js +1 -8
  246. package/tasks/install.js +15 -5
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * # Fomantic-UI 2.9.3-beta.2+824a375 - Form
2
+ * # Fomantic-UI 2.9.3-beta.20+1e3f606 - Form
3
3
  * https://github.com/fomantic/Fomantic-UI/
4
4
  *
5
5
  *
@@ -494,6 +494,11 @@
494
494
  .ui.ui.form .field.error .input {
495
495
  color: #9f3a38;
496
496
  }
497
+ @supports selector(:has(.f)) {
498
+ .ui.form .fields:has(.error) > label {
499
+ color: #9f3a38;
500
+ }
501
+ }
497
502
  .ui.form .fields.error .field .ui.label,
498
503
  .ui.form .field.error .ui.label {
499
504
  background-color: #ecd1d1;
@@ -543,21 +548,7 @@
543
548
  border-radius: "";
544
549
  box-shadow: none;
545
550
  }
546
- .ui.form .field input:not(:-ms-input-placeholder):invalid {
547
- color: #9f3a38;
548
- background: #fff6f6;
549
- border-color: #e0b4b4;
550
- border-radius: "";
551
- box-shadow: none;
552
- }
553
- .ui.form .field input:not(:placeholder-shown):invalid {
554
- color: #9f3a38;
555
- background: #fff6f6;
556
- border-color: #e0b4b4;
557
- border-radius: "";
558
- box-shadow: none;
559
- }
560
- .ui.form .field input:not(:-ms-input-placeholder):invalid {
551
+ .ui.form:not(.initial) .field input:invalid {
561
552
  color: #9f3a38;
562
553
  background: #fff6f6;
563
554
  border-color: #e0b4b4;
@@ -707,6 +698,11 @@
707
698
  .ui.inverted.form .error.field label {
708
699
  color: #ecd1d1;
709
700
  }
701
+ @supports selector(:has(.f)) {
702
+ .ui.inverted.form .fields:has(.error) > label {
703
+ color: #ecd1d1;
704
+ }
705
+ }
710
706
 
711
707
  /* On Form */
712
708
  .ui.form.info .info.message:not(:empty) {
@@ -740,6 +736,11 @@
740
736
  .ui.ui.form .field.info .input {
741
737
  color: #276f86;
742
738
  }
739
+ @supports selector(:has(.f)) {
740
+ .ui.form .fields:has(.info) > label {
741
+ color: #276f86;
742
+ }
743
+ }
743
744
  .ui.form .fields.info .field .ui.label,
744
745
  .ui.form .field.info .ui.label {
745
746
  background-color: #c6e3e9;
@@ -932,6 +933,11 @@
932
933
  .ui.inverted.form .info.field label {
933
934
  color: #c6e3e9;
934
935
  }
936
+ @supports selector(:has(.f)) {
937
+ .ui.inverted.form .fields:has(.info) > label {
938
+ color: #c6e3e9;
939
+ }
940
+ }
935
941
 
936
942
  /* On Form */
937
943
  .ui.form.success .success.message:not(:empty) {
@@ -965,6 +971,11 @@
965
971
  .ui.ui.form .field.success .input {
966
972
  color: #2c662d;
967
973
  }
974
+ @supports selector(:has(.f)) {
975
+ .ui.form .fields:has(.success) > label {
976
+ color: #2c662d;
977
+ }
978
+ }
968
979
  .ui.form .fields.success .field .ui.label,
969
980
  .ui.form .field.success .ui.label {
970
981
  background-color: #b9d1ad;
@@ -1157,6 +1168,11 @@
1157
1168
  .ui.inverted.form .success.field label {
1158
1169
  color: #b9d1ad;
1159
1170
  }
1171
+ @supports selector(:has(.f)) {
1172
+ .ui.inverted.form .fields:has(.success) > label {
1173
+ color: #b9d1ad;
1174
+ }
1175
+ }
1160
1176
 
1161
1177
  /* On Form */
1162
1178
  .ui.form.warning .warning.message:not(:empty) {
@@ -1190,6 +1206,11 @@
1190
1206
  .ui.ui.form .field.warning .input {
1191
1207
  color: #573a08;
1192
1208
  }
1209
+ @supports selector(:has(.f)) {
1210
+ .ui.form .fields:has(.warning) > label {
1211
+ color: #573a08;
1212
+ }
1213
+ }
1193
1214
  .ui.form .fields.warning .field .ui.label,
1194
1215
  .ui.form .field.warning .ui.label {
1195
1216
  background-color: #d7ccb5;
@@ -1382,6 +1403,11 @@
1382
1403
  .ui.inverted.form .warning.field label {
1383
1404
  color: #d7ccb5;
1384
1405
  }
1406
+ @supports selector(:has(.f)) {
1407
+ .ui.inverted.form .fields:has(.warning) > label {
1408
+ color: #d7ccb5;
1409
+ }
1410
+ }
1385
1411
 
1386
1412
  /* --------------------
1387
1413
  Disabled
@@ -1446,29 +1472,36 @@
1446
1472
  /* --------------------
1447
1473
  Required Field
1448
1474
  --------------------- */
1449
- .ui.form .required.fields:not(.grouped) > .field > label::after,
1475
+ .ui.form .required.fields:not(.grouped):not(.inline) > .field > label::after,
1476
+ .ui.form .required.fields.inline > label::after,
1450
1477
  .ui.form .required.fields.grouped > label::after,
1451
1478
  .ui.form .required.field > label::after,
1452
- .ui.form .required.fields:not(.grouped) > .field > .checkbox::after,
1479
+ .ui.form .required.fields:not(.grouped):not(.inline) > .field > .checkbox::after,
1453
1480
  .ui.form .required.field > .checkbox::after,
1454
1481
  .ui.form label.required::after {
1455
1482
  margin: -0.2em 0 0 0.2em;
1456
1483
  content: "*";
1457
1484
  color: #db2828;
1458
1485
  }
1459
- .ui.form .required.fields:not(.grouped) > .field > label::after,
1486
+ .ui.form .required.fields:not(.grouped):not(.inline) > .field > label::after,
1487
+ .ui.form .required.fields.inline > label::after,
1460
1488
  .ui.form .required.fields.grouped > label::after,
1461
1489
  .ui.form .required.field > label::after,
1462
1490
  .ui.form label.required::after {
1463
1491
  display: inline-block;
1464
1492
  vertical-align: top;
1465
1493
  }
1466
- .ui.form .required.fields:not(.grouped) > .field > .checkbox::after,
1494
+ .ui.form .required.fields:not(.grouped):not(.inline) > .field > .checkbox::after,
1467
1495
  .ui.form .required.field > .checkbox::after {
1468
1496
  position: absolute;
1469
1497
  top: 0;
1470
1498
  left: 100%;
1471
1499
  }
1500
+ .ui.ui.ui.ui.form .fields > label:empty::after,
1501
+ .ui.ui.ui.ui.form .field > label:empty::after {
1502
+ content: " ";
1503
+ display: inline-block;
1504
+ }
1472
1505
 
1473
1506
 
1474
1507
  /*******************************
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * # Fomantic-UI 2.9.3-beta.2+824a375 - Form Validation
2
+ * # Fomantic-UI 2.9.3-beta.20+1e3f606 - Form Validation
3
3
  * https://github.com/fomantic/Fomantic-UI/
4
4
  *
5
5
  *
@@ -22,6 +22,7 @@
22
22
  $.fn.form = function (parameters) {
23
23
  var
24
24
  $allModules = $(this),
25
+ $window = $(window),
25
26
 
26
27
  time = Date.now(),
27
28
  performance = [],
@@ -60,6 +61,8 @@
60
61
  namespace,
61
62
  moduleNamespace,
62
63
  eventNamespace,
64
+ attachEventsSelector,
65
+ attachEventsAction,
63
66
 
64
67
  submitting = false,
65
68
  dirty = false,
@@ -74,6 +77,7 @@
74
77
  initialize: function () {
75
78
  // settings grabbed at run time
76
79
  module.get.settings();
80
+ $module.addClass(className.initial);
77
81
  if (methodInvoked) {
78
82
  if (instance === undefined) {
79
83
  module.instantiate();
@@ -127,10 +131,13 @@
127
131
  module.bindEvents();
128
132
  },
129
133
 
130
- submit: function () {
134
+ submit: function (event) {
131
135
  module.verbose('Submitting form', $module);
132
136
  submitting = true;
133
137
  $module.trigger('submit');
138
+ if (event) {
139
+ event.preventDefault();
140
+ }
134
141
  },
135
142
 
136
143
  attachEvents: function (selector, action) {
@@ -142,6 +149,9 @@
142
149
  module[action]();
143
150
  event.preventDefault();
144
151
  });
152
+
153
+ attachEventsSelector = selector;
154
+ attachEventsAction = action;
145
155
  },
146
156
 
147
157
  bindEvents: function () {
@@ -153,6 +163,7 @@
153
163
  .on('click' + eventNamespace, selector.reset, module.reset)
154
164
  .on('click' + eventNamespace, selector.clear, module.clear)
155
165
  ;
166
+ $field.on('invalid' + eventNamespace, module.event.field.invalid);
156
167
  if (settings.keyboardShortcuts) {
157
168
  $module.on('keydown' + eventNamespace, selector.field, module.event.field.keydown);
158
169
  }
@@ -167,7 +178,7 @@
167
178
 
168
179
  // Dirty events
169
180
  if (settings.preventLeaving) {
170
- $(window).on('beforeunload' + eventNamespace, module.event.beforeUnload);
181
+ $window.on('beforeunload' + eventNamespace, module.event.beforeUnload);
171
182
  }
172
183
 
173
184
  $field.on('change' + eventNamespace
@@ -185,6 +196,9 @@
185
196
  $module.on('clean' + eventNamespace, function (e) {
186
197
  settings.onClean.call();
187
198
  });
199
+ if (attachEventsSelector) {
200
+ module.attachEvents(attachEventsSelector, attachEventsAction);
201
+ }
188
202
  },
189
203
 
190
204
  clear: function () {
@@ -233,6 +247,7 @@
233
247
  isCheckbox = $field.is(selector.checkbox),
234
248
  isDropdown = $element.is(selector.uiDropdown) && module.can.useElement('dropdown'),
235
249
  isCalendar = $calendar.length > 0 && module.can.useElement('calendar'),
250
+ isFile = $field.is(selector.file),
236
251
  isErrored = $fieldGroup.hasClass(className.error)
237
252
  ;
238
253
  if (defaultValue === undefined) {
@@ -253,7 +268,7 @@
253
268
  $calendar.calendar('set date', defaultValue);
254
269
  } else {
255
270
  module.verbose('Resetting field value', $field, defaultValue);
256
- $field.val(defaultValue);
271
+ $field.val(isFile ? '' : defaultValue);
257
272
  }
258
273
  });
259
274
  module.remove.states();
@@ -264,8 +279,12 @@
264
279
  var
265
280
  allValid = true
266
281
  ;
267
- $.each(validation, function (fieldName, field) {
268
- if (!module.validate.field(field, fieldName, true)) {
282
+ $field.each(function (index, el) {
283
+ var $el = $(el),
284
+ validation = module.get.validation($el) || {},
285
+ identifier = module.get.identifier(validation, $el)
286
+ ;
287
+ if (!module.validate.field(validation, identifier, true)) {
269
288
  allValid = false;
270
289
  }
271
290
  });
@@ -389,6 +408,13 @@
389
408
  $module.off(eventNamespace);
390
409
  $field.off(eventNamespace);
391
410
  $submit.off(eventNamespace);
411
+ if (settings.preventLeaving) {
412
+ $window.off(eventNamespace);
413
+ }
414
+ if (attachEventsSelector) {
415
+ $(attachEventsSelector).off(eventNamespace);
416
+ attachEventsSelector = undefined;
417
+ }
392
418
  },
393
419
 
394
420
  event: {
@@ -414,9 +440,8 @@
414
440
  if (!event.ctrlKey && key === keyCode.enter && isInput && !isInDropdown && !isCheckbox) {
415
441
  if (!keyHeldDown) {
416
442
  $field.one('keyup' + eventNamespace, module.event.field.keyup);
417
- module.submit();
443
+ module.submit(event);
418
444
  module.debug('Enter pressed on input submitting form');
419
- event.preventDefault();
420
445
  }
421
446
  keyHeldDown = true;
422
447
  }
@@ -424,15 +449,18 @@
424
449
  keyup: function () {
425
450
  keyHeldDown = false;
426
451
  },
452
+ invalid: function (event) {
453
+ event.preventDefault();
454
+ },
427
455
  blur: function (event) {
428
456
  var
429
457
  $field = $(this),
430
- $fieldGroup = $field.closest($group),
431
- validationRules = module.get.validation($field)
458
+ validationRules = module.get.validation($field) || {},
459
+ identifier = module.get.identifier(validationRules, $field)
432
460
  ;
433
- if (validationRules && (settings.on === 'blur' || ($fieldGroup.hasClass(className.error) && settings.revalidate))) {
461
+ if (settings.on === 'blur' || (!$module.hasClass(className.initial) && settings.revalidate)) {
434
462
  module.debug('Revalidating field', $field, validationRules);
435
- module.validate.field(validationRules);
463
+ module.validate.field(validationRules, identifier);
436
464
  if (!settings.inline) {
437
465
  module.validate.form(false, true);
438
466
  }
@@ -441,14 +469,14 @@
441
469
  change: function (event) {
442
470
  var
443
471
  $field = $(this),
444
- $fieldGroup = $field.closest($group),
445
- validationRules = module.get.validation($field)
472
+ validationRules = module.get.validation($field) || {},
473
+ identifier = module.get.identifier(validationRules, $field)
446
474
  ;
447
- if (validationRules && (settings.on === 'change' || ($fieldGroup.hasClass(className.error) && settings.revalidate))) {
475
+ if (settings.on === 'change' || (!$module.hasClass(className.initial) && settings.revalidate)) {
448
476
  clearTimeout(module.timer);
449
477
  module.timer = setTimeout(function () {
450
478
  module.debug('Revalidating field', $field, validationRules);
451
- module.validate.field(validationRules);
479
+ module.validate.field(validationRules, identifier);
452
480
  if (!settings.inline) {
453
481
  module.validate.form(false, true);
454
482
  }
@@ -490,18 +518,7 @@
490
518
  return rule.type;
491
519
  },
492
520
  changeEvent: function (type, $input) {
493
- if (type === 'checkbox' || type === 'radio' || type === 'hidden' || $input.is('select')) {
494
- return 'change';
495
- }
496
-
497
- return module.get.inputEvent();
498
- },
499
- inputEvent: function () {
500
- return document.createElement('input').oninput !== undefined
501
- ? 'input'
502
- : (document.createElement('input').onpropertychange !== undefined
503
- ? 'propertychange'
504
- : 'keyup');
521
+ return ['file', 'checkbox', 'radio', 'hidden'].indexOf(type) >= 0 || $input.is('select') ? 'change' : 'input';
505
522
  },
506
523
  fieldsFromShorthand: function (fields) {
507
524
  var
@@ -525,6 +542,9 @@
525
542
 
526
543
  return fullFields;
527
544
  },
545
+ identifier: function (validation, $el) {
546
+ return validation.identifier || $el.attr('id') || $el.attr('name') || $el.data(metadata.validate);
547
+ },
528
548
  prompt: function (rule, field) {
529
549
  var
530
550
  ruleName = module.get.ruleName(rule),
@@ -637,7 +657,7 @@
637
657
  var $field = typeof identifier === 'string'
638
658
  ? module.get.field(identifier)
639
659
  : identifier,
640
- $label = $field.closest(selector.group).find('label').eq(0)
660
+ $label = $field.closest(selector.group).find('label:not(:empty)').eq(0)
641
661
  ;
642
662
 
643
663
  return $label.length === 1
@@ -968,7 +988,7 @@
968
988
  $message.empty();
969
989
  },
970
990
  states: function () {
971
- $module.removeClass(className.error).removeClass(className.success);
991
+ $module.removeClass(className.error).removeClass(className.success).addClass(className.initial);
972
992
  if (!settings.inline) {
973
993
  module.remove.errors();
974
994
  }
@@ -1106,6 +1126,7 @@
1106
1126
  $field = module.get.field(key),
1107
1127
  $element = $field.parent(),
1108
1128
  $calendar = $field.closest(selector.uiCalendar),
1129
+ isFile = $field.is(selector.file),
1109
1130
  isMultiple = Array.isArray(value),
1110
1131
  isCheckbox = $element.is(selector.uiCheckbox) && module.can.useElement('checkbox'),
1111
1132
  isDropdown = $element.is(selector.uiDropdown) && module.can.useElement('dropdown'),
@@ -1148,7 +1169,7 @@
1148
1169
  $calendar.calendar('set date', value);
1149
1170
  } else {
1150
1171
  module.verbose('Setting field value', value, $field);
1151
- $field.val(value);
1172
+ $field.val(isFile ? '' : value);
1152
1173
  }
1153
1174
  }
1154
1175
  });
@@ -1204,7 +1225,7 @@
1204
1225
  return rule.type === 'empty';
1205
1226
  }) !== 0
1206
1227
  : false,
1207
- identifier = validation.identifier || $el.attr('id') || $el.attr('name') || $el.data(metadata.validate)
1228
+ identifier = module.get.identifier(validation, $el)
1208
1229
  ;
1209
1230
  if (isRequired && !isDisabled && !hasEmptyRule && identifier !== undefined) {
1210
1231
  if (isCheckbox) {
@@ -1236,7 +1257,7 @@
1236
1257
  if (keyHeldDown) {
1237
1258
  return false;
1238
1259
  }
1239
-
1260
+ $module.removeClass(className.initial);
1240
1261
  // reset errors
1241
1262
  formErrors = [];
1242
1263
  if (module.determine.isValid()) {
@@ -1308,13 +1329,24 @@
1308
1329
  ? module.get.field(field.depends)
1309
1330
  : false,
1310
1331
  fieldValid = true,
1311
- fieldErrors = []
1332
+ fieldErrors = [],
1333
+ isDisabled = $field.filter(':not(:disabled)').length === 0,
1334
+ validationMessage = $field[0].validationMessage
1312
1335
  ;
1313
1336
  if (!field.identifier) {
1314
1337
  module.debug('Using field name as identifier', identifier);
1315
1338
  field.identifier = identifier;
1316
1339
  }
1317
- var isDisabled = $field.filter(':not(:disabled)').length === 0;
1340
+ if (validationMessage) {
1341
+ module.debug('Field is natively invalid', identifier);
1342
+ fieldErrors.push(validationMessage);
1343
+ fieldValid = false;
1344
+ if (showErrors) {
1345
+ $field.closest($group).addClass(className.error);
1346
+ }
1347
+ } else if (showErrors) {
1348
+ $field.closest($group).removeClass(className.error);
1349
+ }
1318
1350
  if (isDisabled) {
1319
1351
  module.debug('Field is disabled. Skipping', identifier);
1320
1352
  } else if (field.optional && module.is.blank($field)) {
@@ -1322,9 +1354,6 @@
1322
1354
  } else if (field.depends && module.is.empty($dependsField)) {
1323
1355
  module.debug('Field depends on another value that is not present or empty. Skipping', $dependsField);
1324
1356
  } else if (field.rules !== undefined) {
1325
- if (showErrors) {
1326
- $field.closest($group).removeClass(className.error);
1327
- }
1328
1357
  $.each(field.rules, function (index, rule) {
1329
1358
  if (module.has.field(identifier)) {
1330
1359
  var invalidFields = module.validate.rule(field, rule, true) || [];
@@ -1341,7 +1370,7 @@
1341
1370
  }
1342
1371
  if (fieldValid) {
1343
1372
  if (showErrors) {
1344
- module.remove.prompt(identifier, fieldErrors);
1373
+ module.remove.prompt(identifier);
1345
1374
  settings.onValid.call($field);
1346
1375
  }
1347
1376
  } else {
@@ -1631,8 +1660,8 @@
1631
1660
  isExactly: '{name} must be exactly "{ruleValue}"',
1632
1661
  not: '{name} cannot be set to "{ruleValue}"',
1633
1662
  notExactly: '{name} cannot be set to exactly "{ruleValue}"',
1634
- contain: '{name} must contain "{ruleValue}"',
1635
- containExactly: '{name} must contain exactly "{ruleValue}"',
1663
+ contains: '{name} must contain "{ruleValue}"',
1664
+ containsExactly: '{name} must contain exactly "{ruleValue}"',
1636
1665
  doesntContain: '{name} cannot contain "{ruleValue}"',
1637
1666
  doesntContainExactly: '{name} cannot contain exactly "{ruleValue}"',
1638
1667
  minLength: '{name} must be at least {ruleValue} characters',
@@ -1651,9 +1680,10 @@
1651
1680
  selector: {
1652
1681
  checkbox: 'input[type="checkbox"], input[type="radio"]',
1653
1682
  clear: '.clear',
1654
- field: 'input:not(.search):not([type="file"]):not([type="reset"]):not([type="button"]):not([type="submit"]), textarea, select',
1683
+ field: 'input:not(.search):not([type="reset"]):not([type="button"]):not([type="submit"]), textarea, select',
1684
+ file: 'input[type="file"]',
1655
1685
  group: '.field',
1656
- input: 'input:not([type="file"])',
1686
+ input: 'input',
1657
1687
  message: '.error.message',
1658
1688
  prompt: '.prompt.label',
1659
1689
  radio: 'input[type="radio"]',
@@ -1665,6 +1695,7 @@
1665
1695
  },
1666
1696
 
1667
1697
  className: {
1698
+ initial: 'initial',
1668
1699
  error: 'error',
1669
1700
  label: 'ui basic red pointing prompt label',
1670
1701
  pressed: 'down',