fomantic-ui 2.9.3-beta.16 → 2.9.3-beta.17

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 (165) hide show
  1. package/dist/components/accordion.css +1 -1
  2. package/dist/components/accordion.js +1 -1
  3. package/dist/components/accordion.min.css +1 -1
  4. package/dist/components/accordion.min.js +1 -1
  5. package/dist/components/ad.css +1 -1
  6. package/dist/components/ad.min.css +1 -1
  7. package/dist/components/api.js +1 -1
  8. package/dist/components/api.min.js +1 -1
  9. package/dist/components/breadcrumb.css +1 -1
  10. package/dist/components/breadcrumb.min.css +1 -1
  11. package/dist/components/button.css +1 -1
  12. package/dist/components/button.min.css +1 -1
  13. package/dist/components/calendar.css +1 -1
  14. package/dist/components/calendar.js +1 -1
  15. package/dist/components/calendar.min.css +1 -1
  16. package/dist/components/calendar.min.js +1 -1
  17. package/dist/components/card.css +1 -1
  18. package/dist/components/card.min.css +1 -1
  19. package/dist/components/checkbox.css +1 -1
  20. package/dist/components/checkbox.js +1 -1
  21. package/dist/components/checkbox.min.css +1 -1
  22. package/dist/components/checkbox.min.js +1 -1
  23. package/dist/components/comment.css +1 -1
  24. package/dist/components/comment.min.css +1 -1
  25. package/dist/components/container.css +1 -1
  26. package/dist/components/container.min.css +1 -1
  27. package/dist/components/dimmer.css +1 -1
  28. package/dist/components/dimmer.js +1 -1
  29. package/dist/components/dimmer.min.css +1 -1
  30. package/dist/components/dimmer.min.js +1 -1
  31. package/dist/components/divider.css +1 -1
  32. package/dist/components/divider.min.css +1 -1
  33. package/dist/components/dropdown.css +1 -1
  34. package/dist/components/dropdown.js +1 -1
  35. package/dist/components/dropdown.min.css +1 -1
  36. package/dist/components/dropdown.min.js +1 -1
  37. package/dist/components/embed.css +1 -1
  38. package/dist/components/embed.js +1 -1
  39. package/dist/components/embed.min.css +1 -1
  40. package/dist/components/embed.min.js +1 -1
  41. package/dist/components/emoji.css +1 -1
  42. package/dist/components/emoji.min.css +1 -1
  43. package/dist/components/feed.css +1 -1
  44. package/dist/components/feed.min.css +1 -1
  45. package/dist/components/flag.css +1 -1
  46. package/dist/components/flag.min.css +1 -1
  47. package/dist/components/flyout.css +1 -1
  48. package/dist/components/flyout.js +1 -1
  49. package/dist/components/flyout.min.css +1 -1
  50. package/dist/components/flyout.min.js +1 -1
  51. package/dist/components/form.css +2 -16
  52. package/dist/components/form.js +48 -25
  53. package/dist/components/form.min.css +2 -2
  54. package/dist/components/form.min.js +2 -2
  55. package/dist/components/grid.css +1 -1
  56. package/dist/components/grid.min.css +1 -1
  57. package/dist/components/header.css +1 -1
  58. package/dist/components/header.min.css +1 -1
  59. package/dist/components/icon.css +1 -1
  60. package/dist/components/icon.min.css +1 -1
  61. package/dist/components/image.css +1 -1
  62. package/dist/components/image.min.css +1 -1
  63. package/dist/components/input.css +1 -25
  64. package/dist/components/input.min.css +2 -2
  65. package/dist/components/item.css +1 -1
  66. package/dist/components/item.min.css +1 -1
  67. package/dist/components/label.css +1 -1
  68. package/dist/components/label.min.css +1 -1
  69. package/dist/components/list.css +1 -1
  70. package/dist/components/list.min.css +1 -1
  71. package/dist/components/loader.css +1 -1
  72. package/dist/components/loader.min.css +1 -1
  73. package/dist/components/menu.css +1 -1
  74. package/dist/components/menu.min.css +1 -1
  75. package/dist/components/message.css +1 -1
  76. package/dist/components/message.min.css +1 -1
  77. package/dist/components/modal.css +1 -1
  78. package/dist/components/modal.js +1 -1
  79. package/dist/components/modal.min.css +1 -1
  80. package/dist/components/modal.min.js +1 -1
  81. package/dist/components/nag.css +1 -1
  82. package/dist/components/nag.js +1 -1
  83. package/dist/components/nag.min.css +1 -1
  84. package/dist/components/nag.min.js +1 -1
  85. package/dist/components/placeholder.css +1 -1
  86. package/dist/components/placeholder.min.css +1 -1
  87. package/dist/components/popup.css +1 -1
  88. package/dist/components/popup.js +1 -1
  89. package/dist/components/popup.min.css +1 -1
  90. package/dist/components/popup.min.js +1 -1
  91. package/dist/components/progress.css +1 -1
  92. package/dist/components/progress.js +1 -1
  93. package/dist/components/progress.min.css +1 -1
  94. package/dist/components/progress.min.js +1 -1
  95. package/dist/components/rail.css +1 -1
  96. package/dist/components/rail.min.css +1 -1
  97. package/dist/components/rating.css +1 -1
  98. package/dist/components/rating.js +1 -1
  99. package/dist/components/rating.min.css +1 -1
  100. package/dist/components/rating.min.js +1 -1
  101. package/dist/components/reset.css +1 -1
  102. package/dist/components/reset.min.css +1 -1
  103. package/dist/components/reveal.css +1 -1
  104. package/dist/components/reveal.min.css +1 -1
  105. package/dist/components/search.css +1 -1
  106. package/dist/components/search.js +1 -1
  107. package/dist/components/search.min.css +1 -1
  108. package/dist/components/search.min.js +1 -1
  109. package/dist/components/segment.css +1 -1
  110. package/dist/components/segment.min.css +1 -1
  111. package/dist/components/shape.css +1 -1
  112. package/dist/components/shape.js +1 -1
  113. package/dist/components/shape.min.css +1 -1
  114. package/dist/components/shape.min.js +1 -1
  115. package/dist/components/sidebar.css +1 -1
  116. package/dist/components/sidebar.js +1 -1
  117. package/dist/components/sidebar.min.css +1 -1
  118. package/dist/components/sidebar.min.js +1 -1
  119. package/dist/components/site.css +1 -1
  120. package/dist/components/site.js +1 -1
  121. package/dist/components/site.min.css +1 -1
  122. package/dist/components/site.min.js +1 -1
  123. package/dist/components/slider.css +1 -1
  124. package/dist/components/slider.js +1 -1
  125. package/dist/components/slider.min.css +1 -1
  126. package/dist/components/slider.min.js +1 -1
  127. package/dist/components/state.js +1 -1
  128. package/dist/components/state.min.js +1 -1
  129. package/dist/components/statistic.css +1 -1
  130. package/dist/components/statistic.min.css +1 -1
  131. package/dist/components/step.css +1 -1
  132. package/dist/components/step.min.css +1 -1
  133. package/dist/components/sticky.css +1 -1
  134. package/dist/components/sticky.js +1 -1
  135. package/dist/components/sticky.min.css +1 -1
  136. package/dist/components/sticky.min.js +1 -1
  137. package/dist/components/tab.css +1 -1
  138. package/dist/components/tab.js +1 -1
  139. package/dist/components/tab.min.css +1 -1
  140. package/dist/components/tab.min.js +1 -1
  141. package/dist/components/table.css +1 -1
  142. package/dist/components/table.min.css +1 -1
  143. package/dist/components/text.css +1 -1
  144. package/dist/components/text.min.css +1 -1
  145. package/dist/components/toast.css +1 -1
  146. package/dist/components/toast.js +1 -1
  147. package/dist/components/toast.min.css +1 -1
  148. package/dist/components/toast.min.js +1 -1
  149. package/dist/components/transition.css +1 -1
  150. package/dist/components/transition.js +1 -1
  151. package/dist/components/transition.min.css +1 -1
  152. package/dist/components/transition.min.js +1 -1
  153. package/dist/components/visibility.js +1 -1
  154. package/dist/components/visibility.min.js +1 -1
  155. package/dist/semantic.css +54 -98
  156. package/dist/semantic.js +73 -50
  157. package/dist/semantic.min.css +2 -2
  158. package/dist/semantic.min.js +2 -2
  159. package/package.json +1 -1
  160. package/src/definitions/behaviors/form.js +47 -24
  161. package/src/definitions/collections/form.less +1 -8
  162. package/src/themes/default/globals/variation.variables +1 -1
  163. package/tasks/admin/distributions/create.js +8 -3
  164. package/tasks/config/project/install.js +3 -0
  165. package/tasks/install.js +15 -5
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fomantic-ui",
3
- "version": "2.9.3-beta.16+7986b3f",
3
+ "version": "2.9.3-beta.17+5e5da5d",
4
4
  "description": "Fomantic empowers designers and developers by creating a shared vocabulary for UI.",
