fomantic-ui 2.9.4-beta.5 → 2.9.4-beta.51

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 (248) hide show
  1. package/.all-contributorsrc +20 -1
  2. package/.eslintrc.js +17 -0
  3. package/.github/FUNDING.yml +1 -1
  4. package/.github/workflows/ci.yml +5 -5
  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 +2 -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 +19 -3
  21. package/dist/components/button.min.css +2 -2
  22. package/dist/components/calendar.css +1 -1
  23. package/dist/components/calendar.js +15 -3
  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 +41 -38
  43. package/dist/components/dropdown.js +102 -33
  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 +1 -1
  51. package/dist/components/emoji.min.css +1 -1
  52. package/dist/components/feed.css +12 -1
  53. package/dist/components/feed.min.css +2 -2
  54. package/dist/components/flag.css +1 -1
  55. package/dist/components/flag.min.css +1 -1
  56. package/dist/components/flyout.css +1 -1
  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 -5
  61. package/dist/components/form.js +46 -20
  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 +1 -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 +1 -1
  85. package/dist/components/message.min.css +1 -1
  86. package/dist/components/modal.css +1 -1
  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 +1 -1
  101. package/dist/components/progress.js +4 -2
  102. package/dist/components/progress.min.css +1 -1
  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 +1 -1
  115. package/dist/components/search.js +67 -14
  116. package/dist/components/search.min.css +1 -1
  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 +4 -2
  122. package/dist/components/shape.min.css +1 -1
  123. package/dist/components/shape.min.js +2 -2
  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 +1 -1
  133. package/dist/components/slider.js +4 -2
  134. package/dist/components/slider.min.css +1 -1
  135. package/dist/components/slider.min.js +2 -2
  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 +1 -1
  141. package/dist/components/step.min.css +1 -1
  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 +239 -139
  165. package/dist/semantic.js +360 -130
  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 +3 -3
  174. package/src/definitions/behaviors/api.js +6 -2
  175. package/src/definitions/behaviors/form.js +45 -19
  176. package/src/definitions/behaviors/state.js +3 -1
  177. package/src/definitions/behaviors/visibility.js +3 -1
  178. package/src/definitions/collections/form.less +14 -4
  179. package/src/definitions/collections/grid.less +4 -4
  180. package/src/definitions/collections/table.less +69 -54
  181. package/src/definitions/elements/button.less +25 -3
  182. package/src/definitions/elements/header.less +5 -0
  183. package/src/definitions/elements/input.less +14 -6
  184. package/src/definitions/globals/site.js +3 -1
  185. package/src/definitions/globals/site.less +17 -12
  186. package/src/definitions/modules/accordion.js +3 -1
  187. package/src/definitions/modules/calendar.js +14 -2
  188. package/src/definitions/modules/checkbox.js +9 -3
  189. package/src/definitions/modules/dimmer.js +3 -1
  190. package/src/definitions/modules/dimmer.less +8 -5
  191. package/src/definitions/modules/dropdown.js +101 -32
  192. package/src/definitions/modules/dropdown.less +38 -27
  193. package/src/definitions/modules/embed.js +16 -6
  194. package/src/definitions/modules/flyout.js +3 -1
  195. package/src/definitions/modules/modal.js +6 -2
  196. package/src/definitions/modules/nag.js +10 -4
  197. package/src/definitions/modules/popup.js +9 -3
  198. package/src/definitions/modules/progress.js +3 -1
  199. package/src/definitions/modules/rating.js +3 -1
  200. package/src/definitions/modules/search.js +66 -13
  201. package/src/definitions/modules/search.less +9 -2
  202. package/src/definitions/modules/shape.js +3 -1
  203. package/src/definitions/modules/sidebar.js +3 -1
  204. package/src/definitions/modules/slider.js +3 -1
  205. package/src/definitions/modules/sticky.js +3 -1
  206. package/src/definitions/modules/tab.js +3 -1
  207. package/src/definitions/modules/toast.js +6 -2
  208. package/src/definitions/modules/transition.js +6 -2
  209. package/src/definitions/views/feed.less +11 -0
  210. package/src/themes/basic/assets/fonts/LICENSE.txt +91 -0
  211. package/src/themes/default/assets/fonts/LICENSE_Lato.txt +94 -0
  212. package/src/themes/default/assets/fonts/LICENSE_icons.txt +165 -0
  213. package/src/themes/default/collections/form.variables +1 -0
  214. package/src/themes/default/elements/button.variables +2 -0
  215. package/src/themes/default/globals/site.variables +3 -0
  216. package/src/themes/default/globals/variation.variables +3 -0
  217. package/src/themes/default/modules/dropdown.variables +3 -0
  218. package/src/themes/default/modules/search.variables +3 -0
  219. package/src/themes/default/views/feed.variables +3 -0
  220. package/src/themes/github/assets/fonts/LICENSE.txt +94 -0
  221. package/src/themes/material/assets/fonts/LICENSE.txt +202 -0
  222. package/types/fomantic-ui-accordion.d.ts +1 -1
  223. package/types/fomantic-ui-api.d.ts +9 -3
  224. package/types/fomantic-ui-calendar.d.ts +93 -8
  225. package/types/fomantic-ui-checkbox.d.ts +14 -4
  226. package/types/fomantic-ui-dimmer.d.ts +1 -1
  227. package/types/fomantic-ui-dropdown.d.ts +48 -35
  228. package/types/fomantic-ui-embed.d.ts +19 -2
  229. package/types/fomantic-ui-flyout.d.ts +24 -10
  230. package/types/fomantic-ui-form.d.ts +123 -15
  231. package/types/fomantic-ui-modal.d.ts +75 -5
  232. package/types/fomantic-ui-nag.d.ts +4 -4
  233. package/types/fomantic-ui-popup.d.ts +11 -11
  234. package/types/fomantic-ui-progress.d.ts +12 -6
  235. package/types/fomantic-ui-rating.d.ts +1 -1
  236. package/types/fomantic-ui-search.d.ts +125 -14
  237. package/types/fomantic-ui-shape.d.ts +2 -2
  238. package/types/fomantic-ui-sidebar.d.ts +4 -4
  239. package/types/fomantic-ui-slider.d.ts +1 -1
  240. package/types/fomantic-ui-sticky.d.ts +1 -1
  241. package/types/fomantic-ui-tab.d.ts +5 -5
  242. package/types/fomantic-ui-toast.d.ts +14 -2
  243. package/types/fomantic-ui-transition.d.ts +29 -1
  244. package/types/fomantic-ui-visibility.d.ts +3 -3
  245. package/types/index.d.ts +25 -25
  246. package/types/tests.ts +188 -0
  247. package/types/tsconfig.json +1 -1
  248. package/types/fomantic-ui-tests.ts +0 -25
