├── .bundle └── config ├── .gitignore ├── Gemfile ├── Gemfile.lock ├── README.md ├── Rakefile ├── _config.yml ├── _data ├── engines.yml ├── features.yml ├── issues.yml ├── stats.yml ├── support.yml └── tests.yml ├── _includes ├── features.html ├── footer.html ├── head.html ├── header.html ├── icons.svg ├── icons │ ├── fail.html │ ├── github.html │ ├── mixed.html │ ├── okay.html │ └── twitter.html ├── intro.html ├── stats.html └── toc.html ├── _layouts └── default.html ├── _sass ├── base │ ├── _base.scss │ ├── _helpers.scss │ └── _layout.scss ├── pages │ └── _home.scss ├── partials │ ├── _buttons.scss │ ├── _features.scss │ ├── _footer.scss │ ├── _icons.scss │ ├── _stats.scss │ └── _toc.scss ├── utils │ ├── _stats.scss │ └── _variables.scss └── vendors │ ├── _normalize.scss │ └── _prism.scss ├── assets ├── js │ └── prism.js └── prism.css ├── css └── main.scss ├── index.html └── tests ├── ampersand_sassscript ├── expected_output.css └── input.scss ├── cross_media_extend ├── expected_output.css └── input.scss ├── error_directive ├── expected_output.css └── input.scss ├── reserved_function_names ├── and │ ├── expected_output.css │ └── input.scss ├── not │ ├── expected_output.css │ └── input.scss └── or │ ├── expected_output.css │ └── input.scss └── selector_manipulation_functions ├── expected_output.css └── input.scss /.bundle/config: -------------------------------------------------------------------------------- 1 | --- 2 | BUNDLE_PATH: vendor 3 | BUNDLE_DISABLE_SHARED_GEMS: '1' 4 | BUNDLE_CACHE_ALL: true 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | _site 2 | .sass-cache 3 | /node_modules 4 | /tests/**/expected_output_clean.css 5 | /tests/**/output.*.css 6 | /tests/**/support.yml 7 | /spec 8 | /sass-spec 9 | /vendor 10 | npm-debug.log 11 | .DS_Store 12 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gem 'rake' 4 | gem 'faraday' 5 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | faraday (0.9.0) 5 | multipart-post (>= 1.2, < 3) 6 | multipart-post (2.0.0) 7 | rake (10.4.2) 8 | 9 | PLATFORMS 10 | ruby 11 | 12 | DEPENDENCIES 13 | faraday 14 | rake 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Sass Compatibility 2 | ================== 3 | 4 | Sass compatibility issues between different engines. 5 | 6 | ## Building 7 | 8 | You'll need a couple things to get started. 9 | 10 | ### Docker 11 | 12 | If you don't already have a Docker environment you can download and install boot2docker ([OS X](https://github.com/boot2docker/osx-installer/releases/latest), [Windows](https://github.com/boot2docker/windows-installer/releases/latest)). 13 | 14 | ```sh 15 | boot2docker init 16 | boot2docker up 17 | ``` 18 | 19 | ### Ruby 20 | 21 | If you don't already have Ruby setup you can download the installer from the [Ruby website](https://www.ruby-lang.org/en/documentation/installation/#installers) or use brew on OS X. 22 | 23 | ### Bundler 24 | 25 | Once you have Ruby installed you need to install the `Bundler` gem, and use it to install the required gem dependencies. 26 | 27 | ```sh 28 | gem install bundler 29 | bundle install 30 | ``` 31 | 32 | ## Running 33 | 34 | Execute the test suit via bundler. 35 | 36 | ```sh 37 | bundle exec rake 38 | ``` 39 | 40 | The Rakefile will: 41 | 42 | * Clone [sass-spec](https://github.com/sass/sass-spec) and symlink 43 | `sass-spec/spec` to `spec` if needed. 44 | * Load tests from `_data/tests.yml`. 45 | * Download docker images of the Ruby Sass and Libsass executables. 46 | * Compile each test input with all supported engines, and normalize the 47 | output CSS (creating `output.#{engine}.css` files in the test 48 | directory). 49 | * Create a `expected_output_clean.css` from `expected_output.css` for 50 | each test using the same normalization rules. 51 | * Compare the output of each engine with the expected output and create 52 | a `support.yml` file in each test directory (containing the results 53 | for this test). 54 | * Aggregate the test data for every feature described in 55 | `_data/tests.yml`, in `_data/support.yml`. 56 | * Compute support stats in `_data/stats.yml`. 57 | * Create a (summarized) SCSS version of the stats in 58 | `_sass/utils/_stats.scss`. 59 | 60 | ## I/O YAML structure 61 | 62 | ### `_data/tests.yml` 63 | 64 | This file contains a list of features to test, with one or multiple 65 | tests (relative to the project root) for each feature. 66 | 67 | ```yaml 68 | call_function: spec/basic/60_call 69 | 70 | angle_conversion: 71 | - spec/libsass-clised-issues/issue_666/angle 72 | - spec/libsass-clised-issues/issue_666/length 73 | ``` 74 | 75 | A test, according to sass-spec, is a directory with `input.scss` and 76 | `expected_output.css` files. 77 | 78 | ### `_data/support.yml` 79 | 80 | All the features described in `_data/tests.yml` are present, but will 81 | now contain the test results, for each engine, with details for each 82 | individual test. 83 | 84 | If `support` is `true` for an engine, all the tests passed. If `false`, 85 | all the tests failed. If `nil`, the results were mixed. 86 | 87 | ```yaml 88 | call_function: 89 | ruby_sass_3_2: 90 | support: false 91 | tests: 92 | spec/basic/60_call: false 93 | ruby_sass_3_4: 94 | support: true 95 | tests: 96 | spec/basic/60_call: true 97 | 98 | angle_conversion: 99 | ruby_sass_3_2: 100 | support: 101 | tests: 102 | spec/libsass-closed-issues/issue_666/angle: false 103 | spec/libsass-closed-issues/issue_666/length: true 104 | ruby_sass_3_4: 105 | support: true 106 | tests: 107 | spec/libsass-closed-issues/issue_666/angle: true 108 | spec/libsass-closed-issues/issue_666/length: true 109 | ``` 110 | 111 | **Note:** I stripped some engines from the example output to keep it 112 | lightweight. 113 | 114 | ## Credits 115 | 116 | * [Chris Eppstein](https://twitter.com/chriseppstein) and [Natalie Weizenbaum](https://twitter.com/nex3) for Ruby Sass; 117 | * [Aaron Leung](https://twitter.com/akhleung) and [Hampton Catlin](https://twitter.com/hcatlin) for LibSass; 118 | * [SassMeister](https://twitter.com/sassmeisterapp) for lending their backend to run tests; 119 | * [Valérian Galliat](https://twitter.com/valeriangalliat) for the test runner; 120 | * [Michael Mifsud](https://twitter.com/xzyfer) for his help; 121 | * [Team Sass Design](https://twitter.com/teamsassdesign) for their great style guide; 122 | * [SubtlePatterns](http://subtlepatterns.com/) for the pattern in use on the site. 123 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require 'faraday' 2 | require 'json' 3 | require 'yaml' 4 | 5 | # Classes {{{ 6 | # =========== 7 | 8 | # 9 | # Global progress indicator. 10 | # 11 | class Progress 12 | 13 | # 14 | # Actual count of compiled files. 15 | # 16 | @@actual = 0 17 | 18 | # 19 | # The count of files to update. 20 | # 21 | # Get all the output tasks from the main task prerequisites, and only 22 | # keep needed ones to get the final count. 23 | # 24 | def self.count 25 | @@cached_count ||= Rake::Task[SUPPORT].prerequisites 26 | .flat_map { |p| Rake::Task[p].prerequisites.drop 1 } 27 | .map { |p| Rake::Task[p] } 28 | .find_all(&:needed?) 29 | .count 30 | end 31 | 32 | # 33 | # Increment the compiled files count. 34 | # 35 | def self.inc 36 | @@actual += 1 37 | end 38 | 39 | def self.inc_s 40 | self.inc 41 | self.to_s 42 | end 43 | 44 | # 45 | # Text progress. 46 | # 47 | def self.to_s 48 | "(#{@@actual}/#{self.count})" 49 | end 50 | end 51 | 52 | # }}} 53 | 54 | # Syntaxic sugar {{{ 55 | # ================== 56 | 57 | 58 | class String 59 | def endpoint 60 | match(/\.(.+)\.css$/).captures.first 61 | end 62 | 63 | def spec? 64 | start_with?('spec/') 65 | end 66 | 67 | def indent(n) 68 | gsub(/^/, ' ' * n) 69 | end 70 | 71 | def normalize_encoding 72 | self.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '') 73 | end 74 | 75 | def normalize_css 76 | self[/^@charset/] 77 | end 78 | 79 | def normalize_libsass_error_messages 80 | self[/^>> /] || strip[/-?\^$/] 81 | end 82 | 83 | def normalize_errors_messages 84 | (strip[/^on line/] && strip[/input\.scss$/]) || strip == 'Use --trace for backtrace.' 85 | end 86 | 87 | # 88 | # Normalize CSS. 89 | # 90 | def clean 91 | lines 92 | .map(&:normalize_encoding) 93 | .reject(&:normalize_css) 94 | .reject(&:normalize_libsass_error_messages) 95 | .reject(&:normalize_errors_messages) 96 | .join 97 | .gsub(/^Error: /, '') 98 | .gsub(/\s+/, ' ') 99 | .gsub(/ *\{/, " {\n") 100 | .gsub(/([;,]) */, "\\1\n") 101 | .gsub(/ *\} */, " }\n") 102 | .strip 103 | .chomp('.') 104 | end 105 | end 106 | 107 | # 108 | # Get YAML without header line. 109 | # 110 | class Hash 111 | def to_partial_yaml 112 | to_yaml.lines.drop(1).join 113 | end 114 | end 115 | 116 | # }}} 117 | 118 | # 119 | # Supported engines. 120 | # 121 | ENGINES = { 122 | :ruby_sass_3_2 => '3_2', 123 | :ruby_sass_3_3 => '3_3', 124 | :ruby_sass_3_4 => '3_4', 125 | :libsass_3_1 => 'libsass_3_1', 126 | :libsass_3_2 => 'libsass_3_2', 127 | :libsass_3_3 => 'libsass_3_3', 128 | } 129 | 130 | # 131 | # Supported engines. 132 | # 133 | DOCKER_ENGINES = { 134 | :ruby_sass_3_2 => 'xzyfer/docker-ruby-sass:3.2', 135 | :ruby_sass_3_3 => 'xzyfer/docker-ruby-sass:3.3', 136 | :ruby_sass_3_4 => 'xzyfer/docker-ruby-sass:3.4', 137 | :libsass_3_1 => 'xzyfer/docker-libsass:3.1.0', 138 | :libsass_3_2 => 'xzyfer/docker-libsass:3.2.5', 139 | :libsass_3_3 => 'xzyfer/docker-libsass:3.3', 140 | } 141 | 142 | # 143 | # Engine executable. 144 | # 145 | ENGINE_EXEC = { 146 | :ruby_sass_3_2 => nil, 147 | :ruby_sass_3_3 => nil, 148 | :ruby_sass_3_4 => nil, 149 | :libsass_3_1 => nil, 150 | :libsass_3_2 => nil, 151 | :libsass_3_3 => nil, 152 | } 153 | 154 | # 155 | # Init each engine. 156 | # 157 | DOCKER_ENGINES.each do |engine, release| 158 | prefix = if RUBY_PLATFORM[/darwin/] 159 | # Get Boot2Docker environment variables. 160 | `boot2docker shellinit`.split(' ').values_at(1, 3, 5).join(' ') 161 | else 162 | '' 163 | end 164 | 165 | ENGINE_EXEC[engine] = "#{prefix} docker run --interactive --tty --rm --volume #{ENV['PWD']}:#{ENV['PWD']} --workdir #{ENV['PWD']} #{release}" 166 | end 167 | 168 | # 169 | # Specification file. 170 | # 171 | SPEC = YAML.load_file('_data/tests.yml') 172 | 173 | # 174 | # Flat array of tests, unaware of the feature names. 175 | # 176 | TESTS = SPEC.flat_map { |name, tests| tests } 177 | 178 | # 179 | # Stats file (containing engine stats). 180 | # 181 | STATS = '_data/stats.yml' 182 | 183 | # 184 | # SCSS version of the engine stats. 185 | # 186 | STATS_SCSS = '_sass/utils/_stats.scss' 187 | 188 | # 189 | # Support file (containing support results). 190 | # 191 | SUPPORT = '_data/support.yml' 192 | 193 | task :default => [STATS_SCSS] 194 | 195 | # 196 | # Delete intermediate files. 197 | # 198 | task :clean do 199 | TESTS.each do |t| 200 | ['expected_output_clean.css', 'output.*.css', 'support.yml'].each do |g| 201 | Dir.glob("#{t}/#{g}").each { |f| File.delete f } 202 | end 203 | end 204 | end 205 | 206 | # 207 | # SCSS version of the stats file. 208 | # 209 | file STATS_SCSS => [STATS] do |t| 210 | File.open(t.name, 'w') do |file| 211 | file.puts '$stats: (' 212 | 213 | YAML::load_file(STATS).each do |engine, result| 214 | file.puts " '#{engine}': #{result['percentage'].round}," 215 | end 216 | 217 | file.puts ');' 218 | end 219 | end 220 | 221 | # 222 | # Compute the engine stats. 223 | # 224 | file STATS => [SUPPORT] do |t| 225 | stats = {} 226 | keys = { true => 'passed', false => 'failed' } 227 | 228 | # 229 | # Aggregate results for each engine. 230 | # 231 | YAML::load_file(SUPPORT).each do |feature, engines| 232 | engines.each do |engine, result| 233 | stats[engine] ||= { 'passed' => 0, 'failed' => 0 } 234 | 235 | result['tests'].each do |test, passed| 236 | stats[engine][keys[passed]] += 1 237 | end 238 | end 239 | end 240 | 241 | stats.each do |engine, result| 242 | result['percentage'] = (result['passed'].to_f / TESTS.count * 100).round 2 243 | end 244 | 245 | File.write t.name, stats.to_partial_yaml 246 | end 247 | 248 | # 249 | # From each individual test support file, build the aggregated YAML 250 | # file. 251 | # 252 | task SUPPORT => TESTS.map { |t| "#{t}/support.yml" } do |t| 253 | File.open(t.name, 'w') do |file| 254 | SPEC.each do |name, tests| 255 | feature = {} 256 | 257 | # 258 | # Aggregate tests. 259 | # 260 | tests.each do |test| 261 | YAML::load_file("#{test}/support.yml").each do |engine, support| 262 | feature[engine] ||= { 'support' => [], 'tests' => {} } 263 | feature[engine]['support'] << support 264 | feature[engine]['tests'][test] = support 265 | end 266 | end 267 | 268 | # 269 | # Determine `true` (all good), `false` (all fail) or `nil` (mixed) 270 | # support status. 271 | # 272 | feature.each do |_, engine| 273 | engine['support'] = engine['support'].all? || (engine['support'].include?(true) ? nil : false) 274 | end 275 | 276 | file << { name => feature }.to_partial_yaml 277 | file << "\n" 278 | end 279 | end 280 | end 281 | 282 | TESTS.each do |test| 283 | 284 | # 285 | # Ensure sass-spec prerequisite if the test needs it. 286 | # 287 | Rake::Task[SUPPORT].prerequisites.unshift 'spec' if test.spec? 288 | 289 | # 290 | # Expected output (normalized). 291 | # 292 | expected = "#{test}/expected_output_clean.css" 293 | 294 | # 295 | # Outputs for each engine. 296 | # 297 | outputs = ENGINES.map { |engine, endpoint| "#{test}/output.#{endpoint}.css" } 298 | 299 | # 300 | # Build test support file from expected file and outputs. 301 | # 302 | file "#{test}/support.yml" => [expected, *outputs] do |t| 303 | expected_output = File.read expected 304 | 305 | support = outputs.map do |source| 306 | name = ENGINES.key(source.endpoint).to_s 307 | [name, File.read(source) == expected_output] 308 | end 309 | 310 | File.write t.name, Hash[support].to_partial_yaml 311 | end 312 | 313 | # 314 | # Compile output for different engines, from an input CSS file. 315 | # 316 | DOCKER_ENGINES.each do |engine, endpoint| 317 | file "#{test}/output.#{ENGINES[engine]}.css" do |t| 318 | 319 | # 320 | # Find the input file. 321 | # 322 | input = ['', '.disabled'] 323 | .map { |s| "#{test}/input#{s}.scss" } 324 | .find { |f| File.exist? f } 325 | 326 | 327 | puts "#{Progress.inc_s} Compiling #{input} for #{engine}" 328 | 329 | result = `#{ENGINE_EXEC[engine]} #{input}` 330 | File.write t.name, result.clean 331 | end 332 | end 333 | 334 | # 335 | # Clean version of the expectation file. 336 | # 337 | file "#{test}/expected_output_clean.css" => ["#{test}/expected_output.css"] do |t| 338 | File.write t.name, File.read(t.prerequisites.first).clean 339 | end 340 | end 341 | 342 | # 343 | # Link `spec` directory. 344 | # 345 | directory 'spec' => 'sass-spec' do 346 | `ln -s sass-spec/spec .` 347 | end 348 | 349 | # 350 | # Clone sass-spec repository. 351 | # 352 | directory 'sass-spec' do 353 | `git clone --depth 1 https://github.com/sass/sass-spec.git` 354 | end 355 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | # Site settings 2 | title: Sass Compatibility 3 | email: '' 4 | description: > # this means to ignore newlines until "baseurl:" 5 | Reporting incompatibilities between different Sass engines. 6 | baseurl: "" # the subpath of your site, e.g. /blog/ 7 | url: "https://kittygiraudel.github.io/sass-compatibility/" # the base hostname & protocol for your site 8 | twitter_username: KittyGiraudel 9 | github_username: KittyGiraudel 10 | 11 | # Build settings 12 | markdown: kramdown 13 | -------------------------------------------------------------------------------- /_data/engines.yml: -------------------------------------------------------------------------------- 1 | ruby_sass_3_2: 2 | label: Ruby Sass 3.2 3 | link: https://github.com/sass/sass/releases/tag/3.2.0 4 | ruby_sass_3_3: 5 | label: Ruby Sass 3.3 6 | link: https://github.com/sass/sass/releases/tag/3.3.0 7 | ruby_sass_3_4: 8 | label: Ruby Sass 3.4 9 | link: https://github.com/sass/sass/releases/tag/3.4.0 10 | libsass_3_1: 11 | label: LibSass 3.1 12 | link: https://github.com/sass/libsass/releases/tag/3.1.0 13 | libsass_3_2: 14 | label: LibSass 3.2 15 | link: https://github.com/sass/libsass/releases/tag/3.2.5 16 | libsass_3_3: 17 | label: LibSass 3.3 18 | link: https://github.com/sass/libsass/releases/tag/3.3.1 19 | -------------------------------------------------------------------------------- /_data/features.yml: -------------------------------------------------------------------------------- 1 | - label: "`&` SassScript" 2 | name: ampersand_sassscript 3 | description: | 4 | The ability to use `&`, the reference to the current selector, in SassScript. 5 | This basically means that `&` can be manipulated, inspected and updated manually. 6 | polyfill: false 7 | 8 | 9 | 10 | 11 | 12 | - label: "Angle conversion" 13 | name: angle_conversion 14 | description: | 15 | Angles can be emitted in four different units: 16 | 17 | * Degrees: `deg` 18 | * Radians: `rad` 19 | * Gradians: `grad` 20 | * Turns: `turn` 21 | 22 | Sass should be able to auto-convert angles from one unit to another. 23 | polyfill: | 24 |
@function convert-angle($value, $unit) {
 25 |       $convertable-units: deg grad turn rad;
 26 |       $conversion-factors: 1 10grad/9deg 1turn/360deg 3.1415926rad/180deg;
 27 |       @if index($convertable-units, unit($value)) and index($convertable-units, $unit) {
 28 |         @return $value
 29 |                  / nth($conversion-factors, index($convertable-units, unit($value)))
 30 |                  * nth($conversion-factors, index($convertable-units, $unit));
 31 |       }
 32 |       @error "Cannot convert `#{unit($value)}` to `#{$unit}`.";
 33 |     }