5
5
  "keywords": [
6
6
  "fomantic-ui",
@@ -77,6 +77,7 @@
77
77
  initialize: function () {
78
78
  // settings grabbed at run time
79
79
  module.get.settings();
80
+ $module.addClass(className.initial);
80
81
  if (methodInvoked) {
81
82
  if (instance === undefined) {
82
83
  module.instantiate();
@@ -130,10 +131,13 @@
130
131
  module.bindEvents();
131
132
  },
132
133
 
133
- submit: function () {
134
+ submit: function (event) {
134
135
  module.verbose('Submitting form', $module);
135
136
  submitting = true;
136
137
  $module.trigger('submit');
138
+ if (event) {
139
+ event.preventDefault();
140
+ }
137
141
  },
138
142
 
139
143
  attachEvents: function (selector, action) {
@@ -159,6 +163,7 @@
159
163
  .on('click' + eventNamespace, selector.reset, module.reset)
160
164
  .on('click' + eventNamespace, selector.clear, module.clear)
161
165
  ;
166
+ $field.on('invalid' + eventNamespace, module.event.field.invalid);
162
167
  if (settings.keyboardShortcuts) {
163
168
  $module.on('keydown' + eventNamespace, selector.field, module.event.field.keydown);
164
169
  }
@@ -274,8 +279,12 @@
274
279
  var
275
280
  allValid = true
276
281
  ;
277
- $.each(validation, function (fieldName, field) {
278
- 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)) {
279
288
  allValid = false;
280
289
  }
281
290
  });
@@ -431,9 +440,8 @@
431
440
  if (!event.ctrlKey && key === keyCode.enter && isInput && !isInDropdown && !isCheckbox) {
432
441
  if (!keyHeldDown) {
433
442
  $field.one('keyup' + eventNamespace, module.event.field.keyup);
434
- module.submit();
443
+ module.submit(event);
435
444
  module.debug('Enter pressed on input submitting form');
436
- event.preventDefault();
437
445
  }
438
446
  keyHeldDown = true;
439
447
  }
@@ -441,15 +449,18 @@
441
449
  keyup: function () {
442
450
  keyHeldDown = false;
443
451
  },
452
+ invalid: function (event) {
453
+ event.preventDefault();
454
+ },
444
455
  blur: function (event) {
445
456
  var
446
457
  $field = $(this),
447
- $fieldGroup = $field.closest($group),
448
- validationRules = module.get.validation($field)
458
+ validationRules = module.get.validation($field) || {},
459
+ identifier = module.get.identifier(validationRules, $field)
449
460
  ;
450
- if (validationRules && (settings.on === 'blur' || ($fieldGroup.hasClass(className.error) && settings.revalidate))) {
461
+ if (settings.on === 'blur' || (!$module.hasClass(className.initial) && settings.revalidate)) {
451
462
  module.debug('Revalidating field', $field, validationRules);
452
- module.validate.field(validationRules);
463
+ module.validate.field(validationRules, identifier);
453
464
  if (!settings.inline) {
454
465
  module.validate.form(false, true);
455
466
  }
@@ -458,14 +469,14 @@
458
469
  change: function (event) {
459
470
  var
460
471
  $field = $(this),
461
- $fieldGroup = $field.closest($group),
462
- validationRules = module.get.validation($field)
472
+ validationRules = module.get.validation($field) || {},
473
+ identifier = module.get.identifier(validationRules, $field)
463
474
  ;
464
- if (validationRules && (settings.on === 'change' || ($fieldGroup.hasClass(className.error) && settings.revalidate))) {
475
+ if (settings.on === 'change' || (!$module.hasClass(className.initial) && settings.revalidate)) {
465
476
  clearTimeout(module.timer);
466
477
  module.timer = setTimeout(function () {
467
478
  module.debug('Revalidating field', $field, validationRules);
468
- module.validate.field(validationRules);
479
+ module.validate.field(validationRules, identifier);
469
480
  if (!settings.inline) {
470
481
  module.validate.form(false, true);
471
482
  }
@@ -531,6 +542,9 @@
531
542
 
532
543
  return fullFields;
533
544
  },
545
+ identifier: function (validation, $el) {
546
+ return validation.identifier || $el.attr('id') || $el.attr('name') || $el.data(metadata.validate);
547
+ },
534
548
  prompt: function (rule, field) {
535
549
  var
536
550
  ruleName = module.get.ruleName(rule),
@@ -974,7 +988,7 @@
974
988
  $message.empty();
975
989
  },
976
990
  states: function () {
977
- $module.removeClass(className.error).removeClass(className.success);
991
+ $module.removeClass(className.error).removeClass(className.success).addClass(className.initial);
978
992
  if (!settings.inline) {
979
993
  module.remove.errors();
980
994
  }
@@ -1211,7 +1225,7 @@
1211
1225
  return rule.type === 'empty';
1212
1226
  }) !== 0
1213
1227
  : false,
1214
- identifier = validation.identifier || $el.attr('id') || $el.attr('name') || $el.data(metadata.validate)
1228
+ identifier = module.get.identifier(validation, $el)
1215
1229
  ;
1216
1230
  if (isRequired && !isDisabled && !hasEmptyRule && identifier !== undefined) {
1217
1231
  if (isCheckbox) {
@@ -1243,7 +1257,7 @@
1243
1257
  if (keyHeldDown) {
1244
1258
  return false;
1245
1259
  }
1246
-
1260
+ $module.removeClass(className.initial);
1247
1261
  // reset errors
1248
1262
  formErrors = [];
1249
1263
  if (module.determine.isValid()) {
@@ -1315,13 +1329,24 @@
1315
1329
  ? module.get.field(field.depends)
1316
1330
  : false,
1317
1331
  fieldValid = true,
1318
- fieldErrors = []
1332
+ fieldErrors = [],
1333
+ isDisabled = $field.filter(':not(:disabled)').length === 0,
1334
+ validationMessage = $field[0].validationMessage
1319
1335
  ;
1320
1336
  if (!field.identifier) {
1321
1337
  module.debug('Using field name as identifier', identifier);
1322
1338
  field.identifier = identifier;
1323
1339
  }
1324
- 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
+ }
1325
1350
  if (isDisabled) {
1326
1351
  module.debug('Field is disabled. Skipping', identifier);
1327
1352
  } else if (field.optional && module.is.blank($field)) {
@@ -1329,9 +1354,6 @@
1329
1354
  } else if (field.depends && module.is.empty($dependsField)) {
1330
1355
  module.debug('Field depends on another value that is not present or empty. Skipping', $dependsField);
1331
1356
  } else if (field.rules !== undefined) {
1332
- if (showErrors) {
1333
- $field.closest($group).removeClass(className.error);
1334
- }
1335
1357
  $.each(field.rules, function (index, rule) {
1336
1358
  if (module.has.field(identifier)) {
1337
1359
  var invalidFields = module.validate.rule(field, rule, true) || [];
@@ -1348,7 +1370,7 @@
1348
1370
  }
1349
1371
  if (fieldValid) {
1350
1372
  if (showErrors) {
1351
- module.remove.prompt(identifier, fieldErrors);
1373
+ module.remove.prompt(identifier);
1352
1374
  settings.onValid.call($field);
1353
1375
  }
1354
1376
  } else {
@@ -1638,8 +1660,8 @@
1638
1660
  isExactly: '{name} must be exactly "{ruleValue}"',
1639
1661
  not: '{name} cannot be set to "{ruleValue}"',
1640
1662
  notExactly: '{name} cannot be set to exactly "{ruleValue}"',
1641
- contain: '{name} must contain "{ruleValue}"',
1642
- containExactly: '{name} must contain exactly "{ruleValue}"',
1663
+ contains: '{name} must contain "{ruleValue}"',
1664
+ containsExactly: '{name} must contain exactly "{ruleValue}"',
1643
1665
  doesntContain: '{name} cannot contain "{ruleValue}"',
1644
1666
  doesntContainExactly: '{name} cannot contain exactly "{ruleValue}"',
1645
1667
  minLength: '{name} must be at least {ruleValue} characters',
@@ -1673,6 +1695,7 @@
1673
1695
  },
1674
1696
 
1675
1697
  className: {
1698
+ initial: 'initial',
1676
1699
  error: 'error',
1677
1700
  label: 'ui basic red pointing prompt label',
1678
1701
  pressed: 'down',
@@ -585,14 +585,7 @@
585
585
  box-shadow: @formStates[@@state][boxShadow];
586
586
  }
587
587
  & when (@state=error) and (@variationFormInvalid) {
588
- .ui.form .field input:not(:placeholder-shown):invalid {
589
- color: @c;
590
- background: @bg;
591
- border-color: @formStates[@@state][borderColor];
592
- border-radius: @formStates[@@state][borderRadius];
593
- box-shadow: @formStates[@@state][boxShadow];
594
- }
595
- .ui.form .field input:not(:-ms-input-placeholder):invalid when (@supportIE) {
588
+ .ui.form:not(.initial) .field input:invalid {
596
589
  color: @c;
597
590
  background: @bg;
598
591
  border-color: @formStates[@@state][borderColor];
@@ -127,7 +127,7 @@
127
127
  @variationInputDisabled: true;
128
128
  @variationInputInverted: true;
129
129
  @variationInputStates: @variationAllStates;
130
- @variationInputInvalid: true;
130
+ @variationInputInvalid: false;
131
131
  @variationInputTransparent: true;
132
132
  @variationInputCorner: true;
133
133
  @variationInputLoading: true;
@@ -3,7 +3,7 @@
3
3
  *******************************/
4
4
 
5
5
  /*
6
- This will create individual distribution repositories for each SUI distribution
6
+ This will create individual distribution repositories for each FUI distribution
7
7
 
8
8
  * copy distribution files to release
9
9
  * update package.json file
@@ -153,6 +153,8 @@ module.exports = function (callback) {
153
153
  tasks.push(function () {
154
154
  let
155
155
  definitions,
156
+ overridesImport,
157
+ lessImport,
156
158
  themeImport,
157
159
  themeConfig,
158
160
  siteTheme,
@@ -161,7 +163,10 @@ module.exports = function (callback) {
161
163
  definitions = gulp.src('src/definitions/**/*', { base: 'src/' })
162
164
  .pipe(gulp.dest(outputDirectory))
163
165
  ;
164
- themeImport = gulp.src('src/semantic.less', { base: 'src/' })
166
+ overridesImport = gulp.src('src/overrides.less', { base: 'src/' })
167
+ .pipe(gulp.dest(outputDirectory))
168
+ ;
169
+ lessImport = gulp.src('src/semantic.less', { base: 'src/' })
165
170
  .pipe(gulp.dest(outputDirectory))
166
171
  ;
167
172
  themeImport = gulp.src('src/theme.less', { base: 'src/' })
@@ -177,7 +182,7 @@ module.exports = function (callback) {
177
182
  .pipe(gulp.dest(outputDirectory))
178
183
  ;
179
184
 
180
- return mergeStream(definitions, themeImport, themeConfig, siteTheme, themes);
185
+ return mergeStream(definitions, overridesImport, lessImport, themeImport, themeConfig, siteTheme, themes);
181
186
  });
182
187
  }
183
188
 
@@ -240,6 +240,7 @@ module.exports = {
240
240
  config: './semantic.json.example',
241
241
  definitions: './src/definitions',
242
242
  gulpFile: './gulpfile.js',
243
+ overridesImport: './src/overrides.less',
243
244
  lessImport: './src/semantic.less',
244
245
  site: './src/_site',
245
246
  tasks: './tasks',
@@ -253,6 +254,7 @@ module.exports = {
253
254
  // expected final filenames
254
255
  files: {
255
256
  config: 'semantic.json',
257
+ overridesImport: 'src/overrides.less',
256
258
  lessImport: 'src/semantic.less',
257
259
  site: 'src/site',
258
260
  themeConfig: 'src/theme.config',
@@ -263,6 +265,7 @@ module.exports = {
263
265
  folders: {
264
266
  config: './',
265
267
  definitions: 'src/definitions/',
268
+ overridesImport: 'src/',
266
269
  lessImport: 'src/',
267
270
  modules: 'node_modules/',
268
271
  site: 'src/site/',
package/tasks/install.js CHANGED
@@ -69,9 +69,9 @@ module.exports = function (callback) {
69
69
  root: path.normalize(__dirname + '/../'),
70
70
  }; */
71
71
 
72
- /* Don't do end user config if SUI is a sub-module */
72
+ /* Don't do end user config if FUI is a sub-module */
73
73
  if (install.isSubModule()) {
74
- console.info('SUI is a sub-module, skipping end-user install');
74
+ console.info('FUI is a sub-module, skipping end-user install');
75
75
  callback();
76
76
 
77
77
  return;
@@ -86,7 +86,7 @@ module.exports = function (callback) {
86
86
  }
87
87
 
88
88
  /* -----------------
89
- Update SUI
89
+ Update FUI
90
90
  ----------------- */
91
91
 
92
92
  // run update scripts if semantic.json exists
@@ -96,6 +96,7 @@ module.exports = function (callback) {
96
96
  updatePaths = {
97
97
  config: path.join(manager.root, files.config),
98
98
  tasks: path.join(updateFolder, folders.tasks),
99
+ overridesImport: path.join(updateFolder, folders.overridesImport),
99
100
  themeImport: path.join(updateFolder, folders.themeImport),
100
101
  definition: path.join(currentConfig.paths.source.definitions),
101
102
  site: path.join(currentConfig.paths.source.site),
@@ -132,7 +133,11 @@ module.exports = function (callback) {
132
133
  .pipe(plumber())
133
134
  .pipe(gulp.dest(updatePaths.themeImport))
134
135
  ;
135
-
136
+ console.info('Updating overrides import file');
137
+ gulp.src(source.overridesImport)
138
+ .pipe(plumber())
139
+ .pipe(gulp.dest(updatePaths.overridesImport))
140
+ ;
136
141
  console.info('Adding new site theme files...');
137
142
  wrench.copyDirSyncRecursive(source.site, updatePaths.site, settings.wrench.merge);
138
143
 
@@ -187,7 +192,7 @@ module.exports = function (callback) {
187
192
  }
188
193
 
189
194
  /* --------------
190
- Create SUI
195
+ Create FUI
191
196
  --------------- */
192
197
 
193
198
  gulp.task('run setup', function (callback) {
@@ -263,6 +268,7 @@ module.exports = function (callback) {
263
268
  // special install paths only for PM install
264
269
  installPaths = extend(false, {}, installPaths, {
265
270
  definition: folders.definitions,
271
+ overridesImport: folders.overridesImport,
266
272
  lessImport: folders.lessImport,
267
273
  tasks: folders.tasks,
268
274
  theme: folders.themes,
@@ -311,6 +317,10 @@ module.exports = function (callback) {
311
317
  .pipe(plumber())
312
318
  .pipe(gulp.dest(installPaths.themeImport))
313
319
  ;
320
+ gulp.src(source.overridesImport)
321
+ .pipe(plumber())
322
+ .pipe(gulp.dest(installPaths.overridesImport))
323
+ ;
314
324
  gulp.src(source.lessImport)
315
325
  .pipe(plumber())
316
326
  .pipe(gulp.dest(installPaths.lessImport))