@@ -102,7 +102,17 @@
102
102
 
103
103
  destroy: function () {
104
104
  module.verbose('Destroying previous calendar for', element);
105
- $module.removeData(moduleNamespace);
105
+ $module.removeData([
106
+ metadata.date,
107
+ metadata.focusDate,
108
+ metadata.startDate,
109
+ metadata.endDate,
110
+ metadata.minDate,
111
+ metadata.maxDate,
112
+ metadata.mode,
113
+ metadata.monthOffset,
114
+ moduleNamespace,
115
+ ]);
106
116
  module.unbind.events();
107
117
  module.disconnect.classObserver();
108
118
  },
@@ -1479,7 +1489,9 @@
1479
1489
  });
1480
1490
  }
1481
1491
  clearTimeout(module.performance.timer);
1482
- module.performance.timer = setTimeout(function () { module.performance.display(); }, 500);
1492
+ module.performance.timer = setTimeout(function () {
1493
+ module.performance.display();
1494
+ }, 500);
1483
1495
  },
1484
1496
  display: function () {
1485
1497
  var
@@ -210,7 +210,7 @@
210
210
  ;
211
211
 
212
212
  var
213
- r = module.get.radios(),
213
+ r = module.get.radios().not(selector.disabled),
214
214
  rIndex = r.index($module),
215
215
  rLen = r.length,
216
216
  checkIndex = false
@@ -228,7 +228,10 @@
228
228
 
229
229
  return false;
230
230
  }
231
- if (settings.beforeChecked.apply($(r[checkIndex]).children(selector.input)[0]) === false) {
231
+ var nextOption = $(r[checkIndex]),
232
+ nextInput = nextOption.children(selector.input),
233
+ disallowOption = nextOption.hasClass(className.readOnly) || nextInput.prop('readonly');
234
+ if (disallowOption || settings.beforeChecked.apply(nextInput[0]) === false) {
232
235
  module.verbose('Next option should not allow check, cancelling key navigation');
233
236
 
234
237
  return false;
@@ -725,7 +728,9 @@
725
728
  });
726
729
  }
727
730
  clearTimeout(module.performance.timer);
728
- module.performance.timer = setTimeout(function () { module.performance.display(); }, 500);
731
+ module.performance.timer = setTimeout(function () {
732
+ module.performance.display();
733
+ }, 500);
729
734
  },
730
735
  display: function () {
731
736
  var
@@ -873,6 +878,7 @@
873
878
 
874
879
  selector: {
875
880
  checkbox: '.ui.checkbox',
881
+ disabled: '.disabled, :has(input[disabled])',
876
882
  label: 'label',
877
883
  input: 'input[type="checkbox"], input[type="radio"]',
878
884
  link: 'a[href]',
@@ -528,7 +528,9 @@
528
528
  });
