├── .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 | Feature "{{ feature.label }}" support
28 |
29 |
30 | Test
31 |
32 | {% for engine in site.data.engines %}
33 |
34 |
35 | {{ engine[1].label }}
36 |
37 |
38 | {% endfor %}
39 |
40 |
41 |
42 | {% for test in site.data.tests[feature.name] %}
43 |
44 |
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 |
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 |
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 |
70 | {% endfor %}
71 |
72 | {% endfor %}
73 |
74 |
75 | Support
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 |
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 |
99 | {% endfor %}
100 |
101 |
102 |
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 |
30 |
--------------------------------------------------------------------------------
/_includes/icons/fail.html:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/_includes/icons/github.html:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/_includes/icons/mixed.html:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/_includes/icons/okay.html:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/_includes/icons/twitter.html:
--------------------------------------------------------------------------------
1 |
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 | Section
9 | {% for engine in site.data.engines %}
10 |
11 |
12 | {{ engine[1].label }}
13 |
14 |
15 | {% endfor %}
16 |
17 |
18 |
19 |
20 |
21 | Passed
22 | {% for engine in site.data.stats %}
23 | {% assign engine_name = engine[0] %}
24 | {{ engine[1].passed }}
25 | {% endfor %}
26 |
27 |
28 | Failed
29 | {% for engine in site.data.stats %}
30 | {% assign engine_name = engine[0] %}
31 | {{ engine[1].failed }}
32 | {% endfor %}
33 |
34 |
35 | Percentage
36 | {% for engine in site.data.stats %}
37 | {% assign engine_name = engine[0] %}
38 | {{ engine[1].percentage }}%
39 | {% endfor %}
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/_includes/toc.html:
--------------------------------------------------------------------------------
1 |
2 | {% for feature in site.data.features %}
3 | -
4 | {{ feature.label|markdownify }}
5 |
6 | {% endfor %}
7 |
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+""+s.tag+">"};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:/