├── .gitignore ├── README.md ├── composer.json ├── cssmin ├── gui ├── index.php ├── scripts.js ├── styles.css └── third-party │ ├── bootstrap │ ├── css │ │ └── bootstrap.min.css │ └── js │ │ └── bootstrap.min.js │ ├── jquery-1.12.4.min.js │ └── less-1.7.5.min.js ├── phpunit.xml ├── src ├── Colors.php ├── Command.php ├── Minifier.php └── Utils.php └── tests ├── FineDiff └── Render │ └── Cli.php ├── MinifierTest.php ├── bin └── runner ├── expectations ├── at-rules.css ├── attribute-selectors.css ├── background-position.css ├── background.css ├── bootstrap.css ├── border.css ├── bulma.css ├── calc.css ├── colors.css ├── comments.css ├── dataurl-base64-doublequotes.css ├── dataurl-base64-eof.css ├── dataurl-base64-linebreakindata.css ├── dataurl-base64-noquotes.css ├── dataurl-base64-singlequotes.css ├── dataurl-base64-twourls.css ├── dataurl-dbquote-font.css ├── dataurl-inline-svg.css ├── dataurl-nonbase64-doublequotes.css ├── dataurl-nonbase64-noquotes.css ├── dataurl-nonbase64-singlequotes.css ├── dataurl-noquote-multiline-font.css ├── dataurl-realdata-doublequotes.css ├── dataurl-realdata-noquotes.css ├── dataurl-realdata-singlequotes.css ├── dataurl-realdata-yuiapp.css ├── dataurl-singlequote-font.css ├── empty-rules.css ├── flex.css ├── font-weight.css ├── foundation.css ├── important-comments-remove.css ├── important.css ├── kube.css ├── linebreak-position.css ├── lowercasing.css ├── materialize.css ├── mui.css ├── numbers.css ├── old-ie-filters.css ├── preserve-case.css ├── pseudo-classes.css ├── pseudo-elements.css ├── pure.css ├── semicolons.css ├── shortenable-properties.css ├── sourcemap-comment-preserve.css ├── sourcemap-comment-remove.css ├── star-underscore-hacks.css ├── strings.css ├── text-shadow.css ├── unit-ms.css └── webkit-transform-origin.css └── fixtures ├── at-rules.css ├── attribute-selectors.css ├── background-position.css ├── background.css ├── bootstrap.css ├── border.css ├── bulma.css ├── calc.css ├── colors.css ├── comments.css ├── dataurl-base64-doublequotes.css ├── dataurl-base64-eof.css ├── dataurl-base64-linebreakindata.css ├── dataurl-base64-noquotes.css ├── dataurl-base64-singlequotes.css ├── dataurl-base64-twourls.css ├── dataurl-dbquote-font.css ├── dataurl-inline-svg.css ├── dataurl-nonbase64-doublequotes.css ├── dataurl-nonbase64-noquotes.css ├── dataurl-nonbase64-singlequotes.css ├── dataurl-noquote-multiline-font.css ├── dataurl-realdata-doublequotes.css ├── dataurl-realdata-noquotes.css ├── dataurl-realdata-singlequotes.css ├── dataurl-realdata-yuiapp.css ├── dataurl-singlequote-font.css ├── empty-rules.css ├── flex.css ├── font-weight.css ├── foundation.css ├── important.css ├── kube.css ├── linebreak-position.css ├── lowercasing.css ├── materialize.css ├── mui.css ├── numbers.css ├── old-ie-filters.css ├── preserve-case.css ├── pseudo-classes.css ├── pseudo-elements.css ├── pure.css ├── semicolons.css ├── shortenable-properties.css ├── sourcemap-comment.css ├── star-underscore-hacks.css ├── strings.css ├── text-shadow.css ├── unit-ms.css └── webkit-transform-origin.css /.gitignore: -------------------------------------------------------------------------------- 1 | .* 2 | !/.gitignore 3 | /vendor 4 | composer.lock 5 | composer.phar -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # A PHP port of the YUI CSS compressor 2 | 3 | [![Latest Stable Version](https://poser.pugx.org/tubalmartin/cssmin/v/stable)](https://packagist.org/packages/tubalmartin/cssmin) [![Total Downloads](https://poser.pugx.org/tubalmartin/cssmin/downloads)](https://packagist.org/packages/tubalmartin/cssmin) [![Daily Downloads](https://poser.pugx.org/tubalmartin/cssmin/d/daily)](https://packagist.org/packages/tubalmartin/cssmin) [![License](https://poser.pugx.org/tubalmartin/cssmin/license)](https://packagist.org/packages/tubalmartin/cssmin) 4 | 5 | This port is based on version 2.4.8 (Jun 12, 2013) of the [YUI compressor](https://github.com/yui/yuicompressor). 6 | This port contains fixes & features not present in the original YUI compressor. 7 | 8 | **Table of Contents** 9 | 10 | 1. [Installation & requirements](#install) 11 | 2. [How to use](#howtouse) 12 | 3. [Tests](#tests) 13 | 4. [API Reference](#api) 14 | 5. [Who uses this?](#whousesit) 15 | 6. [Changelog](#changelog) 16 | 17 | 18 | 19 | ## 1. Installation & requirements 20 | 21 | ### Installation 22 | 23 | Use [Composer](http://getcomposer.org/) to include the library into your project: 24 | 25 | $ composer.phar require tubalmartin/cssmin 26 | 27 | Require Composer's autoloader file: 28 | 29 | ```php 30 | 45 | 46 | ## 2. How to use 47 | 48 | There are three ways you can use this library: 49 | 50 | 1. [PHP](#php) 51 | 2. [CLI](#cli) 52 | 3. [GUI](#gui) 53 | 54 | 55 | 56 | ### PHP 57 | 58 | ```php 59 | keepSourceMapComment(); 80 | 81 | // Remove important comments from output. 82 | $compressor->removeImportantComments(); 83 | 84 | // Split long lines in the output approximately every 1000 chars. 85 | $compressor->setLineBreakPosition(1000); 86 | 87 | // Override any PHP configuration options before calling run() (optional) 88 | $compressor->setMemoryLimit('256M'); 89 | $compressor->setMaxExecutionTime(120); 90 | $compressor->setPcreBacktrackLimit(3000000); 91 | $compressor->setPcreRecursionLimit(150000); 92 | 93 | // Compress the CSS code! 94 | $output_css = $compressor->run($input_css); 95 | 96 | // You can override any setup between runs without having to create another CSSmin object. 97 | // Let's say you want to remove the sourcemap comment from the output and 98 | // disable splitting long lines in the output. 99 | // You can achieve that using the methods `keepSourceMap` and `setLineBreakPosition`: 100 | $compressor->keepSourceMapComment(false); 101 | $compressor->setLineBreakPosition(0); 102 | $output_css = $compressor->run($input_css); 103 | 104 | // Do whatever you need with the compressed CSS code 105 | echo $output_css; 106 | ``` 107 | 108 | 109 | 110 | ### CLI 111 | 112 | A binary file named `cssmin` will be created after installation in `./vendor/bin` folder. 113 | 114 | Output help: 115 | ``` 116 | ./vendor/bin/cssmin -h 117 | ``` 118 | Output compression result to the command line: 119 | ``` 120 | ./vendor/bin/cssmin -i ./my-css-file.css 121 | ``` 122 | Output compression result to another file: 123 | ``` 124 | ./vendor/bin/cssmin -i ./my-css-file.css -o ./my-css-file.min.css 125 | ``` 126 | Output compression result to another file and keep sourcemap comment in the output: 127 | ``` 128 | ./vendor/bin/cssmin -i ./my-css-file.css -o ./my-css-file.min.css --keep-sourcemap 129 | ``` 130 | See the binary help for all available CLI options. 131 | 132 | 133 | 134 | ### GUI 135 | 136 | We've made a simple web based GUI to use the compressor, it's in the `gui` folder. 137 | 138 | GUI features: 139 | 140 | * Optional on-the-fly LESS compilation before compression with error reporting included. 141 | * Absolute control of the library. 142 | 143 | How to use the GUI: 144 | 145 | * You need a server with PHP 5.3.2+ installed. 146 | * Download the repository and upload it to a folder in your server. 147 | * Run `php composer.phar install` in project's root to install dependencies. 148 | * Open your favourite browser and enter the URL to the `/gui` folder. 149 | 150 | 151 | 152 | ## 3. Tests 153 | 154 | Tests from YUI compressor have been modified to fit this port. 155 | 156 | How to run the test suite: 157 | 158 | * Run `php composer.phar install` in project's root to install dependencies. `phpunit` will be installed locally. 159 | * After that, run `phpunit` in the command line: 160 | 161 | ``` 162 | ./vendor/bin/phpunit 163 | ``` 164 | 165 | PHPUnit diffing is too simple so when a test fails it's hard to see the actual diff, that's why I've created a 166 | test runner that displays inline coloured diffs for a failing test. Only one test can be run at a time. 167 | 168 | Here's how to use it: 169 | 170 | ``` 171 | ./tests/bin/runner -t [-f ] [--keep-sourcemap] [--remove-important-comments] [--linebreak-position ] 172 | ``` 173 | 174 | 175 | 176 | ## 4. API Reference 177 | 178 | ### __construct ([ bool *$raisePhpLimits* ]) 179 | 180 | Class constructor, creates a new CSSmin object. 181 | 182 | **Parameters** 183 | 184 | *raisePhpLimits* 185 | 186 | If TRUE, CSSmin will try to raise the values of some php configuration options. 187 | Set to FALSE to keep the values of your php configuration options. 188 | Defaults to TRUE. 189 | 190 | ### run (string *$css*) 191 | 192 | Minifies a string of uncompressed CSS code. 193 | `run()` may be called multiple times on a single CSSmin instance. 194 | 195 | **Parameters** 196 | 197 | *css* 198 | 199 | A string of uncompressed CSS code. 200 | CSSmin default value: `''` (empty string). 201 | 202 | **Return Values** 203 | 204 | A string of compressed CSS code or an empty string if no string is passed. 205 | 206 | ### keepSourceMapComment (bool *$keepSourceMap*) 207 | 208 | Sets whether to keep sourcemap comment `/*# sourceMappingURL= */`in the output. 209 | CSSmin default behavior: Sourcemap comment gets removed from output. 210 | 211 | ### removeImportantComments (bool *$removeImportantComments*) 212 | 213 | Sets whether to remove important comments from output. 214 | CSSmin default behavior: Important comments outside declaration blocks are kept in the output. 215 | 216 | ### setLinebreakPosition (int *$position*) 217 | 218 | Some source control tools don't like it when files containing lines longer than, say 8000 characters, are checked in. 219 | The linebreak option is used in that case to split long lines after a specific column. 220 | 221 | CSSmin default value: `0` (all CSS code in 1 long line). 222 | Minimum value supported: `1`. 223 | 224 | ### setMaxExecutionTime (int *$seconds*) 225 | 226 | Sets the `max_execution_time` configuration option for this script 227 | 228 | CSSmin default value: `60` 229 | Values & notes: [max_execution_time documentation](http://php.net/manual/en/info.configuration.php#ini.max-execution-time) 230 | 231 | ### setMemoryLimit (mixed *$limit*) 232 | 233 | Sets the `memory_limit` configuration option for this script 234 | 235 | CSSmin default value: `128M` 236 | Values & notes: [memory_limit documentation](http://php.net/manual/en/ini.core.php#ini.memory-limit) 237 | 238 | ### setPcreBacktrackLimit (int *$limit*) 239 | 240 | Sets the `pcre.backtrack_limit` configuration option for this script 241 | 242 | CSSmin default value: `1000000` 243 | Values & notes: [pcre.backtrack_limit documentation](http://php.net/manual/en/pcre.configuration.php#ini.pcre.backtrack-limit) 244 | 245 | ### setPcreRecursionLimit (int *$limit*) 246 | 247 | Sets the `pcre.recursion_limit` configuration option for this script. 248 | 249 | CSSmin default value: `500000` 250 | Values & notes: [pcre.recursion_limit documentation](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) 251 | 252 | 253 | 254 | 255 | ## 5. Who uses this port 256 | 257 | * [Magento](https://magento.com/) eCommerce platforms and solutions for selling online. 258 | * [Minify](https://github.com/mrclay/minify) Minify is an HTTP content server. It compresses sources of content (usually files), combines the result and serves it with appropriate HTTP headers. 259 | * [Autoptimize](http://wordpress.org/plugins/autoptimize/) is a Wordpress plugin. Autoptimize speeds up your website and helps you save bandwidth by aggregating and minimizing JS, CSS and HTML. 260 | * [IMPRESSPAGES](http://www.impresspages.org/) PHP framework with content editor. 261 | * [Other dependent Composer packages](https://packagist.org/packages/tubalmartin/cssmin/dependents). 262 | 263 | 264 | 265 | ## 6. Changelog 266 | 267 | ### v4.1.1 15 Jan 2018 268 | 269 | FIXED: 270 | * Breakage when minifying at-import rule with unquoted urls containing semicolons [#45](https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues/45) 271 | 272 | ### v4.1.0 16 May 2017 273 | 274 | * NEW: 275 | * `--dry-run` CLI argument to perform a dry run and display statistics. 276 | * IMPROVED: 277 | * Performance: 2x times faster than v4.0.0 after code profiling: 278 | * A 1MB file takes 1.8s with PHP 5.3.29 and 350ms with PHP 7.0.18 (on average). 279 | * A full Bootstrap v3.3.7 CSS suite takes 330ms with PHP 5.3.29 and 50ms with PHP 7.0.18 (on average). 280 | 281 | ### v4.0.0 15 May 2017 282 | 283 | NEW: 284 | * API: 285 | * Removed: `setChunkLength()` method and `--chunk-length` CLI argument. 286 | * Modified: `keepSourceMap()` method is now named `keepSourceMapComment()`. CLI argument `--keep-sourcemap` stays the same but we've added `--keep-sourcemap-comment` too. 287 | * Modified: `run()` method signature. It only accepts one argument now. 288 | * Added: `removeImportantComments()` method & `--keep-important-comments` CLI argument. 289 | * Important comments `/*! ... */` can be optionally removed from output too calling `removeImportantComments()` method. 290 | 291 | ### v3.3.1 16 May 2017 292 | 293 | * Backported performance improvements made in v4.1.0 294 | 295 | ### v3.3.0 13 May 2017 296 | 297 | NEW: 298 | * CLI binary displays some useful stats after execution. 299 | * A concatenated file can be safely compressed now: `@charset`, `@import` & `@namespace` at-rules will be placed correctly. 300 | * Conditional group rules fully and safely supported, that is, unlimited rule nesting levels. Previously only one nesting level was fully supported. 301 | 302 | NOTES: 303 | * Pretty big refactor done for two main reasons: 304 | * Make minified output even more reliable even when a potential scenario has not been tested beforehand. 305 | * Make development, testing and contribution a bit easier due to simplified logic. 306 | * As a consequence of this refactor, stylesheet chunking is not needed anymore. `setChunkLength` method and `--chunk-length` CLI argument 307 | still exist for backwards compatibility reasons but have no effect at all. 308 | 309 | ### v3.2.0 10 May 2017 310 | 311 | NEW: 312 | * PHPUnit added as test runner. 313 | * CLI binary provided. 314 | * CSS Sourcemap special comment supported. 315 | * `ms` unit compression: from `300ms` to `.3s`. 316 | * Shortable double colon (CSS3) pseudo-elements are now shortened to single colon (CSS2): from `::after` to `:after`. 317 | * `background: none` & `background: transparent` are shortened to `background:0 0`. 318 | 319 | IMPROVED: 320 | * Some regular expressions. 321 | * Long line splitting algorithm. 322 | * Lowercasing pseudo-classes, pseudo-elements and functions to cover more cases. 323 | * Shortening of suitable shorthand properties with repeated values. All cases are covered now. 324 | * Tests. 325 | 326 | FIXED: 327 | * When splitting long lines in the output, if a comment or string contained closing curly braces `}`, the curly brace 328 | could be recognised as a selector or at-rule closing curly brace resulting in an unexpected newline being added. 329 | 330 | ### v3.1.2 17 Apr 2017 331 | 332 | * Improved compression of long named colors: now all long named colors get compressed to their shorter HEX counterpart. 333 | * Fixes cases such as [#39](https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues/39) 334 | * Huge performance improvement after code profiling. See table below for results when running the whole test suite: 335 | 336 | PHP version used: 5.3.29 337 | 338 | | chunkLength | v3.1.1 | v3.1.2 | 339 | | --- | --- | --- | 340 | | 100 | 6.8s | 2.6s | 341 | | 1000 | 5.3s | 2s | 342 | | 2000 | 5.2s | 1.95s | 343 | | 5000 | 5.1s | 1.9s | 344 | 345 | PHP version used: 7.0.8 346 | 347 | | chunkLength | v3.1.1 | v3.1.2 | 348 | | --- | --- | --- | 349 | | 100 | 2s | 0.72s | 350 | | 1000 | 1s | 0.37s | 351 | | 2000 | 0.8s | 0.33s | 352 | | 5000 | 0.7s | 0.3s | 353 | 354 | 355 | ### v3.1.1 11 Apr 2017 356 | 357 | * Regexes improved. 358 | * Small performance improvements. 359 | * Blocks such as `@media` blocks with empty rules are removed too. 360 | * Quoted unquotable attribute selectors get unquoted now i.e. from `col[class*="col-"]` to `col[class*=col-]`. Covers most common cases. Safe approach. 361 | 362 | ### v3.1.0 9 Apr 2017 363 | 364 | * Code deeply analyzed. Some areas rewritten from the ground up with maximum performance in mind. No change in compressor behavior. 365 | * Fixed some hidden bugs discovered along the way that affected performance negatively. 366 | * IE5/Mac comment hack removed from minifier logic. Those comments will no longer be preserved. 367 | * The table below displays the performance optimization done in this version in comparison with the previous one running the whole test suite: 368 | 369 | PHP version used: 5.3.29 370 | 371 | | chunkLength | v3.0.0 | v3.1.0 | 372 | | --- | --- | --- | 373 | | 100 | 38s | 6.9s | 374 | | 1000 | 8.5s | 5.4s | 375 | | 2000 | 7.3s | 5.3s | 376 | | 5000 | 5.8s | 5.2s | 377 | 378 | PHP version used: 7.0.8 379 | 380 | | chunkLength | v3.0.0 | v3.1.0 | 381 | | --- | --- | --- | 382 | | 100 | 22.8s | 2.1s | 383 | | 1000 | 2.9s | 1.1s | 384 | | 2000 | 2s | 0.9s | 385 | | 5000 | 1.3s | 0.8s | 386 | 387 | ### v3.0.0 4 Apr 2017 388 | 389 | * New API compliant with PSR-1, PSR-2 & PSR-4. PHP 5.3.2+ required. I think it was time! 390 | * Many tests added, strengthened and fixed. Big, real life, stylesheets included such as Bootstrap or Foundation. 391 | * Fixed some critical and minor issues, such as: 392 | * Chunking system breaking some stylesheets (broken at rules block) or leaving some bits off. 393 | * Backreferences in replacement strings breaking stylesheets. 394 | * [#23](https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues/23) 395 | * Others... 396 | * Color compression improved. Now all named colors are supported i.e. from `white` to `#fff`. 397 | * Shortening zero values is back but in a safe manner, shortening values assigned to "safe" properties only i.e. from `margin: 1px 0.0em 0rem 0%` to `margin:1px 0 0`. Check the code to see the list of "safe" properties. 398 | * `padding` and `margin` properties are shortened to the bare minimum i.e. from `margin: 3px 2.1em 3px 2.1em` => `margin:3px 2.1em` 399 | * Upgrading to v3 is strongly recommended for users enjoying PHP 5.3.2+. 400 | 401 | ### v2.4.8-p10 4 Apr 2017 402 | 403 | * This is the last v2 release. v3 onwards will only support PHP 5.3.2+. 404 | * This patch has all improvements and fixes v3.0.0 has. See v3.0.0 notes for further info (no API change in this version of course). 405 | * Updating to this patch is strongly recommended for users stuck with PHP versions lower than PHP 5.3. 406 | 407 | ### v2.4.8-p9 28 Mar 2017 408 | 409 | * Rolling back property declaration with scalar expressions (>= PHP 5.6) introduced in v2.4.8-p8 to support PHP 5.0. No change in compressor behavior. 410 | 411 | ### v2.4.8-p8 27 Mar 2017 412 | 413 | * Fixed issue [#18](https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/pull/18) 414 | * Added `set_chunk_length` method. 415 | * `bold` & `normal` values get compressed to `700` & `400` respectively for `font-weight` property. 416 | * GUI updated. 417 | * FineDiff library loaded through Composer. 418 | * README updated. 419 | 420 | ### v2.4.8-p7 26 Mar 2017 421 | 422 | * Fixed many issues [#20](https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues/20), [#22](https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues/22), [#24](https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues/24), [#25](https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues/25), [#26](https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues/26) reported by contributors and others that I'm sure haven't been reported, at least yet. Sorry for the long delay guys. 423 | * This release is all about stability and reliability and as such I've had to take some controversial decisions such as: 424 | * Not minifying `none` property value to `0` because in some subtle scenarios the resulting output may render some styles differently. 425 | * Not removing units from zero length values because in many cases the output will break the intended behavior. Patching every single case after someone finds a new breaking case is not good IMHO taking into account CSS is a live spec and browsers differ in some cases. 426 | * Hope you agree with me removing those conflicting parts. Enjoy this release :) 427 | 428 | ### v2.4.8-p6 21 Mar 2017 429 | 430 | * Fixed PHP CLI issues. See [#36](https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/pull/36) 431 | 432 | ### v2.4.8-p5 27 Feb 2017 433 | 434 | * Fixed PHP 7 issues. 435 | 436 | ### v2.4.8-p4 22 Sep 2014 437 | 438 | * Composer support. The package is [tubalmartin/cssmin](https://packagist.org/packages/tubalmartin/cssmin) 439 | * Fixed issue [#17] 440 | 441 | ### v2.4.8-p3 26 Apr 2014 442 | 443 | * Fixed all reported bugs: See issues [#11], [#13] (first case only) and [#14]. 444 | * LESS compiler upgraded to version 1.7.0 445 | 446 | ### v2.4.8-p2 13 Nov 2013 447 | 448 | * Chunk length reduced to 5000 chars (previously 25.000 chars) in an effort to avoid PCRE backtrack limits (needs feedback). 449 | * Improvements for the `@keyframes 0%` step bug. Tests improved. 450 | * Fix IE7 issue on matrix filters which browser accept whitespaces between Matrix parameters 451 | * LESS compiler upgraded to version 1.4.2 452 | 453 | ### v2.4.8-p1 8 Aug 2013 454 | 455 | * Fix for the `@keyframes 0%` step bug. Tests added. 456 | * LESS compiler upgraded to version 1.4.1 457 | 458 | [#11]: https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues/11 459 | [#13]: https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues/13 460 | [#14]: https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues/14 461 | [#17]: https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues/17 462 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tubalmartin/cssmin", 3 | "description": "A PHP port of the YUI CSS compressor", 4 | "keywords": ["yui", "compressor", "css", "cssmin", "compress", "minify"], 5 | "homepage": "https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port", 6 | "license": "BSD-3-Clause", 7 | "authors": [ 8 | { 9 | "name": "Túbal Martín", 10 | "homepage": "http://tubalmartin.me/" 11 | } 12 | ], 13 | "support": { 14 | "issues": "https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues", 15 | "source": "https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port" 16 | }, 17 | "autoload": { 18 | "psr-4": { 19 | "tubalmartin\\CssMin\\": "src" 20 | } 21 | }, 22 | "autoload-dev": { 23 | "psr-4": { 24 | "tubalmartin\\CssMin\\Tests\\": "tests" 25 | } 26 | }, 27 | "bin": [ 28 | "cssmin" 29 | ], 30 | "require": { 31 | "php": ">=5.3.2", 32 | "ext-pcre": "*" 33 | }, 34 | "require-dev": { 35 | "cogpowered/finediff": "0.3.*", 36 | "phpunit/phpunit": "4.8.*" 37 | } 38 | } -------------------------------------------------------------------------------- /cssmin: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | $data) { 25 | $value->{$key} = stripslashes_deep($data); 26 | } 27 | } else { 28 | $value = stripslashes($value); 29 | } 30 | 31 | return $value; 32 | } 33 | 34 | // Disable magic quotes at runtime. 35 | if (function_exists('ini_set')) { 36 | ini_set('magic_quotes_sybase', 0); 37 | ini_set('get_magic_quotes_runtime', 0); 38 | } 39 | 40 | // If get_magic_quotes_gpc is active, strip slashes 41 | if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) { 42 | $_POST = stripslashes_deep($_POST); 43 | } 44 | 45 | 46 | if (!empty($_POST)) : 47 | // Form options 48 | parse_str($_POST['options']); 49 | 50 | $linebreak_pos = trim($linebreak_pos) !== '' ? $linebreak_pos : false; 51 | $raise_php = isset($raise_php) ? true : false; 52 | 53 | // Create a new CSSmin object and try to raise PHP settings 54 | $compressor = new CSSmin($raise_php); 55 | 56 | if ($linebreak_pos !== false) { 57 | $compressor->setLineBreakPosition($linebreak_pos); 58 | } 59 | 60 | if (isset($keep_sourcemap)) { 61 | $compressor->keepSourceMapComment(); 62 | } 63 | 64 | if (isset($remove_important_comments)) { 65 | $compressor->removeImportantComments(); 66 | } 67 | 68 | if ($raise_php) { 69 | $compressor->setMemoryLimit($memory_limit); 70 | $compressor->setMaxExecutionTime($max_execution_time); 71 | $compressor->setPcreBacktrackLimit(1000 * $pcre_backtrack_limit); 72 | $compressor->setPcreRecursionLimit(1000 * $pcre_recursion_limit); 73 | } 74 | 75 | // Compress the CSS code and store data 76 | $output = array(); 77 | $output['css'] = $compressor->run($_POST['css']); 78 | $output['originalSize'] = mb_strlen($_POST['css'], '8bit'); 79 | $output['compressedSize'] = mb_strlen($output['css'], '8bit'); 80 | $output['bytesSaved'] = $output['originalSize'] - $output['compressedSize']; 81 | $output['compressionRatio'] = round(($output['bytesSaved'] * 100) / 82 | ($output['originalSize'] === 0 ? 1 : $output['originalSize']), 2); 83 | 84 | // Output data 85 | echo json_encode($output); 86 | else : 87 | ?> 88 | 89 | 90 | 91 | 92 | 93 | YUI CSS compressor - PHP 94 | 95 | 96 | 97 | 98 | 99 | 106 |
107 |
108 |
109 | 110 |
111 |
112 |
113 | 114 | 115 |
116 |
117 | 118 | Original size: bytes | Compressed size: bytes | Bytes saved: | Compression ratio: % 119 | 120 |
121 |
122 |
123 | 194 |
195 |
196 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 210 | -------------------------------------------------------------------------------- /gui/scripts.js: -------------------------------------------------------------------------------- 1 | $(function(){ 2 | 3 | var inputCss = $('#input-css') 4 | , outputCss = $('#output-css') 5 | , outputContainer = $('#output-container') 6 | , originalSize = $('#original-size') 7 | , compressedSize = $('#compressed-size') 8 | , bytesSaved = $('#bytes-saved') 9 | , compressionRatio = $('#compression-ratio') 10 | , compressBtn = $('#compress-btn') 11 | , lessConsole = $('#less-error-message') 12 | 13 | /** 14 | * Prints LESS compilation errors 15 | */ 16 | , lessError = function(e) { 17 | var content, errorline 18 | , template = '
  • {content}
  • ' 19 | , error = []; 20 | 21 | content = '

    ' + (e.type || "Syntax") + "Error: " + (e.message || 'There is an error in your .less file') + 22 | '

    ' + '

    '; 23 | 24 | errorline = function (e, i, classname) { 25 | if (e.extract[i] != undefined) { 26 | error.push(template.replace(/\{line\}/, (parseInt(e.line) || 0) + (i - 1)) 27 | .replace(/\{class\}/, classname) 28 | .replace(/\{content\}/, e.extract[i])); 29 | } 30 | }; 31 | 32 | if (e.stack) { 33 | content += '
    ' + e.stack.split('\n').slice(1).join('
    '); 34 | } else if (e.extract) { 35 | errorline(e, 0, ''); 36 | errorline(e, 1, 'line'); 37 | errorline(e, 2, ''); 38 | content += 'on line ' + e.line + ', column ' + (e.column + 1) + ':

    ' + 39 | '
      ' + error.join('') + '
    '; 40 | } 41 | 42 | lessConsole.html(content).slideDown('fast'); 43 | } 44 | 45 | /** 46 | * Compresses user's CSS with the PHP port of the YUI compressor 47 | */ 48 | , compress = function(formData) { 49 | $.post(window.location.href, formData, function(data, textStatus, jqXHR){ 50 | // Hide LESS error console 51 | lessConsole.slideUp('fast'); 52 | 53 | // Fill output & show 54 | outputCss.val(data.css); 55 | originalSize.html(data.originalSize); 56 | compressedSize.html(data.compressedSize); 57 | bytesSaved.html(data.bytesSaved); 58 | compressionRatio.html(data.compressionRatio); 59 | 60 | outputContainer.slideDown('fast'); 61 | 62 | // Restore button state 63 | compressBtn.button('reset'); 64 | }, 'json'); 65 | }; 66 | 67 | 68 | 69 | /** 70 | * Controller 71 | */ 72 | $('#options-form').on('submit', function(e){ 73 | e && e.preventDefault(); 74 | 75 | var data = { 76 | css: inputCss.val(), 77 | options: $(this).serialize() 78 | }; 79 | 80 | // Change button state 81 | compressBtn.button('loading'); 82 | 83 | // If LESS enabled, precompile CSS with LESS and then compress 84 | if (!!$('#enable-less:checked').val()) { 85 | try { 86 | new(less.Parser)().parse(data.css, function (err, tree) { 87 | if (err) { 88 | lessError(err); 89 | compressBtn.button('reset'); 90 | } else { 91 | data.css = tree.toCSS(); 92 | compress(data); 93 | } 94 | }); 95 | } catch (err) { 96 | lessError(err); 97 | compressBtn.button('reset'); 98 | } 99 | } else { 100 | compress(data); 101 | } 102 | }); 103 | 104 | }); -------------------------------------------------------------------------------- /gui/styles.css: -------------------------------------------------------------------------------- 1 | /* LESS error report styles */ 2 | .less-error-message { 3 | font-family: Arial, sans-serif; 4 | border: 1px solid #e00; 5 | border: 1px solid rgba(238,0,0, 0.5); 6 | background-color: whiteSmoke; 7 | border-radius: 4px; 8 | -webkit-border-radius: 4px; 9 | -moz-border-radius: 4px; 10 | -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0, 0.05); 11 | -moz-box-shadow: inset 0 1px 1px rgba(0,0,0, 0.05); 12 | box-shadow: inset 0 1px 1px rgba(0,0,0, 0.05); 13 | color: #e00; 14 | padding: 18px; 15 | margin-bottom: 18px; 16 | display:none; 17 | } 18 | .less-error-message ul, .less-error-message li { 19 | list-style-type: none; 20 | padding: 0; 21 | margin: 0; 22 | } 23 | .less-error-message label { 24 | font-size: 12px; 25 | margin-right: 15px; 26 | padding: 4px 0; 27 | color: #cc7777; 28 | display: inline; 29 | } 30 | .less-error-message pre { 31 | color: #dd6666; 32 | padding: 4px 0; 33 | margin: 0; 34 | display: inline-block; 35 | } 36 | .less-error-message pre.line { 37 | color: red; 38 | } 39 | .less-error-message h3 { 40 | font-size: 20px; 41 | font-weight: bold; 42 | padding: 0 0 5px 0; 43 | margin: 0; 44 | } 45 | .less-error-message a { 46 | color: #10a; 47 | } 48 | .less-error-message .error { 49 | color: red; 50 | font-weight: bold; 51 | padding-bottom: 2px; 52 | border-bottom: 1px dashed red; 53 | } 54 | 55 | pre { 56 | white-space: pre-wrap; /* css-3 */ 57 | white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */ 58 | white-space: -pre-wrap; /* Opera 4-6 */ 59 | white-space: -o-pre-wrap; /* Opera 7 */ 60 | word-wrap: break-word; /* Internet Explorer 5.5+ */ 61 | } 62 | 63 | /* APP styles */ 64 | .version{font-size:10px;font-style: italic;letter-spacing: 2px} 65 | 66 | legend{font-size: 15px; line-height: 20px; margin-bottom:0} 67 | .control-group{margin-bottom:12px;} 68 | #output-container{margin-top:18px} -------------------------------------------------------------------------------- /gui/third-party/bootstrap/js/bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Bootstrap.js by @fat & @mdo 3 | * plugins: bootstrap-button.js 4 | * Copyright 2012 Twitter, Inc. 5 | * http://www.apache.org/licenses/LICENSE-2.0.txt 6 | */ 7 | !function(a){var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.button.defaults,c)};b.prototype={constructor:b,setState:function(a){var b="disabled",c=this.$element,d=c.data(),e=c.is("input")?"val":"html";a+="Text",d.resetText||c.data("resetText",c[e]()),c[e](d[a]||this.options[a]),setTimeout(function(){a=="loadingText"?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},toggle:function(){var a=this.$element.parent('[data-toggle="buttons-radio"]');a&&a.find(".active").removeClass("active"),this.$element.toggleClass("active")}},a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("button"),f=typeof c=="object"&&c;e||d.data("button",e=new b(this,f)),c=="toggle"?e.toggle():c&&e.setState(c)})},a.fn.button.defaults={loadingText:"loading..."},a.fn.button.Constructor=b,a(function(){a("body").on("click.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle")})})}(window.jQuery) -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 12 | tests 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/Colors.php: -------------------------------------------------------------------------------- 1 | 'azure', 12 | '#f5f5dc' => 'beige', 13 | '#ffe4c4' => 'bisque', 14 | '#a52a2a' => 'brown', 15 | '#ff7f50' => 'coral', 16 | '#ffd700' => 'gold', 17 | '#808080' => 'gray', 18 | '#008000' => 'green', 19 | '#4b0082' => 'indigo', 20 | '#fffff0' => 'ivory', 21 | '#f0e68c' => 'khaki', 22 | '#faf0e6' => 'linen', 23 | '#800000' => 'maroon', 24 | '#000080' => 'navy', 25 | '#fdf5e6' => 'oldlace', 26 | '#808000' => 'olive', 27 | '#ffa500' => 'orange', 28 | '#da70d6' => 'orchid', 29 | '#cd853f' => 'peru', 30 | '#ffc0cb' => 'pink', 31 | '#dda0dd' => 'plum', 32 | '#800080' => 'purple', 33 | '#f00' => 'red', 34 | '#fa8072' => 'salmon', 35 | '#a0522d' => 'sienna', 36 | '#c0c0c0' => 'silver', 37 | '#fffafa' => 'snow', 38 | '#d2b48c' => 'tan', 39 | '#008080' => 'teal', 40 | '#ff6347' => 'tomato', 41 | '#ee82ee' => 'violet', 42 | '#f5deb3' => 'wheat' 43 | ); 44 | } 45 | 46 | public static function getNamedToHexMap() 47 | { 48 | // Named colors longer than hex counterpart 49 | return array( 50 | 'aliceblue' => '#f0f8ff', 51 | 'antiquewhite' => '#faebd7', 52 | 'aquamarine' => '#7fffd4', 53 | 'black' => '#000', 54 | 'blanchedalmond' => '#ffebcd', 55 | 'blueviolet' => '#8a2be2', 56 | 'burlywood' => '#deb887', 57 | 'cadetblue' => '#5f9ea0', 58 | 'chartreuse' => '#7fff00', 59 | 'chocolate' => '#d2691e', 60 | 'cornflowerblue' => '#6495ed', 61 | 'cornsilk' => '#fff8dc', 62 | 'darkblue' => '#00008b', 63 | 'darkcyan' => '#008b8b', 64 | 'darkgoldenrod' => '#b8860b', 65 | 'darkgray' => '#a9a9a9', 66 | 'darkgreen' => '#006400', 67 | 'darkgrey' => '#a9a9a9', 68 | 'darkkhaki' => '#bdb76b', 69 | 'darkmagenta' => '#8b008b', 70 | 'darkolivegreen' => '#556b2f', 71 | 'darkorange' => '#ff8c00', 72 | 'darkorchid' => '#9932cc', 73 | 'darksalmon' => '#e9967a', 74 | 'darkseagreen' => '#8fbc8f', 75 | 'darkslateblue' => '#483d8b', 76 | 'darkslategray' => '#2f4f4f', 77 | 'darkslategrey' => '#2f4f4f', 78 | 'darkturquoise' => '#00ced1', 79 | 'darkviolet' => '#9400d3', 80 | 'deeppink' => '#ff1493', 81 | 'deepskyblue' => '#00bfff', 82 | 'dodgerblue' => '#1e90ff', 83 | 'firebrick' => '#b22222', 84 | 'floralwhite' => '#fffaf0', 85 | 'forestgreen' => '#228b22', 86 | 'fuchsia' => '#f0f', 87 | 'gainsboro' => '#dcdcdc', 88 | 'ghostwhite' => '#f8f8ff', 89 | 'goldenrod' => '#daa520', 90 | 'greenyellow' => '#adff2f', 91 | 'honeydew' => '#f0fff0', 92 | 'indianred' => '#cd5c5c', 93 | 'lavender' => '#e6e6fa', 94 | 'lavenderblush' => '#fff0f5', 95 | 'lawngreen' => '#7cfc00', 96 | 'lemonchiffon' => '#fffacd', 97 | 'lightblue' => '#add8e6', 98 | 'lightcoral' => '#f08080', 99 | 'lightcyan' => '#e0ffff', 100 | 'lightgoldenrodyellow' => '#fafad2', 101 | 'lightgray' => '#d3d3d3', 102 | 'lightgreen' => '#90ee90', 103 | 'lightgrey' => '#d3d3d3', 104 | 'lightpink' => '#ffb6c1', 105 | 'lightsalmon' => '#ffa07a', 106 | 'lightseagreen' => '#20b2aa', 107 | 'lightskyblue' => '#87cefa', 108 | 'lightslategray' => '#778899', 109 | 'lightslategrey' => '#778899', 110 | 'lightsteelblue' => '#b0c4de', 111 | 'lightyellow' => '#ffffe0', 112 | 'limegreen' => '#32cd32', 113 | 'mediumaquamarine' => '#66cdaa', 114 | 'mediumblue' => '#0000cd', 115 | 'mediumorchid' => '#ba55d3', 116 | 'mediumpurple' => '#9370db', 117 | 'mediumseagreen' => '#3cb371', 118 | 'mediumslateblue' => '#7b68ee', 119 | 'mediumspringgreen' => '#00fa9a', 120 | 'mediumturquoise' => '#48d1cc', 121 | 'mediumvioletred' => '#c71585', 122 | 'midnightblue' => '#191970', 123 | 'mintcream' => '#f5fffa', 124 | 'mistyrose' => '#ffe4e1', 125 | 'moccasin' => '#ffe4b5', 126 | 'navajowhite' => '#ffdead', 127 | 'olivedrab' => '#6b8e23', 128 | 'orangered' => '#ff4500', 129 | 'palegoldenrod' => '#eee8aa', 130 | 'palegreen' => '#98fb98', 131 | 'paleturquoise' => '#afeeee', 132 | 'palevioletred' => '#db7093', 133 | 'papayawhip' => '#ffefd5', 134 | 'peachpuff' => '#ffdab9', 135 | 'powderblue' => '#b0e0e6', 136 | 'rebeccapurple' => '#663399', 137 | 'rosybrown' => '#bc8f8f', 138 | 'royalblue' => '#4169e1', 139 | 'saddlebrown' => '#8b4513', 140 | 'sandybrown' => '#f4a460', 141 | 'seagreen' => '#2e8b57', 142 | 'seashell' => '#fff5ee', 143 | 'slateblue' => '#6a5acd', 144 | 'slategray' => '#708090', 145 | 'slategrey' => '#708090', 146 | 'springgreen' => '#00ff7f', 147 | 'steelblue' => '#4682b4', 148 | 'turquoise' => '#40e0d0', 149 | 'white' => '#fff', 150 | 'whitesmoke' => '#f5f5f5', 151 | 'yellow' => '#ff0', 152 | 'yellowgreen' => '#9acd32' 153 | ); 154 | } 155 | } 156 | -------------------------------------------------------------------------------- /src/Command.php: -------------------------------------------------------------------------------- 1 | run(); 16 | } 17 | 18 | public function run() 19 | { 20 | $opts = getopt( 21 | 'hi:o:', 22 | array( 23 | 'help', 24 | 'input:', 25 | 'output:', 26 | 'dry-run', 27 | 'keep-sourcemap', 28 | 'keep-sourcemap-comment', 29 | 'linebreak-position:', 30 | 'memory-limit:', 31 | 'pcre-backtrack-limit:', 32 | 'pcre-recursion-limit:', 33 | 'remove-important-comments' 34 | ) 35 | ); 36 | 37 | $help = $this->getOpt(array('h', 'help'), $opts); 38 | $input = $this->getOpt(array('i', 'input'), $opts); 39 | $output = $this->getOpt(array('o', 'output'), $opts); 40 | $dryrun = $this->getOpt('dry-run', $opts); 41 | $keepSourceMapComment = $this->getOpt(array('keep-sourcemap', 'keep-sourcemap-comment'), $opts); 42 | $linebreakPosition = $this->getOpt('linebreak-position', $opts); 43 | $memoryLimit = $this->getOpt('memory-limit', $opts); 44 | $backtrackLimit = $this->getOpt('pcre-backtrack-limit', $opts); 45 | $recursionLimit = $this->getOpt('pcre-recursion-limit', $opts); 46 | $removeImportantComments = $this->getOpt('remove-important-comments', $opts); 47 | 48 | if (!is_null($help)) { 49 | $this->showHelp(); 50 | die(self::SUCCESS_EXIT); 51 | } 52 | 53 | if (is_null($input)) { 54 | fwrite(STDERR, '-i argument is missing' . PHP_EOL); 55 | $this->showHelp(); 56 | die(self::FAILURE_EXIT); 57 | } 58 | 59 | if (!is_readable($input)) { 60 | fwrite(STDERR, 'Input file is not readable' . PHP_EOL); 61 | die(self::FAILURE_EXIT); 62 | } 63 | 64 | $css = file_get_contents($input); 65 | 66 | if ($css === false) { 67 | fwrite(STDERR, 'Input CSS code could not be retrieved from input file' . PHP_EOL); 68 | die(self::FAILURE_EXIT); 69 | } 70 | 71 | $this->setStat('original-size', strlen($css)); 72 | 73 | $cssmin = new Minifier; 74 | 75 | if (!is_null($keepSourceMapComment)) { 76 | $cssmin->keepSourceMapComment(); 77 | } 78 | 79 | if (!is_null($removeImportantComments)) { 80 | $cssmin->removeImportantComments(); 81 | } 82 | 83 | if (!is_null($linebreakPosition)) { 84 | $cssmin->setLineBreakPosition($linebreakPosition); 85 | } 86 | 87 | if (!is_null($memoryLimit)) { 88 | $cssmin->setMemoryLimit($memoryLimit); 89 | } 90 | 91 | if (!is_null($backtrackLimit)) { 92 | $cssmin->setPcreBacktrackLimit($backtrackLimit); 93 | } 94 | 95 | if (!is_null($recursionLimit)) { 96 | $cssmin->setPcreRecursionLimit($recursionLimit); 97 | } 98 | 99 | $this->setStat('compression-time-start', microtime(true)); 100 | 101 | $css = $cssmin->run($css); 102 | 103 | $this->setStat('compression-time-end', microtime(true)); 104 | $this->setStat('peak-memory-usage', memory_get_peak_usage(true)); 105 | $this->setStat('compressed-size', strlen($css)); 106 | 107 | if (!is_null($dryrun)) { 108 | $this->showStats(); 109 | die(self::SUCCESS_EXIT); 110 | } 111 | 112 | if (is_null($output)) { 113 | fwrite(STDOUT, $css . PHP_EOL); 114 | $this->showStats(); 115 | die(self::SUCCESS_EXIT); 116 | } 117 | 118 | if (!is_writable(dirname($output))) { 119 | fwrite(STDERR, 'Output file is not writable' . PHP_EOL); 120 | die(self::FAILURE_EXIT); 121 | } 122 | 123 | if (file_put_contents($output, $css) === false) { 124 | fwrite(STDERR, 'Compressed CSS code could not be saved to output file' . PHP_EOL); 125 | die(self::FAILURE_EXIT); 126 | } 127 | 128 | $this->showStats(); 129 | 130 | die(self::SUCCESS_EXIT); 131 | } 132 | 133 | protected function getOpt($opts, $options) 134 | { 135 | $value = null; 136 | 137 | if (is_string($opts)) { 138 | $opts = array($opts); 139 | } 140 | 141 | foreach ($opts as $opt) { 142 | if (array_key_exists($opt, $options)) { 143 | $value = $options[$opt]; 144 | break; 145 | } 146 | } 147 | 148 | return $value; 149 | } 150 | 151 | protected function setStat($statName, $statValue) 152 | { 153 | $this->stats[$statName] = $statValue; 154 | } 155 | 156 | protected function formatBytes($size, $precision = 2) 157 | { 158 | $base = log($size, 1024); 159 | $suffixes = array('B', 'K', 'M', 'G', 'T'); 160 | return round(pow(1024, $base - floor($base)), $precision) .' '. $suffixes[floor($base)]; 161 | } 162 | 163 | protected function formatMicroSeconds($microSecs, $precision = 2) 164 | { 165 | // ms 166 | $time = round($microSecs * 1000, $precision); 167 | 168 | if ($time >= 60 * 1000) { 169 | $time = round($time / 60 * 1000, $precision) .' m'; // m 170 | } elseif ($time >= 1000) { 171 | $time = round($time / 1000, $precision) .' s'; // s 172 | } else { 173 | $time .= ' ms'; 174 | } 175 | 176 | return $time; 177 | } 178 | 179 | protected function showStats() 180 | { 181 | $spaceSavings = round((1 - ($this->stats['compressed-size'] / $this->stats['original-size'])) * 100, 2); 182 | $compressionRatio = round($this->stats['original-size'] / $this->stats['compressed-size'], 2); 183 | $compressionTime = $this->formatMicroSeconds( 184 | $this->stats['compression-time-end'] - $this->stats['compression-time-start'] 185 | ); 186 | $peakMemoryUsage = $this->formatBytes($this->stats['peak-memory-usage']); 187 | 188 | print << [-o ] 206 | 207 | -i|--input File containing uncompressed CSS code. 208 | -o|--output File to use to save compressed CSS code. 209 | 210 | Options: 211 | 212 | -h|--help Prints this usage information. 213 | --dry-run Performs a dry run displaying statistics. 214 | --keep-sourcemap[-comment] Keeps the sourcemap special comment in the output. 215 | --linebreak-position Splits long lines after a specific column in the output. 216 | --memory-limit Sets the memory limit for this script. 217 | --pcre-backtrack-limit Sets the PCRE backtrack limit for this script. 218 | --pcre-recursion-limit Sets the PCRE recursion limit for this script. 219 | --remove-important-comments Removes !important comments from output. 220 | 221 | EOT; 222 | } 223 | } 224 | -------------------------------------------------------------------------------- /src/Utils.php: -------------------------------------------------------------------------------- 1 | 1 ? $vh - 1 : $vh); 68 | 69 | if ($vh * 6 < 1) { 70 | return $v1 + ($v2 - $v1) * 6 * $vh; 71 | } 72 | 73 | if ($vh * 2 < 1) { 74 | return $v2; 75 | } 76 | 77 | if ($vh * 3 < 2) { 78 | return $v1 + ($v2 - $v1) * ((2 / 3) - $vh) * 6; 79 | } 80 | 81 | return $v1; 82 | } 83 | 84 | /** 85 | * Convert strings like "64M" or "30" to int values 86 | * @param mixed $size 87 | * @return int 88 | */ 89 | public static function normalizeInt($size) 90 | { 91 | if (is_string($size)) { 92 | $letter = substr($size, -1); 93 | $size = intval($size); 94 | switch ($letter) { 95 | case 'M': 96 | case 'm': 97 | return (int) $size * 1048576; 98 | case 'K': 99 | case 'k': 100 | return (int) $size * 1024; 101 | case 'G': 102 | case 'g': 103 | return (int) $size * 1073741824; 104 | } 105 | } 106 | return (int) $size; 107 | } 108 | 109 | /** 110 | * Converts a string containing and RGB percentage value into a RGB integer value i.e. '90%' -> 229.5 111 | * @param $rgbPercentage 112 | * @return int 113 | */ 114 | public static function rgbPercentageToRgbInteger($rgbPercentage) 115 | { 116 | if (strpos($rgbPercentage, '%') !== false) { 117 | $rgbPercentage = self::roundNumber(floatval(str_replace('%', '', $rgbPercentage)) * 2.55); 118 | } 119 | 120 | return intval($rgbPercentage, 10); 121 | } 122 | 123 | /** 124 | * Converts a RGB color into a HEX color 125 | * @param array $rgbColors 126 | * @return array 127 | */ 128 | public static function rgbToHex($rgbColors) 129 | { 130 | $hexColors = array(); 131 | 132 | // Values outside the sRGB color space should be clipped (0-255) 133 | for ($i = 0, $l = count($rgbColors); $i < $l; $i++) { 134 | $hexColors[$i] = sprintf("%02x", self::clampNumberSrgb(self::rgbPercentageToRgbInteger($rgbColors[$i]))); 135 | } 136 | 137 | return $hexColors; 138 | } 139 | 140 | /** 141 | * Rounds a number to its closest integer 142 | * @param $n 143 | * @return int 144 | */ 145 | public static function roundNumber($n) 146 | { 147 | return intval(round(floatval($n)), 10); 148 | } 149 | } 150 | -------------------------------------------------------------------------------- /tests/FineDiff/Render/Cli.php: -------------------------------------------------------------------------------- 1 | cssmin = new Minifier; 15 | } 16 | 17 | protected function getExpectation($name) 18 | { 19 | return file_get_contents(__DIR__ .'/expectations/'. $name .'.css'); 20 | } 21 | 22 | protected function getFixture($name) 23 | { 24 | return file_get_contents(__DIR__ .'/fixtures/'. $name .'.css'); 25 | } 26 | 27 | protected function execTest($expectationName, $fixtureName = null) 28 | { 29 | $this->assertEquals( 30 | $this->getExpectation($expectationName), 31 | $this->cssmin->run($this->getFixture(is_null($fixtureName) ? $expectationName : $fixtureName)) 32 | ); 33 | } 34 | 35 | public function testAtRules() 36 | { 37 | $this->execTest('at-rules'); 38 | } 39 | 40 | public function testAttributeSelectors() 41 | { 42 | $this->execTest('attribute-selectors'); 43 | } 44 | 45 | public function testBackgroundProperty() 46 | { 47 | $this->execTest('background'); 48 | } 49 | 50 | public function testBackgroundPositionProperty() 51 | { 52 | $this->execTest('background-position'); 53 | } 54 | 55 | public function testBorderProperty() 56 | { 57 | $this->execTest('border'); 58 | } 59 | 60 | public function testCalcFunction() 61 | { 62 | $this->execTest('calc'); 63 | } 64 | 65 | public function testColors() 66 | { 67 | $this->execTest('colors'); 68 | } 69 | 70 | public function testComments() 71 | { 72 | $this->execTest('comments'); 73 | } 74 | 75 | public function testDataUrlBase64DoubleQuotes() 76 | { 77 | $this->execTest('dataurl-base64-doublequotes'); 78 | } 79 | 80 | public function testDataUrlBase64Eof() 81 | { 82 | $this->execTest('dataurl-base64-eof'); 83 | } 84 | 85 | public function testDataUrlBase64LineBreakInData() 86 | { 87 | $this->execTest('dataurl-base64-linebreakindata'); 88 | } 89 | 90 | public function testDataUrlBase64NoQuotes() 91 | { 92 | $this->execTest('dataurl-base64-noquotes'); 93 | } 94 | 95 | public function testDataUrlBase64SingleQuotes() 96 | { 97 | $this->execTest('dataurl-base64-singlequotes'); 98 | } 99 | 100 | public function testDataUrlBase64TwoUrls() 101 | { 102 | $this->execTest('dataurl-base64-twourls'); 103 | } 104 | 105 | public function testDataUrlDbQuoteFont() 106 | { 107 | $this->execTest('dataurl-dbquote-font'); 108 | } 109 | 110 | public function testDataUrlInlineSvg() 111 | { 112 | $this->execTest('dataurl-inline-svg'); 113 | } 114 | 115 | public function testDataUrlNonBase64DoubleQuotes() 116 | { 117 | $this->execTest('dataurl-nonbase64-doublequotes'); 118 | } 119 | 120 | public function testDataUrlNonBase64NoQuotes() 121 | { 122 | $this->execTest('dataurl-nonbase64-noquotes'); 123 | } 124 | 125 | public function testDataUrlNonBase64SingleQuotes() 126 | { 127 | $this->execTest('dataurl-nonbase64-singlequotes'); 128 | } 129 | 130 | public function testDataUrlNoQuoteMultilineFont() 131 | { 132 | $this->execTest('dataurl-noquote-multiline-font'); 133 | } 134 | 135 | public function testDataUrlRealDataDoubleQuotes() 136 | { 137 | $this->execTest('dataurl-realdata-doublequotes'); 138 | } 139 | 140 | public function testDataUrlRealDataNoQuotes() 141 | { 142 | $this->execTest('dataurl-realdata-noquotes'); 143 | } 144 | 145 | public function testDataUrlRealDataSingleQuotes() 146 | { 147 | $this->execTest('dataurl-realdata-singlequotes'); 148 | } 149 | 150 | public function testDataUrlRealDataYuiApp() 151 | { 152 | $this->execTest('dataurl-realdata-yuiapp'); 153 | } 154 | 155 | public function testDataUrlSingleQuoteFont() 156 | { 157 | $this->execTest('dataurl-singlequote-font'); 158 | } 159 | 160 | public function testEmptyRules() 161 | { 162 | $this->execTest('empty-rules'); 163 | } 164 | 165 | public function testFlexProperty() 166 | { 167 | $this->execTest('flex'); 168 | } 169 | 170 | public function testFontWeightProperty() 171 | { 172 | $this->execTest('font-weight'); 173 | } 174 | 175 | public function testImportantRule() 176 | { 177 | $this->execTest('important'); 178 | } 179 | 180 | public function testKeepSourcemapComment() 181 | { 182 | $this->cssmin->keepSourceMapComment(); 183 | $this->execTest('sourcemap-comment-preserve', 'sourcemap-comment'); 184 | } 185 | 186 | public function testLinebreakPosition() 187 | { 188 | $this->cssmin->setLineBreakPosition(10); 189 | $this->execTest('linebreak-position'); 190 | } 191 | 192 | public function testLinebreakPositionDoubleNewline() 193 | { 194 | $this->cssmin->setLineBreakPosition(1); 195 | $this->cssmin->keepSourceMapComment(); 196 | $this->execTest('sourcemap-comment-preserve', 'sourcemap-comment'); 197 | } 198 | 199 | public function testLowercasing() 200 | { 201 | $this->execTest('lowercasing'); 202 | } 203 | 204 | public function testNumbers() 205 | { 206 | $this->execTest('numbers'); 207 | } 208 | 209 | public function testOldIeFilters() 210 | { 211 | $this->execTest('old-ie-filters'); 212 | } 213 | 214 | public function testPreserveCase() 215 | { 216 | $this->execTest('preserve-case'); 217 | } 218 | 219 | public function testPseudoClasses() 220 | { 221 | $this->execTest('pseudo-classes'); 222 | } 223 | 224 | public function testPseudoElements() 225 | { 226 | $this->execTest('pseudo-elements'); 227 | } 228 | 229 | public function testRemoveImportantComments() 230 | { 231 | $this->cssmin->removeImportantComments(); 232 | $this->execTest('important-comments-remove', 'comments'); 233 | } 234 | 235 | public function testRemoveSourcemapComment() 236 | { 237 | $this->execTest('sourcemap-comment-remove', 'sourcemap-comment'); 238 | } 239 | 240 | public function testSemicolons() 241 | { 242 | $this->execTest('semicolons'); 243 | } 244 | 245 | public function testShortenableProperties() 246 | { 247 | $this->execTest('shortenable-properties'); 248 | } 249 | 250 | public function testStarUnderscoreHacks() 251 | { 252 | $this->execTest('star-underscore-hacks'); 253 | } 254 | 255 | public function testStrings() 256 | { 257 | $this->execTest('strings'); 258 | } 259 | 260 | public function testTextShadowProperty() 261 | { 262 | $this->execTest('text-shadow'); 263 | } 264 | 265 | public function testUnitMs() 266 | { 267 | $this->execTest('unit-ms'); 268 | } 269 | 270 | public function testWebkitTransformOrigin() 271 | { 272 | $this->execTest('webkit-transform-origin'); 273 | } 274 | 275 | // Frameworks 276 | 277 | public function testBootstrap() 278 | { 279 | $this->execTest('bootstrap'); 280 | } 281 | 282 | public function testBulma() 283 | { 284 | $this->execTest('bulma'); 285 | } 286 | 287 | public function testFoundation() 288 | { 289 | $this->execTest('foundation'); 290 | } 291 | 292 | public function testKube() 293 | { 294 | $this->execTest('kube'); 295 | } 296 | 297 | public function testMaterialize() 298 | { 299 | $this->execTest('materialize'); 300 | } 301 | 302 | public function testMui() 303 | { 304 | $this->execTest('mui'); 305 | } 306 | 307 | public function testPure() 308 | { 309 | $this->execTest('pure'); 310 | } 311 | 312 | } 313 | -------------------------------------------------------------------------------- /tests/bin/runner: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | keepSourceMapComment(); 45 | } 46 | 47 | if (isset($opts['remove-important-comments'])) { 48 | $minifier->removeImportantComments(); 49 | } 50 | 51 | if (!empty($opts['linebreak-position'])) { 52 | $minifier->setLineBreakPosition($opts['linebreak-position']); 53 | } 54 | 55 | $fixture = file_get_contents($fixtureFile); 56 | $expectation = file_get_contents($expectationFile); 57 | $output = $minifier->run($fixture); 58 | 59 | if (strcmp($output, $expectation) === 0) { 60 | fwrite( 61 | STDOUT, 62 | "\x1b[30m\x1b[42m OK \x1b[0m" . PHP_EOL 63 | ); 64 | die(0); 65 | } else { 66 | $diff = new Diff; 67 | $cliRenderer = new CliRenderer; 68 | $diffString = $cliRenderer->process($expectation, $diff->getOpcodes($expectation, $output)); 69 | fwrite( 70 | STDERR, 71 | "\x1b[37m\x1b[41m FAILURE \x1b[0m" . PHP_EOL . 72 | '---' . PHP_EOL . 73 | $diffString . PHP_EOL . 74 | '---' . PHP_EOL 75 | ); 76 | die(1); 77 | } 78 | -------------------------------------------------------------------------------- /tests/expectations/at-rules.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8";@import url("fineprint.css") print;@import url("bluish.css") projection,tv;@import 'custom.css';@import url("chrome://communicator/skin/");@import "common.css" screen,projection;@import url('landscape.css') screen and (orientation:landscape);@import url(//example.org/foo.css?a;b;c;d) screen,projection;@import url(//example.org/foo.css?a;b;c;d);@import url(//example.org/bar.css);@namespace svg url(http://www.w3.org/2000/svg);@namespace url(http://www.w3.org/1999/xhtml);@document url(http://www.w3.org/),url-prefix(http://www.w3.org/Style/),domain(mozilla.org),regexp("https:.*"){body{color:purple;background:#ff0}}@media all,BRAILLE{body{background-color:gold}}@page :first{margin-left:50%;margin-top:50%}@viewport{min-width:640px;max-width:800px}#foo{border-width:1px}@keyframes identifier{0%{top:0;left:0}30%{top:50px}68%,72%{left:50px}100%{top:100px;left:100%}}@media print{#navigation{display:none}@media (max-width:12cm){.note,a[type="{{}{}{"]{float:none}@media (min-height:2px){.bar{width:10px}}.foo{align-content:center}}}@supports (box-shadow:0 0 2px black inset) or (-moz-box-shadow:0 0 2px black inset) or (-webkit-box-shadow:0 0 2px black inset) or (-o-box-shadow:0 0 2px black inset){.noticebox{-moz-box-shadow:0 0 2px #000 inset;-webkit-box-shadow:0 0 2px #000 inset;-o-box-shadow:0 0 2px #000 inset;box-shadow:0 0 2px #000 inset;border:none;padding:2px}}@supports NOT (display:flex){body{width:100%;height:100%;background:#fff;color:#000}#navigation{width:25%}#article{width:75%}}@font-face{font-family:'gzipper';src:url(yanone.eot);src:local('gzipper'),url(yanone.ttf) format('truetype')}#bar{border-width:10px}@viewport{zoom:.75;min-zoom:.5;max-zoom:.9}@viewport{orientation:landscape}@page :left{margin:2in 3in}@media (min-width:700px) and (orientation:landscape){a{color:red}}@supports not ((text-align-last:justify) or (-moz-text-align-last:justify)){p{text-align:justify}}@media only all and (max-width:50em),only all and (max-device-width:800px),only all and (max-width:780px){a{height:1px}}@media screen AND (-webkit-min-device-pixel-ratio:0){div,p{margin:2px}}@media only screen and (-webkit-min-device-pixel-ratio:1.5),only screen and (-o-min-device-pixel-ratio:3/2),only screen and (min--moz-device-pixel-ratio:1.5),only screen and (min-device-pixel-ratio:1.5){a{width:100px}}@media not all and (monochrome){a{border:none}}@media not screen and (color),print and (color){a{display:block}}@media (-webkit-min-device-pixel-ratio:0){a{border:none}}@media handheld and (grid) and (max-width:15em){a{border-width:4px}}@media screen and (min-aspect-ratio:1/1){a{border:none}}.something{top:0}@keyframes anim{0%{opacity:0}100%{opacity:1}}@-o-keyframes anim{0%{opacity:0}100%{opacity:1}}@keyframes test{0%,100%{opacity:0}}@keyframes test2{0%,100%{opacity:0}}@keyframes test3{50%{opacity:50}100%,0%{opacity:0}}@-webkit-keyframes test4{0%{transform:rotate3d(0,0,1,30deg)}100%{transform:rotate3d(0,0,1,10deg)}} -------------------------------------------------------------------------------- /tests/expectations/attribute-selectors.css: -------------------------------------------------------------------------------- 1 | input[type=button],span[lang|=en-],div[class~=-hey]{color:#fff}input[type=-_2test],input[TYPE$=_2tEst_],a[alt],span[lang^=PT],a[href*=example2-test-]{color:#fff}a[aria-hidden=false],[data-toggle=buttons]{color:blue}input[type=""],input[type="-"],input[type="--test"],input[type="-2test"],input[type="2test"],a[href ^="http:"],a[href $='#'],img[src^="http://"]{color:#000}a[href*='a%a'],a[href *='b/b'],a[href*="asd$sdd!"]{color:#000} -------------------------------------------------------------------------------- /tests/expectations/background-position.css: -------------------------------------------------------------------------------- 1 | a{background-position:0 0}b{background-position:0 0}c{background-position:0 0}d{background-position:0 50%;background-position:0 0;background-position:0 0;background-position:center top 0;background-position:left 0 bottom 0} -------------------------------------------------------------------------------- /tests/expectations/background.css: -------------------------------------------------------------------------------- 1 | a{background:0 0;background:0 0 !important}b{background:0 0;background:0 0}c{background:0 0} -------------------------------------------------------------------------------- /tests/expectations/border.css: -------------------------------------------------------------------------------- 1 | a{border:none;border-top:none;border-right:none;border-bottom:none;border-left:none} -------------------------------------------------------------------------------- /tests/expectations/calc.css: -------------------------------------------------------------------------------- 1 | .foo{margin-right:calc(-.375em - 1px);width:calc(100%/3 - 2*1em - 2*1px + 10 mod 2);margin:calc(1rem - 2px) calc(1rem + 1px)}.bar{margin:calc(5*calc(10px + 2em)) calc(10 + (5px + 10px - (10em - 3em)));padding-top:calc(5*(2em + -1px))}input{width:calc(100% - (1em*1.5))}p{font-size:-webkit-calc(20px + 1vw);font-size:-moz-calc(20px + 1vw);font-size:calc(20px + 1vw)} -------------------------------------------------------------------------------- /tests/expectations/colors.css: -------------------------------------------------------------------------------- 1 | #\:white a[black=":white;"]{background-image:url(assets/images/white.png);color:#fff;white-space:normal;color:#f5f5f5;background:#fff;background:border-box #f0f;background:linear-gradient(to left top,#000,pink 60%,#8a2be2);background-color:#000;text-shadow:1px 1px 2px #000;text-shadow:#fff 2px 5px;box-shadow:3px 3px #ff0,-1em 0 .4em #f0f;outline:1px solid #fff;outline-color:#ff0;box:#000 #fff,#ff0;utline-color:#000 #fff,#ff0;border:1px dotted #663399;border-color:#9acd32;border-bottom:3px solid #ffffe0;border-right-color:#f8f8ff}b{color:ivory;color:red}.color{impressed:#fed;again:#abcdef;andagain:#a6c;background-color:#aa66ccc;filter:chroma(color="#FFFFFF");color:#12a}.foo,#AABBCC{background-color:#abc;border-color:#e6a #abcdef #feab2c;filter:chroma(color=#FFFFFF);filter:chroma(color="#AABBCC");filter:chroma(color='#BBDDEE');color:#123}#AABBCC,#ffffff,#f0f0f0,#f00{background-color:#fe1;filter:chroma(color=#FFFFFF);color:#412;foo:#0f1 #abc #abc #123344;border-color:#aa66ccC}.foo #AABBCC{background-color:#fe1;color:#412;border-color:#abc;filter:chroma(color=#FFFFFF)}.bar,#AABBCC{background-color:#fe1;border-color:#0f1 #abcdef;filter:chroma(color=#11FFFFFF);color:#412}.foo,#AABBCC.foobar{background-color:#fe1;border-color:#0f1 #abcdef #abc;color:#412}@media screen{.bar,#AABBCC{background-color:#fe1;color:#412}}a{background:none repeat scroll 0 0 red;alpha:rgba(1,2,3,4);background-image:linear-gradient(to bottom,tan 10%,red 90%);background-image:linear-gradient(to bottom,red 10%,red 90%);background:linear-gradient(to bottom,red,red);color:#e6ccc3;color:red;color:red;test-overflow:#fff}d{alpha:rgba(1,2,3,4);border-color:rgba(1,2,3,4)}*{color:red;color:#03ff03;color:#1c1c24;color:#e4e4f1;color:#212121} -------------------------------------------------------------------------------- /tests/expectations/comments.css: -------------------------------------------------------------------------------- 1 | /*! test */ 2 | /*! $LastChangedRevision: 81 $ $LastChangedDate: 2009-05-27 17:41:02 +0100 (Wed, 27 May 2009) $ */ 3 | /*! 4 | $Header: /temp/dirname/filename.css 3 2/02/08 3:37p JSmith $ 5 | */ 6 | /*! special */ 7 | /*! special */ 8 | a{color:blue;width:5px;height:5px;margin:0} 9 | /*!************88**** 10 | Preserving comments 11 | as they are 12 | ******************** 13 | Keep the initial ! 14 | *******************/ 15 | #yo{ma:"ma"} 16 | /*! 17 | I said 18 | pre- 19 | serve! */ 20 | a{color:red} 21 | /*! imp*/ 22 | b{test:foo} 23 | /*! imp */ 24 | html>/**/body p{color:blue;*width:auto;height:2%}a{a:1} 25 | /*!"preserve" me*/ 26 | b{content:"/**/"}c{c:3} 27 | /*! imp */ 28 | /* unclosed comment at EOF issue -------------------------------------------------------------------------------- /tests/expectations/dataurl-base64-eof.css: -------------------------------------------------------------------------------- 1 | div.base64-singlequotes{width:100px;height:100px;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QAAAAAAAD5Q7t%2FAAAACXBIWXMAAA3WAAAN1gGQb3mcAAAFrUlEQVRYw%2B2Xz28kRxXHP%2B9Vdc8vj2fG9uIkm2yUeFGEhNCKQwBpj1yRUBAnpJU4ceZP4MxfkBxy2GO45bQXuEGQohUKigQ%2BsBBE1sbYXv8Yz%2FRMd9fjUN09PV5nFZA4kZZa79W3quu9er%2FqNfy%2FPwJgZty%2Ffz%2FZ29vrpmmqhlWTgmFg1UpbfWhYhG6Yq2cFi%2FNrj9nJyWnx%2BPHjeafbMTEzPvjVB9%2B6d%2B%2FezweDwV1BfHubivkC3lZya%2F4m7Np8UZYXhweHH7733rvvC0Kyv7%2F%2F7p07d34qIjyvr63RNb4l4CbsRUrNrq6OfvfRRz%2FxDx486A%2F6g7vXhX9ZIf%2Bp4JomaToZj8d7Pk1SFRFXb1aWodq09l%2F9YZu%2FCWMVL9e%2FaVFVQVUREEG8r3VUEZ4cX%2FHL30%2B5shRtAhFq4wggNb6GrXgVa2K2jYtACIHv7Sz54TfHjWWagBOBy0Xgt%2BcjLtwQxVCpNwURQat1DdYaT7pwdwKDFA6ncHgFizJmSb3WLPDa7PMIVlb2daqZxdONUnAetEojEdBGiXXhTmAjhZ0%2B3N6AlzeEROH1TXiWGf%2BcwmkWZYnAfAkdx1pq%2BhUbT9z3IElUJlVhI4WsgCLUyggi4MQYd4VXNmCYRqXOspV7UoHbQ3hpEMeLAk5mkFYRYlWI%2BHZ6CTDwkKSQqrA7gFeHMF3C6VyYLmFZGiKCE6GrMFsaWb7yuVOh66N1FkUUpBJ3TyvFovToBl9XMbNY2bZ70BsKfW94hbyErosmXpQwy4VgkCjMizjvRRik0EtiLNwagBf465lwOqtkETEn60XT1%2BlTazrpKlR%2BKkooy3Xfb3Wj3wGWJRQhnni7B53q5FqZ4%2FUR7PYhGMxyuMwgWVqTxrYWAwZYQX78J5i8ie9txSAkoOqqQAqk3pBgKLDhlY5XVKPCi3w97YRoKSFaceCgF2hqSXRBPQAIOcXRH8hP%2F0y6%2BRpWLrEyg3SbS9tmzggzJQSLQZo4xoOE8UbCsJfQ7zi6iaIizZ5OBVfXDKPireWC%2BvAYWOBqeszl9Jg03afbH6OqGH%2FBSUrqbrFIXiHoiEDC%2FPySi2d9nnZHJE7opY7dcY%2FdcZej84zpPGfY9Uw2ErYGCf2O4mUVEzELWtqUxZKjf3zK2cURzicMRy%2BzvbuH8ylFPqXIPqNczClKY1mUZFcnSDKkv%2FUNuptbWG%2BLw%2FMh%2FzrYpKBHKV3ONOXzYxeV20z49qhs7gaMWIjqQQiBxVXB4irg05yz4u%2FMpieoJuTLjDJfUJYBzBAFUUHkhMvLvzFPuvQ2JvQ3duh0R%2FjuiDQdIn6MJdvkxTafZUPuaN6UaOo6UNtgNl9weboguwqoA5fCjEusNCzE8LJQFRuNrzpQD%2BrmZNM55%2F4A5z1J2iHtDEg6fZK0j0uHlDrh2N4i3Ptuc%2BH5tjp5HliWQmmOUAhlYe0rqUqWSEOhcZ05AvE1UdColSQJaHWlSUYgJy%2FO2fFfo%2F34piphFOZ4OrvNdL5EJZbcmE8OQzFxIJEGEgIeE1%2FhrjJLxZcOrIVpVC7TW00WmLWyAMDEs%2Bi9wVJDtG17Y21vVmNxLKqIOkQqqoq2qHORmgj9UQcza7mgFm4GmiDjO5C72DSoQ6uPVTW%2BzuFUcQ2teKd4pzhd8b6Nu6jg7vZsrb1rClEIxhu7Q37x47fIy3j%2Fi8iqqlUuEWTFN%2FOrMU3fEEuhUM8FIPDqZgcRIVhsAXxtjGDGS5M%2BP%2Fv%2Bm7yopVrRVsPabsW%2BYG1T%2Fy3KahqSg6cHRb5cTmt5ZXhxQ7nS6yZsVWOajDFbw2JSCSGEIsuyC%2F%2Fo0aPp%2Fv7%2Br9NO5%2F5gMOhJLNn%2FpQLrLfw6tkKKorCDg4NPP%2Fnkjx%2FLOz96h2enzyZvf%2BftH9za2fm6qLrnO9tGk2vY86f%2FMliWZRdPnjz5zcOHDz%2B%2B%2Fifimorzv31C9X718G%2FYrCYSNJa5LgAAACJ6VFh0U29mdHdhcmUAAHjaKy8v18vMyy5OTixI1csvSgcANtgGWBBTylwAAAAASUVORK5CYII%3D');background-position:center center;border:1px solid #0a0}div.otherdataurl{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kFBQ0WDWwqwjwAAANMSURBVEjHrdZbaFxVFAbgb2aSTG6GTi6mVIwxNxF9qFI0RQnFUqiYamutVutLa2t9EY0oPggFoYgPRR%2FaghYviA%2BiIAYvmBJKoYWiiBCigVTT1FisbUhrEtNkJpc5PuQkjGEmJqkLFmdz2Hv%2Fa%2F3rX3tvlm95oS%2FLokuZtIpbdvAs7KFtL22wjb3V1C41upy2ke1DXC2k%2FBjv1HHXDrbkEamg7lX2P8QTldQ2UtfOB8uiJsHNiB%2Fik0GmO%2BgZIxgnGA59nGCMoJPeQaYP047iBDXZEohkAYof4%2FNyKlZRdR%2F1ASZCnoOMhWkUheMz9F1laJSRZ3gEqVw1ipZQjcoBRrbT3Ez9OJLhZkHG5CD8l8Q47qXhMZp%2FYxhVFaxBLBtQejdtA%2FTtZPMIJnOknI2WSYzicTYN8OtTvICZbECxdr5Pkm6iPL0C3c%2BgkfIJgi%2F4LnP%2FudRKD3K4jf1VJGLEAiuz6VnA4AGam1h7gpNIzSFe66D3NurLKVhJNkHo07N9V9BE3XHOYmyeuirqG1l9mdHgOkDSGd8%2FGWtg9Roa56lrYdchDtRQPLlCkEywKVRScDfrurnwC2diiPTRe47iVtbnLZDxckGCkKYpPM%2FRr3kbyRhsYOtRDiQonFoBSHrBOI18rOeOPvr76YrCeUbf5fTvjOddJ0gQ1uMPku9z6hwjiEZhgOMn%2BaaUeHQJIOkMD7KMA5QQP01HP18hPbfvDTvZPETqb2YiS1BWrozM6jk9SPJJHkZZ5qFagtoaNnbyZg1FE4sUPRdlAQpwkdSjvDZAJ%2FoxNt%2Bw6NlGbQVFl5iKLKKsXCAwyFQZ8S3ciu65ho1lBJ5%2FkZk3OBGjpJWGmVCmsjTkQvA8JHCUU7s5eImevzg%2Fd7BGFhzCARIf8uVN3J5Heh1VM%2BHlko2y%2FHBxF0NJolfo38eDuJJxbf0ro%2FnMurh8hM%2FupH4tdT8zciOFsTC8SAgQoJfRxKzCuvfw0k%2F8MDx7xqUyez%2BS48ESIN7Ky6OUpfAtrxzhx03UR4m0c%2FZF7tnKW2mma4l9yuthTSIZIvxPi6EcpZW0PM0xtOzjo%2Bf4GPfv4r1qNqAUFYs9diJLBC1CIa7FZx8fUlwI22LuNv%2FfLbKMAOftH9TwRXg6%2FiCDAAAAAElFTkSuQmCC")} -------------------------------------------------------------------------------- /tests/expectations/dataurl-base64-linebreakindata.css: -------------------------------------------------------------------------------- 1 | .yui3-skin-night .yui3-dial-ring-vml,.yui3-skin-night .yui3-dial-center-button-vml,.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,.yui3-skin-night v\:oval.yui3-dial-marker-max-min,.yui3-skin-night .yui3-dial-marker-vml,.yui3-skin-night .yui3-dial-handle-vml{background:0 0;opacity:1}div.base64-doublequotes{width:100px;height:100px;background-image:url("data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kFBQ0WDWwqwjwAAANMSURBVEjHrdZbaFxVFAbgb2aSTG6GTi6mVIwxNxF9qFI0RQnFUqiYamutVutLa2t9EY0oPggFoYgPRR%2FaghYviA%2BiIAYvmBJKoYWiiBCigVTT1FisbUhrEtNkJpc5PuQkjGEmJqkLFmdz2Hv%2Fa%2F3rX3tvlm95oS%2FLokuZtIpbdvAs7KFtL22wjb3V1C41upy2ke1DXC2k%2FBjv1HHXDrbkEamg7lX2P8QTldQ2UtfOB8uiJsHNiB%2Fik0GmO%2BgZIxgnGA59nGCMoJPeQaYP047iBDXZEohkAYof4%2FNyKlZRdR%2F1ASZCnoOMhWkUheMz9F1laJSRZ3gEqVw1ipZQjcoBRrbT3Ez9OJLhZkHG5CD8l8Q47qXhMZp%2FYxhVFaxBLBtQejdtA%2FTtZPMIJnOknI2WSYzicTYN8OtTvICZbECxdr5Pkm6iPL0C3c%2BgkfIJgi%2F4LnP%2FudRKD3K4jf1VJGLEAiuz6VnA4AGam1h7gpNIzSFe66D3NurLKVhJNkHo07N9V9BE3XHOYmyeuirqG1l9mdHgOkDSGd8%2FGWtg9Roa56lrYdchDtRQPLlCkEywKVRScDfrurnwC2diiPTRe47iVtbnLZDxckGCkKYpPM%2FRr3kbyRhsYOtRDiQonFoBSHrBOI18rOeOPvr76YrCeUbf5fTvjOddJ0gQ1uMPku9z6hwjiEZhgOMn%2BaaUeHQJIOkMD7KMA5QQP01HP18hPbfvDTvZPETqb2YiS1BWrozM6jk9SPJJHkZZ5qFagtoaNnbyZg1FE4sUPRdlAQpwkdSjvDZAJ%2FoxNt%2Bw6NlGbQVFl5iKLKKsXCAwyFQZ8S3ciu65ho1lBJ5%2FkZk3OBGjpJWGmVCmsjTkQvA8JHCUU7s5eImevzg%2Fd7BGFhzCARIf8uVN3J5Heh1VM%2BHlko2y%2FHBxF0NJolfo38eDuJJxbf0ro%2FnMurh8hM%2FupH4tdT8zciOFsTC8SAgQoJfRxKzCuvfw0k%2F8MDx7xqUyez%2BS48ESIN7Ky6OUpfAtrxzhx03UR4m0c%2FZF7tnKW2mma4l9yuthTSIZIvxPi6EcpZW0PM0xtOzjo%2Bf4GPfv4r1qNqAUFYs9diJLBC1CIa7FZx8fUlwI22LuNv%2FfLbKMAOftH9TwRXg6%2FiCDAAAAAElFTkSuQmCC");background-position:center center;border:1px solid #0a0}.yui-skin-sam .yui-h-slider{background:url(bg-h.gif) no-repeat 5px 0;height:28px;width:228px} -------------------------------------------------------------------------------- /tests/expectations/dataurl-base64-twourls.css: -------------------------------------------------------------------------------- 1 | .yui3-skin-night .yui3-dial-ring-vml,.yui3-skin-night .yui3-dial-center-button-vml,.yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min,.yui3-skin-night v\:oval.yui3-dial-marker-max-min,.yui3-skin-night .yui3-dial-marker-vml,.yui3-skin-night .yui3-dial-handle-vml{background:0 0;opacity:1}div.base64-singlequotes{width:100px;height:100px;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QAAAAAAAD5Q7t%2FAAAACXBIWXMAAA3WAAAN1gGQb3mcAAAFrUlEQVRYw%2B2Xz28kRxXHP%2B9Vdc8vj2fG9uIkm2yUeFGEhNCKQwBpj1yRUBAnpJU4ceZP4MxfkBxy2GO45bQXuEGQohUKigQ%2BsBBE1sbYXv8Yz%2FRMd9fjUN09PV5nFZA4kZZa79W3quu9er%2FqNfy%2FPwJgZty%2Ffz%2FZ29vrpmmqhlWTgmFg1UpbfWhYhG6Yq2cFi%2FNrj9nJyWnx%2BPHjeafbMTEzPvjVB9%2B6d%2B%2FezweDwV1BfHubivkC3lZya%2F4m7Np8UZYXhweHH7733rvvC0Kyv7%2F%2F7p07d34qIjyvr63RNb4l4CbsRUrNrq6OfvfRRz%2FxDx486A%2F6g7vXhX9ZIf%2Bp4JomaToZj8d7Pk1SFRFXb1aWodq09l%2F9YZu%2FCWMVL9e%2FaVFVQVUREEG8r3VUEZ4cX%2FHL30%2B5shRtAhFq4wggNb6GrXgVa2K2jYtACIHv7Sz54TfHjWWagBOBy0Xgt%2BcjLtwQxVCpNwURQat1DdYaT7pwdwKDFA6ncHgFizJmSb3WLPDa7PMIVlb2daqZxdONUnAetEojEdBGiXXhTmAjhZ0%2B3N6AlzeEROH1TXiWGf%2BcwmkWZYnAfAkdx1pq%2BhUbT9z3IElUJlVhI4WsgCLUyggi4MQYd4VXNmCYRqXOspV7UoHbQ3hpEMeLAk5mkFYRYlWI%2BHZ6CTDwkKSQqrA7gFeHMF3C6VyYLmFZGiKCE6GrMFsaWb7yuVOh66N1FkUUpBJ3TyvFovToBl9XMbNY2bZ70BsKfW94hbyErosmXpQwy4VgkCjMizjvRRik0EtiLNwagBf465lwOqtkETEn60XT1%2BlTazrpKlR%2BKkooy3Xfb3Wj3wGWJRQhnni7B53q5FqZ4%2FUR7PYhGMxyuMwgWVqTxrYWAwZYQX78J5i8ie9txSAkoOqqQAqk3pBgKLDhlY5XVKPCi3w97YRoKSFaceCgF2hqSXRBPQAIOcXRH8hP%2F0y6%2BRpWLrEyg3SbS9tmzggzJQSLQZo4xoOE8UbCsJfQ7zi6iaIizZ5OBVfXDKPireWC%2BvAYWOBqeszl9Jg03afbH6OqGH%2FBSUrqbrFIXiHoiEDC%2FPySi2d9nnZHJE7opY7dcY%2FdcZej84zpPGfY9Uw2ErYGCf2O4mUVEzELWtqUxZKjf3zK2cURzicMRy%2BzvbuH8ylFPqXIPqNczClKY1mUZFcnSDKkv%2FUNuptbWG%2BLw%2FMh%2FzrYpKBHKV3ONOXzYxeV20z49qhs7gaMWIjqQQiBxVXB4irg05yz4u%2FMpieoJuTLjDJfUJYBzBAFUUHkhMvLvzFPuvQ2JvQ3duh0R%2FjuiDQdIn6MJdvkxTafZUPuaN6UaOo6UNtgNl9weboguwqoA5fCjEusNCzE8LJQFRuNrzpQD%2BrmZNM55%2F4A5z1J2iHtDEg6fZK0j0uHlDrh2N4i3Ptuc%2BH5tjp5HliWQmmOUAhlYe0rqUqWSEOhcZ05AvE1UdColSQJaHWlSUYgJy%2FO2fFfo%2F34piphFOZ4OrvNdL5EJZbcmE8OQzFxIJEGEgIeE1%2FhrjJLxZcOrIVpVC7TW00WmLWyAMDEs%2Bi9wVJDtG17Y21vVmNxLKqIOkQqqoq2qHORmgj9UQcza7mgFm4GmiDjO5C72DSoQ6uPVTW%2BzuFUcQ2teKd4pzhd8b6Nu6jg7vZsrb1rClEIxhu7Q37x47fIy3j%2Fi8iqqlUuEWTFN%2FOrMU3fEEuhUM8FIPDqZgcRIVhsAXxtjGDGS5M%2BP%2Fv%2Bm7yopVrRVsPabsW%2BYG1T%2Fy3KahqSg6cHRb5cTmt5ZXhxQ7nS6yZsVWOajDFbw2JSCSGEIsuyC%2F%2Fo0aPp%2Fv7%2Br9NO5%2F5gMOhJLNn%2FpQLrLfw6tkKKorCDg4NPP%2Fnkjx%2FLOz96h2enzyZvf%2BftH9za2fm6qLrnO9tGk2vY86f%2FMliWZRdPnjz5zcOHDz%2B%2B%2Fifimorzv31C9X718G%2FYrCYSNJa5LgAAACJ6VFh0U29mdHdhcmUAAHjaKy8v18vMyy5OTixI1csvSgcANtgGWBBTylwAAAAASUVORK5CYII%3D');background-position:center center;border:1px solid #0a0}div.otherdataurl{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kFBQ0WDWwqwjwAAANMSURBVEjHrdZbaFxVFAbgb2aSTG6GTi6mVIwxNxF9qFI0RQnFUqiYamutVutLa2t9EY0oPggFoYgPRR%2FaghYviA%2BiIAYvmBJKoYWiiBCigVTT1FisbUhrEtNkJpc5PuQkjGEmJqkLFmdz2Hv%2Fa%2F3rX3tvlm95oS%2FLokuZtIpbdvAs7KFtL22wjb3V1C41upy2ke1DXC2k%2FBjv1HHXDrbkEamg7lX2P8QTldQ2UtfOB8uiJsHNiB%2Fik0GmO%2BgZIxgnGA59nGCMoJPeQaYP047iBDXZEohkAYof4%2FNyKlZRdR%2F1ASZCnoOMhWkUheMz9F1laJSRZ3gEqVw1ipZQjcoBRrbT3Ez9OJLhZkHG5CD8l8Q47qXhMZp%2FYxhVFaxBLBtQejdtA%2FTtZPMIJnOknI2WSYzicTYN8OtTvICZbECxdr5Pkm6iPL0C3c%2BgkfIJgi%2F4LnP%2FudRKD3K4jf1VJGLEAiuz6VnA4AGam1h7gpNIzSFe66D3NurLKVhJNkHo07N9V9BE3XHOYmyeuirqG1l9mdHgOkDSGd8%2FGWtg9Roa56lrYdchDtRQPLlCkEywKVRScDfrurnwC2diiPTRe47iVtbnLZDxckGCkKYpPM%2FRr3kbyRhsYOtRDiQonFoBSHrBOI18rOeOPvr76YrCeUbf5fTvjOddJ0gQ1uMPku9z6hwjiEZhgOMn%2BaaUeHQJIOkMD7KMA5QQP01HP18hPbfvDTvZPETqb2YiS1BWrozM6jk9SPJJHkZZ5qFagtoaNnbyZg1FE4sUPRdlAQpwkdSjvDZAJ%2FoxNt%2Bw6NlGbQVFl5iKLKKsXCAwyFQZ8S3ciu65ho1lBJ5%2FkZk3OBGjpJWGmVCmsjTkQvA8JHCUU7s5eImevzg%2Fd7BGFhzCARIf8uVN3J5Heh1VM%2BHlko2y%2FHBxF0NJolfo38eDuJJxbf0ro%2FnMurh8hM%2FupH4tdT8zciOFsTC8SAgQoJfRxKzCuvfw0k%2F8MDx7xqUyez%2BS48ESIN7Ky6OUpfAtrxzhx03UR4m0c%2FZF7tnKW2mma4l9yuthTSIZIvxPi6EcpZW0PM0xtOzjo%2Bf4GPfv4r1qNqAUFYs9diJLBC1CIa7FZx8fUlwI22LuNv%2FfLbKMAOftH9TwRXg6%2FiCDAAAAAElFTkSuQmCC")}.yui-skin-sam .yui-h-slider{background:url(bg-h.gif) no-repeat 5px 0;height:28px;width:228px} -------------------------------------------------------------------------------- /tests/expectations/dataurl-dbquote-font.css: -------------------------------------------------------------------------------- 1 | .y-ff-1{font-family:"Foo Bar",Helvetica,Arial;text-rendering:optimizeLegibility}.ua-op .y-ff-1{font-family:Helvetica,Arial}@font-face{font-family:"Foo Bar";src:url("data:font/truetype;base64,gRbIUFAIrsQNGditEWbAUKwAA") format("truetype"),url("http://yuilibrary.com/fonts/foo-bar.svg#webfontse22fewwr") format("svg");font-weight:400;font-style:normal} -------------------------------------------------------------------------------- /tests/expectations/dataurl-inline-svg.css: -------------------------------------------------------------------------------- 1 | a#mobile-menu-btn{background:url('data:image/svg+xml;utf8,') 0 0 no-repeat}a#mobile-menu-btn{background:url("data:image/svg+xml;utf8,") 0 0 no-repeat} -------------------------------------------------------------------------------- /tests/expectations/dataurl-nonbase64-doublequotes.css: -------------------------------------------------------------------------------- 1 | div.nonbase64-doublequotes{width:100px;height:100px;background-image:url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0C%00%00%00%0E%08%03%00%00%00%2Cc%0D%DE%00%00%00%A2PLTEQQQ%FA%FA%FA%FC%FC%FC%EE%EE%EE%A9%A9%A9%E9%E9%E9%0A%0A%0A%0D%0D%0D444PPP%CD%CD%CD%CC%CC%CC%F5%F5%F5UUU%D0%D0%D0'''%F9%F9%F9%A6%A6%A6%40%40%40FFF%A0%A0%A0%89%89%89%8D%8D%8D%20%20%20%14%14%14%DA%DA%DA%B6%B6%B6%02%02%02%87%87%87%81%81%81%AC%AC%AC%0E%0E%0E111%7D%7D%7D%92%92%92333%B9%B9%B9%BC%BC%BChhh)))%E1%E1%E1%03%03%03%CB%CB%CB%EB%EB%EB%FD%FD%FD%A3%A3%A3(((%04%04%04%CA%CA%CAttt%2C%2C%2C%F4%F4%F4%00%00%00%FF%FF%FF%D6%DE%02%C3%00%00%006tRNS%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%A1%8FN1%00%00%00iIDAT%08%D7E%C7E%16%02Q%10%C5%D0j%C3%DD%BDqw%5E%F6%BF5%06%D4%3Fd%94kx%BDf%DE6%FFIA%AB%C8qYj%1F%E3Xk%93%E0%C8JZ%10%90%9E%3A1%60%BBY%85%A8%AE%14%C0%5E%1A6%8E%C5w%02%60%99%C9%FA%9A%03%60%8C%EFz%8C%CE%0EnSu%3F%01%AD%B2%06%04%F0%3CT%FF%B8nk%3F%7C%01%C5z%1B%F9%26%2F%3Az%00%00%00%00IEND%AEB%60%82");border:1px solid #0a0}span.othercss{font-family:"Times New Roman";font-weight:inherit} -------------------------------------------------------------------------------- /tests/expectations/dataurl-nonbase64-noquotes.css: -------------------------------------------------------------------------------- 1 | div.nonbase64-noquotes{width:100px;height:100px;background-image:url(data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0C%00%00%00%0E%08%03%00%00%00%2Cc%0D%DE%00%00%00%A2PLTEQQQ%FA%FA%FA%FC%FC%FC%EE%EE%EE%A9%A9%A9%E9%E9%E9%0A%0A%0A%0D%0D%0D444PPP%CD%CD%CD%CC%CC%CC%F5%F5%F5UUU%D0%D0%D0\'\'\'%F9%F9%F9%A6%A6%A6%40%40%40FFF%A0%A0%A0%89%89%89%8D%8D%8D%20%20%20%14%14%14%DA%DA%DA%B6%B6%B6%02%02%02%87%87%87%81%81%81%AC%AC%AC%0E%0E%0E111%7D%7D%7D%92%92%92333%B9%B9%B9%BC%BC%BChhh\)\)\)%E1%E1%E1%03%03%03%CB%CB%CB%EB%EB%EB%FD%FD%FD%A3%A3%A3\(\(\(%04%04%04%CA%CA%CAttt%2C%2C%2C%F4%F4%F4%00%00%00%FF%FF%FF%D6%DE%02%C3%00%00%006tRNS%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%A1%8FN1%00%00%00iIDAT%08%D7E%C7E%16%02Q%10%C5%D0j%C3%DD%BDqw%5E%F6%BF5%06%D4%3Fd%94kx%BDf%DE6%FFIA%AB%C8qYj%1F%E3Xk%93%E0%C8JZ%10%90%9E%3A1%60%BBY%85%A8%AE%14%C0%5E%1A6%8E%C5w%02%60%99%C9%FA%9A%03%60%8C%EFz%8C%CE%0EnSu%3F%01%AD%B2%06%04%F0%3CT%FF%B8nk%3F%7C%01%C5z%1B%F9%26%2F%3Az%00%00%00%00IEND%AEB%60%82);border:1px solid red}span.othercss{font-family:"Times New Roman";font-weight:inherit} -------------------------------------------------------------------------------- /tests/expectations/dataurl-nonbase64-singlequotes.css: -------------------------------------------------------------------------------- 1 | div.nonbase64-singlequotes{width:100px;height:100px;background-image:url('data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0C%00%00%00%0E%08%03%00%00%00%2Cc%0D%DE%00%00%00%A2PLTEQQQ%FA%FA%FA%FC%FC%FC%EE%EE%EE%A9%A9%A9%E9%E9%E9%0A%0A%0A%0D%0D%0D444PPP%CD%CD%CD%CC%CC%CC%F5%F5%F5UUU%D0%D0%D0\'\'\'%F9%F9%F9%A6%A6%A6%40%40%40FFF%A0%A0%A0%89%89%89%8D%8D%8D%20%20%20%14%14%14%DA%DA%DA%B6%B6%B6%02%02%02%87%87%87%81%81%81%AC%AC%AC%0E%0E%0E111%7D%7D%7D%92%92%92333%B9%B9%B9%BC%BC%BChhh)))%E1%E1%E1%03%03%03%CB%CB%CB%EB%EB%EB%FD%FD%FD%A3%A3%A3(((%04%04%04%CA%CA%CAttt%2C%2C%2C%F4%F4%F4%00%00%00%FF%FF%FF%D6%DE%02%C3%00%00%006tRNS%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%A1%8FN1%00%00%00iIDAT%08%D7E%C7E%16%02Q%10%C5%D0j%C3%DD%BDqw%5E%F6%BF5%06%D4%3Fd%94kx%BDf%DE6%FFIA%AB%C8qYj%1F%E3Xk%93%E0%C8JZ%10%90%9E%3A1%60%BBY%85%A8%AE%14%C0%5E%1A6%8E%C5w%02%60%99%C9%FA%9A%03%60%8C%EFz%8C%CE%0EnSu%3F%01%AD%B2%06%04%F0%3CT%FF%B8nk%3F%7C%01%C5z%1B%F9%26%2F%3Az%00%00%00%00IEND%AEB%60%82');border:1px solid #00a}span.othercss{font-family:"Times New Roman";font-weight:inherit} -------------------------------------------------------------------------------- /tests/expectations/dataurl-noquote-multiline-font.css: -------------------------------------------------------------------------------- 1 | .y-ff-1{font-family:"Foo Bar",Helvetica,Arial;text-rendering:optimizeLegibility}.ua-op .y-ff-1{font-family:Helvetica,Arial}@font-face{font-family:"Foo Bar";src:url(data:font/truetype;base64,gRbIUFAIrsQNGditEWbAUKwAA) format("truetype"),url("http://yuilibrary.com/fonts/foo-bar.svg#webfontse22fewwr") format("svg");font-weight:400;font-style:normal} -------------------------------------------------------------------------------- /tests/expectations/dataurl-realdata-doublequotes.css: -------------------------------------------------------------------------------- 1 | .yui3-skin-sam .yui3-scrollview-scrollbar{-webkit-transform:translate3d(0,0,0);-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:3px;-webkit-border-radius:3px;-moz-border-radius:3px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg==")}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-bottom-right-radius:0;border-bottom-left-radius:0;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;-webkit-border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;-webkit-transform:translate3d(0,0,0);-moz-border-radius:0;-moz-border-radius-bottomright:3px;-moz-border-radius-bottomleft:3px;-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle{border-radius:0;-webkit-border-radius:0;-moz-border-radius:0;-webkit-transform:translate3d(0,0,0) scaleY(1);-webkit-transform-origin-y:0;-moz-transform:translate(0,0) scaleY(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-top-right-radius:0;border-bottom-left-radius:3px;-webkit-border-top-right-radius:0;-webkit-border-bottom-left-radius:3px;-moz-border-radius-topright:0;-moz-border-radius-bottomleft:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-bottom-left-radius:0;border-top-right-radius:3px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:3px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle{-webkit-transform:translate3d(0,0,0) scaleX(1);-webkit-transform-origin:0 0;-moz-transform:translate(0,0) scaleX(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child{background-color:#aaa;background-image:none} -------------------------------------------------------------------------------- /tests/expectations/dataurl-realdata-noquotes.css: -------------------------------------------------------------------------------- 1 | .yui3-skin-sam .yui3-scrollview-scrollbar{-webkit-transform:translate3d(0,0,0);-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:3px;-webkit-border-radius:3px;-moz-border-radius:3px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg==)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-bottom-right-radius:0;border-bottom-left-radius:0;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;-webkit-border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;-webkit-transform:translate3d(0,0,0);-moz-border-radius:0;-moz-border-radius-bottomright:3px;-moz-border-radius-bottomleft:3px;-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle{border-radius:0;-webkit-border-radius:0;-moz-border-radius:0;-webkit-transform:translate3d(0,0,0) scaleY(1);-webkit-transform-origin-y:0;-moz-transform:translate(0,0) scaleY(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-top-right-radius:0;border-bottom-left-radius:3px;-webkit-border-top-right-radius:0;-webkit-border-bottom-left-radius:3px;-moz-border-radius-topright:0;-moz-border-radius-bottomleft:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-bottom-left-radius:0;border-top-right-radius:3px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:3px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle{-webkit-transform:translate3d(0,0,0) scaleX(1);-webkit-transform-origin:0 0;-moz-transform:translate(0,0) scaleX(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child{background-color:#aaa;background-image:none} -------------------------------------------------------------------------------- /tests/expectations/dataurl-realdata-singlequotes.css: -------------------------------------------------------------------------------- 1 | .yui3-skin-sam .yui3-scrollview-scrollbar{-webkit-transform:translate3d(0,0,0);-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:3px;-webkit-border-radius:3px;-moz-border-radius:3px;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg==')}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-bottom-right-radius:0;border-bottom-left-radius:0;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last{border-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;-webkit-border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-bottom-left-radius:3px;-webkit-transform:translate3d(0,0,0);-moz-border-radius:0;-moz-border-radius-bottomright:3px;-moz-border-radius-bottomleft:3px;-moz-transform:translate(0,0)}.yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle{border-radius:0;-webkit-border-radius:0;-moz-border-radius:0;-webkit-transform:translate3d(0,0,0) scaleY(1);-webkit-transform-origin-y:0;-moz-transform:translate(0,0) scaleY(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-first,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-top-right-radius:0;border-bottom-left-radius:3px;-webkit-border-top-right-radius:0;-webkit-border-bottom-left-radius:3px;-moz-border-radius-topright:0;-moz-border-radius-bottomleft:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last{border-bottom-left-radius:0;border-top-right-radius:3px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:3px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:3px}.yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle{-webkit-transform:translate3d(0,0,0) scaleX(1);-webkit-transform-origin:0 0;-moz-transform:translate(0,0) scaleX(1);-moz-transform-origin:0 0}.yui3-skin-sam .yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child,.yui3-skin-sam .yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child{background-color:#aaa;background-image:none} -------------------------------------------------------------------------------- /tests/expectations/dataurl-realdata-yuiapp.css: -------------------------------------------------------------------------------- 1 | html{background:#fff;color:#555;height:100%}#hd,#bd,#ft{padding:0 50px}#bd{padding-bottom:50px;border-bottom:1px solid #006e9c}#ft{background:transparent no-repeat 0% 100%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADcAAAAeCAMAAAC/pnaKAAAAwFBMVEUkXIAoYYQoYYQoYYQyao02bpE6cpQ6cpREe51LgqNUiqtUiqtUiqtZj7BckrNlmrtlmrtlmrtroMB3qsp3qsp3qsp+sdCHudiHudiHudiHudiPwN+YyOaYyOaYyOaf0O2g0O6n1vOn1vOn1vOn1vOw3vu45f245f245f3B7f7K9f7K9f7K9f7X/v7X/v7p//7p//79//79//4AAABhAGMAbwBzAC4AcwB0AHIAaQBuAGcAcwABAAAAwIwmGwEAAABQQKFUAAAAQHRSTlP///////////////////////////////////////////////////////////////////8A////////////////0pfSbwAAAdtJREFUOI2NlNGqgzAMhv/ClDlQQcFdKOx4McFCKcH3f7eTtLWr07mFiUvbzz9Nk2LZGRH5937qZTiGyEx0Cr5xQpEd6xzNueCGc9SzUmAzP8cplO1zgRRutBAlM9EhZwknWj1LKXkwbOVojTqMEpKZOfeUD3OnR24VWeJf1OOBTnTgw8zZr3LyOlbdrWrdGlpG6Alz4Ni3RcT4Ldm8wHpOo9Yo5CPsdngM6D3HmLlESrgHD+YvrtEuUeLeMf7x7j23GJVgbJoHs0/cI3B7TNkfON5btsEUrvSdY694U0P9nXMp2mDsdbLmY14CN8XDjtzgo9CuqpYnGoMscDUmn08qsbOn/3Lte6rgP1eM7qQ1YMP+yPhiTmx2laDQspytgJI1MbIzZ7yHfj2/hYYtZ1xMM4dc3iTukjgJyKsrUBEH4uqFXNUh3aXxtWjbC3DpH8LRVPJ8MXLoA8fsz51ue73Q+1z7RkTEF0dWa1o5a8001C6ZbGuzh0bSTo9iS8X+C/NWbfTW5uZ9Vu4QaL20Xv3uhgyrZUXVtI2NfS3fbzgP75dNek/YbrL+k/EykecuZf6ZOzDJYsf9PCV3xhFHq7043mw+H1ylW+5Ab5jpADuPM2Z1P3POLWnUG/sHnIDsqkOjlqoAAAAASUVORK5CYII=);padding:0 0 40px;margin:50px}#hd,#bd{background:#f9f9f9}body{margin:0;padding:0;font:12px "Helvetica Nueue",Arial,sans-serif}#hd{color:#fff;padding-top:50px;margin:0}#hd,h1,h2,p,.color{margin:auto}h1,h2,a{color:#006e9c}h1,h2{margin-top:0}h4 .title{font-weight:700;letter-spacing:-2px;font-size:47px;text-shadow:0 1px 0 #369;background:#006e9d;color:#fff;padding:0 10px}h4{display:block;float:right;margin:0 0 0 20px}h4 .what{display:block;padding:4px;text-align:center;font-weight:400}h4 .version{font-size:11px;color:#ccc}h2{font-size:40px;font-family:"HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",sans-serif;font-weight:300}h4,p{padding:6px 0 6px}#ft p.fine,#ft p.fine a{color:#999}#ft p.intro{font-size:12px}#bd{font-size:14px;color:#666}#ft p{font-size:11px} -------------------------------------------------------------------------------- /tests/expectations/dataurl-singlequote-font.css: -------------------------------------------------------------------------------- 1 | .y-ff-1{font-family:"Foo Bar",Helvetica,Arial;text-rendering:optimizeLegibility}.ua-op .y-ff-1{font-family:Helvetica,Arial}@font-face{font-family:"Foo Bar";src:url('data:font/truetype;base64,gRbIUFAIrsQNGditEWbAUKwAA') format("truetype"),url("http://yuilibrary.com/fonts/foo-bar.svg#webfontse22fewwr") format("svg");font-weight:400;font-style:normal} -------------------------------------------------------------------------------- /tests/expectations/empty-rules.css: -------------------------------------------------------------------------------- 1 | @import "another.css"; 2 | /*! dont delete me */ 3 | .test{color:red}@media screen{.printonly{display:none}}@media print{ 4 | /*! imp: weird but it may happen */ 5 | } -------------------------------------------------------------------------------- /tests/expectations/flex.css: -------------------------------------------------------------------------------- 1 | div{flex:1 1 0%}div{flex:1 1 0px} -------------------------------------------------------------------------------- /tests/expectations/font-weight.css: -------------------------------------------------------------------------------- 1 | a{font-weight:700;font-weight:bolder}section{font-weight:400 !important} -------------------------------------------------------------------------------- /tests/expectations/important-comments-remove.css: -------------------------------------------------------------------------------- 1 | a{color:blue;width:5px;height:5px;margin:0}#yo{ma:"ma"}a{color:red}b{test:foo}html>/**/body p{color:blue;*width:auto;height:2%}a{a:1}b{content:"/**/"}c{c:3}/* unclosed comment at EOF issue -------------------------------------------------------------------------------- /tests/expectations/important.css: -------------------------------------------------------------------------------- 1 | a{height:100px !important;text-shadow:0 0 0 !important;width:20% !important} -------------------------------------------------------------------------------- /tests/expectations/kube.css: -------------------------------------------------------------------------------- 1 | html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}*{margin:0;padding:0;outline:0;-webkit-overflow-scrolling:touch}img,video,audio{max-width:100%}img,video{height:auto}svg{max-height:100%}iframe{border:none}::-moz-focus-inner{border:0;padding:0}input[type=radio],input[type=checkbox]{vertical-align:middle;position:relative;bottom:.15rem;font-size:115%;margin-right:3px}input[type=search]{-webkit-appearance:textfield}input[type=search]::-webkit-search-decoration,input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none}.black{color:#0d0d0e}.inverted{color:#fff}.error{color:#f03c69}.success{color:#35beb1}.warning{color:#f7ba45}.focus{color:#1c86f2}.aluminum{color:#f8f8f8}.silver{color:#e0e1e1}.lightgray{color:#d4d4d4}.gray{color:#bdbdbd}.midgray{color:#676b72}.darkgray{color:#313439}.bg-black{background-color:#0d0d0e}.bg-inverted{background-color:#fff}.bg-error{background-color:#f03c69}.bg-success{background-color:#35beb1}.bg-warning{background-color:#f7ba45}.bg-focus{background-color:#1c86f2}.bg-aluminum{background-color:#f8f8f8}.bg-silver{background-color:#e0e1e1}.bg-lightgray{background-color:#d4d4d4}.bg-gray{background-color:#bdbdbd}.bg-midgray{background-color:#676b72}.bg-darkgray{background-color:#313439}.bg-highlight{background-color:#edf2ff}html,body{font-size:16px;line-height:24px}body{font-family:Arial,"Helvetica Neue",Helvetica,sans-serif;color:#313439;background-color:transparent}a{color:#3794de}a:hover{color:#f03c69}h1.title,h1,h2,h3,h4,h5,h6{font-family:Arial,"Helvetica Neue",Helvetica,sans-serif;font-weight:700;color:#0d0d0e;text-rendering:optimizeLegibility;margin-bottom:16px}h1.title{font-size:60px;line-height:64px;margin-bottom:8px}h1,.h1{font-size:48px;line-height:52px}h2,.h2{font-size:36px;line-height:40px}h3,.h3{font-size:24px;line-height:32px}h4,.h4{font-size:21px;line-height:32px}h5,.h5{font-size:18px;line-height:28px}h6,.h6{font-size:16px;line-height:24px}h1 a,.h1 a,h2 a,.h2 a,h3 a,.h3 a,h4 a,.h4 a,h5 a,.h5 a,h6 a,.h6 a{color:inherit}p+h2,p+h3,p+h4,p+h5,p+h6,ul+h2,ul+h3,ul+h4,ul+h5,ul+h6,ol+h2,ol+h3,ol+h4,ol+h5,ol+h6,dl+h2,dl+h3,dl+h4,dl+h5,dl+h6,blockquote+h2,blockquote+h3,blockquote+h4,blockquote+h5,blockquote+h6,hr+h2,hr+h3,hr+h4,hr+h5,hr+h6,pre+h2,pre+h3,pre+h4,pre+h5,pre+h6,table+h2,table+h3,table+h4,table+h5,table+h6,form+h2,form+h3,form+h4,form+h5,form+h6,figure+h2,figure+h3,figure+h4,figure+h5,figure+h6{margin-top:24px}ul,ul ul,ul ol,ol,ol ul,ol ol{margin:0 0 0 24px}ol ol li{list-style-type:lower-alpha}ol ol ol li{list-style-type:lower-roman}nav ul,nav ol{margin:0;list-style:none}nav ul ul,nav ul ol,nav ol ul,nav ol ol{margin-left:24px}dl dt{font-weight:700}dd{margin-left:24px}p,blockquote,hr,pre,ol,ul,dl,table,fieldset,figure,address,form{margin-bottom:16px}hr{border:none;border-bottom:1px solid rgba(0,0,0,.1);margin-top:-1px}blockquote{padding-left:1rem;border-left:4px solid rgba(0,0,0,.1);font-style:italic;color:rgba(49,52,57,.65)}blockquote p{margin-bottom:.5rem}time,cite,small,figcaption{font-size:87.5%}cite{opacity:.6}abbr[title],dfn[title]{border-bottom:1px dotted rgba(0,0,0,.5);cursor:help}var{font-size:16px;opacity:.6;font-style:normal}mark,code,samp,kbd{position:relative;top:-1px;padding:4px 4px 2px;display:inline-block;line-height:1;color:rgba(49,52,57,.85)}code{background:#e0e1e1}mark{background:#f7ba45}samp{color:#fff;background:#1c86f2}kbd{border:1px solid rgba(0,0,0,.1)}sub,sup{font-size:x-small;line-height:0;margin-left:1rem/4;position:relative}sup{top:0}sub{bottom:1px}pre,code,samp,var,kbd{font-family:Consolas,Monaco,"Courier New",monospace}pre,code,samp,var,kbd,mark{font-size:87.5%}pre,pre code{background:#f8f8f8;padding:0;top:0;display:block;line-height:20px;color:rgba(49,52,57,.85);overflow:none;white-space:pre-wrap}pre{padding:1rem}figcaption{opacity:.6}figure figcaption{position:relative;top:-1rem/2}figure pre{background:0 0;border:1px solid rgba(0,0,0,.1);border-radius:4px}figure .video-container,figure pre{margin-bottom:8px}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}ul.unstyled{margin-left:0}ul.unstyled,ul.unstyled ul{list-style:none}.monospace{font-family:Consolas,Monaco,"Courier New",monospace}.upper{text-transform:uppercase}.lower{text-transform:lowercase}.italic{font-style:italic !important}.strong{font-weight:700 !important}.normal{font-weight:400 !important}.muted{opacity:.55}a.muted{color:#0d0d0e}a.muted:hover{opacity:1}.black{color:#0d0d0e}.smaller{font-size:12px;line-height:20px}.small{font-size:14px;line-height:20px}.big{font-size:18px;line-height:28px}.large{font-size:20px;line-height:32px}.end{margin-bottom:0 !important}.highlight{background-color:#edf2ff}.nowrap,.nowrap td{white-space:nowrap}@media (min-width:768px) and (max-width:1024px){.columns-2,.columns-3,.columns-4{column-gap:24px}.columns-2{column-count:2}.columns-3{column-count:3}.columns-4{column-count:4}}.row{display:flex;flex-direction:row;flex-wrap:wrap}@media (max-width:768px){.row{flex-direction:column;flex-wrap:nowrap}}.row.gutters,.row.gutters>.row{margin-left:-2%}@media (max-width:768px){.row.gutters,.row.gutters>.row{margin-left:0}}.row.gutters>.col,.row.gutters>.row>.col{margin-left:2%}@media (max-width:768px){.row.gutters>.col,.row.gutters>.row>.col{margin-left:0}}.row.around{justify-content:space-around}.row.between{justify-content:space-between}.row.auto .col{flex-grow:1}.col-1{width:8.33333%}.offset-1{margin-left:8.33333%}.col-2{width:16.66667%}.offset-2{margin-left:16.66667%}.col-3{width:25%}.offset-3{margin-left:25%}.col-4{width:33.33333%}.offset-4{margin-left:33.33333%}.col-5{width:41.66667%}.offset-5{margin-left:41.66667%}.col-6{width:50%}.offset-6{margin-left:50%}.col-7{width:58.33333%}.offset-7{margin-left:58.33333%}.col-8{width:66.66667%}.offset-8{margin-left:66.66667%}.col-9{width:75%}.offset-9{margin-left:75%}.col-10{width:83.33333%}.offset-10{margin-left:83.33333%}.col-11{width:91.66667%}.offset-11{margin-left:91.66667%}.col-12{width:100%}.offset-12{margin-left:100%}.gutters>.col-1{width:calc(8.33333% - 2%)}.gutters>.offset-1{margin-left:calc(8.33333% + 2%) !important}.gutters>.col-2{width:calc(16.66667% - 2%)}.gutters>.offset-2{margin-left:calc(16.66667% + 2%) !important}.gutters>.col-3{width:calc(25% - 2%)}.gutters>.offset-3{margin-left:calc(25% + 2%) !important}.gutters>.col-4{width:calc(33.33333% - 2%)}.gutters>.offset-4{margin-left:calc(33.33333% + 2%) !important}.gutters>.col-5{width:calc(41.66667% - 2%)}.gutters>.offset-5{margin-left:calc(41.66667% + 2%) !important}.gutters>.col-6{width:calc(50% - 2%)}.gutters>.offset-6{margin-left:calc(50% + 2%) !important}.gutters>.col-7{width:calc(58.33333% - 2%)}.gutters>.offset-7{margin-left:calc(58.33333% + 2%) !important}.gutters>.col-8{width:calc(66.66667% - 2%)}.gutters>.offset-8{margin-left:calc(66.66667% + 2%) !important}.gutters>.col-9{width:calc(75% - 2%)}.gutters>.offset-9{margin-left:calc(75% + 2%) !important}.gutters>.col-10{width:calc(83.33333% - 2%)}.gutters>.offset-10{margin-left:calc(83.33333% + 2%) !important}.gutters>.col-11{width:calc(91.66667% - 2%)}.gutters>.offset-11{margin-left:calc(91.66667% + 2%) !important}.gutters>.col-12{width:calc(100% - 2%)}.gutters>.offset-12{margin-left:calc(100% + 2%) !important}@media (max-width:768px){[class^=offset-],[class*=' offset-']{margin-left:0}}.first{order:-1}.last{order:1}@media (max-width:768px){.row .col{margin-left:0;width:100%}.row.gutters .col{margin-bottom:16px}.first-sm{order:-1}.last-sm{order:1}}table{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;empty-cells:show;font-size:15px;line-height:24px}table caption{text-align:left;font-size:14px;font-weight:500;color:#676b72}th{text-align:left;font-weight:700;vertical-align:bottom}td{vertical-align:top}tr.align-middle td,td.align-middle{vertical-align:middle}th,td{padding:1rem;border-bottom:1px solid rgba(0,0,0,.05)}th:first-child,td:first-child{padding-left:0}th:last-child,td:last-child{padding-right:0}tfoot th,tfoot td{color:rgba(49,52,57,.5)}table.bordered td,table.bordered th{border:1px solid rgba(0,0,0,.05)}table.striped tr:nth-child(odd) td{background:#f8f8f8}table.bordered td:first-child,table.bordered th:first-child,table.striped td:first-child,table.striped th:first-child{padding-left:1rem}table.bordered td:last-child,table.bordered th:last-child,table.striped td:last-child,table.striped th:last-child{padding-right:1rem}table.unstyled td,table.unstyled th{border:none;padding:0}fieldset{font-family:inherit;border:1px solid rgba(0,0,0,.1);padding:2rem;margin-bottom:2rem;margin-top:2rem}legend{font-weight:700;font-size:12px;text-transform:uppercase;padding:0 1rem;margin-left:-1rem;top:2px;position:relative;line-height:0}input,textarea,select{display:block;width:100%;font-family:inherit;font-size:15px;height:40px;outline:none;vertical-align:middle;background-color:#fff;border:1px solid #d4d4d4;border-radius:3px;box-shadow:none;padding:0 12px}input.small,textarea.small,select.small{height:36px;font-size:13px;padding:0 12px;border-radius:3px}input.big,textarea.big,select.big{height:48px;font-size:17px;padding:0 12px;border-radius:3px}input:focus,textarea:focus,select:focus{outline:none;background-color:#fff;border-color:#1c86f2;box-shadow:0 0 1px #1c86f2 inset}input.error,textarea.error,select.error{background-color:rgba(240,60,105,.1);border:1px solid #f583a0}input.error:focus,textarea.error:focus,select.error:focus{border-color:#f03c69;box-shadow:0 0 1px #f03c69 inset}input.success,textarea.success,select.success{background-color:rgba(53,190,177,.1);border:1px solid #6ad5cb}input.success:focus,textarea.success:focus,select.success:focus{border-color:#35beb1;box-shadow:0 0 1px #35beb1 inset}input:disabled,input.disabled,textarea:disabled,textarea.disabled,select:disabled,select.disabled{resize:none;opacity:.6;cursor:default;font-style:italic;color:rgba(0,0,0,.5)}select{-webkit-appearance:none;background-image:url('data:image/svg+xml;utf8,');background-repeat:no-repeat;background-position:right 1rem center}select[multiple]{background-image:none;height:auto;padding:.5rem .75rem}textarea{height:auto;padding:8px 12px;line-height:24px;vertical-align:top}input[type=file]{width:auto;border:none;padding:0;height:auto;background:0 0;box-shadow:none;display:inline-block}input[type=search],input.search{background-repeat:no-repeat;background-position:8px 53%;background-image:url('data:image/svg+xml;utf8,');padding-left:32px}input[type=radio],input[type=checkbox]{display:inline-block;width:auto;height:auto;padding:0}label{display:block;color:#313439;margin-bottom:4px;font-size:15px}label.checkbox,label .desc,label .success,label .error{text-transform:none;font-weight:400}label.checkbox{font-size:16px;line-height:24px;cursor:pointer;color:inherit}label.checkbox input{margin-top:0}.form-checkboxes label.checkbox{display:inline-block;margin-right:16px}.req{position:relative;top:1px;font-weight:700;color:#f03c69;font-size:110%}.desc{color:rgba(49,52,57,.5);font-size:12px;line-height:20px}span.desc{margin-left:4px}div.desc{margin-top:4px;margin-bottom:-8px}.form-buttons button,.form-buttons .button{margin-right:8px}form,.form-item{margin-bottom:2rem}.form>.form-item:last-child{margin-bottom:0}.form .row:last-child .form-item{margin-bottom:0}.form span.success,.form span.error{font-size:12px;line-height:20px;margin-left:4px}.form-inline input,.form-inline textarea,.form-inline select{display:inline-block;width:auto}.append,.prepend{display:flex}.append input,.prepend input{flex:1}.append .button,.append span,.prepend .button,.prepend span{flex-shrink:0}.append span,.prepend span{display:flex;flex-direction:column;justify-content:center;font-weight:400;border:1px solid #d4d4d4;background-color:#f8f8f8;padding:0 .875rem;color:rgba(0,0,0,.5);font-size:12px;white-space:nowrap}.prepend input{border-radius:0 3px 3px 0}.prepend .button{margin-right:-1px;border-radius:3px 0 0 3px !important}.prepend span{border-right:none;border-radius:3px 0 0 3px}.append input{border-radius:3px 0 0 3px}.append .button{margin-left:-1px;border-radius:0 3px 3px 0 !important}.append span{border-left:none;border-radius:0 3px 3px 0}button,.button{font-family:Arial,"Helvetica Neue",Helvetica,sans-serif;font-size:15px;color:#fff;background-color:#1c86f2;border-radius:3px;min-height:40px;padding:8px 20px;font-weight:500;text-decoration:none;cursor:pointer;display:inline-block;line-height:20px;border:1px solid transparent;vertical-align:middle;-webkit-appearance:none}button i,.button i{position:relative;top:1px;margin:0 2px}input[type=submit]{width:auto}button:hover,.button:hover{outline:none;text-decoration:none;color:#fff;background-color:#4ca0f5}.button:disabled,.button.disabled{cursor:default;font-style:normal;color:rgba(255,255,255,.7);background-color:rgba(28,134,242,.7)}.button.small{font-size:13px;min-height:36px;padding:6px 20px;border-radius:3px}.button.big{font-size:17px;min-height:48px;padding:13px 24px;border-radius:3px}.button.large{font-size:19px;min-height:56px;padding:20px 36px;border-radius:3px}.button.outline{background:0 0;border-width:2px;border-color:#1c86f2;color:#1c86f2}.button.outline:hover{background:0 0;color:rgba(28,134,242,.6);border-color:rgba(28,134,242,.5)}.button.outline:disabled,.button.outline.disabled{background:0 0;color:rgba(28,134,242,.7);border-color:rgba(28,134,242,.5)}.button.inverted{color:#000;background-color:#fff}.button.inverted:hover{color:#000;background-color:#fff}.button.inverted:disabled,.button.inverted.disabled{color:rgba(0,0,0,.7);background-color:rgba(255,255,255,.7)}.button.inverted.outline{background:0 0;color:#fff;border-color:#fff}.button.inverted.outline:hover{color:rgba(255,255,255,.6);border-color:rgba(255,255,255,.5)}.button.inverted.outline:disabled,.button.inverted.outline.disabled{background:0 0;color:rgba(255,255,255,.7);border-color:rgba(255,255,255,.5)}.button.inverted:hover{opacity:.7}.button.round{border-radius:56px}.button.raised{box-shadow:0 1px 3px rgba(0,0,0,.3)}.button.upper{text-transform:uppercase;letter-spacing:.04em;font-size:13px}.button.upper.small{font-size:11px}.button.upper.big{font-size:13px}.button.upper.large{font-size:15px}.button.secondary{color:#fff;background-color:#313439}.button.secondary:hover{color:#fff;background-color:#606670}.button.secondary:disabled,.button.secondary.disabled{color:rgba(255,255,255,.7);background-color:rgba(49,52,57,.7)}.button.secondary.outline{background:0 0;color:#313439;border-color:#313439}.button.secondary.outline:hover{color:rgba(49,52,57,.6);border-color:rgba(49,52,57,.5)}.button.secondary.outline:disabled,.button.secondary.outline.disabled{background:0 0;color:rgba(49,52,57,.7);border-color:rgba(49,52,57,.5)}.label{display:inline-block;font-size:13px;background:#e0e1e1;line-height:18px;padding:0 10px;font-weight:500;color:#313439;border:1px solid transparent;vertical-align:middle;text-decoration:none;border-radius:4px}.label a,.label a:hover{color:inherit;text-decoration:none}.label.big{font-size:14px;line-height:24px;padding:0 12px}.label.upper{text-transform:uppercase;font-size:11px}.label.outline{background:0 0;border-color:#bdbdbd}.label.badge{text-align:center;border-radius:64px;padding:0 6px}.label.badge.big{padding:0 8px}.label.tag{padding:0;background:0 0;border:none;text-transform:uppercase;font-size:11px}.label.tag.big{font-size:13px}.label.success{background:#35beb1;color:#fff}.label.success.tag,.label.success.outline{background:0 0;border-color:#35beb1;color:#35beb1}.label.error{background:#f03c69;color:#fff}.label.error.tag,.label.error.outline{background:0 0;border-color:#f03c69;color:#f03c69}.label.warning{background:#f7ba45;color:#0d0d0e}.label.warning.tag,.label.warning.outline{background:0 0;border-color:#f7ba45;color:#f7ba45}.label.focus{background:#1c86f2;color:#fff}.label.focus.tag,.label.focus.outline{background:0 0;border-color:#1c86f2;color:#1c86f2}.label.black{background:#0d0d0e;color:#fff}.label.black.tag,.label.black.outline{background:0 0;border-color:#0d0d0e;color:#0d0d0e}.label.inverted{background:#fff;color:#0d0d0e}.label.inverted.tag,.label.inverted.outline{background:0 0;border-color:#fff;color:#fff}.breadcrumbs{font-size:14px;margin-bottom:24px}.breadcrumbs ul{display:flex;align-items:center}.breadcrumbs.push-center ul{justify-content:center}.breadcrumbs span,.breadcrumbs a{font-style:normal;padding:0 10px;display:inline-block;white-space:nowrap}.breadcrumbs li:after{display:inline-block;content:'/';color:rgba(0,0,0,.3)}.breadcrumbs li:last-child:after{display:none}.breadcrumbs li:first-child span,.breadcrumbs li:first-child a{padding-left:0}.breadcrumbs li.active a{color:#313439;text-decoration:none;cursor:text}.pagination{margin:24px 0;font-size:14px}.pagination ul{display:flex;margin:0}.pagination.align-center ul{justify-content:center}.pagination span,.pagination a{border-radius:3px;display:inline-block;padding:8px 12px;line-height:1;white-space:nowrap;border:1px solid transparent}.pagination a{text-decoration:none;color:#313439}.pagination a:hover{color:rgba(0,0,0,.5);border-color:#e0e1e1}.pagination span,.pagination li.active a{color:rgba(0,0,0,.5);border-color:#e0e1e1;cursor:text}.pagination.upper{font-size:12px}.pager span{line-height:24px}.pager span,.pager a{padding-left:16px;padding-right:16px;border-radius:64px;border-color:rgba(0,0,0,.1)}.pager li{flex-basis:50%}.pager li.next{text-align:right}.pager.align-center li{flex-basis:auto;margin-left:4px;margin-right:4px}.pager.flat span,.pager.flat a{border:none;display:block;padding:0}.pager.flat a{font-weight:700}.pager.flat a:hover{background:0 0;text-decoration:underline}@media (max-width:768px){.pager.flat ul{flex-direction:column}.pager.flat li{flex-basis:100%;margin-bottom:8px;text-align:left}}@font-face{font-family:'Kube';src:url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfgAAAC8AAAAYGNtYXAXVtKOAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZsMn2SAAAAF4AAADeGhlYWQMP9EUAAAE8AAAADZoaGVhB8IDzQAABSgAAAAkaG10eCYABd4AAAVMAAAAMGxvY2EFWASuAAAFfAAAABptYXhwABcAmwAABZgAAAAgbmFtZfMJxocAAAW4AAABYnBvc3QAAwAAAAAHHAAAACAAAwPHAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBwPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qf//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAAKAAAAAAQAA8AADwAUACQANABEAFYAaAB4AIgAmAAAEyIGFREUFjMhMjY1ETQmIwUhESEREzgBMSIGFRQWMzI2NTQmIzM4ATEiBhUUFjMyNjU0JiMzOAExIgYVFBYzMjY1NCYjATIWHQEUBiMiJj0BNDYzOAExITIWHQEUBiMiJj0BNDYzOAExATgBMSIGFRQWMzI2NTQmIzM4ATEiBhUUFjMyNjU0JiMzOAExIgYVFBYzMjY1NCYjwFBwcFACgFBwcFD9IQM+/MKrHioqHh4qKh70HioqHh4qKh70HisrHh0rKh7+MBQdHRQUHBwUAbgUHBwUFB0dFP4wHioqHh4qKh70HioqHh4qKh70HisrHh0rKh4DYHBQ/iBQcHBQAeBQcF/9XwKh/n8qHh4qKh4eKioeHioqHh4qKh4eKioeHioCQBwVjhUcHBWOFRwcFY4VHBwVjhUc/rAqHh4qKh4eKioeHioqHh4qKh4eKioeHioAAAABAQAAwAMAAcAACwAAAQcXBycHJzcnNxc3AwDMAjMDAzMCzDTMzAGVqAIrAgIrAqgrqKgAAQGAAEACgAJAAAsAACUnByc3JzcXNxcHFwJVqAIrAgIrAqgrqKhAzAIzAwMzAsw0zMwAAAEBgABAAoACQAALAAABFzcXBxcHJwcnNycBq6gCKwICKwKoK6ioAkDMAjMDAzMCzDTMzAABAQAAwAMAAcAACwAAJTcnNxc3FwcXBycHAQDMAjMDAzMCzDTMzOuoAisCAisCqCuoqAAAAgAP/+UD1AOqAAQACAAAEwEHATcFAScBSwOJPPx3PAOJ/Hc8A4kDqvx3PAOJPDz8dzwDiQAAAAADAIAAgAOAAwAAAwAHAAsAADc1IRUBIRUhESEVIYADAP0AAwD9AAMA/QCAgIABgIABgIAAAgBPAA8DsgNxABgALQAAJQcBDgEjIi4CNTQ+AjMyHgIVFAYHAQEiDgIVFB4CMzI+AjU0LgIjA7JY/t4lWTBBc1YxMVZzQUFzVTIcGQEi/dgxVkAlJUBWMTFWQCUlQFYxZ1gBIRkcMlVzQUFzVjExVnNBMFkm/uACuyVAVjExVkAlJUBWMTFWQCUAAAABAAAAAQAABhlWm18PPPUACwQAAAAAANSQRjkAAAAA1JBGOQAA/+UEAAPAAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAQAAAEAAAAAAAAAAAAAAAAAAAAMBAAAAAAAAAAAAAAAAgAAAAQAAAAEAAEABAABgAQAAYAEAAEABAAADwQAAIAEAABPAAAAAAAKABQAHgDYAPIBDAEmAUABXAF2AbwAAAABAAAADACZAAoAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEABAAAAAEAAAAAAAIABwBFAAEAAAAAAAMABAAtAAEAAAAAAAQABABaAAEAAAAAAAUACwAMAAEAAAAAAAYABAA5AAEAAAAAAAoAGgBmAAMAAQQJAAEACAAEAAMAAQQJAAIADgBMAAMAAQQJAAMACAAxAAMAAQQJAAQACABeAAMAAQQJAAUAFgAXAAMAAQQJAAYACAA9AAMAAQQJAAoANACAS3ViZQBLAHUAYgBlVmVyc2lvbiAxLjAAVgBlAHIAcwBpAG8AbgAgADEALgAwS3ViZQBLAHUAYgBlS3ViZQBLAHUAYgBlUmVndWxhcgBSAGUAZwB1AGwAYQByS3ViZQBLAHUAYgBlRm9udCBnZW5lcmF0ZWQgYnkgSWNvTW9vbi4ARgBvAG4AdAAgAGcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAASQBjAG8ATQBvAG8AbgAuAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==") format("truetype");font-weight:400;font-style:normal}[class^=kube-],[class*=" kube-"],.close,.caret{font-family:'Kube' !important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.kube-calendar:before{content:"\e900"}.caret.down:before,.kube-caret-down:before{content:"\e901"}.caret.left:before,.kube-caret-left:before{content:"\e902"}.caret.right:before,.kube-caret-right:before{content:"\e903"}.caret.up:before,.kube-caret-up:before{content:"\e904"}.close:before,.kube-close:before{content:"\e905"}.kube-menu:before{content:"\e906"}.kube-search:before{content:"\e907"}.gutters .column.push-left,.push-left{margin-right:auto}.gutters .column.push-right,.push-right{margin-left:auto}.gutters .column.push-center,.push-center{margin-left:auto;margin-right:auto}.gutters .column.push-middle,.push-middle{margin-top:auto;margin-bottom:auto}.push-bottom{margin-top:auto}@media (max-width:768px){.gutters .column.push-left-sm,.push-left-sm{margin-left:0}.gutters .column.push-center-sm,.push-center-sm{margin-left:auto;margin-right:auto}.push-top-sm{margin-top:0}}.align-middle{align-items:center}.align-right{justify-content:flex-end}.align-center{justify-content:center}@media (max-width:768px){.align-left-sm{justify-content:flex-start}}.float-right{float:right}.float-left{float:left}@media (max-width:768px){.float-right{float:none}.float-left{float:none}}.fixed{position:fixed;top:0;left:0;z-index:100;width:100%}.w5{width:5%}.w10{width:10%}.w15{width:15%}.w20{width:20%}.w25{width:25%}.w30{width:30%}.w35{width:35%}.w40{width:40%}.w45{width:45%}.w50{width:50%}.w55{width:55%}.w60{width:60%}.w65{width:65%}.w70{width:70%}.w75{width:75%}.w80{width:80%}.w85{width:85%}.w90{width:90%}.w95{width:95%}.w100{width:100%}.w-auto{width:auto}.w-small{width:480px}.w-medium{width:600px}.w-big{width:740px}.w-large{width:840px}@media (max-width:768px){.w-auto-sm{width:auto}.w100-sm,.w-small,.w-medium,.w-big,.w-large{width:100%}}.max-w5{max-width:5%}.max-w10{max-width:10%}.max-w15{max-width:15%}.max-w20{max-width:20%}.max-w25{max-width:25%}.max-w30{max-width:30%}.max-w35{max-width:35%}.max-w40{max-width:40%}.max-w45{max-width:45%}.max-w50{max-width:50%}.max-w55{max-width:55%}.max-w60{max-width:60%}.max-w65{max-width:65%}.max-w70{max-width:70%}.max-w75{max-width:75%}.max-w80{max-width:80%}.max-w85{max-width:85%}.max-w90{max-width:90%}.max-w95{max-width:95%}.max-w100{max-width:100%}.max-w-small{max-width:480px}.max-w-medium{max-width:600px}.max-w-big{max-width:740px}.max-w-large{max-width:840px}@media (max-width:768px){.max-w-auto-sm,.max-w-small,.max-w-medium,.max-w-big,.max-w-large{max-width:auto}}.min-w5{min-width:5%}.min-w10{min-width:10%}.min-w15{min-width:15%}.min-w20{min-width:20%}.min-w25{min-width:25%}.min-w30{min-width:30%}.min-w35{min-width:35%}.min-w40{min-width:40%}.min-w45{min-width:45%}.min-w50{min-width:50%}.min-w55{min-width:55%}.min-w60{min-width:60%}.min-w65{min-width:65%}.min-w70{min-width:70%}.min-w75{min-width:75%}.min-w80{min-width:80%}.min-w85{min-width:85%}.min-w90{min-width:90%}.min-w95{min-width:95%}.min-w100{min-width:100%}.h25{height:25%}.h50{height:50%}.h100{height:100%}.group:after{content:'';display:table;clear:both}.flex{display:flex}@media (max-width:768px){.flex-column-sm{flex-direction:column}.flex-w100-sm{flex:0 0 100%}}@media (max-width:768px) and (max-width:768px){.flex-w100-sm{flex:0 0 100% !important}}.invisible{visibility:hidden}.visible{visibility:visible}.display-block{display:block}.hide{display:none !important}@media (max-width:768px){.hide-sm{display:none !important}}@media (min-width:768px){.show-sm{display:none !important}}@media print{.hide-print{display:none !important}.show-print{display:block !important}}.no-scroll{overflow:hidden;position:fixed;top:0;left:0;width:100%;height:100% !important}.scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}.video-container{height:0;padding-bottom:56.25%;position:relative;margin-bottom:16px}.video-container iframe,.video-container object,.video-container embed{position:absolute;top:0;left:0;width:100% !important;height:100% !important}.close{display:inline-block;min-height:16px;min-width:16px;line-height:16px;vertical-align:middle;text-align:center;font-size:12px;opacity:.6}.close:hover{opacity:1}.close.small{font-size:8px}.close.big{font-size:18px}.close.white{color:#fff}.caret{display:inline-block}.button .caret{margin-right:-8px}.overlay{position:fixed;z-index:200;top:0;left:0;right:0;bottom:0;background-color:rgba(255,255,255,.95)}.overlay>.close{position:fixed;top:1rem;right:1rem}@media print{*{background:0 0 !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}pre,blockquote{border:1px solid #999;page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}h2,h3,h4{page-break-after:avoid}@page{margin:.5cm}}@keyframes slideUp{to{height:0;padding-top:0;padding-bottom:0}}@keyframes slideDown{from{height:0;padding-top:0;padding-bottom:0}}@keyframes fadeIn{from{opacity:0}to{opacity:1}}@keyframes fadeOut{from{opacity:1}to{opacity:0}}@keyframes flipIn{from{opacity:0;transform:scaleY(0)}to{opacity:1;transform:scaleY(1)}}@keyframes flipOut{from{opacity:1;transform:scaleY(1)}to{opacity:0;transform:scaleY(0)}}@keyframes zoomIn{from{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomOut{from{opacity:1}50%{opacity:0;transform:scale3d(.3,.3,.3)}to{opacity:0}}@keyframes slideInRight{from{transform:translate3d(100%,0,0);visibility:visible}to{transform:translate3d(0,0,0)}}@keyframes slideInLeft{from{transform:translate3d(-100%,0,0);visibility:visible}to{transform:translate3d(0,0,0)}}@keyframes slideInDown{from{transform:translate3d(0,-100%,0);visibility:visible}to{transform:translate3d(0,0,0)}}@keyframes slideOutLeft{from{transform:translate3d(0,0,0)}to{visibility:hidden;transform:translate3d(-100%,0,0)}}@keyframes slideOutRight{from{transform:translate3d(0,0,0)}to{visibility:hidden;transform:translate3d(100%,0,0)}}@keyframes slideOutUp{from{transform:translate3d(0,0,0)}to{visibility:hidden;transform:translate3d(0,-100%,0)}}@keyframes rotate{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}@keyframes pulse{from{transform:scale3d(1,1,1)}50%{transform:scale3d(1.03,1.03,1.03)}to{transform:scale3d(1,1,1)}}@keyframes shake{15%{transform:translateX(.5rem)}30%{transform:translateX(-.4rem)}45%{transform:translateX(.3rem)}60%{transform:translateX(-.2rem)}75%{transform:translateX(.1rem)}90%{transform:translateX(0)}90%{transform:translateX(0)}}.fadeIn{animation:fadeIn .25s}.fadeOut{animation:fadeOut .25s}.zoomIn{animation:zoomIn .2s}.zoomOut{animation:zoomOut .5s}.slideInRight{animation:slideInRight .5s}.slideInLeft{animation:slideInLeft .5s}.slideInDown{animation:slideInDown .5s}.slideOutLeft{animation:slideOutLeft .5s}.slideOutRight{animation:slideOutRight .5s}.slideOutUp{animation:slideOutUp .5s}.slideUp{overflow:hidden;animation:slideUp .2s ease-in-out}.slideDown{overflow:hidden;animation:slideDown 80ms ease-in-out}.flipIn{animation:flipIn .25s cubic-bezier(.5,-.5,.5,1.5)}.flipOut{animation:flipOut .5s cubic-bezier(.5,-.5,.5,1.5)}.rotate{animation:rotate .5s}.pulse{animation:pulse .25s 2}.shake{animation:shake .5s}.dropdown{position:absolute;z-index:100;top:0;right:0;width:280px;color:#000;font-size:15px;background:#fff;box-shadow:0 10px 25px rgba(0,0,0,.15);border-radius:3px;max-height:300px;margin:0;padding:0;overflow:hidden}.dropdown.dropdown-mobile{position:fixed;top:0;left:0;right:0;bottom:0;width:100%;max-height:none;border:none}.dropdown .close{margin:20px auto}.dropdown.open{overflow:auto}.dropdown ul{list-style:none;margin:0}.dropdown ul li{border-bottom:1px solid rgba(0,0,0,.07)}.dropdown ul li:last-child{border-bottom:none}.dropdown ul a{display:block;padding:12px;text-decoration:none;color:#000}.dropdown ul a:hover{background:rgba(0,0,0,.05)}.message{font-family:Consolas,Monaco,"Courier New",monospace;font-size:14px;line-height:20px;background:#e0e1e1;color:#313439;padding:1rem;padding-right:2.5em;padding-bottom:.75rem;margin-bottom:24px;position:relative}.message a{color:inherit}.message h2,.message h3,.message h4,.message h5,.message h6{margin-bottom:0}.message .close{position:absolute;right:1rem;top:1.1rem}.message.error{background:#f03c69;color:#fff}.message.success{background:#35beb1;color:#fff}.message.warning{background:#f7ba45}.message.focus{background:#1c86f2;color:#fff}.message.black{background:#0d0d0e;color:#fff}.message.inverted{background:#fff}.modal-box{position:fixed;top:0;left:0;bottom:0;right:0;overflow-x:hidden;overflow-y:auto;z-index:200}.modal{position:relative;margin:auto;margin-top:16px;padding:0;background:#fff;box-shadow:0 10px 25px rgba(0,0,0,.15);border-radius:8px;color:#000}@media (max-width:768px){.modal input,.modal textarea{font-size:16px}}.modal .close{position:absolute;top:18px;right:16px;opacity:.3}.modal .close:hover{opacity:1}.modal-header{padding:24px 32px;font-size:18px;font-weight:700;border-bottom:1px solid rgba(0,0,0,.05)}.modal-header:empty{display:none}.modal-body{padding:36px 56px}@media (max-width:768px){.modal-header,.modal-body{padding:24px}}.offcanvas{background:#fff;position:fixed;padding:24px;height:100%;top:0;left:0;z-index:300;overflow-y:scroll}.offcanvas .close{position:absolute;top:8px;right:8px}.offcanvas-left{border-right:1px solid rgba(0,0,0,.1)}.offcanvas-right{left:auto;right:0;border-left:1px solid rgba(0,0,0,.1)}.offcanvas-push-body{position:relative}.tabs{margin-bottom:24px;font-size:14px}.tabs li em,.tabs li.active a{color:#313439;border:1px solid rgba(0,0,0,.1);cursor:default;text-decoration:none;background:0 0}.tabs em,.tabs a{position:relative;top:1px;font-style:normal;display:block;padding:.5rem 1rem;border:1px solid transparent;color:rgba(0,0,0,.5);text-decoration:none}.tabs a:hover{-moz-transition:all linear .2s;transition:all linear .2s;color:#313439;text-decoration:underline;background-color:#e0e1e1}@media (min-width:768px){.tabs ul{display:flex;margin-top:-1px;border-bottom:1px solid rgba(0,0,0,.1)}.tabs li em,.tabs li.active a{border-bottom:1px solid #fff}} -------------------------------------------------------------------------------- /tests/expectations/linebreak-position.css: -------------------------------------------------------------------------------- 1 | /*! This is a comment with closing curly braces }}}}}}}}}}}}}}}}}}}}} inside */ 2 | .foo{color:blue;content:"String with closing curly braces inside }}}}"} 3 | @media{.foo{color:red} 4 | .bar{color:green} 5 | .baz{width:10px} 6 | } -------------------------------------------------------------------------------- /tests/expectations/lowercasing.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8";@import "HTTP://DOMAIN.TLD/OTHER.CSS";@namespace XHTML "HTTP://WWW.W3.ORG/1999/XHTML";@font-face{font-family:"YOUR FACE"}#MY\@SUPPORTS-DIV{border:none}@supports only screen{@keyframes test{color:blue}}@media print{background:0 0;background-position:0 0}@page{content:attr(HREF);filter:brightness(.4);width:calc(50% - 10PX)}.a\:LINK{color:blue}a:active,a:after,a:before,a:checked,a:disabled,a:default,a:empty,a:enabled,a:first-child,a:first-letter ,a:first-line ,a:first-of-type,a:focus,a:hover,a:last-child,a:last-of-type,a:link,a:only-child,a:only-of-type,a:root,a::selection,a:target,a:visited,a:lang(FR),a:not([HIDDEN]),a:nth-child(2),a:nth-last-child(2),a:nth-last-of-type(2),a:nth-of-type(2){transition-timing-function:cubic-bezier(-1.9,.3,-.2,2.1);background:url(PROTO://DOMAIN.TLD/PATH),repeating-linear-gradient(20DEG,GRAY,GREEN,20PX,#fff 40PX),-atsc-linear-gradient(LEFT,#000,#fff),-khtml-radial-gradient(CENTER 50DEG,CIRCLE CLOSEST-SIDE,#000 0,GREEN 100%),-moz-radial-gradient(CENTER 45DEG,CIRCLE CLOSEST-SIDE,ORANGE 0%,RED 100%),-ms-linear-gradient(LEFT,BLUE,#000),-o-repeating-radial-gradient(CENTER,CIRCLE CLOSEST-SIDE,#ffefd5,RED 50%,#dcdcdc),-wap-linear-gradient(LEFT,#000,#fff),-webkit-gradient(LINEAR,LEFT,from(#fff),to(rgba(1,2,3,.4)))} -------------------------------------------------------------------------------- /tests/expectations/numbers.css: -------------------------------------------------------------------------------- 1 | a{foo:.0001em;bar:0px;baz:.6px .011pt 10.2em 8.8cm;foobar:-.6px,-.333pt,-1.05em 50cm}b,.test-0\.400em{margin:.6px 3pt 1.2em .8cm;padding:.2em .8cm}c{margin:2.4px 0;padding:-.4px 0;margin:1px 0 0;padding:4px 0;padding:0;margin:0;transition-duration:0s;left:-20px;padding:0;margin:0;padding:10px 0 20px;margin:0;line-height:0;width:0;max-width:0}\;b\:0px{leading:50% -10.5% 1.004in -.45vw;trailing:5000% .5px 1.2001em .405;transition-duration:0ms;transform:rotate3d(0grad,0rad,0deg);pitch:0KHZ;pitch:0hz;padding:0;top:0;bottom:0;left:0;border-top:0 solid blue;border-width:0;column-gap:0;outline-width:0;border-radius:0;border-top-right-radius:0}body{margin:9px 9.8px 0 .9em;height:9.9;width:.5;z-index:.09;font-size:9;top:0;bottom:0}:lang(de)>p.lang\:0\.234500{height:.2em}#\:34\:0500{width:10.01%}.mg0px .lang\:0em{height:20%;padding-bottom:calc(.75rem - 1px);margin-right:calc(-.375em - 1px);transform:translateX(.3rem);transform:scale3d(.3,.3,.3)} -------------------------------------------------------------------------------- /tests/expectations/old-ie-filters.css: -------------------------------------------------------------------------------- 1 | .a{filter:progid:DXImageTransform.Microsoft.Matrix(M11=0.9914448613738104, M12=-0.13052619222005157, M21=0.13052619222005157, M22=0.9914448613738104, sizingMethod='auto expand')}.b{display:none;filter:progid:DXImageTransform.Microsoft.Matrix(M11=0.9914448613738104, M12=-0.13052619222005157, M21=0.13052619222005157, M22=0.9914448613738104, sizingMethod='auto expand');vertical-align:bottom}.shadow{-ms-filter:"progid:DXImageTransform.Microsoft.Shadow(Strength=5, Direction=0, Color='#DDDDDD')progid:DXImageTransform.Microsoft.Shadow(Strength=5, Direction=90, Color='#DDDDDD')progid:DXImageTransform.Microsoft.Shadow(Strength=5, Direction=180, Color='#DDDDDD')progid:DXImageTransform.Microsoft.Shadow(Strength=5, Direction=270, Color='#DDDDDD')"}pre{border:solid red;opacity:.8;-ms-filter:"alpha(opacity=80)";filter:alpha(opacity=80);zoom:1}code{-ms-filter:"alpha(opacity=80)";filter:alpha(opacity=80)} -------------------------------------------------------------------------------- /tests/expectations/preserve-case.css: -------------------------------------------------------------------------------- 1 | #AddAddressForm{padding:0}#AddAddressForm .messageBoxNeutral{padding:0}#FeedbackMailForm{padding:0}#FeedbackMailForm .classe{margin:0}.classes,#FeedBackMailForm{margin:0} -------------------------------------------------------------------------------- /tests/expectations/pseudo-classes.css: -------------------------------------------------------------------------------- 1 | * :hover{color:blue}p :link,#mydiv :active{width:20%} -------------------------------------------------------------------------------- /tests/expectations/pseudo-elements.css: -------------------------------------------------------------------------------- 1 | *:before,*:after{color:red}.test:before{margin:3px}p:first-letter ,p:first-line {foo:1}::selection{width:0}p:first-letter {buh:hum}p:first-line {baa:1}p:first-line ,a,p:first-letter ,b{color:red}:before,p :after{margin:0}.foo :after{color:red} -------------------------------------------------------------------------------- /tests/expectations/pure.css: -------------------------------------------------------------------------------- 1 | /*! 2 | Pure v0.6.2 3 | Copyright 2013 Yahoo! 4 | Licensed under the BSD License. 5 | https://github.com/yahoo/pure/blob/master/LICENSE.md 6 | */ 7 | /*! 8 | normalize.css v^3.0 | MIT License | git.io/normalize 9 | Copyright (c) Nicolas Gallagher and Jonathan Neal 10 | */ 11 | /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ 12 | html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}.hidden,[hidden]{display:none !important}.pure-img{max-width:100%;height:auto;display:block}.pure-g{letter-spacing:-.31em;*letter-spacing:normal;*word-spacing:-.43em;text-rendering:optimizespeed;font-family:FreeSans,Arimo,"Droid Sans",Helvetica,Arial,sans-serif;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-align-content:flex-start;-ms-flex-line-pack:start;align-content:flex-start}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){table .pure-g{display:block}}.opera-only :-o-prefocus,.pure-g{word-spacing:-.43em}.pure-u{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-g [class*=pure-u]{font-family:sans-serif}.pure-u-1,.pure-u-1-1,.pure-u-1-2,.pure-u-1-3,.pure-u-2-3,.pure-u-1-4,.pure-u-3-4,.pure-u-1-5,.pure-u-2-5,.pure-u-3-5,.pure-u-4-5,.pure-u-5-5,.pure-u-1-6,.pure-u-5-6,.pure-u-1-8,.pure-u-3-8,.pure-u-5-8,.pure-u-7-8,.pure-u-1-12,.pure-u-5-12,.pure-u-7-12,.pure-u-11-12,.pure-u-1-24,.pure-u-2-24,.pure-u-3-24,.pure-u-4-24,.pure-u-5-24,.pure-u-6-24,.pure-u-7-24,.pure-u-8-24,.pure-u-9-24,.pure-u-10-24,.pure-u-11-24,.pure-u-12-24,.pure-u-13-24,.pure-u-14-24,.pure-u-15-24,.pure-u-16-24,.pure-u-17-24,.pure-u-18-24,.pure-u-19-24,.pure-u-20-24,.pure-u-21-24,.pure-u-22-24,.pure-u-23-24,.pure-u-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-1-24{width:4.1667%;*width:4.1357%;}.pure-u-1-12,.pure-u-2-24{width:8.3333%;*width:8.3023%;}.pure-u-1-8,.pure-u-3-24{width:12.5000%;*width:12.4690%;}.pure-u-1-6,.pure-u-4-24{width:16.6667%;*width:16.6357%;}.pure-u-1-5{width:20%;*width:19.9690%;}.pure-u-5-24{width:20.8333%;*width:20.8023%;}.pure-u-1-4,.pure-u-6-24{width:25%;*width:24.9690%;}.pure-u-7-24{width:29.1667%;*width:29.1357%;}.pure-u-1-3,.pure-u-8-24{width:33.3333%;*width:33.3023%;}.pure-u-3-8,.pure-u-9-24{width:37.5000%;*width:37.4690%;}.pure-u-2-5{width:40%;*width:39.9690%;}.pure-u-5-12,.pure-u-10-24{width:41.6667%;*width:41.6357%;}.pure-u-11-24{width:45.8333%;*width:45.8023%;}.pure-u-1-2,.pure-u-12-24{width:50%;*width:49.9690%;}.pure-u-13-24{width:54.1667%;*width:54.1357%;}.pure-u-7-12,.pure-u-14-24{width:58.3333%;*width:58.3023%;}.pure-u-3-5{width:60%;*width:59.9690%;}.pure-u-5-8,.pure-u-15-24{width:62.5000%;*width:62.4690%;}.pure-u-2-3,.pure-u-16-24{width:66.6667%;*width:66.6357%;}.pure-u-17-24{width:70.8333%;*width:70.8023%;}.pure-u-3-4,.pure-u-18-24{width:75%;*width:74.9690%;}.pure-u-19-24{width:79.1667%;*width:79.1357%;}.pure-u-4-5{width:80%;*width:79.9690%;}.pure-u-5-6,.pure-u-20-24{width:83.3333%;*width:83.3023%;}.pure-u-7-8,.pure-u-21-24{width:87.5000%;*width:87.4690%;}.pure-u-11-12,.pure-u-22-24{width:91.6667%;*width:91.6357%;}.pure-u-23-24{width:95.8333%;*width:95.8023%;}.pure-u-1,.pure-u-1-1,.pure-u-5-5,.pure-u-24-24{width:100%}.pure-button{display:inline-block;zoom:1;line-height:normal;white-space:nowrap;vertical-align:middle;text-align:center;cursor:pointer;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;box-sizing:border-box}.pure-button::-moz-focus-inner{padding:0;border:0}.pure-button-group{letter-spacing:-.31em;*letter-spacing:normal;*word-spacing:-.43em;text-rendering:optimizespeed}.opera-only :-o-prefocus,.pure-button-group{word-spacing:-.43em}.pure-button-group .pure-button{letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-button{font-family:inherit;font-size:100%;padding:.5em 1em;color:#444;color:rgba(0,0,0,.8);border:1px solid #999;border:none rgba(0,0,0,0);background-color:#e6e6e6;text-decoration:none;border-radius:2px}.pure-button-hover,.pure-button:hover,.pure-button:focus{filter:alpha(opacity=90);background-image:-webkit-linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1));background-image:linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1))}.pure-button:focus{outline:0}.pure-button-active,.pure-button:active{box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 0 6px rgba(0,0,0,.2) inset;border-color:#000\9}.pure-button[disabled],.pure-button-disabled,.pure-button-disabled:hover,.pure-button-disabled:focus,.pure-button-disabled:active{border:none;background-image:none;filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none;pointer-events:none}.pure-button-hidden{display:none}.pure-button-primary,.pure-button-selected,a.pure-button-primary,a.pure-button-selected{background-color:#0078e7;color:#fff}.pure-button-group .pure-button{margin:0;border-radius:0;border-right:1px solid #111;border-right:1px solid rgba(0,0,0,.2)}.pure-button-group .pure-button:first-child{border-top-left-radius:2px;border-bottom-left-radius:2px}.pure-button-group .pure-button:last-child{border-top-right-radius:2px;border-bottom-right-radius:2px;border-right:none}.pure-form input[type=text],.pure-form input[type=password],.pure-form input[type=email],.pure-form input[type=url],.pure-form input[type=date],.pure-form input[type=month],.pure-form input[type=time],.pure-form input[type=datetime],.pure-form input[type=datetime-local],.pure-form input[type=week],.pure-form input[type=number],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=color],.pure-form select,.pure-form textarea{padding:.5em .6em;display:inline-block;border:1px solid #ccc;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;vertical-align:middle;box-sizing:border-box}.pure-form input:not([type]){padding:.5em .6em;display:inline-block;border:1px solid #ccc;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;box-sizing:border-box}.pure-form input[type=color]{padding:.2em .5em}.pure-form input[type=text]:focus,.pure-form input[type=password]:focus,.pure-form input[type=email]:focus,.pure-form input[type=url]:focus,.pure-form input[type=date]:focus,.pure-form input[type=month]:focus,.pure-form input[type=time]:focus,.pure-form input[type=datetime]:focus,.pure-form input[type=datetime-local]:focus,.pure-form input[type=week]:focus,.pure-form input[type=number]:focus,.pure-form input[type=search]:focus,.pure-form input[type=tel]:focus,.pure-form input[type=color]:focus,.pure-form select:focus,.pure-form textarea:focus{outline:0;border-color:#129fea}.pure-form input:not([type]):focus{outline:0;border-color:#129fea}.pure-form input[type=file]:focus,.pure-form input[type=radio]:focus,.pure-form input[type=checkbox]:focus{outline:thin solid #129fea;outline:1px auto #129fea}.pure-form .pure-checkbox,.pure-form .pure-radio{margin:.5em 0;display:block}.pure-form input[type=text][disabled],.pure-form input[type=password][disabled],.pure-form input[type=email][disabled],.pure-form input[type=url][disabled],.pure-form input[type=date][disabled],.pure-form input[type=month][disabled],.pure-form input[type=time][disabled],.pure-form input[type=datetime][disabled],.pure-form input[type=datetime-local][disabled],.pure-form input[type=week][disabled],.pure-form input[type=number][disabled],.pure-form input[type=search][disabled],.pure-form input[type=tel][disabled],.pure-form input[type=color][disabled],.pure-form select[disabled],.pure-form textarea[disabled]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3}.pure-form input:not([type])[disabled]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3}.pure-form input[readonly],.pure-form select[readonly],.pure-form textarea[readonly]{background-color:#eee;color:#777;border-color:#ccc}.pure-form input:focus:invalid,.pure-form textarea:focus:invalid,.pure-form select:focus:invalid{color:#b94a48;border-color:#e9322d}.pure-form input[type=file]:focus:invalid:focus,.pure-form input[type=radio]:focus:invalid:focus,.pure-form input[type=checkbox]:focus:invalid:focus{outline-color:#e9322d}.pure-form select{height:2.25em;border:1px solid #ccc;background-color:#fff}.pure-form select[multiple]{height:auto}.pure-form label{margin:.5em 0 .2em}.pure-form fieldset{margin:0;padding:.35em 0 .75em;border:0}.pure-form legend{display:block;width:100%;padding:.3em 0;margin-bottom:.3em;color:#333;border-bottom:1px solid #e5e5e5}.pure-form-stacked input[type=text],.pure-form-stacked input[type=password],.pure-form-stacked input[type=email],.pure-form-stacked input[type=url],.pure-form-stacked input[type=date],.pure-form-stacked input[type=month],.pure-form-stacked input[type=time],.pure-form-stacked input[type=datetime],.pure-form-stacked input[type=datetime-local],.pure-form-stacked input[type=week],.pure-form-stacked input[type=number],.pure-form-stacked input[type=search],.pure-form-stacked input[type=tel],.pure-form-stacked input[type=color],.pure-form-stacked input[type=file],.pure-form-stacked select,.pure-form-stacked label,.pure-form-stacked textarea{display:block;margin:.25em 0}.pure-form-stacked input:not([type]){display:block;margin:.25em 0}.pure-form-aligned input,.pure-form-aligned textarea,.pure-form-aligned select,.pure-form-aligned .pure-help-inline,.pure-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.pure-form-aligned textarea{vertical-align:top}.pure-form-aligned .pure-control-group{margin-bottom:.5em}.pure-form-aligned .pure-control-group label{text-align:right;display:inline-block;vertical-align:middle;width:10em;margin:0 1em 0 0}.pure-form-aligned .pure-controls{margin:1.5em 0 0 11em}.pure-form input.pure-input-rounded,.pure-form .pure-input-rounded{border-radius:2em;padding:.5em 1em}.pure-form .pure-group fieldset{margin-bottom:10px}.pure-form .pure-group input,.pure-form .pure-group textarea{display:block;padding:10px;margin:0 0 -1px;border-radius:0;position:relative;top:-1px}.pure-form .pure-group input:focus,.pure-form .pure-group textarea:focus{z-index:3}.pure-form .pure-group input:first-child,.pure-form .pure-group textarea:first-child{top:1px;border-radius:4px 4px 0 0;margin:0}.pure-form .pure-group input:first-child:last-child,.pure-form .pure-group textarea:first-child:last-child{top:1px;border-radius:4px;margin:0}.pure-form .pure-group input:last-child,.pure-form .pure-group textarea:last-child{top:-2px;border-radius:0 0 4px 4px;margin:0}.pure-form .pure-group button{margin:.35em 0}.pure-form .pure-input-1{width:100%}.pure-form .pure-input-3-4{width:75%}.pure-form .pure-input-2-3{width:66%}.pure-form .pure-input-1-2{width:50%}.pure-form .pure-input-1-3{width:33%}.pure-form .pure-input-1-4{width:25%}.pure-form .pure-help-inline,.pure-form-message-inline{display:inline-block;padding-left:.3em;color:#666;vertical-align:middle;font-size:.875em}.pure-form-message{display:block;color:#666;font-size:.875em}@media only screen and (max-width :480px){.pure-form button[type=submit]{margin:.7em 0 0}.pure-form input:not([type]),.pure-form input[type=text],.pure-form input[type=password],.pure-form input[type=email],.pure-form input[type=url],.pure-form input[type=date],.pure-form input[type=month],.pure-form input[type=time],.pure-form input[type=datetime],.pure-form input[type=datetime-local],.pure-form input[type=week],.pure-form input[type=number],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=color],.pure-form label{margin-bottom:.3em;display:block}.pure-group input:not([type]),.pure-group input[type=text],.pure-group input[type=password],.pure-group input[type=email],.pure-group input[type=url],.pure-group input[type=date],.pure-group input[type=month],.pure-group input[type=time],.pure-group input[type=datetime],.pure-group input[type=datetime-local],.pure-group input[type=week],.pure-group input[type=number],.pure-group input[type=search],.pure-group input[type=tel],.pure-group input[type=color]{margin-bottom:0}.pure-form-aligned .pure-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.pure-form-aligned .pure-controls{margin:1.5em 0 0}.pure-form .pure-help-inline,.pure-form-message-inline,.pure-form-message{display:block;font-size:.75em;padding:.2em 0 .8em}}.pure-menu{box-sizing:border-box}.pure-menu-fixed{position:fixed;left:0;top:0;z-index:3}.pure-menu-list,.pure-menu-item{position:relative}.pure-menu-list{list-style:none;margin:0;padding:0}.pure-menu-item{padding:0;margin:0;height:100%}.pure-menu-link,.pure-menu-heading{display:block;text-decoration:none;white-space:nowrap}.pure-menu-horizontal{width:100%;white-space:nowrap}.pure-menu-horizontal .pure-menu-list{display:inline-block}.pure-menu-horizontal .pure-menu-item,.pure-menu-horizontal .pure-menu-heading,.pure-menu-horizontal .pure-menu-separator{display:inline-block;*display:inline;zoom:1;vertical-align:middle}.pure-menu-item .pure-menu-item{display:block}.pure-menu-children{display:none;position:absolute;left:100%;top:0;margin:0;padding:0;z-index:3}.pure-menu-horizontal .pure-menu-children{left:0;top:auto;width:inherit}.pure-menu-allow-hover:hover>.pure-menu-children,.pure-menu-active>.pure-menu-children{display:block;position:absolute}.pure-menu-has-children>.pure-menu-link:after{padding-left:.5em;content:"\25B8";font-size:small}.pure-menu-horizontal .pure-menu-has-children>.pure-menu-link:after{content:"\25BE"}.pure-menu-scrollable{overflow-y:scroll;overflow-x:hidden}.pure-menu-scrollable .pure-menu-list{display:block}.pure-menu-horizontal.pure-menu-scrollable .pure-menu-list{display:inline-block}.pure-menu-horizontal.pure-menu-scrollable{white-space:nowrap;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;padding:.5em 0}.pure-menu-horizontal.pure-menu-scrollable::-webkit-scrollbar{display:none}.pure-menu-separator,.pure-menu-horizontal .pure-menu-children .pure-menu-separator{background-color:#ccc;height:1px;margin:.3em 0}.pure-menu-horizontal .pure-menu-separator{width:1px;height:1.3em;margin:0 .3em}.pure-menu-horizontal .pure-menu-children .pure-menu-separator{display:block;width:auto}.pure-menu-heading{text-transform:uppercase;color:#565d64}.pure-menu-link{color:#777}.pure-menu-children{background-color:#fff}.pure-menu-link,.pure-menu-disabled,.pure-menu-heading{padding:.5em 1em}.pure-menu-disabled{opacity:.5}.pure-menu-disabled .pure-menu-link:hover{background-color:transparent}.pure-menu-active>.pure-menu-link,.pure-menu-link:hover,.pure-menu-link:focus{background-color:#eee}.pure-menu-selected .pure-menu-link,.pure-menu-selected .pure-menu-link:visited{color:#000}.pure-table{border-collapse:collapse;border-spacing:0;empty-cells:show;border:1px solid #cbcbcb}.pure-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.pure-table td,.pure-table th{border-left:1px solid #cbcbcb;border-width:0 0 0 1px;font-size:inherit;margin:0;overflow:visible;padding:.5em 1em}.pure-table td:first-child,.pure-table th:first-child{border-left-width:0}.pure-table thead{background-color:#e0e0e0;color:#000;text-align:left;vertical-align:bottom}.pure-table td{background-color:transparent}.pure-table-odd td{background-color:#f2f2f2}.pure-table-striped tr:nth-child(2n-1) td{background-color:#f2f2f2}.pure-table-bordered td{border-bottom:1px solid #cbcbcb}.pure-table-bordered tbody>tr:last-child>td{border-bottom-width:0}.pure-table-horizontal td,.pure-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #cbcbcb}.pure-table-horizontal tbody>tr:last-child>td{border-bottom-width:0} -------------------------------------------------------------------------------- /tests/expectations/semicolons.css: -------------------------------------------------------------------------------- 1 | .testA{width:2px;color:blue} -------------------------------------------------------------------------------- /tests/expectations/shortenable-properties.css: -------------------------------------------------------------------------------- 1 | a{margin:4px;padding:4px;border-radius:4px;border-width:4px !important;border-style:dashed;border-style:dashed}b{margin:4px -.2em;border-width:2px 0;border-style:dashed solid}c{border-radius:1em 2px 3% !important;border-style:dashed dotted solid}d{margin:4px 4px 4px 4pc;padding:23rem 1.2em 23em 1.2rem;border-width:calc(1px + 2px) 3.44em calc(1px + 2px) 3.44em}e{border-color:#fff;border-color:#fff;border-color:#fff;border-color:#fff #000;border-color:#fff red #000} -------------------------------------------------------------------------------- /tests/expectations/sourcemap-comment-preserve.css: -------------------------------------------------------------------------------- 1 | a{color:#0a0a0a} 2 | /*# sourceMappingURL=styles.css.map */ -------------------------------------------------------------------------------- /tests/expectations/sourcemap-comment-remove.css: -------------------------------------------------------------------------------- 1 | a{color:#0a0a0a} -------------------------------------------------------------------------------- /tests/expectations/star-underscore-hacks.css: -------------------------------------------------------------------------------- 1 | #elementarr{width:1px;*width:3pt;_width:2em}button,input{line-height:normal;*overflow:visible;} -------------------------------------------------------------------------------- /tests/expectations/strings.css: -------------------------------------------------------------------------------- 1 | #elem{width:100px;voice-family:"\"}\"";voice-family:inherit;width:200px}html>body #elem{width:200px}#sel-o{content:"on\"ce upon \ 2 | a time";content:'once upon \ 3 | a ti\'me'}.sele{content:"\"keep \" me";something:'\\\' . . ';else:'empty{}';content:"/* test */"} -------------------------------------------------------------------------------- /tests/expectations/text-shadow.css: -------------------------------------------------------------------------------- 1 | a{text-shadow:0 0 0}b{text-shadow:0 0 0} -------------------------------------------------------------------------------- /tests/expectations/unit-ms.css: -------------------------------------------------------------------------------- 1 | .test\:-300ms,.test-200ms{transition:box-shadow .2s ease-out;transition-duration:10s,30s,.23s;foo:100.50ms;bar:1.5s;baz:-.35s}.foo{transition-duration:.5s;animation-delay:50ms} -------------------------------------------------------------------------------- /tests/expectations/webkit-transform-origin.css: -------------------------------------------------------------------------------- 1 | c{-webkit-transform-origin:0 0}d{-moz-transform-origin:0 0} -------------------------------------------------------------------------------- /tests/fixtures/at-rules.css: -------------------------------------------------------------------------------- 1 | /* re: 2495387 */ 2 | /* This is invalid CSS, but frequently happens as a result of concatenation. */ 3 | @CHARSET "utf-8"; 4 | @document url(http://www.w3.org/), 5 | url-prefix(http://www.w3.org/Style/), 6 | domain(mozilla.org), 7 | regexp("https:.*") 8 | { 9 | /* CSS rules here apply to: 10 | - The page "http://www.w3.org/". 11 | - Any page whose URL begins with "http://www.w3.org/Style/" 12 | - Any page whose URL's host is "mozilla.org" or ends with 13 | ".mozilla.org" 14 | - Any page whose URL starts with "https:" */ 15 | 16 | /* make the above-mentioned pages really ugly */ 17 | body { 18 | color: purple; 19 | background: yellow; 20 | } 21 | } 22 | @media ALL, BRAILLE { 23 | body { 24 | background-color: gold; 25 | } 26 | } 27 | @page :first { 28 | margin-left: 50%; 29 | margin-top: 50%; 30 | } 31 | @viewport { 32 | min-width: 640px; 33 | max-width: 800px; 34 | } 35 | @charset "utf-8"; 36 | @import url("fineprint.css") print; 37 | @import url("bluish.css") projection, tv; 38 | @namespace svg url(http://www.w3.org/2000/svg); 39 | #foo { 40 | border-width:1px; 41 | } 42 | @keyframes identifier { 43 | 0% { top: 0; left: 0; } 44 | 30% { top: 50px; } 45 | 68%, 72% { left: 50px; } 46 | 100% { top: 100px; left: 100%; } 47 | } 48 | /* nested @media blocks */ 49 | @media print { 50 | #navigation { 51 | display: none ; 52 | } 53 | @media (max-width: 12cm) { 54 | .note, a[type="{{}{}{"] { 55 | float: none 56 | } 57 | @media (min-height: 2px) { 58 | .bar { 59 | width: 10px; 60 | } 61 | .baz { 62 | 63 | } 64 | } 65 | .foo { 66 | align-content: center; 67 | } 68 | } 69 | } 70 | @supports ( box-shadow: 0 0 2px black inset ) or 71 | ( -moz-box-shadow: 0 0 2px black inset ) or 72 | ( -webkit-box-shadow: 0 0 2px black inset ) or 73 | ( -o-box-shadow: 0 0 2px black inset ) { 74 | .noticebox { 75 | -moz-box-shadow: 0 0 2px black inset; 76 | -webkit-box-shadow: 0 0 2px black inset; 77 | -o-box-shadow: 0 0 2px black inset; 78 | box-shadow: 0 0 2px black inset; /* unprefixed last */ 79 | /* override the rule above the @supports rule */ 80 | border: none; 81 | padding: 2px; 82 | } 83 | } 84 | 85 | @SUPPORTS NOT ( display: flex ) { 86 | body { width: 100%; height: 100%; background: white; color: black; } 87 | #navigation { width: 25%; } 88 | #article { width: 75%; } 89 | } 90 | 91 | /* 92 | Note that this is erroneous! 93 | The actual CSS file can only have a single charset. 94 | However, this is the job of the author/application. 95 | The compressor should not get involved. 96 | */ 97 | @charset "another one"; 98 | @import 'custom.css'; 99 | @IMPORT url("chrome://communicator/skin/"); 100 | @import "common.css" screen, projection; 101 | @import url('landscape.css') screen and (orientation:landscape); 102 | @namespace url(http://www.w3.org/1999/xhtml); 103 | @font-face { 104 | font-family: 'gzipper'; 105 | src: url(yanone.eot); 106 | src: local('gzipper'), 107 | url(yanone.ttf) format('truetype'); 108 | } 109 | #bar { 110 | border-width:10px; 111 | } 112 | @viewport { 113 | zoom: 0.75; 114 | min-zoom: 0.5; 115 | max-zoom: 0.9; 116 | } 117 | @viewport { 118 | orientation: landscape; 119 | } 120 | @page :left { 121 | margin: 2in 3in; 122 | } 123 | @media (min-width: 700px) and (orientation: landscape) { 124 | a{ color: red} 125 | } 126 | @supports not ((text-align-last:justify) or (-moz-text-align-last:justify) ){ 127 | p { 128 | text-align:justify; 129 | } 130 | } 131 | @media only all and (max-width:50em), only all and (max-device-width:800px), only all and (max-width:780px) { 132 | a { 133 | height: 1px; 134 | } 135 | } 136 | @media screen AND (-webkit-min-device-pixel-ratio:0) { 137 | div, p { 138 | margin: 2px 2px; 139 | } 140 | } 141 | @media 142 | only screen and (-webkit-min-device-pixel-ratio: 1.5), 143 | only SCREEN and (-o-min-device-pixel-ratio: 3/2), 144 | only screen and (min--moz-device-pixel-ratio: 1.5), 145 | only screen and (min-device-pixel-ratio: 1.5) { 146 | a{width:100px} 147 | } 148 | @media not all and (monochrome) { 149 | a{ 150 | border: none; 151 | } 152 | } 153 | 154 | @media not screen and (color), PRINT and (color) { a{ display:block } } 155 | 156 | @media (-webkit-min-device-pixel-ratio:0) { 157 | a{ 158 | border: none; 159 | } 160 | } 161 | @media HANDHELD and (grid) and (max-width: 15em) { 162 | a{ 163 | border-width: 4px 4px 4px; 164 | } 165 | } 166 | @media SCREEN and (min-aspect-ratio: 1/1) { 167 | a{ 168 | border: none; 169 | } 170 | } 171 | @media 172 | (-o-min-device-pixel-ratio:10/4), 173 | (-o-max-device-pixel-ratio: 5/4), 174 | (-o-device-pixel-ratio: 1/1), 175 | (-o-device-pixel-ratio: 1/10), 176 | (-o-device-pixel-ratio: 1.25), 177 | (device-pixel-ratio:1.5) { 178 | /* some:prop; */ 179 | /* An empty property with a fraction in query would break previously */ 180 | } 181 | 182 | .something { 183 | top: 0; 184 | } 185 | @keyframes anim { 186 | 0% { opacity: 0; } 187 | 100% { opacity: 1; } 188 | } 189 | @-o-keyframes anim{ 190 | 0% { opacity: 0; } 191 | 100% { opacity: 1; } 192 | } 193 | @keyframes test { 194 | 0% , 100% { opacity: 0; } 195 | } 196 | @keyframes test2 { 197 | 0%, 100% { opacity: 0; } 198 | } 199 | @keyframes test3 { 200 | 50% { opacity: 50 } 201 | 100%, 0% { opacity: 0; } 202 | } 203 | @-webkit-keyframes test4{ 204 | 0% { transform: rotate3d(0,0,1,30deg); } 205 | 100% { transform: rotate3d(0,0,1,10deg); } 206 | } 207 | @import url(//example.org/foo.css?a;b;c;d) screen, projection; 208 | @import url(//example.org/foo.css?a;b;c;d); 209 | @import url(//example.org/bar.css); -------------------------------------------------------------------------------- /tests/fixtures/attribute-selectors.css: -------------------------------------------------------------------------------- 1 | /* unquotable */ 2 | input[type = "button" ], span[ lang |= "en-"], div[ class ~= '-hey'] { 3 | color: white; 4 | } 5 | input[ 6 | type 7 | = 8 | "-_2test" 9 | ], 10 | input[ TYPE $= '_2tEst_'], 11 | a[alt],span[lang ^= "PT" ], 12 | a[href *="example2-test-"] { 13 | color: white 14 | } 15 | a[aria-hidden="false"], [data-toggle="buttons"] { 16 | color:blue 17 | } 18 | 19 | /* non unquotable */ 20 | input[ type = "" ], 21 | input[type="-"], input[type="--test"], 22 | input[type="-2test"], 23 | input[type="2test"], 24 | a[href ^= "http:"], 25 | a[href $='#'], 26 | img[src^="http://"] { 27 | color: black; 28 | } 29 | a[href*='a%a'], 30 | a[href *='b/b'], 31 | a[href*="asd$sdd!"] { 32 | color: black 33 | } 34 | -------------------------------------------------------------------------------- /tests/fixtures/background-position.css: -------------------------------------------------------------------------------- 1 | a {background-position: 0 0 0 0;} 2 | b {background-position: 0 0 0} 3 | c {BACKGROUND-POSITION: 0 0;} 4 | d { 5 | background-position: 0% 50%; 6 | background-position: 0% 0em; 7 | background-position: 0px 0rem; 8 | background-position: center top 0px; 9 | background-position: left 0em bottom 0px; 10 | } -------------------------------------------------------------------------------- /tests/fixtures/background.css: -------------------------------------------------------------------------------- 1 | /* 2 | background: transparent = background: none, and both can be shortened to background:0 0 3 | see: http://stackoverflow.com/questions/20784292/backgroundnone-vs-backgroundtransparent 4 | */ 5 | a { 6 | background: none; 7 | background: transparent !important; 8 | } 9 | b { 10 | background:transparent; 11 | background:none 12 | } 13 | c { 14 | background: 0 0 15 | } -------------------------------------------------------------------------------- /tests/fixtures/border.css: -------------------------------------------------------------------------------- 1 | /* 2 | Although it's tempting to compress the value "none" to "0" for border property, it's not 100% safe to do so. 3 | @See: 4 | - http://stackoverflow.com/a/2948616/1273027 5 | - http://stackoverflow.com/a/24834322/1273027 6 | 7 | */ 8 | 9 | a { 10 | border: none; 11 | border-top: none; 12 | border-right: none; 13 | border-bottom:none; 14 | border-left: none 15 | } -------------------------------------------------------------------------------- /tests/fixtures/calc.css: -------------------------------------------------------------------------------- 1 | .foo 2 | { 3 | margin-right:calc( -0.375em - 1px); 4 | width: calc(100% / 3 - 2*1em - 2 * 1px + 10 mod 2); 5 | margin: calc(1rem - 2px) CALC(1rem + 1px); 6 | } 7 | .bar 8 | { 9 | margin: calc(5 * calc( 10px + 2em ) ) calc(10 + ( 5px + 10px - (10em - 3em)) ); 10 | padding-top: calc( 5 * (2em + -1px)); 11 | } 12 | input { width: CALC(100% - (1em*1.5)); } 13 | p { 14 | font-size: -webkit-calc(20px + 1vw); 15 | font-size: -moz-calc(20px + 1vw); 16 | font-size: calc(20px + 1vw); 17 | } -------------------------------------------------------------------------------- /tests/fixtures/colors.css: -------------------------------------------------------------------------------- 1 | /* Named */ 2 | #\:white a[black=":white;"] { 3 | background-image: url(assets/images/white.png); 4 | color: white; 5 | white-space: normal; 6 | color: whitesmoke; 7 | background: white; 8 | background: border-box fuchsia; 9 | background: linear-gradient( to left top, black, #ffc0cb 60%, blueviolet); 10 | background-color: black; 11 | text-shadow: 1px 1px 2px black; 12 | text-shadow: white 2px 5px; 13 | box-shadow: 3px 3px yellow, -1em 0 0.4em fuchsia; 14 | outline: 1px solid white; 15 | outline-color: yellow; 16 | box: black white, yellow; 17 | utline-color: black white, yellow; 18 | border: 1px dotted rebeccapurple; /* Big hug to Eric Meyer */ 19 | border-color: yellowgreen; 20 | border-bottom: 3px solid lightyellow; 21 | border-right-color: ghostwhite; 22 | } 23 | 24 | /* HEX */ 25 | b { 26 | color: #fffff0; 27 | color: #f00; 28 | } 29 | .color { 30 | impressed: #FfEedD; 31 | again: #ABCDEF; 32 | andagain:#aa66cc; 33 | background-color:#aa66ccc; 34 | filter: chroma(color="#FFFFFF"); 35 | color:#1122aa 36 | } 37 | .foo, #AABBCC { 38 | background-color:#aabbcc; 39 | border-color:#Ee66aA #ABCDEF #FeAb2C; 40 | filter:chroma(color = #FFFFFF ); 41 | filter:chroma(color="#AABBCC"); 42 | filter:chroma(color='#BBDDEE'); 43 | color:#112233 44 | } 45 | #AABBCC, #ffffff, #f0f0f0, #f00 { 46 | background-color:#ffee11; 47 | filter: chroma(color = #FFFFFF ); 48 | color:#441122; 49 | foo:#00fF11 #ABC #AABbCc #123344; 50 | border-color:#aa66ccC 51 | } 52 | 53 | .foo #AABBCC { 54 | background-color:#fFEe11; 55 | color:#441122; 56 | border-color:#AbC; 57 | filter: chroma(color= #FFFFFF) 58 | } 59 | 60 | .bar, #AABBCC { 61 | background-color:#FFee11; 62 | border-color:#00fF11 #ABCDEF; 63 | filter: chroma(color=#11FFFFFF); 64 | color:#441122; 65 | } 66 | 67 | .foo, #AABBCC.foobar { 68 | background-color:#ffee11; 69 | border-color:#00fF11 #ABCDEF #AABbCc; 70 | color:#441122; 71 | } 72 | 73 | @media screen { 74 | .bar, #AABBCC { 75 | background-color:#ffEE11; 76 | color:#441122 77 | } 78 | } 79 | 80 | 81 | /* RGB */ 82 | a{ 83 | background: none repeat scroll 0 0 rgb(255, 0,0 ); 84 | alpha: rgba(1, 2, 3, 4); 85 | background-image: linear-gradient(to bottom, rgb(210,180,140)10%, rgb(255,0,0)90%); 86 | background-image: linear-gradient(to bottom, rgb(255, 0, 0) 10%, rgb(255 ,0,0) 90%); 87 | background: linear-gradient(to bottom, rgb(100%, 0%, 0%), rgb(100% ,0%,0%)); 88 | color: rgb( 90%, 80.1%, 76.4% ); 89 | color: rgb(256,-1,0); 90 | color: rgb( 101%,-1%,0%); 91 | test-overflow: rgb(1000, 500, 300); 92 | } 93 | 94 | /* RGBA */ 95 | d { 96 | alpha: rgba(1, 2, 3, 4); 97 | border-color: RGBA(1,2,3,4); /* tests uppercase RGBA() */ 98 | } 99 | 100 | /* HSL */ 101 | * { 102 | color: hsl(0, 100%, 50%); /* red */ 103 | color: hsl( 120, 100%, 50.5% ); /* #03FF03 */ 104 | color:hsl(240,13.4%,12.6%); /* #1C1C24 */ 105 | color: hsl(-120, 33%, 92% ); /* #E4E4F1 */ 106 | color:hsl( 480, -56%, 13%); /* #212121 */ 107 | } -------------------------------------------------------------------------------- /tests/fixtures/comments.css: -------------------------------------------------------------------------------- 1 | /*! test *//*! $LastChangedRevision: 81 $ $LastChangedDate: 2009-05-27 17:41:02 +0100 (Wed, 27 May 2009) $ */ 2 | /*! 3 | $Header: /temp/dirname/filename.css 3 2/02/08 3:37p JSmith $ 4 | */ 5 | /*! special */body{ } 6 | /*! special */ 7 | body { 8 | 9 | } 10 | a{ 11 | /*! this comment, although important, will be removed because it's inside a declaration block */ 12 | 13 | color:blue; 14 | /*! test */ 15 | width :5px; 16 | height : 5px /* test */ 17 | ; 18 | /* test */ 19 | margin: 0 0 0 0 20 | /* test */ 21 | } 22 | 23 | /*!************88**** 24 | Preserving comments 25 | as they are 26 | ******************** 27 | Keep the initial ! 28 | *******************/ 29 | #yo { 30 | ma: "ma"; 31 | } 32 | /*! 33 | I said 34 | pre- 35 | serve! */ 36 | 37 | a{ color:red }/*! imp*/ b{test:foo} 38 | /*! imp */ 39 | /* Some comment *\/*//* Another comment */ 40 | html >/**/ body p { 41 | color: blue; 42 | /*a comment right before the IE star hack*/*width:auto; 43 | height:2%; 44 | } 45 | 46 | /* te " st */ 47 | a{a:1} 48 | /*!"preserve" me*/ 49 | b{content: "/**/"}/* comment in string */ 50 | /* quite " quote ' \' \" */ 51 | /* ie mac comment hack will not be preserved \*/ 52 | c {c : 3} 53 | /* end hiding *//*! imp */ 54 | /* unclosed comment at EOF issue 55 | 56 | -------------------------------------------------------------------------------- /tests/fixtures/dataurl-base64-eof.css: -------------------------------------------------------------------------------- 1 | div.base64-singlequotes { 2 | width:100px; 3 | height:100px; 4 | background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QAAAAAAAD5Q7t%2FAAAACXBIWXMAAA3WAAAN1gGQb3mcAAAFrUlEQVRYw%2B2Xz28kRxXHP%2B9Vdc8vj2fG9uIkm2yUeFGEhNCKQwBpj1yRUBAnpJU4ceZP4MxfkBxy2GO45bQXuEGQohUKigQ%2BsBBE1sbYXv8Yz%2FRMd9fjUN09PV5nFZA4kZZa79W3quu9er%2FqNfy%2FPwJgZty%2Ffz%2FZ29vrpmmqhlWTgmFg1UpbfWhYhG6Yq2cFi%2FNrj9nJyWnx%2BPHjeafbMTEzPvjVB9%2B6d%2B%2FezweDwV1BfHubivkC3lZya%2F4m7Np8UZYXhweHH7733rvvC0Kyv7%2F%2F7p07d34qIjyvr63RNb4l4CbsRUrNrq6OfvfRRz%2FxDx486A%2F6g7vXhX9ZIf%2Bp4JomaToZj8d7Pk1SFRFXb1aWodq09l%2F9YZu%2FCWMVL9e%2FaVFVQVUREEG8r3VUEZ4cX%2FHL30%2B5shRtAhFq4wggNb6GrXgVa2K2jYtACIHv7Sz54TfHjWWagBOBy0Xgt%2BcjLtwQxVCpNwURQat1DdYaT7pwdwKDFA6ncHgFizJmSb3WLPDa7PMIVlb2daqZxdONUnAetEojEdBGiXXhTmAjhZ0%2B3N6AlzeEROH1TXiWGf%2BcwmkWZYnAfAkdx1pq%2BhUbT9z3IElUJlVhI4WsgCLUyggi4MQYd4VXNmCYRqXOspV7UoHbQ3hpEMeLAk5mkFYRYlWI%2BHZ6CTDwkKSQqrA7gFeHMF3C6VyYLmFZGiKCE6GrMFsaWb7yuVOh66N1FkUUpBJ3TyvFovToBl9XMbNY2bZ70BsKfW94hbyErosmXpQwy4VgkCjMizjvRRik0EtiLNwagBf465lwOqtkETEn60XT1%2BlTazrpKlR%2BKkooy3Xfb3Wj3wGWJRQhnni7B53q5FqZ4%2FUR7PYhGMxyuMwgWVqTxrYWAwZYQX78J5i8ie9txSAkoOqqQAqk3pBgKLDhlY5XVKPCi3w97YRoKSFaceCgF2hqSXRBPQAIOcXRH8hP%2F0y6%2BRpWLrEyg3SbS9tmzggzJQSLQZo4xoOE8UbCsJfQ7zi6iaIizZ5OBVfXDKPireWC%2BvAYWOBqeszl9Jg03afbH6OqGH%2FBSUrqbrFIXiHoiEDC%2FPySi2d9nnZHJE7opY7dcY%2FdcZej84zpPGfY9Uw2ErYGCf2O4mUVEzELWtqUxZKjf3zK2cURzicMRy%2BzvbuH8ylFPqXIPqNczClKY1mUZFcnSDKkv%2FUNuptbWG%2BLw%2FMh%2FzrYpKBHKV3ONOXzYxeV20z49qhs7gaMWIjqQQiBxVXB4irg05yz4u%2FMpieoJuTLjDJfUJYBzBAFUUHkhMvLvzFPuvQ2JvQ3duh0R%2FjuiDQdIn6MJdvkxTafZUPuaN6UaOo6UNtgNl9weboguwqoA5fCjEusNCzE8LJQFRuNrzpQD%2BrmZNM55%2F4A5z1J2iHtDEg6fZK0j0uHlDrh2N4i3Ptuc%2BH5tjp5HliWQmmOUAhlYe0rqUqWSEOhcZ05AvE1UdColSQJaHWlSUYgJy%2FO2fFfo%2F34piphFOZ4OrvNdL5EJZbcmE8OQzFxIJEGEgIeE1%2FhrjJLxZcOrIVpVC7TW00WmLWyAMDEs%2Bi9wVJDtG17Y21vVmNxLKqIOkQqqoq2qHORmgj9UQcza7mgFm4GmiDjO5C72DSoQ6uPVTW%2BzuFUcQ2teKd4pzhd8b6Nu6jg7vZsrb1rClEIxhu7Q37x47fIy3j%2Fi8iqqlUuEWTFN%2FOrMU3fEEuhUM8FIPDqZgcRIVhsAXxtjGDGS5M%2BP%2Fv%2Bm7yopVrRVsPabsW%2BYG1T%2Fy3KahqSg6cHRb5cTmt5ZXhxQ7nS6yZsVWOajDFbw2JSCSGEIsuyC%2F%2Fo0aPp%2Fv7%2Br9NO5%2F5gMOhJLNn%2FpQLrLfw6tkKKorCDg4NPP%2Fnkjx%2FLOz96h2enzyZvf%2BftH9za2fm6qLrnO9tGk2vY86f%2FMliWZRdPnjz5zcOHDz%2B%2B%2Fifimorzv31C9X718G%2FYrCYSNJa5LgAAACJ6VFh0U29mdHdhcmUAAHjaKy8v18vMyy5OTixI1csvSgcANtgGWBBTylwAAAAASUVORK5CYII%3D'); 5 | background-position:center center; 6 | border:1px solid #00aa00; 7 | } 8 | div.otherdataurl { 9 | background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kFBQ0WDWwqwjwAAANMSURBVEjHrdZbaFxVFAbgb2aSTG6GTi6mVIwxNxF9qFI0RQnFUqiYamutVutLa2t9EY0oPggFoYgPRR%2FaghYviA%2BiIAYvmBJKoYWiiBCigVTT1FisbUhrEtNkJpc5PuQkjGEmJqkLFmdz2Hv%2Fa%2F3rX3tvlm95oS%2FLokuZtIpbdvAs7KFtL22wjb3V1C41upy2ke1DXC2k%2FBjv1HHXDrbkEamg7lX2P8QTldQ2UtfOB8uiJsHNiB%2Fik0GmO%2BgZIxgnGA59nGCMoJPeQaYP047iBDXZEohkAYof4%2FNyKlZRdR%2F1ASZCnoOMhWkUheMz9F1laJSRZ3gEqVw1ipZQjcoBRrbT3Ez9OJLhZkHG5CD8l8Q47qXhMZp%2FYxhVFaxBLBtQejdtA%2FTtZPMIJnOknI2WSYzicTYN8OtTvICZbECxdr5Pkm6iPL0C3c%2BgkfIJgi%2F4LnP%2FudRKD3K4jf1VJGLEAiuz6VnA4AGam1h7gpNIzSFe66D3NurLKVhJNkHo07N9V9BE3XHOYmyeuirqG1l9mdHgOkDSGd8%2FGWtg9Roa56lrYdchDtRQPLlCkEywKVRScDfrurnwC2diiPTRe47iVtbnLZDxckGCkKYpPM%2FRr3kbyRhsYOtRDiQonFoBSHrBOI18rOeOPvr76YrCeUbf5fTvjOddJ0gQ1uMPku9z6hwjiEZhgOMn%2BaaUeHQJIOkMD7KMA5QQP01HP18hPbfvDTvZPETqb2YiS1BWrozM6jk9SPJJHkZZ5qFagtoaNnbyZg1FE4sUPRdlAQpwkdSjvDZAJ%2FoxNt%2Bw6NlGbQVFl5iKLKKsXCAwyFQZ8S3ciu65ho1lBJ5%2FkZk3OBGjpJWGmVCmsjTkQvA8JHCUU7s5eImevzg%2Fd7BGFhzCARIf8uVN3J5Heh1VM%2BHlko2y%2FHBxF0NJolfo38eDuJJxbf0ro%2FnMurh8hM%2FupH4tdT8zciOFsTC8SAgQoJfRxKzCuvfw0k%2F8MDx7xqUyez%2BS48ESIN7Ky6OUpfAtrxzhx03UR4m0c%2FZF7tnKW2mma4l9yuthTSIZIvxPi6EcpZW0PM0xtOzjo%2Bf4GPfv4r1qNqAUFYs9diJLBC1CIa7FZx8fUlwI22LuNv%2FfLbKMAOftH9TwRXg6%2FiCDAAAAAElFTkSuQmCC"); 10 | } -------------------------------------------------------------------------------- /tests/fixtures/dataurl-base64-linebreakindata.css: -------------------------------------------------------------------------------- 1 | .yui3-skin-night .yui3-dial-ring-vml, 2 | .yui3-skin-night .yui3-dial-center-button-vml, 3 | .yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min, 4 | .yui3-skin-night v\:oval.yui3-dial-marker-max-min, 5 | .yui3-skin-night .yui3-dial-marker-vml, 6 | .yui3-skin-night .yui3-dial-handle-vml { 7 | background: none; 8 | opacity:1; 9 | } 10 | 11 | div.base64-doublequotes { 12 | width:100px; 13 | height:100px; 14 | background-image:url( "data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kFBQ0WDWwq 15 | wjwAAANMSURBVEjHrdZbaFxVFAbgb2aSTG6GTi6mVIwxNxF9qFI0RQnFUqiYamutVutLa2t9EY0oPggFoYgPRR%2FaghYviA%2BiIAYvmBJKoYWi 16 | iBCigVTT1FisbUhrEtNkJpc5PuQkjGEmJqkLFmdz2Hv%2Fa%2F3rX3tvlm95oS%2FLokuZtIpbdvAs7KFtL22wjb3V1C41upy2ke1DXC2k%2FBjv 17 | 1HHXDrbkEamg7lX2P8QTldQ2UtfOB8uiJsHNiB%2Fik0GmO%2BgZIxgnGA59nGCMoJPeQaYP047iBDXZEohkAYof4%2FNyKlZRdR%2F1ASZCnoOM 18 | hWkUheMz9F1laJSRZ3gEqVw1ipZQjcoBRrbT3Ez9OJLhZkHG5CD8l8Q47qXhMZp%2FYxhVFaxBLBtQejdtA%2FTtZPMIJnOknI2WSYzicTYN8OtT 19 | vICZbECxdr5Pkm6iPL0C3c%2BgkfIJgi%2F4LnP%2FudRKD3K4jf1VJGLEAiuz6VnA4AGam1h7gpNIzSFe66D3NurLKVhJNkHo07N9V9BE3XHOYm 20 | yeuirqG1l9mdHgOkDSGd8%2FGWtg9Roa56lrYdchDtRQPLlCkEywKVRScDfrurnwC2diiPTRe47iVtbnLZDxckGCkKYpPM%2FRr3kbyRhsYOtRDi 21 | QonFoBSHrBOI18rOeOPvr76YrCeUbf5fTvjOddJ0gQ1uMPku9z6hwjiEZhgOMn%2BaaUeHQJIOkMD7KMA5QQP01HP18hPbfvDTvZPETqb2YiS1BW 22 | rozM6jk9SPJJHkZZ5qFagtoaNnbyZg1FE4sUPRdlAQpwkdSjvDZAJ%2FoxNt%2Bw6NlGbQVFl5iKLKKsXCAwyFQZ8S3ciu65ho1lBJ5%2FkZk3OB 23 | GjpJWGmVCmsjTkQvA8JHCUU7s5eImevzg%2Fd7BGFhzCARIf8uVN3J5Heh1VM%2BHlko2y%2FHBxF0NJolfo38eDuJJxbf0ro%2FnMurh8hM%2Fu 24 | pH4tdT8zciOFsTC8SAgQoJfRxKzCuvfw0k%2F8MDx7xqUyez%2BS48ESIN7Ky6OUpfAtrxzhx03UR4m0c%2FZF7tnKW2mma4l9yuthTSIZIvxPi6 25 | EcpZW0PM0xtOzjo%2Bf4GPfv4r1qNqAUFYs9diJLBC1CIa7FZx8fUlwI22LuNv%2FfLbKMAOftH9TwRXg6%2FiCDAAAAAElFTkSuQmCC" ); 26 | background-position:center center; 27 | border:1px solid #00aa00; 28 | } 29 | 30 | .yui-skin-sam .yui-h-slider { 31 | background: url(bg-h.gif) no-repeat 5px 0; 32 | height: 28px; 33 | width: 228px; 34 | } 35 | -------------------------------------------------------------------------------- /tests/fixtures/dataurl-base64-twourls.css: -------------------------------------------------------------------------------- 1 | .yui3-skin-night .yui3-dial-ring-vml, 2 | .yui3-skin-night .yui3-dial-center-button-vml, 3 | .yui3-skin-night .yui3-dial-marker v\:oval.yui3-dial-marker-max-min, 4 | .yui3-skin-night v\:oval.yui3-dial-marker-max-min, 5 | .yui3-skin-night .yui3-dial-marker-vml, 6 | .yui3-skin-night .yui3-dial-handle-vml { 7 | background: none; 8 | opacity:1; 9 | } 10 | 11 | div.base64-singlequotes { 12 | width:100px; 13 | height:100px; 14 | background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QAAAAAAAD5Q7t%2FAAAACXBIWXMAAA3WAAAN1gGQb3mcAAAFrUlEQVRYw%2B2Xz28kRxXHP%2B9Vdc8vj2fG9uIkm2yUeFGEhNCKQwBpj1yRUBAnpJU4ceZP4MxfkBxy2GO45bQXuEGQohUKigQ%2BsBBE1sbYXv8Yz%2FRMd9fjUN09PV5nFZA4kZZa79W3quu9er%2FqNfy%2FPwJgZty%2Ffz%2FZ29vrpmmqhlWTgmFg1UpbfWhYhG6Yq2cFi%2FNrj9nJyWnx%2BPHjeafbMTEzPvjVB9%2B6d%2B%2FezweDwV1BfHubivkC3lZya%2F4m7Np8UZYXhweHH7733rvvC0Kyv7%2F%2F7p07d34qIjyvr63RNb4l4CbsRUrNrq6OfvfRRz%2FxDx486A%2F6g7vXhX9ZIf%2Bp4JomaToZj8d7Pk1SFRFXb1aWodq09l%2F9YZu%2FCWMVL9e%2FaVFVQVUREEG8r3VUEZ4cX%2FHL30%2B5shRtAhFq4wggNb6GrXgVa2K2jYtACIHv7Sz54TfHjWWagBOBy0Xgt%2BcjLtwQxVCpNwURQat1DdYaT7pwdwKDFA6ncHgFizJmSb3WLPDa7PMIVlb2daqZxdONUnAetEojEdBGiXXhTmAjhZ0%2B3N6AlzeEROH1TXiWGf%2BcwmkWZYnAfAkdx1pq%2BhUbT9z3IElUJlVhI4WsgCLUyggi4MQYd4VXNmCYRqXOspV7UoHbQ3hpEMeLAk5mkFYRYlWI%2BHZ6CTDwkKSQqrA7gFeHMF3C6VyYLmFZGiKCE6GrMFsaWb7yuVOh66N1FkUUpBJ3TyvFovToBl9XMbNY2bZ70BsKfW94hbyErosmXpQwy4VgkCjMizjvRRik0EtiLNwagBf465lwOqtkETEn60XT1%2BlTazrpKlR%2BKkooy3Xfb3Wj3wGWJRQhnni7B53q5FqZ4%2FUR7PYhGMxyuMwgWVqTxrYWAwZYQX78J5i8ie9txSAkoOqqQAqk3pBgKLDhlY5XVKPCi3w97YRoKSFaceCgF2hqSXRBPQAIOcXRH8hP%2F0y6%2BRpWLrEyg3SbS9tmzggzJQSLQZo4xoOE8UbCsJfQ7zi6iaIizZ5OBVfXDKPireWC%2BvAYWOBqeszl9Jg03afbH6OqGH%2FBSUrqbrFIXiHoiEDC%2FPySi2d9nnZHJE7opY7dcY%2FdcZej84zpPGfY9Uw2ErYGCf2O4mUVEzELWtqUxZKjf3zK2cURzicMRy%2BzvbuH8ylFPqXIPqNczClKY1mUZFcnSDKkv%2FUNuptbWG%2BLw%2FMh%2FzrYpKBHKV3ONOXzYxeV20z49qhs7gaMWIjqQQiBxVXB4irg05yz4u%2FMpieoJuTLjDJfUJYBzBAFUUHkhMvLvzFPuvQ2JvQ3duh0R%2FjuiDQdIn6MJdvkxTafZUPuaN6UaOo6UNtgNl9weboguwqoA5fCjEusNCzE8LJQFRuNrzpQD%2BrmZNM55%2F4A5z1J2iHtDEg6fZK0j0uHlDrh2N4i3Ptuc%2BH5tjp5HliWQmmOUAhlYe0rqUqWSEOhcZ05AvE1UdColSQJaHWlSUYgJy%2FO2fFfo%2F34piphFOZ4OrvNdL5EJZbcmE8OQzFxIJEGEgIeE1%2FhrjJLxZcOrIVpVC7TW00WmLWyAMDEs%2Bi9wVJDtG17Y21vVmNxLKqIOkQqqoq2qHORmgj9UQcza7mgFm4GmiDjO5C72DSoQ6uPVTW%2BzuFUcQ2teKd4pzhd8b6Nu6jg7vZsrb1rClEIxhu7Q37x47fIy3j%2Fi8iqqlUuEWTFN%2FOrMU3fEEuhUM8FIPDqZgcRIVhsAXxtjGDGS5M%2BP%2Fv%2Bm7yopVrRVsPabsW%2BYG1T%2Fy3KahqSg6cHRb5cTmt5ZXhxQ7nS6yZsVWOajDFbw2JSCSGEIsuyC%2F%2Fo0aPp%2Fv7%2Br9NO5%2F5gMOhJLNn%2FpQLrLfw6tkKKorCDg4NPP%2Fnkjx%2FLOz96h2enzyZvf%2BftH9za2fm6qLrnO9tGk2vY86f%2FMliWZRdPnjz5zcOHDz%2B%2B%2Fifimorzv31C9X718G%2FYrCYSNJa5LgAAACJ6VFh0U29mdHdhcmUAAHjaKy8v18vMyy5OTixI1csvSgcANtgGWBBTylwAAAAASUVORK5CYII%3D'); 15 | background-position:center center; 16 | border:1px solid #00aa00; 17 | } 18 | 19 | div.otherdataurl { 20 | background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kFBQ0WDWwqwjwAAANMSURBVEjHrdZbaFxVFAbgb2aSTG6GTi6mVIwxNxF9qFI0RQnFUqiYamutVutLa2t9EY0oPggFoYgPRR%2FaghYviA%2BiIAYvmBJKoYWiiBCigVTT1FisbUhrEtNkJpc5PuQkjGEmJqkLFmdz2Hv%2Fa%2F3rX3tvlm95oS%2FLokuZtIpbdvAs7KFtL22wjb3V1C41upy2ke1DXC2k%2FBjv1HHXDrbkEamg7lX2P8QTldQ2UtfOB8uiJsHNiB%2Fik0GmO%2BgZIxgnGA59nGCMoJPeQaYP047iBDXZEohkAYof4%2FNyKlZRdR%2F1ASZCnoOMhWkUheMz9F1laJSRZ3gEqVw1ipZQjcoBRrbT3Ez9OJLhZkHG5CD8l8Q47qXhMZp%2FYxhVFaxBLBtQejdtA%2FTtZPMIJnOknI2WSYzicTYN8OtTvICZbECxdr5Pkm6iPL0C3c%2BgkfIJgi%2F4LnP%2FudRKD3K4jf1VJGLEAiuz6VnA4AGam1h7gpNIzSFe66D3NurLKVhJNkHo07N9V9BE3XHOYmyeuirqG1l9mdHgOkDSGd8%2FGWtg9Roa56lrYdchDtRQPLlCkEywKVRScDfrurnwC2diiPTRe47iVtbnLZDxckGCkKYpPM%2FRr3kbyRhsYOtRDiQonFoBSHrBOI18rOeOPvr76YrCeUbf5fTvjOddJ0gQ1uMPku9z6hwjiEZhgOMn%2BaaUeHQJIOkMD7KMA5QQP01HP18hPbfvDTvZPETqb2YiS1BWrozM6jk9SPJJHkZZ5qFagtoaNnbyZg1FE4sUPRdlAQpwkdSjvDZAJ%2FoxNt%2Bw6NlGbQVFl5iKLKKsXCAwyFQZ8S3ciu65ho1lBJ5%2FkZk3OBGjpJWGmVCmsjTkQvA8JHCUU7s5eImevzg%2Fd7BGFhzCARIf8uVN3J5Heh1VM%2BHlko2y%2FHBxF0NJolfo38eDuJJxbf0ro%2FnMurh8hM%2FupH4tdT8zciOFsTC8SAgQoJfRxKzCuvfw0k%2F8MDx7xqUyez%2BS48ESIN7Ky6OUpfAtrxzhx03UR4m0c%2FZF7tnKW2mma4l9yuthTSIZIvxPi6EcpZW0PM0xtOzjo%2Bf4GPfv4r1qNqAUFYs9diJLBC1CIa7FZx8fUlwI22LuNv%2FfLbKMAOftH9TwRXg6%2FiCDAAAAAElFTkSuQmCC"); 21 | } 22 | 23 | .yui-skin-sam .yui-h-slider { 24 | background: url(bg-h.gif) no-repeat 5px 0; 25 | height: 28px; 26 | width: 228px; 27 | } -------------------------------------------------------------------------------- /tests/fixtures/dataurl-dbquote-font.css: -------------------------------------------------------------------------------- 1 | /*csslint fontfamily: true*/ 2 | 3 | /** 4 | * Foo 5 | */ 6 | 7 | .y-ff-1 { 8 | font-family:"Foo Bar",Helvetica,Arial; 9 | text-rendering: optimizeLegibility; 10 | } 11 | 12 | .ua-op .y-ff-1 { 13 | /* Some Comment */ 14 | font-family:Helvetica,Arial; 15 | } 16 | 17 | /* 18 | Foo 19 | 20 | Bar 21 | */ 22 | 23 | @font-face { 24 | font-family: "Foo Bar"; 25 | src: url("data:font/truetype;base64,gRbIUFAIrsQNGditEWbAUKwAA") format("truetype"), 26 | url("http://yuilibrary.com/fonts/foo-bar.svg#webfontse22fewwr") format("svg"); 27 | font-weight: normal; 28 | font-style: normal; 29 | } 30 | 31 | -------------------------------------------------------------------------------- /tests/fixtures/dataurl-inline-svg.css: -------------------------------------------------------------------------------- 1 | a#mobile-menu-btn{ 2 | background: url( 'data:image/svg+xml;utf8,') 0 0 no-repeat; 3 | } 4 | a#mobile-menu-btn { 5 | background: url("data:image/svg+xml;utf8,") 0 0 no-repeat; 6 | } -------------------------------------------------------------------------------- /tests/fixtures/dataurl-nonbase64-doublequotes.css: -------------------------------------------------------------------------------- 1 | div.nonbase64-doublequotes { 2 | width:100px; 3 | height:100px; 4 | background-image:url( 5 | "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0C%00%00%00%0E%08%03%00%00%00%2Cc%0D%DE%00%00%00%A2PLTEQQQ%FA%FA%FA%FC%FC%FC%EE%EE%EE%A9%A9%A9%E9%E9%E9%0A%0A%0A%0D%0D%0D444PPP%CD%CD%CD%CC%CC%CC%F5%F5%F5UUU%D0%D0%D0'''%F9%F9%F9%A6%A6%A6%40%40%40FFF%A0%A0%A0%89%89%89%8D%8D%8D%20%20%20%14%14%14%DA%DA%DA%B6%B6%B6%02%02%02%87%87%87%81%81%81%AC%AC%AC%0E%0E%0E111%7D%7D%7D%92%92%92333%B9%B9%B9%BC%BC%BChhh)))%E1%E1%E1%03%03%03%CB%CB%CB%EB%EB%EB%FD%FD%FD%A3%A3%A3(((%04%04%04%CA%CA%CAttt%2C%2C%2C%F4%F4%F4%00%00%00%FF%FF%FF%D6%DE%02%C3%00%00%006tRNS%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%A1%8FN1%00%00%00iIDAT%08%D7E%C7E%16%02Q%10%C5%D0j%C3%DD%BDqw%5E%F6%BF5%06%D4%3Fd%94kx%BDf%DE6%FFIA%AB%C8qYj%1F%E3Xk%93%E0%C8JZ%10%90%9E%3A1%60%BBY%85%A8%AE%14%C0%5E%1A6%8E%C5w%02%60%99%C9%FA%9A%03%60%8C%EFz%8C%CE%0EnSu%3F%01%AD%B2%06%04%F0%3CT%FF%B8nk%3F%7C%01%C5z%1B%F9%26%2F%3Az%00%00%00%00IEND%AEB%60%82" 6 | ); 7 | border:1px solid #00aa00; 8 | } 9 | 10 | span.othercss { 11 | font-family:"Times New Roman"; 12 | font-weight:inherit; 13 | } 14 | -------------------------------------------------------------------------------- /tests/fixtures/dataurl-nonbase64-noquotes.css: -------------------------------------------------------------------------------- 1 | div.nonbase64-noquotes { 2 | width:100px; 3 | height:100px; 4 | background-image:url( data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0C%00%00%00%0E%08%03%00%00%00%2Cc%0D%DE%00%00%00%A2PLTEQQQ%FA%FA%FA%FC%FC%FC%EE%EE%EE%A9%A9%A9%E9%E9%E9%0A%0A%0A%0D%0D%0D444PPP%CD%CD%CD%CC%CC%CC%F5%F5%F5UUU%D0%D0%D0\'\'\'%F9%F9%F9%A6%A6%A6%40%40%40FFF%A0%A0%A0%89%89%89%8D%8D%8D%20%20%20%14%14%14%DA%DA%DA%B6%B6%B6%02%02%02%87%87%87%81%81%81%AC%AC%AC%0E%0E%0E111%7D%7D%7D%92%92%92333%B9%B9%B9%BC%BC%BChhh\)\)\)%E1%E1%E1%03%03%03%CB%CB%CB%EB%EB%EB%FD%FD%FD%A3%A3%A3\(\(\(%04%04%04%CA%CA%CAttt%2C%2C%2C%F4%F4%F4%00%00%00%FF%FF%FF%D6%DE%02%C3%00%00%006tRNS%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%A1%8FN1%00%00%00iIDAT%08%D7E%C7E%16%02Q%10%C5%D0j%C3%DD%BDqw%5E%F6%BF5%06%D4%3Fd%94kx%BDf%DE6%FFIA%AB%C8qYj%1F%E3Xk%93%E0%C8JZ%10%90%9E%3A1%60%BBY%85%A8%AE%14%C0%5E%1A6%8E%C5w%02%60%99%C9%FA%9A%03%60%8C%EFz%8C%CE%0EnSu%3F%01%AD%B2%06%04%F0%3CT%FF%B8nk%3F%7C%01%C5z%1B%F9%26%2F%3Az%00%00%00%00IEND%AEB%60%82 ); 5 | border:1px solid red; 6 | } 7 | 8 | span.othercss { 9 | font-family:"Times New Roman"; 10 | font-weight:inherit; 11 | } 12 | -------------------------------------------------------------------------------- /tests/fixtures/dataurl-nonbase64-singlequotes.css: -------------------------------------------------------------------------------- 1 | /* Some Comment */ 2 | 3 | div.nonbase64-singlequotes { 4 | width:100px; 5 | height:100px; 6 | background-image:url('data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0C%00%00%00%0E%08%03%00%00%00%2Cc%0D%DE%00%00%00%A2PLTEQQQ%FA%FA%FA%FC%FC%FC%EE%EE%EE%A9%A9%A9%E9%E9%E9%0A%0A%0A%0D%0D%0D444PPP%CD%CD%CD%CC%CC%CC%F5%F5%F5UUU%D0%D0%D0\'\'\'%F9%F9%F9%A6%A6%A6%40%40%40FFF%A0%A0%A0%89%89%89%8D%8D%8D%20%20%20%14%14%14%DA%DA%DA%B6%B6%B6%02%02%02%87%87%87%81%81%81%AC%AC%AC%0E%0E%0E111%7D%7D%7D%92%92%92333%B9%B9%B9%BC%BC%BChhh)))%E1%E1%E1%03%03%03%CB%CB%CB%EB%EB%EB%FD%FD%FD%A3%A3%A3(((%04%04%04%CA%CA%CAttt%2C%2C%2C%F4%F4%F4%00%00%00%FF%FF%FF%D6%DE%02%C3%00%00%006tRNS%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00%A1%8FN1%00%00%00iIDAT%08%D7E%C7E%16%02Q%10%C5%D0j%C3%DD%BDqw%5E%F6%BF5%06%D4%3Fd%94kx%BDf%DE6%FFIA%AB%C8qYj%1F%E3Xk%93%E0%C8JZ%10%90%9E%3A1%60%BBY%85%A8%AE%14%C0%5E%1A6%8E%C5w%02%60%99%C9%FA%9A%03%60%8C%EFz%8C%CE%0EnSu%3F%01%AD%B2%06%04%F0%3CT%FF%B8nk%3F%7C%01%C5z%1B%F9%26%2F%3Az%00%00%00%00IEND%AEB%60%82'); 7 | border:1px solid #0000aa; 8 | } 9 | 10 | /* Some Other Comment */ 11 | 12 | span.othercss { 13 | font-family:"Times New Roman"; 14 | font-weight:inherit; 15 | } 16 | -------------------------------------------------------------------------------- /tests/fixtures/dataurl-noquote-multiline-font.css: -------------------------------------------------------------------------------- 1 | /*csslint fontfamily: true*/ 2 | 3 | /** 4 | * Foo 5 | */ 6 | 7 | .y-ff-1 { 8 | font-family:"Foo Bar",Helvetica,Arial; 9 | text-rendering: optimizeLegibility; 10 | } 11 | 12 | .ua-op .y-ff-1 { 13 | /* Some Comment */ 14 | font-family:Helvetica,Arial; 15 | } 16 | 17 | /* 18 | Foo 19 | 20 | Bar 21 | */ 22 | 23 | @font-face { 24 | font-family: "Foo Bar"; 25 | src: url( 26 | data:font/truetype;base64,gRbIUFAIrsQNGditEWbAUKwAA) format("truetype"), 27 | url("http://yuilibrary.com/fonts/foo-bar.svg#webfontse22fewwr") format("svg"); 28 | font-weight: normal; 29 | font-style: normal; 30 | } 31 | 32 | -------------------------------------------------------------------------------- /tests/fixtures/dataurl-realdata-doublequotes.css: -------------------------------------------------------------------------------- 1 | .yui3-skin-sam .yui3-scrollview-scrollbar { 2 | -webkit-transform: translate3d(0, 0, 0); 3 | -moz-transform: translate(0, 0); 4 | } 5 | 6 | .yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first, 7 | .yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle, 8 | .yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last { 9 | border-radius:3px; 10 | -webkit-border-radius: 3px; 11 | -moz-border-radius: 3px; 12 | background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg=="); 13 | } 14 | 15 | .yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first, 16 | .yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last { 17 | border-bottom-right-radius:0; 18 | border-bottom-left-radius:0; 19 | 20 | -webkit-border-bottom-right-radius:0; 21 | -webkit-border-bottom-left-radius:0; 22 | 23 | -moz-border-radius-bottomright:0; 24 | -moz-border-radius-bottomleft:0; 25 | } 26 | 27 | .yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last { 28 | border-radius:0; 29 | border-bottom-right-radius:3px; 30 | border-bottom-left-radius:3px; 31 | 32 | -webkit-border-radius:0; 33 | -webkit-border-bottom-right-radius:3px; 34 | -webkit-border-bottom-left-radius:3px; 35 | -webkit-transform: translate3d(0, 0, 0); 36 | 37 | -moz-border-radius:0; 38 | -moz-border-radius-bottomright:3px; 39 | -moz-border-radius-bottomleft:3px; 40 | -moz-transform: translate(0, 0); 41 | } 42 | 43 | .yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle { 44 | border-radius:0; 45 | -webkit-border-radius: 0; 46 | -moz-border-radius: 0; 47 | 48 | -webkit-transform: translate3d(0,0,0) scaleY(1); 49 | -webkit-transform-origin-y: 0; 50 | 51 | -moz-transform: translate(0,0) scaleY(1); 52 | -moz-transform-origin: 0 0; 53 | } 54 | 55 | .yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-first, 56 | .yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last { 57 | border-top-right-radius: 0; 58 | border-bottom-left-radius: 3px; 59 | 60 | -webkit-border-top-right-radius: 0; 61 | -webkit-border-bottom-left-radius: 3px; 62 | 63 | -moz-border-radius-topright: 0; 64 | -moz-border-radius-bottomleft: 3px; 65 | } 66 | 67 | .yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last { 68 | border-bottom-left-radius: 0; 69 | border-top-right-radius: 3px; 70 | 71 | -webkit-border-bottom-left-radius: 0; 72 | -webkit-border-top-right-radius: 3px; 73 | 74 | -moz-border-radius-bottomleft: 0; 75 | -moz-border-radius-topright: 3px; 76 | } 77 | 78 | .yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle { 79 | -webkit-transform: translate3d(0,0,0) scaleX(1); 80 | -webkit-transform-origin: 0 0; 81 | 82 | -moz-transform: translate(0,0) scaleX(1); 83 | -moz-transform-origin: 0 0; 84 | } 85 | 86 | .yui3-skin-sam .yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child, 87 | .yui3-skin-sam .yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child { 88 | background-color: #aaa; 89 | background-image: none; 90 | } -------------------------------------------------------------------------------- /tests/fixtures/dataurl-realdata-noquotes.css: -------------------------------------------------------------------------------- 1 | .yui3-skin-sam .yui3-scrollview-scrollbar { 2 | -webkit-transform: translate3d(0, 0, 0); 3 | -moz-transform: translate(0, 0); 4 | } 5 | 6 | .yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first, 7 | .yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle, 8 | .yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last { 9 | border-radius:3px; 10 | -webkit-border-radius: 3px; 11 | -moz-border-radius: 3px; 12 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg==); 13 | } 14 | 15 | .yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first, 16 | .yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last { 17 | border-bottom-right-radius:0; 18 | border-bottom-left-radius:0; 19 | 20 | -webkit-border-bottom-right-radius:0; 21 | -webkit-border-bottom-left-radius:0; 22 | 23 | -moz-border-radius-bottomright:0; 24 | -moz-border-radius-bottomleft:0; 25 | } 26 | 27 | .yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last { 28 | border-radius:0; 29 | border-bottom-right-radius:3px; 30 | border-bottom-left-radius:3px; 31 | 32 | -webkit-border-radius:0; 33 | -webkit-border-bottom-right-radius:3px; 34 | -webkit-border-bottom-left-radius:3px; 35 | -webkit-transform: translate3d(0, 0, 0); 36 | 37 | -moz-border-radius:0; 38 | -moz-border-radius-bottomright:3px; 39 | -moz-border-radius-bottomleft:3px; 40 | -moz-transform: translate(0, 0); 41 | } 42 | 43 | .yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle { 44 | border-radius:0; 45 | -webkit-border-radius: 0; 46 | -moz-border-radius: 0; 47 | 48 | -webkit-transform: translate3d(0,0,0) scaleY(1); 49 | -webkit-transform-origin-y: 0; 50 | 51 | -moz-transform: translate(0,0) scaleY(1); 52 | -moz-transform-origin: 0 0; 53 | } 54 | 55 | .yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-first, 56 | .yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last { 57 | border-top-right-radius: 0; 58 | border-bottom-left-radius: 3px; 59 | 60 | -webkit-border-top-right-radius: 0; 61 | -webkit-border-bottom-left-radius: 3px; 62 | 63 | -moz-border-radius-topright: 0; 64 | -moz-border-radius-bottomleft: 3px; 65 | } 66 | 67 | .yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last { 68 | border-bottom-left-radius: 0; 69 | border-top-right-radius: 3px; 70 | 71 | -webkit-border-bottom-left-radius: 0; 72 | -webkit-border-top-right-radius: 3px; 73 | 74 | -moz-border-radius-bottomleft: 0; 75 | -moz-border-radius-topright: 3px; 76 | } 77 | 78 | .yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle { 79 | -webkit-transform: translate3d(0,0,0) scaleX(1); 80 | -webkit-transform-origin: 0 0; 81 | 82 | -moz-transform: translate(0,0) scaleX(1); 83 | -moz-transform-origin: 0 0; 84 | } 85 | 86 | .yui3-skin-sam .yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child, 87 | .yui3-skin-sam .yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child { 88 | background-color: #aaa; 89 | background-image: none; 90 | } -------------------------------------------------------------------------------- /tests/fixtures/dataurl-realdata-singlequotes.css: -------------------------------------------------------------------------------- 1 | .yui3-skin-sam .yui3-scrollview-scrollbar { 2 | -webkit-transform: translate3d(0, 0, 0); 3 | -moz-transform: translate(0, 0); 4 | } 5 | 6 | .yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first, 7 | .yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle, 8 | .yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last { 9 | border-radius:3px; 10 | -webkit-border-radius: 3px; 11 | -moz-border-radius: 3px; 12 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAABCAYAAAD9yd/wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABJJREFUeNpiZGBgSGPAAgACDAAIkABoFyloZQAAAABJRU5ErkJggg=='); 13 | } 14 | 15 | .yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-first, 16 | .yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last { 17 | border-bottom-right-radius:0; 18 | border-bottom-left-radius:0; 19 | 20 | -webkit-border-bottom-right-radius:0; 21 | -webkit-border-bottom-left-radius:0; 22 | 23 | -moz-border-radius-bottomright:0; 24 | -moz-border-radius-bottomleft:0; 25 | } 26 | 27 | .yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-last { 28 | border-radius:0; 29 | border-bottom-right-radius:3px; 30 | border-bottom-left-radius:3px; 31 | 32 | -webkit-border-radius:0; 33 | -webkit-border-bottom-right-radius:3px; 34 | -webkit-border-bottom-left-radius:3px; 35 | -webkit-transform: translate3d(0, 0, 0); 36 | 37 | -moz-border-radius:0; 38 | -moz-border-radius-bottomright:3px; 39 | -moz-border-radius-bottomleft:3px; 40 | -moz-transform: translate(0, 0); 41 | } 42 | 43 | .yui3-skin-sam .yui3-scrollview-scrollbar .yui3-scrollview-middle { 44 | border-radius:0; 45 | -webkit-border-radius: 0; 46 | -moz-border-radius: 0; 47 | 48 | -webkit-transform: translate3d(0,0,0) scaleY(1); 49 | -webkit-transform-origin-y: 0; 50 | 51 | -moz-transform: translate(0,0) scaleY(1); 52 | -moz-transform-origin: 0 0; 53 | } 54 | 55 | .yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-first, 56 | .yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last { 57 | border-top-right-radius: 0; 58 | border-bottom-left-radius: 3px; 59 | 60 | -webkit-border-top-right-radius: 0; 61 | -webkit-border-bottom-left-radius: 3px; 62 | 63 | -moz-border-radius-topright: 0; 64 | -moz-border-radius-bottomleft: 3px; 65 | } 66 | 67 | .yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-last { 68 | border-bottom-left-radius: 0; 69 | border-top-right-radius: 3px; 70 | 71 | -webkit-border-bottom-left-radius: 0; 72 | -webkit-border-top-right-radius: 3px; 73 | 74 | -moz-border-radius-bottomleft: 0; 75 | -moz-border-radius-topright: 3px; 76 | } 77 | 78 | .yui3-skin-sam .yui3-scrollview-scrollbar-horiz .yui3-scrollview-middle { 79 | -webkit-transform: translate3d(0,0,0) scaleX(1); 80 | -webkit-transform-origin: 0 0; 81 | 82 | -moz-transform: translate(0,0) scaleX(1); 83 | -moz-transform-origin: 0 0; 84 | } 85 | 86 | .yui3-skin-sam .yui3-scrollview-scrollbar-vert-basic .yui3-scrollview-child, 87 | .yui3-skin-sam .yui3-scrollview-scrollbar-horiz-basic .yui3-scrollview-child { 88 | background-color: #aaa; 89 | background-image: none; 90 | } -------------------------------------------------------------------------------- /tests/fixtures/dataurl-realdata-yuiapp.css: -------------------------------------------------------------------------------- 1 | html { 2 | background: #fff; 3 | color: #555; 4 | height: 100%; 5 | } 6 | 7 | #hd, #bd, #ft { 8 | padding: 0 50px; 9 | } 10 | 11 | #bd { 12 | padding-bottom: 50px; 13 | border-bottom: 1px solid #006e9c; 14 | } 15 | 16 | #ft { 17 | background: transparent no-repeat 0% 100%; 18 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADcAAAAeCAMAAAC/pnaKAAAAwFBMVEUkXIAoYYQoYYQoYYQyao02bpE6cpQ6cpREe51LgqNUiqtUiqtUiqtZj7BckrNlmrtlmrtlmrtroMB3qsp3qsp3qsp+sdCHudiHudiHudiHudiPwN+YyOaYyOaYyOaf0O2g0O6n1vOn1vOn1vOn1vOw3vu45f245f245f3B7f7K9f7K9f7K9f7X/v7X/v7p//7p//79//79//4AAABhAGMAbwBzAC4AcwB0AHIAaQBuAGcAcwABAAAAwIwmGwEAAABQQKFUAAAAQHRSTlP///////////////////////////////////////////////////////////////////8A////////////////0pfSbwAAAdtJREFUOI2NlNGqgzAMhv/ClDlQQcFdKOx4McFCKcH3f7eTtLWr07mFiUvbzz9Nk2LZGRH5937qZTiGyEx0Cr5xQpEd6xzNueCGc9SzUmAzP8cplO1zgRRutBAlM9EhZwknWj1LKXkwbOVojTqMEpKZOfeUD3OnR24VWeJf1OOBTnTgw8zZr3LyOlbdrWrdGlpG6Alz4Ni3RcT4Ldm8wHpOo9Yo5CPsdngM6D3HmLlESrgHD+YvrtEuUeLeMf7x7j23GJVgbJoHs0/cI3B7TNkfON5btsEUrvSdY694U0P9nXMp2mDsdbLmY14CN8XDjtzgo9CuqpYnGoMscDUmn08qsbOn/3Lte6rgP1eM7qQ1YMP+yPhiTmx2laDQspytgJI1MbIzZ7yHfj2/hYYtZ1xMM4dc3iTukjgJyKsrUBEH4uqFXNUh3aXxtWjbC3DpH8LRVPJ8MXLoA8fsz51ue73Q+1z7RkTEF0dWa1o5a8001C6ZbGuzh0bSTo9iS8X+C/NWbfTW5uZ9Vu4QaL20Xv3uhgyrZUXVtI2NfS3fbzgP75dNek/YbrL+k/EykecuZf6ZOzDJYsf9PCV3xhFHq7043mw+H1ylW+5Ab5jpADuPM2Z1P3POLWnUG/sHnIDsqkOjlqoAAAAASUVORK5CYII=); 19 | /* image width: 55px */ 20 | padding: 0 0 40px 0; 21 | margin: 50px; 22 | } 23 | 24 | #hd, #bd { 25 | background: #f9f9f9; 26 | } 27 | 28 | body { 29 | margin: 0; 30 | padding: 0; 31 | font: 12px "Helvetica Nueue", Arial, sans-serif; 32 | } 33 | 34 | #hd { 35 | color: #fff; 36 | padding-top: 50px; 37 | margin: 0; 38 | } 39 | 40 | #hd, h1, h2, p, .color { 41 | margin: auto; 42 | } 43 | 44 | h1, h2, a { 45 | color: #006e9c; 46 | } 47 | 48 | h1, h2 { 49 | margin-top: 0; 50 | } 51 | 52 | h4 .title { 53 | font-weight: bold; 54 | letter-spacing: -2px; 55 | font-size: 47px; 56 | text-shadow: 0 1px 0 #369; 57 | background: #006e9d; 58 | color: #fff; 59 | padding: 0 10px; 60 | } 61 | 62 | h4 { 63 | display: block; 64 | float: right; 65 | margin: 0 0 0 20px; 66 | } 67 | 68 | h4 .what { 69 | display: block; 70 | padding: 4px; 71 | text-align: center; 72 | font-weight: normal; 73 | } 74 | 75 | h4 .version { 76 | font-size: 11px; 77 | color: #ccc; 78 | } 79 | 80 | h2 { 81 | font-size: 40px; 82 | font-family: "HelveticaNeue-Light", "Helvetica Neue Light", 83 | "Helvetica Neue", sans-serif; 84 | font-weight: 300; 85 | } 86 | 87 | h4, p { 88 | padding: 6px 0 6px; 89 | } 90 | 91 | #ft p.fine, #ft p.fine a { 92 | color: #999; 93 | } 94 | 95 | #ft p.intro { 96 | font-size: 12px; 97 | } 98 | 99 | #bd { 100 | font-size: 14px; 101 | color: #666; 102 | } 103 | 104 | #ft p { 105 | font-size: 11px; 106 | } 107 | -------------------------------------------------------------------------------- /tests/fixtures/dataurl-singlequote-font.css: -------------------------------------------------------------------------------- 1 | /*csslint fontfamily: true*/ 2 | 3 | /** 4 | * Foo 5 | */ 6 | 7 | .y-ff-1 { 8 | font-family:"Foo Bar",Helvetica,Arial; 9 | text-rendering: optimizeLegibility; 10 | } 11 | 12 | .ua-op .y-ff-1 { 13 | /* Some Comment */ 14 | font-family:Helvetica,Arial; 15 | } 16 | 17 | /* 18 | Foo 19 | 20 | Bar 21 | */ 22 | 23 | @font-face { 24 | font-family: "Foo Bar"; 25 | src: URL('data:font/truetype;base64,gRbIUFAIrsQNGditEWbAUKwAA') format("truetype"), 26 | url("http://yuilibrary.com/fonts/foo-bar.svg#webfontse22fewwr") format("svg"); 27 | font-weight: normal; 28 | font-style: normal; 29 | } 30 | 31 | -------------------------------------------------------------------------------- /tests/fixtures/empty-rules.css: -------------------------------------------------------------------------------- 1 | /*! dont delete me */ 2 | .foo{ /* ha */} 3 | @import "another.css"; 4 | /* I'm empty - delete me */ 5 | empty { ;} 6 | .test{color:red} 7 | @media (-o-device-pixel-ratio: 1/10) { 8 | 9 | 10 | } 11 | a[href$="/test/"] span.test{} 12 | #foo{ } 13 | :after{ ;} 14 | @media print { 15 | /* empty */ 16 | body{ 17 | 18 | } 19 | } 20 | 21 | @media screen { 22 | /* this rule should be removed, not simply minified.*/ 23 | .breakme {} 24 | .printonly { display: none; } 25 | } 26 | 27 | @media print { 28 | /* empty */ 29 | @media (min-aspect-ratio: 1/1) { 30 | /* empty */ 31 | a { 32 | /* empty */ 33 | } 34 | } 35 | /*! imp: weird but it may happen */ 36 | b{ 37 | 38 | } 39 | } -------------------------------------------------------------------------------- /tests/fixtures/flex.css: -------------------------------------------------------------------------------- 1 | div { flex: 1 1 0% } 2 | div { flex: 1 1 0px;} -------------------------------------------------------------------------------- /tests/fixtures/font-weight.css: -------------------------------------------------------------------------------- 1 | a { font-weight: bold; font-weight: bolder} 2 | section { font-weight:normal !important } -------------------------------------------------------------------------------- /tests/fixtures/important.css: -------------------------------------------------------------------------------- 1 | /* Why do we keep a space before !important? Some agents display issues without it. See https://github.com/yui/yuicompressor/issues/37 */ 2 | a{ 3 | height: 100px !important; 4 | text-shadow: 0 0 0 ! important; 5 | width: 20% !important; 6 | } -------------------------------------------------------------------------------- /tests/fixtures/linebreak-position.css: -------------------------------------------------------------------------------- 1 | /*! This is a comment with closing curly braces }}}}}}}}}}}}}}}}}}}}} inside */ 2 | .foo { 3 | color: blue; 4 | content: "String with closing curly braces inside }}}}"; 5 | } 6 | @media { 7 | .foo { 8 | color: red; 9 | } 10 | .bar { 11 | color: green; 12 | } 13 | .baz { 14 | width: 10px; 15 | } 16 | } -------------------------------------------------------------------------------- /tests/fixtures/lowercasing.css: -------------------------------------------------------------------------------- 1 | @CHARSET "UTF-8"; 2 | 3 | @FONT-FACE { 4 | FONT-FAMILY: "YOUR FACE"; 5 | } 6 | 7 | #MY\@SUPPORTS-DIV{ 8 | border: none 9 | } 10 | 11 | @SUPPORTS only SCREEN { 12 | @KEYFRAMES test{ color:blue } 13 | } 14 | 15 | @IMPORT "HTTP://DOMAIN.TLD/OTHER.CSS"; 16 | 17 | @MEDIA PRINT { 18 | BACKGROUND: NONE; 19 | BACKGROUND-POSITION: 0 0; 20 | } 21 | 22 | @PAGE { 23 | CONTENT: ATTR(HREF); 24 | FILTER: BRIGHTNESS(0.4); 25 | WIDTH: CALC(50% - 10PX); 26 | } 27 | 28 | @NAMESPACE XHTML "HTTP://WWW.W3.ORG/1999/XHTML"; 29 | 30 | /* not pseudos */ 31 | .a\:LINK { 32 | color: blue; 33 | } 34 | 35 | /* pseudos */ 36 | a:ACTIVE, 37 | a:AFTER, 38 | a:BEFORE, 39 | a:CHECKED, 40 | a:DISABLED, 41 | a:DEFAULT, 42 | a:EMPTY, 43 | a:ENABLED, 44 | a:FIRST-CHILD, 45 | a:FIRST-LETTER, 46 | a:FIRST-LINE, 47 | a:FIRST-OF-TYPE, 48 | a:FOCUS, 49 | a:HOVER, 50 | a:LAST-CHILD, 51 | a:LAST-OF-TYPE, 52 | a:LINK, 53 | a:ONLY-CHILD, 54 | a:ONLY-OF-TYPE, 55 | a:ROOT, 56 | a::SELECTION, 57 | a:TARGET, 58 | a:VISITED, 59 | 60 | /* pseudo functions */ 61 | a:LANG(FR), 62 | a:NOT([HIDDEN]), 63 | a:NTH-CHILD(2), 64 | a:NTH-LAST-CHILD(2), 65 | a:NTH-LAST-OF-TYPE(2), 66 | a:NTH-OF-TYPE(2) { 67 | TRANSITION-TIMING-FUNCTION: CUBIC-BEZIER(-1.9, 0.3, -0.2, 2.1); 68 | BACKGROUND: URL(PROTO://DOMAIN.TLD/PATH), 69 | REPEATING-LINEAR-GRADIENT(20DEG, GRAY, GREEN, 20PX, WHITE 40PX), 70 | -ATSC-LINEAR-GRADIENT(LEFT, BLACK, WHITE), 71 | -KHTML-RADIAL-GRADIENT(CENTER 50DEG, CIRCLE CLOSEST-SIDE, BLACK 0, GREEN 100%), 72 | -MOZ-RADIAL-GRADIENT(CENTER 45DEG, CIRCLE CLOSEST-SIDE, ORANGE 0%, RED 100%), 73 | -MS-LINEAR-GRaDiEnT(LEFT, BLUE, BLACK), 74 | -O-REPEATING-RADIAL-GRADIENT(CENTER, CIRCLE CLOSEST-SIDE, PAPAYAWHIP, RED 50%, GAINSBORO), 75 | -WAP-LINEAR-GRADIENT(LEFT, BLACK, WHITE), 76 | -WEBKIT-GRADIENT(LINEAR, LEFT, FROM(WHITE), TO(RGBA(1,2,3,.4))); 77 | } 78 | -------------------------------------------------------------------------------- /tests/fixtures/numbers.css: -------------------------------------------------------------------------------- 1 | a{ 2 | foo: .0001em; 3 | bar: 000px; 4 | baz: 0.6px 0.011pt 10.2em +8.8cm; 5 | foobar:-0.6px, -0.333pt,-01.05em 050cm; 6 | } 7 | b, .test-0\.400em { 8 | margin: +0.6px +3pt +1.2em +.8cm; 9 | padding: +0.2em +0.8cm; 10 | } 11 | c{ 12 | margin: +2.4px 0px; 13 | padding: -0.4px 0px; 14 | margin: 1px 0.0em 0rem 0%; 15 | padding: 4px 0px; 16 | padding: +0000% 0.0% 0in 00.000; 17 | margin:-.0em .000pc +0px -00.0000%; 18 | transition-duration: 0s; 19 | left: -20.0px; 20 | padding: 0 0 0 0; 21 | margin: 0 0pc 0 0; 22 | padding: 10px 0px 20px 0px; 23 | margin: 0 0 0; 24 | line-height: 0px; 25 | width: 0px; 26 | max-width: 0%; 27 | } 28 | \;b\:0px{ 29 | leading: 0050% -0010.5% 001.004in -0.45vw; 30 | trailing: 5000% .500px 1.200100em 0.40500; 31 | transition-duration: 0ms; 32 | transform: rotate3d(0grad, 0rad, 0deg); 33 | pitch: 0KHZ; 34 | pitch: 35 | 0hz; /* intentionally on next line */ 36 | padding: 0 0; 37 | top: 0rem; 38 | bottom: 0vh; 39 | left: 0rem; 40 | border-top: 0em solid blue; 41 | border-width: 0px; 42 | column-gap: 0%; 43 | outline-width: 0px; 44 | border-radius: 0px 0pc 0% 0em; 45 | border-top-right-radius: 0em; 46 | } 47 | body 48 | { 49 | margin: /* leading units zeros */ 009px /* trailing fraction zeros */ 9.8000px /* zero pixels (remove units) */ 00px /* zero units */ 0.9em; 50 | height: 09.900; 51 | width: 00.500; 52 | z-index: 0.090; 53 | font-size: 09.000; 54 | top: 000.000px; 55 | bottom: 0px; 56 | } 57 | /* Numbers in selectors */ 58 | :lang(de) > p.lang\:0\.234500{height:0.20em } 59 | #\:34\:0500 {width:10.01% ;} 60 | /*issue #13*/ 61 | .mg0px .lang\:0em{ 62 | height:20%; 63 | padding-bottom:calc(0.75rem - 1px); 64 | margin-right:calc(-0.375em - 1px); 65 | transform:translateX(0.3rem); 66 | transform:scale3d(0.3, 0.3, 0.3); 67 | } -------------------------------------------------------------------------------- /tests/fixtures/old-ie-filters.css: -------------------------------------------------------------------------------- 1 | .a { 2 | filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.9914448613738104, M12=-0.13052619222005157, M21=0.13052619222005157, M22=0.9914448613738104, sizingMethod='auto expand'); 3 | } 4 | .b { 5 | display: none; 6 | filter: 7 | progid:DXImageTransform.Microsoft.Matrix(M11=0.9914448613738104, M12=-0.13052619222005157, M21=0.13052619222005157, M22=0.9914448613738104, sizingMethod='auto expand'); 8 | vertical-align: bottom; 9 | } 10 | 11 | .shadow { 12 | -ms-filter: "progid:DXImageTransform.Microsoft.Shadow(Strength=5, Direction=0, Color='#DDDDDD')progid:DXImageTransform.Microsoft.Shadow(Strength=5, Direction=90, Color='#DDDDDD')progid:DXImageTransform.Microsoft.Shadow(Strength=5, Direction=180, Color='#DDDDDD')progid:DXImageTransform.Microsoft.Shadow(Strength=5, Direction=270, Color='#DDDDDD')"; 13 | } 14 | 15 | /* example from https://developer.mozilla.org/en/CSS/opacity */ 16 | pre { /* make the box translucent (80% opaque) */ 17 | border: solid red; 18 | opacity: 0.8; /* Firefox, Safari(WebKit), Opera */ 19 | -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; /* IE 8 */ 20 | filter: PROGID:DXImageTransform.Microsoft.Alpha(Opacity=80); /* IE 4-7 */ 21 | zoom: 1; /* set "zoom", "width" or "height" to trigger "hasLayout" in IE 7 and lower */ 22 | } 23 | 24 | /** and again */ 25 | code { 26 | -ms-filter: "PROGID:DXImageTransform.Microsoft.Alpha(Opacity=80)"; /* IE 8 */ 27 | filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80); /* IE 4-7 */ 28 | } -------------------------------------------------------------------------------- /tests/fixtures/preserve-case.css: -------------------------------------------------------------------------------- 1 | #AddAddressForm { 2 | padding: 0; 3 | } 4 | #AddAddressForm .messageBoxNeutral { 5 | padding: 0; 6 | } 7 | #FeedbackMailForm{ 8 | padding: 0; 9 | } 10 | #FeedbackMailForm .classe{ 11 | margin: 0; 12 | } 13 | .classes, #FeedBackMailForm { 14 | margin: 0; 15 | } 16 | -------------------------------------------------------------------------------- /tests/fixtures/pseudo-classes.css: -------------------------------------------------------------------------------- 1 | * :hover { 2 | color: blue 3 | } 4 | p :link, #mydiv :active { 5 | width: 20%; 6 | } -------------------------------------------------------------------------------- /tests/fixtures/pseudo-elements.css: -------------------------------------------------------------------------------- 1 | 2 | *::before, *::after { 3 | color:red; 4 | } 5 | .test::before{ 6 | margin: 3px; 7 | } 8 | p::first-letter , p::first-line { 9 | foo: 1; 10 | } 11 | ::selection { 12 | width: 0 13 | } 14 | /* 15 | because of IE6 first-letter and first-line 16 | must be followed by a space 17 | http://reference.sitepoint.com/css/pseudoelement-firstletter 18 | Thanks: P.Sorokin comment at http://www.phpied.com/cssmin-js/ 19 | */ 20 | p:first-letter{ 21 | buh: hum; 22 | } 23 | p:FIRST-LINE{ 24 | baa: 1; 25 | } 26 | 27 | p:first-line,a,p:first-letter,b{ 28 | color: red; 29 | } 30 | ::before, p ::after { 31 | margin: 0px; 32 | } 33 | .foo :after { 34 | color: red; 35 | } -------------------------------------------------------------------------------- /tests/fixtures/semicolons.css: -------------------------------------------------------------------------------- 1 | .testA { 2 | width: 2px;; 3 | color: blue;; ;; 4 | } 5 | .testB{ 6 | ;;; 7 | } -------------------------------------------------------------------------------- /tests/fixtures/shortenable-properties.css: -------------------------------------------------------------------------------- 1 | a { 2 | margin: 4px 4px 4px 4px; 3 | padding: 4px 4px 4px; 4 | border-radius: 4px 4px 4px; 5 | border-width: 4px 4px !important; 6 | border-style: dashed dashed dashed dashed; 7 | border-style: dashed dashed 8 | } 9 | 10 | b { 11 | margin: +4px -.2em 4.0px -0.2em; 12 | border-width: 2px 0 2px 0px; 13 | border-style: dashed solid dashed solid; 14 | } 15 | 16 | c { 17 | border-radius: 1em 2px 3% 2px !important; 18 | border-style: dashed dotted solid dotted; 19 | } 20 | 21 | d { 22 | margin: 4px 4px 4px 4pc; 23 | padding: 23rem 1.2em 23em 1.2rem; 24 | border-width: calc(1px + 2px) 3.44em calc(1px + 2px) 3.44em; /* calc() will not match our regex so optimization won't be applied here */ 25 | } 26 | 27 | e { 28 | border-color: white #fff #FFFFFF #FFF; 29 | border-color: white #fff #FFFFFF; 30 | border-color: white #FFF; 31 | border-color: #fff black white #000000; 32 | border-color: #FFFFFF red #000 red; 33 | } -------------------------------------------------------------------------------- /tests/fixtures/sourcemap-comment.css: -------------------------------------------------------------------------------- 1 | a { 2 | color: #0a0a0a; 3 | } 4 | 5 | /*# sourceMappingURL=styles.css.map */ -------------------------------------------------------------------------------- /tests/fixtures/star-underscore-hacks.css: -------------------------------------------------------------------------------- 1 | #elementarr { 2 | width: 1px; 3 | *width: 3pt; 4 | _width: 2em; 5 | } 6 | button, input { line-height: normal; *overflow: visible; } -------------------------------------------------------------------------------- /tests/fixtures/strings.css: -------------------------------------------------------------------------------- 1 | /* Box model hack: http://tantek.com/CSS/Examples/boxmodelhack.html */ 2 | 3 | #elem { 4 | width: 100px; 5 | voice-family: "\"}\""; 6 | voice-family:inherit; 7 | width: 200px; 8 | } 9 | html>body #elem { 10 | width: 200px; 11 | } 12 | 13 | /* preserving newlines in strings */ 14 | #sel-o { 15 | content: "on\"ce upon \ 16 | a time"; 17 | content: 'once upon \ 18 | a ti\'me'; 19 | } 20 | 21 | 22 | /* preserving strings */ 23 | .sele { 24 | content: "\"keep \" me"; 25 | something: '\\\' . . '; 26 | else: 'empty{}'; 27 | content: "/* test */"; /* <---- this is not a comment, should be be kept */ 28 | } -------------------------------------------------------------------------------- /tests/fixtures/text-shadow.css: -------------------------------------------------------------------------------- 1 | a{text-shadow: 0 0 0;} 2 | b{ 3 | TEXT-SHADOW:0 0 0 4 | } -------------------------------------------------------------------------------- /tests/fixtures/unit-ms.css: -------------------------------------------------------------------------------- 1 | .test\:-300ms, 2 | .test-200ms { 3 | transition: box-shadow 200ms ease-out; 4 | transition-duration: 10s, 30s, 230MS; 5 | foo: 100.50ms; 6 | bar: +1500ms; 7 | baz: -350ms; 8 | } 9 | .foo { 10 | transition-duration: 500mS; 11 | animation-delay: 50ms; 12 | } -------------------------------------------------------------------------------- /tests/fixtures/webkit-transform-origin.css: -------------------------------------------------------------------------------- 1 | c {-webkit-transform-origin: 0 0;} 2 | d {-MOZ-TRANSFORM-ORIGIN: 0 0 } --------------------------------------------------------------------------------