less 2.1.1 → 2.3.1

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 (333) hide show
  1. package/.idea/inspectionProfiles/Project_Default.xml +1 -0
  2. package/.idea/jsLinters/jscs.xml +4 -0
  3. package/.idea/jsLinters/jshint.xml +58 -4
  4. package/.idea/workspace.xml +451 -758
  5. package/.jscsrc +38 -0
  6. package/.jshintrc +0 -2
  7. package/.travis.yml +0 -1
  8. package/CHANGELOG.md +52 -0
  9. package/Gruntfile.js +37 -3
  10. package/bin/lessc +380 -316
  11. package/bower.json +1 -1
  12. package/dist/less.js +790 -479
  13. package/dist/less.min.js +7 -7
  14. package/lib/less/contexts.js +1 -1
  15. package/lib/less/data/unit-conversions.js +3 -3
  16. package/lib/less/environment/abstract-file-manager.js +4 -4
  17. package/lib/less/environment/environment.js +9 -0
  18. package/lib/less/functions/color-blending.js +3 -3
  19. package/lib/less/functions/color.js +8 -8
  20. package/lib/less/functions/data-uri.js +39 -31
  21. package/lib/less/functions/string.js +3 -1
  22. package/lib/less/functions/svg.js +12 -15
  23. package/lib/less/functions/types.js +15 -2
  24. package/lib/less/import-manager.js +10 -5
  25. package/lib/less/index.js +2 -1
  26. package/lib/less/parse-tree.js +8 -2
  27. package/lib/less/parse.js +65 -0
  28. package/lib/less/parser/parser-input.js +3 -2
  29. package/lib/less/parser/parser.js +24 -11
  30. package/lib/less/render.js +7 -36
  31. package/lib/less/source-map-output.js +3 -3
  32. package/lib/less/transform-tree.js +1 -1
  33. package/lib/less/tree/assignment.js +0 -1
  34. package/lib/less/tree/color.js +4 -4
  35. package/lib/less/tree/condition.js +1 -1
  36. package/lib/less/tree/debug-info.js +6 -2
  37. package/lib/less/tree/dimension.js +1 -1
  38. package/lib/less/tree/directive.js +25 -6
  39. package/lib/less/tree/expression.js +1 -1
  40. package/lib/less/tree/import.js +2 -2
  41. package/lib/less/tree/index.js +1 -0
  42. package/lib/less/tree/media.js +3 -2
  43. package/lib/less/tree/mixin-call.js +3 -4
  44. package/lib/less/tree/mixin-definition.js +4 -3
  45. package/lib/less/tree/quoted.js +1 -1
  46. package/lib/less/tree/rule.js +2 -3
  47. package/lib/less/tree/ruleset.js +263 -157
  48. package/lib/less/tree/selector.js +2 -1
  49. package/lib/less/tree/url.js +5 -2
  50. package/lib/less/tree/value.js +1 -1
  51. package/lib/less/tree/variable.js +1 -1
  52. package/lib/less/visitors/extend-visitor.js +60 -25
  53. package/lib/less/visitors/import-sequencer.js +20 -14
  54. package/lib/less/visitors/import-visitor.js +13 -10
  55. package/lib/less/visitors/to-css-visitor.js +37 -5
  56. package/lib/less-browser/add-default-options.js +5 -1
  57. package/lib/less-browser/bootstrap.js +10 -8
  58. package/lib/less-browser/cache.js +1 -1
  59. package/lib/less-browser/index.js +13 -12
  60. package/lib/less-browser/utils.js +9 -6
  61. package/lib/less-node/file-manager.js +51 -28
  62. package/lib/less-node/image-size.js +34 -0
  63. package/lib/less-node/index.js +3 -0
  64. package/lib/less-node/lessc-helper.js +3 -2
  65. package/lib/less-node/url-file-manager.js +2 -2
  66. package/lib/less-rhino/index.js +2 -4
  67. package/package.json +10 -7
  68. package/test/browser/common.js +13 -11
  69. package/test/browser/css/urls.css +6 -3
  70. package/test/browser/jasmine-jsreporter.js +2 -3
  71. package/test/browser/less/nested-gradient-with-svg-gradient/mixin-consumer.less +5 -0
  72. package/test/browser/less/nested-gradient-with-svg-gradient/svg-gradient-mixin.less +15 -0
  73. package/test/browser/less/urls.less +1 -0
  74. package/test/browser/less.js +15 -9424
  75. package/test/browser/runner-errors-options.js +0 -1
  76. package/test/browser/runner-errors-spec.js +0 -1
  77. package/test/browser/runner-legacy-options.js +0 -1
  78. package/test/browser/runner-no-js-errors-spec.js +0 -1
  79. package/test/browser/runner-production-options.js +0 -1
  80. package/test/browser/runner-relative-urls-options.js +0 -1
  81. package/test/browser/runner-rootpath-options.js +0 -1
  82. package/test/browser/runner-rootpath-relative-options.js +0 -1
  83. package/test/browser/runner-strict-units-options.js +0 -1
  84. package/test/copy-bom.js +72 -0
  85. package/test/css/comments.css +1 -0
  86. package/test/css/css-3.css +2 -0
  87. package/test/css/functions.css +2 -0
  88. package/test/css/import-interpolation.css +6 -0
  89. package/test/css/import-reference.css +25 -0
  90. package/test/css/include-path/include-path.css +6 -0
  91. package/test/css/mixins-important.css +6 -0
  92. package/test/css/selectors.css +10 -1
  93. package/test/css/url-args/urls.css +3 -3
  94. package/test/css/urls.css +12 -4
  95. package/test/css/variables.css +7 -1
  96. package/test/data/image.svg +3 -0
  97. package/test/index.js +14 -10
  98. package/test/less/comments.less +1 -0
  99. package/test/less/css-3.less +3 -0
  100. package/test/less/css-guards.less +2 -1
  101. package/test/less/errors/detached-ruleset-2.txt +1 -1
  102. package/test/less/errors/import-missing.txt +1 -1
  103. package/test/less/errors/parens-error-1.txt +1 -1
  104. package/test/less/errors/parens-error-2.txt +1 -1
  105. package/test/less/errors/parens-error-3.txt +1 -1
  106. package/test/less/errors/single-character.less +1 -0
  107. package/test/less/errors/single-character.txt +2 -0
  108. package/test/less/functions.less +5 -0
  109. package/test/less/import/import-interpolation.less +1 -0
  110. package/test/less/import/import-reference.less +38 -0
  111. package/test/less/import-reference.less +3 -1
  112. package/test/less/import.less +2 -0
  113. package/test/less/include-path/include-path.less +6 -0
  114. package/test/less/mixins-important.less +12 -0
  115. package/test/less/nested-gradient-with-svg-gradient/mixin-consumer.less +5 -0
  116. package/test/less/nested-gradient-with-svg-gradient/svg-gradient-mixin.less +15 -0
  117. package/test/less/selectors.less +19 -4
  118. package/test/less/urls.less +10 -1
  119. package/test/less/variables.less +17 -3
  120. package/test/less-bom/charsets.less +3 -0
  121. package/test/less-bom/colors.less +98 -0
  122. package/test/less-bom/comments.less +102 -0
  123. package/test/less-bom/comments2.less +20 -0
  124. package/test/less-bom/compression/compression.less +36 -0
  125. package/test/less-bom/css-3.less +154 -0
  126. package/test/less-bom/css-escapes.less +33 -0
  127. package/test/less-bom/css-guards.less +103 -0
  128. package/test/less-bom/css.less +108 -0
  129. package/test/less-bom/debug/import/test.less +25 -0
  130. package/test/less-bom/debug/linenumbers.less +33 -0
  131. package/test/less-bom/detached-rulesets.less +103 -0
  132. package/test/less-bom/empty.less +1 -0
  133. package/test/less-bom/errors/add-mixed-units.less +3 -0
  134. package/test/less-bom/errors/add-mixed-units.txt +4 -0
  135. package/test/less-bom/errors/add-mixed-units2.less +3 -0
  136. package/test/less-bom/errors/add-mixed-units2.txt +4 -0
  137. package/test/less-bom/errors/at-rules-undefined-var.less +4 -0
  138. package/test/less-bom/errors/at-rules-undefined-var.txt +4 -0
  139. package/test/less-bom/errors/bad-variable-declaration1.less +1 -0
  140. package/test/less-bom/errors/bad-variable-declaration1.txt +2 -0
  141. package/test/less-bom/errors/color-func-invalid-color.less +3 -0
  142. package/test/less-bom/errors/color-func-invalid-color.txt +4 -0
  143. package/test/less-bom/errors/color-invalid-hex-code.less +3 -0
  144. package/test/less-bom/errors/color-invalid-hex-code.txt +4 -0
  145. package/test/less-bom/errors/color-invalid-hex-code2.less +3 -0
  146. package/test/less-bom/errors/color-invalid-hex-code2.txt +4 -0
  147. package/test/less-bom/errors/css-guard-default-func.less +4 -0
  148. package/test/less-bom/errors/css-guard-default-func.txt +4 -0
  149. package/test/less-bom/errors/detached-ruleset-1.less +6 -0
  150. package/test/less-bom/errors/detached-ruleset-1.txt +4 -0
  151. package/test/less-bom/errors/detached-ruleset-2.less +6 -0
  152. package/test/less-bom/errors/detached-ruleset-2.txt +4 -0
  153. package/test/less-bom/errors/detached-ruleset-3.less +4 -0
  154. package/test/less-bom/errors/detached-ruleset-3.txt +4 -0
  155. package/test/less-bom/errors/detached-ruleset-4.less +5 -0
  156. package/test/less-bom/errors/detached-ruleset-4.txt +4 -0
  157. package/test/less-bom/errors/detached-ruleset-5.less +4 -0
  158. package/test/less-bom/errors/detached-ruleset-5.txt +3 -0
  159. package/test/less-bom/errors/detached-ruleset-6.less +5 -0
  160. package/test/less-bom/errors/detached-ruleset-6.txt +4 -0
  161. package/test/less-bom/errors/divide-mixed-units.less +3 -0
  162. package/test/less-bom/errors/divide-mixed-units.txt +4 -0
  163. package/test/less-bom/errors/extend-no-selector.less +3 -0
  164. package/test/less-bom/errors/extend-no-selector.txt +3 -0
  165. package/test/less-bom/errors/extend-not-at-end.less +3 -0
  166. package/test/less-bom/errors/extend-not-at-end.txt +3 -0
  167. package/test/less-bom/errors/import-malformed.less +1 -0
  168. package/test/less-bom/errors/import-malformed.txt +3 -0
  169. package/test/less-bom/errors/import-missing.less +6 -0
  170. package/test/less-bom/errors/import-missing.txt +3 -0
  171. package/test/less-bom/errors/import-no-semi.less +1 -0
  172. package/test/less-bom/errors/import-no-semi.txt +2 -0
  173. package/test/less-bom/errors/import-subfolder1.less +1 -0
  174. package/test/less-bom/errors/import-subfolder1.txt +3 -0
  175. package/test/less-bom/errors/import-subfolder2.less +1 -0
  176. package/test/less-bom/errors/import-subfolder2.txt +4 -0
  177. package/test/less-bom/errors/imports/import-subfolder1.less +1 -0
  178. package/test/less-bom/errors/imports/import-subfolder2.less +1 -0
  179. package/test/less-bom/errors/imports/import-test.less +4 -0
  180. package/test/less-bom/errors/imports/subfolder/mixin-not-defined.less +1 -0
  181. package/test/less-bom/errors/imports/subfolder/parse-error-curly-bracket.less +1 -0
  182. package/test/less-bom/errors/javascript-error.less +3 -0
  183. package/test/less-bom/errors/javascript-error.txt +4 -0
  184. package/test/less-bom/errors/javascript-undefined-var.less +3 -0
  185. package/test/less-bom/errors/javascript-undefined-var.txt +4 -0
  186. package/test/less-bom/errors/mixed-mixin-definition-args-1.less +6 -0
  187. package/test/less-bom/errors/mixed-mixin-definition-args-1.txt +4 -0
  188. package/test/less-bom/errors/mixed-mixin-definition-args-2.less +6 -0
  189. package/test/less-bom/errors/mixed-mixin-definition-args-2.txt +4 -0
  190. package/test/less-bom/errors/mixin-not-defined.less +11 -0
  191. package/test/less-bom/errors/mixin-not-defined.txt +3 -0
  192. package/test/less-bom/errors/mixin-not-matched.less +6 -0
  193. package/test/less-bom/errors/mixin-not-matched.txt +3 -0
  194. package/test/less-bom/errors/mixin-not-matched2.less +6 -0
  195. package/test/less-bom/errors/mixin-not-matched2.txt +3 -0
  196. package/test/less-bom/errors/mixin-not-visible-in-scope-1.less +9 -0
  197. package/test/less-bom/errors/mixin-not-visible-in-scope-1.txt +4 -0
  198. package/test/less-bom/errors/mixins-guards-default-func-1.less +9 -0
  199. package/test/less-bom/errors/mixins-guards-default-func-1.txt +4 -0
  200. package/test/less-bom/errors/mixins-guards-default-func-2.less +9 -0
  201. package/test/less-bom/errors/mixins-guards-default-func-2.txt +4 -0
  202. package/test/less-bom/errors/mixins-guards-default-func-3.less +9 -0
  203. package/test/less-bom/errors/mixins-guards-default-func-3.txt +4 -0
  204. package/test/less-bom/errors/multiple-guards-on-css-selectors.less +4 -0
  205. package/test/less-bom/errors/multiple-guards-on-css-selectors.txt +4 -0
  206. package/test/less-bom/errors/multiple-guards-on-css-selectors2.less +4 -0
  207. package/test/less-bom/errors/multiple-guards-on-css-selectors2.txt +4 -0
  208. package/test/less-bom/errors/multiply-mixed-units.less +7 -0
  209. package/test/less-bom/errors/multiply-mixed-units.txt +4 -0
  210. package/test/less-bom/errors/parens-error-1.less +3 -0
  211. package/test/less-bom/errors/parens-error-1.txt +4 -0
  212. package/test/less-bom/errors/parens-error-2.less +3 -0
  213. package/test/less-bom/errors/parens-error-2.txt +4 -0
  214. package/test/less-bom/errors/parens-error-3.less +3 -0
  215. package/test/less-bom/errors/parens-error-3.txt +4 -0
  216. package/test/less-bom/errors/parse-error-curly-bracket.less +4 -0
  217. package/test/less-bom/errors/parse-error-curly-bracket.txt +4 -0
  218. package/test/less-bom/errors/parse-error-extra-parens.less +5 -0
  219. package/test/less-bom/errors/parse-error-extra-parens.txt +3 -0
  220. package/test/less-bom/errors/parse-error-missing-bracket.less +2 -0
  221. package/test/less-bom/errors/parse-error-missing-bracket.txt +3 -0
  222. package/test/less-bom/errors/parse-error-missing-parens.less +5 -0
  223. package/test/less-bom/errors/parse-error-missing-parens.txt +3 -0
  224. package/test/less-bom/errors/parse-error-with-import.less +13 -0
  225. package/test/less-bom/errors/parse-error-with-import.txt +4 -0
  226. package/test/less-bom/errors/percentage-missing-space.less +3 -0
  227. package/test/less-bom/errors/percentage-missing-space.txt +4 -0
  228. package/test/less-bom/errors/property-asterisk-only-name.less +3 -0
  229. package/test/less-bom/errors/property-asterisk-only-name.txt +4 -0
  230. package/test/less-bom/errors/property-ie5-hack.less +3 -0
  231. package/test/less-bom/errors/property-ie5-hack.txt +3 -0
  232. package/test/less-bom/errors/property-in-root.less +4 -0
  233. package/test/less-bom/errors/property-in-root.txt +4 -0
  234. package/test/less-bom/errors/property-in-root2.less +1 -0
  235. package/test/less-bom/errors/property-in-root2.txt +4 -0
  236. package/test/less-bom/errors/property-in-root3.less +4 -0
  237. package/test/less-bom/errors/property-in-root3.txt +3 -0
  238. package/test/less-bom/errors/property-interp-not-defined.less +1 -0
  239. package/test/less-bom/errors/property-interp-not-defined.txt +2 -0
  240. package/test/less-bom/errors/recursive-variable.less +1 -0
  241. package/test/less-bom/errors/recursive-variable.txt +2 -0
  242. package/test/less-bom/errors/single-character.less +1 -0
  243. package/test/less-bom/errors/single-character.txt +2 -0
  244. package/test/less-bom/errors/svg-gradient1.less +3 -0
  245. package/test/less-bom/errors/svg-gradient1.txt +4 -0
  246. package/test/less-bom/errors/svg-gradient2.less +3 -0
  247. package/test/less-bom/errors/svg-gradient2.txt +4 -0
  248. package/test/less-bom/errors/svg-gradient3.less +3 -0
  249. package/test/less-bom/errors/svg-gradient3.txt +4 -0
  250. package/test/less-bom/errors/unit-function.less +3 -0
  251. package/test/less-bom/errors/unit-function.txt +4 -0
  252. package/test/less-bom/extend-chaining.less +91 -0
  253. package/test/less-bom/extend-clearfix.less +19 -0
  254. package/test/less-bom/extend-exact.less +46 -0
  255. package/test/less-bom/extend-media.less +24 -0
  256. package/test/less-bom/extend-nest.less +65 -0
  257. package/test/less-bom/extend-selector.less +99 -0
  258. package/test/less-bom/extend.less +81 -0
  259. package/test/less-bom/extract-and-length.less +133 -0
  260. package/test/less-bom/functions.less +201 -0
  261. package/test/less-bom/globalVars/extended.json +5 -0
  262. package/test/less-bom/globalVars/extended.less +10 -0
  263. package/test/less-bom/globalVars/simple.json +3 -0
  264. package/test/less-bom/globalVars/simple.less +3 -0
  265. package/test/less-bom/ie-filters.less +15 -0
  266. package/test/less-bom/import/deeper/deeper-2/url-import-2.less +3 -0
  267. package/test/less-bom/import/deeper/deeper-2/url-import.less +1 -0
  268. package/test/less-bom/import/deeper/import-once-test-a.less +1 -0
  269. package/test/less-bom/import/deeper/url-import.less +1 -0
  270. package/test/less-bom/import/import-and-relative-paths-test.less +17 -0
  271. package/test/less-bom/import/import-charset-test.less +1 -0
  272. package/test/less-bom/import/import-interpolation.less +2 -0
  273. package/test/less-bom/import/import-interpolation2.less +5 -0
  274. package/test/less-bom/import/import-once-test-c.less +6 -0
  275. package/test/less-bom/import/import-reference.less +89 -0
  276. package/test/less-bom/import/import-test-a.less +4 -0
  277. package/test/less-bom/import/import-test-b.less +8 -0
  278. package/test/less-bom/import/import-test-c.less +6 -0
  279. package/test/less-bom/import/import-test-d.css +1 -0
  280. package/test/less-bom/import/import-test-e.less +2 -0
  281. package/test/less-bom/import/import-test-f.less +5 -0
  282. package/test/less-bom/import/imports/font.less +8 -0
  283. package/test/less-bom/import/imports/logo.less +5 -0
  284. package/test/less-bom/import/interpolation-vars.less +6 -0
  285. package/test/less-bom/import/invalid-css.less +1 -0
  286. package/test/less-bom/import/urls.less +1 -0
  287. package/test/less-bom/import-inline.less +3 -0
  288. package/test/less-bom/import-interpolation.less +8 -0
  289. package/test/less-bom/import-once.less +6 -0
  290. package/test/less-bom/import-reference.less +23 -0
  291. package/test/less-bom/import.less +30 -0
  292. package/test/less-bom/include-path/include-path.less +6 -0
  293. package/test/less-bom/javascript.less +38 -0
  294. package/test/less-bom/lazy-eval.less +6 -0
  295. package/test/less-bom/legacy/legacy.less +7 -0
  296. package/test/less-bom/media.less +234 -0
  297. package/test/less-bom/merge.less +78 -0
  298. package/test/less-bom/mixins-args.less +215 -0
  299. package/test/less-bom/mixins-closure.less +26 -0
  300. package/test/less-bom/mixins-guards-default-func.less +195 -0
  301. package/test/less-bom/mixins-guards.less +271 -0
  302. package/test/less-bom/mixins-important.less +37 -0
  303. package/test/less-bom/mixins-interpolated.less +75 -0
  304. package/test/less-bom/mixins-named-args.less +36 -0
  305. package/test/less-bom/mixins-nested.less +22 -0
  306. package/test/less-bom/mixins-pattern.less +102 -0
  307. package/test/less-bom/mixins.less +145 -0
  308. package/test/less-bom/modifyVars/extended.json +5 -0
  309. package/test/less-bom/modifyVars/extended.less +11 -0
  310. package/test/less-bom/nested-gradient-with-svg-gradient/mixin-consumer.less +5 -0
  311. package/test/less-bom/nested-gradient-with-svg-gradient/svg-gradient-mixin.less +15 -0
  312. package/test/less-bom/no-js-errors/no-js-errors.less +3 -0
  313. package/test/less-bom/no-js-errors/no-js-errors.txt +4 -0
  314. package/test/less-bom/no-output.less +2 -0
  315. package/test/less-bom/operations.less +62 -0
  316. package/test/less-bom/parens.less +45 -0
  317. package/test/less-bom/property-name-interp.less +56 -0
  318. package/test/less-bom/rulesets.less +30 -0
  319. package/test/less-bom/scope.less +104 -0
  320. package/test/less-bom/selectors.less +174 -0
  321. package/test/less-bom/sourcemaps/basic.json +3 -0
  322. package/test/less-bom/sourcemaps/basic.less +27 -0
  323. package/test/less-bom/sourcemaps/imported.css +7 -0
  324. package/test/less-bom/static-urls/urls.less +33 -0
  325. package/test/less-bom/strict-units/strict-units.less +4 -0
  326. package/test/less-bom/strings.less +73 -0
  327. package/test/less-bom/url-args/urls.less +63 -0
  328. package/test/less-bom/urls.less +94 -0
  329. package/test/less-bom/variables-in-at-rules.less +20 -0
  330. package/test/less-bom/variables.less +119 -0
  331. package/test/less-bom/whitespace.less +44 -0
  332. package/test/less-test.js +127 -28
  333. package/test/modify-vars.js +6 -4