529
529
  }
530
530
  clearTimeout(module.performance.timer);
531
- module.performance.timer = setTimeout(function () { module.performance.display(); }, 500);
531
+ module.performance.timer = setTimeout(function () {
532
+ module.performance.display();
533
+ }, 500);
532
534
  },
533
535
  display: function () {
534
536
  var
@@ -74,17 +74,20 @@
74
74
  .ui.dimmer:not(.inverted)::-webkit-scrollbar-thumb:hover {
75
75
  background: @thumbInvertedHoverBackground;
76
76
  }
77
- .ui.dimmer:not(.inverted) {
78
- & when (@supportIE) {
77
+ & when (@supportIE) {
78
+ .ui.dimmer:not(.inverted) {
79
79
  /* IE11 */
80
80
  scrollbar-face-color: @thumbInvertedBackgroundHex;
81
81
  scrollbar-shadow-color: @thumbInvertedBackgroundHex;
82
82
  scrollbar-track-color: @trackInvertedBackgroundHex;
83
83
  scrollbar-arrow-color: @trackInvertedBackgroundHex;
84
84
  }
85
-
86
- /* firefox: first color thumb, second track */
87
- scrollbar-color: @thumbInvertedBackground @trackInvertedBackground;
85
+ }
86
+ @supports (-moz-appearance: none) {
87
+ .ui.dimmer:not(.inverted) {
88
+ /* firefox: first color thumb, second track */
89
+ scrollbar-color: @thumbInvertedBackground @trackInvertedBackground;
90
+ }
88
91
  }
89
92
  }
90
93
 
@@ -793,7 +793,7 @@
793
793
  }
794
794
  if (module.is.multiple()) {
795
795
  $.each(preSelected, function (index, value) {
796
- $item.filter('[data-value="' + value + '"]')
796
+ $item.filter('[data-' + metadata.value + '="' + value + '"]')
797
797
  .addClass(className.filtered)
798
798
  ;
799
799
  });
@@ -890,11 +890,13 @@
890
890
  ? query
891
891
  : module.get.query()
892
892
  ),
893
- results = null,
894
- escapedTerm = module.escape.string(searchTerm),
895
- regExpFlags = (settings.ignoreSearchCase ? 'i' : '') + 'gm',
893
+ results = null,
894
+ escapedTerm = module.escape.string(searchTerm),
895
+ regExpIgnore = settings.ignoreSearchCase ? 'i' : '',
896
+ regExpFlags = regExpIgnore + 'gm',
896
897
  beginsWithRegExp = new RegExp('^' + escapedTerm, regExpFlags)
897
898
  ;
899
+ module.remove.filteredItem();
898
900
  // avoid loop if we're matching nothing
899
901
  if (module.has.query()) {
900
902
  results = [];
@@ -938,12 +940,34 @@
938
940
  ;
939
941
  }
940
942
  module.debug('Showing only matched items', searchTerm);
941
- module.remove.filteredItem();
942
943
  if (results) {
943
944
  $item
944
945
  .not(results)
945
946
  .addClass(className.filtered)
946
947
  ;
948
+ if (settings.highlightMatches && (settings.match === 'both' || settings.match === 'text')) {
949
+ var querySplit = query.split(''),
950
+ diacriticReg = settings.ignoreDiacritics ? '[\u0300-\u036F]?' : '',
951
+ htmlReg = '(?![^<]*>)',
952
+ markedRegExp = new RegExp(htmlReg + '(' + querySplit.join(diacriticReg + ')(.*?)' + htmlReg + '(') + diacriticReg + ')', regExpIgnore),
953
+ markedReplacer = function () {
954
+ var args = [].slice.call(arguments, 1, querySplit.length * 2).map(function (x, i) {
955
+ return i & 1 ? x : '<mark>' + x + '</mark>'; // eslint-disable-line no-bitwise
956
+ });
957
+
958
+ return args.join('');
959
+ }
960
+ ;
961
+ $.each(results, function (index, result) {
962
+ var $result = $(result),
963
+ markedHTML = module.get.choiceText($result, true)
964
+ ;
965
+ if (settings.ignoreDiacritics) {
966
+ markedHTML = markedHTML.normalize('NFD');
967
+ }
968
+ $result.html(markedHTML.replace(markedRegExp, markedReplacer));
969
+ });
970
+ }
947
971
  }
948
972
 
949
973
  if (!module.has.query()) {
@@ -979,8 +1003,10 @@
979
1003
  termLength = term.length,
980
1004
  queryLength = query.length
981
1005
  ;
982
- query = settings.ignoreSearchCase ? query.toLowerCase() : query;
983
- term = settings.ignoreSearchCase ? term.toLowerCase() : term;
1006
+ if (settings.ignoreSearchCase) {
1007
+ query = query.toLowerCase();
1008
+ term = term.toLowerCase();
1009
+ }
984
1010
  if (queryLength > termLength) {
985
1011
  return false;
986
1012
  }
@@ -1187,7 +1213,7 @@
1187
1213
  if (!itemActivated && !pageLostFocus) {
1188
1214
  if (settings.forceSelection) {
1189
1215
  module.forceSelection();
1190
- } else if (!settings.allowAdditions) {
1216
+ } else if (!settings.allowAdditions && !settings.keepSearchTerm && !module.has.menuSearch()) {
1191
1217
  module.remove.searchTerm();
1192
1218
  }
1193
1219
  module.hide();
@@ -1236,7 +1262,9 @@
1236
1262
  module.set.filtered();
1237
1263
  }
1238
1264
  clearTimeout(module.timer);
1239
- module.timer = setTimeout(function () { module.search(); }, settings.delay.search);
1265
+ module.timer = setTimeout(function () {
1266
+ module.search();
1267
+ }, settings.delay.search);
1240
1268
  },
1241
1269
  label: {
1242
1270
  click: function (event) {
@@ -1413,7 +1441,9 @@
1413
1441
  module.remove.userAddition();
1414
1442
  }
1415
1443
  if (!settings.keepSearchTerm) {
1416
- module.remove.filteredItem();
1444
+ if (module.is.multiple()) {
1445
+ module.remove.filteredItem();
1446
+ }
1417
1447
  module.remove.searchTerm();
1418
1448
  }
1419
1449
  if (!module.is.visible() && $target.length > 0) {
@@ -2587,7 +2617,7 @@
2587
2617
  } else {
2588
2618
  $combo.text(text);
2589
2619
  }
2590
- } else if (settings.action === 'activate') {
2620
+ } else if (settings.action === 'activate' || isFunction(settings.action)) {
2591
2621
  if (text !== module.get.placeholderText() || isNotPlaceholder) {
2592
2622
  $text.removeClass(className.placeholder);
2593
2623
  }
@@ -2647,7 +2677,7 @@
2647
2677
  module.set.scrollPosition($nextValue);
2648
2678
  $selectedItem.removeClass(className.selected);
2649
2679
  $nextValue.addClass(className.selected);
2650
- if (settings.selectOnKeydown && module.is.single() && !$nextItem.hasClass(className.actionable)) {
2680
+ if (settings.selectOnKeydown && module.is.single() && (!$nextItem || !$nextItem.hasClass(className.actionable))) {
2651
2681
  module.set.selectedItem($nextValue);
2652
2682
  }
2653
2683
  }
@@ -2768,19 +2798,27 @@
2768
2798
  $selectedItem = settings.allowAdditions
2769
2799
  ? $selectedItem || module.get.itemWithAdditions(value)
2770
2800
  : $selectedItem || module.get.item(value);
2771
- if (!$selectedItem) {
2801
+ if (!$selectedItem && value !== undefined) {
2772
2802
  return false;
2773
2803
  }
2774
- module.debug('Setting selected menu item to', $selectedItem);
2775
- if (module.is.multiple() && !keepSearchTerm) {
2776
- module.remove.searchWidth();
2777
- }
2778
- if (module.is.single()) {
2804
+ if (isMultiple) {
2805
+ if (!keepSearchTerm) {
2806
+ module.remove.searchWidth();
2807
+ }
2808
+ if (settings.useLabels) {
2809
+ module.remove.selectedItem();
2810
+ if (value === undefined) {
2811
+ module.remove.labels($module.find(selector.label), true);
2812
+ }
2813
+ }
2814
+ } else {
2779
2815
  module.remove.activeItem();
2780
2816
  module.remove.selectedItem();
2781
- } else if (settings.useLabels) {
2782
- module.remove.selectedItem();
2783
2817
  }
2818
+ if (!$selectedItem) {
2819
+ return false;
2820
+ }
2821
+ module.debug('Setting selected menu item to', $selectedItem);
2784
2822
  // select each item
2785
2823
  $selectedItem
2786
2824
  .each(function () {
@@ -3080,6 +3118,12 @@
3080
3118
  $item.removeClass(className.active);
3081
3119
  },
3082
3120
  filteredItem: function () {
3121
+ if (settings.highlightMatches) {
3122
+ $.each($item, function (index, item) {
3123
+ var $markItem = $(item);
3124
+ $markItem.html($markItem.html().replace(/<\/?mark>/g, ''));
3125
+ });
3126
+ }
3083
3127
  if (settings.useLabels && module.has.maxSelections()) {
3084
3128
  return;
3085
3129
  }
@@ -3424,7 +3468,12 @@
3424
3468
  return $selectedMenu.hasClass(className.leftward);
3425
3469
  },
3426
3470
  clearable: function () {
3427
- return $module.hasClass(className.clearable) || settings.clearable;
3471
+ var hasClearableClass = $module.hasClass(className.clearable);
3472
+ if (!hasClearableClass && settings.clearable) {
3473
+ $module.addClass(className.clearable);
3474
+ }
3475
+
3476
+ return hasClearableClass || settings.clearable;
3428
3477
  },
3429
3478
  disabled: function () {
3430
3479
  return $module.hasClass(className.disabled);
@@ -3747,12 +3796,16 @@
3747
3796
  show: function () {
3748
3797
  module.verbose('Delaying show event to ensure user intent');
3749
3798
  clearTimeout(module.timer);
3750
- module.timer = setTimeout(function () { module.show(); }, settings.delay.show);
3799
+ module.timer = setTimeout(function () {
3800
+ module.show();
3801
+ }, settings.delay.show);
3751
3802
  },
3752
3803
  hide: function () {
3753
3804
  module.verbose('Delaying hide event to ensure user intent');
3754
3805
  clearTimeout(module.timer);
3755
- module.timer = setTimeout(function () { module.hide(); }, settings.delay.hide);
3806
+ module.timer = setTimeout(function () {
3807
+ module.hide();
3808
+ }, settings.delay.hide);
3756
3809
  },
3757
3810
  },
3758
3811
 
@@ -3785,6 +3838,7 @@
3785
3838
  return text.replace(regExp.escape, '\\$&');
3786
3839
  },
3787
3840
  htmlEntities: function (string, forceAmpersand) {
3841
+ forceAmpersand = typeof forceAmpersand === 'number' ? false : forceAmpersand;
3788
3842
  var
3789
3843
  badChars = /["'<>`]/g,
3790
3844
  shouldEscape = /["&'<>`]/,
@@ -3801,8 +3855,7 @@
3801
3855
  ;
3802
3856
  if (shouldEscape.test(string)) {
3803
3857
  string = string.replace(forceAmpersand ? /&/g : /&(?![\d#a-z]{1,12};)/gi, '&amp;');
3804
-
3805
- return string.replace(badChars, escapedChar);
3858
+ string = string.replace(badChars, escapedChar);
3806
3859
  }
3807
3860
 
3808
3861
  return string;
@@ -3878,7 +3931,9 @@
3878
3931
  });
3879
3932
  }
3880
3933
  clearTimeout(module.performance.timer);
3881
- module.performance.timer = setTimeout(function () { module.performance.display(); }, 500);
3934
+ module.performance.timer = setTimeout(function () {
3935
+ module.performance.display();
3936
+ }, 500);
3882
3937
  },
3883
3938
  display: function () {
3884
3939
  var
@@ -4005,6 +4060,7 @@
4005
4060
 
4006
4061
  match: 'both', // what to match against with search selection (both, text, or label)
4007
4062
  fullTextSearch: 'exact', // search anywhere in value (set to 'exact' to require exact matches)
4063
+ highlightMatches: false, // Whether search result should highlight matching strings
4008
4064
  ignoreDiacritics: false, // match results also if they contain diacritics of the same base character (for example searching for "a" will also match "á" or "â" or "à", etc...)
4009
4065
  hideDividers: false, // Whether to hide any divider elements (specified in selector.divider) that are sibling to any items when searched (set to true will hide all dividers, set to 'empty' will hide them when they are not followed by a visible item)
4010
4066
 
@@ -4120,9 +4176,11 @@
4120
4176
  descriptionVertical: 'descriptionVertical', // whether description should be vertical
4121
4177
  value: 'value', // actual dropdown value
4122
4178
  text: 'text', // displayed text when selected
4179
+ data: 'data', // custom data attributes
4123
4180
  type: 'type', // type of dropdown element
4124
4181
  image: 'image', // optional image path
4125
4182
  imageClass: 'imageClass', // optional individual class for image
4183
+ alt: 'alt', // optional alt text for image
4126
4184
  icon: 'icon', // optional icon name
4127
4185
  iconClass: 'iconClass', // optional individual class for icon (for example to use flag instead)
4128
4186
  class: 'class', // optional individual class for item/header
@@ -4229,8 +4287,7 @@
4229
4287
  ;
4230
4288
  if (shouldEscape.test(string)) {
4231
4289
  string = string.replace(/&(?![\d#a-z]{1,12};)/gi, '&amp;');
4232
-
4233
- return string.replace(badChars, escapedChar);
4290
+ string = string.replace(badChars, escapedChar);
4234
4291
  }
4235
4292
 
4236
4293
  return string;
@@ -4265,9 +4322,21 @@
4265
4322
  $.each(values, function (index, option) {
4266
4323
  var
4267
4324
  itemType = option[fields.type] || 'item',
4268
- isMenu = itemType.indexOf('menu') !== -1
4325
+ isMenu = itemType.indexOf('menu') !== -1,
4326
+ maybeData = '',
4327
+ dataObject = option[fields.data]
4269
4328
  ;
4270
-
4329
+ if (dataObject) {
4330
+ var dataKey,
4331
+ dataKeyEscaped
4332
+ ;
4333
+ for (dataKey in dataObject) {
4334
+ dataKeyEscaped = String(dataKey).replace(/\W/g, '');
4335
+ if (Object.prototype.hasOwnProperty.call(dataObject, dataKey) && ['text', 'value'].indexOf(dataKeyEscaped.toLowerCase()) === -1) {
4336
+ maybeData += ' data-' + dataKeyEscaped + '="' + deQuote(String(dataObject[dataKey])) + '"';
4337
+ }
4338
+ }
4339
+ }
4271
4340
  if (itemType === 'item' || isMenu) {
4272
4341
  var
4273
4342
  maybeText = option[fields.text]
@@ -4284,12 +4353,12 @@
4284
4353
  : '',
4285
4354
  hasDescription = escape(option[fields.description] || '', preserveHTML) !== ''
4286
4355
  ;
4287
- html += '<div class="' + deQuote(maybeActionable + maybeDisabled + maybeDescriptionVertical + (option[fields.class] || className.item)) + '" data-value="' + deQuote(option[fields.value], true) + '"' + maybeText + '>';
4356
+ html += '<div class="' + deQuote(maybeActionable + maybeDisabled + maybeDescriptionVertical + (option[fields.class] || className.item)) + '" data-value="' + deQuote(option[fields.value], true) + '"' + maybeText + maybeData + '>';
4288
4357
  if (isMenu) {
4289
4358
  html += '<i class="' + (itemType.indexOf('left') !== -1 ? 'left' : '') + ' dropdown icon"></i>';
4290
4359
  }
4291
4360
  if (option[fields.image]) {
4292
- html += '<img class="' + deQuote(option[fields.imageClass] || className.image) + '" src="' + deQuote(option[fields.image]) + '">';
4361
+ html += '<img class="' + deQuote(option[fields.imageClass] || className.image) + '" src="' + deQuote(option[fields.image]) + (option[fields.alt] ? '" alt="' + deQuote(option[fields.alt]) : '') + '">';
4293
4362
  }
4294
4363
  if (option[fields.icon]) {
4295
4364
  html += '<i class="' + deQuote(option[fields.icon] + ' ' + (option[fields.iconClass] || className.icon)) + '"></i>';
@@ -468,10 +468,10 @@ select.ui.dropdown {
468
468
 
469
469
  @media only screen and (max-width: @largestMobileScreen) {
470
470
  & when (@variationDropdownShort) {
471
- .ui.selection.dropdown.short .menu {
471
+ .ui.ui.selection.dropdown.short .menu {
472
472
  max-height: @selectionMobileMaxMenuHeight * 0.75;
473
473
  }
474
- .ui.selection.dropdown[class*="very short"] .menu {
474
+ .ui.ui.selection.dropdown[class*="very short"] .menu {
475
475
  max-height: @selectionMobileMaxMenuHeight * 0.5;
476
476
  }
477
477
  }
@@ -479,20 +479,20 @@ select.ui.dropdown {
479
479
  max-height: @selectionMobileMaxMenuHeight;
480
480
  }
481
481
  & when (@variationDropdownLong) {
482
- .ui.selection.dropdown.long .menu {
482
+ .ui.ui.selection.dropdown.long .menu {
483
483
  max-height: @selectionMobileMaxMenuHeight * 2;
484
484
  }
485
- .ui.selection.dropdown[class*="very long"] .menu {
485
+ .ui.ui.selection.dropdown[class*="very long"] .menu {
486
486
  max-height: @selectionMobileMaxMenuHeight * 3;
487
487
  }
488
488
  }
489
489
  }
490
490
  @media only screen and (min-width: @tabletBreakpoint) {
491
491
  & when (@variationDropdownShort) {
492
- .ui.selection.dropdown.short .menu {
492
+ .ui.ui.selection.dropdown.short .menu {
493
493
  max-height: @selectionTabletMaxMenuHeight * 0.75;
494
494
  }
495
- .ui.selection.dropdown[class*="very short"] .menu {
495
+ .ui.ui.selection.dropdown[class*="very short"] .menu {
496
496
  max-height: @selectionTabletMaxMenuHeight * 0.5;
497
497
  }
498
498
  }
@@ -500,20 +500,20 @@ select.ui.dropdown {
500
500
  max-height: @selectionTabletMaxMenuHeight;
501
501
  }
502
502
  & when (@variationDropdownLong) {
503
- .ui.selection.dropdown.long .menu {
503
+ .ui.ui.selection.dropdown.long .menu {
504
504
  max-height: @selectionTabletMaxMenuHeight * 2;
505
505
  }
506
- .ui.selection.dropdown[class*="very long"] .menu {
506
+ .ui.ui.selection.dropdown[class*="very long"] .menu {
507
507
  max-height: @selectionTabletMaxMenuHeight * 3;
508
508
  }
509
509
  }
510
510
  }
511
511
  @media only screen and (min-width: @computerBreakpoint) {
512
512
  & when (@variationDropdownShort) {
513
- .ui.selection.dropdown.short .menu {
513
+ .ui.ui.selection.dropdown.short .menu {
514
514
  max-height: @selectionComputerMaxMenuHeight * 0.75;
515
515
  }
516
- .ui.selection.dropdown[class*="very short"] .menu {
516
+ .ui.ui.selection.dropdown[class*="very short"] .menu {
517
517
  max-height: @selectionComputerMaxMenuHeight * 0.5;
518
518
  }
519
519
  }
@@ -521,20 +521,20 @@ select.ui.dropdown {
521
521
  max-height: @selectionComputerMaxMenuHeight;
522
522
  }
523
523
  & when (@variationDropdownLong) {
524
- .ui.selection.dropdown.long .menu {
524
+ .ui.ui.selection.dropdown.long .menu {
525
525
  max-height: @selectionComputerMaxMenuHeight * 2;
526
526
  }
527
- .ui.selection.dropdown[class*="very long"] .menu {
527
+ .ui.ui.selection.dropdown[class*="very long"] .menu {
528
528
  max-height: @selectionComputerMaxMenuHeight * 3;
529
529
  }
530
530
  }
531
531
  }
532
532
  @media only screen and (min-width: @widescreenMonitorBreakpoint) {
533
533
  & when (@variationDropdownShort) {
534
- .ui.selection.dropdown.short .menu {
534
+ .ui.ui.selection.dropdown.short .menu {
535
535
  max-height: @selectionWidescreenMaxMenuHeight * 0.75;
536
536
  }
537
- .ui.selection.dropdown[class*="very short"] .menu {
537
+ .ui.ui.selection.dropdown[class*="very short"] .menu {
538
538
  max-height: @selectionWidescreenMaxMenuHeight * 0.5;
539
539
  }
540
540
  }
@@ -542,10 +542,10 @@ select.ui.dropdown {
542
542
  max-height: @selectionWidescreenMaxMenuHeight;
543
543
  }
544
544
  & when (@variationDropdownLong) {
545
- .ui.selection.dropdown.long .menu {
545
+ .ui.ui.selection.dropdown.long .menu {
546
546
  max-height: @selectionWidescreenMaxMenuHeight * 2;
547
547
  }
548
- .ui.selection.dropdown[class*="very long"] .menu {
548
+ .ui.ui.selection.dropdown[class*="very long"] .menu {
549
549
  max-height: @selectionWidescreenMaxMenuHeight * 3;
550
550
  }
551
551
  }
@@ -811,14 +811,14 @@ select.ui.dropdown {
811
811
  }
812
812
  }
813
813
 
814
- .ui.clearable.dropdown .text,
815
- .ui.clearable.dropdown a:last-of-type {
814
+ .ui.clearable.dropdown .text:not(.default),
815
+ .ui.clearable.dropdown:not(.search) > .ui.label:last-of-type {
816
816
  margin-right: @clearableTextMargin;
817
817
  }
818
818
 
819
819
  .ui.dropdown select.noselection ~ .remove.icon,
820
820
  .ui.dropdown input[value=""] ~ .remove.icon,
821
- .ui.dropdown input:not([value]) ~ .remove.icon,
821
+ .ui.dropdown input:not([value]):not(.search) ~ .remove.icon,
822
822
  .ui.dropdown.loading > .remove.icon {
823
823
  display: none;
824
824
  }
@@ -1853,13 +1853,20 @@ select.ui.dropdown {
1853
1853
  & when not (@variationDropdownSizes = false) {
1854
1854
  each(@variationDropdownSizes, {
1855
1855
  @s: @@value;
1856
- .ui.@{value}.dropdown,
1857
- .ui.@{value}.dropdown .menu > .item {
1856
+ .ui.ui.@{value}.dropdown,
1857
+ .ui.ui.@{value}.dropdown .menu > .item {
1858
1858
  font-size: @s;
1859
1859
  }
1860
1860
  });
1861
1861
  }
1862
1862
 
1863
+ & when (@variationDropdownHighlightMatches) {
1864
+ .ui.dropdown .menu > .item mark {
1865
+ background: @highlightMatchesBackground;
1866
+ color: @highlightMatchesColor;
1867
+ }
1868
+ }
1869
+
1863
1870
  & when (@variationDropdownInverted) {
1864
1871
  /* --------------
1865
1872
  Inverted
@@ -2035,18 +2042,22 @@ select.ui.dropdown {
2035
2042
  .ui.inverted.dropdown .menu::-webkit-scrollbar-thumb:hover {
2036
2043
  background: @thumbInvertedHoverBackground;
2037
2044
  }
2038
- .ui.dropdown .inverted.menu,
2039
- .ui.inverted.dropdown .menu {
2040
- & when (@supportIE) {
2045
+ & when (@supportIE) {
2046
+ .ui.dropdown .inverted.menu,
2047
+ .ui.inverted.dropdown .menu {
2041
2048
  /* IE11 */
2042
2049
  scrollbar-face-color: @thumbInvertedBackgroundHex;
2043
2050
  scrollbar-shadow-color: @thumbInvertedBackgroundHex;
2044
2051
  scrollbar-track-color: @trackInvertedBackgroundHex;
2045
2052
  scrollbar-arrow-color: @trackInvertedBackgroundHex;
2046
2053
  }
2047
-
2048
- /* firefox: first color thumb, second track */
2049
- scrollbar-color: @thumbInvertedBackground @trackInvertedBackground;
2054
+ }
2055
+ @supports (-moz-appearance: none) {
2056
+ .ui.dropdown .inverted.menu,
2057
+ .ui.inverted.dropdown .menu {
2058
+ /* firefox: first color thumb, second track */
2059
+ scrollbar-color: @thumbInvertedBackground @trackInvertedBackground;
2060
+ }
2050
2061
  }
2051
2062
  }
2052
2063
  & when (@variationDropdownPointing) {
@@ -119,11 +119,12 @@
119
119
 
120
120
  createPlaceholder: function (placeholder) {
121
121
  var
122
- icon = module.get.icon()
122
+ icon = module.get.icon(),
123
+ alt = module.get.alt()
123
124
  ;
124
125
  placeholder = placeholder || module.get.placeholder();
125
- $module.html(templates.placeholder(placeholder, icon));
126
- module.debug('Creating placeholder for embed', placeholder, icon);
126
+ $module.html(templates.placeholder(placeholder, icon, alt));
127
+ module.debug('Creating placeholder for embed', placeholder, icon, alt);
127
128
  },
128
129
 
129
130
  createEmbed: function (url) {
@@ -203,6 +204,9 @@
203
204
  placeholder: function () {
204
205
  return settings.placeholder || $module.data(metadata.placeholder);
205
206
  },
207
+ alt: function () {
208
+ return settings.alt || $module.data(metadata.alt);
209
+ },
206
210
  icon: function () {
207
211
  return settings.icon || ($module.data(metadata.icon) !== undefined
208
212
  ? $module.data(metadata.icon)
@@ -288,6 +292,7 @@
288
292
  .removeData(metadata.id)
289
293
  .removeData(metadata.icon)
290
294
  .removeData(metadata.placeholder)
295
+ .removeData(metadata.alt)
291
296
  .removeData(metadata.source)
292
297
  .removeData(metadata.url)
293
298
  ;
@@ -440,7 +445,9 @@
440
445
  });
441
446
  }
442
447
  clearTimeout(module.performance.timer);
443
- module.performance.timer = setTimeout(function () { module.performance.display(); }, 500);
448
+ module.performance.timer = setTimeout(function () {
449
+ module.performance.display();
450
+ }, 500);
444
451
  },
445
452
  display: function () {
446
453
  var
@@ -555,6 +562,8 @@
555
562
  source: false,
556
563
  url: false,
557
564
  id: false,
565
+ placeholder: false,
566
+ alt: false,
558
567
 
559
568
  // standard video settings
560
569
  autoplay: 'auto',
@@ -577,6 +586,7 @@
577
586
  id: 'id',
578
587
  icon: 'icon',
579
588
  placeholder: 'placeholder',
589
+ alt: 'alt',
580
590
  source: 'source',
581
591
  url: 'url',
582
592
  },
@@ -652,7 +662,7 @@
652
662
  + ' width="100%" height="100%"'
653
663
  + ' msallowFullScreen allowFullScreen></iframe>';
654
664
  },
655
- placeholder: function (image, icon) {
665
+ placeholder: function (image, icon, alt) {
656
666
  var
657
667
  html = '',
658
668
  deQuote = $.fn.embed.settings.templates.deQuote
@@ -661,7 +671,7 @@
661
671
  html += '<i class="' + deQuote(icon) + ' icon"></i>';
662
672
  }
663
673
  if (image) {
664
- html += '<img class="placeholder" src="' + deQuote(image) + '">';
674
+ html += '<img class="placeholder" src="' + deQuote(image) + (alt ? '" alt="' + deQuote(alt) : '') + '">';
665
675
  }
666
676
 
667
677
  return html;