├── .gitignore ├── .jshintrc ├── .npmignore ├── .travis.yml ├── Gruntfile.js ├── LICENSE-MIT ├── README.md ├── package.json ├── tasks └── csscomb.js └── test ├── csscomb_test.js ├── expected ├── customsort.css ├── multi1.css ├── multi2.css └── resort.css └── fixtures ├── dest ├── multi1.css ├── multi1.resorted.css ├── multi2.css └── multi2.resorted.css ├── multi1.css ├── multi2.css ├── sort.json ├── src ├── multi1.css ├── multi1.resorted.css ├── multi2.css └── multi2.resorted.css └── style.css /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log 3 | tmp_*.css -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "curly": true, 3 | "eqeqeq": true, 4 | "immed": true, 5 | "latedef": true, 6 | "newcap": true, 7 | "noarg": true, 8 | "sub": true, 9 | "undef": true, 10 | "boss": true, 11 | "eqnull": true, 12 | "node": true, 13 | "es5": false 14 | } 15 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .npmignore 2 | .editorconfig 3 | .gitattributes 4 | .travis.yml 5 | test 6 | Grunfile.js -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "14.13.0" 4 | before_script: 5 | - npm install grunt-cli -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | /* 2 | * grunt-csscomb 3 | * https://github.com/csscomb/grunt-csscomb 4 | * 5 | * Copyright (c) 2013 Koji Ishimoto 6 | * Licensed under the MIT license. 7 | */ 8 | 'use strict'; 9 | 10 | module.exports = function (grunt) { 11 | 12 | // Project configuration. 13 | grunt.initConfig({ 14 | jshint: { 15 | all: [ 16 | 'Gruntfile.js', 17 | 'tasks/*.js', 18 | '<%= nodeunit.tests %>', 19 | ], 20 | options: { 21 | jshintrc: '.jshintrc', 22 | }, 23 | }, 24 | 25 | // Before generating any new files, remove any previously-created files. 26 | clean: { 27 | tests: ['test/fixtures/tmp_*.css', 'test/fixtures/dest/*.resorted.css', 'test/fixtures/src/*.resorted.css'], 28 | }, 29 | 30 | // Configuration to be run (and then tested). 31 | csscomb: { 32 | main: { 33 | files: { 34 | 'test/fixtures/tmp_resort.css': ['test/fixtures/style.css'], 35 | } 36 | }, 37 | custom: { 38 | options: { 39 | config: 'test/fixtures/sort.json' 40 | }, 41 | files: { 42 | 'test/fixtures/tmp_customsort.css': ['test/fixtures/style.css'], 43 | } 44 | }, 45 | multiple: { 46 | files: { 47 | 'test/fixtures/tmp_multi1.css': ['test/fixtures/multi1.css'], 48 | 'test/fixtures/tmp_multi2.css': ['test/fixtures/multi2.css'], 49 | } 50 | }, 51 | dynamic_mappings: { 52 | expand: true, 53 | cwd: 'test/fixtures/dest/', 54 | src: ['*.css', '!*.resorted.css'], 55 | dest: 'test/fixtures/dest/', 56 | ext: '.resorted.css' 57 | }, 58 | src_only: { 59 | src: ['test/fixtures/src/*.css', '!test/fixtures/src/*.resorted.css'], 60 | ext: '.resorted.css' 61 | } 62 | }, 63 | 64 | // Unit tests. 65 | nodeunit: { 66 | tests: ['test/*_test.js'], 67 | }, 68 | 69 | }); 70 | 71 | // Actually load this plugin's task(s). 72 | grunt.loadTasks('tasks'); 73 | 74 | // These plugins provide necessary tasks. 75 | grunt.loadNpmTasks('grunt-contrib-jshint'); 76 | grunt.loadNpmTasks('grunt-contrib-clean'); 77 | grunt.loadNpmTasks('grunt-contrib-nodeunit'); 78 | 79 | // Whenever the "test" task is run, first clean the "tmp" dir, then run this 80 | // plugin's task(s), then test the result. 81 | grunt.registerTask('test', ['clean', 'csscomb', 'nodeunit']); 82 | 83 | // By default, lint and run all tests. 84 | grunt.registerTask('default', ['jshint', 'test']); 85 | 86 | }; -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | Copyright (c) 2013 Koji Ishimoto 2 | 3 | Permission is hereby granted, free of charge, to any person 4 | obtaining a copy of this software and associated documentation 5 | files (the "Software"), to deal in the Software without 6 | restriction, including without limitation the rights to use, 7 | copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the 9 | Software is furnished to do so, subject to the following 10 | conditions: 11 | 12 | The above copyright notice and this permission notice shall be 13 | included in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 17 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 19 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 20 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # grunt-csscomb [![Build Status](https://secure.travis-ci.org/csscomb/grunt-csscomb.png?branch=master)](http://travis-ci.org/csscomb/grunt-csscomb) [![NPM version](https://badge.fury.io/js/grunt-csscomb.png)](http://badge.fury.io/js/grunt-csscomb) 2 | 3 | > The grunt plugin for sorting CSS properties in specific order. 4 | 5 | ## Getting Started 6 | 7 | This plugin requires Grunt `>=1.0.x`. 8 | 9 | If you haven't used [Grunt](http://gruntjs.com/) before, be sure to check out the [Getting Started](http://gruntjs.com/getting-started) guide, as it explains how to create a [Gruntfile](http://gruntjs.com/sample-gruntfile) as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command: 10 | 11 | ```shell 12 | npm install grunt-csscomb --save-dev 13 | ``` 14 | 15 | Once the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript: 16 | 17 | ```js 18 | grunt.loadNpmTasks('grunt-csscomb'); 19 | ``` 20 | 21 | ## The "csscomb" task 22 | 23 | ### Overview 24 | In your project's Gruntfile, add a section named `csscomb` to the data object passed into `grunt.initConfig()`. 25 | 26 | ```js 27 | grunt.initConfig({ 28 | csscomb: { 29 | options: { 30 | // Task-specific options go here. 31 | }, 32 | your_target: { 33 | // Target-specific file lists and/or options go here. 34 | } 35 | } 36 | }); 37 | ``` 38 | 39 | ### Options 40 | 41 | #### options.config 42 | Type: `String` 43 | Default value: `null` 44 | 45 | A string value that is used to specify custom-csscomb.json file path. 46 | 47 | ### Usage Examples 48 | 49 | ```js 50 | grunt.initConfig({ 51 | csscomb: { 52 | foo: { 53 | files: { 54 | 'dest/resorted-foo.css': ['src/foo.css'], 55 | } 56 | }, 57 | bar: { 58 | files: { 59 | 'dest/resorted-foo.css': ['src/foo.css'], 60 | 'dest/resorted-bar.css': ['src/bar.css'] 61 | } 62 | } 63 | } 64 | }); 65 | ``` 66 | 67 | #### Custom Options 68 | 69 | You can set the `config` option if you want to use the configuration which you are accustomed to. 70 | 71 | ```js 72 | grunt.initConfig({ 73 | csscomb: { 74 | dist: { 75 | options: { 76 | config: '/path/to/config.json' 77 | }, 78 | files: { 79 | 'dest/resorted-foo.css': ['src/foo.css'] 80 | } 81 | } 82 | } 83 | }); 84 | ``` 85 | 86 | #### Dynamic Mappings 87 | 88 | You can process many individual files of directory with a few additional properties. 89 | 90 | ```js 91 | grunt.initConfig({ 92 | csscomb: { 93 | dynamic_mappings: { 94 | expand: true, 95 | cwd: '/assets/css/', 96 | src: ['*.css', '!*.resorted.css'], 97 | dest: '/assets/dest/css/', 98 | ext: '.resorted.css' 99 | } 100 | } 101 | }); 102 | ``` 103 | 104 | #### Src Only 105 | 106 | If you provide only a `src` with no value for `dest`, then `dest` will automatically be set to the `src` directory. 107 | 108 | ```js 109 | grunt.initConfig({ 110 | csscomb: { 111 | src_only: { 112 | src: ['foo/bar.css'], 113 | ext: '.resorted.css' 114 | } 115 | } 116 | }); 117 | ``` 118 | 119 | ## Release History 120 | 121 | + v4.2.0: Update dependencies. 122 | + v4.1.0: Update csscomb.js to v4.3.0; update dependencies. 123 | + v4.0.0: Update csscomb.js to v4; update dependencies; allow src only. 124 | + v3.1.1: Update grunt version. 125 | + v3.0.0: Update csscomb.js to v3.0 but `grunt-csscomb` API doesn't change. 126 | + v2.0.1: Stop searching config if we reach root directory. 127 | + v2.0.0: Bump up. 128 | + v1.2.1: Bump up. 129 | + v1.2.0: Update csscomb.js to v2.0 and change API `sortOrder` to `config`. 130 | + v1.1.0: Improve process. 131 | + v1.0.0: Support [csscomb.js](http://github.com/csscomb/csscomb.js). 132 | + v0.5.0: Enable multiple files. 133 | + v0.4.0: Move to csscomb's repository. 134 | + v0.3.0: Fix sort option bug. 135 | + v0.2.0: Fix bugs. 136 | + v0.1.0: Release. 137 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "grunt-csscomb", 3 | "description": "The grunt plugin for sorting CSS properties in specific order.", 4 | "version": "4.2.0", 5 | "homepage": "https://github.com/csscomb/grunt-csscomb", 6 | "author": [ 7 | { 8 | "name": "Koji Ishimoto", 9 | "email": "ijok.ijok@gmail.com", 10 | "url": "http://t32k.me/" 11 | }, 12 | { 13 | "name": "Tony Ganch", 14 | "email": "tonyganch+github@gmail.com", 15 | "web": "http://tonyganch.com/" 16 | } 17 | ], 18 | "contributors": [ 19 | { 20 | "name": "Shogo Sensui", 21 | "email": "shogo.sensui@gmail.com", 22 | "web": "http://1000ch.net/" 23 | } 24 | ], 25 | "repository": { 26 | "type": "git", 27 | "url": "https://github.com/csscomb/grunt-csscomb.git" 28 | }, 29 | "bugs": { 30 | "url": "https://github.com/csscomb/grunt-csscomb/issues" 31 | }, 32 | "licenses": [ 33 | { 34 | "type": "MIT", 35 | "url": "https://github.com/csscomb/grunt-csscomb/blob/master/LICENSE-MIT" 36 | } 37 | ], 38 | "main": "Gruntfile.js", 39 | "engines": { 40 | "node": ">= 10.0.0" 41 | }, 42 | "scripts": { 43 | "test": "grunt test" 44 | }, 45 | "dependencies": { 46 | "csscomb": "~4.3.0" 47 | }, 48 | "devDependencies": { 49 | "grunt": "^1.3.0", 50 | "grunt-contrib-clean": "^2.0.0", 51 | "grunt-contrib-jshint": "^2.1.0", 52 | "grunt-contrib-nodeunit": "^2.1.0" 53 | }, 54 | "peerDependencies": { 55 | "grunt": ">=1.0.0" 56 | }, 57 | "keywords": [ 58 | "gruntplugin", 59 | "CSScomb", 60 | "Sass", 61 | "SCSS", 62 | "LESS" 63 | ] 64 | } 65 | -------------------------------------------------------------------------------- /tasks/csscomb.js: -------------------------------------------------------------------------------- 1 | /* 2 | * grunt-csscomb 3 | * https://github.com/csscomb/grunt-csscomb 4 | * 5 | * Copyright (c) 2013 Koji Ishimoto, contributors 6 | * Licensed under the MIT license. 7 | */ 8 | 'use strict'; 9 | 10 | var path = require('path'); 11 | 12 | module.exports = function (grunt) { 13 | 14 | grunt.registerMultiTask('csscomb', 'Sorting CSS properties in specific order.', function () { 15 | 16 | var Comb = require('csscomb'), 17 | comb = new Comb(), 18 | HOME = process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE; 19 | 20 | function getConfigPath(configPath) { 21 | var dirname, parentDirname; 22 | 23 | configPath = configPath || path.join(process.cwd(), '.csscomb.json'); 24 | 25 | // If we've finally found a config, return its path: 26 | if (grunt.file.exists(configPath)) { 27 | return configPath; 28 | } 29 | 30 | dirname = path.dirname(configPath); 31 | parentDirname = path.dirname(dirname); 32 | 33 | // If we are in HOME dir already and yet no config file, quit. 34 | // If project is located not under HOME, compare to root instead. 35 | // Since there appears to be no good way to get root path in 36 | // Windows, assume that if current dir has no parent dir, we're in 37 | // root. 38 | if (dirname === HOME || dirname === parentDirname) { 39 | return; 40 | } 41 | 42 | // If there is no config in this directory, go one level up and look for 43 | // a config there: 44 | configPath = path.join(parentDirname, '.csscomb.json'); 45 | return getConfigPath(configPath); 46 | } 47 | 48 | // Get config file from task's options: 49 | var config = grunt.task.current.options().config || getConfigPath(); 50 | 51 | // Check if config file is set and exists. If not, use default one: 52 | if (config && grunt.file.exists(config)) { 53 | grunt.log.ok('Using custom config file "' + config + '"...'); 54 | config = grunt.file.readJSON(config); 55 | } else { 56 | grunt.log.ok('Using default config file...'); 57 | config = Comb.getConfig('csscomb'); 58 | } 59 | 60 | // Configure csscomb: 61 | comb.configure(config); 62 | 63 | this.files.forEach(function (f) { 64 | 65 | f.src.filter(function (filepath) { 66 | // Warn on and remove invalid source files (if nonull was set). 67 | if (!grunt.file.exists(filepath)) { 68 | grunt.log.warn('Source file "' + filepath + '" not found.'); 69 | return false; 70 | } else { 71 | return true; 72 | } 73 | }).forEach(function (src) { 74 | var dest = f.dest, 75 | syntax = src.split('.').pop(); 76 | if (!dest) { 77 | dest = grunt.file.expandMapping(src, '', { ext: f.ext || '.' + syntax })[0].dest; 78 | } 79 | 80 | // Get CSS from a source file: 81 | var css = grunt.file.read(src); 82 | 83 | // Comb it: 84 | grunt.log.ok('Sorting file "' + src + '"...'); 85 | try { 86 | comb.processString(css, { syntax: syntax }).then(function(combed) { 87 | grunt.file.write(dest, combed); 88 | }); 89 | } catch(e) { 90 | grunt.log.error(e); 91 | } 92 | }); 93 | }); 94 | }); 95 | }; 96 | -------------------------------------------------------------------------------- /test/csscomb_test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var grunt = require('grunt'); 4 | 5 | exports.csscomb = { 6 | main: function (test) { 7 | test.expect(1); 8 | 9 | var actual = grunt.file.read('test/fixtures/tmp_resort.css'); 10 | var expected = grunt.file.read('test/expected/resort.css'); 11 | test.equal(actual, expected, 'should be sorted.'); 12 | 13 | test.done(); 14 | }, 15 | custom: function (test) { 16 | test.expect(1); 17 | 18 | var actual = grunt.file.read('test/fixtures/tmp_customsort.css'); 19 | var expected = grunt.file.read('test/expected/customsort.css'); 20 | test.equal(actual, expected, 'should be custom sorted.'); 21 | 22 | test.done(); 23 | }, 24 | mutiple: function (test) { 25 | test.expect(2); 26 | 27 | var actual = grunt.file.read('test/fixtures/tmp_multi1.css'); 28 | var expected = grunt.file.read('test/expected/multi1.css'); 29 | test.equal(actual, expected, 'should be sorted.'); 30 | 31 | var actual2 = grunt.file.read('test/fixtures/tmp_multi2.css'); 32 | var expected2 = grunt.file.read('test/expected/multi2.css'); 33 | test.equal(actual2, expected2, 'should be sorted.'); 34 | 35 | test.done(); 36 | }, 37 | dynamic_mappings: function (test) { 38 | test.expect(2); 39 | 40 | var actual = grunt.file.read('test/fixtures/dest/multi1.resorted.css'); 41 | var expected = grunt.file.read('test/expected/multi1.css'); 42 | test.equal(actual, expected, 'should be sorted.'); 43 | 44 | var actual2 = grunt.file.read('test/fixtures/dest/multi2.resorted.css'); 45 | var expected2 = grunt.file.read('test/expected/multi2.css'); 46 | test.equal(actual2, expected2, 'should be sorted.'); 47 | 48 | test.done(); 49 | }, 50 | src_only: function (test) { 51 | test.expect(2); 52 | 53 | var actual = grunt.file.read('test/fixtures/src/multi1.resorted.css'); 54 | var expected = grunt.file.read('test/expected/multi1.css'); 55 | test.equal(actual, expected, 'should be sorted.'); 56 | 57 | var actual2 = grunt.file.read('test/fixtures/src/multi2.resorted.css'); 58 | var expected2 = grunt.file.read('test/expected/multi2.css'); 59 | test.equal(actual2, expected2, 'should be sorted.'); 60 | 61 | test.done(); 62 | } 63 | }; -------------------------------------------------------------------------------- /test/expected/customsort.css: -------------------------------------------------------------------------------- 1 | .comb { 2 | display: block; 3 | width: 100px; 4 | height: 100px; 5 | background-color: red; 6 | text-align: center; 7 | font-weight: bold; 8 | } -------------------------------------------------------------------------------- /test/expected/multi1.css: -------------------------------------------------------------------------------- 1 | .multi1 2 | { 3 | font-weight: bold; 4 | 5 | z-index: 100; 6 | 7 | display: block; 8 | visibility: hidden; 9 | 10 | width: 100px; 11 | height: 100px; 12 | max-height: 44px; 13 | 14 | text-align: center; 15 | vertical-align: 5px; 16 | 17 | border-color: 1px #000 solid; 18 | background-color: red; 19 | } 20 | -------------------------------------------------------------------------------- /test/expected/multi2.css: -------------------------------------------------------------------------------- 1 | .multi2 2 | { 3 | position: absolute; 4 | z-index: 10; 5 | top: 10px; 6 | left: 10px; 7 | 8 | display: table; 9 | float: left; 10 | 11 | width: 10px; 12 | height: 10px; 13 | margin: 10px; 14 | padding: 10px; 15 | 16 | border: 1px #fff solid; 17 | } 18 | -------------------------------------------------------------------------------- /test/expected/resort.css: -------------------------------------------------------------------------------- 1 | .comb 2 | { 3 | font-weight: bold; 4 | 5 | display: block; 6 | 7 | width: 100px; 8 | height: 100px; 9 | 10 | text-align: center; 11 | 12 | background-color: red; 13 | } 14 | -------------------------------------------------------------------------------- /test/fixtures/dest/multi1.css: -------------------------------------------------------------------------------- 1 | .multi1 { 2 | z-index: 100; 3 | display: block; 4 | visibility: hidden; 5 | max-height: 44px; 6 | width: 100px; 7 | height: 100px; 8 | border-color: 1px #000 solid; 9 | background-color: red; 10 | vertical-align: 5px; 11 | text-align: center; 12 | font-weight: bold; 13 | } -------------------------------------------------------------------------------- /test/fixtures/dest/multi1.resorted.css: -------------------------------------------------------------------------------- 1 | .multi1 2 | { 3 | font-weight: bold; 4 | 5 | z-index: 100; 6 | 7 | display: block; 8 | visibility: hidden; 9 | 10 | width: 100px; 11 | height: 100px; 12 | max-height: 44px; 13 | 14 | text-align: center; 15 | vertical-align: 5px; 16 | 17 | border-color: 1px #000 solid; 18 | background-color: red; 19 | } 20 | -------------------------------------------------------------------------------- /test/fixtures/dest/multi2.css: -------------------------------------------------------------------------------- 1 | .multi2 { 2 | position: absolute; 3 | top: 10px; 4 | left: 10px; 5 | z-index: 10; 6 | display: table; 7 | float: left; 8 | margin: 10px; 9 | padding: 10px; 10 | width: 10px; 11 | height: 10px; 12 | border: 1px #fff solid; 13 | } -------------------------------------------------------------------------------- /test/fixtures/dest/multi2.resorted.css: -------------------------------------------------------------------------------- 1 | .multi2 2 | { 3 | position: absolute; 4 | z-index: 10; 5 | top: 10px; 6 | left: 10px; 7 | 8 | display: table; 9 | float: left; 10 | 11 | width: 10px; 12 | height: 10px; 13 | margin: 10px; 14 | padding: 10px; 15 | 16 | border: 1px #fff solid; 17 | } 18 | -------------------------------------------------------------------------------- /test/fixtures/multi1.css: -------------------------------------------------------------------------------- 1 | .multi1 { 2 | z-index: 100; 3 | display: block; 4 | visibility: hidden; 5 | max-height: 44px; 6 | width: 100px; 7 | height: 100px; 8 | border-color: 1px #000 solid; 9 | background-color: red; 10 | vertical-align: 5px; 11 | text-align: center; 12 | font-weight: bold; 13 | } -------------------------------------------------------------------------------- /test/fixtures/multi2.css: -------------------------------------------------------------------------------- 1 | .multi2 { 2 | position: absolute; 3 | top: 10px; 4 | left: 10px; 5 | z-index: 10; 6 | display: table; 7 | float: left; 8 | margin: 10px; 9 | padding: 10px; 10 | width: 10px; 11 | height: 10px; 12 | border: 1px #fff solid; 13 | } -------------------------------------------------------------------------------- /test/fixtures/sort.json: -------------------------------------------------------------------------------- 1 | { 2 | "sort-order": [ 3 | [ 4 | "-webkit-flex-align", 5 | "-moz-flex-align", 6 | "-ms-flex-align", 7 | "-o-flex-align", 8 | "flex-align", 9 | "overflow", 10 | "-ms-overflow-x", 11 | "-ms-overflow-y", 12 | "overflow-x", 13 | "overflow-y", 14 | "clip", 15 | "-webkit-box-sizing", 16 | "-moz-box-sizing", 17 | "box-sizing", 18 | "display", 19 | "width", 20 | "height", 21 | "top", 22 | "right", 23 | "bottom", 24 | "left", 25 | "z-index", 26 | "visibility", 27 | "-webkit-flex-direction", 28 | "-moz-flex-direction", 29 | "-ms-flex-direction", 30 | "-o-flex-direction", 31 | "flex-direction", 32 | "-webkit-flex-order", 33 | "-moz-flex-order", 34 | "-ms-flex-order", 35 | "-o-flex-order", 36 | "flex-order", 37 | "-webkit-flex-pack", 38 | "-moz-flex-pack", 39 | "-ms-flex-pack", 40 | "-o-flex-pack", 41 | "flex-pack", 42 | "float", 43 | "clear", 44 | "outline", 45 | "outline-width", 46 | "outline-style", 47 | "outline-color", 48 | "outline-offset", 49 | "border", 50 | "border-spacing", 51 | "border-collapse", 52 | "border-width", 53 | "border-style", 54 | "border-color", 55 | "border-top", 56 | "border-top-width", 57 | "border-top-style", 58 | "border-top-color", 59 | "border-right", 60 | "border-right-width", 61 | "border-right-style", 62 | "border-right-color", 63 | "border-bottom", 64 | "border-bottom-width", 65 | "border-bottom-style", 66 | "border-bottom-color", 67 | "border-left", 68 | "border-left-width", 69 | "border-left-style", 70 | "border-left-color", 71 | "margin", 72 | "margin-top", 73 | "margin-right", 74 | "margin-bottom", 75 | "margin-left", 76 | "padding", 77 | "padding-top", 78 | "padding-right", 79 | "padding-bottom", 80 | "padding-left", 81 | "min-width", 82 | "min-height", 83 | "max-width", 84 | "max-height", 85 | "-webkit-border-radius", 86 | "-moz-border-radius", 87 | "border-radius", 88 | "-webkit-border-top-left-radius", 89 | "-moz-border-radius-topleft", 90 | "border-top-left-radius", 91 | "-webkit-border-top-right-radius", 92 | "-moz-border-radius-topright", 93 | "border-top-right-radius", 94 | "-webkit-border-bottom-right-radius", 95 | "-moz-border-radius-bottomright", 96 | "border-bottom-right-radius", 97 | "-webkit-border-bottom-left-radius", 98 | "-moz-border-radius-bottomleft", 99 | "border-bottom-left-radius", 100 | "-webkit-border-image", 101 | "-moz-border-image", 102 | "-o-border-image", 103 | "border-image", 104 | "-webkit-border-image-source", 105 | "-moz-border-image-source", 106 | "-o-border-image-source", 107 | "border-image-source", 108 | "-webkit-border-image-slice", 109 | "-moz-border-image-slice", 110 | "-o-border-image-slice", 111 | "border-image-slice", 112 | "-webkit-border-image-width", 113 | "-moz-border-image-width", 114 | "-o-border-image-width", 115 | "border-image-width", 116 | "-webkit-border-image-outset", 117 | "-moz-border-image-outset", 118 | "-o-border-image-outset", 119 | "border-image-outset", 120 | "-webkit-border-image-repeat", 121 | "-moz-border-image-repeat", 122 | "-o-border-image-repeat", 123 | "border-image-repeat", 124 | "-webkit-border-top-image", 125 | "-moz-border-top-image", 126 | "-o-border-top-image", 127 | "border-top-image", 128 | "-webkit-border-right-image", 129 | "-moz-border-right-image", 130 | "-o-border-right-image", 131 | "border-right-image", 132 | "-webkit-border-bottom-image", 133 | "-moz-border-bottom-image", 134 | "-o-border-bottom-image", 135 | "border-bottom-image", 136 | "-webkit-border-left-image", 137 | "-moz-border-left-image", 138 | "-o-border-left-image", 139 | "border-left-image", 140 | "-webkit-border-corner-image", 141 | "-moz-border-corner-image", 142 | "-o-border-corner-image", 143 | "border-corner-image", 144 | "-webkit-border-top-left-image", 145 | "-moz-border-top-left-image", 146 | "-o-border-top-left-image", 147 | "border-top-left-image", 148 | "-webkit-border-top-right-image", 149 | "-moz-border-top-right-image", 150 | "-o-border-top-right-image", 151 | "border-top-right-image", 152 | "-webkit-border-bottom-right-image", 153 | "-moz-border-bottom-right-image", 154 | "-o-border-bottom-right-image", 155 | "border-bottom-right-image", 156 | "-webkit-border-bottom-left-image", 157 | "-moz-border-bottom-left-image", 158 | "-o-border-bottom-left-image", 159 | "border-bottom-left-image", 160 | "background", 161 | "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader", 162 | "background-color", 163 | "background-image", 164 | "background-attachment", 165 | "background-position", 166 | "-ms-background-position-x", 167 | "-ms-background-position-y", 168 | "background-position-x", 169 | "background-position-y", 170 | "background-clip", 171 | "background-origin", 172 | "-webkit-background-size", 173 | "-moz-background-size", 174 | "-o-background-size", 175 | "background-size", 176 | "background-repeat", 177 | "box-decoration-break", 178 | "-webkit-box-shadow", 179 | "-moz-box-shadow", 180 | "box-shadow", 181 | "color", 182 | "table-layout", 183 | "caption-side", 184 | "empty-cells", 185 | "list-style", 186 | "list-style-position", 187 | "list-style-type", 188 | "list-style-image", 189 | "quotes", 190 | "content", 191 | "counter-increment", 192 | "counter-reset", 193 | "-ms-writing-mode", 194 | "vertical-align", 195 | "text-align", 196 | "-webkit-text-align-last", 197 | "-moz-text-align-last", 198 | "-ms-text-align-last", 199 | "text-align-last", 200 | "text-decoration", 201 | "text-emphasis", 202 | "text-emphasis-position", 203 | "text-emphasis-style", 204 | "text-emphasis-color", 205 | "text-indent", 206 | "-ms-text-justify", 207 | "text-justify", 208 | "text-outline", 209 | "text-transform", 210 | "text-wrap", 211 | "-ms-text-overflow", 212 | "text-overflow", 213 | "text-overflow-ellipsis", 214 | "text-overflow-mode", 215 | "text-shadow", 216 | "white-space", 217 | "word-spacing", 218 | "-ms-word-wrap", 219 | "word-wrap", 220 | "-ms-word-break", 221 | "word-break", 222 | "-moz-tab-size", 223 | "-o-tab-size", 224 | "tab-size", 225 | "-webkit-hyphens", 226 | "-moz-hyphens", 227 | "hyphens", 228 | "letter-spacing", 229 | "font", 230 | "font-weight", 231 | "font-style", 232 | "font-variant", 233 | "font-size-adjust", 234 | "font-stretch", 235 | "font-size", 236 | "font-family", 237 | "src", 238 | "line-height", 239 | "opacity", 240 | "-ms-filter:'progid:DXImageTransform.Microsoft.Alpha", 241 | "filter:progid:DXImageTransform.Microsoft.Alpha(Opacity", 242 | "-ms-interpolation-mode", 243 | "-webkit-filter", 244 | "-ms-filter", 245 | "filter", 246 | "resize", 247 | "cursor", 248 | "nav-index", 249 | "nav-up", 250 | "nav-right", 251 | "nav-down", 252 | "nav-left", 253 | "-webkit-transition", 254 | "-moz-transition", 255 | "-ms-transition", 256 | "-o-transition", 257 | "transition", 258 | "-webkit-transition-delay", 259 | "-moz-transition-delay", 260 | "-ms-transition-delay", 261 | "-o-transition-delay", 262 | "transition-delay", 263 | "-webkit-transition-timing-function", 264 | "-moz-transition-timing-function", 265 | "-ms-transition-timing-function", 266 | "-o-transition-timing-function", 267 | "transition-timing-function", 268 | "-webkit-transition-duration", 269 | "-moz-transition-duration", 270 | "-ms-transition-duration", 271 | "-o-transition-duration", 272 | "transition-duration", 273 | "-webkit-transition-property", 274 | "-moz-transition-property", 275 | "-ms-transition-property", 276 | "-o-transition-property", 277 | "transition-property", 278 | "-webkit-transform", 279 | "-moz-transform", 280 | "-ms-transform", 281 | "-o-transform", 282 | "transform", 283 | "-webkit-transform-origin", 284 | "-moz-transform-origin", 285 | "-ms-transform-origin", 286 | "-o-transform-origin", 287 | "transform-origin", 288 | "-webkit-animation", 289 | "-moz-animation", 290 | "-ms-animation", 291 | "-o-animation", 292 | "animation", 293 | "-webkit-animation-name", 294 | "-moz-animation-name", 295 | "-ms-animation-name", 296 | "-o-animation-name", 297 | "animation-name", 298 | "-webkit-animation-duration", 299 | "-moz-animation-duration", 300 | "-ms-animation-duration", 301 | "-o-animation-duration", 302 | "animation-duration", 303 | "-webkit-animation-play-state", 304 | "-moz-animation-play-state", 305 | "-ms-animation-play-state", 306 | "-o-animation-play-state", 307 | "animation-play-state", 308 | "-webkit-animation-timing-function", 309 | "-moz-animation-timing-function", 310 | "-ms-animation-timing-function", 311 | "-o-animation-timing-function", 312 | "animation-timing-function", 313 | "-webkit-animation-delay", 314 | "-moz-animation-delay", 315 | "-ms-animation-delay", 316 | "-o-animation-delay", 317 | "animation-delay", 318 | "-webkit-animation-iteration-count", 319 | "-moz-animation-iteration-count", 320 | "-ms-animation-iteration-count", 321 | "-o-animation-iteration-count", 322 | "animation-iteration-count", 323 | "-webkit-animation-direction", 324 | "-moz-animation-direction", 325 | "-ms-animation-direction", 326 | "-o-animation-direction", 327 | "animation-direction", 328 | "pointer-events", 329 | "unicode-bidi", 330 | "direction", 331 | "-webkit-columns", 332 | "-moz-columns", 333 | "columns", 334 | "-webkit-column-span", 335 | "-moz-column-span", 336 | "column-span", 337 | "-webkit-column-width", 338 | "-moz-column-width", 339 | "column-width", 340 | "-webkit-column-count", 341 | "-moz-column-count", 342 | "column-count", 343 | "-webkit-column-fill", 344 | "-moz-column-fill", 345 | "column-fill", 346 | "-webkit-column-gap", 347 | "-moz-column-gap", 348 | "column-gap", 349 | "-webkit-column-rule", 350 | "-moz-column-rule", 351 | "column-rule", 352 | "-webkit-column-rule-width", 353 | "-moz-column-rule-width", 354 | "column-rule-width", 355 | "-webkit-column-rule-style", 356 | "-moz-column-rule-style", 357 | "column-rule-style", 358 | "-webkit-column-rule-color", 359 | "-moz-column-rule-color", 360 | "column-rule-color", 361 | "break-before", 362 | "break-inside", 363 | "break-after", 364 | "page-break-before", 365 | "page-break-inside", 366 | "page-break-after", 367 | "orphans", 368 | "widows", 369 | "-ms-zoom", 370 | "zoom", 371 | "max-zoom", 372 | "min-zoom", 373 | "user-zoom", 374 | "orientation", 375 | "position" 376 | ] 377 | ] 378 | } 379 | -------------------------------------------------------------------------------- /test/fixtures/src/multi1.css: -------------------------------------------------------------------------------- 1 | .multi1 { 2 | z-index: 100; 3 | display: block; 4 | visibility: hidden; 5 | max-height: 44px; 6 | width: 100px; 7 | height: 100px; 8 | border-color: 1px #000 solid; 9 | background-color: red; 10 | vertical-align: 5px; 11 | text-align: center; 12 | font-weight: bold; 13 | } -------------------------------------------------------------------------------- /test/fixtures/src/multi1.resorted.css: -------------------------------------------------------------------------------- 1 | .multi1 2 | { 3 | font-weight: bold; 4 | 5 | z-index: 100; 6 | 7 | display: block; 8 | visibility: hidden; 9 | 10 | width: 100px; 11 | height: 100px; 12 | max-height: 44px; 13 | 14 | text-align: center; 15 | vertical-align: 5px; 16 | 17 | border-color: 1px #000 solid; 18 | background-color: red; 19 | } 20 | -------------------------------------------------------------------------------- /test/fixtures/src/multi2.css: -------------------------------------------------------------------------------- 1 | .multi2 { 2 | position: absolute; 3 | top: 10px; 4 | left: 10px; 5 | z-index: 10; 6 | display: table; 7 | float: left; 8 | margin: 10px; 9 | padding: 10px; 10 | width: 10px; 11 | height: 10px; 12 | border: 1px #fff solid; 13 | } -------------------------------------------------------------------------------- /test/fixtures/src/multi2.resorted.css: -------------------------------------------------------------------------------- 1 | .multi2 2 | { 3 | position: absolute; 4 | z-index: 10; 5 | top: 10px; 6 | left: 10px; 7 | 8 | display: table; 9 | float: left; 10 | 11 | width: 10px; 12 | height: 10px; 13 | margin: 10px; 14 | padding: 10px; 15 | 16 | border: 1px #fff solid; 17 | } 18 | -------------------------------------------------------------------------------- /test/fixtures/style.css: -------------------------------------------------------------------------------- 1 | .comb { 2 | width: 100px; 3 | height: 100px; 4 | background-color: red; 5 | text-align: center; 6 | font-weight: bold; 7 | display: block; 8 | } --------------------------------------------------------------------------------