@@ -0,0 +1,195 @@
1
+ 
2
+ // basics:
3
+
4
+ guard-default-basic-1 {
5
+ .m(1) {case: 1}
6
+ .m(@x) when (default()) {default: @x}
7
+
8
+ &-1 {.m(1)}
9
+ &-2 {.m(2)}
10
+ }
11
+
12
+ guard-default-basic-2 {
13
+ .m(1) {case: 1}
14
+ .m(2) {case: 2}
15
+ .m(3) {case: 3}
16
+ .m(@x) when (default()) {default: @x}
17
+
18
+ &-0 {.m(0)}
19
+ &-2 {.m(2)}
20
+ }
21
+
22
+ guard-default-basic-3 {
23
+ .m(@x) when (@x = 1) {case: 1}
24
+ .m(2) {case: 2}
25
+ .m(@x) when (@x = 3) {case: 3}
26
+ .m(@x) when (default()) {default: @x}
27
+
28
+ &-0 {.m(0)}
29
+ &-2 {.m(2)}
30
+ &-3 {.m(3)}
31
+ }
32
+
33
+ guard-default-definition-order {
34
+ .m(@x) when (default()) {default: @x}
35
+ .m(@x) when (@x = 1) {case: 1}
36
+ .m(2) {case: 2}
37
+ .m(@x) when (@x = 3) {case: 3}
38
+
39
+ &-0 {.m(0)}
40
+ &-2 {.m(2)}
41
+ &-2 {.m(3)}
42
+ }
43
+
44
+ // out of guard:
45
+
46
+ guard-default-out-of-guard {
47
+ .m(1) {case-1: 1}
48
+ .m(@x: default()) when (default()) {default: @x}
49
+
50
+ &-0 {
51
+ case-0: default();
52
+ .m(1);
53
+ .m(2);
54
+ case-2: default();
55
+ }
56
+ &-1 {.m(default())}
57
+ &-2 {.m()}
58
+ }
59
+
60
+ // expressions:
61
+
62
+ guard-default-expr-not {
63
+ .m(1) {case: 1}
64
+ .m(@x) when not(default()) {default: @x}
65
+
66
+ &-1 {.m(1)}
67
+ &-2 {.m(2)}
68
+ }
69
+
70
+ guard-default-expr-eq {
71
+ .m(@x) when (@x = true) {case: @x}
72
+ .m(@x) when (@x = false) {case: @x}
73
+ .m(@x) when (@x = default()) {default: @x}
74
+
75
+ &-true {.m(true)}
76
+ &-false {.m(false)}
77
+ }
78
+
79
+ guard-default-expr-or {
80
+ .m(1) {case: 1}
81
+ .m(2) {case: 2}
82
+ .m(@x) when (default()), (@x = 2) {default: @x}
83
+
84
+ &-1 {.m(1)}
85
+ &-2 {.m(2)}
86
+ &-3 {.m(3)}
87
+ }
88
+
89
+ guard-default-expr-and {
90
+ .m(1) {case: 1}
91
+ .m(2) {case: 2}
92
+ .m(@x) when (default()) and (@x = 3) {default: @x}
93
+
94
+ &-1 {.m(1)}
95
+ &-2 {.m(2)}
96
+ &-3 {.m(3)}
97
+ &-4 {.m(4)}
98
+ }
99
+
100
+ guard-default-expr-always {
101
+ .m(1) {case: 1}
102
+ .m(@x) when (default()), not(default()) {default: @x} // always match
103
+
104
+ &-1 {.m(1)}
105
+ &-2 {.m(2)}
106
+ }
107
+
108
+ guard-default-expr-never {
109
+ .m(1) {case: 1}
110
+ .m(@x) when (default()) and not(default()) {default: @x} // never match
111
+
112
+ &-1 {.m(1)}
113
+ &-2 {.m(2)}
114
+ }
115
+
116
+
117
+ // not conflicting multiple default() uses:
118
+
119
+ guard-default-multi-1 {
120
+ .m(0) {case: 0}
121
+ .m(@x) when (default()) {default-1: @x}
122
+ .m(2) when (default()) {default-2: @x}
123
+
124
+ &-0 {.m(0)}
125
+ &-1 {.m(1)}
126
+ }
127
+
128
+ guard-default-multi-2 {
129
+ .m(1, @x) when (default()) {default-1: @x}
130
+ .m(2, @x) when (default()) {default-2: @x}
131
+ .m(@x, yes) when (default()) {default-3: @x}
132
+
133
+ &-1 {.m(1, no)}
134
+ &-2 {.m(2, no)}
135
+ &-3 {.m(3, yes)}
136
+ }
137
+
138
+ guard-default-multi-3 {
139
+ .m(red) {case-1: darkred}
140
+ .m(blue) {case-2: darkblue}
141
+ .m(@x) when (iscolor(@x)) and (default()) {default-color: @x}
142
+ .m('foo') {case-1: I am 'foo'}
143
+ .m('bar') {case-2: I am 'bar'}
144
+ .m(@x) when (isstring(@x)) and (default()) {default-string: I am @x}
145
+
146
+ &-blue {.m(blue)}
147
+ &-green {.m(green)}
148
+ &-foo {.m('foo')}
149
+ &-baz {.m('baz')}
150
+ }
151
+
152
+ guard-default-multi-4 {
153
+ .m(@x) when (default()), not(default()) {always: @x}
154
+ .m(@x) when (default()) and not(default()) {never: @x}
155
+ .m(2) {case: 2}
156
+
157
+ .m(1);
158
+ .m(2);
159
+ }
160
+
161
+ guard-default-not-ambiguos-2 {
162
+ .m(@x) {case: 1}
163
+ .m(@x) when (default()) {default: @x}
164
+ .m(@x) when not(default()) {not-default: @x}
165
+
166
+ .m(2);
167
+ }
168
+
169
+ guard-default-not-ambiguos-3 {
170
+ .m(@x) {case: 1}
171
+ .m(@x) when not(default()) {not-default-1: @x}
172
+ .m(@x) when not(default()) {not-default-2: @x}
173
+
174
+ .m(2);
175
+ }
176
+
177
+ // default & scope
178
+
179
+ guard-default-scopes {
180
+ .s1() {.m(@v) {1: no condition}}
181
+ .s2() {.m(@v) when (@v) {2: when true}}
182
+ .s3() {.m(@v) when (default()) {3: when default}}
183
+
184
+ &-3 {
185
+ .s2();
186
+ .s3();
187
+ .m(false);
188
+ }
189
+
190
+ &-1 {
191
+ .s1();
192
+ .s3();
193
+ .m(false);
194
+ }
195
+ }
@@ -0,0 +1,271 @@
1
+ 
2
+ // Stacking, functions..
3
+
4
+ .light (@a) when (lightness(@a) > 50%) {
5
+ color: white;
6
+ }
7
+ .light (@a) when (lightness(@a) < 50%) {
8
+ color: black;
9
+ }
10
+ .light (@a) {
11
+ margin: 1px;
12
+ }
13
+
14
+ .light1 { .light(#ddd) }
15
+ .light2 { .light(#444) }
16
+
17
+ // Arguments against each other
18
+
19
+ .max (@a, @b) when (@a > @b) {
20
+ width: @a;
21
+ }
22
+ .max (@a, @b) when (@a < @b) {
23
+ width: @b;
24
+ }
25
+
26
+ .max1 { .max(3, 6) }
27
+ .max2 { .max(8, 1) }
28
+
29
+ // Globals inside guards
30
+
31
+ @g: auto;
32
+
33
+ .glob (@a) when (@a = @g) {
34
+ margin: @a @g;
35
+ }
36
+ .glob1 { .glob(auto) }
37
+
38
+ // Other operators
39
+
40
+ .ops (@a) when (@a >= 0) {
41
+ height: gt-or-eq;
42
+ }
43
+ .ops (@a) when (@a =< 0) {
44
+ height: lt-or-eq;
45
+ }
46
+ .ops (@a) when (@a <= 0) {
47
+ height: lt-or-eq-alias;
48
+ }
49
+ .ops (@a) when not(@a = 0) {
50
+ height: not-eq;
51
+ }
52
+ .ops1 { .ops(0) }
53
+ .ops2 { .ops(1) }
54
+ .ops3 { .ops(-1) }
55
+
56
+ // Scope and default values
57
+
58
+ @a: auto;
59
+
60
+ .default (@a: inherit) when (@a = inherit) {
61
+ content: default;
62
+ }
63
+ .default1 { .default }
64
+
65
+ // true & false keywords
66
+ .test (@a) when (@a) {
67
+ content: "true.";
68
+ }
69
+ .test (@a) when not (@a) {
70
+ content: "false.";
71
+ }
72
+
73
+ .test1 { .test(true) }
74
+ .test2 { .test(false) }
75
+ .test3 { .test(1) }
76
+ .test4 { .test(boo) }
77
+ .test5 { .test("true") }
78
+
79
+ // Boolean expressions
80
+
81
+ .bool () when (true) and (false) { content: true and false } // FALSE
82
+ .bool () when (true) and (true) { content: true and true } // TRUE
83
+ .bool () when (true) { content: true } // TRUE
84
+ .bool () when (false) and (false) { content: true } // FALSE
85
+ .bool () when (false), (true) { content: false, true } // TRUE
86
+ .bool () when (false) and (true) and (true), (true) { content: false and true and true, true } // TRUE
87
+ .bool () when (true) and (true) and (false), (false) { content: true and true and false, false } // FALSE
88
+ .bool () when (false), (true) and (true) { content: false, true and true } // TRUE
89
+ .bool () when (false), (false), (true) { content: false, false, true } // TRUE
90
+ .bool () when (false), (false) and (true), (false) { content: false, false and true, false } // FALSE
91
+ .bool () when (false), (true) and (true) and (true), (false) { content: false, true and true and true, false } // TRUE
92
+ .bool () when not (false) { content: not false }
93
+ .bool () when not (true) and not (false) { content: not true and not false }
94
+ .bool () when not (true) and not (true) { content: not true and not true }
95
+ .bool () when not (false) and (false), not (false) { content: not false and false, not false }
96
+
97
+ .bool1 { .bool }
98
+
99
+ .equality-unit-test(@num) when (@num = 1%) {
100
+ test: fail;
101
+ }
102
+ .equality-unit-test(@num) when (@num = 2) {
103
+ test: pass;
104
+ }
105
+ .equality-units {
106
+ .equality-unit-test(1px);
107
+ .equality-unit-test(2px);
108
+ }
109
+
110
+ .colorguard(@col) when (@col = red) { content: is @col; }
111
+ .colorguard(@col) when not (blue = @col) { content: is not blue its @col; }
112
+ .colorguard(@col) {}
113
+ .colorguardtest {
114
+ .colorguard(red);
115
+ .colorguard(blue);
116
+ .colorguard(purple);
117
+ }
118
+
119
+ .stringguard(@str) when (@str = "theme1") { content: @str is "theme1"; }
120
+ .stringguard(@str) when not ("theme2" = @str) { content: @str is not "theme2"; }
121
+ .stringguard(@str) when (@str = 'theme1') { content: @str is 'theme1'; }
122
+ .stringguard(@str) when not ('theme2' = @str) { content: @str is not 'theme2'; }
123
+ .stringguard(@str) when (~"theme1" = @str) { content: @str is theme1; }
124
+ .stringguard(@str) {}
125
+ .stringguardtest {
126
+ .stringguard("theme1");
127
+ .stringguard("theme2");
128
+ .stringguard('theme1');
129
+ .stringguard('theme2');
130
+ .stringguard(theme1);
131
+ }
132
+
133
+ .generic(@a, @b) {/**/}
134
+ .generic(@a, @b) when (@a = @b) {content: @a is equal to @b}
135
+ .generic(@a, @b) when (@b = @a) {content: @b is equal to @a too}
136
+ .generic(@a, @b) when (@a < @b) {content: @a is less than @b}
137
+ .generic(@a, @b) when (@b < @a) {content: @b is less than @a too}
138
+ .generic(@a, @b) when (@a > @b) {content: @a is greater than @b}
139
+ .generic(@a, @b) when (@b > @a) {content: @b is greater than @a too}
140
+ .generic(@a, @b) when not(@a = @b) {content: @a is not equal to @b}
141
+ .generic(@a, @b) when not(@b = @a) {content: @b is not equal to @a too}
142
+
143
+ .variouse-types-comparison {
144
+ .generic(true, false);
145
+ .generic(1, true);
146
+ .generic(2, 2px);
147
+ .generic(3, ~"3");
148
+ .generic(5, ~"4");
149
+ .generic(abc, ~"abc");
150
+ .generic(abc, "abc");
151
+ .generic('abc', "abd");
152
+ .generic(6, e("6"));
153
+ .generic(`9`, 8);
154
+ .generic(a, b);
155
+ .generic(1 2, 3);
156
+ }
157
+
158
+ .list-comparison {
159
+ .generic(a b c, a b c);
160
+ .generic(a b c, a b d);
161
+ .generic(a, b, c; a, b, c);
162
+ .generic(a, b, c; a, b, d);
163
+ .generic(1 2px 300ms, 1em 2 .3s);
164
+
165
+ @space-list: 1 2 3;
166
+ @comma-list: 1, 2, 3;
167
+ @compound: @space-list @comma-list;
168
+
169
+ .generic(@space-list, @comma-list);
170
+ .generic(@comma-list, ~"1, 2, 3");
171
+ .generic(@compound, @space-list @comma-list);
172
+ .generic(@compound, @comma-list @space-list);
173
+ .generic(@compound 4, ~"1 2 3 1, 2, 3 4");
174
+ }
175
+
176
+ .mixin(...) {
177
+ catch:all;
178
+ }
179
+ .mixin(@var) when (@var=4) {
180
+ declare: 4;
181
+ }
182
+ .mixin(@var) when (@var=4px) {
183
+ declare: 4px;
184
+ }
185
+ #tryNumberPx {
186
+ .mixin(4px);
187
+ }
188
+
189
+ .lock-mixin(@a) {
190
+ .inner-locked-mixin(@x: @a) when (@a = 1) {
191
+ a: @a;
192
+ x: @x;
193
+ }
194
+ }
195
+ .call-lock-mixin {
196
+ .lock-mixin(1);
197
+ .call-inner-lock-mixin {
198
+ .inner-locked-mixin();
199
+ }
200
+ }
201
+ .bug-100cm-1m(@a) when (@a = 1) {
202
+ .failed {
203
+ one-hundred: not-equal-to-1;
204
+ }
205
+ }
206
+ .bug-100cm-1m(100cm);
207
+
208
+ #ns {
209
+ .mixin-for-root-usage(@a) when (@a > 0) {
210
+ .mixin-generated-class {
211
+ a: @a;
212
+ }
213
+ }
214
+ }
215
+
216
+ #ns > .mixin-for-root-usage(1);
217
+
218
+ @namespaceGuard: 1;
219
+ #guarded when (@namespaceGuard>0) {
220
+ #deeper {
221
+ .mixin() {
222
+ guarded: namespace;
223
+ }
224
+ }
225
+ }
226
+ #guarded() when (@namespaceGuard>0) {
227
+ #deeper {
228
+ .mixin() {
229
+ silent: namespace;
230
+ }
231
+ }
232
+ }
233
+ #guarded(@variable) when (@namespaceGuard>0) {
234
+ #deeper {
235
+ .mixin() {
236
+ should: not match because namespace argument;
237
+ }
238
+ }
239
+ }
240
+ #guarded(@variable: default) when (@namespaceGuard>0) {
241
+ #deeper {
242
+ .mixin() {
243
+ guarded: with default;
244
+ }
245
+ }
246
+ }
247
+ #guarded when (@namespaceGuard<0) {
248
+ #deeper {
249
+ .mixin() {
250
+ should: not match because namespace guard;
251
+ }
252
+ }
253
+ }
254
+ #guarded-caller {
255
+ #guarded > #deeper > .mixin();
256
+ }
257
+ #top {
258
+ #deeper when (@namespaceGuard<0) {
259
+ .mixin(@a) {
260
+ should: not match because namespace guard;
261
+ }
262
+ }
263
+ #deeper() when (@namespaceGuard>0) {
264
+ .mixin(@a) {
265
+ should: match @a;
266
+ }
267
+ }
268
+ }
269
+ #guarded-deeper {
270
+ #top > #deeper > .mixin(1);
271
+ }
@@ -0,0 +1,37 @@
1
+ .submixin(@a) {
2
+ border-width: @a;
3
+ }
4
+ .mixin (9) {
5
+ border: 9 !important;
6
+ }
7
+ .mixin (@a: 0) {
8
+ border: @a;
9
+ boxer: @a;
10
+ .inner {
11
+ test: @a;
12
+ }
13
+ // comment
14
+ .submixin(@a);
15
+ }
16
+
17
+ .class {
18
+ .mixin(1);
19
+ .mixin(2) !important;
20
+ .mixin(3);
21
+ .mixin(4) !important;
22
+ .mixin(5);
23
+ .mixin !important;
24
+ .mixin(9);
25
+ }
26
+ .size(@aaa: auto) {
27
+ .set-width(@aaa) {
28
+ width: @aaa;
29
+ }
30
+ .set-width(@aaa);
31
+ }
32
+ .when-calling-nested-issue-2394 {
33
+ .size() !important;
34
+ }
35
+ .when-calling-nested-with-param-issue-2394 {
36
+ .size(10px) !important;
37
+ }
@@ -0,0 +1,75 @@
1
+ 
2
+ @a0: 123;
3
+ @a1: foo;
4
+ @a2: ~".foo";
5
+ @a4: ~"#foo";
6
+
7
+ .@{a0} {
8
+ a: 0;
9
+ }
10
+
11
+ .@{a1} {
12
+ a: 1;
13
+ }
14
+
15
+ @{a2} {
16
+ a: 2;
17
+ }
18
+
19
+ #@{a1} {
20
+ a: 3;
21
+ }
22
+
23
+ @{a4} {
24
+ a: 4;
25
+ }
26
+
27
+ mi-test-a {
28
+ .123;
29
+ .foo;
30
+ #foo;
31
+ }
32
+
33
+ .b .bb {
34
+ &.@{a1}-xxx .yyy-@{a1}@{a4} {
35
+ & @{a2}.bbb {
36
+ b: 1;
37
+ }
38
+ }
39
+ }
40
+
41
+ mi-test-b {
42
+ .b.bb.foo-xxx.yyy-foo#foo.foo.bbb;
43
+ }
44
+
45
+ @c1: @a1;
46
+ @c2: bar;
47
+ @c3: baz;
48
+
49
+ #@{c1}-foo {
50
+ > .@{c2} {
51
+ .@{c3} {
52
+ c: c;
53
+ }
54
+ }
55
+ }
56
+
57
+ mi-test-c {
58
+ &-1 {#foo-foo;}
59
+ &-2 {#foo-foo > .bar;}
60
+ &-3 {#foo-foo > .bar.baz;}
61
+ }
62
+
63
+ .Person(@name, @gender_) {
64
+ .@{name} {
65
+ @gender: @gender_;
66
+ .sayGender() {
67
+ gender: @gender;
68
+ }
69
+ }
70
+ }
71
+
72
+ mi-test-d {
73
+ .Person(person, "Male");
74
+ .person.sayGender();
75
+ }
@@ -0,0 +1,36 @@
1
+ .mixin (@a: 1px, @b: 50%) {
2
+ width: (@a * 5);
3
+ height: (@b - 1%);
4
+ args: @arguments;
5
+ }
6
+ .mixin (@a: 1px, @b: 50%) when (@b > 75%){
7
+ text-align: center;
8
+ }
9
+
10
+ .named-arg {
11
+ color: blue;
12
+ .mixin(@b: 100%);
13
+ }
14
+
15
+ .class {
16
+ @var: 20%;
17
+ .mixin(@b: @var);
18
+ }
19
+
20
+ .all-args-wrong-args {
21
+ .mixin(@b: 10%, @a: 2px);
22
+ }
23
+
24
+ .mixin2 (@a: 1px, @b: 50%, @c: 50) {
25
+ width: (@a * 5);
26
+ height: (@b - 1%);
27
+ color: (#000000 + @c);
28
+ }
29
+
30
+ .named-args2 {
31
+ .mixin2(3px, @c: 100);
32
+ }
33
+
34
+ .named-args3 {
35
+ .mixin2(@b: 30%, @c: #123456);
36
+ }
@@ -0,0 +1,22 @@
1
+ .mix-inner (@var) {
2
+ border-width: @var;
3
+ }
4
+
5
+ .mix (@a: 10) {
6
+ .inner {
7
+ height: (@a * 10);
8
+
9
+ .innest {
10
+ width: @a;
11
+ .mix-inner((@a * 2));
12
+ }
13
+ }
14
+ }
15
+
16
+ .class {
17
+ .mix(30);
18
+ }
19
+
20
+ .class2 {
21
+ .mix(60);
22
+ }