34 | 35 | 36 | 37 | 38 | 39 | - label: "`@at-root` directive" 40 | name: at_root_directive 41 | description: | 42 | The [`@at-root`](http://sass-lang.com/documentation/file.SASS_REFERENCE.html#at-root) directive causes one or more rules to be emitted at the root of the document, rather than being nested beneath their parent selectors. 43 | polyfill: false 44 | 45 | 46 | 47 | 48 | 49 | - label: "`call` function" 50 | name: call_function 51 | description: | 52 | The `call` function makes it possible to call a function dynamically, by referencing its name. 53 | polyfill: | 54 | Unfortunately, the `call` function is not easily polyfilled. 55 | You would have to create a function with a switch case for every existing function in the global scope; 56 | Sass default functions such as `quote` or `invert`, and your own functions as well. 57 | That's a pain and kind of defeats the initial purpose. 58 | 59 | 60 | 61 | 62 | 63 | - label: "Forbid cross-media `@extend`" 64 | name: cross_media_extend 65 | description: | 66 | As of today, the `@extend` directive cannot be used across different media contexts. 67 | polyfill: | 68 | Use a mixin instead. 69 | 70 | 71 | 72 | 73 | 74 | - label: "Deep `@extend`" 75 | name: deep_extend 76 | description: | 77 | *Deep extend* names the situation where the `@extend` directive is being used from a compound selector, for instance `.a .b .c`. 78 | polyfill: false 79 | 80 | 81 | 82 | 83 | 84 | - label: "Downward `@for`" 85 | name: downward_for 86 | description: | 87 | For long, there was no way to have decrementing `@for` loops. They could only go upward. No error was thrown, but it simply did not iterate. 88 | polyfill: | 89 |
@for $i from -10 through -1 {
 90 |       $i: abs($i);
 91 |       // Do something
 92 |     }
93 | 94 | 95 | 96 | 97 | 98 | - label: "`@error` directive" 99 | name: error_directive 100 | description: | 101 | The [`@error`](http://sass-lang.com/documentation/file.SASS_REFERENCE.html#_7) directive throws the value of a SassScript expression as a fatal error, including a nice stack trace. It’s useful for validating arguments to mixins and functions. 102 | polyfill: | 103 |
@if ($condition) {
104 |       @warn $error;
105 |       @return null;
106 |     }
107 | 108 | 109 | 110 | 111 | 112 | - label: "Feature detection functions" 113 | name: feature_detection_functions 114 | description: | 115 | Feature detection functions include `feature-exists`, `variable-exists`, `global-variable-exists`, `function-exists` and `mixin-exists`. 116 | polyfill: false 117 | 118 | 119 | 120 | 121 | 122 | - label: "Fixed `if` function" 123 | name: fixed_if_function 124 | description: | 125 | The [`if`](http://sass-lang.com/documentation/Sass/Script/Functions.html#if-instance_method) function returns one of two values, depending on whether or not `$condition` is true. 126 | Just like in `@if`, all values other than `false` and `null` are considered to be `true`. 127 | 128 | There has long been a bug with this function where all arguments where evaluated, no matter the result of the condition. 129 | polyfill: | 130 | Use a conditional statement (`@if` / `@else`). 131 | 132 |
// Instead of:
133 |     // $value: if(length($list) > 2, nth($list, 3), nth($list, 1));
134 | 
135 |     $value: nth($list, 1);
136 | 
137 |     @if length($list) > 2 {
138 |       $value: nth($list, 3);
139 |     }
140 | 141 | 142 | 143 | 144 | 145 | - label: "`inspect` function" 146 | name: inspect_function 147 | description: | 148 | The [`inspect`](http://sass-lang.com/documentation/Sass/Script/Functions.html#inspect-instance_method) function returns a string containing the value as its Sass representation. 149 | It is especially useful when printing lists and maps as CSS values. 150 | polyfill: false 151 | 152 | 153 | 154 | 155 | 156 | - label: "`list-separator` function" 157 | name: list_separator_function 158 | description: | 159 | The [`list-separator`](http://sass-lang.com/documentation/Sass/Script/Functions.html#list_separator-instance_method) function returns the separator of a list. 160 | If the list doesn’t have a separator due to having fewer than two elements, returns `space`. 161 | polyfill: | 162 |
@function _list-separator($list) {
163 |       @if function-exists("list-separator") == true {
164 |         @return list-separator($list);
165 |       }
166 | 
167 |       $test-list: ();
168 |       @each $item in $list {
169 |         $test-list: append($test-list, $item, space);
170 |       }
171 | 
172 |       @return if($test-list == $list, space, comma);
173 |     }
174 | 175 | 176 | 177 | 178 | 179 | - label: "Map API" 180 | name: map_data_type 181 | description: | 182 | The Map API includes the `map` Sass data type and functions `map-get`, `map-merge`, `map-remove`, `map-keys`, `map-values`, `map-has-key` and `keywords`. 183 | polyfill: | 184 | Maps can be faked with bi-dimensional lists such as: 185 | 186 |
$map: (
187 |       a 1,
188 |       b 2,
189 |       c 3
190 |     );
191 | Then, [Sass List-Maps](https://github.com/lunelson/sass-list-maps) from Lu Nelson can be used to polyfill the whole Map API. 192 | 193 | 194 | 195 | 196 | 197 | - label: "Media queries merge" 198 | name: media_merge 199 | description: | 200 | While nested media queries are valid CSS, they are quite uncommon. 201 | Also, some browsers (Internet Explorer and Opera) do not support nested media queries. 202 | Because of this, Sass is supposed to merge compatible nested media queries into a single one. 203 | polyfill: | 204 | Don't nest media queries and merge them manually. 205 | 206 |
// Instead of:
207 |     // @media (min-width: 600px) {
208 |     //   @media (max-width: 800px) { .. }
209 |     // }
210 | 
211 |     @media (min-width: 600px) and (max-width: 800px) { .. }
212 | 
213 | 
214 | 
215 | 
216 | 
217 | - label: "Multi assignment `@each`"
218 |   name: multi_assign_each
219 |   description: |
220 |     It is possible to assign several variables at once in an `@each` loop, which turns out to be especially useful when iterating over maps.
221 |     For instance, `@each $key, $value in $map`. Learn more about [multi-assignment](http://sass-lang.com/documentation/file.SASS_REFERENCE.html#each-multi-assign).
222 |   polyfill: |
223 |     Use a regular loop.
224 | 
225 |     
@each $item in $map {
226 |       $key: nth($item, 1);
227 |       $value: nth($item, 2);
228 |       // Do something
229 |     }
230 | 231 | 232 | 233 | 234 | 235 | - label: "Multi keys `map-remove`" 236 | name: multi_keys_map_remove 237 | description: | 238 | Some engines cannot remove multiple keys of a map at once with the [`map-remove`](http://sass-lang.com/documentation/Sass/Script/Functions.html#map_remove-instance_method) function. 239 | polyfill: | 240 |
@function map-multi-remove($map, $keys...) {
241 |       @each $key in $keys {
242 |         $map: map-remove($map, $key);
243 |       }
244 |       @return $map;
245 |     }
246 | 247 | 248 | 249 | 250 | 251 | - label: "Negative indexes" 252 | name: negative_indexes 253 | description: | 254 | All list functions support negative indexes in order to start from the last item in the list rather than the first. 255 | For instance, `nth($list, -1)` returns the last item from `$list`. 256 | polyfill: | 257 | Substract indexes to the result of `length` function. 258 | 259 |
// Instead of:
260 |     // $value: nth($list, -3);
261 | 
262 |     $value: nth($list, length($list) - 2);
263 |     
264 | 265 | 266 | 267 | 268 | 269 | - label: "Nested interpolations" 270 | name: nested_interpolations 271 | description: | 272 | Interpolations (`#{..}`) can be nested. 273 | polyfill: | 274 | Not only nested interpolations are quite uncommon, but it also turns out to be easy to refactor the code so it doesn't happen. 275 | 276 | 277 | 278 | 279 | 280 | - label: "`random` function" 281 | name: random_function 282 | description: | 283 | The [`random`](http://sass-lang.com/documentation/Sass/Script/Functions.html#random-instance_method) function returns a decimal between 0 and 1, inclusive. 284 | When given an argument, it returns a decimal between 0 and the given number. 285 | polyfill: false 286 | 287 | 288 | 289 | 290 | 291 | - label: "`rebeccapurple` color" 292 | name: rebeccapurple_color 293 | description: | 294 | The `rebeccapurple` CSS color can safely be used, yet it cannot be manipulated as a color. 295 | polyfill: | 296 | Use `#663399`. You could stuff it in a variable. 297 | 298 |
$rebeccapurple: #663399;
299 | 300 | 301 | 302 | 303 | 304 | - label: "Reserved function names" 305 | name: reserved_function_names 306 | description: | 307 | Sass is supposed to throw an error if one tries to create and call functions named `or`, `not` or `and`. 308 | polyfill: | 309 | Name your functions differently. 310 | 311 | 312 | 313 | 314 | 315 | - label: "Selector manipulation functions" 316 | name: selector_manipulation_functions 317 | description: | 318 | Selector manipulation functions include `selector-nest`, `selector-append`, `selector-extend`, `selector-replace`, `selector-unify`, `is-superselector`, `simple-selectors` and `selector-parse`. 319 | polyfill: false 320 | 321 | 322 | 323 | 324 | 325 | - label: "`set-nth` function" 326 | name: set_nth_function 327 | description: | 328 | The [`set-nth`](http://sass-lang.com/documentation/Sass/Script/Functions.html#set_nth-instance_method) function returns a new list, based on the list provided, but with the nth element changed to the value given. 329 | polyfill: | 330 |
@function update-nth($list, $n, $value) {
331 |       @if function-exists("set-nth") == true {
332 |         @return set-nth($list, $n, $value);
333 |       }
334 |       $new-list: ();
335 |       @for $i from 1 through length($list) {
336 |         $new-list: append($new-list, if($i == $n, $value, nth($list, $i)));
337 |       }
338 |       @return $new-list;
339 |     }
340 | 341 | 342 | 343 | 344 | 345 | - label: "Shadow DOM styling" 346 | name: shadow_dom_styling 347 | description: | 348 | Shadow DOM selectors for Web Components allow a slightly different syntax than usual CSS selectors. 349 | polyfill: false 350 | 351 | 352 | 353 | 354 | 355 | - label: "Spaces around minus symbol" 356 | name: spaces_minus 357 | description: | 358 | Spaces around the minus symbol should not be mandatory if the value before the `-` sign is a function call. 359 | polyfill: | 360 | Wrap the minus symbol with spaces to prevent any issue and easy readibility. 361 | 362 |
.foo {
363 |       content: getter() - 1;
364 |     }
365 | 366 | 367 | 368 | 369 | 370 | - label: "String manipulation functions" 371 | name: string_manipulation_functions 372 | description: | 373 | String manipulation functions include `str-length`, `str-insert`, `str-index`, `str-slice`, `to-upper-case` and `to-lower-case`. 374 | polyfill: false 375 | 376 | 377 | 378 | 379 | 380 | - label: "`transparent` color" 381 | name: transparent_color 382 | description: | 383 | The `transparent` CSS color can safely be used, yet it cannot be manipulated as a color. 384 | polyfill: | 385 | Use `rgba(0, 0, 0, 0)`. You could stuff it in a variable. 386 | 387 |
$transparent: rgba(0, 0, 0, 0);
388 | 389 | 390 | 391 | 392 | 393 | - label: "`unique-id` function" 394 | name: unique_id_function 395 | description: | 396 | The [`unique-id`](http://sass-lang.com/documentation/Sass/Script/Functions.html#unique_id-instance_method) function returns a unique CSS identifier. 397 | The identifier is returned as an unquoted string. 398 | The identifier returned is only guaranteed to be unique within the scope of a single Sass run. 399 | polyfill: false 400 | 401 | 402 | 403 | 404 | 405 | - label: "Variable scoping" 406 | name: variable_scoping 407 | description: | 408 | Not all engines work with the same variable scoping mechanism. 409 | Actually, some don't have variable scoping at all, which means all variables live in the same global environment (and can overlap). 410 | Some engines do have the new variable scoping system, where a variable is restricted to its scope (function, mixin...) if it's not set with the `!global` flag. 411 | polyfill: | 412 | This can be **detected** with: 413 | 414 |
feature-exists("global-variable-shadowing") == true
415 | -------------------------------------------------------------------------------- /_data/issues.yml: -------------------------------------------------------------------------------- 1 | angle_conversion: 2 | ruby_sass_3_2: https://github.com/sass/sass/issues/1338 3 | ruby_sass_3_3: https://github.com/sass/sass/issues/1338 4 | 5 | at_root_directive: 6 | ruby_sass_3_2: https://github.com/sass/sass/issues/774 7 | ruby_sass_3_3: https://github.com/sass/sass-spec/pull/59#issuecomment-66930658 8 | libsass_3_1: https://github.com/sass/libsass/issues/353 9 | 10 | call_function: 11 | ruby_sass_3_2: https://github.com/sass/sass/issues/626 12 | 13 | cross_media_extend: 14 | ruby_sass_3_2: https://github.com/sass/sass/issues/640 15 | ruby_sass_3_3: https://github.com/sass/sass/issues/640 16 | libsass_3_1: https://github.com/sass/libsass/issues/712 17 | libsass_3_2: https://github.com/sass/libsass/issues/712 18 | 19 | deep_extend: 20 | libsass_3_1: https://github.com/sass/libsass/issues/592 21 | 22 | downward_for: 23 | ruby_sass_3_2: https://github.com/sass/sass/issues/691 24 | 25 | error_directive: 26 | ruby_sass_3_2: https://github.com/sass/sass/issues/747 27 | ruby_sass_3_3: https://github.com/sass/sass/issues/747 28 | 29 | feature_detection_functions: 30 | ruby_sass_3_2: https://github.com/sass/sass/issues/766 31 | 32 | fixed_if_function: 33 | ruby_sass_3_2: https://github.com/sass/sass/pull/836 34 | 35 | inspect_function: 36 | ruby_sass_3_2: https://github.com/sass/sass/issues/953 37 | 38 | list_separator_function: 39 | ruby_sass_3_2: https://github.com/sass/sass/pull/689 40 | 41 | map_data_type: 42 | ruby_sass_3_2: https://github.com/sass/sass/issues/642 43 | 44 | media_merge: 45 | libsass_3_1: https://github.com/sass/libsass/issues/185 46 | 47 | multi_assign_each: 48 | ruby_sass_3_2: https://github.com/sass/sass/issues/1262 49 | 50 | multi_keys_map_remove: 51 | ruby_sass_3_2: https://github.com/sass/sass/issues/1230 52 | ruby_sass_3_3: https://github.com/sass/sass/issues/1230 53 | 54 | negative_indexes: 55 | ruby_sass_3_2: https://github.com/sass/sass/pull/808 56 | 57 | nested_interpolations: 58 | libsass_3_1: https://github.com/sass/libsass/issues/615 59 | 60 | random_function: 61 | ruby_sass_3_2: https://github.com/sass/sass/pull/968 62 | ruby_sass_3_3: https://github.com/sass/sass/pull/968 63 | libsass_3_1: https://github.com/sass/libsass/issues/1104 64 | libsass_3_2: https://github.com/sass/libsass/issues/1104 65 | 66 | rebeccapurple_color: 67 | ruby_sass_3_2: https://github.com/sass/sass/issues/1293 68 | ruby_sass_3_3: https://github.com/sass/sass/issues/1293 69 | 70 | reserved_function_names: 71 | ruby_sass_3_2: https://github.com/sass/sass/issues/1265 72 | ruby_sass_3_3: https://github.com/sass/sass/issues/1265 73 | libsass_3_1: https://github.com/sass/libsass/issues/713 74 | 75 | set_nth_function: 76 | ruby_sass_3_2: https://github.com/sass/sass/issues/852 77 | 78 | selector_manipulation_function: 79 | libsass_3_1: https://github.com/sass/libsass/issues/963 80 | libsass_3_2: https://github.com/sass/libsass/issues/963 81 | 82 | shadow_dom_styling: 83 | libsass_3_1: https://github.com/sass/libsass/issues/452 84 | 85 | spaces_minus: 86 | libsass_3_1: https://github.com/sass/libsass/issues/733 87 | 88 | string_manipulation_functions: 89 | ruby_sass_3_2: https://github.com/sass/sass/pull/401 90 | libsass_3_1: https://github.com/sass/libsass/issues/381#issuecomment-66935725 91 | libsass_3_2: https://github.com/sass/libsass/issues/381#issuecomment-66935725 92 | 93 | transparent_color: 94 | ruby_sass_3_2: https://github.com/sass/sass/issues/754 95 | 96 | unique_id_function: 97 | ruby_sass_3_2: https://github.com/sass/sass/issues/771 98 | 99 | variable_scoping: 100 | libsass_3_1: https://github.com/sass/libsass/issues/613 101 | -------------------------------------------------------------------------------- /_data/stats.yml: -------------------------------------------------------------------------------- 1 | ruby_sass_3_2: 2 | passed: 8 3 | failed: 60 4 | percentage: 11.76 5 | ruby_sass_3_3: 6 | passed: 54 7 | failed: 14 8 | percentage: 79.41 9 | ruby_sass_3_4: 10 | passed: 68 11 | failed: 0 12 | percentage: 100.0 13 | libsass_3_1: 14 | passed: 33 15 | failed: 35 16 | percentage: 48.53 17 | libsass_3_2: 18 | passed: 67 19 | failed: 1 20 | percentage: 98.53 21 | libsass_3_3: 22 | passed: 68 23 | failed: 0 24 | percentage: 100.0 25 | -------------------------------------------------------------------------------- /_data/support.yml: -------------------------------------------------------------------------------- 1 | ampersand_sassscript: 2 | ruby_sass_3_2: 3 | support: false 4 | tests: 5 | tests/ampersand_sassscript: false 6 | ruby_sass_3_3: 7 | support: false 8 | tests: 9 | tests/ampersand_sassscript: false 10 | ruby_sass_3_4: 11 | support: true 12 | tests: 13 | tests/ampersand_sassscript: true 14 | libsass_3_1: 15 | support: false 16 | tests: 17 | tests/ampersand_sassscript: false 18 | libsass_3_2: 19 | support: true 20 | tests: 21 | tests/ampersand_sassscript: true 22 | libsass_3_3: 23 | support: true 24 | tests: 25 | tests/ampersand_sassscript: true 26 | 27 | angle_conversion: 28 | ruby_sass_3_2: 29 | support: false 30 | tests: 31 | spec/libsass-closed-issues/issue_666/angle: false 32 | ruby_sass_3_3: 33 | support: false 34 | tests: 35 | spec/libsass-closed-issues/issue_666/angle: false 36 | ruby_sass_3_4: 37 | support: true 38 | tests: 39 | spec/libsass-closed-issues/issue_666/angle: true 40 | libsass_3_1: 41 | support: true 42 | tests: 43 | spec/libsass-closed-issues/issue_666/angle: true 44 | libsass_3_2: 45 | support: true 46 | tests: 47 | spec/libsass-closed-issues/issue_666/angle: true 48 | libsass_3_3: 49 | support: true 50 | tests: 51 | spec/libsass-closed-issues/issue_666/angle: true 52 | 53 | at_root_directive: 54 | ruby_sass_3_2: 55 | support: false 56 | tests: 57 | spec/libsass/at-root/ampersand: false 58 | spec/libsass/at-root/basic: false 59 | spec/libsass/at-root/extend: false 60 | spec/libsass/at-root/keyframes: false 61 | spec/libsass/at-root/media: false 62 | spec/libsass/at-root/nested: false 63 | spec/libsass/at-root/with_without: false 64 | spec/libsass/at-root/135_test_simple_at_root: false 65 | spec/libsass/at-root/136_test_at_root_with_selector: false 66 | spec/libsass/at-root/137_test_at_root_in_mixin: false 67 | spec/libsass/at-root/138_test_at_root_in_media: false 68 | spec/libsass/at-root/139_test_at_root_in_bubbled_media: false 69 | spec/libsass/at-root/140_test_at_root_in_unknown_directive: false 70 | spec/libsass/at-root/141_test_at_root_with_parent_ref: false 71 | spec/libsass/at-root/142_test_multi_level_at_root_with_parent_ref: false 72 | spec/libsass/at-root/143_test_multi_level_at_root_with_inner_parent_ref: false 73 | ruby_sass_3_3: 74 | support: 75 | tests: 76 | spec/libsass/at-root/ampersand: true 77 | spec/libsass/at-root/basic: true 78 | spec/libsass/at-root/extend: true 79 | spec/libsass/at-root/keyframes: true 80 | spec/libsass/at-root/media: true 81 | spec/libsass/at-root/nested: true 82 | spec/libsass/at-root/with_without: false 83 | spec/libsass/at-root/135_test_simple_at_root: true 84 | spec/libsass/at-root/136_test_at_root_with_selector: true 85 | spec/libsass/at-root/137_test_at_root_in_mixin: true 86 | spec/libsass/at-root/138_test_at_root_in_media: true 87 | spec/libsass/at-root/139_test_at_root_in_bubbled_media: true 88 | spec/libsass/at-root/140_test_at_root_in_unknown_directive: true 89 | spec/libsass/at-root/141_test_at_root_with_parent_ref: true 90 | spec/libsass/at-root/142_test_multi_level_at_root_with_parent_ref: true 91 | spec/libsass/at-root/143_test_multi_level_at_root_with_inner_parent_ref: true 92 | ruby_sass_3_4: 93 | support: true 94 | tests: 95 | spec/libsass/at-root/ampersand: true 96 | spec/libsass/at-root/basic: true 97 | spec/libsass/at-root/extend: true 98 | spec/libsass/at-root/keyframes: true 99 | spec/libsass/at-root/media: true 100 | spec/libsass/at-root/nested: true 101 | spec/libsass/at-root/with_without: true 102 | spec/libsass/at-root/135_test_simple_at_root: true 103 | spec/libsass/at-root/136_test_at_root_with_selector: true 104 | spec/libsass/at-root/137_test_at_root_in_mixin: true 105 | spec/libsass/at-root/138_test_at_root_in_media: true 106 | spec/libsass/at-root/139_test_at_root_in_bubbled_media: true 107 | spec/libsass/at-root/140_test_at_root_in_unknown_directive: true 108 | spec/libsass/at-root/141_test_at_root_with_parent_ref: true 109 | spec/libsass/at-root/142_test_multi_level_at_root_with_parent_ref: true 110 | spec/libsass/at-root/143_test_multi_level_at_root_with_inner_parent_ref: true 111 | libsass_3_1: 112 | support: false 113 | tests: 114 | spec/libsass/at-root/ampersand: false 115 | spec/libsass/at-root/basic: false 116 | spec/libsass/at-root/extend: false 117 | spec/libsass/at-root/keyframes: false 118 | spec/libsass/at-root/media: false 119 | spec/libsass/at-root/nested: false 120 | spec/libsass/at-root/with_without: false 121 | spec/libsass/at-root/135_test_simple_at_root: false 122 | spec/libsass/at-root/136_test_at_root_with_selector: false 123 | spec/libsass/at-root/137_test_at_root_in_mixin: false 124 | spec/libsass/at-root/138_test_at_root_in_media: false 125 | spec/libsass/at-root/139_test_at_root_in_bubbled_media: false 126 | spec/libsass/at-root/140_test_at_root_in_unknown_directive: false 127 | spec/libsass/at-root/141_test_at_root_with_parent_ref: false 128 | spec/libsass/at-root/142_test_multi_level_at_root_with_parent_ref: false 129 | spec/libsass/at-root/143_test_multi_level_at_root_with_inner_parent_ref: false 130 | libsass_3_2: 131 | support: true 132 | tests: 133 | spec/libsass/at-root/ampersand: true 134 | spec/libsass/at-root/basic: true 135 | spec/libsass/at-root/extend: true 136 | spec/libsass/at-root/keyframes: true 137 | spec/libsass/at-root/media: true 138 | spec/libsass/at-root/nested: true 139 | spec/libsass/at-root/with_without: true 140 | spec/libsass/at-root/135_test_simple_at_root: true 141 | spec/libsass/at-root/136_test_at_root_with_selector: true 142 | spec/libsass/at-root/137_test_at_root_in_mixin: true 143 | spec/libsass/at-root/138_test_at_root_in_media: true 144 | spec/libsass/at-root/139_test_at_root_in_bubbled_media: true 145 | spec/libsass/at-root/140_test_at_root_in_unknown_directive: true 146 | spec/libsass/at-root/141_test_at_root_with_parent_ref: true 147 | spec/libsass/at-root/142_test_multi_level_at_root_with_parent_ref: true 148 | spec/libsass/at-root/143_test_multi_level_at_root_with_inner_parent_ref: true 149 | libsass_3_3: 150 | support: true 151 | tests: 152 | spec/libsass/at-root/ampersand: true 153 | spec/libsass/at-root/basic: true 154 | spec/libsass/at-root/extend: true 155 | spec/libsass/at-root/keyframes: true 156 | spec/libsass/at-root/media: true 157 | spec/libsass/at-root/nested: true 158 | spec/libsass/at-root/with_without: true 159 | spec/libsass/at-root/135_test_simple_at_root: true 160 | spec/libsass/at-root/136_test_at_root_with_selector: true 161 | spec/libsass/at-root/137_test_at_root_in_mixin: true 162 | spec/libsass/at-root/138_test_at_root_in_media: true 163 | spec/libsass/at-root/139_test_at_root_in_bubbled_media: true 164 | spec/libsass/at-root/140_test_at_root_in_unknown_directive: true 165 | spec/libsass/at-root/141_test_at_root_with_parent_ref: true 166 | spec/libsass/at-root/142_test_multi_level_at_root_with_parent_ref: true 167 | spec/libsass/at-root/143_test_multi_level_at_root_with_inner_parent_ref: true 168 | 169 | call_function: 170 | ruby_sass_3_2: 171 | support: false 172 | tests: 173 | spec/basic/60_call: false 174 | ruby_sass_3_3: 175 | support: true 176 | tests: 177 | spec/basic/60_call: true 178 | ruby_sass_3_4: 179 | support: true 180 | tests: 181 | spec/basic/60_call: true 182 | libsass_3_1: 183 | support: true 184 | tests: 185 | spec/basic/60_call: true 186 | libsass_3_2: 187 | support: true 188 | tests: 189 | spec/basic/60_call: true 190 | libsass_3_3: 191 | support: true 192 | tests: 193 | spec/basic/60_call: true 194 | 195 | cross_media_extend: 196 | ruby_sass_3_2: 197 | support: false 198 | tests: 199 | tests/cross_media_extend: false 200 | ruby_sass_3_3: 201 | support: false 202 | tests: 203 | tests/cross_media_extend: false 204 | ruby_sass_3_4: 205 | support: true 206 | tests: 207 | tests/cross_media_extend: true 208 | libsass_3_1: 209 | support: false 210 | tests: 211 | tests/cross_media_extend: false 212 | libsass_3_2: 213 | support: true 214 | tests: 215 | tests/cross_media_extend: true 216 | libsass_3_3: 217 | support: true 218 | tests: 219 | tests/cross_media_extend: true 220 | 221 | deep_extend: 222 | ruby_sass_3_2: 223 | support: true 224 | tests: 225 | spec/libsass-closed-issues/issue_592: true 226 | ruby_sass_3_3: 227 | support: true 228 | tests: 229 | spec/libsass-closed-issues/issue_592: true 230 | ruby_sass_3_4: 231 | support: true 232 | tests: 233 | spec/libsass-closed-issues/issue_592: true 234 | libsass_3_1: 235 | support: false 236 | tests: 237 | spec/libsass-closed-issues/issue_592: false 238 | libsass_3_2: 239 | support: true 240 | tests: 241 | spec/libsass-closed-issues/issue_592: true 242 | libsass_3_3: 243 | support: true 244 | tests: 245 | spec/libsass-closed-issues/issue_592: true 246 | 247 | downward_for: 248 | ruby_sass_3_2: 249 | support: false 250 | tests: 251 | spec/libsass-closed-issues/issue_703: false 252 | ruby_sass_3_3: 253 | support: true 254 | tests: 255 | spec/libsass-closed-issues/issue_703: true 256 | ruby_sass_3_4: 257 | support: true 258 | tests: 259 | spec/libsass-closed-issues/issue_703: true 260 | libsass_3_1: 261 | support: true 262 | tests: 263 | spec/libsass-closed-issues/issue_703: true 264 | libsass_3_2: 265 | support: true 266 | tests: 267 | spec/libsass-closed-issues/issue_703: true 268 | libsass_3_3: 269 | support: true 270 | tests: 271 | spec/libsass-closed-issues/issue_703: true 272 | 273 | error_directive: 274 | ruby_sass_3_2: 275 | support: false 276 | tests: 277 | tests/error_directive: false 278 | ruby_sass_3_3: 279 | support: false 280 | tests: 281 | tests/error_directive: false 282 | ruby_sass_3_4: 283 | support: true 284 | tests: 285 | tests/error_directive: true 286 | libsass_3_1: 287 | support: true 288 | tests: 289 | tests/error_directive: true 290 | libsass_3_2: 291 | support: true 292 | tests: 293 | tests/error_directive: true 294 | libsass_3_3: 295 | support: true 296 | tests: 297 | tests/error_directive: true 298 | 299 | feature_detection_functions: 300 | ruby_sass_3_2: 301 | support: false 302 | tests: 303 | spec/libsass-closed-issues/issue_702: false 304 | spec/basic/55_variable_exists: false 305 | spec/basic/56_global_variable_exists: false 306 | spec/basic/57_function_exists: false 307 | spec/basic/58_mixin_exists: false 308 | ruby_sass_3_3: 309 | support: true 310 | tests: 311 | spec/libsass-closed-issues/issue_702: true 312 | spec/basic/55_variable_exists: true 313 | spec/basic/56_global_variable_exists: true 314 | spec/basic/57_function_exists: true 315 | spec/basic/58_mixin_exists: true 316 | ruby_sass_3_4: 317 | support: true 318 | tests: 319 | spec/libsass-closed-issues/issue_702: true 320 | spec/basic/55_variable_exists: true 321 | spec/basic/56_global_variable_exists: true 322 | spec/basic/57_function_exists: true 323 | spec/basic/58_mixin_exists: true 324 | libsass_3_1: 325 | support: true 326 | tests: 327 | spec/libsass-closed-issues/issue_702: true 328 | spec/basic/55_variable_exists: true 329 | spec/basic/56_global_variable_exists: true 330 | spec/basic/57_function_exists: true 331 | spec/basic/58_mixin_exists: true 332 | libsass_3_2: 333 | support: true 334 | tests: 335 | spec/libsass-closed-issues/issue_702: true 336 | spec/basic/55_variable_exists: true 337 | spec/basic/56_global_variable_exists: true 338 | spec/basic/57_function_exists: true 339 | spec/basic/58_mixin_exists: true 340 | libsass_3_3: 341 | support: true 342 | tests: 343 | spec/libsass-closed-issues/issue_702: true 344 | spec/basic/55_variable_exists: true 345 | spec/basic/56_global_variable_exists: true 346 | spec/basic/57_function_exists: true 347 | spec/basic/58_mixin_exists: true 348 | 349 | fixed_if_function: 350 | ruby_sass_3_2: 351 | support: false 352 | tests: 353 | spec/libsass-closed-issues/issue_338: false 354 | ruby_sass_3_3: 355 | support: true 356 | tests: 357 | spec/libsass-closed-issues/issue_338: true 358 | ruby_sass_3_4: 359 | support: true 360 | tests: 361 | spec/libsass-closed-issues/issue_338: true 362 | libsass_3_1: 363 | support: true 364 | tests: 365 | spec/libsass-closed-issues/issue_338: true 366 | libsass_3_2: 367 | support: true 368 | tests: 369 | spec/libsass-closed-issues/issue_338: true 370 | libsass_3_3: 371 | support: true 372 | tests: 373 | spec/libsass-closed-issues/issue_338: true 374 | 375 | inspect_function: 376 | ruby_sass_3_2: 377 | support: false 378 | tests: 379 | spec/libsass-closed-issues/issue_701: false 380 | ruby_sass_3_3: 381 | support: true 382 | tests: 383 | spec/libsass-closed-issues/issue_701: true 384 | ruby_sass_3_4: 385 | support: true 386 | tests: 387 | spec/libsass-closed-issues/issue_701: true 388 | libsass_3_1: 389 | support: true 390 | tests: 391 | spec/libsass-closed-issues/issue_701: true 392 | libsass_3_2: 393 | support: true 394 | tests: 395 | spec/libsass-closed-issues/issue_701: true 396 | libsass_3_3: 397 | support: true 398 | tests: 399 | spec/libsass-closed-issues/issue_701: true 400 | 401 | list_separator_function: 402 | ruby_sass_3_2: 403 | support: false 404 | tests: 405 | spec/libsass-closed-issues/issue_506: false 406 | ruby_sass_3_3: 407 | support: true 408 | tests: 409 | spec/libsass-closed-issues/issue_506: true 410 | ruby_sass_3_4: 411 | support: true 412 | tests: 413 | spec/libsass-closed-issues/issue_506: true 414 | libsass_3_1: 415 | support: true 416 | tests: 417 | spec/libsass-closed-issues/issue_506: true 418 | libsass_3_2: 419 | support: true 420 | tests: 421 | spec/libsass-closed-issues/issue_506: true 422 | libsass_3_3: 423 | support: true 424 | tests: 425 | spec/libsass-closed-issues/issue_506: true 426 | 427 | map_data_type: 428 | ruby_sass_3_2: 429 | support: false 430 | tests: 431 | spec/maps/map-get: false 432 | spec/maps/map-has-key: false 433 | spec/maps/map-keys: false 434 | spec/maps/map-merge: false 435 | spec/maps/map-remove: false 436 | spec/maps/map-values: false 437 | ruby_sass_3_3: 438 | support: true 439 | tests: 440 | spec/maps/map-get: true 441 | spec/maps/map-has-key: true 442 | spec/maps/map-keys: true 443 | spec/maps/map-merge: true 444 | spec/maps/map-remove: true 445 | spec/maps/map-values: true 446 | ruby_sass_3_4: 447 | support: true 448 | tests: 449 | spec/maps/map-get: true 450 | spec/maps/map-has-key: true 451 | spec/maps/map-keys: true 452 | spec/maps/map-merge: true 453 | spec/maps/map-remove: true 454 | spec/maps/map-values: true 455 | libsass_3_1: 456 | support: true 457 | tests: 458 | spec/maps/map-get: true 459 | spec/maps/map-has-key: true 460 | spec/maps/map-keys: true 461 | spec/maps/map-merge: true 462 | spec/maps/map-remove: true 463 | spec/maps/map-values: true 464 | libsass_3_2: 465 | support: true 466 | tests: 467 | spec/maps/map-get: true 468 | spec/maps/map-has-key: true 469 | spec/maps/map-keys: true 470 | spec/maps/map-merge: true 471 | spec/maps/map-remove: true 472 | spec/maps/map-values: true 473 | libsass_3_3: 474 | support: true 475 | tests: 476 | spec/maps/map-get: true 477 | spec/maps/map-has-key: true 478 | spec/maps/map-keys: true 479 | spec/maps/map-merge: true 480 | spec/maps/map-remove: true 481 | spec/maps/map-values: true 482 | 483 | media_merge: 484 | ruby_sass_3_2: 485 | support: 486 | tests: 487 | spec/libsass-closed-issues/issue_185/hoisting: true 488 | spec/libsass-closed-issues/issue_185/media_level_4: true 489 | spec/libsass-closed-issues/issue_185/media_wrapper_selector: true 490 | spec/libsass-closed-issues/issue_185/merge_no_repeat: true 491 | spec/libsass-closed-issues/issue_185/mixin: false 492 | spec/libsass-closed-issues/issue_185/selector_wrapper_media: true 493 | ruby_sass_3_3: 494 | support: true 495 | tests: 496 | spec/libsass-closed-issues/issue_185/hoisting: true 497 | spec/libsass-closed-issues/issue_185/media_level_4: true 498 | spec/libsass-closed-issues/issue_185/media_wrapper_selector: true 499 | spec/libsass-closed-issues/issue_185/merge_no_repeat: true 500 | spec/libsass-closed-issues/issue_185/mixin: true 501 | spec/libsass-closed-issues/issue_185/selector_wrapper_media: true 502 | ruby_sass_3_4: 503 | support: true 504 | tests: 505 | spec/libsass-closed-issues/issue_185/hoisting: true 506 | spec/libsass-closed-issues/issue_185/media_level_4: true 507 | spec/libsass-closed-issues/issue_185/media_wrapper_selector: true 508 | spec/libsass-closed-issues/issue_185/merge_no_repeat: true 509 | spec/libsass-closed-issues/issue_185/mixin: true 510 | spec/libsass-closed-issues/issue_185/selector_wrapper_media: true 511 | libsass_3_1: 512 | support: false 513 | tests: 514 | spec/libsass-closed-issues/issue_185/hoisting: false 515 | spec/libsass-closed-issues/issue_185/media_level_4: false 516 | spec/libsass-closed-issues/issue_185/media_wrapper_selector: false 517 | spec/libsass-closed-issues/issue_185/merge_no_repeat: false 518 | spec/libsass-closed-issues/issue_185/mixin: false 519 | spec/libsass-closed-issues/issue_185/selector_wrapper_media: false 520 | libsass_3_2: 521 | support: true 522 | tests: 523 | spec/libsass-closed-issues/issue_185/hoisting: true 524 | spec/libsass-closed-issues/issue_185/media_level_4: true 525 | spec/libsass-closed-issues/issue_185/media_wrapper_selector: true 526 | spec/libsass-closed-issues/issue_185/merge_no_repeat: true 527 | spec/libsass-closed-issues/issue_185/mixin: true 528 | spec/libsass-closed-issues/issue_185/selector_wrapper_media: true 529 | libsass_3_3: 530 | support: true 531 | tests: 532 | spec/libsass-closed-issues/issue_185/hoisting: true 533 | spec/libsass-closed-issues/issue_185/media_level_4: true 534 | spec/libsass-closed-issues/issue_185/media_wrapper_selector: true 535 | spec/libsass-closed-issues/issue_185/merge_no_repeat: true 536 | spec/libsass-closed-issues/issue_185/mixin: true 537 | spec/libsass-closed-issues/issue_185/selector_wrapper_media: true 538 | 539 | multi_assign_each: 540 | ruby_sass_3_2: 541 | support: false 542 | tests: 543 | spec/libsass-closed-issues/issue_492: false 544 | ruby_sass_3_3: 545 | support: true 546 | tests: 547 | spec/libsass-closed-issues/issue_492: true 548 | ruby_sass_3_4: 549 | support: true 550 | tests: 551 | spec/libsass-closed-issues/issue_492: true 552 | libsass_3_1: 553 | support: true 554 | tests: 555 | spec/libsass-closed-issues/issue_492: true 556 | libsass_3_2: 557 | support: true 558 | tests: 559 | spec/libsass-closed-issues/issue_492: true 560 | libsass_3_3: 561 | support: true 562 | tests: 563 | spec/libsass-closed-issues/issue_492: true 564 | 565 | multi_keys_map_remove: 566 | ruby_sass_3_2: 567 | support: false 568 | tests: 569 | spec/libsass-closed-issues/issue_510: false 570 | ruby_sass_3_3: 571 | support: false 572 | tests: 573 | spec/libsass-closed-issues/issue_510: false 574 | ruby_sass_3_4: 575 | support: true 576 | tests: 577 | spec/libsass-closed-issues/issue_510: true 578 | libsass_3_1: 579 | support: true 580 | tests: 581 | spec/libsass-closed-issues/issue_510: true 582 | libsass_3_2: 583 | support: true 584 | tests: 585 | spec/libsass-closed-issues/issue_510: true 586 | libsass_3_3: 587 | support: true 588 | tests: 589 | spec/libsass-closed-issues/issue_510: true 590 | 591 | negative_indexes: 592 | ruby_sass_3_2: 593 | support: false 594 | tests: 595 | spec/libsass-closed-issues/issue_224: false 596 | ruby_sass_3_3: 597 | support: true 598 | tests: 599 | spec/libsass-closed-issues/issue_224: true 600 | ruby_sass_3_4: 601 | support: true 602 | tests: 603 | spec/libsass-closed-issues/issue_224: true 604 | libsass_3_1: 605 | support: true 606 | tests: 607 | spec/libsass-closed-issues/issue_224: true 608 | libsass_3_2: 609 | support: true 610 | tests: 611 | spec/libsass-closed-issues/issue_224: true 612 | libsass_3_3: 613 | support: true 614 | tests: 615 | spec/libsass-closed-issues/issue_224: true 616 | 617 | nested_interpolations: 618 | ruby_sass_3_2: 619 | support: true 620 | tests: 621 | spec/libsass-closed-issues/issue_615: true 622 | ruby_sass_3_3: 623 | support: true 624 | tests: 625 | spec/libsass-closed-issues/issue_615: true 626 | ruby_sass_3_4: 627 | support: true 628 | tests: 629 | spec/libsass-closed-issues/issue_615: true 630 | libsass_3_1: 631 | support: false 632 | tests: 633 | spec/libsass-closed-issues/issue_615: false 634 | libsass_3_2: 635 | support: true 636 | tests: 637 | spec/libsass-closed-issues/issue_615: true 638 | libsass_3_3: 639 | support: true 640 | tests: 641 | spec/libsass-closed-issues/issue_615: true 642 | 643 | random_function: 644 | ruby_sass_3_2: 645 | support: false 646 | tests: 647 | spec/libsass-closed-issues/issue_657/limit: false 648 | spec/libsass-closed-issues/issue_657/default: false 649 | ruby_sass_3_3: 650 | support: false 651 | tests: 652 | spec/libsass-closed-issues/issue_657/limit: false 653 | spec/libsass-closed-issues/issue_657/default: false 654 | ruby_sass_3_4: 655 | support: true 656 | tests: 657 | spec/libsass-closed-issues/issue_657/limit: true 658 | spec/libsass-closed-issues/issue_657/default: true 659 | libsass_3_1: 660 | support: 661 | tests: 662 | spec/libsass-closed-issues/issue_657/limit: true 663 | spec/libsass-closed-issues/issue_657/default: false 664 | libsass_3_2: 665 | support: true 666 | tests: 667 | spec/libsass-closed-issues/issue_657/limit: true 668 | spec/libsass-closed-issues/issue_657/default: true 669 | libsass_3_3: 670 | support: true 671 | tests: 672 | spec/libsass-closed-issues/issue_657/limit: true 673 | spec/libsass-closed-issues/issue_657/default: true 674 | 675 | rebeccapurple_color: 676 | ruby_sass_3_2: 677 | support: false 678 | tests: 679 | spec/libsass-closed-issues/issue_699: false 680 | ruby_sass_3_3: 681 | support: false 682 | tests: 683 | spec/libsass-closed-issues/issue_699: false 684 | ruby_sass_3_4: 685 | support: true 686 | tests: 687 | spec/libsass-closed-issues/issue_699: true 688 | libsass_3_1: 689 | support: true 690 | tests: 691 | spec/libsass-closed-issues/issue_699: true 692 | libsass_3_2: 693 | support: true 694 | tests: 695 | spec/libsass-closed-issues/issue_699: true 696 | libsass_3_3: 697 | support: true 698 | tests: 699 | spec/libsass-closed-issues/issue_699: true 700 | 701 | reserved_function_names: 702 | ruby_sass_3_2: 703 | support: false 704 | tests: 705 | tests/reserved_function_names/not: false 706 | tests/reserved_function_names/and: false 707 | tests/reserved_function_names/or: false 708 | ruby_sass_3_3: 709 | support: false 710 | tests: 711 | tests/reserved_function_names/not: false 712 | tests/reserved_function_names/and: false 713 | tests/reserved_function_names/or: false 714 | ruby_sass_3_4: 715 | support: true 716 | tests: 717 | tests/reserved_function_names/not: true 718 | tests/reserved_function_names/and: true 719 | tests/reserved_function_names/or: true 720 | libsass_3_1: 721 | support: false 722 | tests: 723 | tests/reserved_function_names/not: false 724 | tests/reserved_function_names/and: false 725 | tests/reserved_function_names/or: false 726 | libsass_3_2: 727 | support: true 728 | tests: 729 | tests/reserved_function_names/not: true 730 | tests/reserved_function_names/and: true 731 | tests/reserved_function_names/or: true 732 | libsass_3_3: 733 | support: true 734 | tests: 735 | tests/reserved_function_names/not: true 736 | tests/reserved_function_names/and: true 737 | tests/reserved_function_names/or: true 738 | 739 | selector_manipulation_functions: 740 | ruby_sass_3_2: 741 | support: false 742 | tests: 743 | tests/selector_manipulation_functions: false 744 | ruby_sass_3_3: 745 | support: false 746 | tests: 747 | tests/selector_manipulation_functions: false 748 | ruby_sass_3_4: 749 | support: true 750 | tests: 751 | tests/selector_manipulation_functions: true 752 | libsass_3_1: 753 | support: false 754 | tests: 755 | tests/selector_manipulation_functions: false 756 | libsass_3_2: 757 | support: false 758 | tests: 759 | tests/selector_manipulation_functions: false 760 | libsass_3_3: 761 | support: true 762 | tests: 763 | tests/selector_manipulation_functions: true 764 | 765 | set_nth_function: 766 | ruby_sass_3_2: 767 | support: false 768 | tests: 769 | spec/libsass-closed-issues/issue_578: false 770 | ruby_sass_3_3: 771 | support: true 772 | tests: 773 | spec/libsass-closed-issues/issue_578: true 774 | ruby_sass_3_4: 775 | support: true 776 | tests: 777 | spec/libsass-closed-issues/issue_578: true 778 | libsass_3_1: 779 | support: true 780 | tests: 781 | spec/libsass-closed-issues/issue_578: true 782 | libsass_3_2: 783 | support: true 784 | tests: 785 | spec/libsass-closed-issues/issue_578: true 786 | libsass_3_3: 787 | support: true 788 | tests: 789 | spec/libsass-closed-issues/issue_578: true 790 | 791 | shadow_dom_styling: 792 | ruby_sass_3_2: 793 | support: true 794 | tests: 795 | spec/libsass-closed-issues/issue_452: true 796 | ruby_sass_3_3: 797 | support: true 798 | tests: 799 | spec/libsass-closed-issues/issue_452: true 800 | ruby_sass_3_4: 801 | support: true 802 | tests: 803 | spec/libsass-closed-issues/issue_452: true 804 | libsass_3_1: 805 | support: false 806 | tests: 807 | spec/libsass-closed-issues/issue_452: false 808 | libsass_3_2: 809 | support: true 810 | tests: 811 | spec/libsass-closed-issues/issue_452: true 812 | libsass_3_3: 813 | support: true 814 | tests: 815 | spec/libsass-closed-issues/issue_452: true 816 | 817 | spaces_minus: 818 | ruby_sass_3_2: 819 | support: false 820 | tests: 821 | spec/libsass-closed-issues/issue_733: false 822 | ruby_sass_3_3: 823 | support: true 824 | tests: 825 | spec/libsass-closed-issues/issue_733: true 826 | ruby_sass_3_4: 827 | support: true 828 | tests: 829 | spec/libsass-closed-issues/issue_733: true 830 | libsass_3_1: 831 | support: false 832 | tests: 833 | spec/libsass-closed-issues/issue_733: false 834 | libsass_3_2: 835 | support: true 836 | tests: 837 | spec/libsass-closed-issues/issue_733: true 838 | libsass_3_3: 839 | support: true 840 | tests: 841 | spec/libsass-closed-issues/issue_733: true 842 | 843 | string_manipulation_functions: 844 | ruby_sass_3_2: 845 | support: false 846 | tests: 847 | spec/basic/43_str_length: false 848 | spec/basic/45_str_insert: false 849 | spec/basic/46_str_index: false 850 | spec/basic/48_case_conversion: false 851 | spec/libsass-todo-tests/47_str_slice: false 852 | spec/libsass-closed-issues/issue_760: false 853 | spec/libsass-closed-issues/issue_763: false 854 | spec/libsass-closed-issues/issue_815: false 855 | ruby_sass_3_3: 856 | support: true 857 | tests: 858 | spec/basic/43_str_length: true 859 | spec/basic/45_str_insert: true 860 | spec/basic/46_str_index: true 861 | spec/basic/48_case_conversion: true 862 | spec/libsass-todo-tests/47_str_slice: true 863 | spec/libsass-closed-issues/issue_760: true 864 | spec/libsass-closed-issues/issue_763: true 865 | spec/libsass-closed-issues/issue_815: true 866 | ruby_sass_3_4: 867 | support: true 868 | tests: 869 | spec/basic/43_str_length: true 870 | spec/basic/45_str_insert: true 871 | spec/basic/46_str_index: true 872 | spec/basic/48_case_conversion: true 873 | spec/libsass-todo-tests/47_str_slice: true 874 | spec/libsass-closed-issues/issue_760: true 875 | spec/libsass-closed-issues/issue_763: true 876 | spec/libsass-closed-issues/issue_815: true 877 | libsass_3_1: 878 | support: 879 | tests: 880 | spec/basic/43_str_length: true 881 | spec/basic/45_str_insert: true 882 | spec/basic/46_str_index: true 883 | spec/basic/48_case_conversion: true 884 | spec/libsass-todo-tests/47_str_slice: true 885 | spec/libsass-closed-issues/issue_760: true 886 | spec/libsass-closed-issues/issue_763: true 887 | spec/libsass-closed-issues/issue_815: false 888 | libsass_3_2: 889 | support: true 890 | tests: 891 | spec/basic/43_str_length: true 892 | spec/basic/45_str_insert: true 893 | spec/basic/46_str_index: true 894 | spec/basic/48_case_conversion: true 895 | spec/libsass-todo-tests/47_str_slice: true 896 | spec/libsass-closed-issues/issue_760: true 897 | spec/libsass-closed-issues/issue_763: true 898 | spec/libsass-closed-issues/issue_815: true 899 | libsass_3_3: 900 | support: true 901 | tests: 902 | spec/basic/43_str_length: true 903 | spec/basic/45_str_insert: true 904 | spec/basic/46_str_index: true 905 | spec/basic/48_case_conversion: true 906 | spec/libsass-todo-tests/47_str_slice: true 907 | spec/libsass-closed-issues/issue_760: true 908 | spec/libsass-closed-issues/issue_763: true 909 | spec/libsass-closed-issues/issue_815: true 910 | 911 | transparent_color: 912 | ruby_sass_3_2: 913 | support: false 914 | tests: 915 | spec/libsass-closed-issues/issue_700: false 916 | ruby_sass_3_3: 917 | support: true 918 | tests: 919 | spec/libsass-closed-issues/issue_700: true 920 | ruby_sass_3_4: 921 | support: true 922 | tests: 923 | spec/libsass-closed-issues/issue_700: true 924 | libsass_3_1: 925 | support: true 926 | tests: 927 | spec/libsass-closed-issues/issue_700: true 928 | libsass_3_2: 929 | support: true 930 | tests: 931 | spec/libsass-closed-issues/issue_700: true 932 | libsass_3_3: 933 | support: true 934 | tests: 935 | spec/libsass-closed-issues/issue_700: true 936 | 937 | unique_id_function: 938 | ruby_sass_3_2: 939 | support: false 940 | tests: 941 | spec/libsass-closed-issues/issue_636: false 942 | ruby_sass_3_3: 943 | support: true 944 | tests: 945 | spec/libsass-closed-issues/issue_636: true 946 | ruby_sass_3_4: 947 | support: true 948 | tests: 949 | spec/libsass-closed-issues/issue_636: true 950 | libsass_3_1: 951 | support: true 952 | tests: 953 | spec/libsass-closed-issues/issue_636: true 954 | libsass_3_2: 955 | support: true 956 | tests: 957 | spec/libsass-closed-issues/issue_636: true 958 | libsass_3_3: 959 | support: true 960 | tests: 961 | spec/libsass-closed-issues/issue_636: true 962 | 963 | variable_scoping: 964 | ruby_sass_3_2: 965 | support: false 966 | tests: 967 | spec/libsass-closed-issues/issue_613: false 968 | ruby_sass_3_3: 969 | support: false 970 | tests: 971 | spec/libsass-closed-issues/issue_613: false 972 | ruby_sass_3_4: 973 | support: true 974 | tests: 975 | spec/libsass-closed-issues/issue_613: true 976 | libsass_3_1: 977 | support: false 978 | tests: 979 | spec/libsass-closed-issues/issue_613: false 980 | libsass_3_2: 981 | support: true 982 | tests: 983 | spec/libsass-closed-issues/issue_613: true 984 | libsass_3_3: 985 | support: true 986 | tests: 987 | spec/libsass-closed-issues/issue_613: true 988 | 989 | -------------------------------------------------------------------------------- /_data/tests.yml: -------------------------------------------------------------------------------- 1 | ampersand_sassscript: 2 | - tests/ampersand_sassscript 3 | # Switch to sass-spec's test once it exists 4 | 5 | angle_conversion: 6 | - spec/libsass-closed-issues/issue_666/angle 7 | 8 | at_root_directive: 9 | - spec/libsass/at-root/ampersand 10 | - spec/libsass/at-root/basic 11 | - spec/libsass/at-root/extend 12 | - spec/libsass/at-root/keyframes 13 | - spec/libsass/at-root/media 14 | - spec/libsass/at-root/nested 15 | - spec/libsass/at-root/with_without 16 | - spec/libsass/at-root/135_test_simple_at_root 17 | - spec/libsass/at-root/136_test_at_root_with_selector 18 | - spec/libsass/at-root/137_test_at_root_in_mixin 19 | - spec/libsass/at-root/138_test_at_root_in_media 20 | - spec/libsass/at-root/139_test_at_root_in_bubbled_media 21 | - spec/libsass/at-root/140_test_at_root_in_unknown_directive 22 | - spec/libsass/at-root/141_test_at_root_with_parent_ref 23 | - spec/libsass/at-root/142_test_multi_level_at_root_with_parent_ref 24 | - spec/libsass/at-root/143_test_multi_level_at_root_with_inner_parent_ref 25 | 26 | call_function: 27 | - spec/basic/60_call 28 | 29 | cross_media_extend: 30 | - tests/cross_media_extend 31 | # Switch to sass-spec's test once it exists 32 | 33 | deep_extend: 34 | - spec/libsass-closed-issues/issue_592 35 | 36 | downward_for: 37 | - spec/libsass-closed-issues/issue_703 38 | 39 | error_directive: 40 | - tests/error_directive 41 | # Switch to sass-spec's test once it exists 42 | 43 | feature_detection_functions: 44 | - spec/libsass-closed-issues/issue_702 45 | - spec/basic/55_variable_exists 46 | - spec/basic/56_global_variable_exists 47 | - spec/basic/57_function_exists 48 | - spec/basic/58_mixin_exists 49 | 50 | fixed_if_function: 51 | - spec/libsass-closed-issues/issue_338 52 | 53 | inspect_function: 54 | - spec/libsass-closed-issues/issue_701 55 | 56 | list_separator_function: 57 | - spec/libsass-closed-issues/issue_506 58 | 59 | map_data_type: 60 | - spec/maps/map-get 61 | - spec/maps/map-has-key 62 | - spec/maps/map-keys 63 | - spec/maps/map-merge 64 | - spec/maps/map-remove 65 | - spec/maps/map-values 66 | 67 | media_merge: 68 | - spec/libsass-closed-issues/issue_185/hoisting 69 | - spec/libsass-closed-issues/issue_185/media_level_4 70 | - spec/libsass-closed-issues/issue_185/media_wrapper_selector 71 | - spec/libsass-closed-issues/issue_185/merge_no_repeat 72 | - spec/libsass-closed-issues/issue_185/mixin 73 | - spec/libsass-closed-issues/issue_185/selector_wrapper_media 74 | 75 | multi_assign_each: 76 | - spec/libsass-closed-issues/issue_492 77 | 78 | multi_keys_map_remove: 79 | - spec/libsass-closed-issues/issue_510 80 | 81 | negative_indexes: 82 | - spec/libsass-closed-issues/issue_224 83 | 84 | nested_interpolations: 85 | - spec/libsass-closed-issues/issue_615 86 | 87 | random_function: 88 | - spec/libsass-closed-issues/issue_657/limit 89 | - spec/libsass-closed-issues/issue_657/default 90 | 91 | rebeccapurple_color: 92 | - spec/libsass-closed-issues/issue_699 93 | 94 | reserved_function_names: 95 | - tests/reserved_function_names/not 96 | - tests/reserved_function_names/and 97 | - tests/reserved_function_names/or 98 | # Switch to those tests once they are merged in sass-spec 99 | # - spec/libsass-todo-issues/issue_713/and 100 | # - spec/libsass-todo-issues/issue_713/or 101 | # - spec/libsass-todo-issues/issue_713/not 102 | 103 | selector_manipulation_functions: 104 | - tests/selector_manipulation_functions 105 | # Switch to sass-spec's test once it exists 106 | 107 | set_nth_function: 108 | - spec/libsass-closed-issues/issue_578 109 | 110 | shadow_dom_styling: 111 | - spec/libsass-closed-issues/issue_452 112 | 113 | spaces_minus: 114 | - spec/libsass-closed-issues/issue_733 115 | 116 | string_manipulation_functions: 117 | - spec/basic/43_str_length 118 | - spec/basic/45_str_insert 119 | - spec/basic/46_str_index 120 | - spec/basic/48_case_conversion 121 | - spec/libsass-todo-tests/47_str_slice 122 | - spec/libsass-closed-issues/issue_760 123 | - spec/libsass-closed-issues/issue_763 124 | - spec/libsass-closed-issues/issue_815 125 | 126 | transparent_color: 127 | - spec/libsass-closed-issues/issue_700 128 | 129 | unique_id_function: 130 | - spec/libsass-closed-issues/issue_636 131 | 132 | variable_scoping: 133 | - spec/libsass-closed-issues/issue_613 134 | -------------------------------------------------------------------------------- /_includes/features.html: -------------------------------------------------------------------------------- 1 | {% for feature in site.data.features %} 2 |
3 |

{{ feature.label|markdownify }} §

4 | 5 |
6 |
7 |

Description

8 | {{ feature.description|markdownify }} 9 |
10 |
11 |

Work-around

12 | {% if feature.polyfill %} 13 | {{ feature.polyfill|markdownify }} 14 | {% else %} 15 |

There is no known polyfill or work-around for this.

16 | {% endif %} 17 |
18 |
19 | 20 |

Tests and support

21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | {% for engine in site.data.engines %} 33 | 38 | {% endfor %} 39 | 40 | 41 | 42 | {% for test in site.data.tests[feature.name] %} 43 | 44 | 54 | 55 | {% for engine in site.data.engines %} 56 | {% assign engine_name = engine[0] %} 57 | {% assign test_support = site.data.support[feature.name][engine_name].tests[test] %} 58 | 59 | 70 | {% endfor %} 71 | 72 | {% endfor %} 73 | 74 | 75 | 76 | 77 | {% for engine in site.data.engines %} 78 | 79 | {% assign engine_name = engine[0] %} 80 | {% assign support = site.data.support[feature.name][engine_name].support %} 81 | 82 | 99 | {% endfor %} 100 | 101 | 102 |
Feature "{{ feature.label }}" support
Test 34 | 35 | {{ engine[1].label }} 36 | 37 |
45 | {% assign base_url = "https://github.com/sass-compatibility/sass-compatibility/tree/master/" %} 46 | {% assign start_path = (test | split: "/" | first) %} 47 | 48 | {% if start_path == "spec" %} 49 | {% assign base_url = "https://github.com/sass/sass-spec/tree/master/" %} 50 | {% endif %} 51 | 52 | {{ test }} 53 | 60 | 61 | {% if test_support == true %} 62 | {% include icons/okay.html %} 63 | {% elsif test_support == false %} 64 | {% include icons/fail.html %} 65 | {% else %} 66 | {% include icons/mixed.html %} 67 | {% endif %} 68 | 69 |
Support 83 | {% if site.data.issues[feature.name] and site.data.issues[feature.name][engine_name] %} 84 | 85 | {% endif %} 86 | 87 | {% if support == true %} 88 | {% include icons/okay.html %} 89 | {% elsif support == false %} 90 | {% include icons/fail.html %} 91 | {% else %} 92 | {% include icons/mixed.html %} 93 | {% endif %} 94 | 95 | {% if site.data.issues[feature.name] and site.data.issues[feature.name][engine_name] %} 96 | 97 | {% endif %} 98 |
103 | 104 |
105 | {% endfor %} 106 | -------------------------------------------------------------------------------- /_includes/footer.html: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /_includes/head.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %} 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /_includes/header.html: -------------------------------------------------------------------------------- 1 |

{{ site.title }}

2 | -------------------------------------------------------------------------------- /_includes/icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | not supported 5 | Feature is not supported 6 | 7 | 8 | 9 | supported 10 | Feature is supported 11 | 12 | 13 | 14 | twitter 15 | Twitter icon 16 | 17 | 18 | 19 | github 20 | GitHub icon 21 | 22 | 23 | 24 | mixed support 25 | Feature is partially supported 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /_includes/icons/fail.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /_includes/icons/github.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /_includes/icons/mixed.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /_includes/icons/okay.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /_includes/icons/twitter.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /_includes/intro.html: -------------------------------------------------------------------------------- 1 |

{{ site.description }}

2 | 3 | 4 | {% include icons/twitter.html %} 5 | Tweet it 6 | 7 | 8 | 9 | {% include icons/github.html %} 10 | Contribute 11 | 12 | -------------------------------------------------------------------------------- /_includes/stats.html: -------------------------------------------------------------------------------- 1 |

Tests statistics §

2 | 3 |

Caution! Those stats are computed based on the few tests we run here on Sass-Compatibility. They do not reflect the current status of support for each engine. Please do not communicate those stats to compare different engines, it would be unfair.

4 | 5 | 6 | 7 | 8 | 9 | {% for engine in site.data.engines %} 10 | 15 | {% endfor %} 16 | 17 | 18 | 19 | 20 | 21 | 22 | {% for engine in site.data.stats %} 23 | {% assign engine_name = engine[0] %} 24 | 25 | {% endfor %} 26 | 27 | 28 | 29 | {% for engine in site.data.stats %} 30 | {% assign engine_name = engine[0] %} 31 | 32 | {% endfor %} 33 | 34 | 35 | 36 | {% for engine in site.data.stats %} 37 | {% assign engine_name = engine[0] %} 38 | 39 | {% endfor %} 40 | 41 | 42 |
Section 11 | 12 | {{ engine[1].label }} 13 | 14 |
Passed{{ engine[1].passed }}
Failed{{ engine[1].failed }}
Percentage{{ engine[1].percentage }}%
43 | -------------------------------------------------------------------------------- /_includes/toc.html: -------------------------------------------------------------------------------- 1 | 8 | -------------------------------------------------------------------------------- /_layouts/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {% include head.html %} 5 | 6 | 7 | 8 | {% include icons.svg %} 9 | 10 |
11 | {{ content }} 12 |
13 | 14 | {% include footer.html %} 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /_sass/base/_base.scss: -------------------------------------------------------------------------------- 1 | html { 2 | font-size: 125%; 3 | -moz-box-sizing: border-box; 4 | box-sizing: border-box; 5 | } 6 | 7 | *, ::before, ::after { 8 | -moz-box-sizing: inherit; 9 | box-sizing: inherit; 10 | } 11 | 12 | body { 13 | font: 1em/1.35 $font-family-text; 14 | color: $color-text; 15 | border-top: .5em solid $venus; 16 | } 17 | 18 | code { 19 | font-size: .9em; 20 | color: $regent-grey; 21 | font-family: $font-family-code; 22 | } 23 | 24 | a { 25 | color: $color-text-link; 26 | transition: .15s; 27 | 28 | &:visited { 29 | color: $color-text-link-visited; 30 | } 31 | 32 | &:active, 33 | &:focus, 34 | &:hover { 35 | color: $color-text-link-hover; 36 | } 37 | 38 | code { 39 | color: currentcolor; 40 | } 41 | } 42 | 43 | table caption { 44 | opacity: 0; 45 | clip: rect(0 0 0 0); 46 | width: 1px; 47 | height: 1px; 48 | margin: -1px; 49 | padding: 0; 50 | border: 0; 51 | } 52 | -------------------------------------------------------------------------------- /_sass/base/_helpers.scss: -------------------------------------------------------------------------------- 1 | .ellipsis { 2 | text-overflow: ellipsis; 3 | overflow: hidden; 4 | white-space: nowrap; 5 | } 6 | 7 | .visually-hidden { 8 | position: absolute; 9 | overflow: hidden; 10 | clip: rect(0 0 0 0); 11 | height: 1px; 12 | width: 1px; 13 | margin: -1px; 14 | padding: 0; 15 | border: 0; 16 | } 17 | 18 | .heading { 19 | text-transform: uppercase; 20 | border-bottom: .2em solid $bouquet; 21 | padding-bottom: .2em; 22 | margin-bottom: 1rem; 23 | position: relative; 24 | font-size: 2em; 25 | text-align: left; 26 | 27 | p { 28 | margin-bottom: 0; 29 | } 30 | 31 | code { 32 | font-size: 1em; 33 | } 34 | } 35 | 36 | .heading__anchor { 37 | position: absolute; 38 | left: -1em; 39 | top: .23em; 40 | text-decoration: none; 41 | font-size: .8em; 42 | opacity: 0; 43 | transition: .15s; 44 | 45 | .heading:hover &, 46 | .heading:active & { 47 | opacity: 1; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /_sass/base/_layout.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | width: 100%; 3 | max-width: 90%; 4 | margin: 0 auto; 5 | padding: 0 1em; 6 | } 7 | 8 | .section { 9 | width: 100%; 10 | padding: 3em 0; 11 | border-bottom: $iron .5em solid; 12 | 13 | &:last-child { 14 | border-bottom: 0; 15 | } 16 | } 17 | 18 | .section--header, 19 | .section--toc, 20 | .section--introduction { 21 | text-align: center; 22 | } 23 | -------------------------------------------------------------------------------- /_sass/pages/_home.scss: -------------------------------------------------------------------------------- 1 | .section:first-child { 2 | color: $color-text-weak; 3 | background: url(https://subtlepatterns.com/patterns/gplaypattern.png) $color-background; 4 | } 5 | 6 | .section:nth-child(2) { 7 | padding: 1.5em 0; 8 | 9 | .btn { 10 | font-size: 1.2em; 11 | } 12 | } 13 | 14 | .title { 15 | font-size: 5em; 16 | margin: 0; 17 | line-height: 1.125em; 18 | text-align: center; 19 | 20 | @media (max-width: 767px) { 21 | font-size: 2.2em; 22 | } 23 | } 24 | 25 | .baseline { 26 | font-size: 1.6em; 27 | font-weight: 700; 28 | color: $color-accent; 29 | margin: 0 0 1rem; 30 | text-align: center; 31 | } 32 | -------------------------------------------------------------------------------- /_sass/partials/_buttons.scss: -------------------------------------------------------------------------------- 1 | .btn { 2 | text-decoration: none; 3 | background-color: $white; 4 | border: .15em solid; 5 | padding: .5em 1em; 6 | border-radius: .25em; 7 | transition: .15s ease-in; 8 | display: inline-block; 9 | margin: .5em; 10 | fill: currentcolor; 11 | 12 | &:visited { 13 | fill: $color-text-link-visited; 14 | } 15 | 16 | &:hover, 17 | &:active, 18 | &:focus { 19 | color: $color-text-link-hover; 20 | fill: $color-text-link-hover; 21 | } 22 | 23 | svg { 24 | margin-right: .3em; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /_sass/partials/_features.scss: -------------------------------------------------------------------------------- 1 | .feature { 2 | margin-bottom: 5em; 3 | text-align: left; 4 | } 5 | 6 | .feature__name {} 7 | 8 | .feature__content { 9 | overflow: hidden; 10 | 11 | p { 12 | margin-top: 0; 13 | } 14 | } 15 | 16 | .feature__description { 17 | margin-bottom: 1rem; 18 | 19 | @media (min-width: 768px) { 20 | width: 50%; 21 | float: left; 22 | padding-right: 1rem; 23 | } 24 | } 25 | 26 | .feature__polyfill { 27 | margin-bottom: 1rem; 28 | 29 | @media (min-width: 768px) { 30 | float: left; 31 | width: 50%; 32 | padding-left: 1rem; 33 | } 34 | } 35 | 36 | .feature__heading { 37 | margin-top: 0; 38 | margin-bottom: .5rem; 39 | float: left; 40 | 41 | + * { 42 | clear: left; 43 | } 44 | } 45 | 46 | .feature__support { 47 | width: 100%; 48 | width: calc(100% + .25em * 2); 49 | margin-left: -.25em; 50 | border-spacing: .25em; 51 | border-collapse: initial; 52 | text-align: center; 53 | table-layout: fixed; 54 | 55 | td, th { 56 | padding: .5em; 57 | } 58 | 59 | th { 60 | background-color: #EFEFEF; 61 | font-size: .8em; 62 | padding-top: .5em + .5 * .8em; 63 | padding-bottom: .5em + .5 * .8em; 64 | text-transform: uppercase; 65 | font-weight: 700; 66 | 67 | a { 68 | color: inherit; 69 | text-decoration: none; 70 | display: block; 71 | 72 | &:hover, 73 | &:focus, 74 | &:active { 75 | color: $color-text-link-hover; 76 | } 77 | } 78 | } 79 | 80 | @media (max-width: 767px) { 81 | thead { 82 | display: none; 83 | } 84 | 85 | table, tr, td, th { 86 | display: block; 87 | } 88 | 89 | td { 90 | text-align: right; 91 | } 92 | 93 | th, td { 94 | margin-bottom: .25em; 95 | } 96 | 97 | td::before { 98 | content: attr(data-label); 99 | float: left; 100 | } 101 | } 102 | } 103 | 104 | .feature-status { 105 | a { 106 | display: block; 107 | 108 | &:active, 109 | &:hover { 110 | transform: scale(1.5); 111 | } 112 | } 113 | } 114 | 115 | .feature-status--supported { 116 | &, a { 117 | color: mix($patina, black, 70%); 118 | fill: currentcolor; 119 | } 120 | 121 | background-color: rgba($patina, .25); 122 | } 123 | 124 | .feature-status--unsupported { 125 | &, a { 126 | color: mix($bouquet, black, 70%); 127 | fill: currentcolor; 128 | } 129 | 130 | background-color: rgba($bouquet, .25); 131 | } 132 | 133 | .feature-status--partially-supported { 134 | &, a { 135 | color: mix($wafer, black, 60%); 136 | fill: currentcolor; 137 | } 138 | 139 | background-color: mix($wafer, yellow, 90%); 140 | } 141 | 142 | .feature__support .detail { 143 | display: none; 144 | opacity: .7; 145 | } 146 | 147 | .toggle-support-details__checkbox { 148 | clear: none; 149 | } 150 | 151 | .toggle-support-details__checkbox:checked ~ .feature__support .detail { 152 | display: table-row; 153 | } 154 | 155 | .toggle-support-details__label::before { 156 | content: "Show "; 157 | 158 | .toggle-support-details__checkbox:checked + & { 159 | content: "Hide "; 160 | } 161 | } 162 | 163 | .toggle-support-details__label { 164 | cursor: pointer; 165 | float: left; 166 | color: $bouquet; 167 | font-size: .7em; 168 | text-transform: uppercase; 169 | margin: .65em 0 0 1em; 170 | } 171 | -------------------------------------------------------------------------------- /_sass/partials/_footer.scss: -------------------------------------------------------------------------------- 1 | .footer { 2 | background: $color-background-invert; 3 | color: $color-text-invert; 4 | text-align: center; 5 | padding: .5em; 6 | 7 | a { 8 | text-decoration: none; 9 | color: $color-text; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /_sass/partials/_icons.scss: -------------------------------------------------------------------------------- 1 | .icon { 2 | display: inline-block; 3 | width: 16px; 4 | height: 16px; 5 | } 6 | -------------------------------------------------------------------------------- /_sass/partials/_stats.scss: -------------------------------------------------------------------------------- 1 | .support-value { 2 | font-weight: bold; 3 | } 4 | 5 | @each $engine, $support in $stats { 6 | .support-value--#{$engine} { 7 | $color: mix($wafer, white, 50%); 8 | $support: percentage($support / 100); 9 | 10 | background: -webkit-linear-gradient(left, $color $support, transparent $support); 11 | background: linear-gradient(to right, $color $support, transparent $support); 12 | 13 | @media (min-width: 768px) { 14 | background: -webkit-linear-gradient(top, transparent (100% - $support), $color (100% - $support)); 15 | background: linear-gradient(to bottom, transparent (100% - $support), $color (100% - $support)); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /_sass/partials/_toc.scss: -------------------------------------------------------------------------------- 1 | .toc { 2 | overflow: hidden; 3 | padding-left: 0; 4 | list-style: none; 5 | -webkit-column-gap: .5em; 6 | -moz-column-gap: .5em; 7 | column-gap: .5em; 8 | 9 | @media (min-width: 600px) { 10 | -webkit-columns: 2; 11 | -moz-columns: 2; 12 | columns: 2; 13 | 14 | } 15 | 16 | @media (min-width: 800px) { 17 | -webkit-columns: 3; 18 | -moz-columns: 3; 19 | columns: 3; 20 | } 21 | 22 | @media (min-width: 1000px) { 23 | -webkit-columns: 4; 24 | -moz-columns: 4; 25 | columns: 4; 26 | } 27 | } 28 | 29 | .toc__item { 30 | -webkit-column-break-inside: avoid; 31 | page-break-inside: avoid; 32 | break-inside: avoid; 33 | font-size: .9em; 34 | } 35 | 36 | .toc__link { 37 | padding: .5em; 38 | display: block; 39 | background: #EFEFEF; 40 | text-decoration: none; 41 | margin-bottom: .5em; 42 | color: #444; 43 | transition: 1s; 44 | 45 | &:hover, 46 | &:active { 47 | transition: background-color .05s; 48 | background: $wafer; 49 | color: #444; 50 | } 51 | 52 | &:visited { 53 | color: currentcolor; 54 | } 55 | 56 | p { 57 | overflow: hidden; 58 | text-overflow: ellipsis; 59 | white-space: nowrap; 60 | margin: 0; 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /_sass/utils/_stats.scss: -------------------------------------------------------------------------------- 1 | $stats: ( 2 | 'ruby_sass_3_2': 12, 3 | 'ruby_sass_3_3': 79, 4 | 'ruby_sass_3_4': 100, 5 | 'libsass_3_1': 49, 6 | 'libsass_3_2': 99, 7 | 'libsass_3_3': 100, 8 | ); 9 | -------------------------------------------------------------------------------- /_sass/utils/_variables.scss: -------------------------------------------------------------------------------- 1 | $font-family-text: 'Source Sans Pro', 'source-sans-pro', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif; 2 | $font-family-code: 'Source Code Pro', 'source-code-pro', 'Consolas', 'Andale Mono WT', 'Andale Mono', 'Lucida Console', 'Lucida Sans Typewriter', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Liberation Mono', 'Nimbus Mono L', Monaco, 'Courier New', Courier, monospace; 3 | $baseline: 1.5em; 4 | 5 | $hopbush: #c69; 6 | $bouquet: #b37399; 7 | $venus: #998099; 8 | $patina: #699; 9 | $nebula: #d2e1dd; 10 | $white: #fff; 11 | $dawn-pink: #f2ece4; 12 | $wafer: #e1d7d2; 13 | $iron: #dadbdf; 14 | $regent-grey: #808c99; 15 | $pale-sky: #6b717f; 16 | $midnight-blue: #036; 17 | 18 | $color-shadow: rgba(black, .125); 19 | $color-primary: $hopbush; 20 | $color-accent: $patina; 21 | $color-background: $white; 22 | $color-background-shade: $iron; 23 | $color-background-invert: $hopbush; 24 | $color-text: darken($pale-sky, 15); 25 | $color-text-weak: $regent-grey; 26 | $color-text-strong: $midnight-blue; 27 | $color-text-heading: $regent-grey; 28 | $color-text-invert: rgba($color-background, .75); 29 | $color-text-strong-invert: $color-background; 30 | $color-text-link: $color-primary; 31 | $color-text-link-visited: $bouquet; 32 | $color-text-link-hover: $midnight-blue; 33 | $color-border: $iron; 34 | -------------------------------------------------------------------------------- /_sass/vendors/_normalize.scss: -------------------------------------------------------------------------------- 1 | /*! normalize.css v3.0.2 | MIT License | git.io/normalize */ 2 | 3 | /** 4 | * 1. Set default font family to sans-serif. 5 | * 2. Prevent iOS text size adjust after orientation change, without disabling 6 | * user zoom. 7 | */ 8 | 9 | html { 10 | font-family: sans-serif; /* 1 */ 11 | -ms-text-size-adjust: 100%; /* 2 */ 12 | -webkit-text-size-adjust: 100%; /* 2 */ 13 | } 14 | 15 | /** 16 | * Remove default margin. 17 | */ 18 | 19 | body { 20 | margin: 0; 21 | } 22 | 23 | /* HTML5 display definitions 24 | ========================================================================== */ 25 | 26 | /** 27 | * Correct `block` display not defined for any HTML5 element in IE 8/9. 28 | * Correct `block` display not defined for `details` or `summary` in IE 10/11 29 | * and Firefox. 30 | * Correct `block` display not defined for `main` in IE 11. 31 | */ 32 | 33 | article, 34 | aside, 35 | details, 36 | figcaption, 37 | figure, 38 | footer, 39 | header, 40 | hgroup, 41 | main, 42 | menu, 43 | nav, 44 | section, 45 | summary { 46 | display: block; 47 | } 48 | 49 | /** 50 | * 1. Correct `inline-block` display not defined in IE 8/9. 51 | * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. 52 | */ 53 | 54 | audio, 55 | canvas, 56 | progress, 57 | video { 58 | display: inline-block; /* 1 */ 59 | vertical-align: baseline; /* 2 */ 60 | } 61 | 62 | /** 63 | * Prevent modern browsers from displaying `audio` without controls. 64 | * Remove excess height in iOS 5 devices. 65 | */ 66 | 67 | audio:not([controls]) { 68 | display: none; 69 | height: 0; 70 | } 71 | 72 | /** 73 | * Address `[hidden]` styling not present in IE 8/9/10. 74 | * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. 75 | */ 76 | 77 | [hidden], 78 | template { 79 | display: none; 80 | } 81 | 82 | /* Links 83 | ========================================================================== */ 84 | 85 | /** 86 | * Remove the gray background color from active links in IE 10. 87 | */ 88 | 89 | a { 90 | background-color: transparent; 91 | } 92 | 93 | /** 94 | * Improve readability when focused and also mouse hovered in all browsers. 95 | */ 96 | 97 | a:active, 98 | a:hover { 99 | outline: 0; 100 | } 101 | 102 | /* Text-level semantics 103 | ========================================================================== */ 104 | 105 | /** 106 | * Address styling not present in IE 8/9/10/11, Safari, and Chrome. 107 | */ 108 | 109 | abbr[title] { 110 | border-bottom: 1px dotted; 111 | } 112 | 113 | /** 114 | * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. 115 | */ 116 | 117 | b, 118 | strong { 119 | font-weight: bold; 120 | } 121 | 122 | /** 123 | * Address styling not present in Safari and Chrome. 124 | */ 125 | 126 | dfn { 127 | font-style: italic; 128 | } 129 | 130 | /** 131 | * Address variable `h1` font-size and margin within `section` and `article` 132 | * contexts in Firefox 4+, Safari, and Chrome. 133 | */ 134 | 135 | h1 { 136 | font-size: 2em; 137 | margin: 0.67em 0; 138 | } 139 | 140 | /** 141 | * Address styling not present in IE 8/9. 142 | */ 143 | 144 | mark { 145 | background: #ff0; 146 | color: #000; 147 | } 148 | 149 | /** 150 | * Address inconsistent and variable font size in all browsers. 151 | */ 152 | 153 | small { 154 | font-size: 80%; 155 | } 156 | 157 | /** 158 | * Prevent `sub` and `sup` affecting `line-height` in all browsers. 159 | */ 160 | 161 | sub, 162 | sup { 163 | font-size: 75%; 164 | line-height: 0; 165 | position: relative; 166 | vertical-align: baseline; 167 | } 168 | 169 | sup { 170 | top: -0.5em; 171 | } 172 | 173 | sub { 174 | bottom: -0.25em; 175 | } 176 | 177 | /* Embedded content 178 | ========================================================================== */ 179 | 180 | /** 181 | * Remove border when inside `a` element in IE 8/9/10. 182 | */ 183 | 184 | img { 185 | border: 0; 186 | } 187 | 188 | /** 189 | * Correct overflow not hidden in IE 9/10/11. 190 | */ 191 | 192 | svg:not(:root) { 193 | overflow: hidden; 194 | } 195 | 196 | /* Grouping content 197 | ========================================================================== */ 198 | 199 | /** 200 | * Address margin not present in IE 8/9 and Safari. 201 | */ 202 | 203 | figure { 204 | margin: 1em 40px; 205 | } 206 | 207 | /** 208 | * Address differences between Firefox and other browsers. 209 | */ 210 | 211 | hr { 212 | -moz-box-sizing: content-box; 213 | box-sizing: content-box; 214 | height: 0; 215 | } 216 | 217 | /** 218 | * Contain overflow in all browsers. 219 | */ 220 | 221 | pre { 222 | overflow: auto; 223 | } 224 | 225 | /** 226 | * Address odd `em`-unit font size rendering in all browsers. 227 | */ 228 | 229 | code, 230 | kbd, 231 | pre, 232 | samp { 233 | font-family: monospace, monospace; 234 | font-size: 1em; 235 | } 236 | 237 | /* Forms 238 | ========================================================================== */ 239 | 240 | /** 241 | * Known limitation: by default, Chrome and Safari on OS X allow very limited 242 | * styling of `select`, unless a `border` property is set. 243 | */ 244 | 245 | /** 246 | * 1. Correct color not being inherited. 247 | * Known issue: affects color of disabled elements. 248 | * 2. Correct font properties not being inherited. 249 | * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. 250 | */ 251 | 252 | button, 253 | input, 254 | optgroup, 255 | select, 256 | textarea { 257 | color: inherit; /* 1 */ 258 | font: inherit; /* 2 */ 259 | margin: 0; /* 3 */ 260 | } 261 | 262 | /** 263 | * Address `overflow` set to `hidden` in IE 8/9/10/11. 264 | */ 265 | 266 | button { 267 | overflow: visible; 268 | } 269 | 270 | /** 271 | * Address inconsistent `text-transform` inheritance for `button` and `select`. 272 | * All other form control elements do not inherit `text-transform` values. 273 | * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. 274 | * Correct `select` style inheritance in Firefox. 275 | */ 276 | 277 | button, 278 | select { 279 | text-transform: none; 280 | } 281 | 282 | /** 283 | * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` 284 | * and `video` controls. 285 | * 2. Correct inability to style clickable `input` types in iOS. 286 | * 3. Improve usability and consistency of cursor style between image-type 287 | * `input` and others. 288 | */ 289 | 290 | button, 291 | html input[type="button"], /* 1 */ 292 | input[type="reset"], 293 | input[type="submit"] { 294 | -webkit-appearance: button; /* 2 */ 295 | cursor: pointer; /* 3 */ 296 | } 297 | 298 | /** 299 | * Re-set default cursor for disabled elements. 300 | */ 301 | 302 | button[disabled], 303 | html input[disabled] { 304 | cursor: default; 305 | } 306 | 307 | /** 308 | * Remove inner padding and border in Firefox 4+. 309 | */ 310 | 311 | button::-moz-focus-inner, 312 | input::-moz-focus-inner { 313 | border: 0; 314 | padding: 0; 315 | } 316 | 317 | /** 318 | * Address Firefox 4+ setting `line-height` on `input` using `!important` in 319 | * the UA stylesheet. 320 | */ 321 | 322 | input { 323 | line-height: normal; 324 | } 325 | 326 | /** 327 | * It's recommended that you don't attempt to style these elements. 328 | * Firefox's implementation doesn't respect box-sizing, padding, or width. 329 | * 330 | * 1. Address box sizing set to `content-box` in IE 8/9/10. 331 | * 2. Remove excess padding in IE 8/9/10. 332 | */ 333 | 334 | input[type="checkbox"], 335 | input[type="radio"] { 336 | box-sizing: border-box; /* 1 */ 337 | padding: 0; /* 2 */ 338 | } 339 | 340 | /** 341 | * Fix the cursor style for Chrome's increment/decrement buttons. For certain 342 | * `font-size` values of the `input`, it causes the cursor style of the 343 | * decrement button to change from `default` to `text`. 344 | */ 345 | 346 | input[type="number"]::-webkit-inner-spin-button, 347 | input[type="number"]::-webkit-outer-spin-button { 348 | height: auto; 349 | } 350 | 351 | /** 352 | * 1. Address `appearance` set to `searchfield` in Safari and Chrome. 353 | * 2. Address `box-sizing` set to `border-box` in Safari and Chrome 354 | * (include `-moz` to future-proof). 355 | */ 356 | 357 | input[type="search"] { 358 | -webkit-appearance: textfield; /* 1 */ 359 | -moz-box-sizing: content-box; 360 | -webkit-box-sizing: content-box; /* 2 */ 361 | box-sizing: content-box; 362 | } 363 | 364 | /** 365 | * Remove inner padding and search cancel button in Safari and Chrome on OS X. 366 | * Safari (but not Chrome) clips the cancel button when the search input has 367 | * padding (and `textfield` appearance). 368 | */ 369 | 370 | input[type="search"]::-webkit-search-cancel-button, 371 | input[type="search"]::-webkit-search-decoration { 372 | -webkit-appearance: none; 373 | } 374 | 375 | /** 376 | * Define consistent border, margin, and padding. 377 | */ 378 | 379 | fieldset { 380 | border: 1px solid #c0c0c0; 381 | margin: 0 2px; 382 | padding: 0.35em 0.625em 0.75em; 383 | } 384 | 385 | /** 386 | * 1. Correct `color` not being inherited in IE 8/9/10/11. 387 | * 2. Remove padding so people aren't caught out if they zero out fieldsets. 388 | */ 389 | 390 | legend { 391 | border: 0; /* 1 */ 392 | padding: 0; /* 2 */ 393 | } 394 | 395 | /** 396 | * Remove default vertical scrollbar in IE 8/9/10/11. 397 | */ 398 | 399 | textarea { 400 | overflow: auto; 401 | } 402 | 403 | /** 404 | * Don't inherit the `font-weight` (applied by a rule above). 405 | * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. 406 | */ 407 | 408 | optgroup { 409 | font-weight: bold; 410 | } 411 | 412 | /* Tables 413 | ========================================================================== */ 414 | 415 | /** 416 | * Remove most spacing between table cells. 417 | */ 418 | 419 | table { 420 | border-collapse: collapse; 421 | border-spacing: 0; 422 | } 423 | 424 | td, 425 | th { 426 | padding: 0; 427 | } 428 | -------------------------------------------------------------------------------- /_sass/vendors/_prism.scss: -------------------------------------------------------------------------------- 1 | /* http://prismjs.com/download.html?themes=prism&languages=css+scss */ 2 | /** 3 | * prism.js default theme for JavaScript, CSS and HTML 4 | * Based on dabblet (http://dabblet.com) 5 | * @author Lea Verou 6 | */ 7 | 8 | code[class*="language-"], 9 | pre[class*="language-"] { 10 | color: black; 11 | text-shadow: 0 1px white; 12 | font-family: Consolas, Monaco, 'Andale Mono', monospace; 13 | direction: ltr; 14 | text-align: left; 15 | white-space: pre; 16 | word-spacing: normal; 17 | word-break: normal; 18 | line-height: 1.5; 19 | 20 | -moz-tab-size: 4; 21 | -o-tab-size: 4; 22 | tab-size: 4; 23 | 24 | -webkit-hyphens: none; 25 | -moz-hyphens: none; 26 | -ms-hyphens: none; 27 | hyphens: none; 28 | } 29 | 30 | pre[class*="language-"] { 31 | font-size: .8em; 32 | border: 1px solid #ebebeb; 33 | } 34 | 35 | pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, 36 | code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { 37 | text-shadow: none; 38 | background: #b3d4fc; 39 | } 40 | 41 | pre[class*="language-"]::selection, pre[class*="language-"] ::selection, 42 | code[class*="language-"]::selection, code[class*="language-"] ::selection { 43 | text-shadow: none; 44 | background: #b3d4fc; 45 | } 46 | 47 | @media print { 48 | code[class*="language-"], 49 | pre[class*="language-"] { 50 | text-shadow: none; 51 | } 52 | } 53 | 54 | /* Code blocks */ 55 | pre[class*="language-"] { 56 | padding: 1em; 57 | margin: .5em 0; 58 | overflow: auto; 59 | } 60 | 61 | :not(pre) > code[class*="language-"], 62 | pre[class*="language-"] { 63 | background: #f8f8f8; 64 | } 65 | 66 | /* Inline code */ 67 | :not(pre) > code[class*="language-"] { 68 | padding: .1em; 69 | border-radius: .3em; 70 | } 71 | 72 | .token.comment, 73 | .token.prolog, 74 | .token.doctype, 75 | .token.cdata { 76 | color: slategray; 77 | } 78 | 79 | .token.punctuation { 80 | color: #999; 81 | } 82 | 83 | .namespace { 84 | opacity: .7; 85 | } 86 | 87 | .token.property, 88 | .token.tag, 89 | .token.boolean, 90 | .token.number, 91 | .token.constant, 92 | .token.symbol, 93 | .token.deleted { 94 | color: #905; 95 | } 96 | 97 | .token.selector, 98 | .token.attr-name, 99 | .token.string, 100 | .token.char, 101 | .token.builtin, 102 | .token.inserted { 103 | color: #690; 104 | } 105 | 106 | .token.operator, 107 | .token.entity, 108 | .token.url, 109 | .language-css .token.string, 110 | .style .token.string { 111 | color: #a67f59; 112 | background: hsla(0, 0%, 100%, .5); 113 | } 114 | 115 | .token.atrule, 116 | .token.attr-value, 117 | .token.keyword { 118 | color: #07a; 119 | } 120 | 121 | .token.function { 122 | color: #DD4A68; 123 | } 124 | 125 | .token.regex, 126 | .token.important, 127 | .token.variable { 128 | color: #e90; 129 | } 130 | 131 | .token.important { 132 | font-weight: bold; 133 | } 134 | 135 | .token.entity { 136 | cursor: help; 137 | } 138 | 139 | -------------------------------------------------------------------------------- /assets/js/prism.js: -------------------------------------------------------------------------------- 1 | /* http://prismjs.com/download.html?themes=prism&languages=css+scss */ 2 | self=typeof window!="undefined"?window:typeof WorkerGlobalScope!="undefined"&&self instanceof WorkerGlobalScope?self:{};var Prism=function(){var e=/\blang(?:uage)?-(?!\*)(\w+)\b/i,t=self.Prism={util:{encode:function(e){return e instanceof n?new n(e.type,t.util.encode(e.content),e.alias):t.util.type(e)==="Array"?e.map(t.util.encode):e.replace(/&/g,"&").replace(/e.length)break e;if(m instanceof i)continue;l.lastIndex=0;var g=l.exec(m);if(g){h&&(p=g[1].length);var y=g.index-1+p,g=g[0].slice(p),b=g.length,w=y+b,E=m.slice(0,y+1),S=m.slice(w+1),x=[v,1];E&&x.push(E);var T=new i(u,c?t.tokenize(g,c):g,d);x.push(T);S&&x.push(S);Array.prototype.splice.apply(s,x)}}}}return s},hooks:{all:{},add:function(e,n){var r=t.hooks.all;r[e]=r[e]||[];r[e].push(n)},run:function(e,n){var r=t.hooks.all[e];if(!r||!r.length)return;for(var i=0,s;s=r[i++];)s(n)}}},n=t.Token=function(e,t,n){this.type=e;this.content=t;this.alias=n};n.stringify=function(e,r,i){if(typeof e=="string")return e;if(Object.prototype.toString.call(e)=="[object Array]")return e.map(function(t){return n.stringify(t,r,e)}).join("");var s={type:e.type,content:n.stringify(e.content,r,i),tag:"span",classes:["token",e.type],attributes:{},language:r,parent:i};s.type=="comment"&&(s.attributes.spellcheck="true");if(e.alias){var o=t.util.type(e.alias)==="Array"?e.alias:[e.alias];Array.prototype.push.apply(s.classes,o)}t.hooks.run("wrap",s);var u="";for(var a in s.attributes)u+=a+'="'+(s.attributes[a]||"")+'"';return"<"+s.tag+' class="'+s.classes.join(" ")+'" '+u+">"+s.content+""};if(!self.document){if(!self.addEventListener)return self.Prism;self.addEventListener("message",function(e){var n=JSON.parse(e.data),r=n.language,i=n.code;self.postMessage(JSON.stringify(t.util.encode(t.tokenize(i,t.languages[r]))));self.close()},!1);return self.Prism}var r=document.getElementsByTagName("script");r=r[r.length-1];if(r){t.filename=r.src;document.addEventListener&&!r.hasAttribute("data-manual")&&document.addEventListener("DOMContentLoaded",t.highlightAll)}return self.Prism}();typeof module!="undefined"&&module.exports&&(module.exports=Prism);; 3 | Prism.languages.css={comment:/\/\*[\w\W]*?\*\//g,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*{))/gi,inside:{punctuation:/[;:]/g}},url:/url\((["']?).*?\1\)/gi,selector:/[^\{\}\s][^\{\};]*(?=\s*\{)/g,property:/(\b|\B)[\w-]+(?=\s*:)/gi,string:/("|')(\\?.)*?\1/g,important:/\B!important\b/gi,punctuation:/[\{\};:]/g,"function":/[-a-z0-9]+(?=\()/gi},Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/[\w\W]*?<\/style>/gi,inside:{tag:{pattern:/|<\/style>/gi,inside:Prism.languages.markup.tag.inside},rest:Prism.languages.css},alias:"language-css"}}),Prism.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|').+?\1/gi,inside:{"attr-name":{pattern:/^\s*style/gi,inside:Prism.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/gi,inside:Prism.languages.css}},alias:"language-css"}},Prism.languages.markup.tag));; 4 | Prism.languages.scss=Prism.languages.extend("css",{comment:{pattern:/(^|[^\\])(\/\*[\w\W]*?\*\/|\/\/.*?(\r?\n|$))/g,lookbehind:!0},atrule:/@[\w-]+(?=\s+(\(|\{|;))/gi,url:/([-a-z]+-)*url(?=\()/gi,selector:/([^@;\{\}\(\)]?([^@;\{\}\(\)]|&|\#\{\$[-_\w]+\})+)(?=\s*\{(\}|\s|[^\}]+(:|\{)[^\}]+))/gm}),Prism.languages.insertBefore("scss","atrule",{keyword:/@(if|else if|else|for|each|while|import|extend|debug|warn|mixin|include|function|return|content)|(?=@for\s+\$[-_\w]+\s)+from/i}),Prism.languages.insertBefore("scss","property",{variable:/((\$[-_\w]+)|(#\{\$[-_\w]+\}))/i}),Prism.languages.insertBefore("scss","ignore",{placeholder:/%[-_\w]+/i,statement:/\B!(default|optional)\b/gi,"boolean":/\b(true|false)\b/g,"null":/\b(null)\b/g,operator:/\s+([-+]{1,2}|={1,2}|!=|\|?\||\?|\*|\/|\%)\s+/g});; 5 | -------------------------------------------------------------------------------- /assets/prism.css: -------------------------------------------------------------------------------- 1 | /* http://prismjs.com/download.html?themes=prism&languages=css+scss */ 2 | /** 3 | * prism.js default theme for JavaScript, CSS and HTML 4 | * Based on dabblet (http://dabblet.com) 5 | * @author Lea Verou 6 | */ 7 | 8 | code[class*="language-"], 9 | pre[class*="language-"] { 10 | color: black; 11 | text-shadow: 0 1px white; 12 | font-family: Consolas, Monaco, 'Andale Mono', monospace; 13 | direction: ltr; 14 | text-align: left; 15 | white-space: pre; 16 | word-spacing: normal; 17 | word-break: normal; 18 | line-height: 1.5; 19 | 20 | -moz-tab-size: 4; 21 | -o-tab-size: 4; 22 | tab-size: 4; 23 | 24 | -webkit-hyphens: none; 25 | -moz-hyphens: none; 26 | -ms-hyphens: none; 27 | hyphens: none; 28 | } 29 | 30 | pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, 31 | code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { 32 | text-shadow: none; 33 | background: #b3d4fc; 34 | } 35 | 36 | pre[class*="language-"]::selection, pre[class*="language-"] ::selection, 37 | code[class*="language-"]::selection, code[class*="language-"] ::selection { 38 | text-shadow: none; 39 | background: #b3d4fc; 40 | } 41 | 42 | @media print { 43 | code[class*="language-"], 44 | pre[class*="language-"] { 45 | text-shadow: none; 46 | } 47 | } 48 | 49 | /* Code blocks */ 50 | pre[class*="language-"] { 51 | padding: 1em; 52 | margin: .5em 0; 53 | overflow: auto; 54 | } 55 | 56 | :not(pre) > code[class*="language-"], 57 | pre[class*="language-"] { 58 | background: #f5f2f0; 59 | } 60 | 61 | /* Inline code */ 62 | :not(pre) > code[class*="language-"] { 63 | padding: .1em; 64 | border-radius: .3em; 65 | } 66 | 67 | .token.comment, 68 | .token.prolog, 69 | .token.doctype, 70 | .token.cdata { 71 | color: slategray; 72 | } 73 | 74 | .token.punctuation { 75 | color: #999; 76 | } 77 | 78 | .namespace { 79 | opacity: .7; 80 | } 81 | 82 | .token.property, 83 | .token.tag, 84 | .token.boolean, 85 | .token.number, 86 | .token.constant, 87 | .token.symbol, 88 | .token.deleted { 89 | color: #905; 90 | } 91 | 92 | .token.selector, 93 | .token.attr-name, 94 | .token.string, 95 | .token.char, 96 | .token.builtin, 97 | .token.inserted { 98 | color: #690; 99 | } 100 | 101 | .token.operator, 102 | .token.entity, 103 | .token.url, 104 | .language-css .token.string, 105 | .style .token.string { 106 | color: #a67f59; 107 | background: hsla(0, 0%, 100%, .5); 108 | } 109 | 110 | .token.atrule, 111 | .token.attr-value, 112 | .token.keyword { 113 | color: #07a; 114 | } 115 | 116 | .token.function { 117 | color: #DD4A68; 118 | } 119 | 120 | .token.regex, 121 | .token.important, 122 | .token.variable { 123 | color: #e90; 124 | } 125 | 126 | .token.important { 127 | font-weight: bold; 128 | } 129 | 130 | .token.entity { 131 | cursor: help; 132 | } 133 | 134 | -------------------------------------------------------------------------------- /css/main.scss: -------------------------------------------------------------------------------- 1 | --- 2 | --- 3 | 4 | @charset "utf-8"; 5 | 6 | @import "vendors/normalize"; 7 | @import "vendors/prism"; 8 | 9 | @import "utils/variables"; 10 | @import "utils/stats"; 11 | 12 | @import "base/base"; 13 | @import "base/helpers"; 14 | @import "base/layout"; 15 | 16 | @import "pages/home"; 17 | 18 | @import "partials/features"; 19 | @import "partials/footer"; 20 | @import "partials/buttons"; 21 | @import "partials/icons"; 22 | @import "partials/toc"; 23 | @import "partials/stats"; 24 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 | 5 |
6 |
7 | {% include header.html %} 8 |
9 |
10 | 11 |
12 |
13 | {% include intro.html %} 14 |
15 |
16 | 17 |
18 |
19 | {% include toc.html %} 20 |
21 |
22 | 23 |
24 |
25 | {% include features.html %} 26 |
27 |
28 | 29 |
30 |
31 | {% include stats.html %} 32 |
33 |
34 | -------------------------------------------------------------------------------- /tests/ampersand_sassscript/expected_output.css: -------------------------------------------------------------------------------- 1 | selector { 2 | content: selector; 3 | } 4 | -------------------------------------------------------------------------------- /tests/ampersand_sassscript/input.scss: -------------------------------------------------------------------------------- 1 | selector { 2 | content: &; 3 | } 4 | -------------------------------------------------------------------------------- /tests/cross_media_extend/expected_output.css: -------------------------------------------------------------------------------- 1 | You may not @extend an outer selector from within @media. You may only @extend selectors within the same directive. From "@extend .selector" on line 7 of tests/cross_media_extend/input.scss. 2 | -------------------------------------------------------------------------------- /tests/cross_media_extend/input.scss: -------------------------------------------------------------------------------- 1 | .selector { 2 | content: selector; 3 | } 4 | 5 | @media print { 6 | .other-selector { 7 | @extend .selector; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /tests/error_directive/expected_output.css: -------------------------------------------------------------------------------- 1 | ok -------------------------------------------------------------------------------- /tests/error_directive/input.scss: -------------------------------------------------------------------------------- 1 | @error "ok"; 2 | -------------------------------------------------------------------------------- /tests/reserved_function_names/and/expected_output.css: -------------------------------------------------------------------------------- 1 | Invalid function name "and". -------------------------------------------------------------------------------- /tests/reserved_function_names/and/input.scss: -------------------------------------------------------------------------------- 1 | @function and() { 2 | @return "and"; 3 | } 4 | 5 | test { 6 | content: and(); 7 | } 8 | -------------------------------------------------------------------------------- /tests/reserved_function_names/not/expected_output.css: -------------------------------------------------------------------------------- 1 | Invalid function name "not". -------------------------------------------------------------------------------- /tests/reserved_function_names/not/input.scss: -------------------------------------------------------------------------------- 1 | @function not() { 2 | @return "not"; 3 | } 4 | 5 | test { 6 | content: not(); 7 | } 8 | -------------------------------------------------------------------------------- /tests/reserved_function_names/or/expected_output.css: -------------------------------------------------------------------------------- 1 | Invalid function name "or". -------------------------------------------------------------------------------- /tests/reserved_function_names/or/input.scss: -------------------------------------------------------------------------------- 1 | @function or() { 2 | @return "or"; 3 | } 4 | 5 | test { 6 | content: or(); 7 | } 8 | -------------------------------------------------------------------------------- /tests/selector_manipulation_functions/expected_output.css: -------------------------------------------------------------------------------- 1 | .selector .selector-nest { 2 | content: selector-nest; 3 | } 4 | 5 | .selector.selector-append { 6 | content: selector-append; 7 | } 8 | 9 | .selector, .selector-extend { 10 | content: selector-extend; 11 | } 12 | 13 | .selector-replace { 14 | content: selector-replace; 15 | } 16 | 17 | .selector.selector-unify { 18 | content: selector-unify; 19 | } 20 | 21 | .is-superselector { 22 | content: false; 23 | } 24 | 25 | .simple, .selectors { 26 | content: simple-selectors; 27 | } 28 | 29 | .selector-parse { 30 | content: selector-parse; 31 | } 32 | -------------------------------------------------------------------------------- /tests/selector_manipulation_functions/input.scss: -------------------------------------------------------------------------------- 1 | #{selector-nest(".selector", ".selector-nest")} { 2 | content: selector-nest; 3 | } 4 | 5 | #{selector-append(".selector", ".selector-append")} { 6 | content: selector-append; 7 | } 8 | 9 | #{selector-extend(".selector", ".selector", ".selector-extend")} { 10 | content: selector-extend; 11 | } 12 | 13 | #{selector-replace(".selector", ".selector", ".selector-replace")} { 14 | content: selector-replace; 15 | } 16 | 17 | #{selector-unify(".selector", ".selector-unify")} { 18 | content: selector-unify; 19 | } 20 | 21 | .is-superselector { 22 | content: is-superselector(".is-superselector", ".selector"); 23 | } 24 | 25 | #{simple-selectors(".simple.selectors")} { 26 | content: simple-selectors; 27 | } 28 | 29 | #{selector-parse(".selector-parse")} { 30 | content: selector-parse; 31 | } 32 | --------------------------------------------------------------------------------